diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index d611e05066af75..ab5360e49e39cd 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1 +1 @@ -FROM ghcr.io/containerbase/devcontainer:13.0.14 +FROM ghcr.io/containerbase/devcontainer:13.0.22 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3f9cc449e4749b..d89c9b97e90038 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,12 +31,13 @@ concurrency: env: DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} NODE_VERSION: 22 - PDM_VERSION: 2.20.1 # renovate: datasource=pypi depName=pdm + PDM_VERSION: 2.21.0 # renovate: datasource=pypi depName=pdm DRY_RUN: true TEST_LEGACY_DECRYPTION: true SPARSE_CHECKOUT: |- .github/actions/ data/ + patches/ tools/ package.json pnpm-lock.yaml @@ -303,7 +304,7 @@ jobs: os: ${{ runner.os }} - name: Lint markdown - uses: DavidAnson/markdownlint-cli2-action@db43aef879112c3119a410d69f66701e0d530809 # v17.0.0 + uses: DavidAnson/markdownlint-cli2-action@eb5ca3ab411449c66620fe7f1b3c9e10547144b0 # v18.0.0 - name: Lint fenced code blocks run: pnpm doc-fence-check @@ -437,7 +438,7 @@ jobs: merge-multiple: true - name: Codecov - uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4.6.0 + uses: codecov/codecov-action@015f24e6818733317a2da2edd6290ab26238649a # v5.0.7 with: token: ${{ secrets.CODECOV_TOKEN }} directory: coverage/lcov @@ -591,7 +592,7 @@ jobs: os: ${{ runner.os }} - name: Setup PDM - uses: pdm-project/setup-pdm@568ddd69406b30de1774ec0044b73ae06e716aa4 # v4.1 + uses: pdm-project/setup-pdm@b2472ca4258a9ea3aee813980a0100a2261a42fc # v4.2 with: python-version-file: .python-version version: ${{ env.PDM_VERSION }} @@ -683,7 +684,7 @@ jobs: show-progress: false - name: docker-config - uses: containerbase/internal-tools@72750e92d57f4ec2412af2f4f63f57eafa626bb4 # v3.4.42 + uses: containerbase/internal-tools@e386c8e7bd305d803e0874abccbe153ec1d33a6d # v3.5.2 with: command: docker-config diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 7a9a8fb5d5346f..ff42f0e039a08b 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -41,7 +41,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 + uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 with: languages: javascript @@ -51,7 +51,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@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 + uses: github/codeql-action/autobuild@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 # ℹī¸ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -65,4 +65,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 + uses: github/codeql-action/analyze@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 607e581b8ff5c4..993aa483de8858 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -14,4 +14,4 @@ jobs: show-progress: false - name: 'Dependency Review' - uses: actions/dependency-review-action@4081bf99e2866ebe428fc0477b69eb4fcda7220a # v4.4.0 + uses: actions/dependency-review-action@3b139cfc5fae8b618d3eae3675e383bb1769c019 # v4.5.0 diff --git a/.github/workflows/mend-slack.yml b/.github/workflows/mend-slack.yml index 7f4c8e8288c103..14a0f4fc32bfc7 100644 --- a/.github/workflows/mend-slack.yml +++ b/.github/workflows/mend-slack.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Post to Slack id: slack - uses: slackapi/slack-github-action@37ebaef184d7626c5f204ab8d3baff4262dd30f0 # v1.27.0 + uses: slackapi/slack-github-action@fcfb566f8b0aab22203f066d80ca1d7e4b5d05b3 # v1.27.1 with: channel-id: 'C05NLTMGCJC' # For posting a simple plain text message diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 2a1a49ceaa3482..22834a82fe36d2 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -51,6 +51,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 + uses: github/codeql-action/upload-sarif@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 with: sarif_file: results.sarif diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index d49900814d921d..1997a7eead1e6f 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -25,13 +25,13 @@ jobs: with: show-progress: false - - uses: aquasecurity/trivy-action@915b19bbe73b92a6cf82a1bc12b087c9a19a5fe2 # 0.28.0 + - uses: aquasecurity/trivy-action@18f2510ee396bbf400402947b394f2dd8c87dbb0 # 0.29.0 with: image-ref: ghcr.io/renovatebot/renovate:${{ matrix.tag }} format: 'sarif' output: 'trivy-results.sarif' - - uses: github/codeql-action/upload-sarif@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 + - uses: github/codeql-action/upload-sarif@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 with: sarif_file: trivy-results.sarif category: 'docker-image-${{ matrix.tag }}' diff --git a/docs/usage/assets/images/app-settings/add-host-rule.png b/docs/usage/assets/images/app-settings/add-host-rule.png new file mode 100644 index 00000000000000..b55ff559357aa0 Binary files /dev/null and b/docs/usage/assets/images/app-settings/add-host-rule.png differ diff --git a/docs/usage/assets/images/app-settings/host-rules.png b/docs/usage/assets/images/app-settings/host-rules.png new file mode 100644 index 00000000000000..ed2427f5d36bf0 Binary files /dev/null and b/docs/usage/assets/images/app-settings/host-rules.png differ diff --git a/docs/usage/config-presets.md b/docs/usage/config-presets.md index 8d90c12dd93252..095115f253d0a8 100644 --- a/docs/usage/config-presets.md +++ b/docs/usage/config-presets.md @@ -176,7 +176,7 @@ To host your preset config on GitHub: - Create a new repository. Normally you'd call it `renovate-config` but it can be named anything - Add configuration files to this new repo for any presets you want to share. For the default preset, `default.json` will be checked. For named presets, `.json` will be loaded. For example, loading preset `library` would load `library.json`. No other files are necessary. -- In other repos, reference it in an extends array like "github>owner/name", for example: +- In other repos, reference it in an extends array like `"github>owner/name"`, for example: ```json { @@ -195,7 +195,7 @@ To host your preset config on GitLab: - Create a new repository on GitLab. Normally you'd call it `renovate-config` but it can be named anything - Add a `default.json` to this new repo containing the preset config. No other files are necessary -- In other repos, reference it in an extends array like "gitlab>owner/name", e.g. "gitlab>rarkins/renovate-config" +- In other repos, reference it in an extends array like `"gitlab>owner/name"`, e.g. `"gitlab>rarkins/renovate-config"` ## Gitea-hosted Presets diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md index 02f2d3394cd350..9a00259cbb5ec0 100644 --- a/docs/usage/configuration-options.md +++ b/docs/usage/configuration-options.md @@ -122,7 +122,7 @@ If enabled Renovate tries to determine PR assignees by matching rules defined in Read the docs for your platform for details on syntax and allowed file locations: - [GitHub Docs, About code owners](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners) -- [GitLab, Code Owners](https://docs.gitlab.com/ee/user/project/code_owners.html) +- [GitLab, Code Owners](https://docs.gitlab.com/ee/user/project/codeowners/) - [Bitbucket, Set up and use code owners](https://support.atlassian.com/bitbucket-cloud/docs/set-up-and-use-code-owners/) ## assigneesSampleSize @@ -2463,8 +2463,9 @@ Here's an example config to limit the "noisy" `aws-sdk` package to weekly update { "packageRules": [ { + "description": "Schedule aws-sdk updates on Sunday nights (9 PM - 12 AM)", "matchPackageNames": ["aws-sdk"], - "schedule": ["after 9pm on sunday"] + "schedule": ["* 21-23 * * 0"] } ] } @@ -3836,12 +3837,14 @@ Here are some example schedules and their Cron equivalent: !!! note For Cron schedules, you _must_ use the `*` wildcard for the minutes value, as Renovate doesn't support minute granularity. + And the cron schedule must have five comma separated parts. One example might be that you don't want Renovate to run during your typical business hours, so that your build machines don't get clogged up testing `package.json` updates. You could then configure a schedule like this at the repository level: ```json { + "description": "Schedule on weekdays at night (10 PM - 4 AM) and anytime on weekends", "schedule": ["* 22-23,0-4 * * *", "* * * * 0,6"] } ``` diff --git a/docs/usage/docker.md b/docs/usage/docker.md index 334ebf0d281583..8ef75ac559fb68 100644 --- a/docs/usage/docker.md +++ b/docs/usage/docker.md @@ -307,7 +307,7 @@ Renovate will get the credentials with the [`google-auth-library`](https://www.n service_account: ${{ env.SERVICE_ACCOUNT }} - name: renovate - uses: renovatebot/github-action@v40.3.6 + uses: renovatebot/github-action@v41.0.4 env: RENOVATE_HOST_RULES: | [ @@ -478,7 +478,7 @@ Make sure to install the Google Cloud SDK into the custom image, as you need the For example: ```Dockerfile -FROM renovate/renovate:38.142.5 +FROM renovate/renovate:39.28.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/examples/opentelemetry.md b/docs/usage/examples/opentelemetry.md index 2641a954857bcf..9d2abe6d44898b 100644 --- a/docs/usage/examples/opentelemetry.md +++ b/docs/usage/examples/opentelemetry.md @@ -19,7 +19,7 @@ services: - '4317' otel-collector: - image: otel/opentelemetry-collector-contrib:0.113.0 + image: otel/opentelemetry-collector-contrib:0.114.0 command: ['--config=/etc/otel-collector-config.yml'] volumes: - ./otel-collector-config.yml:/etc/otel-collector-config.yml diff --git a/docs/usage/examples/self-hosting.md b/docs/usage/examples/self-hosting.md index edc1b91a386940..c0c58a6acf8bf3 100644 --- a/docs/usage/examples/self-hosting.md +++ b/docs/usage/examples/self-hosting.md @@ -24,9 +24,9 @@ It builds `latest` based on the `main` branch and all SemVer tags are published ```sh title="Example of valid tags" docker run --rm renovate/renovate -docker run --rm renovate/renovate:38 -docker run --rm renovate/renovate:38.142 -docker run --rm renovate/renovate:38.142.5 +docker run --rm renovate/renovate:39 +docker run --rm renovate/renovate:39.28 +docker run --rm renovate/renovate:39.28.0 ``` @@ -62,7 +62,7 @@ spec: - name: renovate # Update this to the latest available and then enable Renovate on # the manifest - image: renovate/renovate:38.142.5 + image: renovate/renovate:39.28.0 args: - user/repo # Environment Variables @@ -121,7 +121,7 @@ spec: template: spec: containers: - - image: renovate/renovate:38.142.5 + - image: renovate/renovate:39.28.0 name: renovate-bot env: # For illustration purposes, please use secrets. - name: RENOVATE_PLATFORM @@ -367,7 +367,7 @@ spec: containers: - name: renovate # Update this to the latest available and then enable Renovate on the manifest - image: renovate/renovate:38.142.5 + image: renovate/renovate:39.28.0 volumeMounts: - name: ssh-key-volume readOnly: true diff --git a/docs/usage/faq.md b/docs/usage/faq.md index 75beefa07302d9..ab2fed23fcf078 100644 --- a/docs/usage/faq.md +++ b/docs/usage/faq.md @@ -51,7 +51,7 @@ Follow these steps to see which version the Mend Renovate app is on: ``` INFO: Repository started { - "renovateVersion": "38.120.1" + "renovateVersion": "39.11.5" } ``` diff --git a/docs/usage/getting-started/private-packages.md b/docs/usage/getting-started/private-packages.md index 5efa53b1bb51c0..0e6eb2f0dbca41 100644 --- a/docs/usage/getting-started/private-packages.md +++ b/docs/usage/getting-started/private-packages.md @@ -611,7 +611,7 @@ If you need to provide credentials to the Mend Renovate App, please do this: } ``` -For more details, see [Using Secrets with Mend Cloud Apps](../mend-hosted/app-secrets.md). +For more details, see [Using Secrets with Mend Cloud Apps](../mend-hosted/credentials.md). ### Access to GitHub Actions Secrets diff --git a/docs/usage/golang.md b/docs/usage/golang.md index 51b334ab624718..4394a5f4dcd957 100644 --- a/docs/usage/golang.md +++ b/docs/usage/golang.md @@ -67,16 +67,16 @@ By default, Renovate will keep up with the latest version of the `go` binary. You can force Renovate to use a specific version of Go by setting a constraint. -```json title="Getting Renovate to use the latest patch version of the 1.16 Go binary" +```json title="Getting Renovate to use the latest patch version of the 1.23 Go binary" { "constraints": { - "go": "1.16" + "go": "1.23" } } ``` We do not support patch level versions for the minimum `go` version. -This means you cannot use `go 1.16.6`, but you can use `go 1.16` as a constraint. +This means you cannot use `go 1.23.3`, but you can use `go 1.23` as a constraint. ### Custom registry support, and authentication diff --git a/docs/usage/key-concepts/scheduling.md b/docs/usage/key-concepts/scheduling.md index 204bff8f1f2d24..cb997110b9fa4c 100644 --- a/docs/usage/key-concepts/scheduling.md +++ b/docs/usage/key-concepts/scheduling.md @@ -93,17 +93,15 @@ Some config examples: ```json title="Renovate should run each day before 4 am" { - "schedule": ["before 4am"] + "description": "Schedule daily before 4 AM", + "schedule": ["* 0-3 * * *"] } ``` ```json title="Renovate should run outside of common office hours" { - "schedule": [ - "after 10pm every weekday", - "before 5am every weekday", - "every weekend" - ] + "description": "Schedule during typical non-office hours on weekdays (i.e., 10 PM - 5 AM) and anytime on weekends", + "schedule": ["* 0-4,22-23 * * 1-5", "* * * * 0,6"] } ``` @@ -121,8 +119,9 @@ The scheduling feature can be very useful for "noisy" packages that are updated { "packageRules": [ { + "description": "Schedule aws-sdk updates on Sunday nights (9 PM - 12 AM)", "matchPackageNames": ["aws-sdk"], - "schedule": ["after 9pm on sunday"] + "schedule": ["* 21-23 * * 0"] } ] } diff --git a/docs/usage/mend-hosted/.pages b/docs/usage/mend-hosted/.pages index 90b6607a9f5084..01b1b47debd098 100644 --- a/docs/usage/mend-hosted/.pages +++ b/docs/usage/mend-hosted/.pages @@ -1,5 +1,5 @@ title: Mend-hosted Apps nav: - 'Configuration': 'hosted-apps-config.md' - - 'App Secrets': 'app-secrets.md' + - 'Credentials': 'credentials.md' - 'Migrating Secrets': 'migrating-secrets.md' diff --git a/docs/usage/mend-hosted/app-secrets.md b/docs/usage/mend-hosted/credentials.md similarity index 78% rename from docs/usage/mend-hosted/app-secrets.md rename to docs/usage/mend-hosted/credentials.md index 4e01c4a718eadc..b0fdab984b1cf8 100644 --- a/docs/usage/mend-hosted/app-secrets.md +++ b/docs/usage/mend-hosted/credentials.md @@ -31,6 +31,7 @@ To add a secret for the Mend cloud app: ![Credentials settings page](../assets/images/app-settings/app-credentials.png) 4. Reference the secret from Renovate config files inside the repo. + Alternatively, you can use the Host Rules UI (see below). ```json { @@ -43,6 +44,21 @@ To add a secret for the Mend cloud app: } ``` +### Adding a host rule through the UI + +You can centrally add/configure Host Rules through the Mend UI as an alternative to including them in Renovate presets. + +1. Open the _Credentials_ section of the settings page for the relevant Org or Repo. +2. Select `ADD HOST RULE` to open the "Add a Host Rule" dialog box. + + ![Add Host Rule](../assets/images/app-settings/add-host-rule.png) + +3. Fill out the details for your host rule. + + As an example, if you are a Bitbucket or Azure DevOps user, and you want to specify a github.com token to fetch release notes and enable github-based datasources, you could create a host rule like this: + + ![Host Rules dialog box](../assets/images/app-settings/host-rules.png) + ## Organization secrets vs repository secrets ### Secret scope diff --git a/docs/usage/mend-hosted/migrating-secrets.md b/docs/usage/mend-hosted/migrating-secrets.md index ac74c451bc2f41..d73839009896c9 100644 --- a/docs/usage/mend-hosted/migrating-secrets.md +++ b/docs/usage/mend-hosted/migrating-secrets.md @@ -1,6 +1,6 @@ # Migrating Secrets from Repo Config to App Settings -On 01-Oct-2024 the Mend Renovate cloud apps will stop reading any encrypted secrets from the Renovate configuration file on your repository. +Use of encrypted secrets in the Mend Renovate cloud apps has been deprecated and soon the apps will stop reading any encrypted secrets from the Renovate configuration file on your repository. Previously, you could encrypt a secret with the [Renovate encryption tool](https://app.renovatebot.com/encrypt) and then put it in your Renovate config file. Going forward, all secrets must be stored in the App settings on the cloud. @@ -102,4 +102,4 @@ If you were expecting to import a secret originally encrypted by Renovate: ## Related links -- [Using Secrets with Mend Cloud Apps](app-secrets.md) +- [Using Secrets with Mend Cloud Apps](credentials.md) diff --git a/docs/usage/noise-reduction.md b/docs/usage/noise-reduction.md index d88a39671a5eff..72ef8b5e15a401 100644 --- a/docs/usage/noise-reduction.md +++ b/docs/usage/noise-reduction.md @@ -91,9 +91,10 @@ You don't want to get too far behind, so how about we update `eslint` packages o { "packageRules": [ { + "description": "Schedule updates on first day of each month", "matchPackageNames": ["/eslint/"], "groupName": "eslint", - "schedule": ["on the first day of the month"] + "schedule": ["* * 1 * *"] } ] } @@ -105,9 +106,10 @@ Or perhaps at least weekly: { "packageRules": [ { + "description": "Schedule updates on Monday mornings(before 4 AM)", "matchPackageNames": ["/eslint/"], "groupName": "eslint", - "schedule": ["before 4am on monday"] + "schedule": ["* 0-3 * * 1"] } ] } @@ -165,9 +167,10 @@ Let's automerge it if all the linting updates pass: { "packageRules": [ { + "description": "Schedule updates on Monday mornings(before 4 AM)", "matchPackageNames": ["/eslint/"], "groupName": "eslint", - "schedule": ["before 4am on monday"], + "schedule": ["* 0-3 * * 1"], "automerge": true, "automergeType": "branch" } diff --git a/docs/usage/release-notes-for-major-versions.md b/docs/usage/release-notes-for-major-versions.md index cc1b650b2908c4..5a1241fdc27d88 100644 --- a/docs/usage/release-notes-for-major-versions.md +++ b/docs/usage/release-notes-for-major-versions.md @@ -7,6 +7,71 @@ The most recent versions are always at the top of the page. This is because recent versions may revert changes made in an older version. You also don't have to scroll to the bottom of the page to find the latest release notes. +## Version 39 + +### Breaking changes for 39 + +#### New tools for all Docker images + +All our Docker images now use: + +- Node.js v22 as base, was Node.js v20 +- Ubuntu 24.04 as base, was 20.04 + +#### New Docker user ID for all Docker images + +All our Docker images now set the Docker user ID to `12021`, the old ID was `1001`. + +After updating your Renovate Docker image to the new v39 release, you must: + +- Delete your old Docker cache, _or_ +- Ensure the new user ID has write permissions to any existing cache + +#### Updated version of Python, and new default behavior for the `-full` Docker image + +On top of the changes listed above, the `-full` image now: + +- Uses Python 3.13 +- Defaults to [`binarySource=global`](self-hosted-configuration.md#binarysource) (note: this was previously the case in v36 onwards but regressed sometime in v38) + +If you want to keep the old behavior, where Renovate dynamically installs the needed tools: set the environment variable `RENOVATE_BINARY_SOURCE` to `"install"`. + +#### Renovate tries squash merges first when automerging on GitHub + +Due to technical reasons, GitHub will only sign commits coming from a squash merge. +To help those who want Renovate to sign its commits, Renovate now tries the squash merge first. + +Of course, Renovate only uses the merge method(s) that you allow in your GitHub repository config. + +##### How you can allow squash merges on your GitHub repository + +If you want to allow squash merges on your GitHub repository, follow the steps in the [GitHub Docs, configuring commit squashing for pull requests](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/configuring-commit-squashing-for-pull-requests). + +#### Branch names with multiple slashes + +If you set `branchNameStrict=true`, then branch names with multiple forward slashes (`/`) will change. + +The problem was that even if you set `branchNameStrict=true`, in some cases special characters could still end up in Renovate's branch names. +We fixed this problem, by letting Renovate convert multiple forward slashes (`/`) to hyphens (`-`) in its branch names, if `branchNameStrict=true`. + +### Commentary for 39 + +#### Technical reasons for trying the squash merge first on GitHub + +Renovate has changed its GitHub merge preference to "squash" because this way results in signed commits, while "rebase" merges do not. + +Read the [GitHub Docs, Signature verification for rebase and merge](https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification#signature-verification-for-rebase-and-merge) to learn more about commit signing. + +#### Why we change branch names with multiple slashes + +Branches with mutiple slashes (`/`) are not wanted, this was a bug. +We are changing it in a major release out of politeness to all our users. +If you enabled `branchNameStrict`, you can expect some branch names to change. + +### Link to release notes for 39 + +[Release notes for `v39` on GitHub](https://github.com/renovatebot/renovate/releases/tag/39.0.0). + ## Version 38 ### Breaking changes for 38 @@ -130,7 +195,7 @@ If you're on a version of Lerna before v7, you should prioritize upgrading to v7 - **automerge:** Platform automerge will now be chosen by default whenever automerge is enabled - Post upgrade templating is now allowed by default, as long as the post upgrade task command is itself already allowed - Official Renovate Docker images now use the "slim" approach with `binarySource=install` by default. e.g. `renovate/renovate:latest` is the slim image, not full -- The "full" image is now available via the tag `full`, e.g. `renovate/renovate:38-full`, and defaults to `binarySource=global` (no dynamic installs) +- The "full" image is now available via the tag `full`, e.g. `renovate/renovate:39-full`, and defaults to `binarySource=global` (no dynamic installs) - Third party tools in the full image have been updated to latest/LTS major version ### Commentary for 36 diff --git a/docs/usage/rust.md b/docs/usage/rust.md index 594abea989aab8..23c525e03d328d 100644 --- a/docs/usage/rust.md +++ b/docs/usage/rust.md @@ -34,7 +34,7 @@ Read the [Rust environment variables docs](https://doc.rust-lang.org/cargo/refer You as user can set authentication for private crates by adding a `hostRules` configuration to your `renovate.json` file. All token `hostRules` with a `hostType` (e.g. `github`, `gitlab`, `bitbucket`, etc.) and host rules without a `hostType` will be automatically setup for authentication. -You can also configure a `hostRules` that's only for Cargo authentication (e.g. `hostType: 'cargo'`). +You can also configure a `hostRules` that's only for Cargo authentication (e.g. `hostType: 'crate'`). ```js title="Example of authentication for a private GitHub and Cargo registry:" module.exports = { @@ -47,7 +47,7 @@ module.exports = { { matchHost: 'someGitHost.enterprise.com', token: process.env.CARGO_GIT_TOKEN, - hostType: 'cargo', + hostType: 'crate', }, ], }; diff --git a/jest.config.ts b/jest.config.ts index 9aa56f29293e1b..b709c35129c896 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -385,7 +385,7 @@ if (process.env.SCHEDULE_TEST_SHARDS) { }; if (process.env.ALL_PLATFORMS === 'true') { - shardGrouping['windows-latest'] = scheduleItems(shardKeys, 8); + // shardGrouping['windows-latest'] = scheduleItems(shardKeys, 8); shardGrouping['macos-latest'] = scheduleItems(shardKeys, 4); } diff --git a/lib/config-validator.ts b/lib/config-validator.ts index bc298c6c23b0bd..c8ff6bfc4a564f 100644 --- a/lib/config-validator.ts +++ b/lib/config-validator.ts @@ -1,6 +1,7 @@ #!/usr/bin/env node // istanbul ignore file import 'source-map-support/register'; +import './punycode.cjs'; import { dequal } from 'dequal'; import { pathExists, readFile } from 'fs-extra'; import { configFileNames } from './config/app-strings'; diff --git a/lib/config/options/index.ts b/lib/config/options/index.ts index 30ea3ab10ae7ac..712dc338a3b93f 100644 --- a/lib/config/options/index.ts +++ b/lib/config/options/index.ts @@ -515,7 +515,7 @@ const options: RenovateOptions[] = [ description: 'Change this value to override the default Renovate sidecar image.', type: 'string', - default: 'ghcr.io/containerbase/sidecar:13.0.14', + default: 'ghcr.io/containerbase/sidecar:13.0.22', globalOnly: true, }, { @@ -1135,6 +1135,7 @@ const options: RenovateOptions[] = [ supportedManagers: [ 'ansible', 'bitbucket-pipelines', + 'buildpacks', 'crossplane', 'devcontainer', 'docker-compose', diff --git a/lib/config/presets/internal/group.ts b/lib/config/presets/internal/group.ts index e3db5f98e77335..2957b595ef3a81 100644 --- a/lib/config/presets/internal/group.ts +++ b/lib/config/presets/internal/group.ts @@ -347,7 +347,7 @@ const staticGroups = { packageRules: [ { commitMessageTopic: 'Node.js', - matchDatasources: ['docker'], + matchDatasources: ['docker', 'node-version'], matchPackageNames: [ '/(?:^|/)node$/', // node or ends with "/node, except those below" '!calico/node', diff --git a/lib/config/presets/internal/schedule.spec.ts b/lib/config/presets/internal/schedule.spec.ts new file mode 100644 index 00000000000000..07d4ae841a8eab --- /dev/null +++ b/lib/config/presets/internal/schedule.spec.ts @@ -0,0 +1,150 @@ +import { isScheduledNow } from '../../../workers/repository/update/branch/schedule'; +import type { RenovateConfig } from '../../types'; +import { presets } from './schedule'; + +describe('config/presets/internal/schedule', () => { + let config: RenovateConfig; + + beforeAll(() => { + jest.useFakeTimers(); + }); + + beforeEach(() => { + jest.setSystemTime(new Date('2017-06-30T10:50:00.000')); // Locally 2017-06-30 10:50am + + config = {}; + }); + + describe('daily', () => { + it.each` + datetime | expected + ${'2017-06-30T00:50:00.000'} | ${true} + ${'2017-06-30T01:50:00.000'} | ${true} + ${'2017-06-30T02:50:00.000'} | ${true} + ${'2017-06-30T03:50:00.000'} | ${true} + ${'2017-06-30T04:50:00.000'} | ${false} + `('$datetime', ({ datetime, expected }) => { + config.schedule = presets.daily.schedule; + jest.setSystemTime(new Date(datetime)); + expect(isScheduledNow(config)).toBe(expected); + }); + }); + + describe('earlyMondays', () => { + it.each` + datetime | expected + ${'2017-06-26T00:50:00.000'} | ${true} + ${'2017-06-26T01:50:00.000'} | ${true} + ${'2017-06-26T02:50:00.000'} | ${true} + ${'2017-06-26T03:50:00.000'} | ${true} + ${'2017-06-26T04:50:00.000'} | ${false} + ${'2017-06-30T00:50:00.000'} | ${false} + `('$datetime', ({ datetime, expected }) => { + config.schedule = presets.earlyMondays.schedule; + jest.setSystemTime(new Date(datetime)); + expect(isScheduledNow(config)).toBe(expected); + }); + }); + + describe('monthly', () => { + it.each` + datetime | expected + ${'2017-06-01T00:50:00.000'} | ${true} + ${'2017-06-01T01:50:00.000'} | ${true} + ${'2017-06-01T02:50:00.000'} | ${true} + ${'2017-06-01T03:50:00.000'} | ${true} + ${'2017-06-01T04:50:00.000'} | ${false} + ${'2017-06-02T00:50:00.000'} | ${false} + `('$datetime', ({ datetime, expected }) => { + config.schedule = presets.monthly.schedule; + jest.setSystemTime(new Date(datetime)); + expect(isScheduledNow(config)).toBe(expected); + }); + }); + + describe('nonOfficeHours', () => { + it.each` + datetime | expected + ${'2017-06-01T00:50:00.000'} | ${true} + ${'2017-06-01T01:50:00.000'} | ${true} + ${'2017-06-01T02:50:00.000'} | ${true} + ${'2017-06-01T03:50:00.000'} | ${true} + ${'2017-06-01T04:50:00.000'} | ${true} + ${'2017-06-01T10:50:00.000'} | ${false} + ${'2017-06-01T11:50:00.000'} | ${false} + ${'2017-06-01T22:50:00.000'} | ${true} + ${'2017-06-01T23:50:00.000'} | ${true} + ${'2017-06-03T09:50:00.000'} | ${true} + `('$datetime', ({ datetime, expected }) => { + config.schedule = presets.nonOfficeHours.schedule; + jest.setSystemTime(new Date(datetime)); + expect(isScheduledNow(config)).toBe(expected); + }); + }); + + // const weekdays = ['every weekday']; + // const weekends = ['every weekend']; + // const yearly = ['every 12 months on the first day of the month']; + describe('quarterly', () => { + it.each` + datetime | expected + ${'2017-01-01T00:50:00.000'} | ${true} + ${'2017-01-02T00:50:00.000'} | ${false} + ${'2017-04-01T01:50:00.000'} | ${true} + ${'2017-07-01T02:50:00.000'} | ${true} + ${'2017-10-01T03:50:00.000'} | ${true} + ${'2017-02-01T04:50:00.000'} | ${false} + `('$datetime', ({ datetime, expected }) => { + config.schedule = presets.quarterly.schedule; + jest.setSystemTime(new Date(datetime)); + expect(isScheduledNow(config)).toBe(expected); + }); + }); + + describe('weekdays', () => { + it.each` + datetime | expected + ${'2017-06-01T00:50:00.000'} | ${true} + ${'2017-06-02T01:50:00.000'} | ${true} + ${'2017-06-03T02:50:00.000'} | ${false} + ${'2017-06-04T03:50:00.000'} | ${false} + ${'2017-06-05T04:50:00.000'} | ${true} + ${'2017-06-06T10:50:00.000'} | ${true} + ${'2017-06-07T11:50:00.000'} | ${true} + `('$datetime', ({ datetime, expected }) => { + config.schedule = presets.weekdays.schedule; + jest.setSystemTime(new Date(datetime)); + expect(isScheduledNow(config)).toBe(expected); + }); + }); + + describe('weekends', () => { + it.each` + datetime | expected + ${'2017-06-01T00:50:00.000'} | ${false} + ${'2017-06-02T01:50:00.000'} | ${false} + ${'2017-06-03T02:50:00.000'} | ${true} + ${'2017-06-04T03:50:00.000'} | ${true} + ${'2017-06-05T04:50:00.000'} | ${false} + ${'2017-06-06T10:50:00.000'} | ${false} + ${'2017-06-07T11:50:00.000'} | ${false} + `('$datetime', ({ datetime, expected }) => { + config.schedule = presets.weekends.schedule; + jest.setSystemTime(new Date(datetime)); + expect(isScheduledNow(config)).toBe(expected); + }); + }); + + describe('yearly', () => { + it.each` + datetime | expected + ${'2017-01-01T00:50:00.000'} | ${true} + ${'2017-02-02T01:50:00.000'} | ${false} + ${'2018-01-01T02:50:00.000'} | ${true} + `('$datetime', ({ datetime, expected }) => { + config.schedule = presets.yearly.schedule; + jest.setSystemTime(new Date(datetime)); + expect(isScheduledNow(config)).toBe(expected); + }); + }); +}); diff --git a/lib/config/presets/internal/schedule.ts b/lib/config/presets/internal/schedule.ts index 1f5eb5de949d0f..051bfd17c2e5ab 100644 --- a/lib/config/presets/internal/schedule.ts +++ b/lib/config/presets/internal/schedule.ts @@ -2,48 +2,46 @@ import type { Preset } from '../types'; /* eslint sort-keys: ["error", "asc", {caseSensitive: false, natural: true}] */ -const daily = ['before 4am']; -const earlyMondays = ['before 4am on Monday']; -const monthly = ['before 4am on the first day of the month']; -const nonOfficeHours = [ - 'after 10pm every weekday', - 'before 5am every weekday', - 'every weekend', -]; -const quarterly = ['every 3 months on the first day of the month']; -const weekdays = ['every weekday']; -const weekends = ['every weekend']; -const yearly = ['every 12 months on the first day of the month']; +const daily = ['* 0-3 * * *']; +const earlyMondays = ['* 0-3 * * 1']; +const monthly = ['* 0-3 1 * *']; +const nonOfficeHours = ['* 0-4,22-23 * * 1-5', '* * * * 0,6']; +const quarterly = ['* * 1 */3 *']; +const weekdays = ['* * * * 1-5']; +const weekends = ['* * * * 0,6']; +const yearly = ['* * 1 */12 *']; export const presets: Record = { automergeDaily: { automergeSchedule: daily, - description: 'Schedule automerge daily.', + description: 'Schedule automerge daily before 4 AM.', }, automergeEarlyMondays: { automergeSchedule: earlyMondays, - description: 'Weekly automerge schedule on early Monday mornings.', + description: 'Schedule automerge on Monday mornings (before 4 AM).', }, automergeMonthly: { automergeSchedule: monthly, - description: 'Schedule automerge monthly.', + description: + 'Schedule automerge for the first day of each month, before 4 AM.', }, automergeNonOfficeHours: { automergeSchedule: nonOfficeHours, description: - 'Schedule automerge for typical non-office hours (night time and weekends).', + 'Schedule automerge during typical non-office hours on weekdays (i.e., 10 PM - 5 AM) and anytime on weekends.', }, automergeQuarterly: { automergeSchedule: quarterly, - description: 'Schedule automerge quarterly.', + description: + 'Schedule automerge on the first day of each quarter (i.e., January, April, July, October).', }, automergeWeekdays: { automergeSchedule: weekdays, - description: 'Schedule automerge for weekdays.', + description: 'Schedule automerge anytime on weekdays.', }, automergeWeekends: { automergeSchedule: weekends, - description: 'Schedule automerge for weekends.', + description: 'Schedule automerge anytime on weekends.', }, automergeWeekly: { description: 'Schedule automerge weekly.', @@ -51,27 +49,30 @@ export const presets: Record = { }, automergeYearly: { automergeSchedule: yearly, - description: 'Schedule automerge once a year (not recommended).', + description: + 'Schedule automerge once a year on the first day of January (not recommended).', }, daily: { - description: 'Schedule daily.', + description: 'Schedule daily before 4 AM.', schedule: daily, }, earlyMondays: { - description: 'Weekly schedule on early Monday mornings.', + description: 'Weekly schedule on early Monday mornings (before 4 AM).', schedule: earlyMondays, }, monthly: { - description: 'Schedule monthly.', + description: + 'Schedule once a month on the first day of the month before 4 AM.', schedule: monthly, }, nonOfficeHours: { description: - 'Schedule for typical non-office hours (night time and weekends).', + 'Schedule during typical non-office hours on weekdays (i.e., 10 PM - 5 AM) and anytime on weekends.', schedule: nonOfficeHours, }, quarterly: { - description: 'Schedule quarterly.', + description: + 'Schedule on the first day of each quarter (i.e., January, April, July, October).', schedule: quarterly, }, weekdays: { @@ -87,7 +88,8 @@ export const presets: Record = { extends: ['schedule:earlyMondays'], }, yearly: { - description: 'Schedule once a year (not recommended).', + description: + 'Schedule once a year on the first day of January (not recommended).', schedule: yearly, }, }; diff --git a/lib/data/monorepo.json b/lib/data/monorepo.json index 412f66469aacbf..b92b69048722ea 100644 --- a/lib/data/monorepo.json +++ b/lib/data/monorepo.json @@ -255,6 +255,7 @@ "https://github.com/dotnet/aspnetcore", "https://github.com/dotnet/efcore", "https://github.com/dotnet/extensions", + "https://github.com/dotnet/fsharp", "https://github.com/dotnet/maui", "https://github.com/dotnet/roslyn", "https://github.com/dotnet/runtime", @@ -267,6 +268,7 @@ "dropwizard": "https://github.com/dropwizard/dropwizard", "duende-identityserver": "https://github.com/DuendeSoftware/IdentityServer", "elastic-apm-agent-rum-js": "https://github.com/elastic/apm-agent-rum-js", + "elastic-ecs-dotnet": "https://github.com/elastic/ecs-dotnet", "electron-forge": [ "https://github.com/electron-userland/electron-forge", "https://github.com/electron/forge" diff --git a/lib/logger/index.spec.ts b/lib/logger/index.spec.ts index 3fa2fbd10aa2e1..a2eb3e3beb19c3 100644 --- a/lib/logger/index.spec.ts +++ b/lib/logger/index.spec.ts @@ -10,6 +10,7 @@ import { getContext, getProblems, levels, + logLevel, logger, removeMeta, setContext, @@ -53,7 +54,9 @@ describe('logger/index', () => { }); it('sets level', () => { + expect(logLevel()).toBeDefined(); // depends on passed env expect(() => levels('stdout', 'debug')).not.toThrow(); + expect(logLevel()).toBe('debug'); }); it('saves problems', () => { diff --git a/lib/logger/index.ts b/lib/logger/index.ts index 504e9b1a2c97e8..f066e05f97b22e 100644 --- a/lib/logger/index.ts +++ b/lib/logger/index.ts @@ -10,26 +10,31 @@ import { once, reset as onceReset } from './once'; import { RenovateStream } from './pretty-stdout'; import { getRemappedLevel } from './remap'; import type { BunyanRecord, Logger } from './types'; -import { ProblemStream, validateLogLevel, withSanitizer } from './utils'; - -let logContext: string = process.env.LOG_CONTEXT ?? nanoid(); +import { + ProblemStream, + getEnv, + validateLogLevel, + withSanitizer, +} from './utils'; + +let logContext: string = getEnv('LOG_CONTEXT') ?? nanoid(); let curMeta: Record = {}; const problems = new ProblemStream(); -// istanbul ignore if: not easily testable -if (is.string(process.env.LOG_LEVEL)) { - process.env.LOG_LEVEL = process.env.LOG_LEVEL.toLowerCase().trim(); -} - +let stdoutLevel = validateLogLevel(getEnv('LOG_LEVEL'), 'info'); const stdout: bunyan.Stream = { name: 'stdout', - level: validateLogLevel(process.env.LOG_LEVEL, 'info'), + level: stdoutLevel, stream: process.stdout, }; +export function logLevel(): bunyan.LogLevelString { + return stdoutLevel; +} + // istanbul ignore if: not testable -if (process.env.LOG_FORMAT !== 'json') { +if (getEnv('LOG_FORMAT') !== 'json') { // TODO: typings (#9615) const prettyStdOut = new RenovateStream() as any; prettyStdOut.pipe(process.stdout); @@ -122,16 +127,17 @@ loggerLevels.forEach((loggerLevel) => { logger.once[loggerLevel] = logOnceFn as never; }); +const logFile = getEnv('LOG_FILE'); // istanbul ignore if: not easily testable -if (is.string(process.env.LOG_FILE)) { +if (is.string(logFile)) { // ensure log file directory exists - const directoryName = upath.dirname(process.env.LOG_FILE); + const directoryName = upath.dirname(logFile); fs.ensureDirSync(directoryName); addStream({ name: 'logfile', - path: process.env.LOG_FILE, - level: validateLogLevel(process.env.LOG_FILE_LEVEL, 'debug'), + path: logFile, + level: validateLogLevel(getEnv('LOG_FILE_LEVEL'), 'debug'), }); } @@ -168,8 +174,20 @@ export /* istanbul ignore next */ function addStream( bunyanLogger.addStream(withSanitizer(stream)); } -export function levels(name: string, level: bunyan.LogLevel): void { +/** + * For testing purposes only + * @param name stream name + * @param level log level + * @private + */ +export function levels( + name: 'stdout' | 'logfile', + level: bunyan.LogLevelString, +): void { bunyanLogger.levels(name, level); + if (name === 'stdout') { + stdoutLevel = level; + } } export function getProblems(): BunyanRecord[] { diff --git a/lib/logger/utils.ts b/lib/logger/utils.ts index f04c0f8132ad9e..5b2d512601ac71 100644 --- a/lib/logger/utils.ts +++ b/lib/logger/utils.ts @@ -333,3 +333,9 @@ export function sanitizeUrls(text: string): string { }) .replace(dataUriCredRe, '$1**redacted**'); } + +export function getEnv(key: string): string | undefined { + return [process.env[`RENOVATE_${key}`], process.env[key]] + .map((v) => v?.toLowerCase().trim()) + .find(is.nonEmptyStringAndNotWhitespace); +} diff --git a/lib/modules/datasource/common.spec.ts b/lib/modules/datasource/common.spec.ts index a86c6a2d3f43de..02eddebeb117df 100644 --- a/lib/modules/datasource/common.spec.ts +++ b/lib/modules/datasource/common.spec.ts @@ -103,7 +103,10 @@ describe('modules/datasource/common', () => { }; const res = applyExtractVersion(releaseResult, '^v(?.+)$'); expect(res).toEqual({ - releases: [{ version: '1.0.0' }, { version: '2.0.0' }], + releases: [ + { version: '1.0.0', versionOrig: 'v1.0.0' }, + { version: '2.0.0', versionOrig: 'v2.0.0' }, + ], }); }); @@ -113,7 +116,7 @@ describe('modules/datasource/common', () => { }; const result = applyExtractVersion(releaseResult, '^v(?.+)$'); expect(result).toEqual({ - releases: [{ version: '1.0.0' }], + releases: [{ version: '1.0.0', versionOrig: 'v1.0.0' }], }); }); }); diff --git a/lib/modules/datasource/common.ts b/lib/modules/datasource/common.ts index b50f109ef2d9db..7ce15263d9615a 100644 --- a/lib/modules/datasource/common.ts +++ b/lib/modules/datasource/common.ts @@ -110,6 +110,7 @@ export function applyExtractVersion( return null; } + release.versionOrig = release.version; release.version = version; return release; }); diff --git a/lib/modules/datasource/conan/common.ts b/lib/modules/datasource/conan/common.ts index e0dfa211ddd500..c17062a5995b3a 100644 --- a/lib/modules/datasource/conan/common.ts +++ b/lib/modules/datasource/conan/common.ts @@ -6,7 +6,7 @@ export const defaultRegistryUrl = 'https://center.conan.io/'; export const datasource = 'conan'; export const conanDatasourceRegex = regEx( - /(?[a-z\-_0-9]+)\/(?[^@/\n]+)(?@\S+\/\S+)/gim, + /(?[a-zA-Z\-_0-9]+)\/(?[^@/\n]+)(?@\S+\/\S+)/gim, ); export function getConanPackage(packageName: string): ConanPackage { diff --git a/lib/modules/datasource/cpan/__fixtures__/Plack.json b/lib/modules/datasource/cpan/__fixtures__/Plack.json index 9fb33a17fd6236..7d402d1db68eab 100644 --- a/lib/modules/datasource/cpan/__fixtures__/Plack.json +++ b/lib/modules/datasource/cpan/__fixtures__/Plack.json @@ -24,6 +24,7 @@ "version" : "1.0048" } ], + "status": "latest", "date" : "2020-11-30T00:21:36", "maturity" : "released", "distribution" : "Plack", @@ -47,6 +48,7 @@ "name" : "Plack" } ], + "status": "cpan", "date" : "2018-02-10T09:25:30", "maturity" : "released" }, @@ -63,6 +65,7 @@ "name" : "Plack" } ], + "status": "cpan", "date" : "2018-02-10T07:52:31", "deprecated" : false }, @@ -84,6 +87,7 @@ "name" : "Plack" } ], + "status": "cpan", "date" : "2017-12-31T20:42:50", "distribution" : "Plack", "download_url" : "https://cpan.metacpan.org/authors/id/M/MI/MIYAGAWA/Plack-1.0045.tar.gz" @@ -107,6 +111,7 @@ "version" : "1.0044" } ], + "status": "cpan", "date" : "2017-04-27T17:48:20", "maturity" : "released", "deprecated" : false @@ -134,6 +139,7 @@ "version" : "1.0043" } ], + "status": "cpan", "date" : "2017-02-22T03:02:05", "maturity" : "released", "distribution" : "Plack", @@ -158,6 +164,7 @@ "version" : "1.0042" } ], + "status": "cpan", "date" : "2016-09-29T05:38:42", "deprecated" : false } @@ -172,6 +179,7 @@ "version" : "1.0041" } ], + "status": "cpan", "date" : "2016-09-25T21:25:47", "download_url" : "https://cpan.metacpan.org/authors/id/M/MI/MIYAGAWA/Plack-1.0041.tar.gz", "distribution" : "Plack" @@ -195,6 +203,7 @@ "name" : "Plack" } ], + "status": "cpan", "date" : "2016-04-01T16:58:21", "maturity" : "developer" }, @@ -217,6 +226,7 @@ "name" : "Plack" } ], + "status": "cpan", "date" : "2015-12-06T11:29:40", "distribution" : "Plack", "download_url" : "https://cpan.metacpan.org/authors/id/M/MI/MIYAGAWA/Plack-1.0039.tar.gz" @@ -227,6 +237,29 @@ "sort" : [ 1449401380000 ] + }, + { + "_type" : "file", + "_source" : { + "deprecated" : false, + "maturity" : "released", + "module" : [ + { + "version" : "1.0038", + "name" : "Plack" + } + ], + "date" : "2015-12-06T11:29:40", + "distribution" : "Plack", + "download_url" : "https://cpan.metacpan.org/authors/id/M/MI/MIYAGAWA/Plack-1.0039.tar.gz" + }, + "status": "invalid", + "_index" : "cpan_v1_01", + "_id" : "Y7WlIYOZjk3rh9O05F3UZE6WwGo", + "_score" : null, + "sort" : [ + 1449401380000 + ] } ], "max_score" : null diff --git a/lib/modules/datasource/cpan/index.spec.ts b/lib/modules/datasource/cpan/index.spec.ts index c4727a1281d990..231e5bd316ab79 100644 --- a/lib/modules/datasource/cpan/index.spec.ts +++ b/lib/modules/datasource/cpan/index.spec.ts @@ -86,6 +86,7 @@ describe('modules/datasource/cpan/index', () => { releaseTimestamp: '2020-11-30T00:21:36.000Z', version: '1.0048', }); + expect(res?.tags?.latest).toBe('1.0048'); }); }); }); diff --git a/lib/modules/datasource/cpan/index.ts b/lib/modules/datasource/cpan/index.ts index 85436a1d925463..435c48764f5907 100644 --- a/lib/modules/datasource/cpan/index.ts +++ b/lib/modules/datasource/cpan/index.ts @@ -2,8 +2,9 @@ import { cache } from '../../../util/cache/package/decorator'; import { joinUrlParts } from '../../../util/url'; import * as perlVersioning from '../../versioning/perl'; import { Datasource } from '../datasource'; -import type { GetReleasesConfig, Release, ReleaseResult } from '../types'; -import type { MetaCpanApiFile, MetaCpanApiFileSearchResult } from './types'; +import type { GetReleasesConfig, ReleaseResult } from '../types'; +import { MetaCpanApiFileSearchResponse } from './schema'; +import type { CpanRelease } from './types'; export class CpanDatasource extends Datasource { static readonly id = 'cpan'; @@ -38,7 +39,7 @@ export class CpanDatasource extends Datasource { let result: ReleaseResult | null = null; const searchUrl = joinUrlParts(registryUrl, 'v1/file/_search'); - let hits: MetaCpanApiFile[] | null = null; + let releases: CpanRelease[] | null = null; try { const body = { query: { @@ -60,55 +61,47 @@ export class CpanDatasource extends Datasource { 'date', 'deprecated', 'maturity', + 'status', ], sort: [{ date: 'desc' }], }; - const res = await this.http.postJson( - searchUrl, - { body }, - ); - hits = res.body?.hits?.hits?.map(({ _source }) => _source); + + releases = ( + await this.http.postJson( + searchUrl, + { body }, + MetaCpanApiFileSearchResponse, + ) + ).body; } catch (err) { this.handleGenericErrors(err); } let latestDistribution: string | null = null; - if (hits) { - const releases: Release[] = []; - for (const hit of hits) { - const { - module, - distribution, - date: releaseTimestamp, - deprecated: isDeprecated, - maturity, - } = hit; - const version = module.find( - ({ name }) => name === packageName, - )?.version; - if (version) { - // https://metacpan.org/pod/CPAN::DistnameInfo#maturity - const isStable = maturity === 'released'; - releases.push({ - isDeprecated, - isStable, - releaseTimestamp, - version, - }); - - if (!latestDistribution) { - latestDistribution = distribution; - } + let latestVersion: string | null = null; + if (releases) { + for (const release of releases) { + if (!latestDistribution) { + latestDistribution = release.distribution; + } + if (!latestVersion && release.isLatest) { + latestVersion = release.version; } } - if (releases.length > 0 && latestDistribution) { - result = { - releases, - changelogUrl: `https://metacpan.org/dist/${latestDistribution}/changes`, - homepage: `https://metacpan.org/pod/${packageName}`, - }; + } + if (releases.length > 0 && latestDistribution) { + result = { + releases, + changelogUrl: `https://metacpan.org/dist/${latestDistribution}/changes`, + homepage: `https://metacpan.org/pod/${packageName}`, + }; + + if (latestVersion) { + result.tags ??= {}; + result.tags.latest = latestVersion; } } + return result; } } diff --git a/lib/modules/datasource/cpan/schema.ts b/lib/modules/datasource/cpan/schema.ts new file mode 100644 index 00000000000000..8e997143ba3849 --- /dev/null +++ b/lib/modules/datasource/cpan/schema.ts @@ -0,0 +1,64 @@ +import { z } from 'zod'; +import { LooseArray } from '../../../util/schema-utils'; +import type { CpanRelease } from './types'; + +/** + * https://fastapi.metacpan.org/v1/file/_mapping + */ +const MetaCpanApiFileSchema = z + .object({ + module: LooseArray( + z.object({ + name: z.string(), + version: z.string(), + }), + ), + distribution: z.string(), + date: z.string(), + deprecated: z.boolean(), + maturity: z.string(), + status: z.union([ + z.literal('backpan'), + z.literal('cpan'), + z.literal('latest'), + ]), + }) + .transform( + ({ + module, + distribution, + date, + deprecated, + maturity, + status, + }): CpanRelease | undefined => { + return { + version: module[0].version, + distribution, + isDeprecated: deprecated, + isStable: maturity === 'released', + releaseTimestamp: date, + isLatest: status === 'latest', + }; + }, + ) + .catch(undefined); +/** + * https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#available-fields + */ +export const MetaCpanApiFileSearchResponse = z + .object({ + hits: z.object({ + hits: LooseArray( + z.object({ + _source: MetaCpanApiFileSchema, + }), + ), + }), + }) + .transform((data): CpanRelease[] => { + // Extract all hits and filter out ones where _source transformed to undefined + return data.hits.hits + .map((hit) => hit._source) + .filter((source) => source !== undefined); + }); diff --git a/lib/modules/datasource/cpan/types.ts b/lib/modules/datasource/cpan/types.ts index e6279b5b865da8..0d9cef2408b9a2 100644 --- a/lib/modules/datasource/cpan/types.ts +++ b/lib/modules/datasource/cpan/types.ts @@ -1,24 +1,5 @@ -/** - * https://fastapi.metacpan.org/v1/file/_mapping - */ -export interface MetaCpanApiFile { - module: { - name: string; - version?: string; - }[]; - distribution: string; - date: string; - deprecated: boolean; - maturity: string; -} +import type { Release } from '../types'; -/** - * https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md#available-fields - */ -export interface MetaCpanApiFileSearchResult { - hits: { - hits: { - _source: MetaCpanApiFile; - }[]; - }; +export interface CpanRelease extends Release { + distribution: string; } diff --git a/lib/modules/datasource/go/__snapshots__/index.spec.ts.snap b/lib/modules/datasource/go/__snapshots__/index.spec.ts.snap deleted file mode 100644 index e1ff755b222b8d..00000000000000 --- a/lib/modules/datasource/go/__snapshots__/index.spec.ts.snap +++ /dev/null @@ -1,3 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`modules/datasource/go/index getDigest support bitbucket digest 1`] = `"123"`; diff --git a/lib/modules/datasource/go/base.spec.ts b/lib/modules/datasource/go/base.spec.ts index c70d690ce2648a..e425fae5864067 100644 --- a/lib/modules/datasource/go/base.spec.ts +++ b/lib/modules/datasource/go/base.spec.ts @@ -16,14 +16,17 @@ const hostRules = mocked(_hostRules); describe('modules/datasource/go/base', () => { describe('simple cases', () => { it.each` - module | datasource | packageName - ${'gopkg.in/foo'} | ${'github-tags'} | ${'go-foo/foo'} - ${'gopkg.in/foo/bar'} | ${'github-tags'} | ${'foo/bar'} - ${'github.com/foo/bar'} | ${'github-tags'} | ${'foo/bar'} - ${'bitbucket.org/foo/bar'} | ${'bitbucket-tags'} | ${'foo/bar'} - ${'code.cloudfoundry.org/lager'} | ${'github-tags'} | ${'cloudfoundry/lager'} - ${'dev.azure.com/foo/bar/_git/baz.git'} | ${'git-tags'} | ${'https://dev.azure.com/foo/bar/_git/baz'} - ${'dev.azure.com/foo/bar/baz.git'} | ${'git-tags'} | ${'https://dev.azure.com/foo/bar/_git/baz'} + module | datasource | packageName + ${'gopkg.in/foo'} | ${'github-tags'} | ${'go-foo/foo'} + ${'gopkg.in/foo/bar'} | ${'github-tags'} | ${'foo/bar'} + ${'github.com/foo/bar'} | ${'github-tags'} | ${'foo/bar'} + ${'bitbucket.org/foo/bar'} | ${'bitbucket-tags'} | ${'foo/bar'} + ${'code.cloudfoundry.org/lager'} | ${'github-tags'} | ${'cloudfoundry/lager'} + ${'dev.azure.com/foo/bar/_git/baz.git'} | ${'git-tags'} | ${'https://dev.azure.com/foo/bar/_git/baz'} + ${'dev.azure.com/foo/bar/baz.git'} | ${'git-tags'} | ${'https://dev.azure.com/foo/bar/_git/baz'} + ${'gitea.com/go-chi/cache'} | ${'gitea-tags'} | ${'go-chi/cache'} + ${'code.forgejo.org/go-chi/cache'} | ${'gitea-tags'} | ${'go-chi/cache'} + ${'codeberg.org/eviedelta/detctime/durationparser'} | ${'gitea-tags'} | ${'eviedelta/detctime'} `( '$module -> $datasource: $packageName', async ({ module, datasource, packageName }) => { diff --git a/lib/modules/datasource/go/base.ts b/lib/modules/datasource/go/base.ts index 06ee3276bdd375..ba3c74800afc4e 100644 --- a/lib/modules/datasource/go/base.ts +++ b/lib/modules/datasource/go/base.ts @@ -12,6 +12,7 @@ import { } from '../../../util/url'; import { BitbucketTagsDatasource } from '../bitbucket-tags'; import { GitTagsDatasource } from '../git-tags'; +import { GiteaTagsDatasource } from '../gitea-tags'; import { GithubTagsDatasource } from '../github-tags'; import { GitlabTagsDatasource } from '../gitlab-tags'; import type { DataSource } from './types'; @@ -94,6 +95,38 @@ export class BaseGoDatasource { } } + //#region known gitea compatible hosts + if (goModule.startsWith('gitea.com/')) { + const split = goModule.split('/'); + const packageName = `${split[1]}/${split[2]}`; + return { + datasource: GiteaTagsDatasource.id, + packageName, + registryUrl: 'https://gitea.com', + }; + } + + if (goModule.startsWith('code.forgejo.org/')) { + const split = goModule.split('/'); + const packageName = `${split[1]}/${split[2]}`; + return { + datasource: GiteaTagsDatasource.id, + packageName, + registryUrl: 'https://code.forgejo.org', + }; + } + + if (goModule.startsWith('codeberg.org/')) { + const split = goModule.split('/'); + const packageName = `${split[1]}/${split[2]}`; + return { + datasource: GiteaTagsDatasource.id, + packageName, + registryUrl: 'https://codeberg.org', + }; + } + //#endregion + return await BaseGoDatasource.goGetDatasource(goModule); } diff --git a/lib/modules/datasource/go/index.spec.ts b/lib/modules/datasource/go/index.spec.ts index 5a9ff72de940b0..6099b6fbb60222 100644 --- a/lib/modules/datasource/go/index.spec.ts +++ b/lib/modules/datasource/go/index.spec.ts @@ -10,6 +10,7 @@ const hostRules = mocked(_hostRules); const getReleasesDirectMock = jest.fn(); +const getDigestGiteaMock = jest.fn(); const getDigestGithubMock = jest.fn(); const getDigestGitlabMock = jest.fn(); const getDigestGitMock = jest.fn(); @@ -19,6 +20,7 @@ jest.mock('./releases-direct', () => { GoDirectDatasource: jest.fn().mockImplementation(() => { return { git: { getDigest: (...args: any[]) => getDigestGitMock(...args) }, + gitea: { getDigest: (...args: any[]) => getDigestGiteaMock(...args) }, github: { getDigest: (...args: any[]) => getDigestGithubMock(...args) }, gitlab: { getDigest: (...args: any[]) => getDigestGitlabMock(...args) }, bitbucket: { @@ -189,9 +191,18 @@ describe('modules/datasource/go/index', () => { }, undefined, ); - expect(res).toMatchSnapshot(); - expect(res).not.toBeNull(); - expect(res).toBeDefined(); + expect(res).toBe('123'); + }); + + it('support gitea digest', async () => { + getDigestGiteaMock.mockResolvedValueOnce('123'); + const res = await datasource.getDigest( + { + packageName: 'gitea.com/go-chi/cache', + }, + undefined, + ); + expect(res).toBe('123'); }); describe('GOPROXY', () => { diff --git a/lib/modules/datasource/go/index.ts b/lib/modules/datasource/go/index.ts index 1684dba29ea81a..0bb7ff263ab035 100644 --- a/lib/modules/datasource/go/index.ts +++ b/lib/modules/datasource/go/index.ts @@ -8,6 +8,7 @@ import { id as semverId } from '../../versioning/semver'; import { BitbucketTagsDatasource } from '../bitbucket-tags'; import { Datasource } from '../datasource'; import { GitTagsDatasource } from '../git-tags'; +import { GiteaTagsDatasource } from '../gitea-tags'; import { GithubTagsDatasource } from '../github-tags'; import { GitlabTagsDatasource } from '../gitlab-tags'; import type { DigestConfig, GetReleasesConfig, ReleaseResult } from '../types'; @@ -98,6 +99,9 @@ export class GoDatasource extends Datasource { case GitTagsDatasource.id: { return this.direct.git.getDigest(source, tag); } + case GiteaTagsDatasource.id: { + return this.direct.gitea.getDigest(source, tag); + } case GithubTagsDatasource.id: { return this.direct.github.getDigest(source, tag); } diff --git a/lib/modules/datasource/go/releases-direct.spec.ts b/lib/modules/datasource/go/releases-direct.spec.ts index b106c3780bde32..19da04761d3c4a 100644 --- a/lib/modules/datasource/go/releases-direct.spec.ts +++ b/lib/modules/datasource/go/releases-direct.spec.ts @@ -88,6 +88,67 @@ describe('modules/datasource/go/releases-direct', () => { expect(res).toBeDefined(); }); + it('support gitea', async () => { + getDatasourceSpy.mockResolvedValueOnce({ + datasource: 'gitea-tags', + registryUrl: 'https://gitea.com', + packageName: 'go-chi/cache', + }); + httpMock + .scope('https://gitea.com/') + .get('/api/v1/repos/go-chi/cache/tags') + .reply(200, [ + { + name: 'v0.1.0', + commit: { + sha: 'd73d815ec22c421e7192a414594ac798c73c89e5', + created: '2022-05-15T16:29:42Z', + }, + }, + { + name: 'v0.2.0', + commit: { + sha: '3976707232cb68751ff2ddf42547ff95c6878a97', + created: '2022-05-15T17:23:28Z', + }, + }, + { + name: 'v0.2.1', + commit: { + sha: '2963b104773ead7ed28c00181c03318885d909dc', + created: '2024-09-06T23:44:34Z', + }, + }, + ]); + const res = await datasource.getReleases({ + packageName: 'gitea.com/go-chi/cache', + }); + expect(res).toEqual({ + registryUrl: 'https://gitea.com', + releases: [ + { + gitRef: 'v0.1.0', + newDigest: 'd73d815ec22c421e7192a414594ac798c73c89e5', + releaseTimestamp: '2022-05-15T16:29:42Z', + version: 'v0.1.0', + }, + { + gitRef: 'v0.2.0', + newDigest: '3976707232cb68751ff2ddf42547ff95c6878a97', + releaseTimestamp: '2022-05-15T17:23:28Z', + version: 'v0.2.0', + }, + { + gitRef: 'v0.2.1', + newDigest: '2963b104773ead7ed28c00181c03318885d909dc', + releaseTimestamp: '2024-09-06T23:44:34Z', + version: 'v0.2.1', + }, + ], + sourceUrl: null, + }); + }); + it('support git', async () => { getDatasourceSpy.mockResolvedValueOnce({ datasource: 'git-tags', diff --git a/lib/modules/datasource/go/releases-direct.ts b/lib/modules/datasource/go/releases-direct.ts index 2376f73eb8453a..16c74487560bfe 100644 --- a/lib/modules/datasource/go/releases-direct.ts +++ b/lib/modules/datasource/go/releases-direct.ts @@ -4,6 +4,7 @@ import { regEx } from '../../../util/regex'; import { BitbucketTagsDatasource } from '../bitbucket-tags'; import { Datasource } from '../datasource'; import { GitTagsDatasource } from '../git-tags'; +import { GiteaTagsDatasource } from '../gitea-tags'; import { GithubTagsDatasource } from '../github-tags'; import { GitlabTagsDatasource } from '../gitlab-tags'; import type { GetReleasesConfig, Release, ReleaseResult } from '../types'; @@ -60,6 +61,7 @@ export class GoDirectDatasource extends Datasource { static readonly id = 'go-direct'; git: GitTagsDatasource; + readonly gitea = new GiteaTagsDatasource(); github: GithubTagsDatasource; gitlab: GitlabTagsDatasource; bitbucket: BitbucketTagsDatasource; @@ -108,6 +110,10 @@ export class GoDirectDatasource extends Datasource { res = await this.git.getReleases(source); break; } + case GiteaTagsDatasource.id: { + res = await this.gitea.getReleases(source); + break; + } case GithubTagsDatasource.id: { res = await this.github.getReleases(source); break; diff --git a/lib/modules/datasource/maven/__fixtures__/index.html b/lib/modules/datasource/maven/__fixtures__/index.html deleted file mode 100644 index 203b42c782996a..00000000000000 --- a/lib/modules/datasource/maven/__fixtures__/index.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - Central Repository: org/example/package - - - - -
-

org/example/package

-
-
-
-
-../
-0.0.1/                                                           -         -
-1.0.0/                                            2021-02-22 14:43         -
-1.0.1/                                            2021-04-12 15:51         -
-1.0.2/                                            2021-06-16 12:47         -
-2.0.0/                                            2021-06-18 16:24         -
-maven-metadata-local.xml                          2021-10-18 11:04       304
-maven-metadata-local.xml.md5                      2021-10-18 11:04        33
-maven-metadata-local.xml.sha1                     2021-10-18 11:04        41
-maven-metadata.xml                                2021-10-18 11:04      3982
-maven-metadata.xml.md5                            2021-10-18 11:04        32
-maven-metadata.xml.sha1                           2021-10-18 11:04        40
-maven-metadata.xml.sha256                         2021-10-18 11:04        64
-maven-metadata.xml.sha512                         2021-10-18 11:04       128
-		
-
-
- - - diff --git a/lib/modules/datasource/maven/index.spec.ts b/lib/modules/datasource/maven/index.spec.ts index eec203b2520c78..4a87d5323f416e 100644 --- a/lib/modules/datasource/maven/index.spec.ts +++ b/lib/modules/datasource/maven/index.spec.ts @@ -38,7 +38,6 @@ interface MockOpts { pom?: string | null; latest?: string; snapshots?: SnapshotOpts[] | null; - html?: string | null; } function mockGenericPackage(opts: MockOpts = {}) { @@ -46,7 +45,6 @@ function mockGenericPackage(opts: MockOpts = {}) { dep = 'org.example:package', base = baseUrl, latest = '2.0.0', - html, snapshots, } = opts; const meta = @@ -62,12 +60,6 @@ function mockGenericPackage(opts: MockOpts = {}) { scope.get(`/${packagePath}/maven-metadata.xml`).reply(200, meta); } - if (html) { - scope.get(`/${packagePath}/`).reply(200, html); - } else if (html === null) { - scope.get(`/${packagePath}/`).reply(404); - } - if (pom) { if (latest.endsWith('-SNAPSHOT')) { const [major, minor, patch] = latest @@ -129,8 +121,6 @@ describe('modules/datasource/maven/index', () => { it('returns null when metadata is not found', async () => { httpMock .scope(baseUrl) - .get('/org/example/package/') - .reply(404) .get('/org/example/package/maven-metadata.xml') .reply(404); @@ -140,7 +130,7 @@ describe('modules/datasource/maven/index', () => { }); it('returns releases', async () => { - mockGenericPackage({ html: null }); + mockGenericPackage(); const res = await get(); @@ -151,7 +141,6 @@ describe('modules/datasource/maven/index', () => { const meta = Fixtures.get('metadata-snapshot-version.xml'); mockGenericPackage({ meta: Fixtures.get('metadata-snapshot-only.xml'), - html: null, latest: '1.0.3-SNAPSHOT', snapshots: [ { @@ -184,7 +173,6 @@ describe('modules/datasource/maven/index', () => { mockGenericPackage({ meta: Fixtures.get('metadata-snapshot-only.xml'), pom: null, - html: null, latest: '1.0.3-SNAPSHOT', snapshots: [ { @@ -206,32 +194,6 @@ describe('modules/datasource/maven/index', () => { }); }); - it('returns html-based releases', async () => { - mockGenericPackage({ - latest: '2.0.0', - html: Fixtures.get('index.html'), - meta: Fixtures.get('index.xml'), - snapshots: null, - }); - - const res = await get(); - - expect(res).toEqual({ - display: 'org.example:package', - group: 'org.example', - homepage: 'https://package.example.org/about', - name: 'package', - packageScope: 'org.example', - registryUrl: 'https://repo.maven.apache.org/maven2', - releases: [ - { version: '1.0.0', releaseTimestamp: '2021-02-22T14:43:00.000Z' }, - { version: '1.0.1', releaseTimestamp: '2021-04-12T15:51:00.000Z' }, - { version: '1.0.2', releaseTimestamp: '2021-06-16T12:47:00.000Z' }, - { version: '2.0.0', releaseTimestamp: '2021-06-18T16:24:00.000Z' }, - ], - }); - }); - it('returns releases from custom repository', async () => { mockGenericPackage({ base: baseUrlCustom }); @@ -241,7 +203,7 @@ describe('modules/datasource/maven/index', () => { }); it('falls back to next registry url', async () => { - mockGenericPackage({ html: null }); + mockGenericPackage(); httpMock .scope('https://failed_repo') .get('/org/example/package/maven-metadata.xml') @@ -294,7 +256,7 @@ describe('modules/datasource/maven/index', () => { }); it('skips registry with invalid metadata structure', async () => { - mockGenericPackage({ html: null }); + mockGenericPackage(); httpMock .scope('https://invalid_metadata_repo') .get('/org/example/package/maven-metadata.xml') @@ -310,7 +272,7 @@ describe('modules/datasource/maven/index', () => { }); it('skips registry with invalid XML', async () => { - mockGenericPackage({ html: null }); + mockGenericPackage(); httpMock .scope('https://invalid_metadata_repo') .get('/org/example/package/maven-metadata.xml') @@ -326,9 +288,9 @@ describe('modules/datasource/maven/index', () => { }); it('handles optional slash at the end of registry url', async () => { - mockGenericPackage({ html: null }); + mockGenericPackage(); const resA = await get('org.example:package', baseUrl.replace(/\/+$/, '')); - mockGenericPackage({ html: null }); + mockGenericPackage(); const resB = await get('org.example:package', baseUrl.replace(/\/*$/, '/')); expect(resA).not.toBeNull(); expect(resB).not.toBeNull(); @@ -346,7 +308,7 @@ describe('modules/datasource/maven/index', () => { it('supports scm.url values prefixed with "scm:"', async () => { const pom = Fixtures.get('pom.scm-prefix.xml'); - mockGenericPackage({ pom, html: null }); + mockGenericPackage({ pom }); const res = await get(); @@ -504,7 +466,6 @@ describe('modules/datasource/maven/index', () => { meta: Fixtures.get('child-no-info/meta.xml'), pom: Fixtures.get('child-no-info/pom.xml'), latest: '2.0.0', - html: null, }); mockGenericPackage(parentPackage); @@ -521,7 +482,6 @@ describe('modules/datasource/maven/index', () => { meta: Fixtures.get('child-empty/meta.xml'), pom: Fixtures.get('child-empty/pom.xml'), latest: '2.0.0', - html: null, }); const res = await get(); @@ -556,7 +516,6 @@ describe('modules/datasource/maven/index', () => { mockGenericPackage({ ...childPomMock, meta: childMeta, - html: null, }); mockGenericPackage(parentPomMock); mockGenericPackage(childPomMock); @@ -576,7 +535,6 @@ describe('modules/datasource/maven/index', () => { meta: Fixtures.get('child-scm/meta.xml'), pom: Fixtures.get('child-scm/pom.xml'), latest: '2.0.0', - html: null, }); mockGenericPackage(parentPackage); @@ -593,7 +551,6 @@ describe('modules/datasource/maven/index', () => { meta: Fixtures.get('child-url/meta.xml'), pom: Fixtures.get('child-url/pom.xml'), latest: '2.0.0', - html: null, }); mockGenericPackage(parentPackage); @@ -610,7 +567,6 @@ describe('modules/datasource/maven/index', () => { meta: Fixtures.get('child-all-info/meta.xml'), pom: Fixtures.get('child-all-info/pom.xml'), latest: '2.0.0', - html: null, }); const res = await get(); @@ -626,7 +582,6 @@ describe('modules/datasource/maven/index', () => { meta: Fixtures.get('child-scm-gitatcolon/meta.xml'), pom: Fixtures.get('child-scm-gitatcolon/pom.xml'), latest: '2.0.0', - html: null, }); const res = await get(); @@ -641,7 +596,6 @@ describe('modules/datasource/maven/index', () => { meta: Fixtures.get('child-scm-gitatslash/meta.xml'), pom: Fixtures.get('child-scm-gitatslash/pom.xml'), latest: '2.0.0', - html: null, }); const res = await get(); @@ -656,7 +610,6 @@ describe('modules/datasource/maven/index', () => { meta: Fixtures.get('child-scm-gitprotocol/meta.xml'), pom: Fixtures.get('child-scm-gitprotocol/pom.xml'), latest: '2.0.0', - html: null, }); const res = await get(); @@ -711,6 +664,21 @@ describe('modules/datasource/maven/index', () => { expect(res).toBe(releaseOrig); }); + it('returns original value for 200 response with versionOrig', async () => { + httpMock + .scope(MAVEN_REPO) + .head('/foo/bar/1.2.3/bar-1.2.3.pom') + .reply(200); + const releaseOrig: Release = { version: '1.2', versionOrig: '1.2.3' }; + + const res = await postprocessRelease( + { datasource, packageName: 'foo:bar', registryUrl: MAVEN_REPO }, + releaseOrig, + ); + + expect(res).toBe(releaseOrig); + }); + it('returns original value for invalid configs', async () => { const releaseOrig: Release = { version: '1.2.3' }; expect( diff --git a/lib/modules/datasource/maven/index.ts b/lib/modules/datasource/maven/index.ts index 32bed54f21ac5b..f16ac2e6da3857 100644 --- a/lib/modules/datasource/maven/index.ts +++ b/lib/modules/datasource/maven/index.ts @@ -1,11 +1,9 @@ import is from '@sindresorhus/is'; -import { DateTime } from 'luxon'; import type { XmlDocument } from 'xmldoc'; import { GlobalConfig } from '../../../config/global'; import { logger } from '../../../logger'; import * as packageCache from '../../../util/cache/package'; import { cache } from '../../../util/cache/package/decorator'; -import { newlineRegex, regEx } from '../../../util/regex'; import { ensureTrailingSlash } from '../../../util/url'; import mavenVersion from '../../versioning/maven'; import * as mavenVersioning from '../../versioning/maven'; @@ -24,7 +22,6 @@ import type { MavenDependency, ReleaseMap } from './types'; import { checkResource, createUrlForDependencyPom, - downloadHttpProtocol, downloadMavenXml, getDependencyInfo, getDependencyParts, @@ -55,11 +52,6 @@ function extractVersions(metadata: XmlDocument): string[] { return elements.map((el) => el.val); } -const mavenCentralHtmlVersionRegex = regEx( - '^(?:[^"]+)/\\s+(?\\d\\d\\d\\d-\\d\\d-\\d\\d \\d\\d:\\d\\d)\\s+-$', - 'i', -); - export const defaultRegistryUrls = [MAVEN_REPO]; export class MavenDatasource extends Datasource { @@ -124,72 +116,9 @@ export class MavenDatasource extends Datasource { return releaseMap; } - async addReleasesFromIndexPage( - inputReleaseMap: ReleaseMap, - dependency: MavenDependency, - repoUrl: string, - ): Promise { - if (!repoUrl.startsWith(MAVEN_REPO)) { - return inputReleaseMap; - } - - const cacheNs = 'datasource-maven:index-html-releases'; - const cacheKey = `${repoUrl}${dependency.dependencyUrl}`; - let workingReleaseMap = await packageCache.get( - cacheNs, - cacheKey, - ); - if (!workingReleaseMap) { - workingReleaseMap = {}; - let retryEarlier = false; - try { - const indexUrl = getMavenUrl(dependency, repoUrl, ''); - const res = await downloadHttpProtocol(this.http, indexUrl); - if (res) { - for (const line of res.body.split(newlineRegex)) { - const match = line.trim().match(mavenCentralHtmlVersionRegex); - if (match) { - const { version, releaseTimestamp: timestamp } = - match?.groups ?? /* istanbul ignore next: hard to test */ {}; - if (version && timestamp) { - const date = DateTime.fromFormat( - timestamp, - 'yyyy-MM-dd HH:mm', - { - zone: 'UTC', - }, - ); - if (date.isValid) { - const releaseTimestamp = date.toISO(); - workingReleaseMap[version] = { version, releaseTimestamp }; - } - } - } - } - } - } catch (err) /* istanbul ignore next */ { - retryEarlier = true; - logger.debug( - { dependency, err }, - 'Failed to get releases from package index page', - ); - } - const cacheTTL = retryEarlier - ? /* istanbul ignore next: hard to test */ 60 - : 24 * 60; - await packageCache.set(cacheNs, cacheKey, workingReleaseMap, cacheTTL); - } - - const releaseMap = { ...inputReleaseMap }; - for (const version of Object.keys(releaseMap)) { - releaseMap[version] ||= workingReleaseMap[version] ?? null; - } - - return releaseMap; - } - getReleasesFromMap(releaseMap: ReleaseMap): Release[] { const releases = Object.values(releaseMap).filter(is.truthy); + // istanbul ignore if: will be removed if (releases.length) { return releases; } @@ -210,9 +139,7 @@ export class MavenDatasource extends Datasource { logger.debug(`Looking up ${dependency.display} in repository ${repoUrl}`); - let releaseMap = await this.fetchReleasesFromMetadata(dependency, repoUrl); - releaseMap = await this.addReleasesFromIndexPage( - releaseMap, + const releaseMap = await this.fetchReleasesFromMetadata( dependency, repoUrl, ); @@ -252,8 +179,9 @@ export class MavenDatasource extends Datasource { namespace: `datasource-maven`, key: ( { registryUrl, packageName }: PostprocessReleaseConfig, - { version }: Release, - ) => `postprocessRelease:${registryUrl}:${packageName}:${version}`, + { version, versionOrig }: Release, + ) => + `postprocessRelease:${registryUrl}:${packageName}:${versionOrig ? `${versionOrig}:${version}` : `${version}`}`, ttlMinutes: 24 * 60, }) override async postprocessRelease( @@ -268,7 +196,7 @@ export class MavenDatasource extends Datasource { const pomUrl = await createUrlForDependencyPom( this.http, - release.version, + release.versionOrig ?? release.version, dependency, registryUrl, ); diff --git a/lib/modules/datasource/maven/util.spec.ts b/lib/modules/datasource/maven/util.spec.ts index fb94fa28ea7cae..fc42f24610b2b7 100644 --- a/lib/modules/datasource/maven/util.spec.ts +++ b/lib/modules/datasource/maven/util.spec.ts @@ -1,8 +1,7 @@ import type Request from 'got/dist/source/core'; import { partial } from '../../../../test/util'; import { HOST_DISABLED } from '../../../constants/error-messages'; -import { type Http, HttpError } from '../../../util/http'; -import { parseUrl } from '../../../util/url'; +import { Http, HttpError } from '../../../util/http'; import { checkResource, downloadHttpProtocol, @@ -10,6 +9,8 @@ import { downloadS3Protocol, } from './util'; +const http = new Http('test'); + function httpError({ name, message = 'unknown error', @@ -46,16 +47,8 @@ describe('modules/datasource/maven/util', () => { describe('downloadMavenXml', () => { it('returns empty object for unsupported protocols', async () => { const res = await downloadMavenXml( - null as never, // #22198 - parseUrl('unsupported://server.com/'), - ); - expect(res).toEqual({}); - }); - - it('returns empty object for invalid URLs', async () => { - const res = await downloadMavenXml( - null as never, // #22198 - null, + http, + new URL('unsupported://server.com/'), ); expect(res).toEqual({}); }); @@ -63,8 +56,7 @@ describe('modules/datasource/maven/util', () => { describe('downloadS3Protocol', () => { it('returns null for non-S3 URLs', async () => { - // #22198 - const res = await downloadS3Protocol(parseUrl('http://not-s3.com/')!); + const res = await downloadS3Protocol(new URL('http://not-s3.com/')); expect(res).toBeNull(); }); }); @@ -114,18 +106,12 @@ describe('modules/datasource/maven/util', () => { describe('checkResource', () => { it('returns not found for unsupported protocols', async () => { - const res = await checkResource( - null as never, // #22198 - 'unsupported://server.com/', - ); + const res = await checkResource(http, 'unsupported://server.com/'); expect(res).toBe('not-found'); }); it('returns error for invalid URLs', async () => { - const res = await checkResource( - null as never, // #22198 - 'not-a-valid-url', - ); + const res = await checkResource(http, 'not-a-valid-url'); expect(res).toBe('error'); }); }); diff --git a/lib/modules/datasource/maven/util.ts b/lib/modules/datasource/maven/util.ts index b521b99d53ab1d..d68d35757bdf01 100644 --- a/lib/modules/datasource/maven/util.ts +++ b/lib/modules/datasource/maven/util.ts @@ -307,12 +307,8 @@ export function getMavenUrl( export async function downloadMavenXml( http: Http, - pkgUrl: URL | null, + pkgUrl: URL, ): Promise { - if (!pkgUrl) { - return {}; - } - const protocol = pkgUrl.protocol; if (protocol === 'http:' || protocol === 'https:') { diff --git a/lib/modules/datasource/postprocess-release.spec.ts b/lib/modules/datasource/postprocess-release.spec.ts index a8cacb3d92378e..3ec6de9abd8e99 100644 --- a/lib/modules/datasource/postprocess-release.spec.ts +++ b/lib/modules/datasource/postprocess-release.spec.ts @@ -124,31 +124,6 @@ describe('modules/datasource/postprocess-release', () => { expect(release).toBeNull(); }); - it('preserves rejected release when `extractVersion` was set', async () => { - const releaseOrig: Release = { version: '1.2.3' }; - - class SomeDatasource extends DummyDatasource { - override postprocessRelease( - _config: PostprocessReleaseConfig, - _release: Release, - ): Promise { - return Promise.resolve('reject'); - } - } - getDatasourceFor.mockReturnValueOnce(new SomeDatasource()); - - const release = await postprocessRelease( - { - datasource: 'some-datasource', - packageName: 'some-package', - extractVersion: '^(?\\d+)$', - }, - releaseOrig, - ); - - expect(release).toBe(releaseOrig); - }); - it('falls back when error was thrown', async () => { const releaseOrig: Release = { version: '1.2.3' }; diff --git a/lib/modules/datasource/postprocess-release.ts b/lib/modules/datasource/postprocess-release.ts index b2ba55624557d8..a71837fee471db 100644 --- a/lib/modules/datasource/postprocess-release.ts +++ b/lib/modules/datasource/postprocess-release.ts @@ -49,22 +49,14 @@ export async function postprocessRelease( ); if (result === 'reject') { - if (config.extractVersion) { - logger.debug( - { - datasource, - packageName, - registryUrl, - version: release.version, - extractVersion: config.extractVersion, - }, - 'Rejected release combined with `extractVersion`: preserving the release', - ); - return release; - } - logger.debug( - { datasource, packageName, registryUrl, version: release.version }, + { + datasource, + packageName, + registryUrl, + version: release.version, + versionOrig: release.versionOrig, + }, 'Rejected release', ); return null; diff --git a/lib/modules/datasource/pypi/__snapshots__/index.spec.ts.snap b/lib/modules/datasource/pypi/__snapshots__/index.spec.ts.snap index 1af50f1d6d055b..1704b163844bff 100644 --- a/lib/modules/datasource/pypi/__snapshots__/index.spec.ts.snap +++ b/lib/modules/datasource/pypi/__snapshots__/index.spec.ts.snap @@ -1,47 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`modules/datasource/pypi/index getReleases fall back from json and process data from simple endpoint 1`] = ` -{ - "registryUrl": "https://custom.pypi.net/foo", - "releases": [ - { - "version": "0.1.2", - }, - { - "version": "0.1.3", - }, - { - "version": "0.1.4", - }, - { - "version": "0.2.0", - }, - { - "version": "0.2.1", - }, - { - "version": "0.2.2", - }, - { - "version": "0.3.0", - }, - { - "version": "0.4.0", - }, - { - "version": "0.4.1", - }, - { - "version": "0.4.2", - }, - { - "isDeprecated": true, - "version": "0.5.0", - }, - ], -} -`; - exports[`modules/datasource/pypi/index getReleases parses data-requires-python and respects constraints from simple endpoint 1`] = ` { "registryUrl": "https://some.registry.org/simple", diff --git a/lib/modules/datasource/pypi/index.spec.ts b/lib/modules/datasource/pypi/index.spec.ts index 678101cfa03c30..295a78c241b4ae 100644 --- a/lib/modules/datasource/pypi/index.spec.ts +++ b/lib/modules/datasource/pypi/index.spec.ts @@ -160,6 +160,10 @@ describe('modules/datasource/pypi/index', () => { .scope('https://custom.pypi.net/foo') .get('/azure-cli-monitor/json') .replyWithError('error'); + httpMock + .scope('https://custom.pypi.net/foo') + .get('/azure-cli-monitor/') + .replyWithError('error'); httpMock .scope('https://second-index/foo') .get('/azure-cli-monitor/json') @@ -308,6 +312,11 @@ describe('modules/datasource/pypi/index', () => { .get('/not-normalized-package/json') .reply(200, htmlResponse); + httpMock + .scope(baseUrl) + .get('/not-normalized-package/') + .reply(200, htmlResponse); + await getPkgReleases({ datasource, registryUrls: [baseUrl], @@ -716,25 +725,28 @@ describe('modules/datasource/pypi/index', () => { ).toBeNull(); }); - it('fall back from json and process data from simple endpoint', async () => { - httpMock - .scope('https://custom.pypi.net/foo') - .get('/dj-database-url/json') - .reply(404); - httpMock - .scope('https://custom.pypi.net/foo') - .get('/dj-database-url/') - .reply(200, htmlResponse); - const config = { - registryUrls: ['https://custom.pypi.net/foo'], - }; - const result = await getPkgReleases({ - datasource, - ...config, - packageName: 'dj-database-url', - }); - expect(result).toMatchSnapshot(); - }); + it.each([404, 403])( + 'fall back from json and process data from simple endpoint', + async (code: number) => { + httpMock + .scope('https://custom.pypi.net/foo') + .get('/dj-database-url/json') + .reply(code); + httpMock + .scope('https://custom.pypi.net/foo') + .get('/dj-database-url/') + .reply(200, htmlResponse); + const config = { + registryUrls: ['https://custom.pypi.net/foo'], + }; + const result = await getPkgReleases({ + datasource, + ...config, + packageName: 'dj-database-url', + }); + expect(result).not.toBeNull(); + }, + ); it('parses data-requires-python and respects constraints from simple endpoint', async () => { httpMock diff --git a/lib/modules/datasource/pypi/index.ts b/lib/modules/datasource/pypi/index.ts index dc8a5437dc259e..3e8812116e0555 100644 --- a/lib/modules/datasource/pypi/index.ts +++ b/lib/modules/datasource/pypi/index.ts @@ -66,13 +66,9 @@ export class PypiDatasource extends Datasource { // we need to resolve early here so we can catch any 404s and fallback to a simple lookup dependency = await this.getDependency(normalizedLookupName, hostUrl); } catch (err) { - if (err.statusCode !== 404) { - throw err; - } - // error contacting json-style api -- attempt to fallback to a simple-style api logger.trace( - { packageName, hostUrl }, + { packageName, hostUrl, err }, 'Looking up pypi simple dependency via fallback', ); dependency = await this.getSimpleDependency( diff --git a/lib/modules/datasource/pypi/readme.md b/lib/modules/datasource/pypi/readme.md new file mode 100644 index 00000000000000..ae32c3ca683ef4 --- /dev/null +++ b/lib/modules/datasource/pypi/readme.md @@ -0,0 +1,6 @@ +This datasource uses the following logic to determine lookup URLs: + +- If the normalized registryUrl ends in `/simple/` or `/+simple/` then only the simple API will be tried +- Otherwise, the JSON API will be tried first +- If the JSON API returns a result, it will be used +- If the JSON API throws an error (e.g. 403, 404) then the simple API will be tried diff --git a/lib/modules/datasource/sbt-package/index.spec.ts b/lib/modules/datasource/sbt-package/index.spec.ts index 19423659d8e4c4..aa86cc3d12b0a5 100644 --- a/lib/modules/datasource/sbt-package/index.spec.ts +++ b/lib/modules/datasource/sbt-package/index.spec.ts @@ -70,8 +70,6 @@ describe('modules/datasource/sbt-package/index', () => { ??? `, ) - .get('/maven2/com/example/empty/') - .reply(200, '') .get('/maven2/com/example/empty_but_invalid/') .reply(404, '') .get('/maven2/com/example/empty/maven-metadata.xml') diff --git a/lib/modules/datasource/types.ts b/lib/modules/datasource/types.ts index d4e8ed0b3287e2..aea32290d9fbce 100644 --- a/lib/modules/datasource/types.ts +++ b/lib/modules/datasource/types.ts @@ -61,6 +61,8 @@ export interface Release { isStable?: boolean; releaseTimestamp?: string | null; version: string; + /** The original value to which `extractVersion` was applied */ + versionOrig?: string; newDigest?: string | undefined; constraints?: Record; dependencies?: Record; @@ -69,6 +71,7 @@ export interface Release { sourceUrl?: string | undefined; sourceDirectory?: string; currentAge?: string; + isLatest?: boolean; } export interface ReleaseResult { diff --git a/lib/modules/datasource/util.ts b/lib/modules/datasource/util.ts index abd252282ab05c..b418bb9bb7c560 100644 --- a/lib/modules/datasource/util.ts +++ b/lib/modules/datasource/util.ts @@ -12,7 +12,7 @@ export function isArtifactoryServer( return is.string(res?.headers[JFROG_ARTIFACTORY_RES_HEADER]); } -export async function getGoogleAuthToken(): Promise { +export async function getGoogleAuthTokenRaw(): Promise { try { const googleAuth: GoogleAuth = new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/cloud-platform', @@ -21,7 +21,7 @@ export async function getGoogleAuthToken(): Promise { if (accessToken) { // sanitize token addSecretForSanitizing(accessToken); - return Buffer.from(`oauth2accesstoken:${accessToken}`).toString('base64'); + return accessToken; } else { logger.warn( 'Could not retrieve access token using google-auth-library getAccessToken', @@ -36,3 +36,11 @@ export async function getGoogleAuthToken(): Promise { } return null; } + +export async function getGoogleAuthToken(): Promise { + const accessToken = await getGoogleAuthTokenRaw(); + if (accessToken) { + return Buffer.from(`oauth2accesstoken:${accessToken}`).toString('base64'); + } + return null; +} diff --git a/lib/modules/manager/api.ts b/lib/modules/manager/api.ts index 466ce2f0f61764..e8522f73326a9e 100644 --- a/lib/modules/manager/api.ts +++ b/lib/modules/manager/api.ts @@ -12,6 +12,7 @@ import * as bicep from './bicep'; import * as bitbucketPipelines from './bitbucket-pipelines'; import * as bitrise from './bitrise'; import * as buildkite from './buildkite'; +import * as buildpacks from './buildpacks'; import * as bun from './bun'; import * as bunVersion from './bun-version'; import * as bundler from './bundler'; @@ -117,6 +118,7 @@ api.set('bicep', bicep); api.set('bitbucket-pipelines', bitbucketPipelines); api.set('bitrise', bitrise); api.set('buildkite', buildkite); +api.set('buildpacks', buildpacks); api.set('bun', bun); api.set('bun-version', bunVersion); api.set('bundler', bundler); diff --git a/lib/modules/manager/asdf/extract.spec.ts b/lib/modules/manager/asdf/extract.spec.ts index 576f46582493c6..2865ecaeece099 100644 --- a/lib/modules/manager/asdf/extract.spec.ts +++ b/lib/modules/manager/asdf/extract.spec.ts @@ -49,6 +49,7 @@ actionlint 0.7.0 adr-tools 3.0.0 argocd 2.5.4 asdf-plugin-manager 1.1.1 +atmos 1.100.0 awscli 2.8.6 bun 0.2.2 cargo-make 0.36.2 @@ -73,7 +74,7 @@ github-cli 2.32.1 gitleaks 8.21.1 gleam 1.3.1 gohugo extended_0.104.3 -golang 1.19.2 +golang 1.23.3 golangci-lint 1.52.2 gomplate 3.11.7 hadolint 2.12.0 @@ -85,6 +86,7 @@ idris 1.3.4 java adoptopenjdk-16.0.0+36 julia 1.8.2 just 1.7.0 +k3s 1.31.2+k3s1 kind 0.19.0 kotlin 1.7.20 kubectl 1.26.3 @@ -97,12 +99,15 @@ minikube 1.33.1 nim 1.6.8 nodejs 18.12.0 ocaml 4.14.0 +oci 3.50.0 opentofu 1.6.0 +packer 1.11.2 perl 5.37.5 php 8.1.12 pnpm 7.26.2 poetry 1.3.2 pre-commit 3.3.1 +protoc 28.3 pulumi 3.57.1 python 3.11.0 rebar 3.23.0 @@ -167,6 +172,13 @@ dummy 1.2.3 depName: 'asdf-plugin-manager', extractVersion: '^v(?\\S+)', }, + { + currentValue: '1.100.0', + datasource: 'github-releases', + packageName: 'cloudposse/atmos', + depName: 'atmos', + extractVersion: '^v(?\\S+)', + }, { currentValue: '2.8.6', datasource: 'github-tags', @@ -325,7 +337,7 @@ dummy 1.2.3 extractVersion: '^v(?\\S+)', }, { - currentValue: '1.19.2', + currentValue: '1.23.3', datasource: 'github-tags', packageName: 'golang/go', depName: 'golang', @@ -406,6 +418,13 @@ dummy 1.2.3 packageName: 'casey/just', depName: 'just', }, + { + currentValue: '1.31.2+k3s1', + datasource: 'github-releases', + packageName: 'k3s-io/k3s', + depName: 'k3s', + extractVersion: '^v(?\\S+)', + }, { currentValue: '0.19.0', datasource: 'github-releases', @@ -486,6 +505,13 @@ dummy 1.2.3 packageName: 'ocaml/ocaml', depName: 'ocaml', }, + { + currentValue: '3.50.0', + datasource: 'github-releases', + packageName: 'oracle/oci-cli', + depName: 'oci', + extractVersion: '^v(?\\S+)', + }, { currentValue: '1.6.0', datasource: 'github-releases', @@ -493,6 +519,13 @@ dummy 1.2.3 depName: 'opentofu', extractVersion: '^v(?\\S+)', }, + { + currentValue: '1.11.2', + datasource: 'github-releases', + packageName: 'hashicorp/packer', + depName: 'packer', + extractVersion: '^v(?\\S+)', + }, { currentValue: '5.37.5', datasource: 'github-tags', @@ -527,6 +560,13 @@ dummy 1.2.3 depName: 'pre-commit', extractVersion: '^v(?.+)', }, + { + currentValue: '28.3', + datasource: 'github-releases', + packageName: 'protocolbuffers/protobuf', + depName: 'protoc', + extractVersion: '^v(?\\S+)', + }, { currentValue: '3.57.1', datasource: 'github-releases', @@ -786,32 +826,6 @@ awscli 2.8.6 }, ], }); - const semeruJdkRes = extractPackageFile( - 'java semeru-openj9-17.0.8.1+1_openj9-0.40.0', - ); - expect(semeruJdkRes).toEqual({ - deps: [ - { - currentValue: '17.0.8.1+1', - datasource: 'java-version', - depName: 'java', - packageName: 'java-jdk', - }, - ], - }); - const semeruJreRes = extractPackageFile( - 'java semeru-jre-openj9-17.0.8.1+1_openj9-0.40.0', - ); - expect(semeruJreRes).toEqual({ - deps: [ - { - currentValue: '17.0.8.1+1', - datasource: 'java-version', - depName: 'java', - packageName: 'java-jre', - }, - ], - }); const temurinJdkRes = extractPackageFile('java temurin-16.0.0+36'); expect(temurinJdkRes).toEqual({ deps: [ diff --git a/lib/modules/manager/asdf/upgradeable-tooling.ts b/lib/modules/manager/asdf/upgradeable-tooling.ts index 10ede4ce9b0e07..9c6559c8620795 100644 --- a/lib/modules/manager/asdf/upgradeable-tooling.ts +++ b/lib/modules/manager/asdf/upgradeable-tooling.ts @@ -79,6 +79,14 @@ export const upgradeableTooling: Record = { extractVersion: '^v(?\\S+)', }, }, + atmos: { + asdfPluginUrl: 'https://github.com/cloudposse/asdf-atmos', + config: { + datasource: GithubReleasesDatasource.id, + packageName: 'cloudposse/atmos', + extractVersion: '^v(?\\S+)', + }, + }, awscli: { asdfPluginUrl: 'https://github.com/MetricMike/asdf-awscli', config: { @@ -357,26 +365,6 @@ export const upgradeableTooling: Record = { currentValue: adoptOpenJreMatches.version, }; } - const semeruJdkMatches = version.match( - /^semeru-openj9-(?\d\S+)_openj9-(?\d\S+)/, - )?.groups; - if (semeruJdkMatches) { - return { - datasource: JavaVersionDatasource.id, - packageName: 'java-jdk', - currentValue: semeruJdkMatches.version, - }; - } - const semeruJreMatches = version.match( - /^semeru-jre-openj9-(?\d\S+)_openj9-\d\S+/, - )?.groups; - if (semeruJreMatches) { - return { - datasource: JavaVersionDatasource.id, - packageName: 'java-jre', - currentValue: semeruJreMatches.version, - }; - } const temurinJdkMatches = version.match( /^temurin-(?\d\S+)/, )?.groups; @@ -416,6 +404,14 @@ export const upgradeableTooling: Record = { packageName: 'casey/just', }, }, + k3s: { + asdfPluginUrl: 'https://github.com/dmpe/asdf-k3s', + config: { + datasource: GithubReleasesDatasource.id, + packageName: 'k3s-io/k3s', + extractVersion: '^v(?\\S+)', + }, + }, kind: { asdfPluginUrl: 'https://github.com/johnlayton/asdf-kind', config: { @@ -510,6 +506,14 @@ export const upgradeableTooling: Record = { packageName: 'ocaml/ocaml', }, }, + oci: { + asdfPluginUrl: 'https://github.com/yasn77/asdf-oci', + config: { + datasource: GithubReleasesDatasource.id, + packageName: 'oracle/oci-cli', + extractVersion: '^v(?\\S+)', + }, + }, opentofu: { asdfPluginUrl: 'https://github.com/virtualroot/asdf-opentofu', config: { @@ -518,6 +522,14 @@ export const upgradeableTooling: Record = { extractVersion: '^v(?\\S+)', }, }, + packer: { + asdfPluginUrl: 'https://github.com/asdf-community/asdf-hashicorp', + config: { + datasource: GithubReleasesDatasource.id, + packageName: 'hashicorp/packer', + extractVersion: '^v(?\\S+)', + }, + }, perl: { asdfPluginUrl: 'https://github.com/ouest/asdf-perl', config: { @@ -557,6 +569,14 @@ export const upgradeableTooling: Record = { extractVersion: '^v(?.+)', }, }, + protoc: { + asdfPluginUrl: 'https://github.com/paxosglobal/asdf-protoc.git', + config: { + datasource: GithubReleasesDatasource.id, + packageName: 'protocolbuffers/protobuf', + extractVersion: '^v(?\\S+)', + }, + }, pulumi: { asdfPluginUrl: 'https://github.com/canha/asdf-pulumi.git', config: { diff --git a/lib/modules/manager/azure-pipelines/readme.md b/lib/modules/manager/azure-pipelines/readme.md index 3aed6a6465ccd6..a7ca5ab559722c 100644 --- a/lib/modules/manager/azure-pipelines/readme.md +++ b/lib/modules/manager/azure-pipelines/readme.md @@ -44,7 +44,7 @@ resources: - container: linux image: ubuntu:24.04 - container: python - image: python:3.13@sha256:5b5dd1a0950084ef399eae9ec6210b30a7f1b5389c95aa3f64759fba4d2b3a24 + image: python:3.13@sha256:bc78d3c007f86dbb87d711b8b082d9d564b8025487e780d24ccb8581d83ef8b0 stages: - stage: StageOne diff --git a/lib/modules/manager/buildpacks/extract.spec.ts b/lib/modules/manager/buildpacks/extract.spec.ts new file mode 100644 index 00000000000000..dedcefcbd4f68a --- /dev/null +++ b/lib/modules/manager/buildpacks/extract.spec.ts @@ -0,0 +1,111 @@ +import { codeBlock } from 'common-tags'; + +import { extractPackageFile } from '.'; + +describe('modules/manager/buildpacks/extract', () => { + describe('extractPackageFile()', () => { + it('returns null for invalid files', () => { + expect(extractPackageFile('not a project toml', '', {})).toBeNull(); + }); + + it('returns null for empty package.toml', () => { + const res = extractPackageFile( + '[_]\nschema-version = "0.2"', + 'project.toml', + {}, + ); + expect(res).toBeNull(); + }); + + it('extracts builder and buildpack images', () => { + const res = extractPackageFile( + codeBlock` +[_] +schema-version = "0.2" + +[io.buildpacks] +builder = "registry.corp/builder/noble:1.1.1" + +[[io.buildpacks.group]] +uri = "docker://buildpacks/java:2.2.2" + +[[io.buildpacks.group]] +uri = "buildpacks/nodejs:3.3.3" + +[[io.buildpacks.group]] +uri = "example/foo@1.0.0" + +[[io.buildpacks.group]] +uri = "example/registry-cnb" + +[[io.buildpacks.group]] +uri = "urn:cnb:registry:example/foo@1.0.0" + +[[io.buildpacks.group]] +uri = "some-bp@sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + +[[io.buildpacks.group]] +uri = "cnbs/some-bp:some-tag@sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + +[[io.buildpacks.group]] +uri = "from=builder:foobar" + +[[io.buildpacks.group]] +uri = "file://local.oci" + +[[io.buildpacks.group]] +uri = "foo://fake.oci"`, + 'project.toml', + {}, + ); + expect(res?.deps).toEqual([ + { + autoReplaceStringTemplate: + '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + commitMessageTopic: 'builder {{depName}}', + currentValue: '1.1.1', + datasource: 'docker', + depName: 'registry.corp/builder/noble', + replaceString: 'registry.corp/builder/noble:1.1.1', + }, + { + autoReplaceStringTemplate: + '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + currentValue: '2.2.2', + datasource: 'docker', + depName: 'buildpacks/java', + replaceString: 'buildpacks/java:2.2.2', + }, + { + autoReplaceStringTemplate: + '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + currentValue: '3.3.3', + datasource: 'docker', + depName: 'buildpacks/nodejs', + replaceString: 'buildpacks/nodejs:3.3.3', + }, + { + autoReplaceStringTemplate: + '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + currentDigest: + 'sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', + datasource: 'docker', + depName: 'some-bp', + replaceString: + 'some-bp@sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', + }, + { + autoReplaceStringTemplate: + '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + currentDigest: + 'sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', + currentValue: 'some-tag', + datasource: 'docker', + depName: 'cnbs/some-bp', + replaceString: + 'cnbs/some-bp:some-tag@sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', + }, + ]); + }); + }); +}); diff --git a/lib/modules/manager/buildpacks/extract.ts b/lib/modules/manager/buildpacks/extract.ts new file mode 100644 index 00000000000000..c00d4a4c681e19 --- /dev/null +++ b/lib/modules/manager/buildpacks/extract.ts @@ -0,0 +1,103 @@ +import is from '@sindresorhus/is'; +import { logger } from '../../../logger'; +import { regEx } from '../../../util/regex'; +import { getDep } from '../dockerfile/extract'; +import type { + ExtractConfig, + PackageDependency, + PackageFileContent, +} from '../types'; +import { type ProjectDescriptor, ProjectDescriptorToml } from './schema'; + +const dockerPrefix = regEx(/^docker:\/?\//); +const dockerRef = regEx( + /^((?:[a-z\d](?:[a-z\d-]{0,61}[a-z\d])?(?:\.[a-z\d](?:[a-z\d-]{0,61}[a-z\d])?)*)(?::\d{2,5}\/)?)?[a-z\d]+((\.|_|__|-+)[a-z\d]+)*(\/[a-z\d]+((\.|_|__|-+)[a-z\d]+)*)*(?::(\w[\w.-]{0,127})(?:@sha256:[A-Fa-f\d]{32,})?|@sha256:[A-Fa-f\d]{32,})$/, +); + +function isDockerRef(ref: string): boolean { + if (ref.startsWith('docker:/') || dockerRef.test(ref)) { + return true; + } + return false; +} + +function parseProjectToml( + content: string, + packageFile: string, +): ProjectDescriptor | null { + const res = ProjectDescriptorToml.safeParse(content); + if (res.success) { + return res.data; + } + + logger.debug( + { packageFile, err: res.error }, + 'Failed to parse buildpacks project descriptor TOML', + ); + + return null; +} + +export function extractPackageFile( + content: string, + packageFile: string, + config: ExtractConfig, +): PackageFileContent | null { + const deps: PackageDependency[] = []; + + const descriptor = parseProjectToml(content, packageFile); + if (!descriptor) { + return null; + } + + if ( + descriptor.io?.buildpacks?.builder && + isDockerRef(descriptor.io.buildpacks.builder) + ) { + const dep = getDep( + descriptor.io.buildpacks.builder.replace(dockerPrefix, ''), + true, + config.registryAliases, + ); + logger.trace( + { + depName: dep.depName, + currentValue: dep.currentValue, + currentDigest: dep.currentDigest, + }, + 'Cloud Native Buildpacks builder', + ); + + deps.push({ ...dep, commitMessageTopic: 'builder {{depName}}' }); + } + + if ( + descriptor.io?.buildpacks?.group && + is.array(descriptor.io.buildpacks.group) + ) { + for (const group of descriptor.io.buildpacks.group) { + if (group.uri && isDockerRef(group.uri)) { + const dep = getDep( + group.uri.replace(dockerPrefix, ''), + true, + config.registryAliases, + ); + logger.trace( + { + depName: dep.depName, + currentValue: dep.currentValue, + currentDigest: dep.currentDigest, + }, + 'Cloud Native Buildpack', + ); + + deps.push(dep); + } + } + } + + if (!deps.length) { + return null; + } + return { deps }; +} diff --git a/lib/modules/manager/buildpacks/index.ts b/lib/modules/manager/buildpacks/index.ts new file mode 100644 index 00000000000000..53a3dcfeb4c221 --- /dev/null +++ b/lib/modules/manager/buildpacks/index.ts @@ -0,0 +1,12 @@ +import type { Category } from '../../../constants'; +import { DockerDatasource } from '../../datasource/docker'; +export { extractPackageFile } from './extract'; + +export const defaultConfig = { + commitMessageTopic: 'buildpack {{depName}}', + fileMatch: ['(^|/)project\\.toml$'], + pinDigests: false, +}; + +export const categories: Category[] = ['docker']; +export const supportedDatasources = [DockerDatasource.id]; diff --git a/lib/modules/manager/buildpacks/readme.md b/lib/modules/manager/buildpacks/readme.md new file mode 100644 index 00000000000000..d2f7b6c613968a --- /dev/null +++ b/lib/modules/manager/buildpacks/readme.md @@ -0,0 +1,26 @@ +The `buildpacks` manager updates Cloud Native Buildpacks project descriptors in `project.toml` files. +A `project.toml` file can reference builder / buildpack images by URIs. +Renovate can update a `project.toml` file if: + +- It can find the file +- The file follows the [project descriptor specifications](https://github.com/buildpacks/spec/blob/main/extensions/project-descriptor.md) +- The buildpack `uri` is an OCI image reference (references to a local file or buildpack registry are ignored) + +If you use buildpacks in the `io.buildpacks.group` array, then you _must_ configure the Docker reference (`uri`) for Renovate to work. + +```toml title="Example of a project.toml file with Docker reference URIs" +[_] +schema-version = "0.2" + +[io.buildpacks] +builder = "registry.corp/builder/noble:1.1.1" + +[[io.buildpacks.group]] +uri = "docker://buildpacks/java:2.2.2" + +[[io.buildpacks.group]] +uri = "buildpacks/nodejs:3.3.3" + +[[io.buildpacks.group]] +uri = "file://local.oci" # will be ignored +``` diff --git a/lib/modules/manager/buildpacks/schema.ts b/lib/modules/manager/buildpacks/schema.ts new file mode 100644 index 00000000000000..dc90371ca4ce93 --- /dev/null +++ b/lib/modules/manager/buildpacks/schema.ts @@ -0,0 +1,25 @@ +import { z } from 'zod'; +import { Toml } from '../../../util/schema-utils'; + +const BuildpackGroup = z.object({ + uri: z.string().optional(), +}); + +const IoBuildpacks = z.object({ + builder: z.string().optional(), + group: z.array(BuildpackGroup).optional(), +}); + +export const ProjectDescriptor = z.object({ + _: z.object({ + 'schema-version': z.string(), + }), + io: z + .object({ + buildpacks: IoBuildpacks.optional(), + }) + .optional(), +}); + +export type ProjectDescriptor = z.infer; +export const ProjectDescriptorToml = Toml.pipe(ProjectDescriptor); diff --git a/lib/modules/manager/bundler/extract.spec.ts b/lib/modules/manager/bundler/extract.spec.ts index cbee5d033f7c3e..8e58870bed9922 100644 --- a/lib/modules/manager/bundler/extract.spec.ts +++ b/lib/modules/manager/bundler/extract.spec.ts @@ -1,4 +1,5 @@ import is from '@sindresorhus/is'; +import { codeBlock } from 'common-tags'; import { Fixtures } from '../../../../test/fixtures'; import { fs } from '../../../../test/util'; import { isValid } from '../../versioning/ruby'; @@ -141,4 +142,57 @@ describe('modules/manager/bundler/extract', () => { { depName: 'sfn_my_dep2', currentValue: '"~> 1"' }, ]); }); + + it('parses source variable in Gemfile', async () => { + const sourceVariableGemfile = codeBlock` + foo = 'https://gems.foo.com' + bar = 'https://gems.bar.com' + + source foo + + source bar do + gem "some_internal_gem" + end + `; + + fs.readLocalFile.mockResolvedValueOnce(sourceVariableGemfile); + const res = await extractPackageFile(sourceVariableGemfile, 'Gemfile'); + expect(res).toMatchObject({ + registryUrls: ['https://gems.foo.com'], + deps: [ + { + depName: 'some_internal_gem', + registryUrls: ['https://gems.bar.com'], + }, + ], + }); + }); + + it('parses inline source in Gemfile', async () => { + const sourceInlineGemfile = codeBlock` + baz = 'https://gems.baz.com' + gem "inline_source_gem", source: 'https://gems.foo.com' + gem 'inline_source_gem_with_version', "~> 1", source: 'https://gems.bar.com' + gem 'inline_source_gem_with_variable_source', source: baz + `; + fs.readLocalFile.mockResolvedValueOnce(sourceInlineGemfile); + const res = await extractPackageFile(sourceInlineGemfile, 'Gemfile'); + expect(res).toMatchObject({ + deps: [ + { + depName: 'inline_source_gem', + registryUrls: ['https://gems.foo.com'], + }, + { + depName: 'inline_source_gem_with_version', + currentValue: '"~> 1"', + registryUrls: ['https://gems.bar.com'], + }, + { + depName: 'inline_source_gem_with_variable_source', + registryUrls: ['https://gems.baz.com'], + }, + ], + }); + }); }); diff --git a/lib/modules/manager/bundler/extract.ts b/lib/modules/manager/bundler/extract.ts index 54995620a9c487..e84cd65cb36f41 100644 --- a/lib/modules/manager/bundler/extract.ts +++ b/lib/modules/manager/bundler/extract.ts @@ -78,6 +78,9 @@ export async function extractPackageFile( registryUrls: [], deps: [], }; + + const variables: Record = {}; + const lines = content.split(newlineRegex); for (lineNumber = 0; lineNumber < lines.length; lineNumber += 1) { const line = lines[lineNumber]; @@ -85,12 +88,20 @@ export async function extractPackageFile( for (const delimiter of delimiters) { sourceMatch = sourceMatch ?? - regEx(`^source ${delimiter}([^${delimiter}]+)${delimiter}\\s*$`).exec( - line, - ); + regEx( + `^source ((${delimiter}(?[^${delimiter}]+)${delimiter})|(?\\w+))\\s*$`, + ).exec(line); } if (sourceMatch) { - res.registryUrls?.push(sourceMatch[1]); + if (sourceMatch.groups?.registryUrl) { + res.registryUrls?.push(sourceMatch.groups.registryUrl); + } + if (sourceMatch.groups?.sourceName) { + const registryUrl = variables[sourceMatch.groups.sourceName]; + if (registryUrl) { + res.registryUrls?.push(registryUrl); + } + } } const rubyMatch = extractRubyVersion(line); @@ -103,8 +114,18 @@ export async function extractPackageFile( }); } + const variableMatchRegex = regEx( + `^(?\\w+)\\s*=\\s*['"](?[^'"]+)['"]`, + ); + const variableMatch = variableMatchRegex.exec(line); + if (variableMatch) { + if (variableMatch.groups?.key) { + variables[variableMatch.groups?.key] = variableMatch.groups?.value; + } + } + const gemMatchRegex = regEx( - `^\\s*gem\\s+(['"])(?[^'"]+)(['"])(\\s*,\\s*(?(['"])[^'"]+['"](\\s*,\\s*['"][^'"]+['"])?))?`, + `^\\s*gem\\s+(['"])(?[^'"]+)(['"])(\\s*,\\s*(?(['"])[^'"]+['"](\\s*,\\s*['"][^'"]+['"])?))?(\\s*,\\s*source:\\s*(['"](?[^'"]+)['"]|(?[^'"]+)))?`, ); const gemMatch = gemMatchRegex.exec(line); if (gemMatch) { @@ -116,6 +137,14 @@ export async function extractPackageFile( const currentValue = gemMatch.groups.currentValue; dep.currentValue = currentValue; } + if (gemMatch.groups?.registryUrl) { + const registryUrl = gemMatch.groups.registryUrl; + dep.registryUrls = [registryUrl]; + } + if (gemMatch.groups?.sourceName) { + const registryUrl = variables[gemMatch.groups.sourceName]; + dep.registryUrls = [registryUrl]; + } dep.datasource = RubygemsDatasource.id; res.deps.push(dep); } @@ -124,10 +153,18 @@ export async function extractPackageFile( for (const delimiter of delimiters) { const sourceBlockMatch = regEx( - `^source\\s+${delimiter}(.*?)${delimiter}\\s+do`, + `^source\\s+((${delimiter}(?[^${delimiter}]+)${delimiter})|(?\\w+))\\s+do`, ).exec(line); if (sourceBlockMatch) { - const repositoryUrl = sourceBlockMatch[1]; + let repositoryUrl = ''; + if (sourceBlockMatch.groups?.registryUrl) { + repositoryUrl = sourceBlockMatch.groups.registryUrl; + } + if (sourceBlockMatch.groups?.sourceName) { + if (variables[sourceBlockMatch.groups.sourceName]) { + repositoryUrl = variables[sourceBlockMatch.groups.sourceName]; + } + } const sourceLineNumber = lineNumber; let sourceContent = ''; let sourceLine = ''; diff --git a/lib/modules/manager/cargo/extract.spec.ts b/lib/modules/manager/cargo/extract.spec.ts index 6b48dc84378ea5..d379da8257fea8 100644 --- a/lib/modules/manager/cargo/extract.spec.ts +++ b/lib/modules/manager/cargo/extract.spec.ts @@ -635,5 +635,21 @@ replace-with = "mcorbin" const res = await extractPackageFile(cargotoml, 'Cargo.toml', config); expect(res?.packageFileVersion).toBe('0.1.0'); }); + + it('should extract project version from workspace', async () => { + const cargotoml = codeBlock` + [package] + name = "test" + version.workspace = true + edition = "2021" + [workspace.package] + version = "0.1.0" + [dependencies] + syn = "2.0" + `; + + const res = await extractPackageFile(cargotoml, 'Cargo.toml', config); + expect(res?.packageFileVersion).toBe('0.1.0'); + }); }); }); diff --git a/lib/modules/manager/cargo/extract.ts b/lib/modules/manager/cargo/extract.ts index f71df1f2226c9d..3d090e52b7a3e8 100644 --- a/lib/modules/manager/cargo/extract.ts +++ b/lib/modules/manager/cargo/extract.ts @@ -1,3 +1,4 @@ +import is from '@sindresorhus/is'; import { logger } from '../../../logger'; import { coerceArray } from '../../../util/array'; import { findLocalSiblingOrParent, readLocalFile } from '../../../util/fs'; @@ -248,7 +249,15 @@ export async function extractPackageFile( const packageSection = cargoManifest.package; let version: string | undefined = undefined; if (packageSection) { - version = packageSection.version; + if (is.string(packageSection.version)) { + version = packageSection.version; + } else if ( + is.object(packageSection.version) && + cargoManifest.workspace?.package?.version + ) { + // TODO: Support reading from parent workspace manifest? + version = cargoManifest.workspace.package.version; + } } const lockFileName = await findLocalSiblingOrParent( diff --git a/lib/modules/manager/cargo/schema.ts b/lib/modules/manager/cargo/schema.ts index 52640d4252d893..1a5e799e96d577 100644 --- a/lib/modules/manager/cargo/schema.ts +++ b/lib/modules/manager/cargo/schema.ts @@ -99,13 +99,24 @@ const CargoSection = z.object({ const CargoWorkspace = z.object({ dependencies: withDepType(CargoDeps, 'workspace.dependencies').optional(), + package: z + .object({ + version: z.string().optional(), + }) + .optional(), }); const CargoTarget = z.record(z.string(), CargoSection); export const CargoManifestSchema = Toml.pipe( CargoSection.extend({ - package: z.object({ version: z.string().optional() }).optional(), + package: z + .object({ + version: z + .union([z.string(), z.object({ workspace: z.literal(true) })]) + .optional(), + }) + .optional(), workspace: CargoWorkspace.optional(), target: CargoTarget.optional(), }), diff --git a/lib/modules/manager/conan/__fixtures__/conanfile.txt b/lib/modules/manager/conan/__fixtures__/conanfile.txt index fb8a66eab42492..b3efed12102655 100644 --- a/lib/modules/manager/conan/__fixtures__/conanfile.txt +++ b/lib/modules/manager/conan/__fixtures__/conanfile.txt @@ -4,6 +4,7 @@ zlib/[~1.2.3, loose=False] fake/8.62.134@test/dev cairo/1.17.2#aff2d03608351db075ec1348a3afc9ff cairo/1.17.2@_/_#aff2d03608351db075ec1348a3afc9ff +Fake/8.62.134@ [build_requires] 7zip/[>1.1 <2.1, include_prerelease=True] diff --git a/lib/modules/manager/conan/extract.spec.ts b/lib/modules/manager/conan/extract.spec.ts index b0df8a12a5f878..783c74fbdc7e30 100644 --- a/lib/modules/manager/conan/extract.spec.ts +++ b/lib/modules/manager/conan/extract.spec.ts @@ -55,6 +55,13 @@ describe('modules/manager/conan/extract', () => { packageName: 'cairo/1.17.2@_/_', replaceString: 'cairo/1.17.2@_/_#aff2d03608351db075ec1348a3afc9ff', }, + { + currentValue: '8.62.134', + depName: 'Fake', + depType: 'requires', + packageName: 'Fake/8.62.134@_/_', + replaceString: 'Fake/8.62.134', + }, { currentValue: '[>1.1 <2.1, include_prerelease=True]', depName: '7zip', diff --git a/lib/modules/manager/conan/extract.ts b/lib/modules/manager/conan/extract.ts index e4fab9f50233b7..fb869dad2fd98a 100644 --- a/lib/modules/manager/conan/extract.ts +++ b/lib/modules/manager/conan/extract.ts @@ -4,7 +4,7 @@ import type { PackageDependency, PackageFileContent } from '../types'; import { isComment } from './common'; const regex = regEx( - `(?[-_a-z0-9]+)/(?[^@#\n{*"']+)(?@[-_a-zA-Z0-9]+(?:/[^#\n.{*"' ]+|))?#?(?[-_a-f0-9]+[^\n{*"'])?`, + `(?[-_a-zA-Z0-9]+)/(?[^@#\n{*"']+)(?@[-_a-zA-Z0-9]+(?:/[^#\n.{*"' ]+|))?#?(?[-_a-f0-9]+[^\n{*"'])?`, ); function setDepType(content: string, originalType: string): string { diff --git a/lib/modules/manager/custom/regex/__fixtures__/Dockerfile b/lib/modules/manager/custom/regex/__fixtures__/Dockerfile index cac5d01da33c7e..ed0437310798e9 100644 --- a/lib/modules/manager/custom/regex/__fixtures__/Dockerfile +++ b/lib/modules/manager/custom/regex/__fixtures__/Dockerfile @@ -131,7 +131,7 @@ RUN chmod +x /usr/local/bin/composer RUN apt-get update && apt-get install -y bzr mercurial && \ rm -rf /var/lib/apt/lists/* -ENV GOLANG_VERSION=1.13.4 +ENV GOLANG_VERSION=1.23.3 # Disable GOPROXY and GOSUMDB until we offer a solid solution to configure # private repositories. diff --git a/lib/modules/manager/dockerfile/extract.spec.ts b/lib/modules/manager/dockerfile/extract.spec.ts index ce1faec854d533..a2bcdab3feca0e 100644 --- a/lib/modules/manager/dockerfile/extract.spec.ts +++ b/lib/modules/manager/dockerfile/extract.spec.ts @@ -32,6 +32,40 @@ describe('modules/manager/dockerfile/extract', () => { ]); }); + it('handles run --mount=from', () => { + const res = extractPackageFile( + 'FROM scratch as build\n' + + 'FROM scratch as final\n' + + 'RUN --mount=from=ghcr.io/astral-sh/uv,source=/uv,target=/bin/uv uv pip install numpy\n' + + 'RUN --mount=type=cache,from=example.com/cache/image,target=/root/.cache pip install numpy\n' + + 'RUN --mount=type=bind,from=build,source=/project/dist/lib.whl,target=/dist/lib.whl pip install /dist/lib.whl\n', + '', + {}, + )?.deps; + expect(res).toEqual([ + { + autoReplaceStringTemplate: + '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + currentDigest: undefined, + currentValue: undefined, + datasource: 'docker', + depName: 'ghcr.io/astral-sh/uv', + depType: 'stage', + replaceString: 'ghcr.io/astral-sh/uv', + }, + { + autoReplaceStringTemplate: + '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', + currentDigest: undefined, + currentValue: undefined, + datasource: 'docker', + depName: 'example.com/cache/image', + depType: 'final', + replaceString: 'example.com/cache/image', + }, + ]); + }); + it('is case insensitive', () => { const res = extractPackageFile('From node\n', '', {})?.deps; expect(res).toEqual([ @@ -463,7 +497,7 @@ describe('modules/manager/dockerfile/extract', () => { it('detects ["stage"] and ["final"] deps of docker multi-stage build.', () => { const res = extractPackageFile( - 'FROM node:8.15.1-alpine as skippedfrom\nFROM golang:1.7.3 as builder\n\n# comment\nWORKDIR /go/src/github.com/alexellis/href-counter/\nRUN go get -d -v golang.org/x/net/html \nCOPY app.go .\nRUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .\n\nFROM alpine:latest \nRUN apk --no-cache add ca-certificates\nWORKDIR /root/\nCOPY --from=builder /go/src/github.com/alexellis/href-counter/app .\nCMD ["./app"]\n', + 'FROM node:8.15.1-alpine as skippedfrom\nFROM golang:1.23.3 as builder\n\n# comment\nWORKDIR /go/src/github.com/alexellis/href-counter/\nRUN go get -d -v golang.org/x/net/html \nCOPY app.go .\nRUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .\n\nFROM alpine:latest \nRUN apk --no-cache add ca-certificates\nWORKDIR /root/\nCOPY --from=builder /go/src/github.com/alexellis/href-counter/app .\nCMD ["./app"]\n', '', {}, )?.deps; @@ -482,11 +516,11 @@ describe('modules/manager/dockerfile/extract', () => { autoReplaceStringTemplate: '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}', currentDigest: undefined, - currentValue: '1.7.3', + currentValue: '1.23.3', datasource: 'docker', depName: 'golang', depType: 'stage', - replaceString: 'golang:1.7.3', + replaceString: 'golang:1.23.3', }, { autoReplaceStringTemplate: diff --git a/lib/modules/manager/dockerfile/extract.ts b/lib/modules/manager/dockerfile/extract.ts index 1395dbcc1e57cb..019e7ee86a1653 100644 --- a/lib/modules/manager/dockerfile/extract.ts +++ b/lib/modules/manager/dockerfile/extract.ts @@ -422,6 +422,41 @@ export function extractPackageFile( } } + const runMountFromRegex = regEx( + '^[ \\t]*RUN(?:' + + escapeChar + + '[ \\t]*\\r?\\n| |\\t|#.*?\\r?\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--mount=(?:\\S*=\\S*,)*from=(?[^, ]+)', + 'im', + ); + const runMountFromMatch = instruction.match(runMountFromRegex); + if (runMountFromMatch?.groups?.image) { + if (stageNames.includes(runMountFromMatch.groups.image)) { + logger.debug( + { image: runMountFromMatch.groups.image }, + 'Skipping alias RUN --mount=from', + ); + } else { + const dep = getDep( + runMountFromMatch.groups.image, + true, + config.registryAliases, + ); + const lineNumberRanges: number[][] = [ + [lineNumberInstrStart, lineNumber], + ]; + processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed); + logger.debug( + { + depName: dep.depName, + currentValue: dep.currentValue, + currentDigest: dep.currentDigest, + }, + 'Dockerfile RUN --mount=from', + ); + deps.push(dep); + } + } + lineNumber += 1; } diff --git a/lib/modules/manager/dockerfile/readme.md b/lib/modules/manager/dockerfile/readme.md index 8e0a82be56336e..2c1717735242b8 100644 --- a/lib/modules/manager/dockerfile/readme.md +++ b/lib/modules/manager/dockerfile/readme.md @@ -4,6 +4,7 @@ This manager extracts image references in a `Dockerfile` and/or `Containerfile` - [`FROM`](https://docs.docker.com/reference/dockerfile/#from) images - [`COPY --from`](https://docs.docker.com/reference/dockerfile/#copy---from) images +- [`RUN --mount`](https://docs.docker.com/reference/dockerfile/#run---mount) images - [`syntax`](https://docs.docker.com/reference/dockerfile/#syntax) images #### `FROM` support @@ -37,6 +38,16 @@ FROM node:20.9.0 COPY --from alpine:3.19.4 /bin/sh /usr/local/sh ``` +#### `RUN --mount` support + +Images referenced in `RUN --mount` directives are also supported. + +```dockerfile +FROM python:3.12 +RUN --mount=from=ghcr.io/astral-sh/uv:0.5,source=/uv,target=/bin/uv \ + uv venv +``` + #### `syntax` support Renovate can update `syntax` references. diff --git a/lib/modules/manager/gomod/__fixtures__/3/go-mod b/lib/modules/manager/gomod/__fixtures__/3/go-mod index 973a7c3dcee593..7407b435d7b566 100644 --- a/lib/modules/manager/gomod/__fixtures__/3/go-mod +++ b/lib/modules/manager/gomod/__fixtures__/3/go-mod @@ -1,6 +1,6 @@ module k8s.io/minikube -go 1.13 +go 1.23 require ( cloud.google.com/go v0.45.1 @@ -132,5 +132,4 @@ replace ( k8s.io/sample-controller => k8s.io/sample-controller v0.17.3 ) -toolchain go1.22.1 - +toolchain go1.23.3 diff --git a/lib/modules/manager/gomod/artifacts.spec.ts b/lib/modules/manager/gomod/artifacts.spec.ts index 9246997792a3f2..308904a603356b 100644 --- a/lib/modules/manager/gomod/artifacts.spec.ts +++ b/lib/modules/manager/gomod/artifacts.spec.ts @@ -443,7 +443,7 @@ describe('modules/manager/gomod/artifacts', () => { fs.readLocalFile.mockResolvedValueOnce('New go.sum'); fs.readLocalFile.mockResolvedValueOnce(gomod1); datasource.getPkgReleases.mockResolvedValueOnce({ - releases: [{ version: '1.17.0' }, { version: '1.14.0' }], + releases: [{ version: '1.17.0' }, { version: '1.23.3' }], }); expect( await gomod.updateArtifacts({ @@ -480,7 +480,7 @@ describe('modules/manager/gomod/artifacts', () => { '-w "/tmp/github/some/repo" ' + 'ghcr.io/containerbase/sidecar' + ' bash -l -c "' + - 'install-tool golang 1.14.0' + + 'install-tool golang 1.23.3' + ' && ' + 'go get -d -t ./...' + '"', @@ -505,7 +505,7 @@ describe('modules/manager/gomod/artifacts', () => { fs.readLocalFile.mockResolvedValueOnce('New go.sum'); fs.readLocalFile.mockResolvedValueOnce(gomod1); datasource.getPkgReleases.mockResolvedValueOnce({ - releases: [{ version: '1.17.0' }, { version: '1.14.0' }], + releases: [{ version: '1.17.0' }, { version: '1.23.3' }], }); expect( await gomod.updateArtifacts({ @@ -524,7 +524,7 @@ describe('modules/manager/gomod/artifacts', () => { }, ]); expect(execSnapshots).toMatchObject([ - { cmd: 'install-tool golang 1.14.0' }, + { cmd: 'install-tool golang 1.23.3' }, { cmd: 'go get -d -t ./...', options: { @@ -595,7 +595,7 @@ describe('modules/manager/gomod/artifacts', () => { fs.readLocalFile.mockResolvedValueOnce('New go.sum'); fs.readLocalFile.mockResolvedValueOnce(gomod1); datasource.getPkgReleases.mockResolvedValueOnce({ - releases: [{ version: '1.17.0' }, { version: '1.14.0' }], + releases: [{ version: '1.17.0' }, { version: '1.23.3' }], }); expect( await gomod.updateArtifacts({ @@ -645,7 +645,7 @@ describe('modules/manager/gomod/artifacts', () => { '-w "/tmp/github/some/repo" ' + 'ghcr.io/containerbase/sidecar' + ' bash -l -c "' + - 'install-tool golang 1.14.0' + + 'install-tool golang 1.23.3' + ' && ' + 'go get -d -t ./...' + '"', @@ -704,7 +704,7 @@ describe('modules/manager/gomod/artifacts', () => { fs.readLocalFile.mockResolvedValueOnce('New go.sum'); fs.readLocalFile.mockResolvedValueOnce(gomod1); datasource.getPkgReleases.mockResolvedValueOnce({ - releases: [{ version: '1.17.0' }, { version: '1.14.0' }], + releases: [{ version: '1.17.0' }, { version: '1.23.3' }], }); expect( await gomod.updateArtifacts({ @@ -772,7 +772,7 @@ describe('modules/manager/gomod/artifacts', () => { fs.readLocalFile.mockResolvedValueOnce('New go.sum'); fs.readLocalFile.mockResolvedValueOnce(gomod1); datasource.getPkgReleases.mockResolvedValueOnce({ - releases: [{ version: '1.17.0' }, { version: '1.14.0' }], + releases: [{ version: '1.17.0' }, { version: '1.23.3' }], }); expect( await gomod.updateArtifacts({ @@ -837,7 +837,7 @@ describe('modules/manager/gomod/artifacts', () => { fs.readLocalFile.mockResolvedValueOnce('New go.sum'); fs.readLocalFile.mockResolvedValueOnce(gomod1); datasource.getPkgReleases.mockResolvedValueOnce({ - releases: [{ version: '1.17.0' }, { version: '1.14.0' }], + releases: [{ version: '1.17.0' }, { version: '1.23.3' }], }); expect( await gomod.updateArtifacts({ @@ -911,7 +911,7 @@ describe('modules/manager/gomod/artifacts', () => { fs.readLocalFile.mockResolvedValueOnce('New go.sum'); fs.readLocalFile.mockResolvedValueOnce(gomod1); datasource.getPkgReleases.mockResolvedValueOnce({ - releases: [{ version: '1.17.0' }, { version: '1.14.0' }], + releases: [{ version: '1.17.0' }, { version: '1.23.3' }], }); expect( await gomod.updateArtifacts({ @@ -984,7 +984,7 @@ describe('modules/manager/gomod/artifacts', () => { fs.readLocalFile.mockResolvedValueOnce('New go.sum'); fs.readLocalFile.mockResolvedValueOnce(gomod1); datasource.getPkgReleases.mockResolvedValueOnce({ - releases: [{ version: '1.17.0' }, { version: '1.14.0' }], + releases: [{ version: '1.17.0' }, { version: '1.23.3' }], }); expect( await gomod.updateArtifacts({ @@ -1065,7 +1065,7 @@ describe('modules/manager/gomod/artifacts', () => { fs.readLocalFile.mockResolvedValueOnce('New go.sum'); fs.readLocalFile.mockResolvedValueOnce(gomod1); datasource.getPkgReleases.mockResolvedValueOnce({ - releases: [{ version: '1.17.0' }, { version: '1.14.0' }], + releases: [{ version: '1.17.0' }, { version: '1.23.3' }], }); expect( await gomod.updateArtifacts({ @@ -1120,7 +1120,7 @@ describe('modules/manager/gomod/artifacts', () => { fs.readLocalFile.mockResolvedValueOnce('New go.sum 3'); fs.readLocalFile.mockResolvedValueOnce('New go.mod'); datasource.getPkgReleases.mockResolvedValueOnce({ - releases: [{ version: '1.17.0' }, { version: '1.14.0' }], + releases: [{ version: '1.17.0' }, { version: '1.23.3' }], }); expect( await gomod.updateArtifacts({ @@ -1155,7 +1155,7 @@ describe('modules/manager/gomod/artifacts', () => { '-w "/tmp/github/some/repo" ' + 'ghcr.io/containerbase/sidecar' + ' bash -l -c "' + - 'install-tool golang 1.14.0' + + 'install-tool golang 1.23.3' + ' && ' + 'go get -d -t ./...' + ' && ' + @@ -1184,7 +1184,7 @@ describe('modules/manager/gomod/artifacts', () => { fs.readLocalFile.mockResolvedValueOnce('New go.sum 3'); fs.readLocalFile.mockResolvedValueOnce('New go.mod'); datasource.getPkgReleases.mockResolvedValueOnce({ - releases: [{ version: '1.17.0' }, { version: '1.14.0' }], + releases: [{ version: '1.17.0' }, { version: '1.23.3' }], }); expect( await gomod.updateArtifacts({ @@ -1219,7 +1219,7 @@ describe('modules/manager/gomod/artifacts', () => { '-w "/tmp/github/some/repo" ' + 'ghcr.io/containerbase/sidecar' + ' bash -l -c "' + - 'install-tool golang 1.14.0' + + 'install-tool golang 1.23.3' + ' && ' + 'go get -d -t ./...' + ' && ' + @@ -1248,7 +1248,7 @@ describe('modules/manager/gomod/artifacts', () => { fs.readLocalFile.mockResolvedValueOnce('New go.sum 3'); fs.readLocalFile.mockResolvedValueOnce('New go.mod'); datasource.getPkgReleases.mockResolvedValueOnce({ - releases: [{ version: '1.17.0' }, { version: '1.14.0' }], + releases: [{ version: '1.17.0' }, { version: '1.23.3' }], }); expect( await gomod.updateArtifacts({ @@ -1283,7 +1283,7 @@ describe('modules/manager/gomod/artifacts', () => { '-w "/tmp/github/some/repo" ' + 'ghcr.io/containerbase/sidecar' + ' bash -l -c "' + - 'install-tool golang 1.14.0' + + 'install-tool golang 1.23.3' + ' && ' + 'go get -d -t ./...' + ' && ' + @@ -1312,7 +1312,7 @@ describe('modules/manager/gomod/artifacts', () => { fs.readLocalFile.mockResolvedValueOnce('New go.sum 3'); fs.readLocalFile.mockResolvedValueOnce('New go.mod'); datasource.getPkgReleases.mockResolvedValueOnce({ - releases: [{ version: '1.17.0' }, { version: '1.14.0' }], + releases: [{ version: '1.17.0' }, { version: '1.23.3' }], }); expect( await gomod.updateArtifacts({ @@ -1347,7 +1347,7 @@ describe('modules/manager/gomod/artifacts', () => { '-w "/tmp/github/some/repo" ' + 'ghcr.io/containerbase/sidecar' + ' bash -l -c "' + - 'install-tool golang 1.14.0' + + 'install-tool golang 1.23.3' + ' && ' + 'go get -d -t ./...' + ' && ' + @@ -1905,7 +1905,7 @@ describe('modules/manager/gomod/artifacts', () => { .mockResolvedValueOnce('New main.go') .mockResolvedValueOnce('New go.mod'); datasource.getPkgReleases.mockResolvedValueOnce({ - releases: [{ version: '1.17.0' }, { version: '1.14.0' }], + releases: [{ version: '1.17.0' }, { version: '1.23.3' }], }); const res = await gomod.updateArtifacts({ packageFileName: 'go.mod', @@ -1924,7 +1924,7 @@ describe('modules/manager/gomod/artifacts', () => { { file: { type: 'addition', path: 'go.mod', contents: 'New go.mod' } }, ]); expect(execSnapshots).toMatchObject([ - { cmd: 'install-tool golang 1.14.0' }, + { cmd: 'install-tool golang 1.23.3' }, { cmd: 'go get -d -t ./...', options: { cwd: '/tmp/github/some/repo' }, @@ -1964,7 +1964,7 @@ describe('modules/manager/gomod/artifacts', () => { .mockResolvedValueOnce('New main.go') .mockResolvedValueOnce('New go.mod'); datasource.getPkgReleases.mockResolvedValueOnce({ - releases: [{ version: '1.17.0' }, { version: '1.14.0' }], + releases: [{ version: '1.17.0' }, { version: '1.23.3' }], }); const res = await gomod.updateArtifacts({ packageFileName: 'go.mod', @@ -2004,7 +2004,7 @@ describe('modules/manager/gomod/artifacts', () => { '-w "/tmp/github/some/repo" ' + 'ghcr.io/containerbase/sidecar' + ' bash -l -c "' + - 'install-tool golang 1.17.0' + + 'install-tool golang 1.23.3' + ' && ' + 'go get -d -t ./...' + ' && ' + @@ -2038,7 +2038,7 @@ describe('modules/manager/gomod/artifacts', () => { .mockResolvedValueOnce('New main.go') .mockResolvedValueOnce('New go.mod'); datasource.getPkgReleases.mockResolvedValueOnce({ - releases: [{ version: '1.17.0' }, { version: '1.14.0' }], + releases: [{ version: '1.17.0' }, { version: '1.23.3' }], }); const res = await gomod.updateArtifacts({ packageFileName: 'go.mod', @@ -2077,7 +2077,7 @@ describe('modules/manager/gomod/artifacts', () => { .mockResolvedValueOnce('New main.go') .mockResolvedValueOnce('New go.mod'); datasource.getPkgReleases.mockResolvedValueOnce({ - releases: [{ version: '1.17.0' }, { version: '1.14.0' }], + releases: [{ version: '1.17.0' }, { version: '1.23.3' }], }); const res = await gomod.updateArtifacts({ packageFileName: 'go.mod', @@ -2119,7 +2119,7 @@ describe('modules/manager/gomod/artifacts', () => { '-w "/tmp/github/some/repo" ' + 'ghcr.io/containerbase/sidecar' + ' bash -l -c "' + - 'install-tool golang 1.14.0' + + 'install-tool golang 1.23.3' + ' && ' + 'go get -d -t ./...' + ' && ' + diff --git a/lib/modules/manager/gomod/extract.spec.ts b/lib/modules/manager/gomod/extract.spec.ts index 97d093d62b4ac6..e5d063f83afbb4 100644 --- a/lib/modules/manager/gomod/extract.spec.ts +++ b/lib/modules/manager/gomod/extract.spec.ts @@ -46,7 +46,7 @@ describe('modules/manager/gomod/extract', () => { it('extracts replace directives from multi-line and single line', () => { const goMod = codeBlock` module github.com/renovate-tests/gomod - go 1.18 + go 1.23 replace golang.org/x/foo => github.com/pravesht/gocql v0.0.0 replace ( k8s.io/client-go => k8s.io/client-go v0.21.9 @@ -66,7 +66,7 @@ describe('modules/manager/gomod/extract', () => { }, depName: 'go', depType: 'golang', - currentValue: '1.18', + currentValue: '1.23', datasource: 'golang-version', versioning: 'go-mod-directive', }, @@ -127,8 +127,8 @@ describe('modules/manager/gomod/extract', () => { it('extracts the toolchain directive', () => { const goMod = codeBlock` module github.com/renovate-tests/gomod - go 1.21 - toolchain go1.21.7 + go 1.23 + toolchain go1.23.3 replace golang.org/x/foo => github.com/pravesht/gocql v0.0.0 `; const res = extractPackageFile(goMod); @@ -140,7 +140,7 @@ describe('modules/manager/gomod/extract', () => { }, depName: 'go', depType: 'golang', - currentValue: '1.21', + currentValue: '1.23', datasource: 'golang-version', versioning: 'go-mod-directive', }, @@ -150,7 +150,7 @@ describe('modules/manager/gomod/extract', () => { }, depName: 'go', depType: 'toolchain', - currentValue: '1.21.7', + currentValue: '1.23.3', datasource: 'golang-version', }, { diff --git a/lib/modules/manager/gomod/line-parser.spec.ts b/lib/modules/manager/gomod/line-parser.spec.ts index 11beed76cf86cc..a7ad513712c6e1 100644 --- a/lib/modules/manager/gomod/line-parser.spec.ts +++ b/lib/modules/manager/gomod/line-parser.spec.ts @@ -6,10 +6,10 @@ describe('modules/manager/gomod/line-parser', () => { }); it('should parse go version', () => { - const line = 'go 1.16'; + const line = 'go 1.23'; const res = parseLine(line); expect(res).toStrictEqual({ - currentValue: '1.16', + currentValue: '1.23', datasource: 'golang-version', depName: 'go', depType: 'golang', @@ -31,10 +31,10 @@ describe('modules/manager/gomod/line-parser', () => { }); it('should parse toolchain version', () => { - const line = 'toolchain go1.16'; + const line = 'toolchain go1.23'; const res = parseLine(line); expect(res).toStrictEqual({ - currentValue: '1.16', + currentValue: '1.23', datasource: 'golang-version', depName: 'go', depType: 'toolchain', diff --git a/lib/modules/manager/gomod/readme.md b/lib/modules/manager/gomod/readme.md index 34dc5df94f2862..d5a97547b768f2 100644 --- a/lib/modules/manager/gomod/readme.md +++ b/lib/modules/manager/gomod/readme.md @@ -16,7 +16,7 @@ You might be interested in the following `postUpdateOptions`: 1. `gomodMassage` - to enable massaging of all `replace` statements prior to running `go` so that they will be ignored When Renovate is running using `binarySource=docker` (such as in the Mend Renovate App) then it will pick the latest compatible version of Go to run, i.e. the latest `1.x` release. -Even if the `go.mod` has a version like `go 1.14`, Renovate will treat it as a `^1.14` constraint and not `=1.14`. +Even if the `go.mod` has a version like `go 1.22`, Renovate will treat it as a `^1.22` constraint and not `=1.22`. Indirect updates are disabled by default. To enable them, add a package rule such as: diff --git a/lib/modules/manager/gomod/update.spec.ts b/lib/modules/manager/gomod/update.spec.ts index c6cce004636d5a..28b9e2c5b23c9f 100644 --- a/lib/modules/manager/gomod/update.spec.ts +++ b/lib/modules/manager/gomod/update.spec.ts @@ -366,7 +366,7 @@ describe('modules/manager/gomod/update', () => { it('handles multiline replace update', () => { const fileContent = ` - go 1.18 + go 1.23 replace ( k8s.io/client-go => k8s.io/client-go v0.21.9 )`; diff --git a/lib/modules/manager/gradle-wrapper/util.spec.ts b/lib/modules/manager/gradle-wrapper/util.spec.ts index 470adaf837d2b1..5087e073d3c7c9 100644 --- a/lib/modules/manager/gradle-wrapper/util.spec.ts +++ b/lib/modules/manager/gradle-wrapper/util.spec.ts @@ -5,6 +5,7 @@ import { fs, partial } from '../../../../test/util'; import { extractGradleVersion, getJavaConstraint, + getJavaLanguageVersion, getJvmConfiguration, gradleWrapperFileName, prepareGradleCommand, @@ -45,6 +46,15 @@ describe('modules/manager/gradle-wrapper/util', () => { fs.readLocalFile.mockResolvedValue(daemonJvm); expect(await getJavaConstraint('8.8', './gradlew')).toBe('^999.0.0'); }); + + it('returns languageVersion constraint if found', async () => { + const buildGradle = codeBlock` + java { toolchain { languageVersion = JavaLanguageVersion.of(456) } } + `; + fs.localPathExists.mockResolvedValueOnce(true); + fs.readLocalFile.mockResolvedValue(buildGradle); + expect(await getJavaConstraint('6.7', './gradlew')).toBe('^456.0.0'); + }); }); describe('getJvmConfiguration', () => { @@ -67,6 +77,36 @@ describe('modules/manager/gradle-wrapper/util', () => { }); }); + describe('getJavaLanguageVersion', () => { + it('extract languageVersion value', async () => { + const buildGradle = codeBlock` + java { toolchain { languageVersion = JavaLanguageVersion.of(21) } } + `; + fs.localPathExists.mockResolvedValue(true); + fs.readLocalFile.mockResolvedValue(buildGradle); + expect(await getJavaLanguageVersion('')).toBe('21'); + }); + + it('returns null if build.gradle or build.gradle.kts file not found', async () => { + fs.localPathExists.mockResolvedValue(false); + fs.readLocalFile.mockResolvedValue(null); + expect(await getJavaLanguageVersion('sub/gradlew')).toBeNull(); + expect(fs.readLocalFile).toHaveBeenCalledWith( + 'sub/build.gradle.kts', + 'utf8', + ); + }); + + it('returns null if build.gradle does not include languageVersion', async () => { + const buildGradle = codeBlock` + dependencies { implementation "com.google.protobuf:protobuf-java:2.17.0" } + `; + fs.localPathExists.mockResolvedValue(true); + fs.readLocalFile.mockResolvedValue(buildGradle); + expect(await getJavaLanguageVersion('')).toBeNull(); + }); + }); + describe('extractGradleVersion()', () => { it('returns null', () => { const properties = codeBlock` diff --git a/lib/modules/manager/gradle-wrapper/utils.ts b/lib/modules/manager/gradle-wrapper/utils.ts index fece660f4b0a16..a869bbc20b3959 100644 --- a/lib/modules/manager/gradle-wrapper/utils.ts +++ b/lib/modules/manager/gradle-wrapper/utils.ts @@ -2,9 +2,15 @@ import os from 'node:os'; import { dirname, join } from 'upath'; import { GlobalConfig } from '../../../config/global'; import { logger } from '../../../logger'; -import { chmodLocalFile, readLocalFile, statLocalFile } from '../../../util/fs'; +import { + chmodLocalFile, + localPathExists, + readLocalFile, + statLocalFile, +} from '../../../util/fs'; import { regEx } from '../../../util/regex'; import gradleVersioning from '../../versioning/gradle'; +import { parseJavaToolchainVersion } from '../gradle/parser'; import type { GradleVersionExtract } from './types'; export const extraEnv = { @@ -60,6 +66,13 @@ export async function getJavaConstraint( return `^${toolChainVersion}.0.0`; } } + // https://docs.gradle.org/6.7/release-notes.html#new-jvm-ecosystem-features + if (major > 6 || (major === 6 && minor && minor >= 7)) { + const languageVersion = await getJavaLanguageVersion(gradlewFile); + if (languageVersion) { + return `^${languageVersion}.0.0`; + } + } if (major > 8 || (major === 8 && minor && minor >= 5)) { return '^21.0.0'; } @@ -103,6 +116,27 @@ export async function getJvmConfiguration( return null; } +/** + * https://docs.gradle.org/current/userguide/toolchains.html#sec:consuming + */ +export async function getJavaLanguageVersion( + gradlewFile: string, +): Promise { + const localGradleDir = dirname(gradlewFile); + let buildFileName = join(localGradleDir, 'build.gradle'); + if (!(await localPathExists(buildFileName))) { + buildFileName = join(localGradleDir, 'build.gradle.kts'); + } + + const buildFileContent = await readLocalFile(buildFileName, 'utf8'); + if (!buildFileContent) { + logger.debug('build.gradle or build.gradle.kts not found'); + return null; + } + + return parseJavaToolchainVersion(buildFileContent); +} + // https://regex101.com/r/IcOs7P/1 const DISTRIBUTION_URL_REGEX = regEx( '^(?:distributionUrl\\s*=\\s*)(?\\S*-(?\\d+\\.\\d+(?:\\.\\d+)?(?:-\\w+)*)-(?bin|all)\\.zip)\\s*$', diff --git a/lib/modules/manager/gradle/parser.spec.ts b/lib/modules/manager/gradle/parser.spec.ts index 101848c6c81937..668c6b3ff188cb 100644 --- a/lib/modules/manager/gradle/parser.spec.ts +++ b/lib/modules/manager/gradle/parser.spec.ts @@ -2,7 +2,12 @@ import is from '@sindresorhus/is'; import { codeBlock } from 'common-tags'; import { Fixtures } from '../../../../test/fixtures'; import { fs, logger } from '../../../../test/util'; -import { parseGradle, parseKotlinSource, parseProps } from './parser'; +import { + parseGradle, + parseJavaToolchainVersion, + parseKotlinSource, + parseProps, +} from './parser'; import { GRADLE_PLUGINS, REGISTRY_URLS } from './parser/common'; jest.mock('../../../util/fs'); @@ -1108,4 +1113,23 @@ describe('modules/manager/gradle/parser', () => { }); }); }); + + describe('Java language version', () => { + it.each` + input | output + ${'java { toolchain { languageVersion = JavaLanguageVersion.of(22) } }'} | ${'22'} + ${'java { toolchain.languageVersion.set(JavaLanguageVersion.of(16)) }'} | ${'16'} + ${'java.toolchain { languageVersion.set(JavaLanguageVersion.of(17)) }'} | ${'17'} + ${'java.toolchain.languageVersion = JavaLanguageVersion.of(21)'} | ${'21'} + ${'kotlin { jvmToolchain { languageVersion = JavaLanguageVersion.of(17) } }'} | ${'17'} + ${'kotlin { jvmToolchain { languageVersion.set(JavaLanguageVersion.of(17)) } }'} | ${'17'} + ${'kotlin.jvmToolchain { languageVersion.set(JavaLanguageVersion.of(8)) }'} | ${'8'} + ${'kotlin { jvmToolchain(11) }'} | ${'11'} + ${'kotlin.jvmToolchain(16)'} | ${'16'} + ${'dependencies { implementation "com.google.protobuf:protobuf-java:2.17.0" }'} | ${null} + `('$input', ({ input, output }) => { + const javaLanguageVersion = parseJavaToolchainVersion(input); + expect(javaLanguageVersion).toBe(output); + }); + }); }); diff --git a/lib/modules/manager/gradle/parser.ts b/lib/modules/manager/gradle/parser.ts index abf2361eaca859..d9f0f4e6111792 100644 --- a/lib/modules/manager/gradle/parser.ts +++ b/lib/modules/manager/gradle/parser.ts @@ -6,6 +6,7 @@ import { qAssignments } from './parser/assignments'; import { qKotlinImport } from './parser/common'; import { qDependencies, qLongFormDep } from './parser/dependencies'; import { setParseGradleFunc } from './parser/handlers'; +import { qToolchainVersion } from './parser/language-version'; import { qKotlinMultiObjectVarAssignment } from './parser/objects'; import { qPlugins } from './parser/plugins'; import { qRegistryUrls } from './parser/registry-urls'; @@ -51,7 +52,6 @@ export function parseGradle( const query = q.tree({ type: 'root-tree', - maxDepth: 32, search: q.alt( qKotlinImport, qAssignments, @@ -109,6 +109,13 @@ export function parseKotlinSource( return { deps, vars }; } +export function parseJavaToolchainVersion(input: string): string | null { + const ctx: Partial = {}; + const parsedResult = groovy.query(input, qToolchainVersion, ctx); + + return parsedResult?.javaLanguageVersion ?? null; +} + const propWord = '[a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*'; const propRegex = regEx( `^(?\\s*(?${propWord})\\s*[= :]\\s*['"]?)(?[^\\s'"]+)['"]?\\s*$`, diff --git a/lib/modules/manager/gradle/parser/common.ts b/lib/modules/manager/gradle/parser/common.ts index 997ac4f42b169f..fffc610c0cac41 100644 --- a/lib/modules/manager/gradle/parser/common.ts +++ b/lib/modules/manager/gradle/parser/common.ts @@ -313,3 +313,22 @@ export const qKotlinImport = q return ctx; }) .handler(cleanupTempVars); + +// foo { bar { baz } } +// foo.bar { baz } +export const qDotOrBraceExpr = ( + symValue: q.SymMatcherValue, + matcher: q.QueryBuilder, +): q.QueryBuilder => + q.sym(symValue).alt( + q.alt( + q.op('.').join(matcher), + q.tree({ + type: 'wrapped-tree', + maxDepth: 1, + startsWith: '{', + endsWith: '}', + search: matcher, + }), + ), + ); diff --git a/lib/modules/manager/gradle/parser/language-version.ts b/lib/modules/manager/gradle/parser/language-version.ts new file mode 100644 index 00000000000000..38cb4514a15a1d --- /dev/null +++ b/lib/modules/manager/gradle/parser/language-version.ts @@ -0,0 +1,59 @@ +import type { lexer } from 'good-enough-parser'; +import { query as q } from 'good-enough-parser'; +import { regEx } from '../../../../util/regex'; +import type { Ctx } from '../types'; +import { qDotOrBraceExpr } from './common'; + +// (21) +const qVersionNumber = q.tree({ + type: 'wrapped-tree', + maxDepth: 1, + maxMatches: 1, + startsWith: '(', + endsWith: ')', + search: q.num((ctx: Ctx, node: lexer.Token) => { + ctx.javaLanguageVersion = node.value; + return ctx; + }), +}); + +// kotlin { jvmToolchain(17) } +// kotlin.jvmToolchain(17) +const qKotlinShortNotationToolchain = qDotOrBraceExpr( + 'kotlin', + q.sym('jvmToolchain').join(qVersionNumber), +); + +// JavaLanguageVersion.of(21) +const qJavaLanguageVersion = q + .sym('JavaLanguageVersion') + .op('.') + .sym('of') + .join(qVersionNumber); + +// java { toolchain { languageVersion = JavaLanguageVersion.of(21) } } +// kotlin { jvmToolchain { languageVersion.set(JavaLanguageVersion.of(17)) } } +const qLongFormToolchainVersion = qDotOrBraceExpr( + regEx(/^(?:java|kotlin)$/), + qDotOrBraceExpr( + regEx(/^(?:toolchain|jvmToolchain)$/), + q.sym('languageVersion').alt( + q.op('=').join(qJavaLanguageVersion), + q + .op('.') + .sym('set') + .tree({ + type: 'wrapped-tree', + maxDepth: 1, + startsWith: '(', + endsWith: ')', + search: q.begin().join(qJavaLanguageVersion).end(), + }), + ), + ), +); + +export const qToolchainVersion = q.alt( + qKotlinShortNotationToolchain, + qLongFormToolchainVersion, +); diff --git a/lib/modules/manager/gradle/readme.md b/lib/modules/manager/gradle/readme.md index 5cd0635a8333e2..118a958d500727 100644 --- a/lib/modules/manager/gradle/readme.md +++ b/lib/modules/manager/gradle/readme.md @@ -11,7 +11,7 @@ As the output of these commands can be very large, any text other than errors (i ### Dependency verification -If Renovate finds a `gradle/verification-metadata.xml` file, it updates the content by using the `gradle --write-verification-metadata dependencies` command. +If Renovate finds a `gradle/verification-metadata.xml` file and either `true` or `true` (or both), it updates the content by using the `gradle --write-verification-metadata dependencies` command. Renovate will check the file for existing hash types (like `sha256`) and use them as ``. diff --git a/lib/modules/manager/gradle/types.ts b/lib/modules/manager/gradle/types.ts index 74dfd059c98235..0a6fbe93a1c006 100644 --- a/lib/modules/manager/gradle/types.ts +++ b/lib/modules/manager/gradle/types.ts @@ -18,6 +18,7 @@ export interface ParseGradleResult { deps: PackageDependency[]; urls: PackageRegistry[]; vars: PackageVariables; + javaLanguageVersion?: string; } export interface GradleCatalog { @@ -80,6 +81,7 @@ export interface Ctx { globalVars: PackageVariables; deps: PackageDependency[]; registryUrls: PackageRegistry[]; + javaLanguageVersion?: string; varTokens: lexer.Token[]; tmpKotlinImportStore: lexer.Token[][]; diff --git a/lib/modules/manager/kustomize/extract.spec.ts b/lib/modules/manager/kustomize/extract.spec.ts index f6f2f67ac613b4..4465cd9aee81c2 100644 --- a/lib/modules/manager/kustomize/extract.spec.ts +++ b/lib/modules/manager/kustomize/extract.spec.ts @@ -61,6 +61,12 @@ describe('modules/manager/kustomize/extract', () => { expect(res).toBeNull(); }); + it('should return null for an http base without ref/version', () => { + const base = 'https://github.com/user/test-repo.git'; + const res = extractResource(`${base}?timeout=10s`); + expect(res).toBeNull(); + }); + it('should extract out the version of an http base', () => { const base = 'https://github.com/user/test-repo.git'; const version = 'v1.0.0'; @@ -148,6 +154,47 @@ describe('modules/manager/kustomize/extract', () => { const pkg = extractResource(`${base}?ref=${version}`); expect(pkg).toEqual(sample); }); + + it('should extract out the version of an http base with additional params', () => { + const base = 'https://github.com/user/test-repo.git'; + const version = 'v1.0.0'; + const sample = { + currentValue: version, + datasource: GithubTagsDatasource.id, + depName: 'user/test-repo', + }; + + const pkg = extractResource( + `${base}?timeout=120&ref=${version}&submodules=false&version=v1`, + ); + expect(pkg).toEqual(sample); + }); + + it('should extract out the version of an http base from first version param', () => { + const base = 'https://github.com/user/test-repo.git'; + const version = 'v1.0.0'; + const sample = { + currentValue: version, + datasource: GithubTagsDatasource.id, + depName: 'user/test-repo', + }; + + const pkg = extractResource(`${base}?version=${version}&version=v0`); + expect(pkg).toEqual(sample); + }); + + it('should extract out the version of an http base from first ref param', () => { + const base = 'https://github.com/user/test-repo.git'; + const version = 'v1.0.0'; + const sample = { + currentValue: version, + datasource: GithubTagsDatasource.id, + depName: 'user/test-repo', + }; + + const pkg = extractResource(`${base}?ref=${version}&ref=v0`); + expect(pkg).toEqual(sample); + }); }); describe('extractHelmChart', () => { diff --git a/lib/modules/manager/kustomize/extract.ts b/lib/modules/manager/kustomize/extract.ts index 25378a1643dd2e..9051607e1ad46d 100644 --- a/lib/modules/manager/kustomize/extract.ts +++ b/lib/modules/manager/kustomize/extract.ts @@ -1,3 +1,4 @@ +import querystring from 'node:querystring'; import is from '@sindresorhus/is'; import { logger } from '../../../logger'; import { coerceArray } from '../../../util/array'; @@ -18,19 +19,19 @@ import type { HelmChart, Image, Kustomize } from './types'; // URL specifications should follow the hashicorp URL format // https://github.com/hashicorp/go-getter#url-format const gitUrl = regEx( - /^(?:git::)?(?(?:(?:(?:http|https|ssh):\/\/)?(?:.*@)?)?(?(?:[^:/\s]+(?::[0-9]+)?[:/])?(?[^/\s]+\/[^/\s]+)))(?[^?\s]*)\?ref=(?.+)$/, + /^(?:git::)?(?(?:(?:(?:http|https|ssh):\/\/)?(?:.*@)?)?(?(?:[^:/\s]+(?::[0-9]+)?[:/])?(?[^/\s]+\/[^/\s]+)))(?[^?\s]*)\?(?.+)$/, ); // regex to match URLs with ".git" delimiter const dotGitRegex = regEx( - /^(?:git::)?(?(?:(?:(?:http|https|ssh):\/\/)?(?:.*@)?)?(?(?:[^:/\s]+(?::[0-9]+)?[:/])?(?[^?\s]*(\.git))))(?[^?\s]*)\?ref=(?.+)$/, + /^(?:git::)?(?(?:(?:(?:http|https|ssh):\/\/)?(?:.*@)?)?(?(?:[^:/\s]+(?::[0-9]+)?[:/])?(?[^?\s]*(\.git))))(?[^?\s]*)\?(?.+)$/, ); // regex to match URLs with "_git" delimiter const underscoreGitRegex = regEx( - /^(?:git::)?(?(?:(?:(?:http|https|ssh):\/\/)?(?:.*@)?)?(?(?:[^:/\s]+(?::[0-9]+)?[:/])?(?[^?\s]*)(_git\/[^/\s]+)))(?[^?\s]*)\?ref=(?.+)$/, + /^(?:git::)?(?(?:(?:(?:http|https|ssh):\/\/)?(?:.*@)?)?(?(?:[^:/\s]+(?::[0-9]+)?[:/])?(?[^?\s]*)(_git\/[^/\s]+)))(?[^?\s]*)\?(?.+)$/, ); // regex to match URLs having an extra "//" const gitUrlWithPath = regEx( - /^(?:git::)?(?(?:(?:(?:http|https|ssh):\/\/)?(?:.*@)?)?(?(?:[^:/\s]+(?::[0-9]+)?[:/])(?[^?\s]+)))(?:\/\/)(?[^?\s]+)\?ref=(?.+)$/, + /^(?:git::)?(?(?:(?:(?:http|https|ssh):\/\/)?(?:.*@)?)?(?(?:[^:/\s]+(?::[0-9]+)?[:/])(?[^?\s]+)))(?:\/\/)(?[^?\s]+)\?(?.+)$/, ); export function extractResource(base: string): PackageDependency | null { @@ -50,10 +51,20 @@ export function extractResource(base: string): PackageDependency | null { return null; } - const { path } = match.groups; + const { path, queryString } = match.groups; + const params = querystring.parse(queryString); + const refParam = Array.isArray(params.ref) ? params.ref[0] : params.ref; + const versionParam = Array.isArray(params.version) + ? params.version[0] + : params.version; + const currentValue = refParam ?? versionParam; + if (!currentValue) { + return null; + } + if (regEx(/(?:github\.com)(:|\/)/).test(path)) { return { - currentValue: match.groups.currentValue, + currentValue, datasource: GithubTagsDatasource.id, depName: match.groups.project.replace('.git', ''), }; @@ -63,7 +74,7 @@ export function extractResource(base: string): PackageDependency | null { datasource: GitTagsDatasource.id, depName: path.replace('.git', ''), packageName: match.groups.url, - currentValue: match.groups.currentValue, + currentValue, }; } diff --git a/lib/modules/manager/npm/artifacts.spec.ts b/lib/modules/manager/npm/artifacts.spec.ts index 7cb52f4dbf3c11..c241b15189df82 100644 --- a/lib/modules/manager/npm/artifacts.spec.ts +++ b/lib/modules/manager/npm/artifacts.spec.ts @@ -9,6 +9,7 @@ import { GlobalConfig } from '../../../config/global'; import type { RepoGlobalConfig } from '../../../config/types'; import * as docker from '../../../util/exec/docker'; import type { UpdateArtifactsConfig, Upgrade } from '../types'; +import * as rules from './post-update/rules'; import { updateArtifacts } from '.'; jest.mock('../../../util/exec/env'); @@ -38,6 +39,8 @@ const validDepUpdate = { } satisfies Upgrade>; describe('modules/manager/npm/artifacts', () => { + const spyProcessHostRules = jest.spyOn(rules, 'processHostRules'); + beforeEach(() => { env.getChildProcessEnv.mockReturnValue({ ...envMock.basic, @@ -46,6 +49,10 @@ describe('modules/manager/npm/artifacts', () => { }); GlobalConfig.set(adminConfig); docker.resetPrefetchedImages(); + spyProcessHostRules.mockReturnValue({ + additionalNpmrcContent: [], + additionalYarnRcYml: undefined, + }); }); it('returns null if no packageManager updates present', async () => { @@ -98,6 +105,7 @@ describe('modules/manager/npm/artifacts', () => { it('returns updated package.json', async () => { fs.readLocalFile + .mockResolvedValueOnce('# dummy') // for npmrc .mockResolvedValueOnce('{}') // for node constraints .mockResolvedValue('some new content'); // for updated package.json const execSnapshots = mockExecAll(); @@ -124,7 +132,9 @@ describe('modules/manager/npm/artifacts', () => { it('supports docker mode', async () => { GlobalConfig.set(dockerAdminConfig); const execSnapshots = mockExecAll(); - fs.readLocalFile.mockResolvedValueOnce('some new content'); + fs.readLocalFile + .mockResolvedValueOnce('# dummy') // for npmrc + .mockResolvedValueOnce('some new content'); const res = await updateArtifacts({ packageFileName: 'package.json', @@ -171,7 +181,9 @@ describe('modules/manager/npm/artifacts', () => { it('supports install mode', async () => { GlobalConfig.set({ ...adminConfig, binarySource: 'install' }); const execSnapshots = mockExecAll(); - fs.readLocalFile.mockResolvedValueOnce('some new content'); + fs.readLocalFile + .mockResolvedValueOnce('# dummy') // for npmrc + .mockResolvedValueOnce('some new content'); const res = await updateArtifacts({ packageFileName: 'package.json', diff --git a/lib/modules/manager/npm/artifacts.ts b/lib/modules/manager/npm/artifacts.ts index 082dc4348821eb..408da129fcc3bb 100644 --- a/lib/modules/manager/npm/artifacts.ts +++ b/lib/modules/manager/npm/artifacts.ts @@ -6,7 +6,13 @@ import { readLocalFile, writeLocalFile } from '../../../util/fs'; import { regEx } from '../../../util/regex'; import type { UpdateArtifact, UpdateArtifactsResult } from '../types'; import { getNodeToolConstraint } from './post-update/node-version'; +import { processHostRules } from './post-update/rules'; import { lazyLoadPackageJson } from './post-update/utils'; +import { + getNpmrcContent, + resetNpmrcContent, + updateNpmrcContent, +} from './utils'; // eg. 8.15.5+sha256.4b4efa12490e5055d59b9b9fc9438b7d581a6b7af3b5675eb5c5f447cee1a589 const versionWithHashRegString = '^(?.*)\\+(?.*)'; @@ -43,6 +49,8 @@ export async function updateArtifacts({ // Asumming that corepack only needs to modify the package.json file in the root folder // As it should not be regular practice to have different package managers in different workspaces const pkgFileDir = upath.dirname(packageFileName); + const { additionalNpmrcContent } = processHostRules(); + const npmrcContent = await getNpmrcContent(pkgFileDir); const lazyPkgJson = lazyLoadPackageJson(pkgFileDir); const cmd = `corepack use ${depName}@${newVersion}`; @@ -66,9 +74,10 @@ export async function updateArtifacts({ userConfiguredEnv: config.env, }; + await updateNpmrcContent(pkgFileDir, npmrcContent, additionalNpmrcContent); try { await exec(cmd, execOptions); - + await resetNpmrcContent(pkgFileDir, npmrcContent); const newPackageFileContent = await readLocalFile(packageFileName, 'utf8'); if ( !newPackageFileContent || @@ -88,6 +97,7 @@ export async function updateArtifacts({ ]; } catch (err) { logger.warn({ err }, 'Error updating package.json'); + await resetNpmrcContent(pkgFileDir, npmrcContent); return [ { artifactError: { diff --git a/lib/modules/manager/npm/post-update/index.ts b/lib/modules/manager/npm/post-update/index.ts index c83a3971443eee..d7f559dc34bb57 100644 --- a/lib/modules/manager/npm/post-update/index.ts +++ b/lib/modules/manager/npm/post-update/index.ts @@ -6,7 +6,6 @@ import { logger } from '../../../../logger'; import { ExternalHostError } from '../../../../types/errors/external-host-error'; import { getChildProcessEnv } from '../../../../util/exec/env'; import { - deleteLocalFile, ensureCacheDir, getSiblingFileName, readLocalFile, @@ -23,7 +22,13 @@ import { scm } from '../../../platform/scm'; import type { PackageFile, PostUpdateConfig, Upgrade } from '../../types'; import { getZeroInstallPaths } from '../extract/yarn'; import type { NpmManagerData } from '../types'; -import { composeLockFile, parseLockFile } from '../utils'; +import { + composeLockFile, + getNpmrcContent, + parseLockFile, + resetNpmrcContent, + updateNpmrcContent, +} from '../utils'; import * as npm from './npm'; import * as pnpm from './pnpm'; import { processHostRules } from './rules'; @@ -245,60 +250,6 @@ export async function writeUpdatedPackageFiles( } } -async function getNpmrcContent(dir: string): Promise { - const npmrcFilePath = upath.join(dir, '.npmrc'); - let originalNpmrcContent: string | null = null; - try { - originalNpmrcContent = await readLocalFile(npmrcFilePath, 'utf8'); - } catch /* istanbul ignore next */ { - originalNpmrcContent = null; - } - if (originalNpmrcContent) { - logger.debug(`npmrc file ${npmrcFilePath} found in repository`); - } - return originalNpmrcContent; -} - -async function updateNpmrcContent( - dir: string, - originalContent: string | null, - additionalLines: string[], -): Promise { - const npmrcFilePath = upath.join(dir, '.npmrc'); - const newNpmrc = originalContent - ? [originalContent, ...additionalLines] - : additionalLines; - try { - const newContent = newNpmrc.join('\n'); - if (newContent !== originalContent) { - logger.debug(`Writing updated .npmrc file to ${npmrcFilePath}`); - await writeLocalFile(npmrcFilePath, `${newContent}\n`); - } - } catch /* istanbul ignore next */ { - logger.warn('Unable to write custom npmrc file'); - } -} - -async function resetNpmrcContent( - dir: string, - originalContent: string | null, -): Promise { - const npmrcFilePath = upath.join(dir, '.npmrc'); - if (originalContent) { - try { - await writeLocalFile(npmrcFilePath, originalContent); - } catch /* istanbul ignore next */ { - logger.warn('Unable to reset npmrc to original contents'); - } - } else { - try { - await deleteLocalFile(npmrcFilePath); - } catch /* istanbul ignore next */ { - logger.warn('Unable to delete custom npmrc'); - } - } -} - // istanbul ignore next async function updateYarnOffline( lockFileDir: string, diff --git a/lib/modules/manager/npm/utils.ts b/lib/modules/manager/npm/utils.ts index 55d757d475bc88..ed58e4b202c10f 100644 --- a/lib/modules/manager/npm/utils.ts +++ b/lib/modules/manager/npm/utils.ts @@ -1,5 +1,11 @@ import detectIndent from 'detect-indent'; +import upath from 'upath'; import { logger } from '../../../logger'; +import { + deleteLocalFile, + readLocalFile, + writeLocalFile, +} from '../../../util/fs'; import type { LockFile, ParseLockFileResult } from './types'; export function parseLockFile(lockFile: string): ParseLockFileResult { @@ -18,3 +24,57 @@ export function parseLockFile(lockFile: string): ParseLockFileResult { export function composeLockFile(lockFile: LockFile, indent: string): string { return JSON.stringify(lockFile, null, indent) + '\n'; } + +export async function getNpmrcContent(dir: string): Promise { + const npmrcFilePath = upath.join(dir, '.npmrc'); + let originalNpmrcContent: string | null = null; + try { + originalNpmrcContent = await readLocalFile(npmrcFilePath, 'utf8'); + } catch /* istanbul ignore next */ { + originalNpmrcContent = null; + } + if (originalNpmrcContent) { + logger.debug(`npmrc file ${npmrcFilePath} found in repository`); + } + return originalNpmrcContent; +} + +export async function updateNpmrcContent( + dir: string, + originalContent: string | null, + additionalLines: string[], +): Promise { + const npmrcFilePath = upath.join(dir, '.npmrc'); + const newNpmrc = originalContent + ? [originalContent, ...additionalLines] + : additionalLines; + try { + const newContent = newNpmrc.join('\n'); + if (newContent !== originalContent) { + logger.debug(`Writing updated .npmrc file to ${npmrcFilePath}`); + await writeLocalFile(npmrcFilePath, `${newContent}\n`); + } + } catch /* istanbul ignore next */ { + logger.warn('Unable to write custom npmrc file'); + } +} + +export async function resetNpmrcContent( + dir: string, + originalContent: string | null, +): Promise { + const npmrcFilePath = upath.join(dir, '.npmrc'); + if (originalContent) { + try { + await writeLocalFile(npmrcFilePath, originalContent); + } catch /* istanbul ignore next */ { + logger.warn('Unable to reset npmrc to original contents'); + } + } else { + try { + await deleteLocalFile(npmrcFilePath); + } catch /* istanbul ignore next */ { + logger.warn('Unable to delete custom npmrc'); + } + } +} diff --git a/lib/modules/manager/nuget/package-tree.ts b/lib/modules/manager/nuget/package-tree.ts index 56b3f874ff6470..fd4595e31d453e 100644 --- a/lib/modules/manager/nuget/package-tree.ts +++ b/lib/modules/manager/nuget/package-tree.ts @@ -1,5 +1,5 @@ import is from '@sindresorhus/is'; -import { Graph } from 'graph-data-structure'; +import { Graph, hasCycle } from 'graph-data-structure'; import upath from 'upath'; import { logger } from '../../../logger'; import { minimatchFilter } from '../../../util/minimatch'; @@ -18,7 +18,7 @@ export async function getDependentPackageFiles( isCentralManagement = false, ): Promise { const packageFiles = await getAllPackageFiles(); - const graph: ReturnType = Graph(); + const graph = new Graph(); if (isCentralManagement) { graph.addNode(packageFileName); @@ -62,7 +62,7 @@ export async function getDependentPackageFiles( graph.addEdge(ref, f); } - if (graph.hasCycle()) { + if (hasCycle(graph)) { throw new Error('Circular reference detected in NuGet package files'); } } @@ -84,12 +84,12 @@ export async function getDependentPackageFiles( */ function recursivelyGetDependentPackageFiles( packageFileName: string, - graph: ReturnType, + graph: Graph, deps: Map, ): void { const dependents = graph.adjacent(packageFileName); - if (dependents.length === 0) { + if (!dependents || dependents.size === 0) { deps.set(packageFileName, true); return; } diff --git a/lib/modules/manager/pep621/processors/pdm.spec.ts b/lib/modules/manager/pep621/processors/pdm.spec.ts index 05ad3d73dbfaf9..7d7f23252ad9c9 100644 --- a/lib/modules/manager/pep621/processors/pdm.spec.ts +++ b/lib/modules/manager/pep621/processors/pdm.spec.ts @@ -4,6 +4,7 @@ import { fs, mockedFunction } from '../../../../../test/util'; import { GlobalConfig } from '../../../../config/global'; import type { RepoGlobalConfig } from '../../../../config/types'; import { logger } from '../../../../logger'; +import * as hostRules from '../../../../util/host-rules'; import { getPkgReleases as _getPkgReleases } from '../../../datasource'; import type { UpdateArtifactsConfig } from '../../types'; import { depTypes } from '../utils'; @@ -290,5 +291,64 @@ describe('modules/manager/pep621/processors/pdm', () => { }, ]); }); + + it('sets Git environment variables', async () => { + hostRules.add({ + matchHost: 'https://example.com', + username: 'user', + password: 'pass', + }); + const execSnapshots = mockExecAll(); + GlobalConfig.set(adminConfig); + fs.getSiblingFileName.mockReturnValueOnce('pdm.lock'); + fs.readLocalFile.mockResolvedValueOnce('test content'); + fs.readLocalFile.mockResolvedValueOnce('changed test content'); + // python + getPkgReleases.mockResolvedValueOnce({ + releases: [{ version: '3.11.1' }, { version: '3.11.2' }], + }); + // pdm + getPkgReleases.mockResolvedValueOnce({ + releases: [{ version: 'v2.6.1' }, { version: 'v2.5.0' }], + }); + + const result = await processor.updateArtifacts( + { + packageFileName: 'folder/pyproject.toml', + newPackageFileContent: '', + config: { + updateType: 'lockFileMaintenance', + }, + updatedDeps: [], + }, + {}, + ); + expect(result).toEqual([ + { + file: { + contents: 'changed test content', + path: 'pdm.lock', + type: 'addition', + }, + }, + ]); + expect(execSnapshots).toMatchObject([ + { + cmd: 'pdm update --no-sync --update-eager', + options: { + cwd: '/tmp/github/some/repo/folder', + env: { + GIT_CONFIG_COUNT: '3', + GIT_CONFIG_KEY_0: 'url.https://user:pass@example.com/.insteadOf', + GIT_CONFIG_KEY_1: 'url.https://user:pass@example.com/.insteadOf', + GIT_CONFIG_KEY_2: 'url.https://user:pass@example.com/.insteadOf', + GIT_CONFIG_VALUE_0: 'ssh://git@example.com/', + GIT_CONFIG_VALUE_1: 'git@example.com:', + GIT_CONFIG_VALUE_2: 'https://example.com/', + }, + }, + }, + ]); + }); }); }); diff --git a/lib/modules/manager/pep621/processors/pdm.ts b/lib/modules/manager/pep621/processors/pdm.ts index d991c78cc3a9c0..a78097e74deeb0 100644 --- a/lib/modules/manager/pep621/processors/pdm.ts +++ b/lib/modules/manager/pep621/processors/pdm.ts @@ -5,6 +5,7 @@ import { logger } from '../../../../logger'; import { exec } from '../../../../util/exec'; import type { ExecOptions, ToolConstraint } from '../../../../util/exec/types'; import { getSiblingFileName, readLocalFile } from '../../../../util/fs'; +import { getGitEnvironmentVariables } from '../../../../util/git/auth'; import { Result } from '../../../../util/result'; import { PypiDatasource } from '../../../datasource/pypi'; import type { @@ -116,8 +117,12 @@ export class PdmProcessor implements PyProjectProcessor { constraint: config.constraints?.pdm, }; + const extraEnv = { + ...getGitEnvironmentVariables(['pep621']), + }; const execOptions: ExecOptions = { cwdFile: packageFileName, + extraEnv, docker: {}, userConfiguredEnv: config.env, toolConstraints: [pythonConstraint, pdmConstraint], diff --git a/lib/modules/manager/pep621/processors/uv.spec.ts b/lib/modules/manager/pep621/processors/uv.spec.ts index e570a1178076cf..772a3050644d1d 100644 --- a/lib/modules/manager/pep621/processors/uv.spec.ts +++ b/lib/modules/manager/pep621/processors/uv.spec.ts @@ -1,6 +1,12 @@ +import { GoogleAuth as _googleAuth } from 'google-auth-library'; import { join } from 'upath'; import { mockExecAll } from '../../../../../test/exec-util'; -import { fs, hostRules, mockedFunction } from '../../../../../test/util'; +import { + fs, + hostRules, + mocked, + mockedFunction, +} from '../../../../../test/util'; import { GlobalConfig } from '../../../../config/global'; import type { RepoGlobalConfig } from '../../../../config/types'; import { getPkgReleases as _getPkgReleases } from '../../../datasource'; @@ -13,9 +19,11 @@ import type { UpdateArtifactsConfig } from '../../types'; import { depTypes } from '../utils'; import { UvProcessor } from './uv'; +jest.mock('google-auth-library'); jest.mock('../../../../util/fs'); jest.mock('../../../datasource'); +const googleAuth = mocked(_googleAuth); const getPkgReleases = mockedFunction(_getPkgReleases); const config: UpdateArtifactsConfig = {}; @@ -295,6 +303,11 @@ describe('modules/manager/pep621/processors/uv', () => { username: 'user', password: 'pass', }); + googleAuth.mockImplementationOnce( + jest.fn().mockImplementationOnce(() => ({ + getAccessToken: jest.fn().mockResolvedValue('some-token'), + })), + ); fs.getSiblingFileName.mockReturnValueOnce('uv.lock'); fs.readLocalFile.mockResolvedValueOnce('test content'); fs.readLocalFile.mockResolvedValueOnce('changed test content'); @@ -332,6 +345,82 @@ describe('modules/manager/pep621/processors/uv', () => { datasource: GithubTagsDatasource.id, registryUrls: ['https://github.com'], }, + { + packageName: 'dep5', + depType: depTypes.dependencies, + datasource: PypiDatasource.id, + registryUrls: [ + 'https://someregion-python.pkg.dev/some-project/some-repo/', + ], + }, + ]; + const result = await processor.updateArtifacts( + { + packageFileName: 'pyproject.toml', + newPackageFileContent: '', + config: {}, + updatedDeps, + }, + {}, + ); + expect(result).toEqual([ + { + file: { + contents: 'changed test content', + path: 'uv.lock', + type: 'addition', + }, + }, + ]); + expect(execSnapshots).toMatchObject([ + { + cmd: 'uv lock --upgrade-package dep1 --upgrade-package dep2 --upgrade-package dep3 --upgrade-package dep4 --upgrade-package dep5', + options: { + env: { + GIT_CONFIG_COUNT: '3', + GIT_CONFIG_KEY_0: 'url.https://user:pass@example.com/.insteadOf', + GIT_CONFIG_KEY_1: 'url.https://user:pass@example.com/.insteadOf', + GIT_CONFIG_KEY_2: 'url.https://user:pass@example.com/.insteadOf', + GIT_CONFIG_VALUE_0: 'ssh://git@example.com/', + GIT_CONFIG_VALUE_1: 'git@example.com:', + GIT_CONFIG_VALUE_2: 'https://example.com/', + UV_EXTRA_INDEX_URL: + 'https://foobar.com/ https://user:pass@example.com/ https://oauth2accesstoken:some-token@someregion-python.pkg.dev/some-project/some-repo/', + }, + }, + }, + ]); + }); + + it('continues if Google auth is not configured', async () => { + const execSnapshots = mockExecAll(); + GlobalConfig.set(adminConfig); + googleAuth.mockImplementation( + jest.fn().mockImplementation(() => ({ + getAccessToken: jest.fn().mockResolvedValue(undefined), + })), + ); + fs.getSiblingFileName.mockReturnValueOnce('uv.lock'); + fs.readLocalFile.mockResolvedValueOnce('test content'); + fs.readLocalFile.mockResolvedValueOnce('changed test content'); + // python + getPkgReleases.mockResolvedValueOnce({ + releases: [{ version: '3.11.1' }, { version: '3.11.2' }], + }); + // uv + getPkgReleases.mockResolvedValueOnce({ + releases: [{ version: '0.2.35' }, { version: '0.2.28' }], + }); + + const updatedDeps = [ + { + packageName: 'dep', + depType: depTypes.dependencies, + datasource: PypiDatasource.id, + registryUrls: [ + 'https://someregion-python.pkg.dev/some-project/some-repo/simple/', + ], + }, ]; const result = await processor.updateArtifacts( { @@ -353,11 +442,11 @@ describe('modules/manager/pep621/processors/uv', () => { ]); expect(execSnapshots).toMatchObject([ { - cmd: 'uv lock --upgrade-package dep1 --upgrade-package dep2 --upgrade-package dep3 --upgrade-package dep4', + cmd: 'uv lock --upgrade-package dep', options: { env: { UV_EXTRA_INDEX_URL: - 'https://foobar.com/ https://user:pass@example.com/', + 'https://someregion-python.pkg.dev/some-project/some-repo/simple/', }, }, }, diff --git a/lib/modules/manager/pep621/processors/uv.ts b/lib/modules/manager/pep621/processors/uv.ts index 4bc86b3fe8b38e..5de57d565e5c52 100644 --- a/lib/modules/manager/pep621/processors/uv.ts +++ b/lib/modules/manager/pep621/processors/uv.ts @@ -6,10 +6,12 @@ import type { HostRule } from '../../../../types'; import { exec } from '../../../../util/exec'; import type { ExecOptions, ToolConstraint } from '../../../../util/exec/types'; import { getSiblingFileName, readLocalFile } from '../../../../util/fs'; +import { getGitEnvironmentVariables } from '../../../../util/git/auth'; import { find } from '../../../../util/host-rules'; import { Result } from '../../../../util/result'; import { parseUrl } from '../../../../util/url'; import { PypiDatasource } from '../../../datasource/pypi'; +import { getGoogleAuthTokenRaw } from '../../../datasource/util'; import type { PackageDependency, UpdateArtifact, @@ -129,7 +131,8 @@ export class UvProcessor implements PyProjectProcessor { }; const extraEnv = { - ...getUvExtraIndexUrl(updateArtifact.updatedDeps), + ...getGitEnvironmentVariables(['pep621']), + ...(await getUvExtraIndexUrl(updateArtifact.updatedDeps)), }; const execOptions: ExecOptions = { cwdFile: packageFileName, @@ -214,7 +217,7 @@ function getMatchingHostRule(url: string | undefined): HostRule { return find({ hostType: PypiDatasource.id, url }); } -function getUvExtraIndexUrl(deps: Upgrade[]): NodeJS.ProcessEnv { +async function getUvExtraIndexUrl(deps: Upgrade[]): Promise { const pyPiRegistryUrls = deps .filter((dep) => dep.datasource === PypiDatasource.id) .map((dep) => dep.registryUrls) @@ -229,11 +232,21 @@ function getUvExtraIndexUrl(deps: Upgrade[]): NodeJS.ProcessEnv { } const rule = getMatchingHostRule(parsedUrl.toString()); - if (rule.username) { - parsedUrl.username = rule.username; - } - if (rule.password) { - parsedUrl.password = rule.password; + if (rule.username || rule.password) { + if (rule.username) { + parsedUrl.username = rule.username; + } + if (rule.password) { + parsedUrl.password = rule.password; + } + } else if (parsedUrl.hostname.endsWith('.pkg.dev')) { + const accessToken = await getGoogleAuthTokenRaw(); + if (accessToken) { + parsedUrl.username = 'oauth2accesstoken'; + parsedUrl.password = accessToken; + } else { + logger.once.debug({ registryUrl }, 'Could not get Google access token'); + } } extraIndexUrls.push(parsedUrl.toString()); diff --git a/lib/modules/manager/pep621/readme.md b/lib/modules/manager/pep621/readme.md index db3ac79b0c7268..0084470bf51d5f 100644 --- a/lib/modules/manager/pep621/readme.md +++ b/lib/modules/manager/pep621/readme.md @@ -16,3 +16,20 @@ Available `depType`s: - `tool.uv.dev-dependencies` - `tool.uv.sources` - `tool.hatch.envs.` + +### Private Modules Authentication + +Before running the `pdm` or `uv` commands to update the `pdm.lock` or `uv.lock` respectively, Renovate exports `git` [`insteadOf`](https://git-scm.com/docs/git-config#Documentation/git-config.txt-urlltbasegtinsteadOf) directives in environment variables. + +Renovate uses this logic before it updates any "artifacts": + +The token from the `hostRules` entry matching `hostType=github` and `matchHost=api.github.com` is added as the default authentication for `github.com`. +For those running against `github.com`, this token will be the default platform token. + +Next, all `hostRules` with both a token or username/password and `matchHost` will be fetched, except for any `github.com` one from above. + +Rules from this list are converted to environment variable directives if they match _any_ of these characteristics: + +- No `hostType` is defined, or +- `hostType` is `pep621`, or +- `hostType` is a platform (`github`, `gitlab`, `azure`, etc.) diff --git a/lib/modules/manager/pip-compile/utils.ts b/lib/modules/manager/pip-compile/utils.ts index 50fcdde6585feb..8ae1d5126903d4 100644 --- a/lib/modules/manager/pip-compile/utils.ts +++ b/lib/modules/manager/pip-compile/utils.ts @@ -1,4 +1,4 @@ -import { Graph } from 'graph-data-structure'; +import { Graph, topologicalSort } from 'graph-data-structure'; import upath from 'upath'; import { logger } from '../../../logger'; import type { PackageFile } from '../types'; @@ -9,11 +9,11 @@ export function sortPackageFiles( packageFiles: Map, ): PackageFile[] { const result: PackageFile[] = []; - const graph: ReturnType = Graph(); + const graph = new Graph(); depsBetweenFiles.forEach(({ sourceFile, outputFile }) => { graph.addEdge(sourceFile, outputFile); }); - const sorted = graph.topologicalSort(); + const sorted = topologicalSort(graph); for (const file of sorted) { if (packageFiles.has(file)) { const packageFile = packageFiles.get(file)!; diff --git a/lib/modules/manager/terraform/extractors/others/modules.spec.ts b/lib/modules/manager/terraform/extractors/others/modules.spec.ts index 845e7b7c46e008..7062f4d39eb494 100644 --- a/lib/modules/manager/terraform/extractors/others/modules.spec.ts +++ b/lib/modules/manager/terraform/extractors/others/modules.spec.ts @@ -4,6 +4,7 @@ import { bitbucketRefMatchRegex, gitTagsRefMatchRegex, githubRefMatchRegex, + hostnameMatchRegex, } from './modules'; describe('modules/manager/terraform/extractors/others/modules', () => { @@ -300,4 +301,22 @@ describe('modules/manager/terraform/extractors/others/modules', () => { }); }); }); + + describe('hostnameMatchRegex', () => { + it('should extact hostname from source url', () => { + const host1 = hostnameMatchRegex.exec( + 'git-lab.git-server.com/my/terraform/module', + )?.groups; + const host2 = hostnameMatchRegex.exec( + 'example.com/my/terraform/module', + )?.groups; + + expect(host1).toEqual({ + hostname: 'git-lab.git-server.com', + }); + expect(host2).toEqual({ + hostname: 'example.com', + }); + }); + }); }); diff --git a/lib/modules/manager/terraform/extractors/others/modules.ts b/lib/modules/manager/terraform/extractors/others/modules.ts index 5ba4f31c3ca122..21cbddca1f9dd3 100644 --- a/lib/modules/manager/terraform/extractors/others/modules.ts +++ b/lib/modules/manager/terraform/extractors/others/modules.ts @@ -21,7 +21,9 @@ export const gitTagsRefMatchRegex = regEx( export const azureDevOpsSshRefMatchRegex = regEx( /(?:git::)?(?git@ssh\.dev\.azure\.com:v3\/(?[^/]*)\/(?[^/]*)\/(?[^/]*))(?.*)?\?(depth=\d+&)?ref=(?.*?)(&depth=\d+)?$/, ); -const hostnameMatchRegex = regEx(/^(?([\w|\d]+\.)+[\w|\d]+)/); +export const hostnameMatchRegex = regEx( + /^(?[a-zA-Z\d]([a-zA-Z\d-]*\.)+[a-zA-Z\d]+)/, +); export class ModuleExtractor extends DependencyExtractor { getCheckList(): string[] { diff --git a/lib/modules/manager/terragrunt/modules.ts b/lib/modules/manager/terragrunt/modules.ts index 9d71e1e8aa6483..0079b18581303b 100644 --- a/lib/modules/manager/terragrunt/modules.ts +++ b/lib/modules/manager/terragrunt/modules.ts @@ -20,7 +20,9 @@ export const gitTagsRefMatchRegex = regEx( export const tfrVersionMatchRegex = regEx( /tfr:\/\/(?.*?)\/(?[^/]+?)\/(?[^/]+?)\/(?[^/?]+).*\?(?:ref|version)=(?.*?)$/, ); -const hostnameMatchRegex = regEx(/^(?([\w|\d]+\.)+[\w|\d]+)/); +const hostnameMatchRegex = regEx( + /^(?[a-zA-Z\d]([a-zA-Z\d-]*\.)+[a-zA-Z\d]+)/, +); export function extractTerragruntModule( startingLine: number, diff --git a/lib/modules/platform/gitlab/__snapshots__/index.spec.ts.snap b/lib/modules/platform/gitlab/__snapshots__/index.spec.ts.snap index 7d0bdd4c005485..b5e23476024b19 100644 --- a/lib/modules/platform/gitlab/__snapshots__/index.spec.ts.snap +++ b/lib/modules/platform/gitlab/__snapshots__/index.spec.ts.snap @@ -1,79 +1,12 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`modules/platform/gitlab/index createPr(branchName, title, body) raises with squash enabled when repository squash option is always 1`] = ` -{ - "id": 1, - "iid": 12345, - "number": 12345, - "sourceBranch": "some-branch", - "title": "some title", -} -`; - -exports[`modules/platform/gitlab/index createPr(branchName, title, body) raises with squash enabled when repository squash option is default_on 1`] = ` -{ - "id": 1, - "iid": 12345, - "number": 12345, - "sourceBranch": "some-branch", - "title": "some title", -} -`; - -exports[`modules/platform/gitlab/index createPr(branchName, title, body) returns the PR 1`] = ` -{ - "id": 1, - "iid": 12345, - "number": 12345, - "sourceBranch": "some-branch", - "title": "some title", -} -`; - -exports[`modules/platform/gitlab/index createPr(branchName, title, body) supports draftPR on < 13.2 1`] = ` -{ - "id": 1, - "iid": 12345, - "isDraft": true, - "number": 12345, - "sourceBranch": "some-branch", - "title": "some title", -} -`; - -exports[`modules/platform/gitlab/index createPr(branchName, title, body) supports draftPR on >= 13.2 1`] = ` -{ - "id": 1, - "iid": 12345, - "isDraft": true, - "number": 12345, - "sourceBranch": "some-branch", - "title": "some title", -} -`; - -exports[`modules/platform/gitlab/index createPr(branchName, title, body) uses default branch 1`] = ` -{ - "id": 1, - "iid": 12345, - "number": 12345, - "sourceBranch": "some-branch", - "title": "some title", -} -`; - exports[`modules/platform/gitlab/index getBranchPr(branchName) should return the PR object 1`] = ` { "bodyStruct": { "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", }, "hasAssignees": false, - "headPipelineSha": undefined, - "headPipelineStatus": undefined, - "labels": undefined, "number": 91, - "reviewers": undefined, - "sha": undefined, "sourceBranch": "some-branch", "state": "open", "targetBranch": "master", @@ -87,13 +20,8 @@ exports[`modules/platform/gitlab/index getBranchPr(branchName) should strip depr "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", }, "hasAssignees": false, - "headPipelineSha": undefined, - "headPipelineStatus": undefined, "isDraft": true, - "labels": undefined, "number": 91, - "reviewers": undefined, - "sha": undefined, "sourceBranch": "some-branch", "state": "open", "targetBranch": "master", @@ -107,13 +35,8 @@ exports[`modules/platform/gitlab/index getBranchPr(branchName) should strip draf "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", }, "hasAssignees": false, - "headPipelineSha": undefined, - "headPipelineStatus": undefined, "isDraft": true, - "labels": undefined, "number": 91, - "reviewers": undefined, - "sha": undefined, "sourceBranch": "some-branch", "state": "open", "targetBranch": "master", @@ -127,13 +50,8 @@ exports[`modules/platform/gitlab/index getPr(prNo) removes deprecated draft pref "hash": "23f41dbec0785a6c77457dd6ebf99ae5970c5fffc9f7a8ad7f66c1b8eeba5b90", }, "hasAssignees": false, - "headPipelineSha": undefined, - "headPipelineStatus": undefined, "isDraft": true, - "labels": undefined, "number": 12345, - "reviewers": undefined, - "sha": undefined, "sourceBranch": "some-branch", "state": "merged", "targetBranch": "master", @@ -147,13 +65,8 @@ exports[`modules/platform/gitlab/index getPr(prNo) removes draft prefix from ret "hash": "23f41dbec0785a6c77457dd6ebf99ae5970c5fffc9f7a8ad7f66c1b8eeba5b90", }, "hasAssignees": false, - "headPipelineSha": undefined, - "headPipelineStatus": undefined, "isDraft": true, - "labels": undefined, "number": 12345, - "reviewers": undefined, - "sha": undefined, "sourceBranch": "some-branch", "state": "merged", "targetBranch": "master", @@ -167,12 +80,7 @@ exports[`modules/platform/gitlab/index getPr(prNo) returns the PR 1`] = ` "hash": "23f41dbec0785a6c77457dd6ebf99ae5970c5fffc9f7a8ad7f66c1b8eeba5b90", }, "hasAssignees": false, - "headPipelineSha": undefined, - "headPipelineStatus": undefined, - "labels": undefined, "number": 12345, - "reviewers": undefined, - "sha": undefined, "sourceBranch": "some-branch", "state": "merged", "targetBranch": "master", @@ -186,12 +94,7 @@ exports[`modules/platform/gitlab/index getPr(prNo) returns the PR with nonexisti "hash": "23f41dbec0785a6c77457dd6ebf99ae5970c5fffc9f7a8ad7f66c1b8eeba5b90", }, "hasAssignees": true, - "headPipelineSha": undefined, - "headPipelineStatus": undefined, - "labels": undefined, "number": 12345, - "reviewers": undefined, - "sha": undefined, "sourceBranch": "some-branch", "state": "open", "targetBranch": "master", @@ -205,12 +108,7 @@ exports[`modules/platform/gitlab/index getPr(prNo) returns the mergeable PR 1`] "hash": "23f41dbec0785a6c77457dd6ebf99ae5970c5fffc9f7a8ad7f66c1b8eeba5b90", }, "hasAssignees": true, - "headPipelineSha": undefined, - "headPipelineStatus": undefined, - "labels": undefined, "number": 12345, - "reviewers": undefined, - "sha": undefined, "sourceBranch": "some-branch", "state": "open", "targetBranch": "master", diff --git a/lib/modules/platform/gitlab/index.spec.ts b/lib/modules/platform/gitlab/index.spec.ts index 1fc1fce268550a..6eb62b886f7c40 100644 --- a/lib/modules/platform/gitlab/index.spec.ts +++ b/lib/modules/platform/gitlab/index.spec.ts @@ -18,6 +18,7 @@ import type * as _git from '../../../util/git'; import type { LongCommitSha } from '../../../util/git/types'; import type * as _hostRules from '../../../util/host-rules'; import { toBase64 } from '../../../util/string'; +import { getPrBodyStruct } from '../pr-body'; jest.mock('../../../util/host-rules', () => mockDeep()); jest.mock('../../../util/git'); @@ -1926,6 +1927,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }); const pr = await gitlab.createPr({ sourceBranch: 'some-branch', @@ -1934,7 +1938,12 @@ describe('modules/platform/gitlab/index', () => { prBody: 'the-body', labels: null, }); - expect(pr).toMatchSnapshot(); + expect(pr).toMatchObject({ + number: 12345, + title: 'some title', + sourceBranch: 'some-branch', + targetBranch: 'master', + }); }); it('uses default branch', async () => { @@ -1946,6 +1955,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }); const pr = await gitlab.createPr({ sourceBranch: 'some-branch', @@ -1954,7 +1966,12 @@ describe('modules/platform/gitlab/index', () => { prBody: 'the-body', labels: [], }); - expect(pr).toMatchSnapshot(); + expect(pr).toMatchObject({ + number: 12345, + title: 'some title', + sourceBranch: 'some-branch', + targetBranch: 'master', + }); }); it('supports draftPR on < 13.2', async () => { @@ -1966,6 +1983,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'WIP: some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }); const pr = await gitlab.createPr({ sourceBranch: 'some-branch', @@ -1974,7 +1994,12 @@ describe('modules/platform/gitlab/index', () => { prBody: 'the-body', draftPR: true, }); - expect(pr).toMatchSnapshot(); + expect(pr).toMatchObject({ + number: 12345, + title: 'some title', + sourceBranch: 'some-branch', + targetBranch: 'master', + }); }); it('supports draftPR on >= 13.2', async () => { @@ -1986,6 +2011,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'Draft: some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }); const pr = await gitlab.createPr({ sourceBranch: 'some-branch', @@ -1994,7 +2022,12 @@ describe('modules/platform/gitlab/index', () => { prBody: 'the-body', draftPR: true, }); - expect(pr).toMatchSnapshot(); + expect(pr).toMatchObject({ + number: 12345, + title: 'some title', + sourceBranch: 'some-branch', + targetBranch: 'master', + }); }); it('auto-accepts the MR when requested', async () => { @@ -2006,6 +2039,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }) .get('/api/v4/projects/undefined/merge_requests/12345') .reply(200) @@ -2024,9 +2060,7 @@ describe('modules/platform/gitlab/index', () => { usePlatformAutomerge: true, }, }), - ).toEqual({ - id: 1, - iid: 12345, + ).toMatchObject({ number: 12345, sourceBranch: 'some-branch', title: 'some title', @@ -2047,6 +2081,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }) .get('/api/v4/projects/undefined/merge_requests/12345') .reply(200, reply_body) @@ -2068,9 +2105,7 @@ describe('modules/platform/gitlab/index', () => { usePlatformAutomerge: true, }, }); - expect(pr).toEqual({ - id: 1, - iid: 12345, + expect(pr).toMatchObject({ number: 12345, sourceBranch: 'some-branch', title: 'some title', @@ -2104,6 +2139,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }) .get('/api/v4/projects/undefined/merge_requests/12345') .reply(200, reply_body) @@ -2123,9 +2161,7 @@ describe('modules/platform/gitlab/index', () => { usePlatformAutomerge: true, }, }); - expect(pr).toEqual({ - id: 1, - iid: 12345, + expect(pr).toMatchObject({ number: 12345, sourceBranch: 'some-branch', title: 'some title', @@ -2154,6 +2190,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }) .get('/api/v4/projects/undefined/merge_requests/12345') .reply(200, reply_body) @@ -2177,9 +2216,7 @@ describe('modules/platform/gitlab/index', () => { usePlatformAutomerge: true, }, }); - expect(pr).toEqual({ - id: 1, - iid: 12345, + expect(pr).toMatchObject({ number: 12345, sourceBranch: 'some-branch', title: 'some title', @@ -2225,6 +2262,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }) .get('/api/v4/projects/undefined/merge_requests/12345') .reply(200, reply_body) @@ -2239,9 +2279,7 @@ describe('modules/platform/gitlab/index', () => { usePlatformAutomerge: true, }, }); - expect(pr).toEqual({ - id: 1, - iid: 12345, + expect(pr).toMatchObject({ number: 12345, sourceBranch: 'some-branch', title: 'some title', @@ -2270,6 +2308,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }); const pr = await gitlab.createPr({ sourceBranch: 'some-branch', @@ -2278,7 +2319,11 @@ describe('modules/platform/gitlab/index', () => { prBody: 'the-body', labels: null, }); - expect(pr).toMatchSnapshot(); + expect(pr).toMatchObject({ + number: 12345, + sourceBranch: 'some-branch', + title: 'some title', + }); }); it('raises with squash enabled when repository squash option is always', async () => { @@ -2302,6 +2347,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }); const pr = await gitlab.createPr({ sourceBranch: 'some-branch', @@ -2310,7 +2358,11 @@ describe('modules/platform/gitlab/index', () => { prBody: 'the-body', labels: null, }); - expect(pr).toMatchSnapshot(); + expect(pr).toMatchObject({ + number: 12345, + sourceBranch: 'some-branch', + title: 'some title', + }); }); it('adds approval rule to ignore all approvals', async () => { @@ -2322,6 +2374,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }) .get('/api/v4/projects/undefined/merge_requests/12345') .reply(200) @@ -2353,15 +2408,11 @@ describe('modules/platform/gitlab/index', () => { gitLabIgnoreApprovals: true, }, }), - ).toMatchInlineSnapshot(` - { - "id": 1, - "iid": 12345, - "number": 12345, - "sourceBranch": "some-branch", - "title": "some title", - } - `); + ).toMatchObject({ + number: 12345, + sourceBranch: 'some-branch', + title: 'some title', + }); }); it('adds approval rule to ignore all approvals when platformAutomerge is false', async () => { @@ -2373,6 +2424,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }) .get('/api/v4/projects/undefined/merge_requests/12345/approval_rules') .reply(200, [ @@ -2398,9 +2452,7 @@ describe('modules/platform/gitlab/index', () => { gitLabIgnoreApprovals: true, }, }), - ).toEqual({ - id: 1, - iid: 12345, + ).toMatchObject({ number: 12345, sourceBranch: 'some-branch', title: 'some title', @@ -2416,6 +2468,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }) .get('/api/v4/projects/undefined/merge_requests/12345') .reply(200) @@ -2455,9 +2510,7 @@ describe('modules/platform/gitlab/index', () => { gitLabIgnoreApprovals: true, }, }), - ).toStrictEqual({ - id: 1, - iid: 12345, + ).toMatchObject({ number: 12345, sourceBranch: 'some-branch', title: 'some title', @@ -2473,6 +2526,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }) .get('/api/v4/projects/undefined/merge_requests/12345') .reply(200) @@ -2523,9 +2579,7 @@ describe('modules/platform/gitlab/index', () => { gitLabIgnoreApprovals: true, }, }), - ).toStrictEqual({ - id: 1, - iid: 12345, + ).toMatchObject({ number: 12345, sourceBranch: 'some-branch', title: 'some title', @@ -2541,6 +2595,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }) .get('/api/v4/projects/undefined/merge_requests/12345') .reply(200) @@ -2601,9 +2658,7 @@ describe('modules/platform/gitlab/index', () => { gitLabIgnoreApprovals: true, }, }), - ).toStrictEqual({ - id: 1, - iid: 12345, + ).toMatchObject({ number: 12345, sourceBranch: 'some-branch', title: 'some title', @@ -2619,6 +2674,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }) .get('/api/v4/projects/undefined/merge_requests/12345') .reply(200) @@ -2650,15 +2708,11 @@ describe('modules/platform/gitlab/index', () => { gitLabIgnoreApprovals: true, }, }), - ).toMatchInlineSnapshot(` - { - "id": 1, - "iid": 12345, - "number": 12345, - "sourceBranch": "some-branch", - "title": "some title", - } - `); + ).toMatchObject({ + number: 12345, + sourceBranch: 'some-branch', + title: 'some title', + }); }); it('silently ignores approval rules adding errors', async () => { @@ -2670,6 +2724,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }) .get('/api/v4/projects/undefined/merge_requests/12345') .reply(200) @@ -2701,15 +2758,11 @@ describe('modules/platform/gitlab/index', () => { gitLabIgnoreApprovals: true, }, }), - ).toMatchInlineSnapshot(` - { - "id": 1, - "iid": 12345, - "number": 12345, - "sourceBranch": "some-branch", - "title": "some title", - } - `); + ).toMatchObject({ + number: 12345, + sourceBranch: 'some-branch', + title: 'some title', + }); }); it('auto-approves when enabled', async () => { @@ -2721,6 +2774,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }) .post('/api/v4/projects/undefined/merge_requests/12345/approve') .reply(200); @@ -2735,9 +2791,7 @@ describe('modules/platform/gitlab/index', () => { autoApprove: true, }, }), - ).toStrictEqual({ - id: 1, - iid: 12345, + ).toMatchObject({ number: 12345, sourceBranch: 'some-branch', title: 'some title', @@ -2753,6 +2807,9 @@ describe('modules/platform/gitlab/index', () => { id: 1, iid: 12345, title: 'some title', + source_branch: 'some-branch', + target_branch: 'master', + description: 'the-body', }) .post('/api/v4/projects/undefined/merge_requests/12345/approve') .replyWithError('some error'); @@ -2947,11 +3004,18 @@ describe('modules/platform/gitlab/index', () => { iid: 1, source_branch: 'branch-a', title: 'branch a pr', - state: 'open', + description: 'a merge request', + state: 'opened', }, ]) .put('/api/v4/projects/undefined/merge_requests/1') - .reply(200); + .reply(200, { + iid: 1, + source_branch: 'branch-a', + title: 'title', + description: 'body', + state: 'opened', + }); await expect( gitlab.updatePr({ number: 1, prTitle: 'title', prBody: 'body' }), ).toResolve(); @@ -2969,11 +3033,18 @@ describe('modules/platform/gitlab/index', () => { iid: 1, source_branch: 'branch-a', title: 'Draft: foo', - state: 'open', + description: 'a merge request', + state: 'opened', }, ]) .put('/api/v4/projects/undefined/merge_requests/1') - .reply(200); + .reply(200, { + iid: 1, + source_branch: 'branch-a', + title: 'Draft: title', + description: 'body', + state: 'opened', + }); await expect( gitlab.updatePr({ number: 1, prTitle: 'title', prBody: 'body' }), ).toResolve(); @@ -2991,11 +3062,18 @@ describe('modules/platform/gitlab/index', () => { iid: 1, source_branch: 'branch-a', title: 'WIP: foo', - state: 'open', + description: 'a merge request', + state: 'opened', }, ]) .put('/api/v4/projects/undefined/merge_requests/1') - .reply(200); + .reply(200, { + iid: 1, + source_branch: 'branch-a', + title: 'WIP: title', + description: 'body', + state: 'opened', + }); await expect( gitlab.updatePr({ number: 1, prTitle: 'title', prBody: 'body' }), ).toResolve(); @@ -3013,19 +3091,26 @@ describe('modules/platform/gitlab/index', () => { iid: 1, source_branch: 'branch-a', title: 'branch a pr', - state: 'open', + description: 'a merge request', + state: 'opened', target_branch: 'branch-b', }, ]) .put('/api/v4/projects/undefined/merge_requests/1') - .reply(200); + .reply(200, { + iid: 1, + source_branch: 'branch-a', + title: 'branch a pr', + description: 'body', + state: 'opened', + target_branch: 'branch-new', + }); await expect( gitlab.updatePr({ number: 1, prTitle: 'title', prBody: 'body', - state: 'closed', - targetBranch: 'branch-b', + targetBranch: 'branch-new', }), ).toResolve(); }); @@ -3042,11 +3127,18 @@ describe('modules/platform/gitlab/index', () => { iid: 1, source_branch: 'branch-a', title: 'branch a pr', - state: 'open', + description: 'a merge request', + state: 'opened', }, ]) .put('/api/v4/projects/undefined/merge_requests/1') - .reply(200) + .reply(200, { + iid: 1, + source_branch: 'branch-a', + title: 'title', + description: 'body', + state: 'opened', + }) .post('/api/v4/projects/undefined/merge_requests/1/approve') .reply(200); await expect( @@ -3073,11 +3165,18 @@ describe('modules/platform/gitlab/index', () => { iid: 1, source_branch: 'branch-a', title: 'branch a pr', - state: 'open', + description: 'a merge request', + state: 'opened', }, ]) .put('/api/v4/projects/undefined/merge_requests/1') - .reply(200); + .reply(200, { + iid: 1, + source_branch: 'branch-a', + title: 'title', + description: 'a merge requbody', + state: 'closed', + }); await expect( gitlab.updatePr({ number: 1, @@ -3100,22 +3199,64 @@ describe('modules/platform/gitlab/index', () => { iid: 1, source_branch: 'branch-a', title: 'branch a pr', - state: 'open', + description: 'a merge request', + state: 'opened', }, ]) .put('/api/v4/projects/undefined/merge_requests/1') - .reply(200); + .reply(200, { + iid: 1, + source_branch: 'branch-a', + title: 'title', + description: 'body', + state: 'opened', + }); await expect( gitlab.updatePr({ number: 1, prTitle: 'title', prBody: 'body', - state: 'closed', + state: 'open', addLabels: ['new_label'], removeLabels: ['old_label'], }), ).toResolve(); }); + + it('updates runtime pr list when pr is updated', async () => { + await initPlatform('13.3.6-ee'); + httpMock + .scope(gitlabApiHost) + .get( + '/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me', + ) + .reply(200, [ + { + iid: 1, + source_branch: 'branch-a', + title: 'branch a pr', + description: 'a merge request', + state: 'opened', + }, + ]) + .put('/api/v4/projects/undefined/merge_requests/1') + .reply(200, { + iid: 1, + source_branch: 'branch-a', + title: 'new_title', + description: 'body', + state: 'opened', + }); + await gitlab.updatePr({ + number: 1, + prTitle: 'new_title', + prBody: 'body', + }); + const prList = await gitlab.getPrList(); + const updatedPr = prList.find((pr) => pr.number === 1); + expect(updatedPr?.title).toBe('new_title'); + expect(updatedPr?.bodyStruct).toMatchObject(getPrBodyStruct('body')); + }); }); describe('reattemptPlatformAutomerge(number, platformPrOptions)', () => { diff --git a/lib/modules/platform/gitlab/index.ts b/lib/modules/platform/gitlab/index.ts index c8ba81c0dfc894..30965b96308505 100644 --- a/lib/modules/platform/gitlab/index.ts +++ b/lib/modules/platform/gitlab/index.ts @@ -32,7 +32,6 @@ import { getQueryString, parseUrl, } from '../../../util/url'; -import { getPrBodyStruct } from '../pr-body'; import type { AutodiscoverConfig, BranchStatusConfig, @@ -72,11 +71,12 @@ import type { MergeMethod, RepoResponse, } from './types'; +import { DRAFT_PREFIX, DRAFT_PREFIX_DEPRECATED, prInfo } from './utils'; let config: { repository: string; email: string; - prList: any[] | undefined; + prList: GitlabPr[] | undefined; issueList: GitlabIssue[] | undefined; mergeMethod: MergeMethod; defaultBranch: string; @@ -93,9 +93,6 @@ const defaults = { export const id = 'gitlab'; -const DRAFT_PREFIX = 'Draft: '; -const DRAFT_PREFIX_DEPRECATED = 'WIP: '; - let draftPrefix = DRAFT_PREFIX; export async function initPlatform({ @@ -537,18 +534,6 @@ export async function getBranchStatus( // Pull Request -function massagePr(prToModify: Pr): Pr { - const pr = prToModify; - if (pr.title.startsWith(DRAFT_PREFIX)) { - pr.title = pr.title.substring(DRAFT_PREFIX.length); - pr.isDraft = true; - } else if (pr.title.startsWith(DRAFT_PREFIX_DEPRECATED)) { - pr.title = pr.title.substring(DRAFT_PREFIX_DEPRECATED.length); - pr.isDraft = true; - } - return pr; -} - async function fetchPrList(): Promise { const searchParams = { per_page: '100', @@ -560,24 +545,10 @@ async function fetchPrList(): Promise { const query = getQueryString(searchParams); const urlString = `projects/${config.repository}/merge_requests?${query}`; try { - const res = await gitlabApi.getJson< - { - iid: number; - source_branch: string; - title: string; - state: string; - created_at: string; - }[] - >(urlString, { paginate: true }); - return res.body.map((pr) => - massagePr({ - number: pr.iid, - sourceBranch: pr.source_branch, - title: pr.title, - state: pr.state === 'opened' ? 'open' : pr.state, - createdAt: pr.created_at, - }), - ); + const res = await gitlabApi.getJson(urlString, { + paginate: true, + }); + return res.body.map((pr) => prInfo(pr)); } catch (err) /* istanbul ignore next */ { logger.debug({ err }, 'Error fetching PR list'); if (err.statusCode === 403) { @@ -764,7 +735,7 @@ export async function createPr({ } const description = sanitize(rawDescription); logger.debug(`Creating Merge Request: ${title}`); - const res = await gitlabApi.postJson( + const res = await gitlabApi.postJson( `projects/${config.repository}/merge_requests`, { body: { @@ -778,21 +749,21 @@ export async function createPr({ }, }, ); - const pr = res.body; - pr.number = pr.iid; - pr.sourceBranch = sourceBranch; + + const pr = prInfo(res.body); + // istanbul ignore if if (config.prList) { config.prList.push(pr); } if (platformPrOptions?.autoApprove) { - await approvePr(pr.iid); + await approvePr(pr.number); } - await tryPrAutomerge(pr.iid, platformPrOptions); + await tryPrAutomerge(pr.number, platformPrOptions); - return massagePr(pr); + return pr; } export async function getPr(iid: number): Promise { @@ -800,22 +771,7 @@ export async function getPr(iid: number): Promise { const mr = await getMR(config.repository, iid); // Harmonize fields with GitHub - const pr: GitlabPr = { - sourceBranch: mr.source_branch, - targetBranch: mr.target_branch, - number: mr.iid, - bodyStruct: getPrBodyStruct(mr.description), - state: mr.state === 'opened' ? 'open' : mr.state, - headPipelineStatus: mr.head_pipeline?.status, - headPipelineSha: mr.head_pipeline?.sha, - hasAssignees: !!(mr.assignee?.id ?? mr.assignees?.[0]?.id), - reviewers: mr.reviewers?.map(({ username }) => username), - title: mr.title, - labels: mr.labels, - sha: mr.sha, - }; - - return massagePr(pr); + return prInfo(mr); } export async function updatePr({ @@ -855,10 +811,30 @@ export async function updatePr({ body.remove_labels = removeLabels; } - await gitlabApi.putJson( - `projects/${config.repository}/merge_requests/${iid}`, - { body }, - ); + const updatedPrInfo = ( + await gitlabApi.putJson( + `projects/${config.repository}/merge_requests/${iid}`, + { body }, + ) + ).body; + + const updatedPr = prInfo(updatedPrInfo); + + if (config.prList) { + const existingIndex = config.prList.findIndex( + (pr) => pr.number === updatedPr.number, + ); + // istanbul ignore if: should not happen + if (existingIndex === -1) { + logger.warn( + { pr: updatedPr }, + 'Possible error: Updated PR was not found in the PRs that were returned from getPrList().', + ); + config.prList.push(updatedPr); + } else { + config.prList[existingIndex] = updatedPr; + } + } if (platformPrOptions?.autoApprove) { await approvePr(iid); @@ -960,18 +936,7 @@ export async function findPr({ return null; } - // return the latest merge request - const mr = mrList[0]; - - // only pass necessary info - const pr: GitlabPr = { - sourceBranch: mr.source_branch, - number: mr.iid, - state: 'open', - title: mr.title, - }; - - return massagePr(pr); + return prInfo(mrList[0]); } const prList = await getPrList(); diff --git a/lib/modules/platform/gitlab/utils.ts b/lib/modules/platform/gitlab/utils.ts new file mode 100644 index 00000000000000..afba4ffd165d97 --- /dev/null +++ b/lib/modules/platform/gitlab/utils.ts @@ -0,0 +1,41 @@ +import is from '@sindresorhus/is'; +import { getPrBodyStruct } from '../pr-body'; +import type { GitLabMergeRequest, GitlabPr } from './types'; + +export const DRAFT_PREFIX = 'Draft: '; +export const DRAFT_PREFIX_DEPRECATED = 'WIP: '; + +export function prInfo(mr: GitLabMergeRequest): GitlabPr { + const pr: GitlabPr = { + sourceBranch: mr.source_branch, + state: mr.state === 'opened' ? 'open' : mr.state, + number: mr.iid, + title: mr.title, + hasAssignees: !!(mr.assignee?.id ?? mr.assignees?.[0]?.id), + bodyStruct: getPrBodyStruct(mr.description), + + ...(mr.target_branch && { targetBranch: mr.target_branch }), + + ...(mr.head_pipeline?.status && { + headPipelineStatus: mr.head_pipeline?.status, + }), + ...(mr.head_pipeline?.sha && { headPipelineSha: mr.head_pipeline?.sha }), + + ...(is.nonEmptyArray(mr.reviewers) && { + reviewers: mr.reviewers?.map(({ username }) => username), + }), + + ...(mr.labels && { labels: mr.labels }), + ...(mr.sha && { sha: mr.sha }), + }; + + if (pr.title.startsWith(DRAFT_PREFIX)) { + pr.title = pr.title.substring(DRAFT_PREFIX.length); + pr.isDraft = true; + } else if (pr.title.startsWith(DRAFT_PREFIX_DEPRECATED)) { + pr.title = pr.title.substring(DRAFT_PREFIX_DEPRECATED.length); + pr.isDraft = true; + } + + return pr; +} diff --git a/lib/modules/versioning/regex/readme.md b/lib/modules/versioning/regex/readme.md index b8512e5c95ef55..1d84897af8dd6d 100644 --- a/lib/modules/versioning/regex/readme.md +++ b/lib/modules/versioning/regex/readme.md @@ -1,6 +1,7 @@ Regular Expression Versioning is designed to be a flexible fallback versioning approach if Renovate's other versioning schemes don't do the job. -The `regex` scheme makes use of Regular Express capture groups. +The `regex` scheme makes use of Regular Expression capture groups. + 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. @@ -11,6 +12,9 @@ The valid capture groups for `regex` versioning are: The compatibility concept was originally introduced for Docker versioning but sometimes package authors may use/misuse suffixes to mean compatibility in other versioning schemes. +**Important: all capture groups must contain only purely numeric values.** +Even if there is a string prefix which is identical in all available versions, it must not be part of the capture group. For example a `build` capture group containing `r4` cannot be evaluated as number; Renovate cannot compare the `build` in this case. The capture group must be `4` instead. + Here is an example of using `regex` versioning to correct behavior of the `guava` Maven package, which misuses suffixes as compatibility indicators: ```json @@ -51,3 +55,17 @@ Here is another example, this time for handling Bitnami Docker images, which use ] } ``` + +Here is another example, this time for handling `ghcr.io/linuxserver/openssh-server` Docker images, which use `patch`, `build` and `revision` indicators with string prefixes: + +```json +{ + "packageRules": [ + { + "matchDatasources": ["docker"], + "matchPackageNamees": ["ghcr.io/linuxserver/openssh-server"], + "versioning": "regex:^(?\\d+)\\.(?\\d+)_p(?\\d+)-r(?\\d)-ls(?.+)$" + } + ] +} +``` diff --git a/lib/modules/versioning/same-major/readme.md b/lib/modules/versioning/same-major/readme.md index 5a95fe4634d917..6b5285b5978929 100644 --- a/lib/modules/versioning/same-major/readme.md +++ b/lib/modules/versioning/same-major/readme.md @@ -1,4 +1,4 @@ -The 'Same Major' versioning is designed to handle the case where a version needs to treated as a "greate than or equal to" constraint. +The 'Same Major' versioning is designed to handle the case where a version needs to treated as a "greater than or equal to" constraint. Specifically, the case where the version say, `X.Y.Z` signifies a range of compatibility from greater than or equal to `X.Y.Z` to less than `X+1`. This process uses Semver-Coerced versioning beneath the surface, single versions (e.g., `X.Y.Z`) are converted to a range like `X+1` and then passed to the corresponding semver-coerced method. diff --git a/lib/punycode.cjs b/lib/punycode.cjs new file mode 100644 index 00000000000000..40e97f8dcba0df --- /dev/null +++ b/lib/punycode.cjs @@ -0,0 +1,10 @@ +/** + * punycode workaround + * + * Load punycode.js module to cache and override node built-in. + * + * See + */ +// eslint-disable-next-line @typescript-eslint/no-require-imports +require('punycode/'); +require.cache.punycode = require.cache[require.resolve('punycode/')]; diff --git a/lib/renovate.ts b/lib/renovate.ts index 4a618b9a385f83..d60ae5b2d7dec1 100644 --- a/lib/renovate.ts +++ b/lib/renovate.ts @@ -1,6 +1,7 @@ #!/usr/bin/env node import 'source-map-support/register'; +import './punycode.cjs'; import { instrument, shutdown as telemetryShutdown } from './instrumentation'; // has to be imported before logger and other libraries which are instrumentalised import { logger } from './logger'; import { bootstrap } from './proxy'; diff --git a/lib/util/cache/package/types.ts b/lib/util/cache/package/types.ts index 7435f8bc787301..d61cafdfe6f32e 100644 --- a/lib/util/cache/package/types.ts +++ b/lib/util/cache/package/types.ts @@ -78,7 +78,6 @@ export type PackageCacheNamespace = | 'datasource-maven' | 'datasource-maven:head-requests-timeout' | 'datasource-maven:head-requests' - | 'datasource-maven:index-html-releases' | 'datasource-maven:metadata-xml' | 'datasource-node-version' | 'datasource-npm:data' diff --git a/lib/util/cache/repository/common.ts b/lib/util/cache/repository/common.ts index 2108a57e66a479..a7fad1e4e28411 100644 --- a/lib/util/cache/repository/common.ts +++ b/lib/util/cache/repository/common.ts @@ -1,6 +1,6 @@ -// Increment this whenever there could be incompatibilities between old and new cache structure import upath from 'upath'; +// Increment this whenever there could be incompatibilities between old and new cache structure export const CACHE_REVISION = 13; export function getLocalCacheFileName( diff --git a/lib/util/git/private-key.spec.ts b/lib/util/git/private-key.spec.ts index 1f365b0f5e544a..4b64a88a965de4 100644 --- a/lib/util/git/private-key.spec.ts +++ b/lib/util/git/private-key.spec.ts @@ -35,7 +35,7 @@ describe('util/git/private-key', () => { exec.exec.calledWith(any()).mockResolvedValue({ stdout: '', stderr: '' }); exec.exec .calledWith( - `gpg --import ${upath.join(os.tmpdir() + '/git-private-gpg.key')}`, + `gpg --batch --no-tty --import ${upath.join(os.tmpdir() + '/git-private-gpg.key')}`, ) .mockRejectedValueOnce({ stderr: `something wrong`, @@ -50,7 +50,7 @@ describe('util/git/private-key', () => { exec.exec.calledWith(any()).mockResolvedValue({ stdout: '', stderr: '' }); exec.exec .calledWith( - `gpg --import ${upath.join(os.tmpdir() + '/git-private-gpg.key')}`, + `gpg --batch --no-tty --import ${upath.join(os.tmpdir() + '/git-private-gpg.key')}`, ) .mockResolvedValueOnce({ stderr: `gpg: key ${publicKey}: secret key imported\nfoo\n`, diff --git a/lib/util/git/private-key.ts b/lib/util/git/private-key.ts index 2b8828e6064146..406366e1b53291 100644 --- a/lib/util/git/private-key.ts +++ b/lib/util/git/private-key.ts @@ -64,7 +64,10 @@ class GPGKey extends PrivateKey { protected async importKey(): Promise { const keyFileName = upath.join(os.tmpdir() + '/git-private-gpg.key'); await fs.outputFile(keyFileName, this.key); - const { stdout, stderr } = await exec(`gpg --import ${keyFileName}`); + const { stdout, stderr } = await exec( + // --batch --no-tty flags allow Renovate to skip warnings about unsupported algorithms in the key + `gpg --batch --no-tty --import ${keyFileName}`, + ); logger.debug({ stdout, stderr }, 'Private key import result'); await fs.remove(keyFileName); return `${stdout}${stderr}` diff --git a/lib/util/result.spec.ts b/lib/util/result.spec.ts index 775c077ebd43b4..61b0957ca8e29c 100644 --- a/lib/util/result.spec.ts +++ b/lib/util/result.spec.ts @@ -240,9 +240,8 @@ describe('util/result', () => { }); it('converts error to Result', () => { - const result = Result.err('oops').catch(() => - Result.ok(42), - ); + const error: Result = Result.err('oops'); + const result = error.catch((_err) => Result.ok(42)); expect(result).toEqual(Result.ok(42)); }); @@ -600,15 +599,15 @@ describe('util/result', () => { describe('Catch', () => { it('converts error to AsyncResult', async () => { - const result = await Result.err('oops').catch(() => - AsyncResult.ok(42), - ); + const error: Result = Result.err('oops'); + const result = await error.catch(() => AsyncResult.ok(42)); expect(result).toEqual(Result.ok(42)); }); it('converts error to Promise', async () => { const fallback = Promise.resolve(Result.ok(42)); - const result = await Result.err('oops').catch(() => fallback); + const error: Result = Result.err('oops'); + const result = await error.catch(() => fallback); expect(result).toEqual(Result.ok(42)); }); @@ -619,9 +618,9 @@ describe('util/result', () => { }); it('converts AsyncResult error to Result', async () => { - const result = await AsyncResult.err('oops').catch(() => - AsyncResult.ok(42), - ); + const error: AsyncResult = + AsyncResult.err('oops'); + const result = await error.catch(() => AsyncResult.ok(42)); expect(result).toEqual(Result.ok(42)); }); }); diff --git a/lib/util/result.ts b/lib/util/result.ts index 7237d0d33d67b4..f6649b65028faa 100644 --- a/lib/util/result.ts +++ b/lib/util/result.ts @@ -480,28 +480,23 @@ export class Result { } catch( - fn: (err: E) => Result, - ): Result; + fn: (err: E) => Result, + ): Result; catch( - fn: (err: E) => AsyncResult, - ): AsyncResult; + fn: (err: E) => AsyncResult, + ): AsyncResult; catch( - fn: (err: E) => Promise>, - ): AsyncResult; + fn: (err: E) => Promise>, + ): AsyncResult; catch( - fn: ( - err: E, - ) => - | Result - | AsyncResult - | Promise>, - ): Result | AsyncResult { + fn: (err: E) => Result | AsyncResult | Promise>, + ): Result | AsyncResult { if (this.res.ok) { - return this; + return this as never; } if (this.res._uncaught) { - return this; + return this as never; } try { @@ -833,25 +828,23 @@ export class AsyncResult } catch( - fn: (err: NonNullable) => Result, - ): AsyncResult; + fn: (err: NonNullable) => Result, + ): AsyncResult; catch( - fn: (err: NonNullable) => AsyncResult, - ): AsyncResult; + fn: (err: NonNullable) => AsyncResult, + ): AsyncResult; catch( - fn: (err: NonNullable) => Promise>, - ): AsyncResult; + fn: (err: NonNullable) => Promise>, + ): AsyncResult; catch( fn: ( err: NonNullable, - ) => - | Result - | AsyncResult - | Promise>, - ): AsyncResult { - const caughtAsyncResult = this.asyncResult.then((result) => - // eslint-disable-next-line promise/no-nesting - result.catch(fn as never), + ) => Result | AsyncResult | Promise>, + ): AsyncResult { + const caughtAsyncResult: Promise> = this.asyncResult.then( + (result) => + // eslint-disable-next-line promise/no-nesting + result.catch(fn as never), ); return AsyncResult.wrap(caughtAsyncResult); } diff --git a/lib/util/template/index.ts b/lib/util/template/index.ts index 1e3ab8e9c95182..c7a4b453ed6147 100644 --- a/lib/util/template/index.ts +++ b/lib/util/template/index.ts @@ -147,6 +147,7 @@ export const exposedConfigOptions = [ 'semanticCommitType', 'separateMajorMinor', 'separateMinorPatch', + 'sourceDirectory', ]; export const allowedFields = { diff --git a/lib/util/url.spec.ts b/lib/util/url.spec.ts index 0ed4143cb69c55..e1ed216102e3be 100644 --- a/lib/util/url.spec.ts +++ b/lib/util/url.spec.ts @@ -116,6 +116,7 @@ describe('util/url', () => { expect(url?.protocol).toBe('https:'); expect(url?.host).toBe('github.com'); expect(url?.pathname).toBe('/renovatebot/renovate'); + expect(parseUrl(url)).toBe(url); }); it('trimTrailingSlash', () => { diff --git a/lib/util/url.ts b/lib/util/url.ts index 49d92dc0de91a8..d9886939dc1dd3 100644 --- a/lib/util/url.ts +++ b/lib/util/url.ts @@ -97,11 +97,15 @@ export function isHttpUrl(url: unknown): boolean { } } -export function parseUrl(url: string | undefined | null): URL | null { +export function parseUrl(url: URL | string | undefined | null): URL | null { if (!url) { return null; } + if (url instanceof URL) { + return url; + } + try { return new URL(url); } catch { diff --git a/lib/workers/global/config/parse/file.ts b/lib/workers/global/config/parse/file.ts index bdc39481f16708..cf6ecf20c69898 100644 --- a/lib/workers/global/config/parse/file.ts +++ b/lib/workers/global/config/parse/file.ts @@ -70,6 +70,7 @@ export async function getConfig(env: NodeJS.ProcessEnv): Promise { logger.fatal(err.message); process.exit(1); } else if (env.RENOVATE_CONFIG_FILE) { + logger.debug({ err }, 'Parse error'); logger.fatal('Error parsing config file'); process.exit(1); } diff --git a/lib/workers/global/index.spec.ts b/lib/workers/global/index.spec.ts index dd9c31464eb07b..9348676f0d5322 100644 --- a/lib/workers/global/index.spec.ts +++ b/lib/workers/global/index.spec.ts @@ -43,6 +43,7 @@ const initPlatform = jest.spyOn(platform, 'initPlatform'); describe('workers/global/index', () => { beforeEach(() => { logger.getProblems.mockImplementation(() => []); + logger.logLevel.mockImplementation(() => 'info'); initPlatform.mockImplementation((input) => Promise.resolve(input)); delete process.env.AWS_SECRET_ACCESS_KEY; delete process.env.AWS_SESSION_TOKEN; diff --git a/lib/workers/global/index.ts b/lib/workers/global/index.ts index fd233ecb61a81f..0ef5d1c870d29f 100644 --- a/lib/workers/global/index.ts +++ b/lib/workers/global/index.ts @@ -17,7 +17,7 @@ import { CONFIG_PRESETS_INVALID } from '../../constants/error-messages'; import { pkg } from '../../expose.cjs'; import { instrument } from '../../instrumentation'; import { exportStats, finalizeReport } from '../../instrumentation/reporting'; -import { getProblems, logger, setMeta } from '../../logger'; +import { getProblems, logLevel, logger, setMeta } from '../../logger'; import { setGlobalLogLevelRemaps } from '../../logger/remap'; import * as hostRules from '../../util/host-rules'; import * as queue from '../../util/http/queue'; @@ -228,10 +228,9 @@ export async function start(): Promise { } } finally { await globalFinalize(config!); - const logLevel = process.env.LOG_LEVEL ?? 'info'; - if (logLevel === 'info') { + if (logLevel() === 'info') { logger.info( - `Renovate was run at log level "${logLevel}". Set LOG_LEVEL=debug in environment variables to see extended debug logs.`, + `Renovate was run at log level "${logLevel()}". Set LOG_LEVEL=debug in environment variables to see extended debug logs.`, ); } } diff --git a/lib/workers/repository/dependency-dashboard.ts b/lib/workers/repository/dependency-dashboard.ts index 02be583d683e74..ec4edc604a1c62 100644 --- a/lib/workers/repository/dependency-dashboard.ts +++ b/lib/workers/repository/dependency-dashboard.ts @@ -249,10 +249,7 @@ export async function ensureDependencyDashboard( // Check packageFiles for any deprecations let hasDeprecations = false; const deprecatedPackages: Record> = {}; - logger.debug( - { packageFiles }, - 'Checking packageFiles for deprecated packages', - ); + logger.debug('Checking packageFiles for deprecated packages'); if (is.nonEmptyObject(packageFiles)) { for (const [manager, fileNames] of Object.entries(packageFiles)) { for (const fileName of fileNames) { diff --git a/lib/workers/repository/process/index.ts b/lib/workers/repository/process/index.ts index 8fb4ef3b0ebb2c..f06b11e87cd42a 100644 --- a/lib/workers/repository/process/index.ts +++ b/lib/workers/repository/process/index.ts @@ -119,7 +119,7 @@ export async function extractDependencies( let res: ExtractResult = { branches: [], branchList: [], - packageFiles: null!, + packageFiles: {}, }; if (GlobalConfig.get('platform') !== 'local' && config.baseBranches?.length) { config.baseBranches = unfoldBaseBranches( @@ -146,7 +146,10 @@ export async function extractDependencies( const baseBranchRes = await lookup(baseBranchConfig, packageFiles); res.branches = res.branches.concat(baseBranchRes?.branches); res.branchList = res.branchList.concat(baseBranchRes?.branchList); - res.packageFiles = res.packageFiles || baseBranchRes?.packageFiles; // Use the first branch + if (!res.packageFiles || !Object.keys(res.packageFiles).length) { + // Use the first branch + res.packageFiles = baseBranchRes?.packageFiles; + } } } removeMeta(['baseBranch']); diff --git a/lib/workers/repository/update/branch/index.ts b/lib/workers/repository/update/branch/index.ts index 4f35e4ad3667e9..e76b4c2dce533d 100644 --- a/lib/workers/repository/update/branch/index.ts +++ b/lib/workers/repository/update/branch/index.ts @@ -181,6 +181,9 @@ export async function processBranch( branchConfig.pendingChecks && !dependencyDashboardCheck ) { + logger.debug( + `Branch ${config.branchName} creation is disabled because internalChecksFilter was not met`, + ); return { branchExists: false, prNo: branchPr?.number, diff --git a/lib/workers/repository/update/branch/schedule.spec.ts b/lib/workers/repository/update/branch/schedule.spec.ts index 57c08c6445f956..d310c4090b1b13 100644 --- a/lib/workers/repository/update/branch/schedule.spec.ts +++ b/lib/workers/repository/update/branch/schedule.spec.ts @@ -109,7 +109,9 @@ describe('workers/repository/update/branch/schedule', () => { it('returns true if schedule uses cron syntax', () => { expect(schedule.hasValidSchedule(['* 5 * * *'])[0]).toBeTrue(); expect(schedule.hasValidSchedule(['* * * * * 6L'])[0]).toBeTrue(); - expect(schedule.hasValidSchedule(['* * */2 6#1'])[0]).toBeTrue(); + expect(schedule.hasValidSchedule(['* * * */2 6#1'])[0]).toBeTrue(); + expect(schedule.hasValidSchedule(['2 3 5 11 *'])[0]).toBeFalse(); + expect(schedule.hasValidSchedule(['2 3 5 11'])[0]).toBeFalse(); }); it('massages schedules', () => { @@ -267,6 +269,50 @@ describe('workers/repository/update/branch/schedule', () => { }); }); + describe('supports L syntax in cron schedules', () => { + beforeEach(() => { + jest.setSystemTime(new Date('2024-10-31T10:50:00.000')); + }); + + it('supports last day of month', () => { + config.schedule = ['* * * L *']; + const res = schedule.isScheduledNow(config); + expect(res).toBeTrue(); + }); + + it('supports last day of week', () => { + config.schedule = ['* * * * 4L']; + expect(schedule.isScheduledNow(config)).toBeTrue(); + + config.schedule = ['* * * * 5L']; + expect(schedule.isScheduledNow(config)).toBeFalse(); + }); + }); + + describe('supports # syntax in cron schedules', () => { + it('supports first Monday of month', () => { + jest.setSystemTime(new Date('2024-10-07T10:50:00.000')); + config.schedule = ['* * * * 1#1']; + expect(schedule.isScheduledNow(config)).toBeTrue(); + config.schedule = ['* * * * 1#2']; + expect(schedule.isScheduledNow(config)).toBeFalse(); + }); + }); + + describe('complex cron schedules', () => { + it.each` + sched | datetime | expected + ${'* * 1-7 * 0'} | ${'2024-10-04T10:50:00.000+0900'} | ${true} + ${'* * 1-7 * 0'} | ${'2024-10-13T10:50:00.000+0900'} | ${true} + ${'* * 1-7 * 0'} | ${'2024-10-16T10:50:00.000+0900'} | ${false} + `('$sched, $tz, $datetime', ({ sched, tz, datetime, expected }) => { + config.schedule = [sched]; + config.timezone = 'Asia/Tokyo'; + jest.setSystemTime(new Date(datetime)); + expect(schedule.isScheduledNow(config)).toBe(expected); + }); + }); + describe('supports timezone', () => { it.each` sched | tz | datetime | expected @@ -282,6 +328,24 @@ describe('workers/repository/update/branch/schedule', () => { }); }); + it('reject if day mismatch', () => { + config.schedule = ['* 10 21 * *']; + const res = schedule.isScheduledNow(config); + expect(res).toBeFalse(); + }); + + it('reject if month mismatch', () => { + config.schedule = ['* 10 30 1 *']; + const res = schedule.isScheduledNow(config); + expect(res).toBeFalse(); + }); + + it('reject if no schedule available', () => { + config.schedule = ['* * * 1 *']; + const res = schedule.isScheduledNow(config); + expect(res).toBeFalse(); + }); + it('supports multiple schedules', () => { config.schedule = ['after 4:00pm', 'before 11:00am']; const res = schedule.isScheduledNow(config); diff --git a/lib/workers/repository/update/branch/schedule.ts b/lib/workers/repository/update/branch/schedule.ts index f6ea10949260b2..73c68b278b3579 100644 --- a/lib/workers/repository/update/branch/schedule.ts +++ b/lib/workers/repository/update/branch/schedule.ts @@ -1,32 +1,22 @@ import later from '@breejs/later'; import is from '@sindresorhus/is'; -import type { - CronExpression, - DayOfTheMonthRange, - DayOfTheWeekRange, - HourRange, - MonthRange, -} from 'cron-parser'; -import { parseExpression } from 'cron-parser'; +import { Cron, CronPattern } from 'croner'; import cronstrue from 'cronstrue'; import { DateTime } from 'luxon'; import { fixShortHours } from '../../../../config/migration'; import type { RenovateConfig } from '../../../../config/types'; import { logger } from '../../../../logger'; -const minutesChar = '*'; - const scheduleMappings: Record = { 'every month': 'before 5am on the first day of the month', monthly: 'before 5am on the first day of the month', }; -function parseCron( - scheduleText: string, - timezone?: string, -): CronExpression | undefined { +const minutesChar = '*'; + +function parseCron(scheduleText: string): CronPattern | undefined { try { - return parseExpression(scheduleText, { tz: timezone }); + return new CronPattern(scheduleText); } catch { return undefined; } @@ -55,7 +45,7 @@ export function hasValidSchedule( const parsedCron = parseCron(scheduleText); if (parsedCron !== undefined) { if ( - parsedCron.fields.minute.length !== 60 || + parsedCron.minute.filter((v) => v !== 1).length !== 0 || scheduleText.indexOf(minutesChar) !== 0 ) { message = `Invalid schedule: "${scheduleText}" has cron syntax, but doesn't have * as minutes`; @@ -99,43 +89,38 @@ export function hasValidSchedule( return [true]; } -function cronMatches(cron: string, now: DateTime, timezone?: string): boolean { - const parsedCron = parseCron(cron, timezone); - +export function cronMatches( + cron: string, + now: DateTime, + timezone?: string, +): boolean { + const parsedCron: Cron = new Cron(cron, { + ...(timezone && { timezone }), + }); // it will always parse because it is checked beforehand // istanbul ignore if if (!parsedCron) { return false; } - if (parsedCron.fields.hour.indexOf(now.hour as HourRange) === -1) { - // Hours mismatch - return false; - } - - if ( - parsedCron.fields.dayOfMonth.indexOf(now.day as DayOfTheMonthRange) === -1 - ) { - // Days mismatch + // return the next date which matches the cron schedule + const nextRun = parsedCron.nextRun(); + // istanbul ignore if: should not happen + if (!nextRun) { + logger.warn(`Invalid cron schedule ${cron}. No next run is possible`); return false; } - if ( - !parsedCron.fields.dayOfWeek.includes( - (now.weekday % 7) as DayOfTheWeekRange, - ) - ) { - // Weekdays mismatch - return false; + let nextDate = DateTime.fromJSDate(nextRun); + if (timezone) { + nextDate = nextDate.setZone(timezone); } - if (parsedCron.fields.month.indexOf(now.month as MonthRange) === -1) { - // Months mismatch - return false; - } - - // Match - return true; + return ( + nextDate.hour === now.hour && + nextDate.day === now.day && + nextDate.month === now.month + ); } export function isScheduledNow( diff --git a/lib/workers/repository/update/pr/body/index.spec.ts b/lib/workers/repository/update/pr/body/index.spec.ts index eb5149a2685a1f..0308e4d8c26562 100644 --- a/lib/workers/repository/update/pr/body/index.spec.ts +++ b/lib/workers/repository/update/pr/body/index.spec.ts @@ -89,12 +89,21 @@ describe('workers/repository/update/pr/body/index', () => { homepage: 'https://example.com', }; + const upgradeBitbucket = { + manager: 'some-manager', + branchName: 'some-branch', + sourceUrl: 'https://bitbucket.org/foo/bar', + sourceDirectory: '/baz', + changelogUrl: 'https://bitbucket.org/foo/bar/src/main/CHANGELOG.md', + homepage: 'https://example.com', + }; + getPrBody( { manager: 'some-manager', baseBranch: 'base', branchName: 'some-branch', - upgrades: [upgrade, upgrade1], + upgrades: [upgrade, upgrade1, upgradeBitbucket], }, { debugData: { @@ -128,6 +137,15 @@ describe('workers/repository/update/pr/body/index', () => { homepage: 'https://example.com', sourceUrl: 'https://github.com/foo/bar', }); + expect(upgradeBitbucket).toMatchObject({ + branchName: 'some-branch', + depNameLinked: + '[undefined](https://example.com) ([source](https://bitbucket.org/foo/bar/src/HEAD/baz), [changelog](https://bitbucket.org/foo/bar/src/main/CHANGELOG.md))', + references: + '[homepage](https://example.com), [source](https://bitbucket.org/foo/bar/src/HEAD/baz), [changelog](https://bitbucket.org/foo/bar/src/main/CHANGELOG.md)', + homepage: 'https://example.com', + sourceUrl: 'https://bitbucket.org/foo/bar', + }); }); it('uses dependencyUrl as primary link', () => { diff --git a/lib/workers/repository/update/pr/body/index.ts b/lib/workers/repository/update/pr/body/index.ts index 1c1e5d8d1f9e88..984a3ff83b9b48 100644 --- a/lib/workers/repository/update/pr/body/index.ts +++ b/lib/workers/repository/update/pr/body/index.ts @@ -1,6 +1,7 @@ import type { RenovateConfig } from '../../../../../config/types'; import type { PrDebugData } from '../../../../../modules/platform'; import { platform } from '../../../../../modules/platform'; +import { detectPlatform } from '../../../../../util/common'; import { regEx } from '../../../../../util/regex'; import { toBase64 } from '../../../../../util/string'; import * as template from '../../../../../util/template'; @@ -31,12 +32,20 @@ function massageUpdateMetadata(config: BranchConfig): void { depNameLinked = `[${depNameLinked}](${primaryLink})`; } + let sourceRootPath = 'tree'; + if (sourceUrl) { + const sourcePlatform = detectPlatform(sourceUrl); + if (sourcePlatform === 'bitbucket') { + sourceRootPath = 'src'; + } + } + const otherLinks = []; if (sourceUrl && (!!sourceDirectory || homepage)) { otherLinks.push( `[source](${ sourceDirectory - ? joinUrlParts(sourceUrl, 'tree/HEAD/', sourceDirectory) + ? joinUrlParts(sourceUrl, sourceRootPath, 'HEAD', sourceDirectory) : sourceUrl })`, ); @@ -55,7 +64,12 @@ function massageUpdateMetadata(config: BranchConfig): void { if (sourceUrl) { let fullUrl = sourceUrl; if (sourceDirectory) { - fullUrl = joinUrlParts(sourceUrl, 'tree/HEAD/', sourceDirectory); + fullUrl = joinUrlParts( + sourceUrl, + sourceRootPath, + 'HEAD', + sourceDirectory, + ); } references.push(`[source](${fullUrl})`); } diff --git a/lib/workers/repository/update/pr/changelog/bitbucket/index.spec.ts b/lib/workers/repository/update/pr/changelog/bitbucket/index.spec.ts index f4a9c45f556b5d..4eb26101e06c61 100644 --- a/lib/workers/repository/update/pr/changelog/bitbucket/index.spec.ts +++ b/lib/workers/repository/update/pr/changelog/bitbucket/index.spec.ts @@ -79,7 +79,7 @@ describe('workers/repository/update/pr/changelog/bitbucket/index', () => { it('handles release notes', async () => { httpMock .scope(apiBaseUrl) - .get('/2.0/repositories/some-org/some-repo/src?pagelen=100') + .get('/2.0/repositories/some-org/some-repo/src/HEAD?pagelen=100') .reply(200, bitbucketTreeResponse) .get('/2.0/repositories/some-org/some-repo/src/abcd/CHANGELOG.md') .reply(200, changelogMd); @@ -94,7 +94,7 @@ describe('workers/repository/update/pr/changelog/bitbucket/index', () => { it('handles missing release notes', async () => { httpMock .scope(apiBaseUrl) - .get('/2.0/repositories/some-org/some-repo/src?pagelen=100') + .get('/2.0/repositories/some-org/some-repo/src/HEAD?pagelen=100') .reply(200, bitbucketTreeResponseNoChangelogFiles); const res = await getReleaseNotesMdFile(bitbucketProject); expect(res).toBeNull(); diff --git a/lib/workers/repository/update/pr/changelog/bitbucket/index.ts b/lib/workers/repository/update/pr/changelog/bitbucket/index.ts index 56ddb2b0ac6f66..3f0ca2cce7a7ab 100644 --- a/lib/workers/repository/update/pr/changelog/bitbucket/index.ts +++ b/lib/workers/repository/update/pr/changelog/bitbucket/index.ts @@ -1,3 +1,4 @@ +import path from 'node:path'; import is from '@sindresorhus/is'; import changelogFilenameRegex from 'changelog-filename-regex'; import { logger } from '../../../../../../logger'; @@ -18,15 +19,16 @@ const bitbucketHttp = new BitbucketHttp(id); export async function getReleaseNotesMd( repository: string, apiBaseUrl: string, - _sourceDirectory?: string, + sourceDirectory?: string, ): Promise { logger.trace('bitbucket.getReleaseNotesMd()'); const repositorySourceURl = joinUrlParts( apiBaseUrl, - `2.0/repositories`, + '2.0/repositories', repository, - 'src', + 'src/HEAD', + sourceDirectory ?? '', ); const rootFiles = ( @@ -41,7 +43,9 @@ export async function getReleaseNotesMd( const allFiles = rootFiles.filter((f) => f.type === 'commit_file'); - const files = allFiles.filter((f) => changelogFilenameRegex.test(f.path)); + const files = allFiles.filter((f) => + changelogFilenameRegex.test(path.basename(f.path)), + ); const changelogFile = files .sort((a, b) => compareChangelogFilePath(a.path, b.path)) @@ -59,7 +63,10 @@ export async function getReleaseNotesMd( const fileRes = await bitbucketHttp.get( joinUrlParts( - repositorySourceURl, + apiBaseUrl, + '2.0/repositories', + repository, + 'src', changelogFile.commit.hash, changelogFile.path, ), diff --git a/lib/workers/repository/update/pr/changelog/release-notes.spec.ts b/lib/workers/repository/update/pr/changelog/release-notes.spec.ts index bb55d243a1b84e..7bb3bd2ebb0c77 100644 --- a/lib/workers/repository/update/pr/changelog/release-notes.spec.ts +++ b/lib/workers/repository/update/pr/changelog/release-notes.spec.ts @@ -35,6 +35,46 @@ const yargsChangelogMd = Fixtures.get('yargs.md'); const adapterutilsChangelogMd = Fixtures.get('adapter-utils.md'); const gitterWebappChangelogMd = Fixtures.get('gitter-webapp.md'); +const bitbucketTreeResponse = { + values: [ + { + type: 'commit_directory', + path: 'lib', + commit: { + hash: '1234', + }, + }, + { + type: 'commit_file', + path: 'CHANGELOG', + commit: { + hash: 'cdef', + }, + }, + { + type: 'commit_file', + path: 'CHANGELOG.json', + commit: { + hash: 'defg', + }, + }, + { + type: 'commit_file', + path: 'CHANGELOG.md', + commit: { + hash: 'abcd', + }, + }, + { + type: 'commit_file', + path: 'RELEASE_NOTES.md', + commit: { + hash: 'asdf', + }, + }, + ], +}; + const githubTreeResponse = { tree: [ { path: 'lib', type: 'tree' }, @@ -53,6 +93,12 @@ const gitlabTreeResponse = [ { path: 'README.md', name: 'README.md', type: 'blob' }, ]; +const bitbucketProject = partial({ + type: 'bitbucket', + apiBaseUrl: 'https://api.bitbucket.org/', + baseUrl: 'https://bitbucket.org/', +}); + const githubProject = partial({ type: 'github', apiBaseUrl: 'https://api.github.com/', @@ -1081,6 +1127,31 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { expect(res).toBeNull(); }); + it('handles bitbucket release notes link', async () => { + httpMock + .scope('https://api.bitbucket.org') + .get('/2.0/repositories/some-org/some-repo/src/HEAD?pagelen=100') + .reply(200, bitbucketTreeResponse) + .get('/2.0/repositories/some-org/some-repo/src/abcd/CHANGELOG.md') + .reply(200, angularJsChangelogMd); + + const res = await getReleaseNotesMd( + { + ...bitbucketProject, + repository: 'some-org/some-repo', + }, + partial({ + version: '1.6.9', + gitRef: '1.6.9', + }), + ); + expect(res).toMatchObject({ + notesSourceUrl: + 'https://bitbucket.org/some-org/some-repo/src/HEAD/CHANGELOG.md', + url: 'https://bitbucket.org/some-org/some-repo/src/HEAD/CHANGELOG.md#169-fiery-basilisk-2018-02-02', + }); + }); + it('parses angular.js', async () => { httpMock .scope('https://api.github.com') diff --git a/lib/workers/repository/update/pr/changelog/release-notes.ts b/lib/workers/repository/update/pr/changelog/release-notes.ts index 0fc00710fa3482..32aebe599c5a42 100644 --- a/lib/workers/repository/update/pr/changelog/release-notes.ts +++ b/lib/workers/repository/update/pr/changelog/release-notes.ts @@ -9,7 +9,7 @@ import { detectPlatform } from '../../../../../util/common'; import { linkify } from '../../../../../util/markdown'; import { newlineRegex, regEx } from '../../../../../util/regex'; import { coerceString } from '../../../../../util/string'; -import { isHttpUrl } from '../../../../../util/url'; +import { isHttpUrl, joinUrlParts } from '../../../../../util/url'; import type { BranchUpgradeConfig } from '../../../../types'; import * as bitbucket from './bitbucket'; import * as gitea from './gitea'; @@ -18,6 +18,7 @@ import * as gitlab from './gitlab'; import type { ChangeLogFile, ChangeLogNotes, + ChangeLogPlatform, ChangeLogProject, ChangeLogRelease, ChangeLogResult, @@ -359,7 +360,13 @@ export async function getReleaseNotesMd( if (word.includes(version) && !isHttpUrl(word)) { logger.trace({ body }, 'Found release notes for v' + version); // TODO: fix url - const notesSourceUrl = `${baseUrl}${repository}/blob/HEAD/${changelogFile}`; + const notesSourceUrl = joinUrlParts( + baseUrl, + repository, + getSourceRootPath(project.type), + 'HEAD', + changelogFile, + ); const mdHeadingLink = title .filter((word) => !isHttpUrl(word)) .join('-') @@ -479,3 +486,12 @@ export async function addReleaseNotes( export function shouldSkipChangelogMd(repository: string): boolean { return repositoriesToSkipMdFetching.includes(repository); } + +function getSourceRootPath(type: ChangeLogPlatform): string { + switch (type) { + case 'bitbucket': + return 'src'; + default: + return 'blob'; + } +} diff --git a/lib/workers/repository/updates/flatten.spec.ts b/lib/workers/repository/updates/flatten.spec.ts index 402efb5d6833b2..42cd3a7b3b6fe7 100644 --- a/lib/workers/repository/updates/flatten.spec.ts +++ b/lib/workers/repository/updates/flatten.spec.ts @@ -29,6 +29,11 @@ describe('workers/repository/updates/flatten', () => { enabled: false, }, }, + { + matchPackageNames: ['@monorepo/package'], + sourceUrl: 'https://github.com/some/monorepo', + sourceDirectory: "subfolder/{{ lookup (split packageName '/') 1 }}", + }, ]; config.remediations = { 'package-lock.json': [ @@ -65,6 +70,17 @@ describe('workers/repository/updates/flatten', () => { }, ], }, + { + depName: '@monorepo/package', + updates: [ + { + newValue: '2.0.0', + sourceUrl: 'https://github.com/some/monorepo', + sourceDirectory: + "subfolder/{{ lookup (split depName '/') 1 }}", + }, + ], + }, { updateTypes: ['pin'], updates: [{ newValue: '2.0.0' }], @@ -144,7 +160,7 @@ describe('workers/repository/updates/flatten', () => { ], }; const res = await flattenUpdates(config, packageFiles); - expect(res).toHaveLength(14); + expect(res).toHaveLength(15); expect( res.every( (upgrade) => @@ -178,16 +194,29 @@ describe('workers/repository/updates/flatten', () => { res.filter((update) => update.sourceRepoName)[1].sourceRepoName, ).toBe('repo'); expect( - res.filter((update) => update.sourceRepoSlug)[2].sourceRepoSlug, + res.filter((update) => update.depName === '@monorepo/package')[0], + ).toEqual( + expect.objectContaining({ + depName: '@monorepo/package', + sourceRepoOrg: 'some', + sourceRepoName: 'monorepo', + sourceRepo: 'some/monorepo', + sourceRepoSlug: 'some-monorepo', + sourceUrl: 'https://github.com/some/monorepo', + sourceDirectory: 'subfolder/package', + }), + ); + expect( + res.filter((update) => update.sourceRepoSlug)[3].sourceRepoSlug, ).toBe('nodejs-node'); - expect(res.filter((update) => update.sourceRepo)[2].sourceRepo).toBe( + expect(res.filter((update) => update.sourceRepo)[3].sourceRepo).toBe( 'nodejs/node', ); expect( - res.filter((update) => update.sourceRepoOrg)[2].sourceRepoOrg, + res.filter((update) => update.sourceRepoOrg)[3].sourceRepoOrg, ).toBe('nodejs'); expect( - res.filter((update) => update.sourceRepoName)[2].sourceRepoName, + res.filter((update) => update.sourceRepoName)[3].sourceRepoName, ).toBe('node'); expect( res.filter( diff --git a/lib/workers/repository/updates/flatten.ts b/lib/workers/repository/updates/flatten.ts index 1ff393b4abeff8..93b1d51c8556c4 100644 --- a/lib/workers/repository/updates/flatten.ts +++ b/lib/workers/repository/updates/flatten.ts @@ -9,6 +9,7 @@ import { get } from '../../../modules/manager'; import { detectSemanticCommits } from '../../../util/git/semantic'; import { applyPackageRules } from '../../../util/package-rules'; import { regEx } from '../../../util/regex'; +import * as template from '../../../util/template'; import { parseUrl } from '../../../util/url'; import type { BranchUpgradeConfig } from '../../types'; import { generateBranchName } from './branch-name'; @@ -57,6 +58,12 @@ export function applyUpdateConfig(input: BranchUpgradeConfig): any { ); // remove everything up to the last slash } } + if (updateConfig.sourceDirectory) { + updateConfig.sourceDirectory = template.compile( + updateConfig.sourceDirectory, + updateConfig, + ); + } generateBranchName(updateConfig); return updateConfig; } diff --git a/package.json b/package.json index bba5f523e916e8..d8ae021900f3dd 100644 --- a/package.json +++ b/package.json @@ -140,7 +140,7 @@ }, "volta": { "node": "22.11.0", - "pnpm": "9.12.3" + "pnpm": "9.14.2" }, "dependencies": { "@aws-sdk/client-codecommit": "3.687.0", @@ -150,25 +150,25 @@ "@aws-sdk/client-s3": "3.689.0", "@aws-sdk/credential-providers": "3.687.0", "@breejs/later": "4.2.0", - "@cdktf/hcl2json": "0.20.9", + "@cdktf/hcl2json": "0.20.10", "@opentelemetry/api": "1.9.0", - "@opentelemetry/context-async-hooks": "1.27.0", - "@opentelemetry/exporter-trace-otlp-http": "0.54.0", - "@opentelemetry/instrumentation": "0.54.0", - "@opentelemetry/instrumentation-bunyan": "0.42.0", - "@opentelemetry/instrumentation-http": "0.54.0", - "@opentelemetry/resources": "1.27.0", - "@opentelemetry/sdk-trace-base": "1.27.0", - "@opentelemetry/sdk-trace-node": "1.27.0", - "@opentelemetry/semantic-conventions": "1.27.0", + "@opentelemetry/context-async-hooks": "1.28.0", + "@opentelemetry/exporter-trace-otlp-http": "0.55.0", + "@opentelemetry/instrumentation": "0.55.0", + "@opentelemetry/instrumentation-bunyan": "0.43.0", + "@opentelemetry/instrumentation-http": "0.55.0", + "@opentelemetry/resources": "1.28.0", + "@opentelemetry/sdk-trace-base": "1.28.0", + "@opentelemetry/sdk-trace-node": "1.28.0", + "@opentelemetry/semantic-conventions": "1.28.0", "@qnighy/marshal": "0.1.3", "@renovatebot/detect-tools": "1.1.0", - "@renovatebot/kbpgp": "3.0.1", + "@renovatebot/kbpgp": "4.0.1", "@renovatebot/osv-offline": "1.5.10", - "@renovatebot/pep440": "3.0.20", - "@renovatebot/ruby-semver": "3.0.23", + "@renovatebot/pep440": "4.0.1", + "@renovatebot/ruby-semver": "4.0.0", "@sindresorhus/is": "4.6.0", - "@yarnpkg/core": "4.1.4", + "@yarnpkg/core": "4.1.6", "@yarnpkg/parsers": "3.0.2", "agentkeepalive": "4.5.0", "aggregate-error": "3.1.0", @@ -177,18 +177,18 @@ "aws4": "1.13.2", "azure-devops-node-api": "14.1.0", "bunyan": "1.8.15", - "cacache": "18.0.4", + "cacache": "19.0.1", "chalk": "4.1.2", "changelog-filename-regex": "2.0.1", "clean-git-ref": "2.0.1", "commander": "12.1.0", "conventional-commits-detector": "1.0.3", - "cron-parser": "4.9.0", - "cronstrue": "2.51.0", + "croner": "9.0.0", + "cronstrue": "2.52.0", "deepmerge": "4.3.1", "dequal": "2.0.3", "detect-indent": "6.1.0", - "diff": "5.2.0", + "diff": "7.0.0", "editorconfig": "2.0.0", "email-addresses": "5.0.0", "emoji-regex": "10.4.0", @@ -198,14 +198,14 @@ "find-packages": "10.0.4", "find-up": "5.0.0", "fs-extra": "11.2.0", - "git-url-parse": "15.0.0", + "git-url-parse": "16.0.0", "github-url-from-git": "1.5.0", "glob": "11.0.0", "global-agent": "3.0.0", "good-enough-parser": "1.1.23", - "google-auth-library": "9.14.2", + "google-auth-library": "9.15.0", "got": "11.8.6", - "graph-data-structure": "3.5.0", + "graph-data-structure": "4.2.0", "handlebars": "4.7.8", "ignore": "6.0.2", "ini": "5.0.0", @@ -231,6 +231,7 @@ "parse-link-header": "2.0.0", "prettier": "3.3.3", "protobufjs": "7.4.0", + "punycode": "2.3.1", "redis": "4.7.0", "remark": "13.0.0", "remark-github": "10.1.0", @@ -249,12 +250,12 @@ "validate-npm-package-name": "6.0.0", "vuln-vects": "1.1.0", "xmldoc": "1.3.0", - "yaml": "2.6.0", + "yaml": "2.6.1", "zod": "3.23.8" }, "optionalDependencies": { "better-sqlite3": "11.5.0", - "openpgp": "5.11.2", + "openpgp": "6.0.0", "re2": "1.21.4" }, "devDependencies": { @@ -265,13 +266,13 @@ "@jest/test-result": "29.7.0", "@jest/types": "29.6.3", "@ls-lint/ls-lint": "2.2.3", - "@openpgp/web-stream-tools": "0.0.14", + "@openpgp/web-stream-tools": "0.1.3", "@renovate/eslint-plugin": "file:tools/eslint", "@semantic-release/exec": "6.0.3", - "@swc/core": "1.8.0", + "@swc/core": "1.9.2", "@types/auth-header": "1.0.6", "@types/aws4": "1.11.6", - "@types/better-sqlite3": "7.6.11", + "@types/better-sqlite3": "7.6.12", "@types/breejs__later": "4.1.5", "@types/bunyan": "1.8.11", "@types/cacache": "17.0.2", @@ -280,7 +281,7 @@ "@types/clean-git-ref": "2.0.2", "@types/common-tags": "1.8.4", "@types/conventional-commits-detector": "1.0.2", - "@types/diff": "5.2.3", + "@types/diff": "6.0.0", "@types/eslint": "8.56.12", "@types/fs-extra": "11.0.4", "@types/git-url-parse": "9.0.3", @@ -300,6 +301,7 @@ "@types/ms": "0.7.34", "@types/node": "20.17.6", "@types/parse-link-header": "2.0.3", + "@types/punycode": "2.1.4", "@types/semver": "7.5.8", "@types/semver-stable": "3.0.2", "@types/semver-utils": "1.1.3", @@ -327,15 +329,15 @@ "expect": "29.7.0", "expect-more-jest": "5.5.0", "graphql": "16.9.0", - "husky": "9.1.6", + "husky": "9.1.7", "jest": "29.7.0", "jest-extended": "4.0.2", "jest-mock": "29.7.0", "jest-mock-extended": "3.0.7", "jest-snapshot": "29.7.0", - "markdownlint-cli2": "0.14.0", + "markdownlint-cli2": "0.15.0", "memfs": "4.14.0", - "nock": "13.5.5", + "nock": "13.5.6", "npm-run-all2": "7.0.1", "nyc": "17.1.0", "pretty-format": "29.7.0", @@ -345,11 +347,11 @@ "tmp-promise": "3.0.3", "ts-jest": "29.2.5", "ts-node": "10.9.2", - "type-fest": "4.26.1", + "type-fest": "4.27.0", "typescript": "5.6.3", "unified": "9.2.2" }, - "packageManager": "pnpm@9.12.3", + "packageManager": "pnpm@9.14.2", "files": [ "dist", "renovate-schema.json" diff --git a/pdm.lock b/pdm.lock index 186c00a77d7935..3992c4b1133e4b 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:391bc32ccf53e8559416b6c2d714ac4bb1accbfaf4b34208b080b2f88ce55b1c" +content_hash = "sha256:716a8c3a63ee7bd9ee6285fb541f0171f6c4a921422ce0a06f29831b5e716e17" [[metadata.targets]] requires_python = ">=3.11" @@ -303,7 +303,7 @@ files = [ [[package]] name = "mkdocs-material" -version = "9.5.44" +version = "9.5.46" requires_python = ">=3.8" summary = "Documentation that simply works" groups = ["default"] @@ -321,8 +321,8 @@ dependencies = [ "requests~=2.26", ] files = [ - {file = "mkdocs_material-9.5.44-py3-none-any.whl", hash = "sha256:47015f9c167d58a5ff5e682da37441fc4d66a1c79334bfc08d774763cacf69ca"}, - {file = "mkdocs_material-9.5.44.tar.gz", hash = "sha256:f3a6c968e524166b3f3ed1fb97d3ed3e0091183b0545cedf7156a2a6804c56c0"}, + {file = "mkdocs_material-9.5.46-py3-none-any.whl", hash = "sha256:98f0a2039c62e551a68aad0791a8d41324ff90c03a6e6cea381a384b84908b83"}, + {file = "mkdocs_material-9.5.46.tar.gz", hash = "sha256:ae2043f4238e572f9a40e0b577f50400d6fc31e2fef8ea141800aebf3bd273d7"}, ] [[package]] @@ -349,13 +349,13 @@ files = [ [[package]] name = "packaging" -version = "24.1" +version = "24.2" requires_python = ">=3.8" summary = "Core utilities for Python packages" groups = ["default"] files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] [[package]] @@ -483,57 +483,57 @@ files = [ [[package]] name = "regex" -version = "2024.9.11" +version = "2024.11.6" requires_python = ">=3.8" summary = "Alternative regular expression module, to replace re." groups = ["default"] files = [ - {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"}, - {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"}, - {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, - {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, - {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"}, - {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"}, - {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"}, - {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"}, + {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"}, + {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"}, + {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"}, + {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"}, + {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"}, + {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"}, + {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, ] [[package]] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f24e7e2a3b9263..cafaddd6ea0428 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,38 +33,38 @@ importers: specifier: 4.2.0 version: 4.2.0 '@cdktf/hcl2json': - specifier: 0.20.9 - version: 0.20.9 + specifier: 0.20.10 + version: 0.20.10 '@opentelemetry/api': specifier: 1.9.0 version: 1.9.0 '@opentelemetry/context-async-hooks': - specifier: 1.27.0 - version: 1.27.0(@opentelemetry/api@1.9.0) + specifier: 1.28.0 + version: 1.28.0(@opentelemetry/api@1.9.0) '@opentelemetry/exporter-trace-otlp-http': - specifier: 0.54.0 - version: 0.54.0(@opentelemetry/api@1.9.0) + specifier: 0.55.0 + version: 0.55.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': - specifier: 0.54.0 - version: 0.54.0(@opentelemetry/api@1.9.0) + specifier: 0.55.0 + version: 0.55.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-bunyan': - specifier: 0.42.0 - version: 0.42.0(@opentelemetry/api@1.9.0) + specifier: 0.43.0 + version: 0.43.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-http': - specifier: 0.54.0 - version: 0.54.0(@opentelemetry/api@1.9.0) + specifier: 0.55.0 + version: 0.55.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': - specifier: 1.27.0 - version: 1.27.0(@opentelemetry/api@1.9.0) + specifier: 1.28.0 + version: 1.28.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': - specifier: 1.27.0 - version: 1.27.0(@opentelemetry/api@1.9.0) + specifier: 1.28.0 + version: 1.28.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-node': - specifier: 1.27.0 - version: 1.27.0(@opentelemetry/api@1.9.0) + specifier: 1.28.0 + version: 1.28.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': - specifier: 1.27.0 - version: 1.27.0 + specifier: 1.28.0 + version: 1.28.0 '@qnighy/marshal': specifier: 0.1.3 version: 0.1.3 @@ -72,23 +72,23 @@ importers: specifier: 1.1.0 version: 1.1.0 '@renovatebot/kbpgp': - specifier: 3.0.1 - version: 3.0.1 + specifier: 4.0.1 + version: 4.0.1 '@renovatebot/osv-offline': specifier: 1.5.10 version: 1.5.10(encoding@0.1.13) '@renovatebot/pep440': - specifier: 3.0.20 - version: 3.0.20 + specifier: 4.0.1 + version: 4.0.1 '@renovatebot/ruby-semver': - specifier: 3.0.23 - version: 3.0.23 + specifier: 4.0.0 + version: 4.0.0 '@sindresorhus/is': specifier: 4.6.0 version: 4.6.0 '@yarnpkg/core': - specifier: 4.1.4 - version: 4.1.4(typanion@3.14.0) + specifier: 4.1.6 + version: 4.1.6(typanion@3.14.0) '@yarnpkg/parsers': specifier: 3.0.2 version: 3.0.2 @@ -114,8 +114,8 @@ importers: specifier: 1.8.15 version: 1.8.15 cacache: - specifier: 18.0.4 - version: 18.0.4 + specifier: 19.0.1 + version: 19.0.1 chalk: specifier: 4.1.2 version: 4.1.2 @@ -131,12 +131,12 @@ importers: conventional-commits-detector: specifier: 1.0.3 version: 1.0.3 - cron-parser: - specifier: 4.9.0 - version: 4.9.0 + croner: + specifier: 9.0.0 + version: 9.0.0 cronstrue: - specifier: 2.51.0 - version: 2.51.0 + specifier: 2.52.0 + version: 2.52.0 deepmerge: specifier: 4.3.1 version: 4.3.1 @@ -147,8 +147,8 @@ importers: specifier: 6.1.0 version: 6.1.0 diff: - specifier: 5.2.0 - version: 5.2.0 + specifier: 7.0.0 + version: 7.0.0 editorconfig: specifier: 2.0.0 version: 2.0.0 @@ -177,8 +177,8 @@ importers: specifier: 11.2.0 version: 11.2.0 git-url-parse: - specifier: 15.0.0 - version: 15.0.0 + specifier: 16.0.0 + version: 16.0.0 github-url-from-git: specifier: 1.5.0 version: 1.5.0 @@ -192,14 +192,14 @@ importers: specifier: 1.1.23 version: 1.1.23 google-auth-library: - specifier: 9.14.2 - version: 9.14.2(encoding@0.1.13) + specifier: 9.15.0 + version: 9.15.0(encoding@0.1.13) got: specifier: 11.8.6 version: 11.8.6 graph-data-structure: - specifier: 3.5.0 - version: 3.5.0 + specifier: 4.2.0 + version: 4.2.0 handlebars: specifier: 4.7.8 version: 4.7.8 @@ -275,6 +275,9 @@ importers: protobufjs: specifier: 7.4.0 version: 7.4.0 + punycode: + specifier: 2.3.1 + version: 2.3.1 redis: specifier: 4.7.0 version: 4.7.0 @@ -330,8 +333,8 @@ importers: specifier: 1.3.0 version: 1.3.0 yaml: - specifier: 2.6.0 - version: 2.6.0 + specifier: 2.6.1 + version: 2.6.1 zod: specifier: 3.23.8 version: 3.23.8 @@ -340,8 +343,8 @@ importers: specifier: 11.5.0 version: 11.5.0 openpgp: - specifier: 5.11.2 - version: 5.11.2 + specifier: 6.0.0 + version: 6.0.0 re2: specifier: 1.21.4 version: 1.21.4 @@ -368,8 +371,8 @@ importers: specifier: 2.2.3 version: 2.2.3 '@openpgp/web-stream-tools': - specifier: 0.0.14 - version: 0.0.14(typescript@5.6.3) + specifier: 0.1.3 + version: 0.1.3(typescript@5.6.3) '@renovate/eslint-plugin': specifier: file:tools/eslint version: '@renovatebot/eslint-plugin@file:tools/eslint' @@ -377,8 +380,8 @@ importers: specifier: 6.0.3 version: 6.0.3(semantic-release@24.2.0(typescript@5.6.3)) '@swc/core': - specifier: 1.8.0 - version: 1.8.0 + specifier: 1.9.2 + version: 1.9.2 '@types/auth-header': specifier: 1.0.6 version: 1.0.6 @@ -386,8 +389,8 @@ importers: specifier: 1.11.6 version: 1.11.6 '@types/better-sqlite3': - specifier: 7.6.11 - version: 7.6.11 + specifier: 7.6.12 + version: 7.6.12 '@types/breejs__later': specifier: 4.1.5 version: 4.1.5 @@ -413,8 +416,8 @@ importers: specifier: 1.0.2 version: 1.0.2 '@types/diff': - specifier: 5.2.3 - version: 5.2.3 + specifier: 6.0.0 + version: 6.0.0 '@types/eslint': specifier: 8.56.12 version: 8.56.12 @@ -472,6 +475,9 @@ importers: '@types/parse-link-header': specifier: 2.0.3 version: 2.0.3 + '@types/punycode': + specifier: 2.1.4 + version: 2.1.4 '@types/semver': specifier: 7.5.8 version: 7.5.8 @@ -534,7 +540,7 @@ importers: version: 2.31.0(@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) eslint-plugin-jest: specifier: 28.8.3 - version: 28.8.3(@typescript-eslint/eslint-plugin@8.11.0(@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)))(typescript@5.6.3) + version: 28.8.3(@typescript-eslint/eslint-plugin@8.11.0(@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)))(typescript@5.6.3) eslint-plugin-jest-formatting: specifier: 3.1.0 version: 3.1.0(eslint@8.57.1) @@ -554,32 +560,32 @@ importers: specifier: 16.9.0 version: 16.9.0 husky: - specifier: 9.1.6 - version: 9.1.6 + specifier: 9.1.7 + version: 9.1.7 jest: specifier: 29.7.0 - version: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)) + version: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)) jest-extended: specifier: 4.0.2 - version: 4.0.2(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3))) + version: 4.0.2(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3))) jest-mock: specifier: 29.7.0 version: 29.7.0 jest-mock-extended: specifier: 3.0.7 - version: 3.0.7(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)))(typescript@5.6.3) + version: 3.0.7(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)))(typescript@5.6.3) jest-snapshot: specifier: 29.7.0 version: 29.7.0 markdownlint-cli2: - specifier: 0.14.0 - version: 0.14.0 + specifier: 0.15.0 + version: 0.15.0 memfs: specifier: 4.14.0 version: 4.14.0 nock: - specifier: 13.5.5 - version: 13.5.5 + specifier: 13.5.6 + version: 13.5.6 npm-run-all2: specifier: 7.0.1 version: 7.0.1 @@ -603,13 +609,13 @@ importers: version: 3.0.3 ts-jest: specifier: 29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)))(typescript@5.6.3) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3) + version: 10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3) type-fest: - specifier: 4.26.1 - version: 4.26.1 + specifier: 4.27.0 + version: 4.27.0 typescript: specifier: 5.6.3 version: 5.6.3 @@ -809,8 +815,8 @@ packages: resolution: {integrity: sha512-9doB6O4FAlnWZrvnFDUxTtSFtuL8kUqxlP00HTiDgL1uDJZ8e0S4gqjKR+9+N5goFtxGi7IJeNsDEz2H7imvgw==} engines: {node: '>=16.0.0'} - '@aws-sdk/util-locate-window@3.679.0': - resolution: {integrity: sha512-zKTd48/ZWrCplkXpYDABI74rQlbR0DNHs8nH95htfSLj9/mWRSwaGptoxwcihaq/77vi/fl2X3y0a1Bo8bt7RA==} + '@aws-sdk/util-locate-window@3.693.0': + resolution: {integrity: sha512-ttrag6haJLWABhLqtg1Uf+4LgHWIMOVSYL+VYZmAp2v4PUGOwWmWQH0Zk8RM7YuQcLfH/EoR72/Yxz6A4FKcuw==} engines: {node: '>=16.0.0'} '@aws-sdk/util-user-agent-browser@3.686.0': @@ -998,8 +1004,8 @@ packages: resolution: {integrity: sha512-EVMD0SgJtOuFeg0lAVbCwa+qeTKILb87jqvLyUtQswGD9+ce2nB52Y5zbTF1Hc0MDFfbydcMcxb47jSdhikVHA==} engines: {node: '>= 10'} - '@cdktf/hcl2json@0.20.9': - resolution: {integrity: sha512-HlYqFsvEANyQJiQx8L2j05xot+bKa6T6PInc11dUCyQh8SbpVehdbGVN39TVnv1lIjdG7E2WNuxOf1L/Y3oF5w==} + '@cdktf/hcl2json@0.20.10': + resolution: {integrity: sha512-oh8g9727sSEnwRjIjPYnhTn4mvvxclRcovf5GIkFED+4HpiBLioVUUsX33rFk6wZZh175uJBOAvQ/qVG+Uaqyw==} '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} @@ -1209,6 +1215,10 @@ packages: resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/fs@4.0.0': + resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} + engines: {node: ^18.17.0 || >=20.5.0} + '@octokit/auth-token@4.0.0': resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} engines: {node: '>= 18'} @@ -1306,108 +1316,109 @@ packages: '@one-ini/wasm@0.1.1': resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} - '@openpgp/web-stream-tools@0.0.14': - resolution: {integrity: sha512-6btCNVf6YSsmlyIS7yw+IbzXeXCEcJxeSpxvSxkDuZj9B/ekt4fXkZj4oOaIxG4SKTftIK1svnlVroJ1cCMT4g==} + '@openpgp/web-stream-tools@0.1.3': + resolution: {integrity: sha512-mT/ds43cH6c+AO5RFpxs+LkACr7KjC3/dZWHrP6KPrWJu4uJ/XJ+p7telaoYiqUfdjiiIvdNSOfhezW9fkmboQ==} + engines: {node: '>= 18.0.0'} peerDependencies: typescript: '>=4.2' peerDependenciesMeta: typescript: optional: true - '@opentelemetry/api-logs@0.54.0': - resolution: {integrity: sha512-9HhEh5GqFrassUndqJsyW7a0PzfyWr2eV2xwzHLIS+wX3125+9HE9FMRAKmJRwxZhgZGwH3HNQQjoMGZqmOeVA==} + '@opentelemetry/api-logs@0.55.0': + resolution: {integrity: sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==} engines: {node: '>=14'} '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@opentelemetry/context-async-hooks@1.27.0': - resolution: {integrity: sha512-CdZ3qmHCwNhFAzjTgHqrDQ44Qxcpz43cVxZRhOs+Ns/79ug+Mr84Bkb626bkJLkA3+BLimA5YAEVRlJC6pFb7g==} + '@opentelemetry/context-async-hooks@1.28.0': + resolution: {integrity: sha512-igcl4Ve+F1N2063PJUkesk/GkYyuGIWinYkSyAFTnIj3gzrOgvOA4k747XNdL47HRRL1w/qh7UW8NDuxOLvKFA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@1.27.0': - resolution: {integrity: sha512-yQPKnK5e+76XuiqUH/gKyS8wv/7qITd5ln56QkBTf3uggr0VkXOXfcaAuG330UfdYu83wsyoBwqwxigpIG+Jkg==} + '@opentelemetry/core@1.28.0': + resolution: {integrity: sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/exporter-trace-otlp-http@0.54.0': - resolution: {integrity: sha512-00X6rtr6Ew59+MM9pPSH7Ww5ScpWKBLiBA49awbPqQuVL/Bp0qp7O1cTxKHgjWdNkhsELzJxAEYwuRnDGrMXyA==} + '@opentelemetry/exporter-trace-otlp-http@0.55.0': + resolution: {integrity: sha512-lMiNic63EVHpW+eChmLD2CieDmwQBFi72+LFbh8+5hY0ShrDGrsGP/zuT5MRh7M/vM/UZYO/2A/FYd7CMQGR7A==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-bunyan@0.42.0': - resolution: {integrity: sha512-GBh6ybwKmFZjc86SyHVx72jHg+4pFPaXT3IZgJ4QtnMsMf0/q5m2aHAjid+yakmEkApsnRWX8pJ8nkl1e+6mag==} + '@opentelemetry/instrumentation-bunyan@0.43.0': + resolution: {integrity: sha512-nAAXMx63tXXWwuPiTLWTxDRBqXDRvcfE4H3IrXZbrls3BO7P7SkTZ9dvwPCuTku4rRUhEEDpV8vq9Ng4Pk/Uzw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-http@0.54.0': - resolution: {integrity: sha512-ovl0UrL+vGpi0O7fdZ1mHRdiQkuv6NGMRBRKZZygVCUFNXdoqTpvJRRbTYih5U5FC+PHIFssEordmlblRCaGUg==} + '@opentelemetry/instrumentation-http@0.55.0': + resolution: {integrity: sha512-AO27XSjkgNicfy/YBthskFAwx9VfaO7tChrLaTONTfOWv14GlB3Rs2eTYpywZIHWsW2cR5hvVkcDte4GV0stoA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation@0.54.0': - resolution: {integrity: sha512-B0Ydo9g9ehgNHwtpc97XivEzjz0XBKR6iQ83NTENIxEEf5NHE0otZQuZLgDdey1XNk+bP1cfRpIkSFWM5YlSyg==} + '@opentelemetry/instrumentation@0.55.0': + resolution: {integrity: sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-exporter-base@0.54.0': - resolution: {integrity: sha512-g+H7+QleVF/9lz4zhaR9Dt4VwApjqG5WWupy5CTMpWJfHB/nLxBbX73GBZDgdiNfh08nO3rNa6AS7fK8OhgF5g==} + '@opentelemetry/otlp-exporter-base@0.55.0': + resolution: {integrity: sha512-iHQI0Zzq3h1T6xUJTVFwmFl5Dt5y1es+fl4kM+k5T/3YvmVyeYkSiF+wHCg6oKrlUAJfk+t55kaAu3sYmt7ZYA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-transformer@0.54.0': - resolution: {integrity: sha512-jRexIASQQzdK4AjfNIBfn94itAq4Q8EXR9d3b/OVbhd3kKQKvMr7GkxYDjbeTbY7hHCOLcLfJ3dpYQYGOe8qOQ==} + '@opentelemetry/otlp-transformer@0.55.0': + resolution: {integrity: sha512-kVqEfxtp6mSN2Dhpy0REo1ghP4PYhC1kMHQJ2qVlO99Pc+aigELjZDfg7/YKmL71gR6wVGIeJfiql/eXL7sQPA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/propagator-b3@1.27.0': - resolution: {integrity: sha512-pTsko3gnMioe3FeWcwTQR3omo5C35tYsKKwjgTCTVCgd3EOWL9BZrMfgLBmszrwXABDfUrlAEFN/0W0FfQGynQ==} + '@opentelemetry/propagator-b3@1.28.0': + resolution: {integrity: sha512-Q7HVDIMwhN5RxL4bECMT4BdbyYSAKkC6U/RGn4NpO/cbqP6ZRg+BS7fPo/pGZi2w8AHfpIGQFXQmE8d2PC5xxQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/propagator-jaeger@1.27.0': - resolution: {integrity: sha512-EI1bbK0wn0yIuKlc2Qv2LKBRw6LiUWevrjCF80fn/rlaB+7StAi8Y5s8DBqAYNpY7v1q86+NjU18v7hj2ejU3A==} + '@opentelemetry/propagator-jaeger@1.28.0': + resolution: {integrity: sha512-wKJ94+s8467CnIRgoSRh0yXm/te0QMOwTq9J01PfG/RzYZvlvN8aRisN2oZ9SznB45dDGnMj3BhUlchSA9cEKA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/resources@1.27.0': - resolution: {integrity: sha512-jOwt2VJ/lUD5BLc+PMNymDrUCpm5PKi1E9oSVYAvz01U/VdndGmrtV3DU1pG4AwlYhJRHbHfOUIlpBeXCPw6QQ==} + '@opentelemetry/resources@1.28.0': + resolution: {integrity: sha512-cIyXSVJjGeTICENN40YSvLDAq4Y2502hGK3iN7tfdynQLKWb3XWZQEkPc+eSx47kiy11YeFAlYkEfXwR1w8kfw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-logs@0.54.0': - resolution: {integrity: sha512-HeWvOPiWhEw6lWvg+lCIi1WhJnIPbI4/OFZgHq9tKfpwF3LX6/kk3+GR8sGUGAEZfbjPElkkngzvd2s03zbD7Q==} + '@opentelemetry/sdk-logs@0.55.0': + resolution: {integrity: sha512-TSx+Yg/d48uWW6HtjS1AD5x6WPfLhDWLl/WxC7I2fMevaiBuKCuraxTB8MDXieCNnBI24bw9ytyXrDCswFfWgA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.4.0 <1.10.0' - '@opentelemetry/sdk-metrics@1.27.0': - resolution: {integrity: sha512-JzWgzlutoXCydhHWIbLg+r76m+m3ncqvkCcsswXAQ4gqKS+LOHKhq+t6fx1zNytvLuaOUBur7EvWxECc4jPQKg==} + '@opentelemetry/sdk-metrics@1.28.0': + resolution: {integrity: sha512-43tqMK/0BcKTyOvm15/WQ3HLr0Vu/ucAl/D84NO7iSlv6O4eOprxSHa3sUtmYkaZWHqdDJV0AHVz/R6u4JALVQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-trace-base@1.27.0': - resolution: {integrity: sha512-btz6XTQzwsyJjombpeqCX6LhiMQYpzt2pIYNPnw0IPO/3AhT6yjnf8Mnv3ZC2A4eRYOjqrg+bfaXg9XHDRJDWQ==} + '@opentelemetry/sdk-trace-base@1.28.0': + resolution: {integrity: sha512-ceUVWuCpIao7Y5xE02Xs3nQi0tOGmMea17ecBdwtCvdo9ekmO+ijc9RFDgfifMl7XCBf41zne/1POM3LqSTZDA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-trace-node@1.27.0': - resolution: {integrity: sha512-dWZp/dVGdUEfRBjBq2BgNuBlFqHCxyyMc8FsN0NX15X07mxSUO0SZRLyK/fdAVrde8nqFI/FEdMH4rgU9fqJfQ==} + '@opentelemetry/sdk-trace-node@1.28.0': + resolution: {integrity: sha512-N0sYfYXvHpP0FNIyc+UfhLnLSTOuZLytV0qQVrDWIlABeD/DWJIGttS7nYeR14gQLXch0M1DW8zm3VeN6Opwtg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' @@ -1416,6 +1427,10 @@ packages: resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} engines: {node: '>=14'} + '@opentelemetry/semantic-conventions@1.28.0': + resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} + engines: {node: '>=14'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1532,9 +1547,9 @@ packages: '@renovatebot/eslint-plugin@file:tools/eslint': resolution: {directory: tools/eslint, type: directory} - '@renovatebot/kbpgp@3.0.1': - resolution: {integrity: sha512-n78K03XvVIVhE95Thlmq+AXl6j9gYKnsKtrVzU7vnmsKNQDSPn8zTRs1wXGjjdup9REPmqRNcITeq3NsG32QYQ==} - engines: {node: ^18.12.0 || >=20.9.0, pnpm: ^9.0.0} + '@renovatebot/kbpgp@4.0.1': + resolution: {integrity: sha512-Uj52QvCuIr9qwvbPR3fymQFMwn0MIKItZrEKywNoSF7K4UVfrtBW3DGVQ9KZ2D5tFR3LgrlPdhNSYEkEVAQ4OA==} + engines: {node: ^20.9.0 || ^22.11.0, pnpm: ^9.0.0} '@renovatebot/osv-offline-db@1.6.0': resolution: {integrity: sha512-cEOCTyd3+/7gPDmBn0pyJtF01+f9e/dJ1mOoML+v5AsP8GIPAzhtQUuIB5FiCxS4IsbP0qm34anYUZHGJldNJA==} @@ -1542,13 +1557,13 @@ packages: '@renovatebot/osv-offline@1.5.10': resolution: {integrity: sha512-3Nu7bGVQGm0rJwGoHxZjc80cERtK7r25aii8aBwK2+JLAacC7xLju2WzuELt1TWSx/yt+QjA4ouWSC5/JnlmHw==} - '@renovatebot/pep440@3.0.20': - resolution: {integrity: sha512-Jw8jzHh2r1LAPTrjQlIwh/+8J3N2MqXZgPuTt6HdNeJIBjJskV8bsEfGs9rBzXi/omeHob3BXnvlECu2rCCUYw==} - engines: {node: ^18.12.0 || >= 20.0.0, pnpm: ^8.6.11} + '@renovatebot/pep440@4.0.1': + resolution: {integrity: sha512-jKodfnFIIGjK9PcoB7+2JkDQ+prjv3LHFMUS21F3+IEaiGomrvpiH27+gjyQRRwtSkkRnrxkqjEPdkj2IxC2qA==} + engines: {node: ^20.9.0 || ^22.11.0, pnpm: ^9.0.0} - '@renovatebot/ruby-semver@3.0.23': - resolution: {integrity: sha512-YGvsvvyxOgv5Uq+sFEdD1yviyrPGs9hocjhIo7uWTj/EAIlbGyk5YA5JrHql3EkJf0tVsyfmEkM3kLK+45hmIw==} - engines: {node: ^18.12.0 || >= 20.0.0, pnpm: ^8.6.11} + '@renovatebot/ruby-semver@4.0.0': + resolution: {integrity: sha512-vuLfebLvwYWwQYJeZiHHs5NmydjO6cdhwS1dUHJbXMi0WD8kBa/+f7gz4WcuNJPRR+enLFQUHs89OCjfl6Os0g==} + engines: {node: ^20.9.0 || ^22.11.0, pnpm: ^9.0.0} '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -1582,8 +1597,8 @@ packages: peerDependencies: semantic-release: '>=18.0.0' - '@semantic-release/github@11.0.0': - resolution: {integrity: sha512-Uon6G6gJD8U1JNvPm7X0j46yxNRJ8Ui6SgK4Zw5Ktu8RgjEft3BGn+l/RX1TTzhhO3/uUcKuqM+/9/ETFxWS/Q==} + '@semantic-release/github@11.0.1': + resolution: {integrity: sha512-Z9cr0LgU/zgucbT9cksH0/pX9zmVda9hkDPcgIE0uvjMQ8w/mElDivGjx1w1pEQ+MuQJ5CBq3VCF16S6G4VH3A==} engines: {node: '>=20.8.1'} peerDependencies: semantic-release: '>=24.1.0' @@ -1633,8 +1648,8 @@ packages: '@sinonjs/text-encoding@0.7.3': resolution: {integrity: sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==} - '@smithy/abort-controller@3.1.6': - resolution: {integrity: sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==} + '@smithy/abort-controller@3.1.8': + resolution: {integrity: sha512-+3DOBcUn5/rVjlxGvUPKc416SExarAQ+Qe0bqk30YSUjbepwpS7QN0cyKUSifvLJhdMZ0WPzPP5ymut0oonrpQ==} engines: {node: '>=16.0.0'} '@smithy/chunked-blob-reader-native@3.0.1': @@ -1643,53 +1658,53 @@ packages: '@smithy/chunked-blob-reader@4.0.0': resolution: {integrity: sha512-jSqRnZvkT4egkq/7b6/QRCNXmmYVcHwnJldqJ3IhVpQE2atObVJ137xmGeuGFhjFUr8gCEVAOKwSY79OvpbDaQ==} - '@smithy/config-resolver@3.0.10': - resolution: {integrity: sha512-Uh0Sz9gdUuz538nvkPiyv1DZRX9+D15EKDtnQP5rYVAzM/dnYk3P8cg73jcxyOitPgT3mE3OVj7ky7sibzHWkw==} + '@smithy/config-resolver@3.0.12': + resolution: {integrity: sha512-YAJP9UJFZRZ8N+UruTeq78zkdjUHmzsY62J4qKWZ4SXB4QXJ/+680EfXXgkYA2xj77ooMqtUY9m406zGNqwivQ==} engines: {node: '>=16.0.0'} - '@smithy/core@2.5.1': - resolution: {integrity: sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg==} + '@smithy/core@2.5.4': + resolution: {integrity: sha512-iFh2Ymn2sCziBRLPuOOxRPkuCx/2gBdXtBGuCUFLUe6bWYjKnhHyIPqGeNkLZ5Aco/5GjebRTBFiWID3sDbrKw==} engines: {node: '>=16.0.0'} - '@smithy/credential-provider-imds@3.2.5': - resolution: {integrity: sha512-4FTQGAsuwqTzVMmiRVTn0RR9GrbRfkP0wfu/tXWVHd2LgNpTY0uglQpIScXK4NaEyXbB3JmZt8gfVqO50lP8wg==} + '@smithy/credential-provider-imds@3.2.7': + resolution: {integrity: sha512-cEfbau+rrWF8ylkmmVAObOmjbTIzKyUC5TkBL58SbLywD0RCBC4JAUKbmtSm2w5KUJNRPGgpGFMvE2FKnuNlWQ==} engines: {node: '>=16.0.0'} - '@smithy/eventstream-codec@3.1.7': - resolution: {integrity: sha512-kVSXScIiRN7q+s1x7BrQtZ1Aa9hvvP9FeCqCdBxv37GimIHgBCOnZ5Ip80HLt0DhnAKpiobFdGqTFgbaJNrazA==} + '@smithy/eventstream-codec@3.1.9': + resolution: {integrity: sha512-F574nX0hhlNOjBnP+noLtsPFqXnWh2L0+nZKCwcu7P7J8k+k+rdIDs+RMnrMwrzhUE4mwMgyN0cYnEn0G8yrnQ==} - '@smithy/eventstream-serde-browser@3.0.11': - resolution: {integrity: sha512-Pd1Wnq3CQ/v2SxRifDUihvpXzirJYbbtXfEnnLV/z0OGCTx/btVX74P86IgrZkjOydOASBGXdPpupYQI+iO/6A==} + '@smithy/eventstream-serde-browser@3.0.13': + resolution: {integrity: sha512-Nee9m+97o9Qj6/XeLz2g2vANS2SZgAxV4rDBMKGHvFJHU/xz88x2RwCkwsvEwYjSX4BV1NG1JXmxEaDUzZTAtw==} engines: {node: '>=16.0.0'} - '@smithy/eventstream-serde-config-resolver@3.0.8': - resolution: {integrity: sha512-zkFIG2i1BLbfoGQnf1qEeMqX0h5qAznzaZmMVNnvPZz9J5AWBPkOMckZWPedGUPcVITacwIdQXoPcdIQq5FRcg==} + '@smithy/eventstream-serde-config-resolver@3.0.10': + resolution: {integrity: sha512-K1M0x7P7qbBUKB0UWIL5KOcyi6zqV5mPJoL0/o01HPJr0CSq3A9FYuJC6e11EX6hR8QTIR++DBiGrYveOu6trw==} engines: {node: '>=16.0.0'} - '@smithy/eventstream-serde-node@3.0.10': - resolution: {integrity: sha512-hjpU1tIsJ9qpcoZq9zGHBJPBOeBGYt+n8vfhDwnITPhEre6APrvqq/y3XMDEGUT2cWQ4ramNqBPRbx3qn55rhw==} + '@smithy/eventstream-serde-node@3.0.12': + resolution: {integrity: sha512-kiZymxXvZ4tnuYsPSMUHe+MMfc4FTeFWJIc0Q5wygJoUQM4rVHNghvd48y7ppuulNMbuYt95ah71pYc2+o4JOA==} engines: {node: '>=16.0.0'} - '@smithy/eventstream-serde-universal@3.0.10': - resolution: {integrity: sha512-ewG1GHbbqsFZ4asaq40KmxCmXO+AFSM1b+DcO2C03dyJj/ZH71CiTg853FSE/3SHK9q3jiYQIFjlGSwfxQ9kww==} + '@smithy/eventstream-serde-universal@3.0.12': + resolution: {integrity: sha512-1i8ifhLJrOZ+pEifTlF0EfZzMLUGQggYQ6WmZ4d5g77zEKf7oZ0kvh1yKWHPjofvOwqrkwRDVuxuYC8wVd662A==} engines: {node: '>=16.0.0'} - '@smithy/fetch-http-handler@4.0.0': - resolution: {integrity: sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==} + '@smithy/fetch-http-handler@4.1.1': + resolution: {integrity: sha512-bH7QW0+JdX0bPBadXt8GwMof/jz0H28I84hU1Uet9ISpzUqXqRQ3fEZJ+ANPOhzSEczYvANNl3uDQDYArSFDtA==} - '@smithy/hash-blob-browser@3.1.7': - resolution: {integrity: sha512-4yNlxVNJifPM5ThaA5HKnHkn7JhctFUHvcaz6YXxHlYOSIrzI6VKQPTN8Gs1iN5nqq9iFcwIR9THqchUCouIfg==} + '@smithy/hash-blob-browser@3.1.9': + resolution: {integrity: sha512-wOu78omaUuW5DE+PVWXiRKWRZLecARyP3xcq5SmkXUw9+utgN8HnSnBfrjL2B/4ZxgqPjaAJQkC/+JHf1ITVaQ==} - '@smithy/hash-node@3.0.8': - resolution: {integrity: sha512-tlNQYbfpWXHimHqrvgo14DrMAgUBua/cNoz9fMYcDmYej7MAmUcjav/QKQbFc3NrcPxeJ7QClER4tWZmfwoPng==} + '@smithy/hash-node@3.0.10': + resolution: {integrity: sha512-3zWGWCHI+FlJ5WJwx73Mw2llYR8aflVyZN5JhoqLxbdPZi6UyKSdCeXAWJw9ja22m6S6Tzz1KZ+kAaSwvydi0g==} engines: {node: '>=16.0.0'} - '@smithy/hash-stream-node@3.1.7': - resolution: {integrity: sha512-xMAsvJ3hLG63lsBVi1Hl6BBSfhd8/Qnp8fC06kjOpJvyyCEXdwHITa5Kvdsk6gaAXLhbZMhQMIGvgUbfnJDP6Q==} + '@smithy/hash-stream-node@3.1.9': + resolution: {integrity: sha512-3XfHBjSP3oDWxLmlxnt+F+FqXpL3WlXs+XXaB6bV9Wo8BBu87fK1dSEsyH7Z4ZHRmwZ4g9lFMdf08m9hoX1iRA==} engines: {node: '>=16.0.0'} - '@smithy/invalid-dependency@3.0.8': - resolution: {integrity: sha512-7Qynk6NWtTQhnGTTZwks++nJhQ1O54Mzi7fz4PqZOiYXb4Z1Flpb2yRvdALoggTS8xjtohWUM+RygOtB30YL3Q==} + '@smithy/invalid-dependency@3.0.10': + resolution: {integrity: sha512-Lp2L65vFi+cj0vFMu2obpPW69DU+6O5g3086lmI4XcnRCG8PxvpWC7XyaVwJCxsZFzueHjXnrOH/E0pl0zikfA==} '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} @@ -1699,75 +1714,75 @@ packages: resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} engines: {node: '>=16.0.0'} - '@smithy/md5-js@3.0.8': - resolution: {integrity: sha512-LwApfTK0OJ/tCyNUXqnWCKoE2b4rDSr4BJlDAVCkiWYeHESr+y+d5zlAanuLW6fnitVJRD/7d9/kN/ZM9Su4mA==} + '@smithy/md5-js@3.0.10': + resolution: {integrity: sha512-m3bv6dApflt3fS2Y1PyWPUtRP7iuBlvikEOGwu0HsCZ0vE7zcIX+dBoh3e+31/rddagw8nj92j0kJg2TfV+SJA==} - '@smithy/middleware-content-length@3.0.10': - resolution: {integrity: sha512-T4dIdCs1d/+/qMpwhJ1DzOhxCZjZHbHazEPJWdB4GDi2HjIZllVzeBEcdJUN0fomV8DURsgOyrbEUzg3vzTaOg==} + '@smithy/middleware-content-length@3.0.12': + resolution: {integrity: sha512-1mDEXqzM20yywaMDuf5o9ue8OkJ373lSPbaSjyEvkWdqELhFMyNNgKGWL/rCSf4KME8B+HlHKuR8u9kRj8HzEQ==} engines: {node: '>=16.0.0'} - '@smithy/middleware-endpoint@3.2.1': - resolution: {integrity: sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==} + '@smithy/middleware-endpoint@3.2.4': + resolution: {integrity: sha512-TybiW2LA3kYVd3e+lWhINVu1o26KJbBwOpADnf0L4x/35vLVica77XVR5hvV9+kWeTGeSJ3IHTcYxbRxlbwhsg==} engines: {node: '>=16.0.0'} - '@smithy/middleware-retry@3.0.25': - resolution: {integrity: sha512-m1F70cPaMBML4HiTgCw5I+jFNtjgz5z5UdGnUbG37vw6kh4UvizFYjqJGHvicfgKMkDL6mXwyPp5mhZg02g5sg==} + '@smithy/middleware-retry@3.0.28': + resolution: {integrity: sha512-vK2eDfvIXG1U64FEUhYxoZ1JSj4XFbYWkK36iz02i3pFwWiDz1Q7jKhGTBCwx/7KqJNk4VS7d7cDLXFOvP7M+g==} engines: {node: '>=16.0.0'} - '@smithy/middleware-serde@3.0.8': - resolution: {integrity: sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==} + '@smithy/middleware-serde@3.0.10': + resolution: {integrity: sha512-MnAuhh+dD14F428ubSJuRnmRsfOpxSzvRhaGVTvd/lrUDE3kxzCCmH8lnVTvoNQnV2BbJ4c15QwZ3UdQBtFNZA==} engines: {node: '>=16.0.0'} - '@smithy/middleware-stack@3.0.8': - resolution: {integrity: sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==} + '@smithy/middleware-stack@3.0.10': + resolution: {integrity: sha512-grCHyoiARDBBGPyw2BeicpjgpsDFWZZxptbVKb3CRd/ZA15F/T6rZjCCuBUjJwdck1nwUuIxYtsS4H9DDpbP5w==} engines: {node: '>=16.0.0'} - '@smithy/node-config-provider@3.1.9': - resolution: {integrity: sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==} + '@smithy/node-config-provider@3.1.11': + resolution: {integrity: sha512-URq3gT3RpDikh/8MBJUB+QGZzfS7Bm6TQTqoh4CqE8NBuyPkWa5eUXj0XFcFfeZVgg3WMh1u19iaXn8FvvXxZw==} engines: {node: '>=16.0.0'} - '@smithy/node-http-handler@3.2.5': - resolution: {integrity: sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==} + '@smithy/node-http-handler@3.3.1': + resolution: {integrity: sha512-fr+UAOMGWh6bn4YSEezBCpJn9Ukp9oR4D32sCjCo7U81evE11YePOQ58ogzyfgmjIO79YeOdfXXqr0jyhPQeMg==} engines: {node: '>=16.0.0'} - '@smithy/property-provider@3.1.8': - resolution: {integrity: sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==} + '@smithy/property-provider@3.1.10': + resolution: {integrity: sha512-n1MJZGTorTH2DvyTVj+3wXnd4CzjJxyXeOgnTlgNVFxaaMeT4OteEp4QrzF8p9ee2yg42nvyVK6R/awLCakjeQ==} engines: {node: '>=16.0.0'} - '@smithy/protocol-http@4.1.5': - resolution: {integrity: sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==} + '@smithy/protocol-http@4.1.7': + resolution: {integrity: sha512-FP2LepWD0eJeOTm0SjssPcgqAlDFzOmRXqXmGhfIM52G7Lrox/pcpQf6RP4F21k0+O12zaqQt5fCDOeBtqY6Cg==} engines: {node: '>=16.0.0'} - '@smithy/querystring-builder@3.0.8': - resolution: {integrity: sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==} + '@smithy/querystring-builder@3.0.10': + resolution: {integrity: sha512-nT9CQF3EIJtIUepXQuBFb8dxJi3WVZS3XfuDksxSCSn+/CzZowRLdhDn+2acbBv8R6eaJqPupoI/aRFIImNVPQ==} engines: {node: '>=16.0.0'} - '@smithy/querystring-parser@3.0.8': - resolution: {integrity: sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==} + '@smithy/querystring-parser@3.0.10': + resolution: {integrity: sha512-Oa0XDcpo9SmjhiDD9ua2UyM3uU01ZTuIrNdZvzwUTykW1PM8o2yJvMh1Do1rY5sUQg4NDV70dMi0JhDx4GyxuQ==} engines: {node: '>=16.0.0'} - '@smithy/service-error-classification@3.0.8': - resolution: {integrity: sha512-uEC/kCCFto83bz5ZzapcrgGqHOh/0r69sZ2ZuHlgoD5kYgXJEThCoTuw/y1Ub3cE7aaKdznb+jD9xRPIfIwD7g==} + '@smithy/service-error-classification@3.0.10': + resolution: {integrity: sha512-zHe642KCqDxXLuhs6xmHVgRwy078RfqxP2wRDpIyiF8EmsWXptMwnMwbVa50lw+WOGNrYm9zbaEg0oDe3PTtvQ==} engines: {node: '>=16.0.0'} - '@smithy/shared-ini-file-loader@3.1.9': - resolution: {integrity: sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==} + '@smithy/shared-ini-file-loader@3.1.11': + resolution: {integrity: sha512-AUdrIZHFtUgmfSN4Gq9nHu3IkHMa1YDcN+s061Nfm+6pQ0mJy85YQDB0tZBCmls0Vuj22pLwDPmL92+Hvfwwlg==} engines: {node: '>=16.0.0'} - '@smithy/signature-v4@4.2.1': - resolution: {integrity: sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg==} + '@smithy/signature-v4@4.2.3': + resolution: {integrity: sha512-pPSQQ2v2vu9vc8iew7sszLd0O09I5TRc5zhY71KA+Ao0xYazIG+uLeHbTJfIWGO3BGVLiXjUr3EEeCcEQLjpWQ==} engines: {node: '>=16.0.0'} - '@smithy/smithy-client@3.4.2': - resolution: {integrity: sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==} + '@smithy/smithy-client@3.4.5': + resolution: {integrity: sha512-k0sybYT9zlP79sIKd1XGm4TmK0AS1nA2bzDHXx7m0nGi3RQ8dxxQUs4CPkSmQTKAo+KF9aINU3KzpGIpV7UoMw==} engines: {node: '>=16.0.0'} - '@smithy/types@3.6.0': - resolution: {integrity: sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==} + '@smithy/types@3.7.1': + resolution: {integrity: sha512-XKLcLXZY7sUQgvvWyeaL/qwNPp6V3dWcUjqrQKjSb+tzYiCy340R/c64LV5j+Tnb2GhmunEX0eou+L+m2hJNYA==} engines: {node: '>=16.0.0'} - '@smithy/url-parser@3.0.8': - resolution: {integrity: sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==} + '@smithy/url-parser@3.0.10': + resolution: {integrity: sha512-j90NUalTSBR2NaZTuruEgavSdh8MLirf58LoGSk4AtQfyIymogIhgnGUU2Mga2bkMkpSoC9gxb74xBXL5afKAQ==} '@smithy/util-base64@3.0.0': resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} @@ -1792,32 +1807,32 @@ packages: resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} engines: {node: '>=16.0.0'} - '@smithy/util-defaults-mode-browser@3.0.25': - resolution: {integrity: sha512-fRw7zymjIDt6XxIsLwfJfYUfbGoO9CmCJk6rjJ/X5cd20+d2Is7xjU5Kt/AiDt6hX8DAf5dztmfP5O82gR9emA==} + '@smithy/util-defaults-mode-browser@3.0.28': + resolution: {integrity: sha512-6bzwAbZpHRFVJsOztmov5PGDmJYsbNSoIEfHSJJyFLzfBGCCChiO3od9k7E/TLgrCsIifdAbB9nqbVbyE7wRUw==} engines: {node: '>= 10.0.0'} - '@smithy/util-defaults-mode-node@3.0.25': - resolution: {integrity: sha512-H3BSZdBDiVZGzt8TG51Pd2FvFO0PAx/A0mJ0EH8a13KJ6iUCdYnw/Dk/MdC1kTd0eUuUGisDFaxXVXo4HHFL1g==} + '@smithy/util-defaults-mode-node@3.0.28': + resolution: {integrity: sha512-78ENJDorV1CjOQselGmm3+z7Yqjj5HWCbjzh0Ixuq736dh1oEnD9sAttSBNSLlpZsX8VQnmERqA2fEFlmqWn8w==} engines: {node: '>= 10.0.0'} - '@smithy/util-endpoints@2.1.4': - resolution: {integrity: sha512-kPt8j4emm7rdMWQyL0F89o92q10gvCUa6sBkBtDJ7nV2+P7wpXczzOfoDJ49CKXe5CCqb8dc1W+ZdLlrKzSAnQ==} + '@smithy/util-endpoints@2.1.6': + resolution: {integrity: sha512-mFV1t3ndBh0yZOJgWxO9J/4cHZVn5UG1D8DeCc6/echfNkeEJWu9LD7mgGH5fHrEdR7LDoWw7PQO6QiGpHXhgA==} engines: {node: '>=16.0.0'} '@smithy/util-hex-encoding@3.0.0': resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} engines: {node: '>=16.0.0'} - '@smithy/util-middleware@3.0.8': - resolution: {integrity: sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==} + '@smithy/util-middleware@3.0.10': + resolution: {integrity: sha512-eJO+/+RsrG2RpmY68jZdwQtnfsxjmPxzMlQpnHKjFPwrYqvlcT+fHdT+ZVwcjlWSrByOhGr9Ff2GG17efc192A==} engines: {node: '>=16.0.0'} - '@smithy/util-retry@3.0.8': - resolution: {integrity: sha512-TCEhLnY581YJ+g1x0hapPz13JFqzmh/pMWL2KEFASC51qCfw3+Y47MrTmea4bUE5vsdxQ4F6/KFbUeSz22Q1ow==} + '@smithy/util-retry@3.0.10': + resolution: {integrity: sha512-1l4qatFp4PiU6j7UsbasUHL2VU023NRB/gfaa1M0rDqVrRN4g3mCArLRyH3OuktApA4ye+yjWQHjdziunw2eWA==} engines: {node: '>=16.0.0'} - '@smithy/util-stream@3.2.1': - resolution: {integrity: sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==} + '@smithy/util-stream@3.3.1': + resolution: {integrity: sha512-Ff68R5lJh2zj+AUTvbAU/4yx+6QPRzg7+pI7M1FbtQHcRIp7xvguxVsQBKyB3fwiOwhAKu0lnNyYBaQfSW6TNw==} engines: {node: '>=16.0.0'} '@smithy/util-uri-escape@3.0.0': @@ -1832,72 +1847,72 @@ packages: resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} engines: {node: '>=16.0.0'} - '@smithy/util-waiter@3.1.7': - resolution: {integrity: sha512-d5yGlQtmN/z5eoTtIYgkvOw27US2Ous4VycnXatyoImIF9tzlcpnKqQ/V7qhvJmb2p6xZne1NopCLakdTnkBBQ==} + '@smithy/util-waiter@3.1.9': + resolution: {integrity: sha512-/aMXPANhMOlMPjfPtSrDfPeVP8l56SJlz93xeiLmhLe5xvlXA5T3abZ2ilEsDEPeY9T/wnN/vNGn9wa1SbufWA==} engines: {node: '>=16.0.0'} - '@swc/core-darwin-arm64@1.8.0': - resolution: {integrity: sha512-TIus1/SE/Ud4g84hCnchcagu+LfyndSDy5r5qf64nflojejDidPU9Fp1InzQhQpEgIpntnZID/KFCP5rQnvsIw==} + '@swc/core-darwin-arm64@1.9.2': + resolution: {integrity: sha512-nETmsCoY29krTF2PtspEgicb3tqw7Ci5sInTI03EU5zpqYbPjoPH99BVTjj0OsF53jP5MxwnLI5Hm21lUn1d6A==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.8.0': - resolution: {integrity: sha512-yCb1FHCX/HUmNRGB1X3CFJ1WPKXMosZVUe3K2TrosCGvytwgaLoW5FS0bZg5Qv6cEUERQBg75cJnOUPwLLRCVg==} + '@swc/core-darwin-x64@1.9.2': + resolution: {integrity: sha512-9gD+bwBz8ZByjP6nZTXe/hzd0tySIAjpDHgkFiUrc+5zGF+rdTwhcNrzxNHJmy6mw+PW38jqII4uspFHUqqxuQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.8.0': - resolution: {integrity: sha512-6TdjVdiLaSW+eGiHKEojMDlx673nowrPHa6nM6toWgRzy8tIZgjPOguVKJDoMnoHuvO7SkOLCUiMRw0rTskypA==} + '@swc/core-linux-arm-gnueabihf@1.9.2': + resolution: {integrity: sha512-kYq8ief1Qrn+WmsTWAYo4r+Coul4dXN6cLFjiPZ29Cv5pyU+GFvSPAB4bEdMzwy99rCR0u2P10UExaeCjurjvg==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.8.0': - resolution: {integrity: sha512-TU2YcTornnyZiJUabRuk7Xtvzaep11FwK77IkFomjN9/Os5s25B8ea652c2fAQMe9RsM84FPVmX303ohxavjKQ==} + '@swc/core-linux-arm64-gnu@1.9.2': + resolution: {integrity: sha512-n0W4XiXlmEIVqxt+rD3ZpkogsEWUk1jJ+i5bQNgB+1JuWh0fBE8c/blDgTQXa0GB5lTPVDZQussgdNOCnAZwiA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.8.0': - resolution: {integrity: sha512-2CdPTEKxx2hJIj/B0fn8L8k2coo/FDS95smzXyi2bov5FcrP6Ohboq8roFBYgj38fkHusXjY8qt+cCH7yXWAdg==} + '@swc/core-linux-arm64-musl@1.9.2': + resolution: {integrity: sha512-8xzrOmsyCC1zrx2Wzx/h8dVsdewO1oMCwBTLc1gSJ/YllZYTb04pNm6NsVbzUX2tKddJVRgSJXV10j/NECLwpA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.8.0': - resolution: {integrity: sha512-14StQBifCs/AMsySdU95OmwNJr9LOVqo6rcTFt2b7XaWpe/AyeuMJFxcndLgUewksJHpfepzCTwNdbcYmuNo6A==} + '@swc/core-linux-x64-gnu@1.9.2': + resolution: {integrity: sha512-kZrNz/PjRQKcchWF6W292jk3K44EoVu1ad5w+zbS4jekIAxsM8WwQ1kd+yjUlN9jFcF8XBat5NKIs9WphJCVXg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.8.0': - resolution: {integrity: sha512-qemJnAQlYqKCfWNqVv5SG8uGvw8JotwU86cuFUkq35oTB+dsSFM3b83+B1giGTKKFOh2nfWT7bvPXTKk+aUjew==} + '@swc/core-linux-x64-musl@1.9.2': + resolution: {integrity: sha512-TTIpR4rjMkhX1lnFR+PSXpaL83TrQzp9znRdp2TzYrODlUd/R20zOwSo9vFLCyH6ZoD47bccY7QeGZDYT3nlRg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.8.0': - resolution: {integrity: sha512-fXt5vZbnrVdXZzGj2qRnZtY3uh+NtLCaFjS2uD9w8ssdbjhbDZYlJCj2JINOjv35ttEfAD2goiYmVa5P/Ypl+g==} + '@swc/core-win32-arm64-msvc@1.9.2': + resolution: {integrity: sha512-+Eg2d4icItKC0PMjZxH7cSYFLWk0aIp94LNmOw6tPq0e69ax6oh10upeq0D1fjWsKLmOJAWEvnXlayZcijEXDw==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.8.0': - resolution: {integrity: sha512-W4FA2vSJ+bGYiTj6gspxghSdKQNLfLMo65AH07u797x7I+YJj8amnFY/fQRlroDv5Dez/FHTv14oPlTlNFUpIw==} + '@swc/core-win32-ia32-msvc@1.9.2': + resolution: {integrity: sha512-nLWBi4vZDdM/LkiQmPCakof8Dh1/t5EM7eudue04V1lIcqx9YHVRS3KMwEaCoHLGg0c312Wm4YgrWQd9vwZ5zQ==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.8.0': - resolution: {integrity: sha512-Il4y8XwKDV0Bnk0IpA00kGcSQC6I9XOIinW5egTutnwIDfDE+qsD0j+0isW5H76GetY3/Ze0lVxeOXLAUgpegA==} + '@swc/core-win32-x64-msvc@1.9.2': + resolution: {integrity: sha512-ik/k+JjRJBFkXARukdU82tSVx0CbExFQoQ78qTO682esbYXzjdB5eLVkoUbwen299pnfr88Kn4kyIqFPTje8Xw==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.8.0': - resolution: {integrity: sha512-EF8C5lp1RKMp3426tAKwQyVbg4Zcn/2FDax3cz8EcOXYQJM/ctB687IvBm9Ciej1wMcQ/dMRg+OB4Xl8BGLBoA==} + '@swc/core@1.9.2': + resolution: {integrity: sha512-dYyEkO6mRYtZFpnOsnYzv9rY69fHAHoawYOjGOEcxk9WYtaJhowMdP/w6NcOKnz2G7GlZaenjkzkMa6ZeQeMsg==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '*' @@ -1908,8 +1923,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/types@0.1.15': - resolution: {integrity: sha512-XKaZ+dzDIQ9Ot9o89oJQ/aluI17+VvUnIpYJTcZtvv1iYX6MzHh3Ik2CSR7MdPKpPwfZXHBeCingb2b4PoDVdw==} + '@swc/types@0.1.17': + resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} @@ -1972,8 +1987,8 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - '@types/better-sqlite3@7.6.11': - resolution: {integrity: sha512-i8KcD3PgGtGBLl3+mMYA8PdKkButvPyARxA7IQAd6qeslht13qxb1zzO8dRCtE7U3IoJS782zDBAeoKiM695kg==} + '@types/better-sqlite3@7.6.12': + resolution: {integrity: sha512-fnQmj8lELIj7BSrZQAdBMHEHX8OZLYIHXqAKT1O7tDfLxaINzf00PMjw22r3N/xXh0w/sGHlO6SVaCQ2mj78lg==} '@types/breejs__later@4.1.5': resolution: {integrity: sha512-O7VIO7sktsIwmLUyEeUnLMJ+QD2pv0yBGI2EMbVmwC1GOOTWJAaneL82ZyIwRgpEjJ9ciUHP8LuuuU55uj5ZjA==} @@ -2005,8 +2020,8 @@ packages: '@types/conventional-commits-detector@1.0.2': resolution: {integrity: sha512-Yzo8dW+b2vziyDD9WNY+IPq4rcZyguHNuyNZC3wv0igpVFRd7VWHufl+vRQaCzDR2ftPTB1VPwbvXxWVpzBo+g==} - '@types/diff@5.2.3': - resolution: {integrity: sha512-K0Oqlrq3kQMaO2RhfrNQX5trmt+XLyom88zS0u84nnIcLvFnRUMRRHmrGny5GSM+kNO9IZLARsdQHDzkhAgmrQ==} + '@types/diff@6.0.0': + resolution: {integrity: sha512-dhVCYGv3ZSbzmQaBSagrv1WJ6rXCdkyTcDyoNu1MD8JohI7pR7k8wdZEm+mvdxRKXyHVwckFzWU1vJc+Z29MlA==} '@types/emscripten@1.39.13': resolution: {integrity: sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==} @@ -2113,6 +2128,12 @@ packages: '@types/parse-link-header@2.0.3': resolution: {integrity: sha512-ffLAxD6Xqcf2gSbtEJehj8yJ5R/2OZqD4liodQvQQ+hhO4kg1mk9ToEZQPMtNTm/zIQj2GNleQbsjPp9+UQm4Q==} + '@types/parse-path@7.0.3': + resolution: {integrity: sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==} + + '@types/punycode@2.1.4': + resolution: {integrity: sha512-trzh6NzBnq8yw5e35f8xe8VTYjqM3NE7bohBtvDVf/dtUer3zYTLK1Ka3DG3p7bdtoaOHZucma6FfVKlQ134pQ==} + '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -2205,8 +2226,8 @@ packages: resolution: {integrity: sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.12.2': - resolution: {integrity: sha512-gPLpLtrj9aMHOvxJkSbDBmbRuYdtiEbnvO25bCMza3DhMjTQw0u7Y1M+YR5JPbMsXXnSPuCf5hfq0nEkQDL/JQ==} + '@typescript-eslint/scope-manager@8.15.0': + resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/type-utils@8.11.0': @@ -2226,8 +2247,8 @@ packages: resolution: {integrity: sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.12.2': - resolution: {integrity: sha512-VwDwMF1SZ7wPBUZwmMdnDJ6sIFk4K4s+ALKLP6aIQsISkPv8jhiw65sAK6SuWODN/ix+m+HgbYDkH+zLjrzvOA==} + '@typescript-eslint/types@8.15.0': + resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@5.62.0': @@ -2248,8 +2269,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.12.2': - resolution: {integrity: sha512-mME5MDwGe30Pq9zKPvyduyU86PH7aixwqYR2grTglAdB+AN8xXQ1vFGpYaUSJ5o5P/5znsSBeNcs5g5/2aQwow==} + '@typescript-eslint/typescript-estree@8.15.0': + resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -2269,11 +2290,15 @@ packages: peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/utils@8.12.2': - resolution: {integrity: sha512-UTTuDIX3fkfAz6iSVa5rTuSfWIYZ6ATtEocQ/umkRSyC9O919lbZ8dcH7mysshrCdrAM03skJOEYaBugxN+M6A==} + '@typescript-eslint/utils@8.15.0': + resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true '@typescript-eslint/visitor-keys@5.62.0': resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} @@ -2283,19 +2308,19 @@ packages: resolution: {integrity: sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.12.2': - resolution: {integrity: sha512-PChz8UaKQAVNHghsHcPyx1OMHoFRUEA7rJSK/mDhdq85bk+PLsUHUBqTQTFt18VJZbmxBovM65fezlheQRsSDA==} + '@typescript-eslint/visitor-keys@8.15.0': + resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@yarnpkg/core@4.1.4': - resolution: {integrity: sha512-aaftrtm5sfwMlqmj3CYqp1a1Lbd0UR7dOk3K5pMCV3VTDwXWQWw9uwGm4QpE5YairVG30jpOdbTLUcoota55HQ==} + '@yarnpkg/core@4.1.6': + resolution: {integrity: sha512-iF8LOSd4K0RVSB56c4IMYcXp6aiCT3wyWfMmiYSAiLm8tepwEtBOcrL9gzTzrT09NnDRz1CV/YB7iwfnUOMsAg==} engines: {node: '>=18.12.0'} - '@yarnpkg/fslib@3.1.0': - resolution: {integrity: sha512-wsj7/sUVSdXOIX/qwaON/Ky5GsP5gs9ry9DKwgLbWT7k3qw4/EcHAtfTtPhBYu33UibzBFI+fgB4wBRVH2XVaw==} + '@yarnpkg/fslib@3.1.1': + resolution: {integrity: sha512-NpeecISQEuDnmipElGa0cOC7DnlPf3+FXnuwwJTciJgt+S/BDb8VFBvXSE5UirGmsFWlf4mfZuuAC7e8Pmhh4g==} engines: {node: '>=18.12.0'} '@yarnpkg/libzip@3.1.0': @@ -2308,8 +2333,8 @@ packages: resolution: {integrity: sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==} engines: {node: '>=18.12.0'} - '@yarnpkg/shell@4.1.0': - resolution: {integrity: sha512-vm0QqqCBuNrVZbzk1gre0G/FUoT8naCYu/gjz+WlmBKPgV5MmFe2Bdm4ApGLQqvg6eS94TXmUpjSHdBzzN3P0Q==} + '@yarnpkg/shell@4.1.1': + resolution: {integrity: sha512-0aS71iJrNQ4cezU5BJ5JpBTXkFQPKkzOEpDtMQm8E2H3g9PLxUe/5VdA60bZq/4N/qazLLYEOngcFZ6QRpraVQ==} engines: {node: '>=18.12.0'} hasBin: true @@ -2452,9 +2477,6 @@ packages: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} - asn1.js@5.4.1: - resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} - async-mutex@0.5.0: resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} @@ -2533,9 +2555,6 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - bn@1.0.5: resolution: {integrity: sha512-7TvGbqbZb6lDzsBtNz1VkdXXV0BVmZKPPViPmo2IpvwaryF7P+QKYKACyVkwo2mZPr2CpFiz7EtgPEcc3o/JFQ==} @@ -2598,6 +2617,10 @@ packages: resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} engines: {node: ^16.14.0 || >=18.0.0} + cacache@19.0.1: + resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==} + engines: {node: ^18.17.0 || >=20.5.0} + cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} @@ -2633,8 +2656,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001677: - resolution: {integrity: sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==} + caniuse-lite@1.0.30001683: + resolution: {integrity: sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -2683,8 +2706,8 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + ci-info@4.1.0: + resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} engines: {node: '>=8'} cjs-module-lexer@1.4.1: @@ -2836,16 +2859,16 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - cron-parser@4.9.0: - resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} - engines: {node: '>=12.0.0'} + croner@9.0.0: + resolution: {integrity: sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==} + engines: {node: '>=18.0'} - cronstrue@2.51.0: - resolution: {integrity: sha512-7EG9VaZZ5SRbZ7m25dmP6xaS0qe9ay6wywMskFOU/lMDKa+3gZr2oeT5OUfXwRP/Bcj8wxdYJ65AHU70CI3tsw==} + cronstrue@2.52.0: + resolution: {integrity: sha512-NKgHbWkSZXJUcaBHSsyzC8eegD6bBd4O0oCI6XMIJ+y4Bq3v4w7sY3wfWoKPuVlq9pQHRB6od0lmKpIqi8TlKA==} hasBin: true - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} crypto-random-string@4.0.0: @@ -2912,10 +2935,6 @@ packages: babel-plugin-macros: optional: true - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -2980,6 +2999,10 @@ packages: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -3032,8 +3055,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.50: - resolution: {integrity: sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==} + electron-to-chromium@1.5.64: + resolution: {integrity: sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ==} email-addresses@5.0.0: resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} @@ -3097,8 +3120,8 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + es-abstract@1.23.5: + resolution: {integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==} engines: {node: '>= 0.4'} es-define-property@1.0.0: @@ -3109,9 +3132,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} @@ -3248,6 +3268,10 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3407,8 +3431,8 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -3530,11 +3554,11 @@ packages: engines: {node: '>=10'} hasBin: true - git-up@7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + git-up@8.0.0: + resolution: {integrity: sha512-uBI8Zdt1OZlrYfGcSVroLJKgyNNXlgusYFzHk614lTasz35yg2PVpL1RMy0LOO2dcvF9msYW3pRfUSmafZNrjg==} - git-url-parse@15.0.0: - resolution: {integrity: sha512-5reeBufLi+i4QD3ZFftcJs9jC26aULFLBU23FeKM/b1rI0K6ofIeAblmDVO7Ht22zTDE9+CkJ3ZVb0CgJmz3UQ==} + git-url-parse@16.0.0: + resolution: {integrity: sha512-Y8iAF0AmCaqXc6a5GYgPQW9ESbncNLOL+CeQAJRhmWUOmnPkKpBYeWYp4mFd3LA5j53CdGDdslzX12yEBVHQQg==} github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -3591,8 +3615,8 @@ packages: resolution: {integrity: sha512-QUcQZutczESpdo2w9BMG6VpLFoq9ix7ER5HLM1mAdZdri2F3eISkCb8ep84W6YOo0grYWJdyT/8JkYqGjQfSSQ==} engines: {node: '>=18.12.0', yarn: ^1.17.0} - google-auth-library@9.14.2: - resolution: {integrity: sha512-R+FRIfk1GBo3RdlRYWPdwk8nmtVUOn6+BkDomAC46KoU8kzXzE1HLmOasSCbWUByMMAGkknVF0G5kQ69Vj7dlA==} + google-auth-library@9.15.0: + resolution: {integrity: sha512-7ccSEJFDFO7exFbO6NRyC+xH8/mZ1GZGG2xxx9iHxZWcjUjJpjWxIMw3cofAKcueZ6DATiukmmprD7yavQHOyQ==} engines: {node: '>=14'} gopd@1.0.1: @@ -3608,8 +3632,8 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graph-data-structure@3.5.0: - resolution: {integrity: sha512-AAgjRtBZC1acIExgK2otv2LDdcYeZdQFKiEStXRDTyaVs6sUUaGUif05pCczTqAU4ny82NQtM1p5PK7AQEYgRA==} + graph-data-structure@4.2.0: + resolution: {integrity: sha512-DFGyFROTYJAXwLjBPvj6LYihF2zIUDKt6Rzgo18E+FFKtHm7dJnE/bMHVp6fji5IchykUg3ctS9gwS0L5azwDw==} grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} @@ -3690,8 +3714,8 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} - hosted-git-info@8.0.0: - resolution: {integrity: sha512-4nw3vOVR+vHUOT8+U4giwe2tcGv+R3pwwRidUe67DoMBTjhrfr6rZYJVVwdkBE+Um050SG+X9tf0Jo4fOpn01w==} + hosted-git-info@8.0.2: + resolution: {integrity: sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==} engines: {node: ^18.17.0 || >=20.5.0} html-escaper@2.0.2: @@ -3727,8 +3751,8 @@ packages: humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - husky@9.1.6: - resolution: {integrity: sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==} + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} hasBin: true @@ -3851,6 +3875,10 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} @@ -3888,6 +3916,9 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -4457,17 +4488,17 @@ packages: peerDependencies: markdownlint-cli2: '>=0.0.4' - markdownlint-cli2@0.14.0: - resolution: {integrity: sha512-2cqdWy56frU2FTpbuGb83mEWWYuUIYv6xS8RVEoUAuKNw/hXPar2UYGpuzUhlFMngE8Omaz4RBH52MzfRbGshw==} + markdownlint-cli2@0.15.0: + resolution: {integrity: sha512-4P/lnxQxU2R5lywRJs4b2ajm8z65CW8qqR1bTIcdQ5EG+nZpC6HJlJUnmIR5ee+uecUkoMroazxWcLB7etSmrg==} engines: {node: '>=18'} hasBin: true - markdownlint-micromark@0.1.10: - resolution: {integrity: sha512-no5ZfdqAdWGxftCLlySHSgddEjyW4kui4z7amQcGsSKfYC5v/ou+8mIQVyg9KQMeEZLNtz9OPDTj7nnTnoR4FQ==} + markdownlint-micromark@0.1.12: + resolution: {integrity: sha512-RlB6EwMGgc0sxcIhOQ2+aq7Zw1V2fBnzbXKGgYK/mVWdT7cz34fteKSwfYeo4rL6+L/q2tyC9QtD/PgZbkdyJQ==} engines: {node: '>=18'} - markdownlint@0.35.0: - resolution: {integrity: sha512-wgp8yesWjFBL7bycA3hxwHRdsZGJhjhyP1dSxKVKrza0EPFYtn+mHtkVy6dvP1kGSjovyG5B8yNP6Frj0UFUJg==} + markdownlint@0.36.1: + resolution: {integrity: sha512-s73fU2CQN7WCgjhaQUQ8wYESQNzGRNOKDd+3xgVqu8kuTEhmwepd/mxOv1LR2oV046ONrTLBFsM7IoKWNvmy5g==} engines: {node: '>=18'} marked-terminal@7.2.1: @@ -4694,8 +4725,8 @@ packages: nise@6.1.1: resolution: {integrity: sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==} - nock@13.5.5: - resolution: {integrity: sha512-XKYnqUrCwXC8DGG1xX4YH5yNIrlh9c065uaMZZHUoeUUINTOyt+x/G+ezYk0Ft6ExSREVIs+qBJDK503viTfFA==} + nock@13.5.6: + resolution: {integrity: sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==} engines: {node: '>= 10.13'} node-abi@3.71.0: @@ -4782,8 +4813,8 @@ packages: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} - npm@10.9.0: - resolution: {integrity: sha512-ZanDioFylI9helNhl2LNd+ErmVD+H5I53ry41ixlLyCBgkuYb+58CvbAp99hW+zr5L9W4X7CchSoeqKdngOLSw==} + npm@10.9.1: + resolution: {integrity: sha512-yJUw03xLqjiv1D52oHeoS5qmOEC5hkJlhP1cWlSrCgshuxWVyFEEK3M3hLC0NwbTaklLTYrhoIanYsuNP5WUKg==} engines: {node: ^18.17.0 || >=20.5.0} hasBin: true bundledDependencies: @@ -4868,12 +4899,8 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} - engines: {node: '>= 0.4'} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} engines: {node: '>= 0.4'} object-keys@1.1.1: @@ -4907,9 +4934,9 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} - openpgp@5.11.2: - resolution: {integrity: sha512-f8dJFVLwdkvPvW3VPFs6q9Vs2+HNhdvwls7a/MIFcQUB+XiQzRe7alfa3RtwfGJU7oUDDMAWPZ0nYsHa23Az+A==} - engines: {node: '>= 8.0.0'} + openpgp@6.0.0: + resolution: {integrity: sha512-8YMuhOV6bP8+J4bCHltvRwol1sBJhxAcJXvwEKpcK65lKpQ0VUbymQR/EuGrzxYnatNSyMyrMgip4j/F0vhZvg==} + engines: {node: '>= 18.0.0'} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} @@ -5043,8 +5070,9 @@ packages: parse-path@7.0.0: resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} - parse-url@8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + parse-url@9.2.0: + resolution: {integrity: sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==} + engines: {node: '>=14.13.0'} parse5-htmlparser2-tree-adapter@6.0.1: resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} @@ -5154,8 +5182,8 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - pretty-ms@9.1.0: - resolution: {integrity: sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==} + pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} engines: {node: '>=18'} proc-log@4.2.0: @@ -5165,8 +5193,8 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process-on-spawn@1.0.0: - resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} + process-on-spawn@1.1.0: + resolution: {integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==} engines: {node: '>=8'} progress@1.1.8: @@ -5213,8 +5241,8 @@ packages: resolution: {integrity: sha512-L/e3qq/3m/TrYtINo2aBB98oz6w8VHGyFy+arSKwPMZDUNNw2OaQxYnZO6UIZZw2OnRl2qkxGmuSOEfsuHXJdA==} engines: {node: '>=0.10.0'} - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + qs@6.13.1: + resolution: {integrity: sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==} engines: {node: '>=0.6'} queue-microtask@1.2.3: @@ -5276,6 +5304,10 @@ packages: redis@4.7.0: resolution: {integrity: sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==} + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -5575,14 +5607,14 @@ packages: resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ssri@12.0.0: + resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} + engines: {node: ^18.17.0 || >=20.5.0} + stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - stream-combiner2@1.1.1: resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} @@ -5920,8 +5952,8 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@4.26.1: - resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==} + type-fest@4.27.0: + resolution: {integrity: sha512-3IMSWgP7C5KSQqmo1wjhKrwsvXAtF33jO3QY+Uy++ia7hqvgSK6iXbbg5PbDBc1P2ZbNEDgejOrN4YooXvhwCw==} engines: {node: '>=16'} typed-array-buffer@1.0.2: @@ -5932,12 +5964,12 @@ packages: resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + typed-array-byte-offset@1.0.3: + resolution: {integrity: sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==} engines: {node: '>= 0.4'} - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} typed-rest-client@2.1.0: @@ -5991,10 +6023,18 @@ packages: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-filename@4.0.0: + resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==} + engines: {node: ^18.17.0 || >=20.5.0} + unique-slug@4.0.0: resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-slug@5.0.0: + resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==} + engines: {node: ^18.17.0 || >=20.5.0} + unique-string@3.0.0: resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} engines: {node: '>=12'} @@ -6090,6 +6130,10 @@ packages: which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-builtin-type@1.1.4: + resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} + engines: {node: '>= 0.4'} + which-collection@1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} @@ -6177,8 +6221,8 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} - yaml@2.6.0: - resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} + yaml@2.6.1: + resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} engines: {node: '>= 14'} hasBin: true @@ -6261,7 +6305,7 @@ snapshots: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-locate-window': 3.679.0 + '@aws-sdk/util-locate-window': 3.693.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -6271,7 +6315,7 @@ snapshots: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-locate-window': 3.679.0 + '@aws-sdk/util-locate-window': 3.693.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -6308,30 +6352,30 @@ snapshots: '@aws-sdk/util-endpoints': 3.686.0 '@aws-sdk/util-user-agent-browser': 3.686.0 '@aws-sdk/util-user-agent-node': 3.687.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 + '@smithy/config-resolver': 3.0.12 + '@smithy/core': 2.5.4 + '@smithy/fetch-http-handler': 4.1.1 + '@smithy/hash-node': 3.0.10 + '@smithy/invalid-dependency': 3.0.10 + '@smithy/middleware-content-length': 3.0.12 + '@smithy/middleware-endpoint': 3.2.4 + '@smithy/middleware-retry': 3.0.28 + '@smithy/middleware-serde': 3.0.10 + '@smithy/middleware-stack': 3.0.10 + '@smithy/node-config-provider': 3.1.11 + '@smithy/node-http-handler': 3.3.1 + '@smithy/protocol-http': 4.1.7 + '@smithy/smithy-client': 3.4.5 + '@smithy/types': 3.7.1 + '@smithy/url-parser': 3.0.10 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 + '@smithy/util-defaults-mode-browser': 3.0.28 + '@smithy/util-defaults-mode-node': 3.0.28 + '@smithy/util-endpoints': 2.1.6 + '@smithy/util-middleware': 3.0.10 + '@smithy/util-retry': 3.0.10 '@smithy/util-utf8': 3.0.0 '@types/uuid': 9.0.8 tslib: 2.8.1 @@ -6356,30 +6400,30 @@ snapshots: '@aws-sdk/util-endpoints': 3.686.0 '@aws-sdk/util-user-agent-browser': 3.686.0 '@aws-sdk/util-user-agent-node': 3.687.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 + '@smithy/config-resolver': 3.0.12 + '@smithy/core': 2.5.4 + '@smithy/fetch-http-handler': 4.1.1 + '@smithy/hash-node': 3.0.10 + '@smithy/invalid-dependency': 3.0.10 + '@smithy/middleware-content-length': 3.0.12 + '@smithy/middleware-endpoint': 3.2.4 + '@smithy/middleware-retry': 3.0.28 + '@smithy/middleware-serde': 3.0.10 + '@smithy/middleware-stack': 3.0.10 + '@smithy/node-config-provider': 3.1.11 + '@smithy/node-http-handler': 3.3.1 + '@smithy/protocol-http': 4.1.7 + '@smithy/smithy-client': 3.4.5 + '@smithy/types': 3.7.1 + '@smithy/url-parser': 3.0.10 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 + '@smithy/util-defaults-mode-browser': 3.0.28 + '@smithy/util-defaults-mode-node': 3.0.28 + '@smithy/util-endpoints': 2.1.6 + '@smithy/util-middleware': 3.0.10 + '@smithy/util-retry': 3.0.10 '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 transitivePeerDependencies: @@ -6403,32 +6447,32 @@ snapshots: '@aws-sdk/util-endpoints': 3.686.0 '@aws-sdk/util-user-agent-browser': 3.686.0 '@aws-sdk/util-user-agent-node': 3.687.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 + '@smithy/config-resolver': 3.0.12 + '@smithy/core': 2.5.4 + '@smithy/fetch-http-handler': 4.1.1 + '@smithy/hash-node': 3.0.10 + '@smithy/invalid-dependency': 3.0.10 + '@smithy/middleware-content-length': 3.0.12 + '@smithy/middleware-endpoint': 3.2.4 + '@smithy/middleware-retry': 3.0.28 + '@smithy/middleware-serde': 3.0.10 + '@smithy/middleware-stack': 3.0.10 + '@smithy/node-config-provider': 3.1.11 + '@smithy/node-http-handler': 3.3.1 + '@smithy/protocol-http': 4.1.7 + '@smithy/smithy-client': 3.4.5 + '@smithy/types': 3.7.1 + '@smithy/url-parser': 3.0.10 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 + '@smithy/util-defaults-mode-browser': 3.0.28 + '@smithy/util-defaults-mode-node': 3.0.28 + '@smithy/util-endpoints': 2.1.6 + '@smithy/util-middleware': 3.0.10 + '@smithy/util-retry': 3.0.10 '@smithy/util-utf8': 3.0.0 - '@smithy/util-waiter': 3.1.7 + '@smithy/util-waiter': 3.1.9 '@types/uuid': 9.0.8 tslib: 2.8.1 uuid: 9.0.1 @@ -6452,32 +6496,32 @@ snapshots: '@aws-sdk/util-endpoints': 3.686.0 '@aws-sdk/util-user-agent-browser': 3.686.0 '@aws-sdk/util-user-agent-node': 3.687.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 + '@smithy/config-resolver': 3.0.12 + '@smithy/core': 2.5.4 + '@smithy/fetch-http-handler': 4.1.1 + '@smithy/hash-node': 3.0.10 + '@smithy/invalid-dependency': 3.0.10 + '@smithy/middleware-content-length': 3.0.12 + '@smithy/middleware-endpoint': 3.2.4 + '@smithy/middleware-retry': 3.0.28 + '@smithy/middleware-serde': 3.0.10 + '@smithy/middleware-stack': 3.0.10 + '@smithy/node-config-provider': 3.1.11 + '@smithy/node-http-handler': 3.3.1 + '@smithy/protocol-http': 4.1.7 + '@smithy/smithy-client': 3.4.5 + '@smithy/types': 3.7.1 + '@smithy/url-parser': 3.0.10 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 + '@smithy/util-defaults-mode-browser': 3.0.28 + '@smithy/util-defaults-mode-node': 3.0.28 + '@smithy/util-endpoints': 2.1.6 + '@smithy/util-middleware': 3.0.10 + '@smithy/util-retry': 3.0.10 '@smithy/util-utf8': 3.0.0 - '@smithy/util-waiter': 3.1.7 + '@smithy/util-waiter': 3.1.9 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -6500,32 +6544,32 @@ snapshots: '@aws-sdk/util-endpoints': 3.686.0 '@aws-sdk/util-user-agent-browser': 3.686.0 '@aws-sdk/util-user-agent-node': 3.687.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 + '@smithy/config-resolver': 3.0.12 + '@smithy/core': 2.5.4 + '@smithy/fetch-http-handler': 4.1.1 + '@smithy/hash-node': 3.0.10 + '@smithy/invalid-dependency': 3.0.10 + '@smithy/middleware-content-length': 3.0.12 + '@smithy/middleware-endpoint': 3.2.4 + '@smithy/middleware-retry': 3.0.28 + '@smithy/middleware-serde': 3.0.10 + '@smithy/middleware-stack': 3.0.10 + '@smithy/node-config-provider': 3.1.11 + '@smithy/node-http-handler': 3.3.1 + '@smithy/protocol-http': 4.1.7 + '@smithy/smithy-client': 3.4.5 + '@smithy/types': 3.7.1 + '@smithy/url-parser': 3.0.10 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 + '@smithy/util-defaults-mode-browser': 3.0.28 + '@smithy/util-defaults-mode-node': 3.0.28 + '@smithy/util-endpoints': 2.1.6 + '@smithy/util-middleware': 3.0.10 + '@smithy/util-retry': 3.0.10 '@smithy/util-utf8': 3.0.0 - '@smithy/util-waiter': 3.1.7 + '@smithy/util-waiter': 3.1.9 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -6556,39 +6600,39 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.686.0 '@aws-sdk/util-user-agent-node': 3.687.0 '@aws-sdk/xml-builder': 3.686.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/eventstream-serde-browser': 3.0.11 - '@smithy/eventstream-serde-config-resolver': 3.0.8 - '@smithy/eventstream-serde-node': 3.0.10 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/hash-blob-browser': 3.1.7 - '@smithy/hash-node': 3.0.8 - '@smithy/hash-stream-node': 3.1.7 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/md5-js': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 + '@smithy/config-resolver': 3.0.12 + '@smithy/core': 2.5.4 + '@smithy/eventstream-serde-browser': 3.0.13 + '@smithy/eventstream-serde-config-resolver': 3.0.10 + '@smithy/eventstream-serde-node': 3.0.12 + '@smithy/fetch-http-handler': 4.1.1 + '@smithy/hash-blob-browser': 3.1.9 + '@smithy/hash-node': 3.0.10 + '@smithy/hash-stream-node': 3.1.9 + '@smithy/invalid-dependency': 3.0.10 + '@smithy/md5-js': 3.0.10 + '@smithy/middleware-content-length': 3.0.12 + '@smithy/middleware-endpoint': 3.2.4 + '@smithy/middleware-retry': 3.0.28 + '@smithy/middleware-serde': 3.0.10 + '@smithy/middleware-stack': 3.0.10 + '@smithy/node-config-provider': 3.1.11 + '@smithy/node-http-handler': 3.3.1 + '@smithy/protocol-http': 4.1.7 + '@smithy/smithy-client': 3.4.5 + '@smithy/types': 3.7.1 + '@smithy/url-parser': 3.0.10 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-stream': 3.2.1 + '@smithy/util-defaults-mode-browser': 3.0.28 + '@smithy/util-defaults-mode-node': 3.0.28 + '@smithy/util-endpoints': 2.1.6 + '@smithy/util-middleware': 3.0.10 + '@smithy/util-retry': 3.0.10 + '@smithy/util-stream': 3.3.1 '@smithy/util-utf8': 3.0.0 - '@smithy/util-waiter': 3.1.7 + '@smithy/util-waiter': 3.1.9 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -6609,30 +6653,30 @@ snapshots: '@aws-sdk/util-endpoints': 3.686.0 '@aws-sdk/util-user-agent-browser': 3.686.0 '@aws-sdk/util-user-agent-node': 3.687.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 + '@smithy/config-resolver': 3.0.12 + '@smithy/core': 2.5.4 + '@smithy/fetch-http-handler': 4.1.1 + '@smithy/hash-node': 3.0.10 + '@smithy/invalid-dependency': 3.0.10 + '@smithy/middleware-content-length': 3.0.12 + '@smithy/middleware-endpoint': 3.2.4 + '@smithy/middleware-retry': 3.0.28 + '@smithy/middleware-serde': 3.0.10 + '@smithy/middleware-stack': 3.0.10 + '@smithy/node-config-provider': 3.1.11 + '@smithy/node-http-handler': 3.3.1 + '@smithy/protocol-http': 4.1.7 + '@smithy/smithy-client': 3.4.5 + '@smithy/types': 3.7.1 + '@smithy/url-parser': 3.0.10 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 + '@smithy/util-defaults-mode-browser': 3.0.28 + '@smithy/util-defaults-mode-node': 3.0.28 + '@smithy/util-endpoints': 2.1.6 + '@smithy/util-middleware': 3.0.10 + '@smithy/util-retry': 3.0.10 '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 transitivePeerDependencies: @@ -6652,30 +6696,30 @@ snapshots: '@aws-sdk/util-endpoints': 3.686.0 '@aws-sdk/util-user-agent-browser': 3.686.0 '@aws-sdk/util-user-agent-node': 3.687.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 + '@smithy/config-resolver': 3.0.12 + '@smithy/core': 2.5.4 + '@smithy/fetch-http-handler': 4.1.1 + '@smithy/hash-node': 3.0.10 + '@smithy/invalid-dependency': 3.0.10 + '@smithy/middleware-content-length': 3.0.12 + '@smithy/middleware-endpoint': 3.2.4 + '@smithy/middleware-retry': 3.0.28 + '@smithy/middleware-serde': 3.0.10 + '@smithy/middleware-stack': 3.0.10 + '@smithy/node-config-provider': 3.1.11 + '@smithy/node-http-handler': 3.3.1 + '@smithy/protocol-http': 4.1.7 + '@smithy/smithy-client': 3.4.5 + '@smithy/types': 3.7.1 + '@smithy/url-parser': 3.0.10 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 + '@smithy/util-defaults-mode-browser': 3.0.28 + '@smithy/util-defaults-mode-node': 3.0.28 + '@smithy/util-endpoints': 2.1.6 + '@smithy/util-middleware': 3.0.10 + '@smithy/util-retry': 3.0.10 '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 transitivePeerDependencies: @@ -6697,30 +6741,30 @@ snapshots: '@aws-sdk/util-endpoints': 3.686.0 '@aws-sdk/util-user-agent-browser': 3.686.0 '@aws-sdk/util-user-agent-node': 3.687.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 + '@smithy/config-resolver': 3.0.12 + '@smithy/core': 2.5.4 + '@smithy/fetch-http-handler': 4.1.1 + '@smithy/hash-node': 3.0.10 + '@smithy/invalid-dependency': 3.0.10 + '@smithy/middleware-content-length': 3.0.12 + '@smithy/middleware-endpoint': 3.2.4 + '@smithy/middleware-retry': 3.0.28 + '@smithy/middleware-serde': 3.0.10 + '@smithy/middleware-stack': 3.0.10 + '@smithy/node-config-provider': 3.1.11 + '@smithy/node-http-handler': 3.3.1 + '@smithy/protocol-http': 4.1.7 + '@smithy/smithy-client': 3.4.5 + '@smithy/types': 3.7.1 + '@smithy/url-parser': 3.0.10 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 + '@smithy/util-defaults-mode-browser': 3.0.28 + '@smithy/util-defaults-mode-node': 3.0.28 + '@smithy/util-endpoints': 2.1.6 + '@smithy/util-middleware': 3.0.10 + '@smithy/util-retry': 3.0.10 '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 transitivePeerDependencies: @@ -6729,14 +6773,14 @@ snapshots: '@aws-sdk/core@3.686.0': dependencies: '@aws-sdk/types': 3.686.0 - '@smithy/core': 2.5.1 - '@smithy/node-config-provider': 3.1.9 - '@smithy/property-provider': 3.1.8 - '@smithy/protocol-http': 4.1.5 - '@smithy/signature-v4': 4.2.1 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/util-middleware': 3.0.8 + '@smithy/core': 2.5.4 + '@smithy/node-config-provider': 3.1.11 + '@smithy/property-provider': 3.1.10 + '@smithy/protocol-http': 4.1.7 + '@smithy/signature-v4': 4.2.3 + '@smithy/smithy-client': 3.4.5 + '@smithy/types': 3.7.1 + '@smithy/util-middleware': 3.0.10 fast-xml-parser: 4.4.1 tslib: 2.8.1 @@ -6744,8 +6788,8 @@ snapshots: dependencies: '@aws-sdk/client-cognito-identity': 3.687.0 '@aws-sdk/types': 3.686.0 - '@smithy/property-provider': 3.1.8 - '@smithy/types': 3.6.0 + '@smithy/property-provider': 3.1.10 + '@smithy/types': 3.7.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -6754,21 +6798,21 @@ snapshots: dependencies: '@aws-sdk/core': 3.686.0 '@aws-sdk/types': 3.686.0 - '@smithy/property-provider': 3.1.8 - '@smithy/types': 3.6.0 + '@smithy/property-provider': 3.1.10 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@aws-sdk/credential-provider-http@3.686.0': dependencies: '@aws-sdk/core': 3.686.0 '@aws-sdk/types': 3.686.0 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/node-http-handler': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/util-stream': 3.2.1 + '@smithy/fetch-http-handler': 4.1.1 + '@smithy/node-http-handler': 3.3.1 + '@smithy/property-provider': 3.1.10 + '@smithy/protocol-http': 4.1.7 + '@smithy/smithy-client': 3.4.5 + '@smithy/types': 3.7.1 + '@smithy/util-stream': 3.3.1 tslib: 2.8.1 '@aws-sdk/credential-provider-ini@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))(@aws-sdk/client-sts@3.687.0)': @@ -6781,10 +6825,10 @@ snapshots: '@aws-sdk/credential-provider-sso': 3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)) '@aws-sdk/credential-provider-web-identity': 3.686.0(@aws-sdk/client-sts@3.687.0) '@aws-sdk/types': 3.686.0 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 + '@smithy/credential-provider-imds': 3.2.7 + '@smithy/property-provider': 3.1.10 + '@smithy/shared-ini-file-loader': 3.1.11 + '@smithy/types': 3.7.1 tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' @@ -6799,10 +6843,10 @@ snapshots: '@aws-sdk/credential-provider-sso': 3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)) '@aws-sdk/credential-provider-web-identity': 3.686.0(@aws-sdk/client-sts@3.687.0) '@aws-sdk/types': 3.686.0 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 + '@smithy/credential-provider-imds': 3.2.7 + '@smithy/property-provider': 3.1.10 + '@smithy/shared-ini-file-loader': 3.1.11 + '@smithy/types': 3.7.1 tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' @@ -6813,9 +6857,9 @@ snapshots: dependencies: '@aws-sdk/core': 3.686.0 '@aws-sdk/types': 3.686.0 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 + '@smithy/property-provider': 3.1.10 + '@smithy/shared-ini-file-loader': 3.1.11 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@aws-sdk/credential-provider-sso@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))': @@ -6824,9 +6868,9 @@ snapshots: '@aws-sdk/core': 3.686.0 '@aws-sdk/token-providers': 3.686.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)) '@aws-sdk/types': 3.686.0 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 + '@smithy/property-provider': 3.1.10 + '@smithy/shared-ini-file-loader': 3.1.11 + '@smithy/types': 3.7.1 tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' @@ -6837,8 +6881,8 @@ snapshots: '@aws-sdk/client-sts': 3.687.0 '@aws-sdk/core': 3.686.0 '@aws-sdk/types': 3.686.0 - '@smithy/property-provider': 3.1.8 - '@smithy/types': 3.6.0 + '@smithy/property-provider': 3.1.10 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))': @@ -6856,9 +6900,9 @@ snapshots: '@aws-sdk/credential-provider-sso': 3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)) '@aws-sdk/credential-provider-web-identity': 3.686.0(@aws-sdk/client-sts@3.687.0) '@aws-sdk/types': 3.686.0 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/types': 3.6.0 + '@smithy/credential-provider-imds': 3.2.7 + '@smithy/property-provider': 3.1.10 + '@smithy/types': 3.7.1 tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' @@ -6868,17 +6912,17 @@ snapshots: dependencies: '@aws-sdk/types': 3.686.0 '@aws-sdk/util-arn-parser': 3.679.0 - '@smithy/node-config-provider': 3.1.9 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 + '@smithy/node-config-provider': 3.1.11 + '@smithy/protocol-http': 4.1.7 + '@smithy/types': 3.7.1 '@smithy/util-config-provider': 3.0.0 tslib: 2.8.1 '@aws-sdk/middleware-expect-continue@3.686.0': dependencies: '@aws-sdk/types': 3.686.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 + '@smithy/protocol-http': 4.1.7 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@aws-sdk/middleware-flexible-checksums@3.689.0': @@ -6889,59 +6933,59 @@ snapshots: '@aws-sdk/core': 3.686.0 '@aws-sdk/types': 3.686.0 '@smithy/is-array-buffer': 3.0.0 - '@smithy/node-config-provider': 3.1.9 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-stream': 3.2.1 + '@smithy/node-config-provider': 3.1.11 + '@smithy/protocol-http': 4.1.7 + '@smithy/types': 3.7.1 + '@smithy/util-middleware': 3.0.10 + '@smithy/util-stream': 3.3.1 '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 '@aws-sdk/middleware-host-header@3.686.0': dependencies: '@aws-sdk/types': 3.686.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 + '@smithy/protocol-http': 4.1.7 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@aws-sdk/middleware-location-constraint@3.686.0': dependencies: '@aws-sdk/types': 3.686.0 - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@aws-sdk/middleware-logger@3.686.0': dependencies: '@aws-sdk/types': 3.686.0 - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@aws-sdk/middleware-recursion-detection@3.686.0': dependencies: '@aws-sdk/types': 3.686.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 + '@smithy/protocol-http': 4.1.7 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@aws-sdk/middleware-sdk-ec2@3.686.0': dependencies: '@aws-sdk/types': 3.686.0 '@aws-sdk/util-format-url': 3.686.0 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/protocol-http': 4.1.5 - '@smithy/signature-v4': 4.2.1 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 + '@smithy/middleware-endpoint': 3.2.4 + '@smithy/protocol-http': 4.1.7 + '@smithy/signature-v4': 4.2.3 + '@smithy/smithy-client': 3.4.5 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@aws-sdk/middleware-sdk-rds@3.686.0': dependencies: '@aws-sdk/types': 3.686.0 '@aws-sdk/util-format-url': 3.686.0 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/protocol-http': 4.1.5 - '@smithy/signature-v4': 4.2.1 - '@smithy/types': 3.6.0 + '@smithy/middleware-endpoint': 3.2.4 + '@smithy/protocol-http': 4.1.7 + '@smithy/signature-v4': 4.2.3 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@aws-sdk/middleware-sdk-s3@3.687.0': @@ -6949,22 +6993,22 @@ snapshots: '@aws-sdk/core': 3.686.0 '@aws-sdk/types': 3.686.0 '@aws-sdk/util-arn-parser': 3.679.0 - '@smithy/core': 2.5.1 - '@smithy/node-config-provider': 3.1.9 - '@smithy/protocol-http': 4.1.5 - '@smithy/signature-v4': 4.2.1 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 + '@smithy/core': 2.5.4 + '@smithy/node-config-provider': 3.1.11 + '@smithy/protocol-http': 4.1.7 + '@smithy/signature-v4': 4.2.3 + '@smithy/smithy-client': 3.4.5 + '@smithy/types': 3.7.1 '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-stream': 3.2.1 + '@smithy/util-middleware': 3.0.10 + '@smithy/util-stream': 3.3.1 '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 '@aws-sdk/middleware-ssec@3.686.0': dependencies: '@aws-sdk/types': 3.686.0 - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@aws-sdk/middleware-user-agent@3.687.0': @@ -6972,41 +7016,41 @@ snapshots: '@aws-sdk/core': 3.686.0 '@aws-sdk/types': 3.686.0 '@aws-sdk/util-endpoints': 3.686.0 - '@smithy/core': 2.5.1 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 + '@smithy/core': 2.5.4 + '@smithy/protocol-http': 4.1.7 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@aws-sdk/region-config-resolver@3.686.0': dependencies: '@aws-sdk/types': 3.686.0 - '@smithy/node-config-provider': 3.1.9 - '@smithy/types': 3.6.0 + '@smithy/node-config-provider': 3.1.11 + '@smithy/types': 3.7.1 '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.8 + '@smithy/util-middleware': 3.0.10 tslib: 2.8.1 '@aws-sdk/signature-v4-multi-region@3.687.0': dependencies: '@aws-sdk/middleware-sdk-s3': 3.687.0 '@aws-sdk/types': 3.686.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/signature-v4': 4.2.1 - '@smithy/types': 3.6.0 + '@smithy/protocol-http': 4.1.7 + '@smithy/signature-v4': 4.2.3 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@aws-sdk/token-providers@3.686.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))': dependencies: '@aws-sdk/client-sso-oidc': 3.687.0(@aws-sdk/client-sts@3.687.0) '@aws-sdk/types': 3.686.0 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 + '@smithy/property-provider': 3.1.10 + '@smithy/shared-ini-file-loader': 3.1.11 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@aws-sdk/types@3.686.0': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@aws-sdk/util-arn-parser@3.679.0': @@ -7016,25 +7060,25 @@ snapshots: '@aws-sdk/util-endpoints@3.686.0': dependencies: '@aws-sdk/types': 3.686.0 - '@smithy/types': 3.6.0 - '@smithy/util-endpoints': 2.1.4 + '@smithy/types': 3.7.1 + '@smithy/util-endpoints': 2.1.6 tslib: 2.8.1 '@aws-sdk/util-format-url@3.686.0': dependencies: '@aws-sdk/types': 3.686.0 - '@smithy/querystring-builder': 3.0.8 - '@smithy/types': 3.6.0 + '@smithy/querystring-builder': 3.0.10 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.679.0': + '@aws-sdk/util-locate-window@3.693.0': dependencies: tslib: 2.8.1 '@aws-sdk/util-user-agent-browser@3.686.0': dependencies: '@aws-sdk/types': 3.686.0 - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 bowser: 2.11.0 tslib: 2.8.1 @@ -7042,13 +7086,13 @@ snapshots: dependencies: '@aws-sdk/middleware-user-agent': 3.687.0 '@aws-sdk/types': 3.686.0 - '@smithy/node-config-provider': 3.1.9 - '@smithy/types': 3.6.0 + '@smithy/node-config-provider': 3.1.11 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@aws-sdk/xml-builder@3.686.0': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@babel/code-frame@7.26.2': @@ -7245,7 +7289,7 @@ snapshots: '@breejs/later@4.2.0': {} - '@cdktf/hcl2json@0.20.9': + '@cdktf/hcl2json@0.20.10': dependencies: fs-extra: 11.2.0 @@ -7327,7 +7371,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3))': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -7341,7 +7385,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)) + jest-config: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -7560,6 +7604,11 @@ snapshots: '@npmcli/fs@3.1.1': dependencies: semver: 7.6.3 + optional: true + + '@npmcli/fs@4.0.0': + dependencies: + semver: 7.6.3 '@octokit/auth-token@4.0.0': {} @@ -7678,58 +7727,58 @@ snapshots: '@one-ini/wasm@0.1.1': {} - '@openpgp/web-stream-tools@0.0.14(typescript@5.6.3)': + '@openpgp/web-stream-tools@0.1.3(typescript@5.6.3)': optionalDependencies: typescript: 5.6.3 - '@opentelemetry/api-logs@0.54.0': + '@opentelemetry/api-logs@0.55.0': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/api@1.9.0': {} - '@opentelemetry/context-async-hooks@1.27.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/context-async-hooks@1.28.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/core@1.28.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.27.0 - '@opentelemetry/exporter-trace-otlp-http@0.54.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-trace-otlp-http@0.55.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.54.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.54.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.28.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-bunyan@0.42.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-bunyan@0.43.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.54.0 - '@opentelemetry/instrumentation': 0.54.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api-logs': 0.55.0 + '@opentelemetry/instrumentation': 0.55.0(@opentelemetry/api@1.9.0) '@types/bunyan': 1.8.9 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-http@0.54.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-http@0.55.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.54.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.55.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 forwarded-parse: 2.1.2 semver: 7.6.3 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation@0.54.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation@0.55.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.54.0 + '@opentelemetry/api-logs': 0.55.0 '@types/shimmer': 1.2.0 import-in-the-middle: 1.11.2 require-in-the-middle: 7.4.0 @@ -7738,71 +7787,73 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/otlp-exporter-base@0.54.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/otlp-exporter-base@0.55.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.54.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer@0.54.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/otlp-transformer@0.55.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.54.0 - '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.54.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api-logs': 0.55.0 + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.28.0(@opentelemetry/api@1.9.0) protobufjs: 7.4.0 - '@opentelemetry/propagator-b3@1.27.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/propagator-b3@1.28.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-jaeger@1.27.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/propagator-jaeger@1.28.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources@1.27.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/resources@1.28.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 - '@opentelemetry/sdk-logs@0.54.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-logs@0.55.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.54.0 - '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api-logs': 0.55.0 + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.28.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics@1.27.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-metrics@1.28.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.28.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-trace-base@1.28.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.28.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 - '@opentelemetry/sdk-trace-node@1.27.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-trace-node@1.28.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 1.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-b3': 1.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-jaeger': 1.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/context-async-hooks': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-b3': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-jaeger': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.28.0(@opentelemetry/api@1.9.0) semver: 7.6.3 '@opentelemetry/semantic-conventions@1.27.0': {} + '@opentelemetry/semantic-conventions@1.28.0': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -7922,11 +7973,10 @@ snapshots: '@renovatebot/eslint-plugin@file:tools/eslint': {} - '@renovatebot/kbpgp@3.0.1': + '@renovatebot/kbpgp@4.0.1': dependencies: bn: 1.0.5 bzip-deflate: 1.0.0 - deep-equal: 2.2.3 iced-error: 0.0.13 iced-lock: 2.0.1 iced-runtime-3: 3.0.5 @@ -7954,9 +8004,9 @@ snapshots: transitivePeerDependencies: - encoding - '@renovatebot/pep440@3.0.20': {} + '@renovatebot/pep440@4.0.1': {} - '@renovatebot/ruby-semver@3.0.23': {} + '@renovatebot/ruby-semver@4.0.0': {} '@rtsao/scc@1.1.0': {} @@ -8000,7 +8050,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@semantic-release/github@11.0.0(semantic-release@24.2.0(typescript@5.6.3))': + '@semantic-release/github@11.0.1(semantic-release@24.2.0(typescript@5.6.3))': dependencies: '@octokit/core': 6.1.2 '@octokit/plugin-paginate-rest': 11.3.5(@octokit/core@6.1.2) @@ -8031,7 +8081,7 @@ snapshots: lodash-es: 4.17.21 nerf-dart: 1.0.0 normalize-url: 8.0.1 - npm: 10.9.0 + npm: 10.9.1 rc: 1.2.8 read-pkg: 9.0.1 registry-auth-token: 5.0.2 @@ -8087,9 +8137,9 @@ snapshots: '@sinonjs/text-encoding@0.7.3': {} - '@smithy/abort-controller@3.1.6': + '@smithy/abort-controller@3.1.8': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@smithy/chunked-blob-reader-native@3.0.1': @@ -8101,94 +8151,94 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/config-resolver@3.0.10': + '@smithy/config-resolver@3.0.12': dependencies: - '@smithy/node-config-provider': 3.1.9 - '@smithy/types': 3.6.0 + '@smithy/node-config-provider': 3.1.11 + '@smithy/types': 3.7.1 '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.8 + '@smithy/util-middleware': 3.0.10 tslib: 2.8.1 - '@smithy/core@2.5.1': + '@smithy/core@2.5.4': dependencies: - '@smithy/middleware-serde': 3.0.8 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 + '@smithy/middleware-serde': 3.0.10 + '@smithy/protocol-http': 4.1.7 + '@smithy/types': 3.7.1 '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-stream': 3.2.1 + '@smithy/util-middleware': 3.0.10 + '@smithy/util-stream': 3.3.1 '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 - '@smithy/credential-provider-imds@3.2.5': + '@smithy/credential-provider-imds@3.2.7': dependencies: - '@smithy/node-config-provider': 3.1.9 - '@smithy/property-provider': 3.1.8 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 + '@smithy/node-config-provider': 3.1.11 + '@smithy/property-provider': 3.1.10 + '@smithy/types': 3.7.1 + '@smithy/url-parser': 3.0.10 tslib: 2.8.1 - '@smithy/eventstream-codec@3.1.7': + '@smithy/eventstream-codec@3.1.9': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 '@smithy/util-hex-encoding': 3.0.0 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@3.0.11': + '@smithy/eventstream-serde-browser@3.0.13': dependencies: - '@smithy/eventstream-serde-universal': 3.0.10 - '@smithy/types': 3.6.0 + '@smithy/eventstream-serde-universal': 3.0.12 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@3.0.8': + '@smithy/eventstream-serde-config-resolver@3.0.10': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@smithy/eventstream-serde-node@3.0.10': + '@smithy/eventstream-serde-node@3.0.12': dependencies: - '@smithy/eventstream-serde-universal': 3.0.10 - '@smithy/types': 3.6.0 + '@smithy/eventstream-serde-universal': 3.0.12 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@3.0.10': + '@smithy/eventstream-serde-universal@3.0.12': dependencies: - '@smithy/eventstream-codec': 3.1.7 - '@smithy/types': 3.6.0 + '@smithy/eventstream-codec': 3.1.9 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@smithy/fetch-http-handler@4.0.0': + '@smithy/fetch-http-handler@4.1.1': dependencies: - '@smithy/protocol-http': 4.1.5 - '@smithy/querystring-builder': 3.0.8 - '@smithy/types': 3.6.0 + '@smithy/protocol-http': 4.1.7 + '@smithy/querystring-builder': 3.0.10 + '@smithy/types': 3.7.1 '@smithy/util-base64': 3.0.0 tslib: 2.8.1 - '@smithy/hash-blob-browser@3.1.7': + '@smithy/hash-blob-browser@3.1.9': dependencies: '@smithy/chunked-blob-reader': 4.0.0 '@smithy/chunked-blob-reader-native': 3.0.1 - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@smithy/hash-node@3.0.8': + '@smithy/hash-node@3.0.10': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 - '@smithy/hash-stream-node@3.1.7': + '@smithy/hash-stream-node@3.1.9': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 - '@smithy/invalid-dependency@3.0.8': + '@smithy/invalid-dependency@3.0.10': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': @@ -8199,125 +8249,125 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/md5-js@3.0.8': + '@smithy/md5-js@3.0.10': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 - '@smithy/middleware-content-length@3.0.10': + '@smithy/middleware-content-length@3.0.12': dependencies: - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 + '@smithy/protocol-http': 4.1.7 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@smithy/middleware-endpoint@3.2.1': + '@smithy/middleware-endpoint@3.2.4': dependencies: - '@smithy/core': 2.5.1 - '@smithy/middleware-serde': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-middleware': 3.0.8 + '@smithy/core': 2.5.4 + '@smithy/middleware-serde': 3.0.10 + '@smithy/node-config-provider': 3.1.11 + '@smithy/shared-ini-file-loader': 3.1.11 + '@smithy/types': 3.7.1 + '@smithy/url-parser': 3.0.10 + '@smithy/util-middleware': 3.0.10 tslib: 2.8.1 - '@smithy/middleware-retry@3.0.25': + '@smithy/middleware-retry@3.0.28': dependencies: - '@smithy/node-config-provider': 3.1.9 - '@smithy/protocol-http': 4.1.5 - '@smithy/service-error-classification': 3.0.8 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 + '@smithy/node-config-provider': 3.1.11 + '@smithy/protocol-http': 4.1.7 + '@smithy/service-error-classification': 3.0.10 + '@smithy/smithy-client': 3.4.5 + '@smithy/types': 3.7.1 + '@smithy/util-middleware': 3.0.10 + '@smithy/util-retry': 3.0.10 tslib: 2.8.1 uuid: 9.0.1 - '@smithy/middleware-serde@3.0.8': + '@smithy/middleware-serde@3.0.10': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@smithy/middleware-stack@3.0.8': + '@smithy/middleware-stack@3.0.10': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@smithy/node-config-provider@3.1.9': + '@smithy/node-config-provider@3.1.11': dependencies: - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 + '@smithy/property-provider': 3.1.10 + '@smithy/shared-ini-file-loader': 3.1.11 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@smithy/node-http-handler@3.2.5': + '@smithy/node-http-handler@3.3.1': dependencies: - '@smithy/abort-controller': 3.1.6 - '@smithy/protocol-http': 4.1.5 - '@smithy/querystring-builder': 3.0.8 - '@smithy/types': 3.6.0 + '@smithy/abort-controller': 3.1.8 + '@smithy/protocol-http': 4.1.7 + '@smithy/querystring-builder': 3.0.10 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@smithy/property-provider@3.1.8': + '@smithy/property-provider@3.1.10': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@smithy/protocol-http@4.1.5': + '@smithy/protocol-http@4.1.7': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@smithy/querystring-builder@3.0.8': + '@smithy/querystring-builder@3.0.10': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 '@smithy/util-uri-escape': 3.0.0 tslib: 2.8.1 - '@smithy/querystring-parser@3.0.8': + '@smithy/querystring-parser@3.0.10': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@smithy/service-error-classification@3.0.8': + '@smithy/service-error-classification@3.0.10': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 - '@smithy/shared-ini-file-loader@3.1.9': + '@smithy/shared-ini-file-loader@3.1.11': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@smithy/signature-v4@4.2.1': + '@smithy/signature-v4@4.2.3': dependencies: '@smithy/is-array-buffer': 3.0.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 + '@smithy/protocol-http': 4.1.7 + '@smithy/types': 3.7.1 '@smithy/util-hex-encoding': 3.0.0 - '@smithy/util-middleware': 3.0.8 + '@smithy/util-middleware': 3.0.10 '@smithy/util-uri-escape': 3.0.0 '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 - '@smithy/smithy-client@3.4.2': + '@smithy/smithy-client@3.4.5': dependencies: - '@smithy/core': 2.5.1 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-stack': 3.0.8 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - '@smithy/util-stream': 3.2.1 + '@smithy/core': 2.5.4 + '@smithy/middleware-endpoint': 3.2.4 + '@smithy/middleware-stack': 3.0.10 + '@smithy/protocol-http': 4.1.7 + '@smithy/types': 3.7.1 + '@smithy/util-stream': 3.3.1 tslib: 2.8.1 - '@smithy/types@3.6.0': + '@smithy/types@3.7.1': dependencies: tslib: 2.8.1 - '@smithy/url-parser@3.0.8': + '@smithy/url-parser@3.0.10': dependencies: - '@smithy/querystring-parser': 3.0.8 - '@smithy/types': 3.6.0 + '@smithy/querystring-parser': 3.0.10 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@smithy/util-base64@3.0.0': @@ -8348,50 +8398,50 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@3.0.25': + '@smithy/util-defaults-mode-browser@3.0.28': dependencies: - '@smithy/property-provider': 3.1.8 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 + '@smithy/property-provider': 3.1.10 + '@smithy/smithy-client': 3.4.5 + '@smithy/types': 3.7.1 bowser: 2.11.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@3.0.25': + '@smithy/util-defaults-mode-node@3.0.28': dependencies: - '@smithy/config-resolver': 3.0.10 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/node-config-provider': 3.1.9 - '@smithy/property-provider': 3.1.8 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 + '@smithy/config-resolver': 3.0.12 + '@smithy/credential-provider-imds': 3.2.7 + '@smithy/node-config-provider': 3.1.11 + '@smithy/property-provider': 3.1.10 + '@smithy/smithy-client': 3.4.5 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@smithy/util-endpoints@2.1.4': + '@smithy/util-endpoints@2.1.6': dependencies: - '@smithy/node-config-provider': 3.1.9 - '@smithy/types': 3.6.0 + '@smithy/node-config-provider': 3.1.11 + '@smithy/types': 3.7.1 tslib: 2.8.1 '@smithy/util-hex-encoding@3.0.0': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@3.0.8': + '@smithy/util-middleware@3.0.10': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@smithy/util-retry@3.0.8': + '@smithy/util-retry@3.0.10': dependencies: - '@smithy/service-error-classification': 3.0.8 - '@smithy/types': 3.6.0 + '@smithy/service-error-classification': 3.0.10 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@smithy/util-stream@3.2.1': + '@smithy/util-stream@3.3.1': dependencies: - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/node-http-handler': 3.2.5 - '@smithy/types': 3.6.0 + '@smithy/fetch-http-handler': 4.1.1 + '@smithy/node-http-handler': 3.3.1 + '@smithy/types': 3.7.1 '@smithy/util-base64': 3.0.0 '@smithy/util-buffer-from': 3.0.0 '@smithy/util-hex-encoding': 3.0.0 @@ -8412,61 +8462,61 @@ snapshots: '@smithy/util-buffer-from': 3.0.0 tslib: 2.8.1 - '@smithy/util-waiter@3.1.7': + '@smithy/util-waiter@3.1.9': dependencies: - '@smithy/abort-controller': 3.1.6 - '@smithy/types': 3.6.0 + '@smithy/abort-controller': 3.1.8 + '@smithy/types': 3.7.1 tslib: 2.8.1 - '@swc/core-darwin-arm64@1.8.0': + '@swc/core-darwin-arm64@1.9.2': optional: true - '@swc/core-darwin-x64@1.8.0': + '@swc/core-darwin-x64@1.9.2': optional: true - '@swc/core-linux-arm-gnueabihf@1.8.0': + '@swc/core-linux-arm-gnueabihf@1.9.2': optional: true - '@swc/core-linux-arm64-gnu@1.8.0': + '@swc/core-linux-arm64-gnu@1.9.2': optional: true - '@swc/core-linux-arm64-musl@1.8.0': + '@swc/core-linux-arm64-musl@1.9.2': optional: true - '@swc/core-linux-x64-gnu@1.8.0': + '@swc/core-linux-x64-gnu@1.9.2': optional: true - '@swc/core-linux-x64-musl@1.8.0': + '@swc/core-linux-x64-musl@1.9.2': optional: true - '@swc/core-win32-arm64-msvc@1.8.0': + '@swc/core-win32-arm64-msvc@1.9.2': optional: true - '@swc/core-win32-ia32-msvc@1.8.0': + '@swc/core-win32-ia32-msvc@1.9.2': optional: true - '@swc/core-win32-x64-msvc@1.8.0': + '@swc/core-win32-x64-msvc@1.9.2': optional: true - '@swc/core@1.8.0': + '@swc/core@1.9.2': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.15 + '@swc/types': 0.1.17 optionalDependencies: - '@swc/core-darwin-arm64': 1.8.0 - '@swc/core-darwin-x64': 1.8.0 - '@swc/core-linux-arm-gnueabihf': 1.8.0 - '@swc/core-linux-arm64-gnu': 1.8.0 - '@swc/core-linux-arm64-musl': 1.8.0 - '@swc/core-linux-x64-gnu': 1.8.0 - '@swc/core-linux-x64-musl': 1.8.0 - '@swc/core-win32-arm64-msvc': 1.8.0 - '@swc/core-win32-ia32-msvc': 1.8.0 - '@swc/core-win32-x64-msvc': 1.8.0 + '@swc/core-darwin-arm64': 1.9.2 + '@swc/core-darwin-x64': 1.9.2 + '@swc/core-linux-arm-gnueabihf': 1.9.2 + '@swc/core-linux-arm64-gnu': 1.9.2 + '@swc/core-linux-arm64-musl': 1.9.2 + '@swc/core-linux-x64-gnu': 1.9.2 + '@swc/core-linux-x64-musl': 1.9.2 + '@swc/core-win32-arm64-msvc': 1.9.2 + '@swc/core-win32-ia32-msvc': 1.9.2 + '@swc/core-win32-x64-msvc': 1.9.2 '@swc/counter@0.1.3': {} - '@swc/types@0.1.15': + '@swc/types@0.1.17': dependencies: '@swc/counter': 0.1.3 @@ -8546,7 +8596,7 @@ snapshots: dependencies: '@babel/types': 7.26.0 - '@types/better-sqlite3@7.6.11': + '@types/better-sqlite3@7.6.12': dependencies: '@types/node': 20.17.6 @@ -8581,7 +8631,7 @@ snapshots: '@types/conventional-commits-detector@1.0.2': {} - '@types/diff@5.2.3': {} + '@types/diff@6.0.0': {} '@types/emscripten@1.39.13': {} @@ -8678,6 +8728,10 @@ snapshots: '@types/parse-link-header@2.0.3': {} + '@types/parse-path@7.0.3': {} + + '@types/punycode@2.1.4': {} + '@types/responselike@1.0.3': dependencies: '@types/node': 20.17.6 @@ -8777,10 +8831,10 @@ snapshots: '@typescript-eslint/types': 8.11.0 '@typescript-eslint/visitor-keys': 8.11.0 - '@typescript-eslint/scope-manager@8.12.2': + '@typescript-eslint/scope-manager@8.15.0': dependencies: - '@typescript-eslint/types': 8.12.2 - '@typescript-eslint/visitor-keys': 8.12.2 + '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/visitor-keys': 8.15.0 '@typescript-eslint/type-utils@8.11.0(eslint@8.57.1)(typescript@5.6.3)': dependencies: @@ -8798,7 +8852,7 @@ snapshots: '@typescript-eslint/types@8.11.0': {} - '@typescript-eslint/types@8.12.2': {} + '@typescript-eslint/types@8.15.0': {} '@typescript-eslint/typescript-estree@5.62.0(typescript@5.6.3)': dependencies: @@ -8829,10 +8883,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.12.2(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.15.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.12.2 - '@typescript-eslint/visitor-keys': 8.12.2 + '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/visitor-keys': 8.15.0 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 @@ -8870,16 +8924,17 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.12.2(eslint@8.57.1)(typescript@5.6.3)': + '@typescript-eslint/utils@8.15.0(eslint@8.57.1)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.12.2 - '@typescript-eslint/types': 8.12.2 - '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.15.0 + '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) eslint: 8.57.1 + optionalDependencies: + typescript: 5.6.3 transitivePeerDependencies: - supports-color - - typescript '@typescript-eslint/visitor-keys@5.62.0': dependencies: @@ -8891,27 +8946,27 @@ snapshots: '@typescript-eslint/types': 8.11.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.12.2': + '@typescript-eslint/visitor-keys@8.15.0': dependencies: - '@typescript-eslint/types': 8.12.2 - eslint-visitor-keys: 3.4.3 + '@typescript-eslint/types': 8.15.0 + eslint-visitor-keys: 4.2.0 '@ungap/structured-clone@1.2.0': {} - '@yarnpkg/core@4.1.4(typanion@3.14.0)': + '@yarnpkg/core@4.1.6(typanion@3.14.0)': dependencies: '@arcanis/slice-ansi': 1.1.1 '@types/semver': 7.5.8 '@types/treeify': 1.0.3 - '@yarnpkg/fslib': 3.1.0 - '@yarnpkg/libzip': 3.1.0(@yarnpkg/fslib@3.1.0) + '@yarnpkg/fslib': 3.1.1 + '@yarnpkg/libzip': 3.1.0(@yarnpkg/fslib@3.1.1) '@yarnpkg/parsers': 3.0.2 - '@yarnpkg/shell': 4.1.0(typanion@3.14.0) + '@yarnpkg/shell': 4.1.1(typanion@3.14.0) camelcase: 5.3.1 chalk: 3.0.0 - ci-info: 4.0.0 + ci-info: 4.1.0 clipanion: 4.0.0-rc.4(typanion@3.14.0) - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 diff: 5.2.0 dotenv: 16.4.5 fast-glob: 3.3.2 @@ -8929,14 +8984,14 @@ snapshots: transitivePeerDependencies: - typanion - '@yarnpkg/fslib@3.1.0': + '@yarnpkg/fslib@3.1.1': dependencies: tslib: 2.8.1 - '@yarnpkg/libzip@3.1.0(@yarnpkg/fslib@3.1.0)': + '@yarnpkg/libzip@3.1.0(@yarnpkg/fslib@3.1.1)': dependencies: '@types/emscripten': 1.39.13 - '@yarnpkg/fslib': 3.1.0 + '@yarnpkg/fslib': 3.1.1 tslib: 2.8.1 '@yarnpkg/parsers@3.0.2': @@ -8944,13 +8999,13 @@ snapshots: js-yaml: 3.14.1 tslib: 2.8.1 - '@yarnpkg/shell@4.1.0(typanion@3.14.0)': + '@yarnpkg/shell@4.1.1(typanion@3.14.0)': dependencies: - '@yarnpkg/fslib': 3.1.0 + '@yarnpkg/fslib': 3.1.1 '@yarnpkg/parsers': 3.0.2 chalk: 3.0.0 clipanion: 4.0.0-rc.4(typanion@3.14.0) - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 fast-glob: 3.3.2 micromatch: 4.0.8 tslib: 2.8.1 @@ -9061,7 +9116,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 is-string: 1.0.7 @@ -9072,7 +9127,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 @@ -9081,14 +9136,14 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-shim-unscopables: 1.0.2 array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-shim-unscopables: 1.0.2 arraybuffer.prototype.slice@1.0.3: @@ -9096,7 +9151,7 @@ snapshots: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 @@ -9104,14 +9159,6 @@ snapshots: arrify@1.0.1: {} - asn1.js@5.4.1: - dependencies: - bn.js: 4.12.0 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - safer-buffer: 2.1.2 - optional: true - async-mutex@0.5.0: dependencies: tslib: 2.8.1 @@ -9224,9 +9271,6 @@ snapshots: readable-stream: 3.6.2 optional: true - bn.js@4.12.0: - optional: true - bn@1.0.5: {} boolbase@1.0.0: {} @@ -9252,8 +9296,8 @@ snapshots: browserslist@4.24.2: dependencies: - caniuse-lite: 1.0.30001677 - electron-to-chromium: 1.5.50 + caniuse-lite: 1.0.30001683 + electron-to-chromium: 1.5.64 node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.2) @@ -9295,6 +9339,22 @@ snapshots: ssri: 10.0.6 tar: 6.2.1 unique-filename: 3.0.0 + optional: true + + cacache@19.0.1: + dependencies: + '@npmcli/fs': 4.0.0 + fs-minipass: 3.0.3 + glob: 10.4.5 + lru-cache: 10.4.3 + minipass: 7.1.2 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 7.0.2 + ssri: 12.0.0 + tar: 7.4.3 + unique-filename: 4.0.0 cacheable-lookup@5.0.4: {} @@ -9337,7 +9397,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001677: {} + caniuse-lite@1.0.30001683: {} chalk@2.4.2: dependencies: @@ -9376,7 +9436,7 @@ snapshots: ci-info@3.9.0: {} - ci-info@4.0.0: {} + ci-info@4.1.0: {} cjs-module-lexer@1.4.1: {} @@ -9515,13 +9575,13 @@ snapshots: optionalDependencies: typescript: 5.6.3 - create-jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)): + create-jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)) + jest-config: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -9532,13 +9592,11 @@ snapshots: create-require@1.1.1: {} - cron-parser@4.9.0: - dependencies: - luxon: 3.5.0 + croner@9.0.0: {} - cronstrue@2.51.0: {} + cronstrue@2.52.0: {} - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -9599,27 +9657,6 @@ snapshots: dedent@1.5.3: {} - deep-equal@2.2.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - isarray: 2.0.5 - object-is: 1.1.6 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.3 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 - deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -9668,6 +9705,8 @@ snapshots: diff@5.2.0: {} + diff@7.0.0: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -9725,7 +9764,7 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.50: {} + electron-to-chromium@1.5.64: {} email-addresses@5.0.0: {} @@ -9779,7 +9818,7 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.3: + es-abstract@1.23.5: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -9812,7 +9851,7 @@ snapshots: is-string: 1.0.7 is-typed-array: 1.1.13 is-weakref: 1.0.2 - object-inspect: 1.13.2 + object-inspect: 1.13.3 object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.3 @@ -9823,8 +9862,8 @@ snapshots: string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.2 typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 + typed-array-byte-offset: 1.0.3 + typed-array-length: 1.0.7 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 @@ -9834,18 +9873,6 @@ snapshots: es-errors@1.3.0: {} - es-get-iterator@1.1.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 @@ -9962,13 +9989,13 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-jest@28.8.3(@typescript-eslint/eslint-plugin@8.11.0(@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)))(typescript@5.6.3): + eslint-plugin-jest@28.8.3(@typescript-eslint/eslint-plugin@8.11.0(@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)))(typescript@5.6.3): dependencies: - '@typescript-eslint/utils': 8.12.2(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/utils': 8.15.0(eslint@8.57.1)(typescript@5.6.3) eslint: 8.57.1 optionalDependencies: '@typescript-eslint/eslint-plugin': 8.11.0(@typescript-eslint/parser@8.11.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) - jest: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)) + jest: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)) transitivePeerDependencies: - supports-color - typescript @@ -9997,6 +10024,8 @@ snapshots: eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@4.2.0: {} + eslint@8.57.1: dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) @@ -10009,7 +10038,7 @@ snapshots: '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 debug: 4.3.7 doctrine: 3.0.0 escape-string-regexp: 4.0.0 @@ -10066,7 +10095,7 @@ snapshots: execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -10078,7 +10107,7 @@ snapshots: execa@8.0.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 8.0.1 human-signals: 5.0.0 is-stream: 3.0.0 @@ -10091,14 +10120,14 @@ snapshots: execa@9.5.1: dependencies: '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 figures: 6.1.0 get-stream: 9.0.1 human-signals: 8.0.0 is-plain-obj: 4.1.0 is-stream: 4.0.1 npm-run-path: 6.0.0 - pretty-ms: 9.1.0 + pretty-ms: 9.2.0 signal-exit: 4.1.0 strip-final-newline: 4.0.0 yoctocolors: 2.1.1 @@ -10229,11 +10258,11 @@ snapshots: flat-cache@3.2.0: dependencies: - flatted: 3.3.1 + flatted: 3.3.2 keyv: 4.5.4 rimraf: 3.0.2 - flatted@3.3.1: {} + flatted@3.3.2: {} for-each@0.3.3: dependencies: @@ -10241,12 +10270,12 @@ snapshots: foreground-child@2.0.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 3.0.7 foreground-child@3.3.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 forwarded-parse@2.1.2: {} @@ -10288,7 +10317,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 functions-have-names: 1.2.3 functions-have-names@1.2.3: {} @@ -10370,14 +10399,14 @@ snapshots: split2: 3.2.2 through2: 4.0.2 - git-up@7.0.0: + git-up@8.0.0: dependencies: is-ssh: 1.4.0 - parse-url: 8.1.0 + parse-url: 9.2.0 - git-url-parse@15.0.0: + git-url-parse@16.0.0: dependencies: - git-up: 7.0.0 + git-up: 8.0.0 github-from-package@0.0.0: optional: true @@ -10464,7 +10493,7 @@ snapshots: klona: 2.0.6 moo: 0.5.2 - google-auth-library@9.14.2(encoding@0.1.13): + google-auth-library@9.15.0(encoding@0.1.13): dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 @@ -10498,7 +10527,7 @@ snapshots: graceful-fs@4.2.11: {} - graph-data-structure@3.5.0: {} + graph-data-structure@4.2.0: {} grapheme-splitter@1.0.4: {} @@ -10568,7 +10597,7 @@ snapshots: dependencies: lru-cache: 10.4.3 - hosted-git-info@8.0.0: + hosted-git-info@8.0.2: dependencies: lru-cache: 10.4.3 @@ -10605,7 +10634,7 @@ snapshots: dependencies: ms: 2.1.3 - husky@9.1.6: {} + husky@9.1.7: {} hyperdyperid@1.2.0: {} @@ -10721,6 +10750,10 @@ snapshots: is-arrayish@0.2.1: {} + is-async-function@2.0.0: + dependencies: + has-tostringtag: 1.0.2 + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 @@ -10754,6 +10787,10 @@ snapshots: is-extglob@2.1.1: {} + is-finalizationregistry@1.0.2: + dependencies: + call-bind: 1.0.7 + is-fullwidth-code-point@3.0.0: {} is-generator-fn@2.1.0: {} @@ -10886,7 +10923,7 @@ snapshots: istanbul-lib-processinfo@2.0.3: dependencies: archy: 1.0.0 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 istanbul-lib-coverage: 3.2.2 p-map: 3.0.0 rimraf: 3.0.2 @@ -10962,16 +10999,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)): + jest-cli@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)) + create-jest: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)) + jest-config: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -10981,7 +11018,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)): + jest-config@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)): dependencies: '@babel/core': 7.26.0 '@jest/test-sequencer': 29.7.0 @@ -11007,7 +11044,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.17.6 - ts-node: 10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3) + ts-node: 10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -11040,12 +11077,12 @@ snapshots: jest-mock: 29.7.0 jest-util: 29.7.0 - jest-extended@4.0.2(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3))): + jest-extended@4.0.2(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3))): dependencies: jest-diff: 29.7.0 jest-get-type: 29.6.3 optionalDependencies: - jest: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)) + jest: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)) jest-get-type@29.6.3: {} @@ -11096,9 +11133,9 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 - jest-mock-extended@3.0.7(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)))(typescript@5.6.3): + jest-mock-extended@3.0.7(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)))(typescript@5.6.3): dependencies: - jest: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)) + jest: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)) ts-essentials: 10.0.3(typescript@5.6.3) typescript: 5.6.3 @@ -11247,12 +11284,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)): + jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)) + jest-cli: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -11482,25 +11519,25 @@ snapshots: dependencies: repeat-string: 1.6.1 - markdownlint-cli2-formatter-default@0.0.5(markdownlint-cli2@0.14.0): + markdownlint-cli2-formatter-default@0.0.5(markdownlint-cli2@0.15.0): dependencies: - markdownlint-cli2: 0.14.0 + markdownlint-cli2: 0.15.0 - markdownlint-cli2@0.14.0: + markdownlint-cli2@0.15.0: dependencies: globby: 14.0.2 js-yaml: 4.1.0 jsonc-parser: 3.3.1 - markdownlint: 0.35.0 - markdownlint-cli2-formatter-default: 0.0.5(markdownlint-cli2@0.14.0) + markdownlint: 0.36.1 + markdownlint-cli2-formatter-default: 0.0.5(markdownlint-cli2@0.15.0) micromatch: 4.0.8 - markdownlint-micromark@0.1.10: {} + markdownlint-micromark@0.1.12: {} - markdownlint@0.35.0: + markdownlint@0.36.1: dependencies: markdown-it: 14.1.0 - markdownlint-micromark: 0.1.10 + markdownlint-micromark: 0.1.12 marked-terminal@7.2.1(marked@12.0.2): dependencies: @@ -11743,7 +11780,7 @@ snapshots: just-extend: 6.2.0 path-to-regexp: 8.2.0 - nock@13.5.5: + nock@13.5.6: dependencies: debug: 4.3.7 json-stringify-safe: 5.0.1 @@ -11794,7 +11831,7 @@ snapshots: node-preload@0.2.1: dependencies: - process-on-spawn: 1.0.0 + process-on-spawn: 1.1.0 node-releases@2.0.18: {} @@ -11834,7 +11871,7 @@ snapshots: npm-run-all2@7.0.1: dependencies: ansi-styles: 6.2.1 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 memorystream: 0.3.1 minimatch: 9.0.5 pidtree: 0.6.0 @@ -11855,7 +11892,7 @@ snapshots: path-key: 4.0.0 unicorn-magic: 0.3.0 - npm@10.9.0: {} + npm@10.9.1: {} nth-check@2.1.1: dependencies: @@ -11883,7 +11920,7 @@ snapshots: make-dir: 3.1.0 node-preload: 0.2.1 p-map: 3.0.0 - process-on-spawn: 1.0.0 + process-on-spawn: 1.1.0 resolve-from: 5.0.0 rimraf: 3.0.2 signal-exit: 3.0.7 @@ -11895,12 +11932,7 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.13.2: {} - - object-is@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 + object-inspect@1.13.3: {} object-keys@1.1.1: {} @@ -11915,14 +11947,14 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-object-atoms: 1.0.0 object.groupby@1.0.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 object.values@1.2.0: dependencies: @@ -11942,9 +11974,7 @@ snapshots: dependencies: mimic-fn: 4.0.0 - openpgp@5.11.2: - dependencies: - asn1.js: 5.4.1 + openpgp@6.0.0: optional: true optionator@0.9.4: @@ -12067,7 +12097,7 @@ snapshots: dependencies: '@babel/code-frame': 7.26.2 index-to-position: 0.1.2 - type-fest: 4.26.1 + type-fest: 4.27.0 parse-link-header@2.0.0: dependencies: @@ -12079,8 +12109,9 @@ snapshots: dependencies: protocols: 2.0.1 - parse-url@8.1.0: + parse-url@9.2.0: dependencies: + '@types/parse-path': 7.0.3 parse-path: 7.0.0 parse5-htmlparser2-tree-adapter@6.0.1: @@ -12173,7 +12204,7 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - pretty-ms@9.1.0: + pretty-ms@9.2.0: dependencies: parse-ms: 4.0.0 @@ -12182,7 +12213,7 @@ snapshots: process-nextick-args@2.0.1: {} - process-on-spawn@1.0.0: + process-on-spawn@1.1.0: dependencies: fromentries: 1.3.2 @@ -12233,7 +12264,7 @@ snapshots: purepack@1.0.6: {} - qs@6.13.0: + qs@6.13.1: dependencies: side-channel: 1.0.6 @@ -12270,7 +12301,7 @@ snapshots: dependencies: find-up-simple: 1.0.0 read-pkg: 9.0.1 - type-fest: 4.26.1 + type-fest: 4.27.0 read-pkg-up@7.0.1: dependencies: @@ -12290,7 +12321,7 @@ snapshots: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.2 parse-json: 8.1.0 - type-fest: 4.26.1 + type-fest: 4.27.0 unicorn-magic: 0.1.0 read-yaml-file@2.1.0: @@ -12328,6 +12359,16 @@ snapshots: '@redis/search': 1.2.0(@redis/client@1.6.0) '@redis/time-series': 1.1.0(@redis/client@1.6.0) + reflect.getprototypeof@1.0.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.5 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + which-builtin-type: 1.1.4 + regenerator-runtime@0.14.1: {} regexp.prototype.flags@1.5.3: @@ -12466,7 +12507,7 @@ snapshots: dependencies: '@semantic-release/commit-analyzer': 13.0.0(semantic-release@24.2.0(typescript@5.6.3)) '@semantic-release/error': 4.0.0 - '@semantic-release/github': 11.0.0(semantic-release@24.2.0(typescript@5.6.3)) + '@semantic-release/github': 11.0.1(semantic-release@24.2.0(typescript@5.6.3)) '@semantic-release/npm': 12.0.1(semantic-release@24.2.0(typescript@5.6.3)) '@semantic-release/release-notes-generator': 14.0.1(semantic-release@24.2.0(typescript@5.6.3)) aggregate-error: 5.0.0 @@ -12479,7 +12520,7 @@ snapshots: get-stream: 6.0.1 git-log-parser: 1.2.1 hook-std: 3.0.0 - hosted-git-info: 8.0.0 + hosted-git-info: 8.0.2 import-from-esm: 1.3.4 lodash-es: 4.17.21 marked: 12.0.2 @@ -12556,7 +12597,7 @@ snapshots: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - object-inspect: 1.13.2 + object-inspect: 1.13.3 signal-exit@3.0.7: {} @@ -12681,14 +12722,15 @@ snapshots: ssri@10.0.6: dependencies: minipass: 7.1.2 + optional: true - stack-utils@2.0.6: + ssri@12.0.0: dependencies: - escape-string-regexp: 2.0.0 + minipass: 7.1.2 - stop-iteration-iterator@1.0.0: + stack-utils@2.0.6: dependencies: - internal-slot: 1.0.7 + escape-string-regexp: 2.0.0 stream-combiner2@1.1.1: dependencies: @@ -12716,7 +12758,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-object-atoms: 1.0.0 string.prototype.trimend@1.0.8: @@ -12925,12 +12967,12 @@ snapshots: optionalDependencies: typescript: 5.6.3 - ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)))(typescript@5.6.3): + ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)))(typescript@5.6.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3)) + jest: 29.7.0(@types/node@20.17.6)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -12944,7 +12986,7 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.0) - ts-node@10.9.2(@swc/core@1.8.0)(@types/node@20.17.6)(typescript@5.6.3): + ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.17.6)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -12962,7 +13004,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.8.0 + '@swc/core': 1.9.2 tsconfig-paths@3.15.0: dependencies: @@ -13017,7 +13059,7 @@ snapshots: type-fest@2.19.0: {} - type-fest@4.26.1: {} + type-fest@4.27.0: {} typed-array-buffer@1.0.2: dependencies: @@ -13033,7 +13075,7 @@ snapshots: has-proto: 1.0.3 is-typed-array: 1.1.13 - typed-array-byte-offset@1.0.2: + typed-array-byte-offset@1.0.3: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -13041,21 +13083,22 @@ snapshots: gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 + reflect.getprototypeof: 1.0.6 - typed-array-length@1.0.6: + typed-array-length@1.0.7: dependencies: call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 - has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.6 typed-rest-client@2.1.0: dependencies: des.js: 1.1.0 js-md4: 0.3.2 - qs: 6.13.0 + qs: 6.13.1 tunnel: 0.0.6 underscore: 1.13.7 @@ -13101,10 +13144,20 @@ snapshots: unique-filename@3.0.0: dependencies: unique-slug: 4.0.0 + optional: true + + unique-filename@4.0.0: + dependencies: + unique-slug: 5.0.0 unique-slug@4.0.0: dependencies: imurmurhash: 0.1.4 + optional: true + + unique-slug@5.0.0: + dependencies: + imurmurhash: 0.1.4 unique-string@3.0.0: dependencies: @@ -13211,6 +13264,21 @@ snapshots: is-string: 1.0.7 is-symbol: 1.0.4 + which-builtin-type@1.1.4: + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + which-collection@1.0.2: dependencies: is-map: 2.0.3 @@ -13303,7 +13371,7 @@ snapshots: yallist@5.0.0: {} - yaml@2.6.0: {} + yaml@2.6.1: {} yargs-parser@18.1.3: dependencies: diff --git a/pyproject.toml b/pyproject.toml index 81a1dbeb22ab90..d73d6866ed7762 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] dependencies = [ - "mkdocs-material==9.5.44", + "mkdocs-material==9.5.46", "mkdocs-awesome-pages-plugin==2.9.3", ] requires-python = ">=3.11" diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile index 27ba35ff9560de..31edd552097973 100644 --- a/tools/docker/Dockerfile +++ b/tools/docker/Dockerfile @@ -1,23 +1,23 @@ -# syntax=docker/dockerfile:1.11.1@sha256:10c699f1b6c8bdc8f6b4ce8974855dd8542f1768c26eb240237b8f1c9c6c9976 +# syntax=docker/dockerfile:1.12.0@sha256:db1ff77fb637a5955317c7a3a62540196396d565f3dd5742e76dddbb6d75c4c5 ARG BASE_IMAGE_TYPE=slim # -------------------------------------- # slim image # -------------------------------------- -FROM ghcr.io/renovatebot/base-image:9.6.0@sha256:91999373868db04d7b6427f3c8992f68b4e470f64e25579800b35ea4bb26aebc AS slim-base +FROM ghcr.io/renovatebot/base-image:9.11.3@sha256:ab2d4b9fccf67319a396dc4de146d8bc2e57e5e152946663ab8160f83125b077 AS slim-base # -------------------------------------- # full image # -------------------------------------- -FROM ghcr.io/renovatebot/base-image:9.6.0-full@sha256:ee79a6113bbbe29bdb63c737fdb482d741c93292311db7286464233f17077caa AS full-base +FROM ghcr.io/renovatebot/base-image:9.11.3-full@sha256:2b2dff67edfded6909bcd201d3f561cdd9275c1fe50e844f14b34bc69cbc16af AS full-base ENV RENOVATE_BINARY_SOURCE=global # -------------------------------------- # build image # -------------------------------------- -FROM --platform=$BUILDPLATFORM ghcr.io/renovatebot/base-image:9.6.0@sha256:91999373868db04d7b6427f3c8992f68b4e470f64e25579800b35ea4bb26aebc AS build +FROM --platform=$BUILDPLATFORM ghcr.io/renovatebot/base-image:9.11.3@sha256:ab2d4b9fccf67319a396dc4de146d8bc2e57e5e152946663ab8160f83125b077 AS build # We want a specific node version here # renovate: datasource=node-version @@ -95,6 +95,10 @@ COPY --link --from=build --chown=root:root /usr/local/renovate/ /usr/local/renov # make our node binary available as last in path RUN ln -sf /usr/local/renovate/node /bin/node +# ensure default base and cache directories exist. +RUN mkdir -p /tmp/renovate/cache && \ + chmod -R 777 /tmp/renovate + # test RUN set -ex; \ renovate --version; \ diff --git a/tools/mkdocs/mkdocs.yml b/tools/mkdocs/mkdocs.yml index 5b8eef98dd2962..cf68267748d9c9 100644 --- a/tools/mkdocs/mkdocs.yml +++ b/tools/mkdocs/mkdocs.yml @@ -59,7 +59,7 @@ theme: # The custom_dir points to the overrides folder, this folder has the code for our announcement bar. # The easiest way to disable the announcement bar is to comment out the custom_dir: overrides entry in this mkdocs.yml file. # https://squidfunk.github.io/mkdocs-material/customization/#setup-and-theme-structure - # custom_dir: overrides + custom_dir: overrides logo: 'assets/images/logo.png' favicon: 'assets/images/logo.png' diff --git a/tools/mkdocs/overrides/main.html b/tools/mkdocs/overrides/main.html index 63eeff390ae725..7c2c95214149eb 100644 --- a/tools/mkdocs/overrides/main.html +++ b/tools/mkdocs/overrides/main.html @@ -6,6 +6,6 @@ {% block announce %}

- We released Renovate v38. Read the Release notes for major versions of Renovate to learn what's changed. + We released Renovate v39. Read the Release notes for major versions of Renovate to learn what's changed.

{% endblock %}