diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index a749f1d5c4dad9..ba27aa83671c37 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM containerbase/node:18.14.2@sha256:cb68fa4baae8632f43734cd9d98a80cf0a3c6a6f7898beb4173563a1ddd98a80 +FROM containerbase/node:18.15.0@sha256:3c89fc489f4d2c46d3f8e2da86421b87ad7d6b344e69465deb3d3a6a6f0fff9e USER root diff --git a/.github/DISCUSSION_TEMPLATE/mend-renovate-app-support.yml b/.github/DISCUSSION_TEMPLATE/mend-renovate-app-support.yml index 01ffd46594e03c..29d3acbfb85fb3 100644 --- a/.github/DISCUSSION_TEMPLATE/mend-renovate-app-support.yml +++ b/.github/DISCUSSION_TEMPLATE/mend-renovate-app-support.yml @@ -2,8 +2,8 @@ body: - type: checkboxes id: hosted-app-checkbox attributes: - label: I'm using the Mend Renovate hosted app. - description: Only use this discussion if you're using the Mend Renovate hosted app. + label: I'm using the Mend Renovate hosted app on github.com. + description: Only use this discussion if you're using the Mend Renovate hosted app and have a "it's not running" type of problem. options: - label: I'm using the Mend Renovate hosted app. required: true diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index d705ebf2d60aae..3b1d63988d8f22 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,21 +1,22 @@ name: Bug report -description: Confirmed bugs only. If in doubt, create a Discussion instead. +description: Bug reports require a minimal reproduction and should be preceded by a Discussion first. labels: ['type:bug', 'status:requirements', 'priority-5-triage'] body: - type: markdown attributes: value: | - Before you begin to fill out the form, make sure you have actually found a bug. - If you're not sure then create a [discussion](https://github.com/renovatebot/renovate/discussions) first. - If you have questions or want help with Renovate, then also create a [discussion](https://github.com/renovatebot/renovate/discussions). + Don't create a Bug Report like this without a GitHub Discussion and [minimal reproduction](https://github.com/renovatebot/renovate/blob/main/docs/development/minimal-reproductions.md) first. + Invalid bug reports waste the time of maintainers and can confuse other users so they will closed, locked and deleted. + You are always welcome to create Discussions and new users should always do that instead. - type: dropdown id: how-are-you-running-renovate attributes: label: How are you running Renovate? options: + - 'Placeholder value, please select the correct response from the dropdown' - 'Mend Renovate hosted app on github.com' - - 'Self-hosted' + - 'Self-hosted Renovate' validations: required: true @@ -44,30 +45,14 @@ body: validations: required: false - - type: input - id: platform-version-if-selfhosting - attributes: - label: If you're self-hosting Renovate, tell us what version of the platform you run. - description: | - This field is for the version number of your _platform_, so one of these: - - AWS CodeCommit - - Azure DevOps - - Bitbucket Cloud - - Bitbucket Server - - Azure DevOps - - Gitea or Forgejo - - GitHub (.com and Enterprise Server) - - GitLab (.com and CE/EE) - validations: - required: false - - type: dropdown id: regression-error attributes: label: Was this something which used to work for you, and then stopped? options: + - 'Placeholder value, please select the correct response from the dropdown' + - 'I am trying to get this working for the first time' - 'It used to work, and then stopped' - - 'I never saw this working' validations: required: true @@ -107,8 +92,8 @@ body: label: Have you created a minimal reproduction repository? description: Please read the [minimal reproductions documentation](https://github.com/renovatebot/renovate/blob/main/docs/development/minimal-reproductions.md) to learn how to make a good minimal reproduction repository. options: - - 'No reproduction repository' - - 'No reproduction, but I have linked to a public repo where it occurs' - - 'I have linked to a minimal reproduction repository in the bug description' + - 'Placeholder value, please select the correct response from the dropdown' + - 'I have linked to a minimal reproduction in the description above' + - 'I have explained in the description why a minimal reproduction is impossible' validations: required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index a12f338bb64b60..4fc4b36e860ad1 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ blank_issues_enabled: false contact_links: - - name: Start a discussion (config, doubts, docs) + - name: Start a discussion url: https://github.com/renovatebot/renovate/discussions/new - about: If you have any questions about bot configuration or doubts about whether you should create a feature request or bug report, or have problems with the documentation please select the button to create a Discussion instead of an Issue. + about: Our preferred starting point if you have any questions or suggestions about bot configuration, features or behavior. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index e902133f6b5d27..36a1c425aee1c0 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,5 +1,5 @@ name: Feature request -description: Suggest an idea for this project. +description: For maintainers only. For everyone else, please start an Ideas [discussion](https://github.com/renovatebot/renovate/discussions/new). labels: ['type:feature', 'status:requirements', 'priority-5-triage'] body: - type: textarea diff --git a/.github/label-actions.yml b/.github/label-actions.yml index f99c29d2fb9fb4..be2793bf00a3cc 100644 --- a/.github/label-actions.yml +++ b/.github/label-actions.yml @@ -165,3 +165,29 @@ The Renovate team + +'needs-discussion': + unlabel: + - 'type:bug' + - 'type:feature' + - 'priority-5-triage' + - 'status:requirements' + comment: > + **Please create a GitHub Discussion instead of this issue.** + + As this issue has been labeled as `needs-discussion` by a maintainer it is being automatically closed and locked. It will later be deleted to avoid polluting repository searches with duplicate or incorrect content. + + This doesn't necessarily mean that what you've reported isn't a problem or a reasonable idea, but it does mean that it should be raised as a Discussion first and not an Issue. Please create a Discussion now, assuming you still wish to discuss it. + + Thanks, The Renovate team + close: true + lock: true + lock-reason: 'resolved' + +'needs-code-formatting': + comment: > + Hi, you need to format code or logs here so that they're more readable for others. + + You can find a Markdown code formatting guide [here](https://www.markdownguide.org/basic-syntax/#code) as well as some GitHub-specific information formatting code blocks [here](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/creating-and-highlighting-code-blocks). + + Thanks, The Renovate team diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e946a1a7625cee..07f0000768d031 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,7 +39,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - node-version: [16, 18] + node-version: [18] # skip macOS and Windows test on pull requests without 'ci:fulltest' label include: >- ${{ fromJSON((github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'ci:fulltest')) && '[{ @@ -55,7 +55,7 @@ jobs: NODE_VERSION: ${{ matrix.node-version }} steps: - - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 with: fetch-depth: 2 @@ -77,14 +77,14 @@ jobs: echo "Yarn $(yarn --version)" - name: Installing dependencies - run: yarn install --frozen-lockfile --ignore-engines # semantic release will fail to install otherwise + run: yarn install --frozen-lockfile # build before tests to for static file check - name: Build run: yarn build - name: Cache jest cache - uses: actions/cache@69d9d449aced6a2ede0bc19182fadc3a0a42d2b0 # v3.2.6 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: .cache/jest key: ${{ runner.os }}-${{ matrix.node-version }}-jest-${{ hashFiles('yarn.lock') }} @@ -106,7 +106,7 @@ jobs: timeout-minutes: 15 steps: - - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 with: fetch-depth: 2 @@ -156,7 +156,7 @@ jobs: steps: # full checkout for semantic-release - - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 with: fetch-depth: 0 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 1ec9794ef098d1..ebd2e575f2b753 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -22,7 +22,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 - name: Delete fixtures to suppress false positives run: | @@ -30,7 +30,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@17573ee1cc1b9d061760f3a006fc4aac4f944fd5 # v2.2.4 + uses: github/codeql-action/init@168b99b3c22180941ae7dbdd5f5c9678ede476ba # v2.2.7 with: languages: javascript @@ -40,7 +40,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@17573ee1cc1b9d061760f3a006fc4aac4f944fd5 # v2.2.4 + uses: github/codeql-action/autobuild@168b99b3c22180941ae7dbdd5f5c9678ede476ba # v2.2.7 # ℹī¸ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -54,4 +54,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@17573ee1cc1b9d061760f3a006fc4aac4f944fd5 # v2.2.4 + uses: github/codeql-action/analyze@168b99b3c22180941ae7dbdd5f5c9678ede476ba # v2.2.7 diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index c63e08617ac558..3a9c04c81af0b1 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - name: 'Checkout Repository' - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 - name: 'Dependency Review' - uses: actions/dependency-review-action@c090f4e553673e6e505ea70d6a95362ee12adb94 # v3.0.3 + uses: actions/dependency-review-action@f46c48ed6d4f1227fb2d9ea62bf6bcbed315589e # v3.0.4 diff --git a/.github/workflows/release-npm.yml b/.github/workflows/release-npm.yml index c81c935698ce79..74e64ee622c6d5 100644 --- a/.github/workflows/release-npm.yml +++ b/.github/workflows/release-npm.yml @@ -38,7 +38,7 @@ jobs: echo "NPM_TAG=${{ github.event.inputs.tag }}" >> $GITHUB_ENV fi - - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 with: ref: ${{ env.GIT_SHA }} diff --git a/.github/workflows/update-data.yml b/.github/workflows/update-data.yml index 20f19ed2a4b808..42fe1f3cff7e51 100644 --- a/.github/workflows/update-data.yml +++ b/.github/workflows/update-data.yml @@ -5,7 +5,7 @@ on: workflow_dispatch: env: - NODE_VERSION: 16 + NODE_VERSION: 18 permissions: contents: write @@ -15,7 +15,7 @@ jobs: update-data: runs-on: ubuntu-latest steps: - - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 - name: Set up Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 @@ -33,7 +33,7 @@ jobs: run: yarn prettier-fix - name: Create pull request - uses: peter-evans/create-pull-request@2b011faafdcbc9ceb11414d64d0573f37c774b04 # v4.2.3 + uses: peter-evans/create-pull-request@38e0b6e68b4c852a5500a94740f0e535e0d7ba54 # v4.2.4 with: author: 'Renovate Bot ' branch: 'chore/update-static-data' diff --git a/.github/workflows/ws_scan.yaml b/.github/workflows/ws_scan.yaml index 59825cb6c417d2..0a2725369e8ca6 100644 --- a/.github/workflows/ws_scan.yaml +++ b/.github/workflows/ws_scan.yaml @@ -11,7 +11,7 @@ jobs: WS_SCAN: runs-on: ubuntu-latest steps: - - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 + - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 - name: Download UA run: curl -LJO https://github.com/whitesource/unified-agent-distribution/releases/latest/download/wss-unified-agent.jar diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000000000..55bffd620b9af5 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +18.15.0 diff --git a/data/azure-pipelines-marketplace-tasks.json b/data/azure-pipelines-marketplace-tasks.json index db8e9fc7a496fb..eb54eb4270e91d 100644 --- a/data/azure-pipelines-marketplace-tasks.json +++ b/data/azure-pipelines-marketplace-tasks.json @@ -294,6 +294,7 @@ "1.1.2" ], "011b3046-0816-45da-b3f3-473a0fcda720": ["1.188.0"], + "014c9bfe-c595-42b2-ba14-9f43c2a0e265": ["0.1.0", "0.2.0"], "014d1f42-f7ad-4418-b165-5bf03802417e": [ "1.0.0", "1.0.1", @@ -312,7 +313,8 @@ "3.3.0", "3.4.0", "4.4.0", - "4.5.0" + "4.5.0", + "5.0.0" ], "015e2e58-9c77-4cbc-a9c1-a28158165365": [ "8.0.0", @@ -412,7 +414,8 @@ "0.9.7", "0.9.8", "0.9.9", - "0.9.10" + "0.9.10", + "0.9.11" ], "01b77e94-869c-3336-43a9-48b71236f652": ["1.1.0", "1.1.1", "1.1.2"], "01b93764-d406-44e8-b3b1-23ed72e65608": [ @@ -492,7 +495,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "025bc3d2-c942-42d2-9b76-97db7e884483": [ "1.0.0", @@ -552,6 +557,23 @@ "4.1.0", "4.1.1" ], + "02dbaba0-04f3-4c6e-a780-d0c4d36a7f8c": [ + "0.0.1", + "0.0.2", + "0.1.0", + "0.1.1", + "0.1.4", + "0.1.5", + "0.1.6", + "0.2.1", + "0.2.2", + "0.2.3", + "0.2.4", + "0.3.0", + "1.0.0", + "1.0.1", + "1.0.2" + ], "036278fe-8a47-426b-b5b3-bef05334db00": [ "1.40.4", "1.41.6", @@ -601,7 +623,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "0366bd90-118b-11e6-b29f-8574dc09c50a": ["0.1.0"], "03928031-4eac-41a3-9fd1-86ebd2c2a46e": ["1.1.4"], @@ -838,7 +861,8 @@ "8.5.0", "8.6.0", "8.7.0", - "8.8.0" + "8.8.0", + "8.9.0" ], "0477968a-4686-4790-bb4a-e1213a2e58a9": [ "0.0.34", @@ -956,7 +980,13 @@ "0.1.3", "0.1.4", "0.1.6", - "0.1.7" + "0.1.7", + "0.1.8", + "0.1.9", + "0.1.10", + "0.1.11", + "0.1.12", + "0.1.13" ], "05271a89-7eaa-44b1-bd54-ef67b3fc2f5a": [ "2.0.5", @@ -1298,7 +1328,8 @@ "2.0.3", "2.0.4", "2.0.5", - "2.0.6" + "2.0.6", + "2.0.7" ], "06c78041-a284-4965-a58a-6bab5a4ed75b": ["1.0.7", "1.1.1", "1.1.2", "1.1.4"], "06c9c5a0-7351-11e5-9c5d-3590204d70da": [ @@ -1545,6 +1576,12 @@ "1.6.28", "1.6.29" ], + "07a04851-f6d3-473a-82e1-e9026d0b5528": [ + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" + ], "07a15c20-6352-1d11-abde-aa01c4d0331d": [ "1.3.1", "1.4.0", @@ -2848,6 +2885,15 @@ "2.1.1", "2.1.2" ], + "09d98ca8-a315-431a-bcb4-30c9c6d140ab": [ + "1.0.5", + "1.0.6", + "1.0.9", + "1.0.10", + "1.0.11", + "1.0.12", + "1.0.13" + ], "09ea8124-816f-4b89-8377-b45d2f6a54cb": ["0.1.0"], "09ecb8bf-a21a-47db-832f-8ec8a024a72c": ["0.4.1", "0.5.1", "0.7.1", "0.8.1"], "09ff8590-1518-11e9-a4df-5159632253af": [ @@ -2859,6 +2905,16 @@ "0.3.0", "0.3.1" ], + "0a1c7f0a-2381-4759-9308-d541a4c00377": [ + "1.1.1", + "1.1.2", + "1.1.3", + "1.1.4", + "1.1.5", + "1.1.6", + "1.1.7", + "1.1.11" + ], "0a2fa000-e13d-46a4-9bea-c26dedf08b73": ["21.4.1"], "0a3b12a2-9178-482b-9bf3-ff9af4ce9a3c": [ "0.0.1", @@ -2949,6 +3005,12 @@ "1.0.2", "1.0.3" ], + "0ae6f751-0884-4b80-8cb7-1686f59d4288": [ + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" + ], "0b095fdd-8cb5-49a3-8b0e-45de609c0468": [ "1.20200821.23844", "1.20200821.24037", @@ -2976,7 +3038,7 @@ "1.20210315.43772" ], "0b3bdfa0-e983-462c-b2be-0ce71b2bb474": ["0.1.0", "0.1.4"], - "0b477ee0-b50e-4eb1-84ba-de09326dce3d": ["22.6.0"], + "0b477ee0-b50e-4eb1-84ba-de09326dce3d": ["22.6.0", "23.2.0"], "0b592257-47c8-4b2d-b194-91c68ab53a36": ["0.1.0"], "0b6f0167-8389-4db8-89c6-4ae7688cd15a": [ "0.0.82", @@ -3099,6 +3161,7 @@ "1.1.82" ], "0c2e3a3c-ace4-4e32-ae7e-6aac67b6c0b1": ["0.1.0"], + "0c3b6fa3-7234-4332-b743-70a3e776ed04": ["23.1.0", "23.1.1", "23.1.2"], "0c3e661c-d316-443e-9a77-470989da8e29": [ "8.0.4", "8.0.10", @@ -3374,7 +3437,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "0ddc42e1-3229-42ff-a166-c4360bb16337": ["1.1.7", "2.0.8"], "0df6b5b0-b606-11e6-adea-c19266564b12": ["0.1.0"], @@ -3490,7 +3555,9 @@ "1.0.3094444", "1.0.3105315", "1.0.3206699", - "1.0.3214338" + "1.0.3214338", + "1.0.3445511", + "1.0.3517186" ], "0e2424a3-42b6-48f5-b3fa-ac6ed16d4c57": ["1.1.1", "1.2.0"], "0e248726-cf8b-5f52-a40a-6897276d1ea4": [ @@ -3541,6 +3608,7 @@ "0e707521-3c32-4eb6-a883-27ebb58c87ef": ["0.0.1", "0.0.2"], "0e89261f-39f4-4b26-90ca-bbdbb7bc34a0": ["1.1.4", "1.2.1"], "0e940403-af61-4ed1-a8fc-0f8c4d5fadad": ["0.1.0"], + "0e968cb0-6bce-11eb-8577-cd64038e734a": ["0.1.1"], "0efd1a58-b059-42a7-b3e9-cac0b996c975": ["0.3.20", "1.0.0", "1.0.10"], "0efd1a58-b059-42a7-b3e9-cac0b996c986": ["0.0.2", "1.0.12"], "0f091cb5-bc18-48f1-8e09-ac8b1639c139": [ @@ -3550,6 +3618,7 @@ "0.11.0", "0.12.0" ], + "0f0d0489-2b45-4a26-b65f-e6414f9965dd": ["23.1.0", "23.1.1", "23.1.2"], "0f10e9a0-9d2b-11e6-9324-2935380740c6": [ "0.1.1", "0.1.2", @@ -3652,7 +3721,13 @@ "2.1.3", "3.0.0" ], - "0f6b6d8f-3f24-4c46-b7c4-4ee4100074d8": ["1.0.7", "1.0.16", "2.0.2"], + "0f6b6d8f-3f24-4c46-b7c4-4ee4100074d8": [ + "1.0.7", + "1.0.16", + "2.0.2", + "2.0.3", + "2.0.4" + ], "0f73780c-5793-4c97-a2e6-6835cb554c42": [ "0.0.1", "0.0.2", @@ -4228,6 +4303,7 @@ "0.1.8" ], "122796cd-516d-1023-aff1-ca58da24e2b7": ["1.0.5", "1.0.14"], + "12291677-2485-4494-9ee6-8fc1f0b1c2f5": ["23.1.0", "23.1.1", "23.1.2"], "12345679-11d6-4897-ab4d-96330c48c610": [ "1.0.13", "1.0.14", @@ -4729,6 +4805,7 @@ "1.6.3", "1.6.4" ], + "12b85747-ff1c-62e7-9c4b-f49360eea7de": ["1.3.1", "1.3.2"], "12b98867-a15b-4056-aee5-cc40e3b1c4d1": [ "0.1.0", "0.2.0", @@ -5012,6 +5089,7 @@ "0.90.8", "0.90.9" ], + "1410d014-3cf1-4210-9f37-499c93af86cf": ["1.0.3", "1.0.4"], "1416022c-c995-4e2c-85ec-0cd88e54a2b0": [ "0.2.32", "0.2.33", @@ -5039,6 +5117,7 @@ "0.1.7" ], "14545bca-ae4b-48ba-89cc-72e86f8fa576": ["2.5.0", "2.6.0"], + "145d2283-1381-4ca9-b6a8-7c57d0b75d9d": ["23.1.0", "23.1.1", "23.1.2"], "14718d60-f310-42e6-b5f7-8cdfef232061": ["1.0.0", "1.1.0", "1.2.0"], "14880d61-32fc-47d4-afd4-ae27aaf12528": ["0.1.183", "0.1.184", "0.1.194"], "14b0d197-f815-4d5e-b695-262c7c76b3a7": ["1.0.0"], @@ -5090,7 +5169,10 @@ "1.29.0", "1.30.0", "1.30.1", - "1.31.0" + "1.31.0", + "1.32.0", + "1.33.0", + "1.34.0" ], "14e92359-f063-4955-b3c0-96a5523b71f4": [ "0.8.992", @@ -5553,6 +5635,9 @@ "4.30.0", "4.31.0", "4.32.0", + "4.33.0", + "4.34.0", + "4.35.0", "5.0.0", "5.1.0", "5.1.1", @@ -5565,7 +5650,11 @@ "5.6.1", "5.7.0", "5.8.0", - "5.9.0" + "5.9.0", + "5.10.0", + "5.11.0", + "5.11.1", + "5.12.0" ], "15d52d16-71e4-4d11-997f-9d51ed147255": [ "1.0.0", @@ -5597,6 +5686,7 @@ "1.0.9", "1.0.10" ], + "16102e67-5498-4da6-a74a-3f6edab58148": ["23.1.0", "23.1.1", "23.1.2"], "16223b9e-ae21-427d-8c0e-aaf1173b700c": ["1.0.3", "1.1.0"], "1627fcfe-f292-4904-adac-26cfb14bdb07": [ "1.1.20", @@ -5669,6 +5759,8 @@ "3.1.109", "3.1.131", "3.1.134", + "3.1.465", + "3.1.502", "4.0.371", "4.0.375", "4.0.376", @@ -5699,11 +5791,15 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502" ], "162d7b40-e488-4d66-a1f5-d04baa47b607": ["0.1.0", "0.1.1", "0.1.2", "0.1.3"], "16358c16-3185-4979-8375-845dedcb6b8d": [ @@ -5714,7 +5810,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "1644f10b-352c-43f3-9957-8c158759ba7c": [ "1.0.0", @@ -5786,7 +5884,8 @@ "3.1.0", "3.2.0", "3.3.0", - "3.3.1" + "3.3.1", + "3.4.0" ], "165eea4a-9ddf-420f-aeec-acc1c34f9ef0": [ "0.0.1", @@ -5917,7 +6016,14 @@ "0.3.4", "0.3.6", "0.3.7", - "0.3.8" + "0.3.8", + "0.3.9", + "0.4.0", + "0.4.1", + "0.4.2", + "0.4.3", + "0.4.4", + "0.4.5" ], "16f6dae7-e6ef-4629-ae75-7988463cb6a6": [ "0.0.1", @@ -5948,7 +6054,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "17068310-10c3-11e8-aa64-03200040d282": [ "0.1.0", @@ -6102,6 +6210,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -6112,7 +6223,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "176eb220-fd8f-11e6-a0f0-bbfbe2a1e49f": ["1.0.0"], "177d6c30-0b47-11e9-a403-978c0ed4b9ed": [ @@ -6228,7 +6342,9 @@ "4.3.66", "4.3.109", "4.3.131", - "4.3.134" + "4.3.134", + "4.3.465", + "4.3.502" ], "17a0f73c-f8e6-4fc5-a759-4d560031ef75": ["0.1.0"], "17b5420c-0773-453e-901a-a94bf52e37eb": ["1.3.0", "1.3.1", "1.3.2"], @@ -6283,6 +6399,7 @@ "1.41.63" ], "18266cf5-298a-4d59-9805-006a6b94bdc2": ["1.1.5", "2.1.5"], + "18370706-38f2-4477-a01b-7d42d6a73660": ["0.1.0", "0.2.0", "0.3.0"], "183c9b19-ac1d-56d8-b5a9-9ba71ef843af": [ "0.435.0", "0.437.0", @@ -6359,6 +6476,7 @@ ], "186585e2-87f4-43af-9224-6aa5298a1c5a": ["1.0.0"], "18868996-814b-48e1-9b9c-e631954a0f6c": ["0.5.1", "0.5.2", "0.5.5", "0.5.6"], + "18a39101-3589-4644-8f20-898cffeb61d0": ["23.1.0", "23.1.1", "23.1.2"], "18e7af2f-a100-4868-9c88-bb3a07b3b3be": [ "0.0.1", "0.0.2", @@ -6418,7 +6536,8 @@ "0.0.52", "0.0.53", "0.0.54", - "0.0.58" + "0.0.58", + "0.0.61" ], "191824ed-bcbb-499f-8752-a7d192fba217": [ "2.0.1", @@ -6658,7 +6777,7 @@ "1.0.11", "1.0.12" ], - "1a9ec20c-e108-11ec-9d64-0242ac120002": ["1.2.0", "1.3.0"], + "1a9ec20c-e108-11ec-9d64-0242ac120002": ["1.2.0", "1.3.0", "1.4.0", "1.4.1"], "1adb005a-c277-4f0f-9a72-19c807cac1fe": ["1.4.0", "1.6.0"], "1ae5638b-b276-4e0c-9b98-0732eb235935": ["0.1.0"], "1ae9cc7b-29a4-4614-82df-00dc3ea74cd0": [ @@ -6725,7 +6844,10 @@ "1.15.1239", "1.15.1261", "1.23.1279", - "1.24.1281" + "1.24.1281", + "1.25.1302", + "1.26.1308", + "1.27.1315" ], "1b03a764-f8b0-4eec-81bf-5abe1a15afff": [ "1.0.1", @@ -6735,7 +6857,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "1b1e3b29-38c5-4ee5-8ddf-da4cba27964b": [ "0.1.0", @@ -6831,6 +6955,7 @@ "2.0.1" ], "1c4d173c-798c-4636-a842-2da42eb2c20e": ["0.2.0", "0.2.5"], + "1c8b66db-ae40-43b9-9b9b-de7f46787790": ["0.1.0"], "1c99a02e-9cd4-48b7-acd9-589376cb874d": [ "1.0.1", "2.0.0", @@ -7500,6 +7625,7 @@ "2.5.2", "2.5.3" ], + "1e1d8658-3b8a-43ea-b99b-6aca23a44d00": ["1.0.0"], "1e654a42-4fcd-41f4-81cf-e31b5161190b": ["1.0.0", "1.0.8"], "1e654a42-4fcd-41f4-81cf-e31b5161191a": ["1.2.1", "1.2.2"], "1e7f110f-8b7c-45a0-83b1-432b184fba61": ["7.5.6"], @@ -7881,6 +8007,10 @@ "6.9.28", "6.9.29" ], + "20230124-29d3-482f-97d5-e3189a8347c2": ["3.211.1"], + "20230124-4193-44e5-9db7-58d7d253f4d8": ["2.211.0"], + "20230124-4e17-4244-b0fb-f540cea78153": ["2.211.0"], + "20230124-620b-11e5-b4cf-8565e60f4d27": ["4.217.0"], "2061c25a-2dbc-4c3a-870d-c480d9ce24f3": [ "0.1.13", "0.1.14", @@ -7913,7 +8043,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "20f4b3c9-8187-470f-91ea-96e5650fabc2": [ "0.3.1", @@ -7922,7 +8054,14 @@ "0.3.4", "0.3.6", "0.3.7", - "0.3.8" + "0.3.8", + "0.3.9", + "0.4.0", + "0.4.1", + "0.4.2", + "0.4.3", + "0.4.4", + "0.4.5" ], "20fb9b23-7ab8-4cd7-bc90-3dbb53928242": ["1.0.0", "1.0.1", "1.0.5", "1.0.6"], "210747bd-3cae-4a60-8194-3d34898a6490": ["0.2.0"], @@ -8185,6 +8324,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -8195,7 +8337,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "22805355-0fa1-421d-893a-f40ebc51a4de": ["2.0.2"], "22a3cc76-45e3-4ac1-92bb-cbe3f8201a4a": [ @@ -8338,7 +8483,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "232044c0-f2b9-4a68-895c-84c988472d6e": [ "0.0.2", @@ -8357,7 +8505,7 @@ "1.2.3", "1.3.2" ], - "2364f995-5ce9-4f83-87a7-c70166e271b9": ["22.6.0"], + "2364f995-5ce9-4f83-87a7-c70166e271b9": ["22.6.0", "23.2.0"], "2367bd9e-c6c2-40fe-9468-f1800d5dee8f": [ "1.19043.2", "1.19061.1", @@ -8633,7 +8781,7 @@ "2.9.0", "2.12.0" ], - "2559c3c1-9b1d-41b8-b77e-e729314a491f": ["0.0.1", "0.0.2", "0.0.3"], + "2559c3c1-9b1d-41b8-b77e-e729314a491f": ["0.0.1", "0.0.2", "0.0.3", "0.0.4"], "258a38e6-0183-45dc-83f9-335e6c8bcedf": [ "1.2.7", "1.2.9", @@ -8679,6 +8827,7 @@ "0.1.2" ], "25d52c82-c978-4743-be00-a5c13cb01d96": ["1.113.0"], + "25dea4be-9073-47c0-8d15-f6d8ac4d9399": ["23.1.0", "23.1.1", "23.1.2"], "25e3decd-0119-43cd-8819-85b4a5fdde84": [ "1.0.1", "1.0.13", @@ -8889,6 +9038,17 @@ "0.6.16" ], "27fff241-a77e-492a-ba5a-d2e5f7f1997f": ["0.1.0", "0.1.1", "0.1.2"], + "281f6ba9-3d8f-425d-b63b-86479427ab39": [ + "1.1.0", + "1.1.1", + "1.1.2", + "1.1.3", + "1.1.4", + "1.1.5", + "1.1.6", + "1.1.7", + "1.1.8" + ], "2850151b-ec95-4c1e-81a4-917de1f4c0ef": [ "0.0.5", "0.0.7", @@ -8969,6 +9129,7 @@ "1.0.11", "1.0.12" ], + "285b0614-b6ed-4351-a939-3497730e3814": ["23.1.0", "23.1.1", "23.1.2"], "2877ea0e-d12a-4afc-afa6-213ef3bac5a9": [ "1.0.3", "1.0.6", @@ -9036,7 +9197,8 @@ "0.6.32", "0.7.5", "0.8.10", - "0.8.34" + "0.8.34", + "0.9.19" ], "291ed61f-1ee4-45d3-b1b0-bf822d000000": ["4.8.1", "4.9.3", "5.0.1"], "291ed61f-1ee4-45d3-b1b0-bf822d900000": ["4.8.1"], @@ -9116,6 +9278,7 @@ "1.2.3", "1.3.0" ], + "29dfa0b0-3e4d-408b-9786-859ef8516c28": ["23.1.0", "23.1.1", "23.1.2"], "29fa9060-e5a6-40bd-9b84-956efc2febd8": ["21.4.1"], "2a12d98c-8838-40ba-be69-c0b5d88743f5": [ "1.0.4", @@ -9191,10 +9354,11 @@ "3.2.1", "3.2.2" ], - "2adf5d8e-029c-4ee6-8dbc-0a895ec2ce05": ["1.0.0", "1.1.0"], + "2adf5d8e-029c-4ee6-8dbc-0a895ec2ce05": ["1.0.0", "1.1.0", "2.0.0", "2.0.1"], "2aec407f-7763-43a5-a27f-bf45a58e4f1d": ["1.6.0"], "2b3158b5-c06a-4648-a3d5-ff39701cc436": ["1.0.0"], "2b367b90-3297-4ee0-ad14-626f5eb71afb": ["1.0.0"], + "2b4600b9-5cd9-4e3b-9c8b-553c8e58383a": ["0.7.11", "0.7.12"], "2b622fc5-7481-4765-9724-0ef4575d7e3b": [ "1.1.6", "1.2.1", @@ -9489,7 +9653,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "2c7fd6a2-7276-43ca-bb16-3caae1dd4698": ["0.1.1", "0.2.1", "0.3.1"], "2c912ca7-b6b3-47d8-8c99-0a91e7b059a2": [ @@ -9580,7 +9746,10 @@ "1.0.2", "1.0.3", "1.0.4", - "1.0.5" + "1.0.5", + "1.1.0", + "1.2.0", + "1.2.1" ], "2d15b88e-f58b-48dd-8b17-e8f35594e4ab": [ "0.1.0", @@ -9694,7 +9863,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "2d96d34f-155b-406c-9af2-fb5bdb01408a": ["1.0.6"], "2d984e26-2173-493f-b55d-57858ef496fc": [ @@ -9757,8 +9927,10 @@ "1.186.0", "1.188.0", "1.189.0", - "1.207.0" + "1.207.0", + "1.218.0" ], + "2e75c308-cbbc-4e68-b11f-6c985e6a4376": ["23.1.0", "23.1.1", "23.1.2"], "2e896ff0-f4c0-45af-b63c-81a1da1d9105": [ "1.2.18", "1.2.19", @@ -9832,7 +10004,7 @@ "3.0.1999", "3.0.2003" ], - "2ed34943-e39d-4289-bd57-686fae0f69d7": ["1.0.0", "1.0.1", "2.0.1"], + "2ed34943-e39d-4289-bd57-686fae0f69d7": ["1.0.0", "1.0.1", "2.0.1", "2.1.0"], "2edc5463-c7ef-4a6d-952b-ffd367574311": ["1.0.0", "1.1.0"], "2eed6fe6-d190-4086-ba5b-f3d59b274881": [ "0.0.1", @@ -10115,7 +10287,9 @@ "1.2.330", "1.2.331", "1.2.334", - "1.2.335" + "1.2.335", + "1.2.344", + "1.2.347" ], "2f22eed4-2ef7-407e-98d8-3b20ca0a5352": [ "1.10.21", @@ -10157,7 +10331,10 @@ "1.46.7", "2.0.3", "2.0.5", - "2.2.2" + "2.2.2", + "2.3.5", + "2.4.2", + "2.5.2" ], "2f54d623-fa68-4229-a80e-0340ea70f4fd": [ "0.1.0", @@ -10486,6 +10663,7 @@ "1.2.4", "1.3.0" ], + "3123867b-41b3-46b8-b5bb-8af6d48224da": ["23.1.0", "23.1.1", "23.1.2"], "312eb806-f643-41d7-bbe0-5e61c37aba91": [ "0.0.3", "0.0.6", @@ -10578,7 +10756,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "31cd0453-55d2-4547-b0a3-c882cc6b6c4d": ["0.1.0", "0.1.1"], "31e75ea0-9d2b-11e6-acba-7dd161269b2e": [ @@ -10762,6 +10941,36 @@ "1.1.6", "1.1.7" ], + "31f040e5-e040-4336-878a-59a493355535": [ + "0.0.3", + "0.0.4", + "0.0.20", + "0.0.21", + "0.0.22", + "0.0.23", + "0.0.24", + "0.0.25", + "0.0.26", + "0.0.27", + "0.0.28", + "0.0.29", + "1.1.8" + ], + "31f040e5-e040-4336-878a-59a493355536": [ + "0.0.3", + "0.0.4", + "0.0.20", + "0.0.21", + "0.0.22", + "0.0.23", + "0.0.24", + "0.0.25", + "0.0.26", + "0.0.27", + "0.0.28", + "0.0.29", + "1.1.8" + ], "31f040e5-e040-4336-878a-59a493389784": [ "1.0.1", "1.0.4", @@ -11196,7 +11405,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "33191b0c-3c57-4532-a11a-dcc5ab7fb467": ["0.1.1"], "33237a0e-6292-431a-9912-276136844a87": [ @@ -11278,7 +11489,9 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "2.11.3445511", + "3.0.3517186" ], "332865cc-aa31-450c-9888-2b2a51e1c5ac": [ "0.0.1", @@ -11411,16 +11624,6 @@ "7.0.0", "7.0.1" ], - "346e3d65-2f3f-4bba-9e59-4137b41fd79e": [ - "1.0.0", - "1.0.1", - "1.0.2", - "1.0.3", - "1.1.0", - "1.2.0", - "1.3.0", - "1.4.0" - ], "34761037-6539-683a-bfa1-a310d82016b8": [ "1.0.0", "1.0.1", @@ -11510,7 +11713,8 @@ "1.4.0", "1.5.0", "1.5.1", - "1.7.0" + "1.7.0", + "1.8.0" ], "34b3194a-2f58-4844-a8c3-655cc2802e84": [ "0.5.11", @@ -11863,6 +12067,7 @@ "2.0.0", "2.0.3" ], + "36fd41b1-8024-4ce9-a5a0-53c3e54ed106": ["1.0.0"], "36fd41b1-8024-4ce9-a5a0-53c3e54ed666": [ "1.0.2", "1.0.4", @@ -11872,6 +12077,7 @@ "1.1.8" ], "36fd41b1-8024-4ce9-a5a0-53c3e54ed667": ["1.0.8"], + "371728ed-32fa-44a1-916c-6032a2a43452": ["1.1.1", "1.1.2"], "37188edc-3c57-443e-aad4-4bdedc8863ee": [ "1.0.5", "1.0.274", @@ -11928,12 +12134,15 @@ "0.29.0" ], "3732d4b0-030f-4a01-9533-c5c39034359a": ["1.0.18", "1.1.2", "1.1.9"], + "37506ba2-fb91-4417-9e9b-44c355c60135": ["1.3.6", "2.1.3", "3.0.0"], "378ce4ea-1265-49fd-a64d-f36da5b2fb31": [ "2.0.7", "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "379b4b77-75d2-4fb8-84a3-05b51d97154c": [ "2.2.2", @@ -12043,6 +12252,7 @@ "1.13.0" ], "37dda93c-8427-4372-9b7b-9b6e10f3f745": ["0.0.0"], + "3802fecc-9613-4136-9c84-216279e34cb4": ["1.0.2", "1.0.3"], "3809c250-e06b-4afe-b9d0-334ad742a7d4": [ "1.0.1", "1.0.2", @@ -12051,7 +12261,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "381038ea-382c-4f45-b706-e40232fc9671": [ "1.3.9", @@ -12145,6 +12357,7 @@ "3.0.17" ], "38d9696d-62b8-4035-879d-964e88d87eb4": ["0.2.2", "0.3.3", "1.1.0"], + "38df691d-23eb-48d4-8638-61764f48bacb": ["6.0.465", "6.0.502"], "38e8063b-f535-4063-b9f4-9e5d065205db": [ "1.0.1", "1.0.2", @@ -12418,7 +12631,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "3a69dae9-2eb1-4070-87c6-7eba8cf00207": [ "2.20236.2", @@ -12560,7 +12775,9 @@ "2.0.17", "2.0.18", "2.0.19", - "2.0.20" + "2.0.20", + "2.0.24", + "2.0.25" ], "3b2d7e1e-bfb3-4c31-9dd7-7a8bdd5c7d40": [ "1.29.0", @@ -12568,7 +12785,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "3b301aa5-14f2-4883-85d3-de9e613e8bbc": [ "2.20236.2", @@ -12612,6 +12830,7 @@ "2.0.61" ], "3bb3e250-f533-11e5-930d-c5573c0da11e": ["0.1.4"], + "3c1dd330-7675-4b14-b528-f982232e4727": ["23.1.0", "23.1.1", "23.1.2"], "3c20c00c-6ba0-4d09-af89-89fbda2934be": [ "1.0.0", "4.0.3", @@ -12754,7 +12973,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "3d116dd1-d4bd-53f0-b6f3-cb9a511d911f": [ "1.0.1", @@ -13181,11 +13402,13 @@ "3.1.6", "3.2.0", "3.2.1", - "3.2.2" + "3.2.2", + "3.2.3" ], "3ee2ae20-3a18-11e9-b1ef-03cbb694ee92": ["1.0.0", "1.0.1"], "3efc5a90-d2d9-11e5-870b-fddad3389520": ["0.2.0", "0.2.1"], "3efd1a58-b059-42a7-b3e9-cac0b996c977": ["3.0.0"], + "3f248d80-a755-498d-863c-f936c5821318": ["6.0.465", "6.0.502"], "3f4a3578-25c3-56ae-9ef7-e4450d5eb3c2": [ "1.2.0", "1.3.0", @@ -13336,8 +13559,10 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], + "3ff9107a-251e-4828-af68-fcb7090cb3d6": ["0.0.5", "0.0.6"], "400ea42f-b258-4da4-9a55-68b174cae84c": [ "0.1.0", "0.3.0", @@ -13385,7 +13610,8 @@ "1.0.1", "1.0.2", "1.0.3", - "1.1.0" + "1.1.0", + "1.2.0" ], "4061e3c9-d695-46c1-b903-a567634dca14": [ "1.2.1", @@ -13733,7 +13959,8 @@ "3.1.0", "3.2.0", "3.3.0", - "3.3.1" + "3.3.1", + "3.4.0" ], "42crunch.cicd.audit.5a144934-d2e8-4e39-b38f-307eacf66fe8": ["1.0.1"], "42crunch.cicd.audit.apicontractsecurityaudit": [ @@ -13769,7 +13996,8 @@ "3.1.0", "3.2.0", "3.3.0", - "3.3.1" + "3.3.1", + "3.4.0" ], "42crunch.cicd.audit.audit": ["1.0.1"], "42crunch.cicd.audit.openapisecurityaudit": [ @@ -13875,7 +14103,13 @@ "1.9.0", "1.10.0" ], - "4395c90d-df12-4914-a900-98165bddb8cf": ["2.0.10", "2.0.13", "2.0.15"], + "4395c90d-df12-4914-a900-98165bddb8cf": [ + "2.0.10", + "2.0.13", + "2.0.15", + "2.0.16", + "2.0.17" + ], "43c8e3f9-f0a7-5689-905b-f4d9f452a1dc": [ "1.0.95", "1.0.1125433", @@ -13942,7 +14176,8 @@ "1.0.1", "2.0.12", "2.0.13", - "3.0.1" + "3.0.1", + "3.0.2" ], "44baeac4-f767-4cb9-83e8-d210ce763397": [ "0.0.23", @@ -13964,7 +14199,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "44d7756a-165c-4b11-bced-37a905a31c9a": ["0.2.35", "0.2.36"], "44d9cfb7-7efd-48e2-b2ae-4750950271be": [ @@ -14083,7 +14320,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "45cd7182-50f4-11eb-998f-02004c4f4f50": [ "0.1.28", @@ -14167,7 +14405,8 @@ "2.0.3", "2.0.4", "2.0.5", - "2.0.6" + "2.0.6", + "2.0.7" ], "46dcb5e9-914b-4b19-b653-22b0a65fe235": ["21.4.1"], "46f0ed50-30cc-45e7-9826-b5d57a385c8e": [ @@ -14179,7 +14418,12 @@ "1.11.3", "2.13.4" ], - "47203ae0-e66b-4cc7-bdbd-77ea87aaf473": ["2.0.13", "2.0.15"], + "47203ae0-e66b-4cc7-bdbd-77ea87aaf473": [ + "2.0.13", + "2.0.15", + "2.0.16", + "2.0.17" + ], "472a20e1-558b-46c7-bbb4-def75b0752e7": [ "1.0.0", "1.0.1", @@ -14220,7 +14464,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "475ad458-6778-4e40-a8b5-5f983bea595d": [ "0.2.0", @@ -14396,6 +14642,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -14406,7 +14655,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "47ba6c2e-d5c2-44e7-bd91-5792159eb4eb": [ "1.0.0", @@ -14469,7 +14721,8 @@ "1.199.0", "1.208.0", "1.212.0", - "1.214.0" + "1.214.0", + "1.217.0" ], "48291cae-14a6-44c8-8440-74c97b1d90c9": ["1.0.0", "1.0.1", "1.0.2"], "486deda6-0cae-4d20-918b-94d6cdfab789": [ @@ -14498,7 +14751,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "48a1da17-6a15-43fa-b9a9-a68536dec84a": [ "1.0.0", @@ -14574,7 +14829,9 @@ "2.5.4", "2.6.2", "2.7.4", - "3.0.10" + "3.0.10", + "3.1.2", + "3.2.2" ], "493a03d9-7e56-4db8-87f3-68c94c075077": ["0.158.0"], "4966499d-2d02-4c79-93e2-8ecded797f6f": ["1.1.1", "1.1.2", "1.1.3", "1.1.4"], @@ -14590,6 +14847,7 @@ "4.4.1" ], "49b73561-bc73-43a5-862f-95247574d899": ["1.3.0", "1.4.0", "1.5.0"], + "49da0505-a53f-46a8-9c14-36ef53457a32": ["23.1.0", "23.1.1", "23.1.2"], "49e32553-9a91-4694-a513-72e52933a681": [ "0.0.1", "0.0.2", @@ -14936,7 +15194,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "4bc7e8e0-97c4-4ba2-af7e-ea12b1b06c5f": ["15.188.1", "15.188.2"], "4bit-dev.semantic-versioning.00d41d52-30eb-42cc-9718-b52753e27da2.f46f9e97-9751-4554-980e-be15b3945e37": [ @@ -15320,6 +15580,8 @@ "3.1.109", "3.1.131", "3.1.134", + "3.1.465", + "3.1.502", "4.0.371", "4.0.375", "4.0.376", @@ -15350,14 +15612,20 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502", + "6.0.465", + "6.0.502" ], "4e476451-a01b-4b86-ab9e-658d496f9b17": ["9.0.5", "9.0.6", "12.0.7"], - "4e6d2469-e404-4080-9719-ac8dc9b7b3ee": ["22.6.0"], + "4e6d2469-e404-4080-9719-ac8dc9b7b3ee": ["22.6.0", "23.2.0"], "4e6e25e3-c0b5-4986-8714-5c751945c15f": [ "1.0.0", "1.0.1", @@ -15440,6 +15708,7 @@ "4.2.0" ], "4e779492-fcca-40f0-bf69-2b3a577b3ba5": [ + "1.0.3", "1.107.1", "1.109.1", "1.111.1", @@ -15509,6 +15778,7 @@ "2.0.5", "2.0.6" ], + "4eb92e59-8cf6-4b5a-b679-0484a99549ee": ["23.1.0", "23.1.1", "23.1.2"], "4eb9bad0-fd4b-465b-94cd-94bd4e8543b5": ["1.0.1"], "4ed0db5c-8f98-4a6f-98c2-bde0a80a540b": [ "0.3.0", @@ -15666,7 +15936,10 @@ "1.6.0", "1.6.1", "1.6.2", - "1.6.3" + "1.6.3", + "1.6.4", + "1.6.5", + "1.6.6" ], "4f5855b9-bdfe-4816-a6b9-f3601fd353a9": ["1.0.0", "1.0.10", "1.0.11"], "4f9cea8e-3e1f-43ef-82e9-2ae6fbb70f2f": ["1.0.1", "2.0.3"], @@ -15691,13 +15964,6 @@ "1.2.1", "1.2.2" ], - "4fe0dbab-291a-4006-ac04-ca63b9550410": [ - "1.0.0", - "1.1.0", - "2.2.0", - "3.1.0", - "4.1.0" - ], "4fe20549-3f80-44fd-91b4-fdbc0660e942": [ "0.1.0", "0.2.0", @@ -15734,7 +16000,8 @@ "1.2.12", "1.2.13", "1.2.14", - "1.2.15" + "1.2.15", + "1.2.16" ], "4fe54fab-ecf8-441e-989e-5d9cbd861743": [ "1.9.0", @@ -16199,6 +16466,7 @@ "3.0.0", "3.1.0" ], + "51355d76-dd54-4754-919d-bba27fdf59e4": ["0.7.11", "0.7.12"], "5164728d-cfca-4576-a066-bde89930bf2b": [ "0.0.16", "1.0.2", @@ -16277,6 +16545,13 @@ "1.0.37" ], "51b04616-3037-4a04-b6a4-2134fb232ad0": ["0.1.0", "1.0.0", "1.0.1", "1.1.0"], + "51c7cdd8-1e0b-4db3-8513-ffcdbe1959f3": ["0.0.0", "0.0.1", "0.0.2"], + "51d18b73-ba80-440e-95c2-59620cb4be1c": [ + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" + ], "51fa7ac6-d9cc-41c0-b7f3-2c7f4a31d153": ["0.0.1", "0.0.2", "0.0.3"], "520de8ba-2076-4eb4-8914-6c193e779161": ["1.0.4"], "521d1d15-f5fb-4b83-a93b-b2fe44a9a286": [ @@ -16862,7 +17137,9 @@ "4.1.16", "4.1.17", "4.1.18", - "4.1.19" + "4.1.19", + "4.1.20", + "4.1.21" ], "53872c9a-a53f-4fcf-973d-8ded3d75432d": [ "1.0.19", @@ -17046,7 +17323,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "54b62d89-ac91-4bc3-9495-bbcd521dc2fa": [ "0.1.0", @@ -17088,9 +17367,12 @@ "0.6.32", "0.7.5", "0.8.10", - "0.8.34" + "0.8.34", + "0.9.19", + "1.9.19" ], "554a5c88-c4a9-4892-9c01-26887b72108a": ["1.1.1", "1.1.2", "1.1.3"], + "559b81c9-efc1-40f3-9058-71ab1810d837": ["6.0.465", "6.0.502"], "559f0925-9091-4053-9aac-c19ecfc5028c": ["0.1.0"], "55a97a52-a238-46af-9de9-e4245ab45e72": [ "1.0.0", @@ -17570,7 +17852,13 @@ "1.1.0", "1.1.1" ], - "58a36166-34e3-4e41-ab7b-967dccc53690": ["1.0.0", "1.0.5", "1.1.0"], + "58a36166-34e3-4e41-ab7b-967dccc53690": [ + "1.0.0", + "1.0.5", + "1.1.0", + "2.0.0", + "2.0.1" + ], "58dccf9e-3eaf-4533-a9b6-1e5a1845d036": [ "20.12.3", "21.1.1", @@ -17606,7 +17894,8 @@ "0.0.5", "0.0.6", "0.0.7", - "0.1.2" + "0.1.2", + "0.1.3" ], "590a09aa-6954-46b6-9eb3-d4985aa7d80b": ["0.1.3", "0.2.8"], "5916aacf-ed6c-4580-bf28-cf4b21c2b521": [ @@ -17736,6 +18025,7 @@ "1.1.1" ], "5a144934-d2e8-4e39-b38f-307eacf66fe8": ["1.0.1"], + "5a2273e0-aa4f-4502-bcba-6817835e2bbd": ["6.0.465", "6.0.502"], "5a22c382-dfab-45dc-81a9-119b60bf149e": ["1.2.0"], "5a7067c0-afc3-474f-8c55-3769fa0f3c9e": ["0.3.0", "0.4.1"], "5a775a50-3372-1290-9ce0-1579c1e597fb": [ @@ -18019,7 +18309,12 @@ "7.1.0", "7.2.0" ], - "5bb56a8d-9525-4af3-a64d-dae0677dd692": ["0.1.0", "0.1.1", "0.1.2"], + "5ba96c72-cff1-411e-a333-ea2bbf4f2f78": [ + "1.0.3447906", + "1.0.3513646", + "1.0.3517186", + "1.0.3642585" + ], "5bc8d075-b550-4236-a3c6-1cd3f52d90ee": ["1.0.0", "1.0.1"], "5bf98930-3058-4afe-b031-48d312459df4": [ "1.4.798", @@ -18037,7 +18332,10 @@ "1.15.1239", "1.15.1261", "1.23.1279", - "1.24.1281" + "1.24.1281", + "1.25.1302", + "1.26.1308", + "1.27.1315" ], "5bfdd7ca-9bf4-40f7-b753-fd674e7ff85c": ["0.1.1", "0.2.0", "0.2.5"], "5c1058b2-bc81-4fcb-afed-868d7ffde4a5": [ @@ -18174,6 +18472,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.124", "4.1.8", "4.1.50", @@ -18185,7 +18486,10 @@ "4.1.142", "4.1.149", "4.1.161", - "4.1.178" + "4.1.178", + "4.1.220", + "4.1.260", + "4.1.268" ], "5c826f20-4d2b-4ab6-a3f5-54956a2f65fe": ["1.0.20", "1.1.15"], "5c975f9d-1c3a-469f-b7c2-8907bf3eacf1": ["1.0.0", "1.3.0"], @@ -18257,7 +18561,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "5d203600-ac29-495a-931f-04b26bb91a4f": [ "0.1.0", @@ -18358,7 +18664,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "5d57f4e0-6fcd-4a6e-9d29-28e60297b850": ["0.1.0"], "5d741236-331c-4461-82a2-9d55eb91bb91": [ @@ -18647,7 +18956,12 @@ "9.1.11638", "9.1.11639", "9.1.11643", - "9.1.11647" + "9.1.11647", + "9.1.61695", + "9.1.91713", + "9.1.91714", + "9.1.91716", + "9.1.91717" ], "5e683ca0-59bf-4a1e-ac5c-f4885372271c": [ "1.0.0", @@ -18702,7 +19016,9 @@ "1.1.4", "1.1.5", "1.1.6", - "1.1.7" + "1.1.7", + "1.2.1", + "1.2.3" ], "5e9b6b5e-3130-47dc-89c5-77a58949f2cf": [ "2.0.15", @@ -18722,6 +19038,70 @@ "1.7.2", "2.8.2" ], + "5ef76ecd-41c5-42a4-9d94-d44314efc517": ["23.1.0", "23.1.1", "23.1.2"], + "5f0427b3-e660-4f4d-9a93-60dd13f40028": [ + "0.0.7", + "0.0.8", + "0.0.9", + "0.0.10", + "0.0.11", + "0.0.12", + "0.0.14", + "0.0.15", + "0.0.16", + "0.0.17", + "0.0.18", + "0.0.19", + "0.0.20", + "0.0.21", + "0.0.22", + "0.0.23", + "0.0.24", + "0.0.25", + "0.0.26", + "0.0.27", + "0.0.28", + "0.0.29", + "0.0.30", + "0.0.31", + "0.0.32", + "0.0.33", + "0.0.34", + "0.0.35", + "0.0.36", + "0.0.37", + "0.0.38", + "0.0.39", + "0.0.40", + "0.0.41", + "0.0.42", + "0.0.43", + "0.0.44", + "0.0.45", + "0.0.46", + "0.0.47", + "0.0.48", + "0.0.49", + "0.0.50", + "0.0.51", + "0.0.52", + "0.0.53", + "0.1.54" + ], + "5f0427b3-e660-4f4d-9a93-60dd13f40029": ["0.0.1", "0.0.2"], + "5f0427b3-e660-4f4d-9a93-60dd13f40030": ["0.0.1"], + "5f0427b3-e660-4f4d-9a93-60dd13f40031": ["0.0.1", "0.0.11"], + "5f0427b3-e660-4f4d-9a93-60dd13f40032": [ + "0.0.1", + "0.0.2", + "0.0.3", + "0.0.4", + "0.0.5", + "0.0.6", + "0.0.7", + "0.0.8", + "0.0.9" + ], "5f085399-5bf7-44e2-9539-6b1125e4aa2f": [ "0.0.1", "0.0.3", @@ -18970,8 +19350,15 @@ "1.0.13" ], "609d0927-6e92-46ec-a9a2-bba80f025eda": ["1.3.0"], - "60b0c2bb-66cb-4284-9482-543cef6da436": ["1.0.4", "1.0.5"], - "60b18503-c6d6-4e4b-a6b2-52fc6fb3d525": ["0.0.1", "0.1.0", "0.1.1"], + "60b0c2bb-66cb-4284-9482-543cef6da436": [ + "1.0.4", + "1.0.5", + "1.0.6", + "1.0.7", + "1.0.8", + "1.0.9" + ], + "60b18503-c6d6-4e4b-a6b2-52fc6fb3d525": ["0.0.1", "0.1.0", "0.1.1", "0.1.2"], "60d38d27-fa0f-4b64-8838-9cd69f09de58": ["7.5.0"], "60d7c5c0-7819-49d9-be44-696e8f27c63c": [ "0.0.1", @@ -19058,7 +19445,8 @@ "2.202.0", "2.208.0", "2.208.1", - "2.210.0" + "2.210.0", + "2.217.0" ], "61742d69-accf-48d8-b263-95f1e60beee1": [ "0.1.20", @@ -19176,7 +19564,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "62645f53-3f11-41b1-b439-b7197034d52c": [ "1.0.42", @@ -19231,7 +19621,9 @@ "3.14.0", "3.15.0", "3.16.0", - "3.17.0" + "3.17.0", + "3.18.0", + "3.19.0" ], "62a7982c-0bad-41a5-a801-4212159e2422": [ "0.1.0", @@ -19353,6 +19745,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -19363,7 +19758,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "63388616-cec1-4f0c-92e6-78e7cde08ef5": ["0.1.2", "0.1.3", "0.1.4", "0.1.5"], "633def46-148b-4100-9d5f-bc74881de42f": ["0.1.2", "0.1.6"], @@ -19375,7 +19773,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "6350bfb8-c310-4cdd-af68-722f33cf440a": ["1.0.0"], "63823d31-810c-4957-9bc1-859757ace94d": [ @@ -19402,6 +19802,8 @@ "1.11.13", "1.11.14", "1.11.15", + "1.12.4", + "2.0.0", "2.1.4", "2.1.61", "2.1.78", @@ -19430,6 +19832,7 @@ "2.11.13", "2.11.14", "2.11.15", + "2.12.4", "3.0.0", "3.0.1", "3.11.0", @@ -19448,6 +19851,7 @@ "3.11.13", "3.11.14", "3.11.15", + "3.12.4", "4.0.0", "4.0.2", "4.0.3", @@ -19467,7 +19871,8 @@ "4.11.12", "4.11.13", "4.11.14", - "4.11.15" + "4.11.15", + "4.12.4" ], "639b8e0c-2c2c-41e7-b822-4d03aefcb92b": [ "0.1.12", @@ -19639,7 +20044,8 @@ "1.2.0", "1.3.0", "1.4.0", - "1.5.0" + "1.5.0", + "1.6.0" ], "63dc66e6-daa5-4c1c-97f2-4312143a6d6d": [ "0.54.0", @@ -19688,7 +20094,8 @@ "1.2.0", "1.3.0", "1.4.0", - "1.5.0" + "1.5.0", + "1.6.0" ], "63dc72cc-b966-4c13-8db2-d43f0d923eff": [ "0.1.0", @@ -19735,7 +20142,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "64750ad2-e84b-437a-9e27-ce0e506aff77": ["0.2.34"], "647f6885-bbf7-4fc9-9938-c5124de4965c": ["10.0.2", "10.0.3", "12.0.5"], @@ -19845,6 +20253,7 @@ "0.1.4", "0.2.1" ], + "656977f5-2a08-4e85-b67b-eaea60b44c76": ["23.1.0", "23.1.1", "23.1.2"], "65751afb-5038-48f6-ae57-342a3a210165": ["1.1.0", "1.2.0", "1.6.3", "1.6.9"], "658b2abe-dcdc-45d9-b4ed-4fbc8a863d6b": [ "0.1.0", @@ -19901,6 +20310,7 @@ "3.0.16", "3.0.17" ], + "65c38e37-4bbd-4b44-acfd-72adf9dd7579": ["1.3.12", "2.0.0"], "660c8445-8671-4fb0-9c77-2ea7d3a3072f": ["1.0.0"], "661079d6-c3e5-4486-85a9-b538ed44087d": [ "1.0.0", @@ -20286,7 +20696,14 @@ "2.425.0", "2.426.0", "2.427.0", - "2.430.0" + "2.430.0", + "2.431.0" + ], + "666f48a9-3550-4db6-b74b-2f8aa4b99444": [ + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" ], "66c0f6d3-431f-4e66-8e8b-bc4a3ed2eb90": [ "0.1.0", @@ -20332,7 +20749,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "66fee64a-1e90-4952-960a-b1e09305f5cc": ["1.0.1"], "670be730-f416-11e6-be17-19bd09ccd9ea": ["0.1.5", "0.1.6", "0.2.0"], @@ -20403,6 +20822,7 @@ "4.1.6", "4.2.0" ], + "67795a29-e3af-4b09-b08b-67f48a1593d7": ["1.0.5"], "6785970c-2d58-4260-b047-0a54028ee9c1": [ "0.1.18", "0.2.4", @@ -20618,7 +21038,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "697fc604-a995-454d-9bca-61f3fef4888f": ["7.5.6"], "698a2131-5476-4705-ac09-0975b9d3f638": ["1.0.1", "1.0.4"], @@ -20630,7 +21051,8 @@ "1.0.1", "2.0.12", "2.0.13", - "3.0.1" + "3.0.1", + "3.0.2" ], "69e2be49-2b8c-4f88-9ad8-c2221376e6ed": ["1.2.1"], "69f0728c-1c79-4e8d-85ae-21960a56101b": [ @@ -20781,7 +21203,6 @@ ], "6a64a121-4682-4b2d-950a-7a675ab636cc": ["7.5.0"], "6aaacd39-5014-4271-b466-45267f1f74a9": ["1.0.9"], - "6af551d1-13c6-44ce-bb8c-1a4a9c0af93b": ["22.6.0"], "6b04316e-495f-4243-86c6-6427a6c5b4d4": ["1.1.2", "1.1.3", "1.1.4"], "6b134cb3-d9ca-444e-9273-e89482a70569": ["1.0.0"], "6b25e590-344c-4dff-bd69-c20fe0b8cd8a": ["7.5.0"], @@ -21158,6 +21579,7 @@ "2.0.3383", "2.0.3402" ], + "6ccd396f-6642-4079-8653-c20980166070": ["23.1.0", "23.1.1", "23.1.2"], "6cf13cc2-b9c7-4164-af9e-1d5a0db47a6b": [ "0.0.2", "0.0.3", @@ -21263,6 +21685,9 @@ "4.30.0", "4.31.0", "4.32.0", + "4.33.0", + "4.34.0", + "4.35.0", "5.0.0", "5.1.0", "5.2.0", @@ -21274,7 +21699,10 @@ "5.6.1", "5.7.0", "5.8.0", - "5.9.0" + "5.9.0", + "5.10.0", + "5.11.0", + "5.12.0" ], "6d27c589-0e7f-4737-bba7-a9440ae3f87d": [ "1.0.0", @@ -21334,6 +21762,13 @@ "5.0.283", "5.0.284" ], + "6d4b1476-3a89-4eca-ba13-df048e3d697a": [ + "0.4.0", + "0.4.1", + "0.5.0", + "0.5.1", + "0.5.2" + ], "6d582ed5-738e-4145-96ac-0cfd20fb1333": ["1.0.1"], "6d6bf390-8504-42e2-bfcf-9be00dd89226": ["1.1.0", "1.2.0", "1.6.3", "1.6.9"], "6d9895eb-8056-4111-b4b3-7b80fd383e44": [ @@ -21368,6 +21803,7 @@ "1.2.176", "1.2.178" ], + "6da3e555-04c4-480f-91cd-d93c5e56bbf1": ["1.4.7", "2.0.0"], "6dcbfeae-7739-47ad-9509-daad4171f83b": [ "1.0.0", "1.0.1", @@ -21379,6 +21815,7 @@ "1.1.7", "1.2.0" ], + "6de965fa-d4a5-4a42-bbb6-035898549d19": ["23.1.0", "23.1.1", "23.1.2"], "6e103f70-3658-11e7-a455-7fec28a699f6": ["0.1.22"], "6e18e7cf-62c9-43e6-ab52-f7a2eab9432c": [ "0.2019.67", @@ -21549,7 +21986,8 @@ "4.0.0", "5.0.0", "5.1.0", - "5.2.0" + "5.2.0", + "6.0.0" ], "6e2cb46a-ad8b-4571-b183-5f0f81d2b2ba": [ "1.1.6", @@ -21697,10 +22135,26 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "6e40eb5f-dce4-4b62-b9ac-ee900c35a51e": ["1.0.0"], "6e4c7084-7044-4d63-af81-cd809f71d043": ["1.0.16"], + "6e732eed-cdd3-4c5f-a714-b18847a1a0a6": [ + "0.1.1", + "0.1.6", + "0.1.8", + "0.1.9", + "0.1.10", + "0.1.11", + "0.1.12", + "0.1.13", + "0.1.14", + "0.1.15", + "0.1.16", + "1.0.0", + "1.0.3" + ], "6e743613-d4b8-48d2-8ee3-1b8ec3ab00fe": [ "1.0.0", "1.1.0", @@ -21714,7 +22168,8 @@ "1.2.7", "1.2.8", "1.2.9", - "1.2.10" + "1.2.10", + "1.2.11" ], "6e9144d5-e822-4838-be87-ca5f8fef046b": [ "0.1.7", @@ -21763,7 +22218,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "6ea9b0f1-2fb0-4735-bd6e-0f3f58f094ae": [ "0.1.0", @@ -21841,7 +22298,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "6f059bbc-83be-4058-8e6e-83cc8ad41da9": ["0.1.0"], "6f432af8-1146-11ea-9a9f-362b9e155667": ["0.4.2", "0.6.8", "0.7.8"], @@ -22137,7 +22596,8 @@ "2.5.800", "2.5.801", "2.5.830", - "2.5.835" + "2.5.835", + "3.0.0" ], "7164ddbc-7979-4e2c-a2f8-e7a89b6ba026": [ "1.1.789", @@ -22353,7 +22813,9 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "2.11.3445511", + "3.0.3517186" ], "721c3f90-d938-11e8-9d92-09d7594721b5": [ "0.1.8", @@ -22578,7 +23040,9 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "2.11.3445511", + "3.0.3517186" ], "726a9c06-b921-4f6c-a08d-21a79a79d82d": ["1.0.5"], "72aad460-f3dd-469a-95b8-f36027cdcea1": [ @@ -22621,7 +23085,12 @@ "9.1.11638", "9.1.11639", "9.1.11643", - "9.1.11647" + "9.1.11647", + "9.1.61695", + "9.1.91713", + "9.1.91714", + "9.1.91716", + "9.1.91717" ], "72cd03e2-337b-4dfb-96ef-45652729df8d": [ "0.0.1", @@ -22634,7 +23103,7 @@ "0.0.8", "0.0.9" ], - "72dfa944-c991-4332-a81e-71186e4fca9c": ["1.0.0", "2.2.0", "3.1.0", "4.1.0"], + "72e7a1b6-19bc-48e6-8d20-a81f201d65a3": ["6.0.465", "6.0.502"], "72fbcc25-0619-4ea9-be01-7e0b4bcc4256": ["0.38.5"], "72feac44-25ca-468a-942d-0245d2d408bf": [ "1.0.0", @@ -23124,6 +23593,9 @@ "0.1.1187689", "0.1.1239020" ], + "756266d7-4ce1-4522-a934-c08a5e5665f7": ["23.1.0", "23.1.1", "23.1.2"], + "75791037-6539-683a-bfa1-a310d82016b8": ["2.0.0", "2.4.0", "2.5.0", "2.6.0"], + "75791037-6539-683a-bfa1-a310d82016d3": ["2.2.0", "2.3.0"], "75797f68-ee17-4dcb-97e2-550eb87f2728": [ "1.0.1", "1.0.17", @@ -23222,7 +23694,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "75e0df60-f8c3-44b5-a48f-83f4ff71ae4b": [ "0.0.3", @@ -23259,6 +23733,7 @@ "0.1.18" ], "75e7f77c-8ff4-4b1c-a993-276ecc5922d2": ["0.5.1", "0.5.2", "0.5.5", "0.5.6"], + "75f83f0e-8555-49bf-8194-d6d0f943ffc2": ["2.0.10"], "75ff9275-8dc5-4078-b9d4-19375d45c980": [ "0.1.0", "0.5.0", @@ -23350,6 +23825,7 @@ "1.0.11" ], "765f249c-959b-49ff-8409-8e07b94216c4": ["1.0.0"], + "768a5ceb-23d4-446a-9a3a-04db3c4984cc": ["0.1.0"], "769929ed-e421-451b-8255-21a8d9d9d3f9": [ "0.0.1", "0.0.3", @@ -23379,7 +23855,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "76c103d8-c5e8-4f03-acaf-e31fbb276c84": [ "1.0.0", @@ -23485,7 +23963,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "76da6c87-b541-476b-8294-d47dc5679312": [ "9.0.2", @@ -23686,7 +24165,7 @@ "7860477f-ace4-4152-ab31-ffd299f0fe72": ["21.4.1"], "786ecec5-b468-4ab5-ad1c-0cbcd9db5f0f": ["1.0.0"], "787f5aa8-6065-4756-9247-235596a98cf9": ["0.0.6"], - "7890f95d-fd3a-4e5e-8a26-58d1bd0d4e0b": ["1.0.0", "1.1.0"], + "7890f95d-fd3a-4e5e-8a26-58d1bd0d4e0b": ["1.0.0", "1.1.0", "1.2.0"], "789e778a-4f77-4c63-a56d-054ab85b6eae": [ "1.11.19", "1.12.2", @@ -23837,7 +24316,7 @@ "0.4.2", "0.4.7" ], - "79c830dd-92bb-4e02-b330-6638db9df26c": ["22.6.0"], + "79c830dd-92bb-4e02-b330-6638db9df26c": ["22.6.0", "23.2.0"], "79d92bb0-5cae-11e7-94c2-fff61a32ec2a": ["1.0.0", "1.0.3"], "79e0d24a-97b1-4cac-bcd5-398429dc44b0": [ "0.0.2", @@ -24010,12 +24489,19 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502", + "6.0.465", + "6.0.502" ], + "7af26d69-0154-45e2-8a1c-ca0325aac951": ["23.1.0", "23.1.1", "23.1.2"], "7b0900d8-19d2-4c2a-9131-473d431266af": [ "1.7.0", "1.7.1", @@ -24218,7 +24704,11 @@ "3.90.11", "4.0.16", "4.1.2", - "4.2.2" + "4.2.2", + "4.3.3", + "4.4.1", + "4.5.2", + "4.6.2" ], "7b2651f1-34bb-426e-9381-917dbeded037": ["1.1.5", "1.1.6"], "7b3152dd-a0eb-47ba-8d6d-b16f94224ac3": ["1.0.4"], @@ -24931,7 +25421,11 @@ "1.0.1", "1.0.2", "1.0.3", - "1.0.4" + "1.0.4", + "1.0.5", + "1.0.6", + "1.0.7", + "1.0.8" ], "7e3dbac3-ed7b-4b1b-922b-5f3d5a1b523b": ["7.5.0"], "7e520ba0-59ce-11e6-8b09-25a31114de37": ["0.1.0", "1.0.0", "1.0.1", "1.0.3"], @@ -24983,6 +25477,7 @@ "0.2.2", "0.2.3" ], + "7ec297dc-e276-4efa-bae7-d4c11e06fcab": ["23.1.0", "23.1.1", "23.1.2"], "7ed4dab3-0331-5132-a663-e40d70a9e1be": ["0.124.0", "1.212.0"], "7ef7cdfa-aa45-42c5-93c8-d7603643dd99": [ "1.0.1", @@ -25573,7 +26068,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "805fbdcc-38d9-4043-9c04-e84e7208baa8": [ "0.2.0", @@ -25768,7 +26265,8 @@ "2.1.0", "2.2.0", "2.3.0", - "2.4.0" + "2.4.0", + "2.5.0" ], "8191749f-5031-4743-99c7-61d377465a03": ["21.4.1"], "81cc77f6-237b-4962-a25e-80f820a88462": [ @@ -25849,6 +26347,7 @@ "0.1.78" ], "81d130ce-0e2d-4c51-bbdc-69a1ae9f6085": ["0.1.0", "0.1.1", "0.1.2", "0.1.3"], + "81e2f045-dfc5-4c2b-8ef0-a6221324c281": ["1.0.5"], "81fa890c-2b95-4d6b-bc9e-58828d754d07": [ "9.0.1", "9.0.2", @@ -25887,7 +26386,10 @@ "2022.1.1", "2022.2.1", "2022.2.4", - "2022.3.0" + "2022.3.0", + "2022.3.2", + "2022.3.3", + "2022.3.4" ], "82489b45-20d4-44ee-b380-f7a58837bb88": [ "0.1.0", @@ -25929,7 +26431,15 @@ "1.1.1", "1.1.2" ], - "827b3576-c766-4996-84ba-cefba0325ee8": ["1.0.0", "1.0.1", "1.0.2"], + "827b3576-c766-4996-84ba-cefba0325ee8": [ + "1.0.0", + "1.0.1", + "1.0.2", + "1.0.3", + "1.0.4", + "1.0.5", + "1.0.6" + ], "82f8620c-5c25-e398-ef53-8a91ca253d1c": [ "0.1.0", "0.1.3", @@ -26080,7 +26590,8 @@ "1.0.5", "1.0.6", "1.0.7", - "1.0.8" + "1.0.8", + "1.0.9" ], "83c91e05-bdf9-42ce-b27e-6dae8771294e": [ "0.2.15", @@ -26125,6 +26636,12 @@ "0.9.8", "0.10.0" ], + "83faa8cf-ff90-4cb5-8ca0-389edc2c0af5": [ + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" + ], "84110c9d-d8df-43a1-8d53-672b6bf34663": [ "1.0.44", "1.0.45", @@ -26993,7 +27510,23 @@ "0.1.68", "1.1.0", "1.1.1", - "1.1.2" + "1.1.2", + "1.1.3", + "1.1.5", + "1.1.6", + "1.1.7", + "1.1.8", + "1.1.9", + "1.1.10", + "1.1.11", + "1.1.12", + "1.1.13", + "1.1.14", + "1.1.15", + "1.1.16", + "1.1.17", + "1.1.18", + "1.1.19" ], "88621e9b-922f-558a-bf7d-555a4f9e5097": [ "1.2.0", @@ -27254,7 +27787,7 @@ "1.0.3", "1.0.4" ], - "88e0bab6-9798-47cb-a37d-ef65f41992ae": ["2.0.13", "3.0.1"], + "88e0bab6-9798-47cb-a37d-ef65f41992ae": ["2.0.13", "3.0.1", "3.0.2"], "88e530ad-cf5e-4b88-a5d9-e6ce96760718": ["1.0.0"], "893fd8d0-f3eb-4e7d-a628-f1150e5543c9": ["7.5.0"], "897b9f88-ea98-4aab-9743-251d38a263f7": ["1.2.1"], @@ -27293,7 +27826,10 @@ "1.15.1239", "1.15.1261", "1.23.1279", - "1.24.1281" + "1.24.1281", + "1.25.1302", + "1.26.1308", + "1.27.1315" ], "8a0bb940-bf0f-4123-81db-6b8f9ecd408c": ["1.0.0", "1.1.0"], "8a2a673b-d762-486b-854d-75c57e8d6b8a": ["4.0.0"], @@ -27342,6 +27878,7 @@ "2.5.640", "2.6.687" ], + "8aded5a2-27d8-40cd-86ab-bf0a4ba8770e": ["23.1.0", "23.1.1", "23.1.2"], "8af7083b-a782-46c2-94fc-18965c6b48bf": ["1.0.0", "1.1.0"], "8b01f2af-78e5-4828-81a1-b1c763fe7ca9": ["1.0.0", "1.0.2", "1.0.3"], "8b05c43b-e07e-43e1-8cfd-fa60802a18a9": [ @@ -27407,7 +27944,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "8c3e9995-7831-4d41-8d3e-bbc1a45224cf": [ "0.2.43", @@ -27494,6 +28032,8 @@ "3.1.109", "3.1.131", "3.1.134", + "3.1.465", + "3.1.502", "4.0.371", "4.0.375", "4.0.376", @@ -27524,11 +28064,17 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502", + "6.0.465", + "6.0.502" ], "8caea22b-4686-45c2-9e18-7253b313f844": [ "2.0.3", @@ -27582,11 +28128,13 @@ "4.203.0", "4.207.0", "4.209.0", - "4.216.0" + "4.216.0", + "4.217.0" ], "8d0174b6-d3b5-41fe-a22c-8ab4bcf19272": ["1.0.0", "1.0.3"], "8d07311b-5c6d-4dba-9983-342f5471940b": ["0.2.0"], "8d09ef8e-4e82-4802-af33-6d094ad1b6f4": ["1.0.0"], + "8d20bedf-7996-4cbb-b6f8-53b1dd6b8d9a": ["23.1.0", "23.1.1", "23.1.2"], "8d583286-8c17-4b19-b113-25c54730a63b": ["1.0.1", "1.0.2", "1.0.5", "1.0.9"], "8d616517-6390-454f-b369-6fd038d8fe96": [ "1.0.0", @@ -27861,6 +28409,9 @@ "0.9.13", "0.9.14", "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2", "1.0.0", "5.0.2" ], @@ -27892,7 +28443,8 @@ "1.4.6", "1.4.7", "1.4.8", - "1.4.9" + "1.4.9", + "1.5.0" ], "908f312f-0aad-46db-8681-042dbf1fd304": [ "1.0.0", @@ -27989,7 +28541,8 @@ "2.3.0", "2.4.0", "2.5.0", - "2.6.0" + "2.6.0", + "2.7.0" ], "911fb029-c89b-4d09-a2d4-610486918018": [ "1.0.0", @@ -28008,6 +28561,8 @@ ], "913b4df6-df22-496c-a007-86e88ab65bae": ["21.4.1"], "9147289a-2501-4ad1-b2e3-aa3f7817b007": ["0.1.0"], + "914acf0d-6c0a-444b-a2ad-3c7f8fa397d0": ["23.1.0", "23.1.1", "23.1.2"], + "9155350c-422e-44a7-8d98-ed28e4bb8649": ["0.1.0"], "9177f350-4f43-11e7-8a59-cd20d17e2322": ["0.1.0", "0.1.1", "0.2.0"], "9179241e-ef84-47f8-948a-329278287c6c": ["1.0.0"], "918b5374-31ca-4b2a-ac78-92ad468a840f": [ @@ -28462,7 +29017,11 @@ "1.411.0", "1.412.0", "1.413.0", - "1.414.0" + "1.414.0", + "1.415.0", + "1.416.0", + "1.419.0", + "1.420.0" ], "941d4821-d5b0-4b4b-8e2d-bae866fd5d85": [ "0.0.10", @@ -29038,7 +29597,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "9709766a-282a-4817-ac67-fa573c4065ea": [ "1.0.7", @@ -29074,7 +29634,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "97687860-e43c-46ec-a079-967886619de2": ["1.0.0"], "9788ca49-dc8f-4d6b-bd5a-bab0fed0bc0c": [ @@ -29106,7 +29668,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "97a070c8-e426-46aa-8a40-4ac9760ce4f4": ["1.0.0"], "97d5a2f2-92a0-475c-a120-591a43a7bc93": [ @@ -29220,7 +29784,14 @@ "9.0.0" ], "9892d4f3-f2ff-4e0d-b943-7738dbd523af": ["1.0.0"], - "98e620c4-e2ad-47cd-bda0-41b028296cbb": ["1.0.0", "1.0.5", "1.1.0"], + "98e620c4-e2ad-47cd-bda0-41b028296cbb": [ + "1.0.0", + "1.0.5", + "1.1.0", + "2.0.0", + "2.0.1" + ], + "98fee4ab-6711-4399-a8c7-c6a2227d0f10": ["23.1.0", "23.1.1", "23.1.2"], "9917dac2-0ff3-4b6a-b236-9baff3bbb99d": [ "1.1.0", "3.1.0", @@ -29547,7 +30118,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "9aea8869-034d-4094-a6ad-880767d0686c": [ "1.0.2", @@ -29791,7 +30365,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "9cfebe8e-5edf-4a96-95f9-3aa8237e4789": ["0.0.2", "0.0.3"], "9d1e977a-aefd-486a-9c6c-de05d613a65d": [ @@ -30319,6 +30894,7 @@ "1.0.17", "1.0.42" ], + "9fd78d2c-92ed-4734-8b23-ed7d87208c63": ["23.1.0", "23.1.1", "23.1.2"], "a0393340-3465-4b5d-bbc4-0f6b1cd5ae4c": [ "0.1.0", "0.1.3", @@ -30425,6 +31001,9 @@ "0.9.13", "0.9.14", "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2", "1.0.0", "5.0.2" ], @@ -30498,7 +31077,11 @@ "9.1.31663", "9.1.41672", "9.1.51686", - "9.1.61689" + "9.1.61689", + "9.1.71696", + "9.1.81710", + "9.1.91713", + "9.1.91717" ], "a0cea86d-5dc4-4df4-bbf7-1940642467c2": ["1.188.0"], "a0d38a2c-522d-4ece-973f-1cf9b6ea158c": ["0.202.0"], @@ -30898,7 +31481,11 @@ "0.202.17", "0.202.18", "0.202.19", - "0.203.0" + "0.202.20", + "0.202.21", + "0.203.0", + "1.216.20", + "1.216.21" ], "a48708ef-a5d6-40f5-a9be-589847132834": ["9.0.91", "10.0.2", "12.0.3"], "a48708ef-a5d6-4af5-a9be-589847132834": [ @@ -30938,7 +31525,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "a4b6bbe8-1976-45f9-9595-444dedb5743f": [ "1.0.0", @@ -31425,10 +32014,25 @@ "0.1.33", "0.1.34", "0.1.35", - "0.1.36" + "0.1.36", + "0.1.37", + "0.1.38", + "0.1.39", + "0.1.40", + "0.1.41", + "0.1.42", + "0.1.43", + "0.1.44", + "0.1.45", + "0.1.46" ], "a709d5ab-8356-4228-9172-58d362fc4aa7": ["0.1.18"], - "a7692b5d-a590-5763-949b-12ac8ed24643": ["1.151.3", "1.212.0", "1.214.0"], + "a7692b5d-a590-5763-949b-12ac8ed24643": [ + "1.151.3", + "1.212.0", + "1.214.0", + "1.215.0" + ], "a7773296-2290-4fd7-9de1-c8da4e853d30": ["1.0.3", "2.0.3"], "a7773296-2290-4fd7-9de1-c8da4e853d4d": ["0.0.1", "0.0.2", "0.0.3", "1.0.1"], "a7857778-b8db-4355-8abf-ec7ea154cb7d": [ @@ -31622,6 +32226,7 @@ "1.4.0", "1.5.0" ], + "a7f5b121-015f-4a44-bb0e-17ab853e6e64": ["23.1.0", "23.1.1", "23.1.2"], "a7fb084b-f87a-4c04-ac87-8f4028c301d8": [ "0.1.0", "0.1.2", @@ -31759,6 +32364,7 @@ "3.0.25", "3.0.26" ], + "a847e2d1-5435-4d52-a774-6d300953e85f": ["6.0.465", "6.0.502"], "a8515ec8-7254-4ffd-912c-86772e2b5962": [ "0.1.1", "0.1.2", @@ -31917,6 +32523,7 @@ ], "a8ef694b-5a8a-4a4c-8f59-f6b7d671fa9b": ["0.1.0"], "a8fb3344-8d08-4127-851e-7090f1eb0b6b": ["15.188.1", "15.188.2"], + "a926f430-cee2-4e01-a27b-3b717a2fdc34": ["23.1.0", "23.1.1", "23.1.2"], "a93140cf-a222-40bf-a585-68f23b8e200f": [ "1.0.0", "1.7.0", @@ -32224,6 +32831,7 @@ "0.1.178" ], "aammirmirza.cp-adolicensemanagementpublic.adolicensemanagement-task.4e779492-fcca-40f0-bf69-2b3a577b3ba5": [ + "1.0.3", "1.107.1", "1.109.1", "1.111.1", @@ -32251,6 +32859,7 @@ "1.202.1" ], "aammirmirza.cp-adolicensemanagementpublic.adolicensemanagement-task.adolicensemanagement": [ + "1.0.3", "1.107.1", "1.109.1", "1.111.1", @@ -33627,11 +34236,15 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502" ], "ac1f75f1-98c5-4415-a210-3ad9ca9d6ecd": [ "0.0.1", @@ -33735,6 +34348,13 @@ "1.0.30", "1.1.0" ], + "ac700bde-8e4a-4ad2-9294-11428966fd4c": [ + "0.0.135", + "0.0.136", + "0.0.137", + "0.1.0", + "1.0.0" + ], "ac7516c6-a23c-4cb9-bbb9-4c36f067990d": [ "1.0.0", "1.0.1", @@ -33910,7 +34530,8 @@ "1.1.6", "1.1.7" ], - "acunetix360": ["1.0.0", "1.4.0", "1.5.0", "1.5.1", "1.7.0"], + "acunetix360": ["1.0.0", "1.4.0", "1.5.0", "1.5.1", "1.7.0", "1.8.0"], + "ad-emailreport": ["1.0.0"], "ad183166-f693-52e5-8295-eaed417a6aee": [ "1.0.31", "1.0.32", @@ -33934,7 +34555,8 @@ "1.1.17", "1.1.19", "1.1.20", - "1.1.21" + "1.1.21", + "1.1.23" ], "ad266ad9-f30e-41de-a093-988972a0bd7a": [ "1.0.3", @@ -33975,6 +34597,7 @@ ], "ad5ad4a9-f3e0-4ca1-bf35-855d197482e9": ["5.6.10"], "ad5ee7de-41ec-42c8-84d0-8359bc39a4f5": ["0.1.0", "1.0.0"], + "ad673ad4-77b6-4c54-8a37-21d55d5e880b": ["23.1.0", "23.1.1", "23.1.2"], "ad98d6a4-f775-45e0-a4c1-6b31b89f38d1": [ "1.0.1", "1.0.2", @@ -34047,7 +34670,8 @@ "2.0.27192", "2.0.27255", "2.0.27445", - "3.0.46092" + "3.0.46092", + "4.0.84386" ], "ada8b39e-bc7b-49a4-80a8-e7b21d5a4252": [ "0.1.32", @@ -34568,6 +35192,30 @@ "adnansamuel.crm-fetchxml-to-csv-json.fetchxmltojson.dc9235f5-affc-421b-954d-956dcd41d874": [ "1.0.2" ], + "adnansamuel.crm-powercrm-fetchxml-builder-data.power-crm-tools-fetchxml-builder-view-data.371728ed-32fa-44a1-916c-6032a2a43452": [ + "1.1.1", + "1.1.2" + ], + "adnansamuel.crm-powercrm-fetchxml-builder-data.power-crm-tools-fetchxml-builder-view-data.power-crm-tools-fetchxml-builder-view-data": [ + "1.1.1", + "1.1.2" + ], + "adnansamuel.crm-powercrm-fetchxml-builder-data.power-crm-tools-fetchxml-upsert-data.1410d014-3cf1-4210-9f37-499c93af86cf": [ + "1.0.3", + "1.0.4" + ], + "adnansamuel.crm-powercrm-fetchxml-builder-data.power-crm-tools-fetchxml-upsert-data.power-crm-tools-fetchxml-upsert-data": [ + "1.0.3", + "1.0.4" + ], + "adnansamuel.crm-powercrm-fetchxml-builder-data.power-crm-tools-webapi-installer-upsert--view-data.3802fecc-9613-4136-9c84-216279e34cb4": [ + "1.0.2", + "1.0.3" + ], + "adnansamuel.crm-powercrm-fetchxml-builder-data.power-crm-tools-webapi-installer-upsert--view-data.power-crm-tools-webapi-installer-upsert-data": [ + "1.0.2", + "1.0.3" + ], "adnansamuel.power-crm-tools.power-crm-service-endpoint-task.ddcc8973-36eb-47fb-8d52-0ac405ef1d65": [ "1.0.3" ], @@ -34704,6 +35352,7 @@ "1.3.0" ], "adolicensemanagement": [ + "1.0.3", "1.107.1", "1.109.1", "1.111.1", @@ -35156,7 +35805,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "aef39911-3d63-40d6-bdef-909edadf0005": [ "2.1.1309266", @@ -35175,29 +35825,11 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "2.11.3445511", + "3.0.3517186" ], "aef91bee-4793-41aa-b8e8-96a3b2de4ce4": ["1.0.13", "1.0.15"], - "aelij.servicefabrictools.servicefabricpackageversioning.346e3d65-2f3f-4bba-9e59-4137b41fd79e": [ - "1.0.0", - "1.0.1", - "1.0.2", - "1.0.3", - "1.1.0", - "1.2.0", - "1.3.0", - "1.4.0" - ], - "aelij.servicefabrictools.servicefabricpackageversioning.servicefabricpackageversioning": [ - "1.0.0", - "1.0.1", - "1.0.2", - "1.0.3", - "1.1.0", - "1.2.0", - "1.3.0", - "1.4.0" - ], "af2736a0-e189-11e5-8909-474652c774cb": ["0.1.4"], "af548c05-29b1-497d-823c-2d172019ccf4": [ "1.20200421.29360", @@ -35782,7 +36414,8 @@ "2.425.0", "2.426.0", "2.427.0", - "2.430.0" + "2.430.0", + "2.431.0" ], "agile-extensions.bravo-notes.releasenotes.releasenotes": [ "2.9.0", @@ -36017,7 +36650,8 @@ "2.425.0", "2.426.0", "2.427.0", - "2.430.0" + "2.430.0", + "2.431.0" ], "aicustomevent": ["0.1.0", "0.2.0"], "aitgmbh.aithyperv.92be4bbf-8ab1-464a-bfc0-840d2a667725.2317ac39-2411-4668-be26-97430f8dbadd": [ @@ -36124,6 +36758,16 @@ "akhmadtest.build-release-task.custom-build-release-task.buildandreleasetask": [ "1.0.0" ], + "akv-code-sign": [ + "0.2.1", + "0.2.2", + "0.2.3", + "0.2.4", + "0.3.0", + "1.0.0", + "1.0.1", + "1.0.2" + ], "alanwales.resharper-code-analysis.custom-build-task.357e581f-2683-4ac4-aff6-2c2445f063c5": [ "1.0.30", "1.0.31", @@ -36727,6 +37371,10 @@ "alexlofern.azkvtkzip.azkvtkziprun.azurekeyvaulttokenizationfilewithziparchivesupport": [ "1.0.57" ], + "alexsultan.ad-email-reports.emailreport.36fd41b1-8024-4ce9-a5a0-53c3e54ed106": [ + "1.0.0" + ], + "alexsultan.ad-email-reports.emailreport.ad-emailreport": ["1.0.0"], "aliencube.netlify-cli-extensions.deploy-task.adc3fb6d-1396-46d3-96e7-085b4881e1a2": [ "1.0.0" ], @@ -43310,17 +43958,6 @@ "0.1.25", "0.1.29" ], - "anchore": ["0.0.2", "0.0.3", "0.0.65"], - "anchoreinc.anchore-scan-task.anchore-scan-task.anchore": [ - "0.0.2", - "0.0.3", - "0.0.65" - ], - "anchoreinc.anchore-scan-task.anchore-scan-task.c7eedb3a-374e-4626-a168-bfb0e9f39a87": [ - "0.0.2", - "0.0.3", - "0.0.65" - ], "anchoretask": [ "1.2.3", "1.3.0", @@ -43999,6 +44636,7 @@ "0.0.3", "0.0.4", "0.0.5", + "0.0.6", "0.0.7", "0.0.10", "0.0.11", @@ -44801,7 +45439,8 @@ "3.1.0", "3.2.0", "3.3.0", - "3.3.1" + "3.3.1", + "3.4.0" ], "apicoveragetest": [ "0.1.0", @@ -45600,7 +46239,8 @@ "1.183.0", "1.186.0", "1.189.0", - "1.207.0" + "1.207.0", + "1.218.0" ], "appstorerelease": [ "1.0.0", @@ -45623,7 +46263,8 @@ "1.186.0", "1.188.0", "1.189.0", - "1.207.0" + "1.207.0", + "1.218.0" ], "apptestai-test": [ "0.0.10", @@ -45695,7 +46336,9 @@ "4.1.16", "4.1.17", "4.1.18", - "4.1.19" + "4.1.19", + "4.1.20", + "4.1.21" ], "aquasec.aquasec.showcommits.aquasecscanner": [ "0.1.0", @@ -45735,7 +46378,9 @@ "4.1.16", "4.1.17", "4.1.18", - "4.1.19" + "4.1.19", + "4.1.20", + "4.1.21" ], "aquasec.aquasecserverles.showcommits.53872c9a-a53f-4fcf-973d-8ded3d75432b": [ "1.0.0", @@ -45827,7 +46472,9 @@ "4.1.16", "4.1.17", "4.1.18", - "4.1.19" + "4.1.19", + "4.1.20", + "4.1.21" ], "aquasecurityofficial.tfsec-official.custom-build-release-task.c4d1b8a0-2ef3-4ed7-86ae-a83946199e82": [ "0.1.0", @@ -46430,7 +47077,7 @@ "5.2.0", "6.0.0" ], - "armdeploymentinsights": ["1.0.0", "1.0.1", "2.0.1"], + "armdeploymentinsights": ["1.0.0", "1.0.1", "2.0.1", "2.1.0"], "armoutputparserextension": [ "0.0.1", "0.0.2", @@ -48625,7 +49272,8 @@ "3.1.6", "3.2.0", "3.2.1", - "3.2.2" + "3.2.2", + "3.2.3" ], "assembly-info-netframework": [ "2.0.65", @@ -48642,7 +49290,8 @@ "3.1.6", "3.2.0", "3.2.1", - "3.2.2" + "3.2.2", + "3.2.3" ], "assembly-info-task": [ "1.0.0", @@ -48995,12 +49644,14 @@ "authoritypartnersinc.arm-deployment-insights.arm-deployment-insights-task.2ed34943-e39d-4289-bd57-686fae0f69d7": [ "1.0.0", "1.0.1", - "2.0.1" + "2.0.1", + "2.1.0" ], "authoritypartnersinc.arm-deployment-insights.arm-deployment-insights-task.armdeploymentinsights": [ "1.0.0", "1.0.1", - "2.0.1" + "2.0.1", + "2.1.0" ], "autodefects": ["1.0.21", "1.1.0", "1.1.1", "1.1.5"], "automagically.backupremotefolder.backupremotefolder.backupremotefolder": [ @@ -49189,6 +49840,15 @@ "1.0.40", "1.0.41" ], + "avd-code-sign": [ + "0.0.1", + "0.0.2", + "0.1.0", + "0.1.1", + "0.1.4", + "0.1.5", + "0.1.6" + ], "avdbrink.vsts-ssas.buildssas-task.6fc422c6-f77e-4ebe-b124-d008ba47f4d0": [ "0.3.4", "0.3.5", @@ -50299,7 +50959,10 @@ "1.0.2", "1.0.3", "1.0.4", - "1.0.5" + "1.0.5", + "1.1.0", + "1.2.0", + "1.2.1" ], "az-pipelines-2-sharepoint": [ "0.1.0", @@ -50571,7 +51234,9 @@ "1.2.17", "1.2.18", "1.2.19", - "1.2.20" + "1.2.20", + "1.2.21", + "1.2.22" ], "azloadtest.azloadtesting.custom-build-release-task.azureloadtesting": [ "1.1.19", @@ -50617,7 +51282,9 @@ "1.2.17", "1.2.18", "1.2.19", - "1.2.20" + "1.2.20", + "1.2.21", + "1.2.22" ], "azloadtest.azloadtesting.custom-build-release-task.microsoftazloadtest": [ "1.1.2", @@ -50861,7 +51528,13 @@ "azure function keys": ["1.0.7", "1.0.8"], "azure search: create object": ["1.0.0"], "azure_fbig_publish": ["0.1.0"], - "azure-api-management-services": ["1.0.0"], + "azure-api-management-services": [ + "0.0.135", + "0.0.136", + "0.0.137", + "0.1.0", + "1.0.0" + ], "azure-cosmosdb.emulator-public-preview.run-cosmosdbemulatorcontainer.63c722b8-ca8a-4830-8a46-8a6b7bce9c00": [ "2.0.1", "2.0.2", @@ -51583,7 +52256,8 @@ "4.0.0", "5.0.0", "5.1.0", - "5.2.0" + "5.2.0", + "6.0.0" ], "azureappconfiguration.azure-app-configuration-task-push.custom-build-release-task.014d1f42-f7ad-4418-b165-5bf03802417e": [ "1.0.0", @@ -51603,7 +52277,8 @@ "3.3.0", "3.4.0", "4.4.0", - "4.5.0" + "4.5.0", + "5.0.0" ], "azureappconfiguration.azure-app-configuration-task-push.custom-build-release-task.azureappconfigurationpush": [ "1.0.0", @@ -51623,7 +52298,8 @@ "3.3.0", "3.4.0", "4.4.0", - "4.5.0" + "4.5.0", + "5.0.0" ], "azureappconfiguration.azure-app-configuration-task.custom-build-release-task.6e2729df-2211-4a7c-af6f-b726bbca2a3a": [ "0.1.0", @@ -51677,7 +52353,8 @@ "4.0.0", "5.0.0", "5.1.0", - "5.2.0" + "5.2.0", + "6.0.0" ], "azureappconfiguration.azure-app-configuration-task.custom-build-release-task.azureappconfiguration": [ "0.1.0", @@ -51731,7 +52408,8 @@ "4.0.0", "5.0.0", "5.1.0", - "5.2.0" + "5.2.0", + "6.0.0" ], "azureappconfigurationpush": [ "1.0.0", @@ -51751,7 +52429,8 @@ "3.3.0", "3.4.0", "4.4.0", - "4.5.0" + "4.5.0", + "5.0.0" ], "azureappsericeplanprovision": [ "0.0.1", @@ -51795,6 +52474,26 @@ "2.0.0" ], "azureappservicesetconnectionstrings": ["1.0.0", "2.0.0"], + "azurechaosstudio.chaosstudioextension.custom-build-release-task.0a1c7f0a-2381-4759-9308-d541a4c00377": [ + "1.1.1", + "1.1.2", + "1.1.3", + "1.1.4", + "1.1.5", + "1.1.6", + "1.1.7", + "1.1.11" + ], + "azurechaosstudio.chaosstudioextension.custom-build-release-task.chaos-studio-release-task-extension": [ + "1.1.1", + "1.1.2", + "1.1.3", + "1.1.4", + "1.1.5", + "1.1.6", + "1.1.7", + "1.1.11" + ], "azurecontaineragentcreate": ["0.9.0", "0.9.1"], "azurecontainerappsrc": [ "0.1.0", @@ -51803,7 +52502,13 @@ "0.1.3", "0.1.4", "0.1.6", - "0.1.7" + "0.1.7", + "0.1.8", + "0.1.9", + "0.1.10", + "0.1.11", + "0.1.12", + "0.1.13" ], "azurecostssaver": [ "0.0.1", @@ -52216,7 +52921,9 @@ "1.2.17", "1.2.18", "1.2.19", - "1.2.20" + "1.2.20", + "1.2.21", + "1.2.22" ], "azureloadtesting": [ "1.1.19", @@ -52332,6 +53039,9 @@ "19.1.0", "20.1.0" ], + "azurepullrequest": ["1.0.5", "1.0.6", "1.0.9", "1.0.10", "1.0.11"], + "azurepullrequest1": ["1.0.12"], + "azurepullrequest2": ["1.0.13"], "azurerbac": ["1.2.3", "1.2.9", "1.3.0", "1.3.1", "1.3.2", "1.3.3"], "azurerbas": ["1.0.0", "1.2.0", "1.2.1", "1.2.2"], "azureresourcegroup": ["1.0.0", "1.0.1", "1.0.2"], @@ -52698,6 +53408,7 @@ "0.1.2161" ], "b0604801-95b3-4623-94b7-5b6935b362c5": ["1.0.0", "1.0.18"], + "b075614e-f76c-485c-a8e0-ad843fad0e36": ["23.1.0", "23.1.1", "23.1.2"], "b07f3415-0818-4108-b90c-d0255f37b7d2": [ "1.0.0", "1.0.4", @@ -52738,6 +53449,7 @@ "15.145.0" ], "b0b5419e-bdda-48b4-84fa-55d8af6b5bfb": ["1.0.0"], + "b0dccc97-764d-49e2-ae58-c1df071fea3f": ["23.1.0", "23.1.1", "23.1.2"], "b0e438f2-18ba-44df-b6e5-1deb7a29811f": ["1.19.1", "1.21.1"], "b104a15c-1856-4671-986f-e40a6cb517e5": [ "1.0.4", @@ -52798,7 +53510,10 @@ "1.0.3", "1.0.4", "1.0.5", - "1.0.6" + "1.0.6", + "1.1.3", + "1.1.4", + "1.1.5" ], "b1861ef4-b62e-40c1-bcb0-be00d454a8a7": [ "4.0.371", @@ -52831,11 +53546,15 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502" ], "b1a34be1-7833-46ef-adcc-8196d9412904": ["0.0.2", "0.0.3"], "b1c46470-e40b-48b4-aac2-e769c992617f": [ @@ -52853,6 +53572,7 @@ "1.1.9" ], "b1c93e62-5cbd-4d4d-9cba-3b1185f26fb2": ["1.188.0"], + "b1ca1391-e6ee-40f0-b751-cb3fca446451": ["23.1.0", "23.1.1", "23.1.2"], "b1fc9b46-8253-4031-8657-f5579cd1ab5c": [ "1.0.2", "1.0.4", @@ -52926,6 +53646,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -52936,8 +53659,12 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], + "b2b7480c-7f29-4afe-a33d-23c0d452470f": ["23.1.0", "23.1.1", "23.1.2"], "b2c-policy-build": [ "0.1.0", "0.1.1", @@ -53014,7 +53741,7 @@ ], "b2d623e9-bbcc-4593-8042-7bbfdd38fd15": ["0.2.0", "0.2.1", "0.3.0", "0.4.0"], "b2e0a66a-1021-4eea-b6df-0e5340fb555b": ["1.0.0"], - "b35a84b6-16c3-4d53-9593-53e8ff6e28ca": ["2.0.0", "2.1.0", "3.1.0"], + "b35a84b6-16c3-4d53-9593-53e8ff6e28ca": ["2.0.0", "2.1.0", "3.1.0", "3.2.0"], "b35d967b-7bc2-40aa-8824-d3917fdd2890": ["1.0.0"], "b3c54483-4140-45d8-b442-3a0b096b5f7f": [ "0.8.0", @@ -53032,7 +53759,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "b3c6bb07-1292-44e7-9ec9-b211fc98b6d2": [ "0.159.0", @@ -53358,6 +54088,7 @@ "2.2.57" ], "b5175205-82c0-4519-b4de-7cd8b99fc43f": ["0.1.0", "0.1.1"], + "b520ca01-2912-44ad-9977-caad43d70e66": ["23.1.0", "23.1.1", "23.1.2"], "b5241088-1066-4c72-bb30-a9138dcf5d83": ["0.0.1", "0.0.2", "0.0.3"], "b5377cda-e54d-425a-999a-5cca18d44267": [ "1.0.0", @@ -53544,7 +54275,10 @@ "0.1.60", "0.1.61", "0.1.62", - "0.1.63" + "0.1.63", + "0.1.64", + "0.1.65", + "0.1.66" ], "b60538b8-6048-4c68-bc55-f2ebec1c3d72": ["21.4.1"], "b61b360c-31ac-4389-922b-303ea8befde7": [ @@ -53580,7 +54314,9 @@ "1.2.17", "1.2.18", "1.2.19", - "1.2.20" + "1.2.20", + "1.2.21", + "1.2.22" ], "b629298d-31f0-4261-8b9e-aa99349c8da9": [ "0.0.1", @@ -53647,7 +54383,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "b68d33d0-8397-4c24-a852-af122e8ed969": [ "1.0.0", @@ -53667,7 +54404,7 @@ "1.3.8" ], "b69d19a0-7f6d-11e5-a86a-c199aa7a6cf0": ["1.1.0", "1.2.0", "1.2.1", "1.2.2"], - "b6b825f4-533e-42de-82e8-633bb17be567": ["22.6.0"], + "b6b825f4-533e-42de-82e8-633bb17be567": ["22.6.0", "23.2.0"], "b6d19a53-dc5f-4b71-a49c-63e87f49e9ab": [ "1.1.0", "1.1.1", @@ -53732,6 +54469,7 @@ "0.146.1876", "0.146.1924" ], + "b6fd383d-fc98-405d-a98a-37a161e7cc9b": ["23.1.0", "23.1.1", "23.1.2"], "b700f673-acfc-4f5f-8b5e-24a585646319": [ "1.0.1", "1.0.2", @@ -53740,7 +54478,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "b721bb9b-9a4d-4ee5-aa08-a6b053d4fd8a": [ "0.2.6", @@ -53809,7 +54549,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "b7776e79-2995-4cd3-8354-ccc2c5ae21a4": [ "0.1.1", @@ -53951,7 +54692,11 @@ "9.1.31663", "9.1.41672", "9.1.51686", - "9.1.61689" + "9.1.61689", + "9.1.71696", + "9.1.81710", + "9.1.91713", + "9.1.91717" ], "b7cd5a2e-1c4c-4f61-8b25-ba72cf4fc8ce": [ "0.1.0", @@ -53974,7 +54719,9 @@ "0.1.18", "0.2.0", "1.0.0", - "1.0.5" + "1.0.5", + "1.0.6", + "1.0.7" ], "b7dca1f3-958e-4cb4-9ee9-94a4039099ed": ["1.0.0"], "b7e2e16c-c7c7-4a4b-bdc2-e2662823beee": [ @@ -54030,7 +54777,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "b80885a6-50d9-4985-95b2-5696f11cb69f": ["1.0.36", "1.0.37", "1.0.38"], "b8191a40-7d09-11e7-adbb-b774110c0faf": [ @@ -54213,6 +54963,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -54223,7 +54976,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "b876037c-d990-4718-baca-65a8df0dd9dd": [ "1.0.1", @@ -54320,7 +55076,7 @@ "1.9.26", "1.9.27" ], - "b9d2cbbf-a568-432b-bddc-4a8ad11c06a5": ["22.6.0"], + "b9d2cbbf-a568-432b-bddc-4a8ad11c06a5": ["22.6.0", "23.2.0"], "b9e73261-8b50-4e5b-8064-45ea8d5521c1": ["0.1.0", "1.0.0"], "ba0d0ad0-393c-11eb-bbda-d53a76740bce": [ "0.1.0", @@ -54425,7 +55181,7 @@ "backupremotefolder": ["1.0.0"], "backuprollback": ["0.1.0", "1.0.0"], "backuputility": ["1.0.0"], - "bad9770c-4811-4fb9-801b-650a6966f454": ["1.0.2"], + "bad9770c-4811-4fb9-801b-650a6966f454": ["1.0.2", "1.0.3"], "badge-creator": ["1.0.0", "1.1.0"], "balamuralikrishna.securefiletask.securefiletask.53ae5081-c40d-434c-9c22-82842c499065": [ "0.0.16" @@ -54661,7 +55417,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "bd4d515f-a13f-46fe-95b2-73ae781224cb": ["2.5.0", "2.5.1", "2.6.0"], "bd52c556-555b-48b0-8ba2-6f4b0f51d599": ["0.0.1", "0.1.1"], @@ -54879,7 +55636,11 @@ "5.1.12", "5.1.13", "5.1.14", - "5.1.15" + "5.1.15", + "5.1.16", + "5.1.17", + "5.1.18", + "5.1.19" ], "beaglesecurity.beaglesecurity.beagle-start-test-azure-task.beaglesecuritytask": [ "0.1.0" @@ -55846,7 +56607,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "bf3abc1f-7d0b-41a3-bbb8-c1bd178b4fa8": ["7.5.0"], "bf3b9233-0a55-4611-95ce-771ccc2c2cf0": [ @@ -55955,6 +56718,7 @@ "1.0.2894", "1.0.2895" ], + "bf52d8fd-c399-4acd-98c7-a03ceee2a973": ["1.0.19", "1.0.20", "1.0.21"], "bf52d8fd-c399-4acd-98c7-a03ceee2a974": [ "0.1.0", "1.0.1", @@ -56003,7 +56767,7 @@ "0.7.0", "0.8.0" ], - "bfc50905-2ff3-4d34-be60-b59618fd371e": ["22.6.0"], + "bfc50905-2ff3-4d34-be60-b59618fd371e": ["22.6.0", "23.2.0"], "bfd05e80-f553-4a07-aaff-b44ab65bd61d": [ "0.0.1", "0.0.3", @@ -56033,7 +56797,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "bfd2bc68-a3b1-4910-bf8f-110fe978ca22": [ "5.8.0", @@ -56692,7 +57458,14 @@ "0.3.4", "0.3.6", "0.3.7", - "0.3.8" + "0.3.8", + "0.3.9", + "0.4.0", + "0.4.1", + "0.4.2", + "0.4.3", + "0.4.4", + "0.4.5" ], "bicepdecompile": [ "0.3.1", @@ -56701,7 +57474,14 @@ "0.3.4", "0.3.6", "0.3.7", - "0.3.8" + "0.3.8", + "0.3.9", + "0.4.0", + "0.4.1", + "0.4.2", + "0.4.3", + "0.4.4", + "0.4.5" ], "bicepinstall": [ "0.1.0", @@ -56723,14 +57503,39 @@ "0.3.4", "0.3.6", "0.3.7", - "0.3.8" + "0.3.8", + "0.3.9", + "0.4.0", + "0.4.1", + "0.4.2", + "0.4.3", + "0.4.4", + "0.4.5" ], "biceptemplatedeployment": ["1.0.8", "1.0.9"], - "bigavocado.terragrunt.installterragrunt.c67b072a-0853-4578-95c1-acbc26e8897a": [ - "0.1.0" - ], - "bigavocado.terragrunt.installterragrunt.installterragrunt": ["0.1.0"], "binaries-comparer": ["0.1.1", "0.1.3", "0.2.0", "0.2.1", "0.2.2", "0.2.3"], + "bioscientia-instfrmedizinischediagnostik-softwareentwicklung.dependency-track-vsts.bomupload.51c7cdd8-1e0b-4db3-8513-ffcdbe1959f3": [ + "0.0.0", + "0.0.1", + "0.0.2" + ], + "bioscientia-instfrmedizinischediagnostik-softwareentwicklung.dependency-track-vsts.bomupload.bomupload": [ + "0.0.0", + "0.0.1", + "0.0.2" + ], + "bioscientia-instfrmedizinischediagnostik-softwareentwicklung.dependency-track-vsts.upload-bom-dtrack-task.dc642a62-e5cc-49d4-8017-a0b76dd6e04b": [ + "0.0.0" + ], + "bioscientia-instfrmedizinischediagnostik-softwareentwicklung.dependency-track-vsts.upload-bom-dtrack-task.upload-bom-dtrack-task": [ + "0.0.0" + ], + "bioscientia-instfrmedizinischediagnostik-softwareentwicklung.dependency-track-vsts.upload-bom-task.d33ffb6a-a67c-41d0-bc75-c09695e2be5b": [ + "0.0.0" + ], + "bioscientia-instfrmedizinischediagnostik-softwareentwicklung.dependency-track-vsts.upload-bom-task.upload-bom-task": [ + "0.0.0" + ], "biswajitr.documentationascode.json-to-markdown.80f5ec84-70df-4ce5-9211-9a45de818c03": [ "0.0.0", "0.0.1", @@ -56945,7 +57750,8 @@ "2.1.0", "2.2.0", "2.3.0", - "2.4.0" + "2.4.0", + "2.5.0" ], "blaze-runner.blaze-runner.blazemeter-test.blazemeter integration": [ "1.1.2", @@ -56968,7 +57774,8 @@ "2.1.0", "2.2.0", "2.3.0", - "2.4.0" + "2.4.0", + "2.5.0" ], "blazemeter integration": [ "1.1.2", @@ -56991,7 +57798,8 @@ "2.1.0", "2.2.0", "2.3.0", - "2.4.0" + "2.4.0", + "2.5.0" ], "blazemobile pro": ["1.1.0", "1.2.0"], "bleddynrichards.assembly-info-task.assembly-info-netcore.assembly-info-netcore": [ @@ -57009,7 +57817,8 @@ "3.1.6", "3.2.0", "3.2.1", - "3.2.2" + "3.2.2", + "3.2.3" ], "bleddynrichards.assembly-info-task.assembly-info-netcore.f15dc48c-4351-4c96-927c-729360a3164b": [ "2.0.65", @@ -57026,7 +57835,8 @@ "3.1.6", "3.2.0", "3.2.1", - "3.2.2" + "3.2.2", + "3.2.3" ], "bleddynrichards.assembly-info-task.assembly-info-task.3edc451e-360c-40e5-a221-a42d5c987ab8": [ "1.0.0", @@ -57076,7 +57886,8 @@ "3.1.6", "3.2.0", "3.2.1", - "3.2.2" + "3.2.2", + "3.2.3" ], "bleddynrichards.assembly-info-task.assembly-info-task.assembly-info-netframework": [ "2.0.65", @@ -57093,7 +57904,8 @@ "3.1.6", "3.2.0", "3.2.1", - "3.2.2" + "3.2.2", + "3.2.3" ], "bleddynrichards.assembly-info-task.assembly-info-task.assembly-info-task": [ "1.0.0", @@ -57232,7 +58044,8 @@ "2.5.800", "2.5.801", "2.5.830", - "2.5.835" + "2.5.835", + "3.0.0" ], "bluebasher.bluebasher-workitemupdater.bluebasher-workitemupdater.workitemupdater": [ "1.0.0", @@ -57336,7 +58149,8 @@ "2.5.800", "2.5.801", "2.5.830", - "2.5.835" + "2.5.835", + "3.0.0" ], "bluegreenselection": [ "0.1.1", @@ -57409,41 +58223,84 @@ "1.0.1", "1.0.2", "1.0.3", - "1.0.4" + "1.0.4", + "1.0.5", + "1.0.6", + "1.0.7", + "1.0.8" + ], + "bmc-compuware-xpediter-code-coverage-plugin": [ + "1.0.0", + "1.0.2", + "1.0.3", + "1.0.4", + "1.0.6", + "1.0.7" + ], + "bmc-strobe-measurement-plugin": [ + "1.0.0", + "1.0.1", + "1.0.2", + "1.0.3", + "1.0.4", + "1.0.5", + "1.0.6" ], - "bmc-compuware-xpediter-code-coverage-plugin": ["1.0.0", "1.0.2"], - "bmc-strobe-measurement-plugin": ["1.0.0", "1.0.1", "1.0.2"], "bmc.bmc-compuware-topaz-utilities-plugin.custom-build-release-task.7e39beb7-ef8f-431e-94e4-7052d978705a": [ "1.0.0", "1.0.1", "1.0.2", "1.0.3", - "1.0.4" + "1.0.4", + "1.0.5", + "1.0.6", + "1.0.7", + "1.0.8" ], "bmc.bmc-compuware-topaz-utilities-plugin.custom-build-release-task.bmc-compuware-topaz-utilities-plugin": [ "1.0.0", "1.0.1", "1.0.2", "1.0.3", - "1.0.4" + "1.0.4", + "1.0.5", + "1.0.6", + "1.0.7", + "1.0.8" ], "bmc.bmc-compuware-xpediter-code-coverage-plugin.custom-build-release-task.bmc-compuware-xpediter-code-coverage-plugin": [ "1.0.0", - "1.0.2" + "1.0.2", + "1.0.3", + "1.0.4", + "1.0.6", + "1.0.7" ], "bmc.bmc-compuware-xpediter-code-coverage-plugin.custom-build-release-task.f8b65b7d-54e2-4ab4-aeeb-ca3db08cc6ed": [ "1.0.0", - "1.0.2" + "1.0.2", + "1.0.3", + "1.0.4", + "1.0.6", + "1.0.7" ], "bmc.bmc-strobe-measurement-plugin.custom-build-release-task.827b3576-c766-4996-84ba-cefba0325ee8": [ "1.0.0", "1.0.1", - "1.0.2" + "1.0.2", + "1.0.3", + "1.0.4", + "1.0.5", + "1.0.6" ], "bmc.bmc-strobe-measurement-plugin.custom-build-release-task.bmc-strobe-measurement-plugin": [ "1.0.0", "1.0.1", - "1.0.2" + "1.0.2", + "1.0.3", + "1.0.4", + "1.0.5", + "1.0.6" ], "bmc.bmcautorun.custom-build-release-task.36b2e1e2-9a87-4be7-bd17-68f97e5e995c": [ "23.1.0" @@ -57465,6 +58322,7 @@ "bmc.ispw-source-code-downloader.custom-build-release-task.downloadertask": [ "1.0.0" ], + "bomupload": ["0.0.0", "0.0.1", "0.0.2"], "bool.compile-type-script.compile-type-script-task.3933420c-5028-40d7-9eae-2f17f5484e17": [ "1.0.0", "1.0.1", @@ -57697,6 +58555,51 @@ "1.0.10", "1.0.11" ], + "boostsecurity.boostsecurityscan.custom-build-release-task.6e732eed-cdd3-4c5f-a714-b18847a1a0a6": [ + "0.1.1", + "0.1.6", + "0.1.8", + "0.1.9", + "0.1.10", + "0.1.11", + "0.1.12", + "0.1.13", + "0.1.14", + "0.1.15", + "0.1.16", + "1.0.0", + "1.0.3" + ], + "boostsecurity.boostsecurityscan.custom-build-release-task.boostsecurityscan": [ + "0.1.1", + "0.1.6", + "0.1.8", + "0.1.9", + "0.1.10", + "0.1.11", + "0.1.12", + "0.1.13", + "0.1.14", + "0.1.15", + "0.1.16", + "1.0.0", + "1.0.3" + ], + "boostsecurityscan": [ + "0.1.1", + "0.1.6", + "0.1.8", + "0.1.9", + "0.1.10", + "0.1.11", + "0.1.12", + "0.1.13", + "0.1.14", + "0.1.15", + "0.1.16", + "1.0.0", + "1.0.3" + ], "boots": ["0.1.0", "0.2.0", "0.5.0", "0.6.0", "0.7.0", "0.8.0", "1.0.0"], "bot-deployment": [ "0.1.0", @@ -57882,7 +58785,10 @@ "1.15.1239", "1.15.1261", "1.23.1279", - "1.24.1281" + "1.24.1281", + "1.25.1302", + "1.26.1308", + "1.27.1315" ], "buildahcli": [ "0.0.3", @@ -57897,7 +58803,7 @@ "0.0.50", "0.0.51" ], - "buildandreleasetask": ["1.0.0"], + "buildandreleasetask": ["0.1.0", "1.0.0"], "buildandreleasetasks": ["0.1.0"], "buildcleanup": ["0.0.2", "0.0.3", "1.0.0"], "buildconsole": ["5.6.7"], @@ -58552,6 +59458,7 @@ "4.0.5" ], "c0194396-f7c0-4f61-8441-2bd934dac867": ["1.0.1", "1.0.3"], + "c01a83fb-0553-4448-8136-ad7909d8bb33": ["23.1.0", "23.1.1", "23.1.2"], "c01ed260-de55-11e5-a96c-15f2d80f9c9b": ["0.1.2", "0.1.3", "0.1.4"], "c030fa5b-9e93-47fc-a3ed-3ea4e45ddccf": ["1.0.0", "1.0.1", "1.0.2"], "c051fce0-2c60-11e6-b89d-9176a5588bd7": ["0.1.0"], @@ -58788,8 +59695,16 @@ "0.3.4", "0.3.6", "0.3.7", - "0.3.8" + "0.3.8", + "0.3.9", + "0.4.0", + "0.4.1", + "0.4.2", + "0.4.3", + "0.4.4", + "0.4.5" ], + "c1fd831a-3f3e-48f7-8e97-b4462b7bee5a": ["23.1.0", "23.1.1", "23.1.2"], "c2352bb0-02ff-11e7-b013-d7281afbb3a9": ["0.0.1", "0.0.2"], "c2399c77-038c-48ca-86cf-f46ef717596e": ["1.0.0", "1.0.1"], "c23a6305-299e-4871-8cba-1bca894d21dc": [ @@ -58867,7 +59782,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "c2aea098-6aab-4cd3-9a0c-57b074df3df5": ["0.2.0", "0.2.5"], "c2f186c9-9a84-427b-bbbc-93f30eb1ac55": [ @@ -59100,7 +60017,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "c51ca1ce-0b54-627e-9571-3cbb14a64584": [ "0.1.0", @@ -59169,7 +60087,12 @@ "0.0.115", "0.0.2156" ], - "c61c6fcc-00f1-4aa0-8513-31aad3340512": ["0.7.5", "0.8.10", "0.8.34"], + "c61c6fcc-00f1-4aa0-8513-31aad3340512": [ + "0.7.5", + "0.8.10", + "0.8.34", + "0.9.19" + ], "c62eda9d-fa8a-4910-9372-8e366a585832": [ "0.11.0", "1.5.10", @@ -59288,6 +60211,7 @@ "1.0.14" ], "c6e8cd46-7141-41d1-b21e-9932e08fa67f": [ + "1.0.1", "1.11.0", "1.11.1", "1.11.21", @@ -59303,7 +60227,8 @@ "1.11.121", "1.11.131", "1.11.141", - "1.11.151" + "1.11.151", + "1.12.41" ], "c6f3c728-4d4c-4aa5-a3a1-fc16f6ff9a66": [ "1.3.0", @@ -59342,7 +60267,9 @@ "3.14.0", "3.15.0", "3.16.0", - "3.17.0" + "3.17.0", + "3.18.0", + "3.19.0" ], "c6fadf1b-ead4-442f-b470-62f4c455a70c": ["2.0.0"], "c704915c-1f6c-4237-9edd-4330da1ad3e6": [ @@ -59405,10 +60332,12 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "c791abe6-9acf-4302-bcbd-af77c84f72c0": ["0.2.0", "0.2.3", "0.2.4", "0.2.5"], - "c7eedb3a-374e-4626-a168-bfb0e9f39a87": ["0.0.2", "0.0.3", "0.0.65"], "c7ff6910-8d2a-43cb-859f-83cb8db6e4e9": [ "0.1.0", "0.2.0", @@ -60342,7 +61271,12 @@ "5.4.35", "5.4.48", "5.4.52", - "5.4.55" + "5.4.55", + "5.4.59", + "5.4.61", + "5.4.62", + "5.4.66", + "5.4.67" ], "casthighlight.highlight-automated-code-scan.custom-build-task.highlightcodescan": [ "0.1.0", @@ -60405,7 +61339,12 @@ "5.4.35", "5.4.48", "5.4.52", - "5.4.55" + "5.4.55", + "5.4.59", + "5.4.61", + "5.4.62", + "5.4.66", + "5.4.67" ], "catcomp.btdfprojectfileupdatertypescript.vsts-btdf-projver-task.416b14b0-7411-4148-bdbe-42f73fd86c77": [ "0.1.2", @@ -60597,7 +61536,8 @@ "1.183.0", "1.186.0", "1.189.0", - "1.207.0" + "1.207.0", + "1.218.0" ], "cbbf7f14-c386-4c1f-80a3-fe500e2bd977": [ "1.112.0", @@ -60610,7 +61550,8 @@ "1.178.2", "1.186.0", "1.189.0", - "1.207.0" + "1.207.0", + "1.218.0" ], "cbe6d7cf-333e-4613-9a10-338057fc2aed": ["0.1.0"], "cbe8d5fd-a02d-4157-8bfa-21f98fcaa217": [ @@ -60647,7 +61588,8 @@ "8.2.0", "8.3.0", "8.5.0", - "8.6.0" + "8.6.0", + "8.7.0" ], "cbebb02b-11c6-4e24-b5a8-0b51366d51b7": ["0.2.5"], "cboroson-keyvault-replication": [ @@ -61160,7 +62102,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "cc3fd650-56d4-11e6-8258-d3f2fd672f0b": [ "0.1.0", @@ -61297,7 +62240,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "cce8979f-88a6-4ff2-8742-23dac3c088b4": [ "0.0.1", @@ -61594,7 +62539,10 @@ "1.32.0", "1.33.0", "1.33.1", - "1.34.0" + "1.34.0", + "1.35.0", + "1.36.0", + "1.37.0" ], "ce0b296e-f1e6-4be2-a18b-a431c106cb86": [ "0.0.76", @@ -61608,7 +62556,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "ce296515-b55b-4894-924a-eb7a57d618f1": ["1.0.3"], "ce399001-0aaa-4364-b5f8-50543569449d": ["1.0.1"], @@ -62122,6 +63072,20 @@ "celezant.azure-apim-automation.custom-build-release-task.d323ff86-13d8-4453-a664-6bc3c5814f81": [ "1.0.0" ], + "celezant.azure-apim-cleanup.custom-build-release-task.ac700bde-8e4a-4ad2-9294-11428966fd4c": [ + "0.0.135", + "0.0.136", + "0.0.137", + "0.1.0", + "1.0.0" + ], + "celezant.azure-apim-cleanup.custom-build-release-task.azure-api-management-services": [ + "0.0.135", + "0.0.136", + "0.0.137", + "0.1.0", + "1.0.0" + ], "certinstaller": ["1.0.0", "1.0.1", "1.0.2"], "cf234ecc-192f-42bf-a181-d3f360bea604": ["7.5.0"], "cf24a547-faff-4361-a547-6fc7c4f5cceb": [ @@ -62183,6 +63147,12 @@ "4.0.0" ], "cfed8e5e-c912-4257-a75d-17f646d4d4c6": ["7.5.0"], + "cfia-acia.maikvandergaag-trigger-pipeline.triggerpipeline.75f83f0e-8555-49bf-8194-d6d0f943ffc2": [ + "2.0.10" + ], + "cfia-acia.maikvandergaag-trigger-pipeline.triggerpipeline.triggerpipeline": [ + "2.0.10" + ], "cflint": [ "1.0.2", "1.0.7", @@ -62368,6 +63338,16 @@ "0.1.0" ], "changetaskstateonex": ["0.1.0"], + "chaos-studio-release-task-extension": [ + "1.1.1", + "1.1.2", + "1.1.3", + "1.1.4", + "1.1.5", + "1.1.6", + "1.1.7", + "1.1.11" + ], "chaosattackrunner": [ "0.3.11", "0.3.21", @@ -62843,6 +63823,7 @@ "check-url": ["1.0.0"], "checkartifactconsistency": ["0.0.13", "0.0.14", "0.0.15", "0.0.16"], "checkduplicatenugetpackages": ["1.0.0"], + "checkmarx": ["2.0.19"], "checkmarx ast": [ "0.0.8", "0.0.11", @@ -62868,8 +63849,10 @@ "2.0.15", "2.0.16", "2.0.17", - "2.0.18" + "2.0.18", + "2.0.20" ], + "checkmarx.checkmarx-ast-azure-plugin.cx-scan-task.checkmarx": ["2.0.19"], "checkmarx.checkmarx-ast-azure-plugin.cx-scan-task.checkmarx ast": [ "0.0.8", "0.0.11", @@ -62895,7 +63878,8 @@ "2.0.15", "2.0.16", "2.0.17", - "2.0.18" + "2.0.18", + "2.0.20" ], "checkmarx.checkmarx-ast-azure-plugin.cx-scan-task.dd862edc-5d88-4d2c-b83b-fff2a695e5c0": [ "0.0.8", @@ -62922,7 +63906,9 @@ "2.0.15", "2.0.16", "2.0.17", - "2.0.18" + "2.0.18", + "2.0.19", + "2.0.20" ], "checkmarx.cxsast.cx-scan-task.5262fee4-b921-4e23-9d22-3bccaa562688": [ "0.1.2", @@ -66028,11 +67014,19 @@ ], "cloudmaker.cloudmakerenterpriseserver.cloudmakerenterpriseserverazuredeployment.60b0c2bb-66cb-4284-9482-543cef6da436": [ "1.0.4", - "1.0.5" + "1.0.5", + "1.0.6", + "1.0.7", + "1.0.8", + "1.0.9" ], "cloudmaker.cloudmakerenterpriseserver.cloudmakerenterpriseserverazuredeployment.cloudmakerenterpriseserverazuredeployment": [ "1.0.4", - "1.0.5" + "1.0.5", + "1.0.6", + "1.0.7", + "1.0.8", + "1.0.9" ], "cloudmakerazuredeployment": [ "1.0.1", @@ -66086,7 +67080,14 @@ "0.1.8", "0.1.9" ], - "cloudmakerenterpriseserverazuredeployment": ["1.0.4", "1.0.5"], + "cloudmakerenterpriseserverazuredeployment": [ + "1.0.4", + "1.0.5", + "1.0.6", + "1.0.7", + "1.0.8", + "1.0.9" + ], "cloudpup.authenticated-scripts.bash-task.4ab323dd-2404-4b0f-8df2-397cb1a6e7be": [ "1.0.11", "1.0.12", @@ -66733,9 +67734,8 @@ "6.20152.28", "6.20207.2" ], - "cnfsegregationtask": ["22.6.0"], "cobertura-transform": ["0.0.4", "0.0.5", "0.0.7", "0.0.8"], - "code insight scan": ["2.0.0", "2.1.0", "3.1.0"], + "code insight scan": ["2.0.0", "2.1.0", "3.1.0", "3.2.0"], "code-management-mainer": [ "1.0.0", "1.0.2", @@ -68241,7 +69241,8 @@ "1.2.12", "1.2.13", "1.2.14", - "1.2.15" + "1.2.15", + "1.2.16" ], "compile-type-script": ["1.0.0", "1.0.1", "1.0.2", "1.0.3", "1.0.4"], "compileax2012": [ @@ -68328,7 +69329,8 @@ "1.0.1", "2.0.12", "2.0.13", - "3.0.1" + "3.0.1", + "3.0.2" ], "configscannerextensiontask": ["1.2.6", "1.2.7"], "configscannerextntask.configscannerextntask.custom-configscannerextntask.c73bdc71-97d8-454f-9e7c-c53cc918e01b": [ @@ -68918,7 +69920,7 @@ "1.0.6", "1.0.7" ], - "create-annotated-tags": ["0.0.1", "0.0.2", "0.0.3"], + "create-annotated-tags": ["0.0.1", "0.0.2", "0.0.3", "0.0.4"], "create-pull-request": [ "1.0.0", "1.0.1", @@ -69153,7 +70155,9 @@ "1.2.330", "1.2.331", "1.2.334", - "1.2.335" + "1.2.335", + "1.2.344", + "1.2.347" ], "createrelease": ["0.3.17"], "createsastoken": ["1.0.39", "1.0.40", "1.0.41"], @@ -69711,6 +70715,28 @@ "4.0.0" ], "customemail": ["1.0.0", "1.0.1", "1.0.5", "1.0.6", "1.0.7"], + "cygnetinfotech2.build-release-task12345.custom-build-release-task-4twex.75791037-6539-683a-bfa1-a310d82016b8": [ + "2.0.0", + "2.4.0", + "2.5.0", + "2.6.0" + ], + "cygnetinfotech2.build-release-task12345.custom-build-release-task-4twex.twextension": [ + "2.4.0", + "2.5.0", + "2.6.0" + ], + "cygnetinfotech2.build-release-task12345.custom-build-release-task-4twex.twextension12345": [ + "2.0.0" + ], + "cygnetinfotech2.build-release-task12345.custom-build-release-task.75791037-6539-683a-bfa1-a310d82016d3": [ + "2.2.0", + "2.3.0" + ], + "cygnetinfotech2.build-release-task12345.custom-build-release-task.twextension": [ + "2.2.0", + "2.3.0" + ], "cygnetinfotechpvtltd.build-release-task.custom-build-release-task.937e4568-749e-40d0-9778-78156ef133d8": [ "2.0.0", "2.0.1" @@ -69719,6 +70745,14 @@ "2.0.0", "2.0.1" ], + "cygnetinfotechpvtltd1.build-release-task-6tw.custom-build-release-task--6tw.12b85747-ff1c-62e7-9c4b-f49360eea7de": [ + "1.3.1", + "1.3.2" + ], + "cygnetinfotechpvtltd1.build-release-task-6tw.custom-build-release-task--6tw.twextension": [ + "1.3.1", + "1.3.2" + ], "cygnetinfotechpvtltd1.build-release-task-6tw.custom-build-release-task-6tw.34761037-6539-683a-bfa1-a310d82016b8": [ "1.0.0", "1.0.1", @@ -70107,6 +71141,8 @@ "3.1.109", "3.1.131", "3.1.134", + "3.1.465", + "3.1.502", "4.0.371", "4.0.375", "4.0.376", @@ -70137,11 +71173,17 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502", + "6.0.465", + "6.0.502" ], "d06e33c0-b482-48fc-8376-e3623651de01": [ "0.0.1", @@ -70172,7 +71214,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "d07f3415-0818-4108-b90c-d0255f37b7d2": [ "1.0.0", @@ -70262,7 +71306,12 @@ "5.4.35", "5.4.48", "5.4.52", - "5.4.55" + "5.4.55", + "5.4.59", + "5.4.61", + "5.4.62", + "5.4.66", + "5.4.67" ], "d0b32dd5-f8bd-4118-8e66-699ad33189a2": [ "0.0.12", @@ -70368,7 +71417,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "d21cd950-e96a-11e6-a8b4-c728111937ea": ["1.1.1"], "d254e695-b0c1-40f5-b7e5-b5a639114e23": [ @@ -70428,6 +71479,7 @@ ], "d2e221af-671c-4a4c-9f8b-49dc1c77a696": ["1.0.8", "1.2.7", "1.2.9"], "d323ff86-13d8-4453-a664-6bc3c5814f81": ["1.0.0"], + "d33ffb6a-a67c-41d0-bc75-c09695e2be5b": ["0.0.0"], "d353d6a2-e362-4a8f-8d8c-123bfbb71128": ["1.0.0", "1.0.1", "1.0.2"], "d365_accessteamtemplates": [ "1.1.11", @@ -70600,7 +71652,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "d4be1abb-797c-4c72-9a8b-e7940d99989b": [ "1.29.0", @@ -70608,7 +71662,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "d50196e8-a414-4173-8cbb-dc1adfde3d6c": ["0.1.0", "0.1.2"], "d517b492-5437-43ba-904b-cc043948ab1a": [ @@ -70869,6 +71924,7 @@ "1.1.7", "1.1.8" ], + "d555d02e-87ef-4481-8267-10b4a8d9fc0b": ["23.1.0", "23.1.1", "23.1.2"], "d57ab29a-be69-431f-8523-e4bd1b170eb8": [ "1.1.10", "1.1.11", @@ -71222,7 +72278,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "d612a30e-b8e5-33a9-a88c-ad0ab24fc111": [ "1.0.1", @@ -71412,7 +72469,25 @@ "0.2.1900000206", "0.2.1900000210", "0.2.1900000215", - "0.2.1900000228" + "0.2.1900000228", + "0.2.1900000245", + "0.2.1900000250", + "0.2.1900000264", + "0.2.1900000266", + "0.3.1900000278", + "0.3.1900000280", + "0.3.1900000284", + "0.3.1900000290", + "0.3.1900000292", + "0.3.1900000299", + "0.3.1900000300", + "0.3.1900000309", + "0.3.1900000310", + "0.3.1900000319", + "0.3.1900000324", + "0.3.1900000325", + "0.3.1900000326", + "0.3.1900000328" ], "d797ac40-e1b3-4d1f-b665-2f282ca41541": ["21.4.1"], "d7b8f29f-640e-4e08-926b-de4e265b6742": ["0.1.0", "0.1.1", "0.121.0"], @@ -71424,7 +72499,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "d7f8e412-adce-4539-b827-c5c4220e221c": [ "0.0.19", @@ -71613,7 +72690,17 @@ "0.1.33", "0.1.34", "0.1.35", - "0.1.36" + "0.1.36", + "0.1.37", + "0.1.38", + "0.1.39", + "0.1.40", + "0.1.41", + "0.1.42", + "0.1.43", + "0.1.44", + "0.1.45", + "0.1.46" ], "d8ac3c00-0e8b-11e9-a5ae-9f228aba3e18": [ "0.2.0", @@ -71770,7 +72857,8 @@ "2.198.0", "2.203.0", "2.205.0", - "2.210.0" + "2.210.0", + "2.215.0" ], "d96e8c90-0fdd-11e8-a8b1-79ecfcf1be7c": ["1.1.0", "2.1.0"], "d98b873d-cf18-41eb-8ff5-234f14697896": [ @@ -71830,7 +72918,10 @@ "1.13.373", "1.13.377", "1.13.378", - "1.14.404" + "1.14.404", + "1.14.420", + "1.15.453", + "1.16.455" ], "d9a13c87-238a-42db-8e4c-f909672f8425": [ "1.1.14", @@ -71911,7 +73002,8 @@ "0.6.32", "0.7.5", "0.8.10", - "0.8.34" + "0.8.34", + "0.9.19" ], "d9f485b0-136c-11ed-9b51-5d0ee283d142": [ "0.1.0", @@ -72000,7 +73092,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "da327da2-cdb8-4250-b401-4ec8afe36d6c": ["1.0.1"], "da348ff0-8e5d-11e7-a7f2-03f376957963": [ @@ -72062,6 +73156,7 @@ "2.0.3", "3.0.0" ], + "da6e49d9-4357-4fc8-a7fb-5d9206b562e7": ["23.1.0", "23.1.1", "23.1.2"], "da9d5e69-e1b0-4af0-8f4b-a236c0c1d55d": [ "2.0.0", "2.0.3", @@ -72497,7 +73592,9 @@ "1.1.4", "1.1.5", "1.1.6", - "1.1.7" + "1.1.7", + "1.2.1", + "1.2.3" ], "danielmoloney.sysdig-scan-task.sysdig-scan-task.sysdig": [ "0.2.1", @@ -72534,7 +73631,9 @@ "1.1.4", "1.1.5", "1.1.6", - "1.1.7" + "1.1.7", + "1.2.1", + "1.2.3" ], "danielstocker.backup-data-extension.commit-and-push-to-git.06ce3be8-f7a2-43d7-9af3-97e1de71399b": [ "0.1.0", @@ -72930,12 +74029,14 @@ "datadog.datadog-ci.synthetics-application-testing.60b18503-c6d6-4e4b-a6b2-52fc6fb3d525": [ "0.0.1", "0.1.0", - "0.1.1" + "0.1.1", + "0.1.2" ], "datadog.datadog-ci.synthetics-application-testing.syntheticsruntests": [ "0.0.1", "0.1.0", - "0.1.1" + "0.1.1", + "0.1.2" ], "datadog.datadog-monitors.datadog-monitors.22d955d7-1155-4ff0-9c6d-bc3ad8c9f7e7": [ "0.1.21" @@ -72943,6 +74044,22 @@ "datadog.datadog-monitors.datadog-monitors.datadog": ["0.1.21"], "datadogeu": ["0.1.21"], "datadogscheduledowntime": ["0.0.1"], + "datagapsinc.dataops-run-task.custom-utility-task.dataopssuiteruntask": [ + "1.0.0", + "1.0.1", + "1.0.2", + "1.0.3", + "1.0.4", + "1.0.5" + ], + "datagapsinc.dataops-run-task.custom-utility-task.e47e20b5-ac68-471a-8029-bdd473d5ac52": [ + "1.0.0", + "1.0.1", + "1.0.2", + "1.0.3", + "1.0.4", + "1.0.5" + ], "datamigrationtool": [ "0.2.0", "0.2.1", @@ -72964,6 +74081,7 @@ "1.8.1", "1.8.2" ], + "dataopssuiteruntask": ["1.0.0", "1.0.1", "1.0.2", "1.0.3", "1.0.4", "1.0.5"], "datasetdelete": ["1.2.0"], "datasetrefresh": ["1.2.0"], "datasourceoperation": ["0.0.1", "1.0.1"], @@ -74437,51 +75555,130 @@ "dbforgesync": ["1.0.60", "1.1.1"], "dbmaestro-add-objects": ["7.5.0"], "dbmaestro-add-schema": ["7.5.0"], - "dbmaestro-add-tag": ["7.5.0", "21.4.1"], - "dbmaestro-add-tag-type": ["7.5.0", "21.4.1"], - "dbmaestro-apply-label": ["7.5.0", "21.4.1"], - "dbmaestro-backup": ["21.4.1"], - "dbmaestro-build": ["7.5.6", "21.4.1"], + "dbmaestro-add-tag": ["7.5.0", "21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-add-tag-type": ["7.5.0", "21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-apply-label": ["7.5.0", "21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-backup": ["21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-build": ["7.5.6", "21.4.1", "23.1.0", "23.1.1", "23.1.2"], "dbmaestro-build-by-task-ids": ["7.5.0"], - "dbmaestro-build-env-to-version": ["7.5.0", "21.4.1"], - "dbmaestro-cancel-job": ["7.5.0", "21.4.1"], - "dbmaestro-change-schema-password": ["7.5.6", "21.4.1"], + "dbmaestro-build-env-to-version": [ + "7.5.0", + "21.4.1", + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro-cancel-job": ["7.5.0", "21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-change-schema-password": [ + "7.5.6", + "21.4.1", + "23.1.0", + "23.1.1", + "23.1.2" + ], "dbmaestro-check-in": ["7.5.0"], "dbmaestro-check-out": ["7.5.0"], - "dbmaestro-create-manifest-file": ["7.5.9", "21.4.1"], - "dbmaestro-custom-build": ["7.5.6", "21.4.1"], + "dbmaestro-create-manifest-file": [ + "7.5.9", + "21.4.1", + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro-custom-build": ["7.5.6", "21.4.1", "23.1.0", "23.1.1", "23.1.2"], "dbmaestro-custom-build-by-task-ids": ["7.5.0"], - "dbmaestro-delete-project-mapping": ["7.5.0", "21.4.1"], - "dbmaestro-delete-tag": ["7.5.0", "21.4.1"], - "dbmaestro-delete-tag-type": ["7.5.0", "21.4.1"], + "dbmaestro-delete-project": ["23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-delete-project-mapping": [ + "7.5.0", + "21.4.1", + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro-delete-tag": ["7.5.0", "21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-delete-tag-type": [ + "7.5.0", + "21.4.1", + "23.1.0", + "23.1.1", + "23.1.2" + ], "dbmaestro-demote-package": ["7.5.0", "21.4.1"], - "dbmaestro-display-match-schemas": ["7.5.6", "21.4.1"], - "dbmaestro-display-project-mapping": ["7.5.0", "21.4.1"], - "dbmaestro-get-activities": ["21.4.1"], - "dbmaestro-get-backups": ["21.4.1"], - "dbmaestro-get-env-packages": ["7.5.0", "21.4.1"], - "dbmaestro-get-latest": ["7.5.6", "21.4.1"], - "dbmaestro-get-packages": ["21.4.1"], - "dbmaestro-get-project-data": ["21.4.1"], - "dbmaestro-get-roles": ["21.4.1"], - "dbmaestro-get-specific": ["7.5.6", "21.4.1"], - "dbmaestro-get-user-project-roles": ["21.4.1"], - "dbmaestro-package": ["7.5.0", "21.4.1"], - "dbmaestro-pre-check": ["7.5.0", "21.4.1"], - "dbmaestro-pre-check-environment": ["21.4.1"], - "dbmaestro-project-mapping": ["7.5.0", "21.4.1"], + "dbmaestro-display-match-schemas": [ + "7.5.6", + "21.4.1", + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro-display-project-mapping": [ + "7.5.0", + "21.4.1", + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro-export-project": ["23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-get-activities": ["21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-get-backups": ["21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-get-env-packages": [ + "7.5.0", + "21.4.1", + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro-get-latest": ["7.5.6", "21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-get-packages": ["21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-get-project-data": ["21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-get-roles": ["21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-get-specific": ["7.5.6", "21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-get-user-project-roles": ["21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-import-project": ["23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-login": ["23.1.2"], + "dbmaestro-package": ["7.5.0", "21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-pre-check": ["7.5.0", "21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-pre-check-environment": ["21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-project-mapping": [ + "7.5.0", + "21.4.1", + "23.1.0", + "23.1.1", + "23.1.2" + ], "dbmaestro-promote-package": ["7.5.0", "21.4.1"], - "dbmaestro-restore": ["21.4.1"], - "dbmaestro-run-package-dev": ["7.5.6", "21.4.1"], + "dbmaestro-restore": ["21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-run-package-dev": [ + "7.5.6", + "21.4.1", + "23.1.0", + "23.1.1", + "23.1.2" + ], "dbmaestro-set-integration-state": ["7.5.6"], - "dbmaestro-set-version": ["7.5.0", "21.4.1"], - "dbmaestro-sync-permissions": ["21.4.1"], - "dbmaestro-task-rollback": ["7.5.0", "21.4.1"], - "dbmaestro-transfer-package": ["7.5.0", "21.4.1"], - "dbmaestro-update-tag-type-name": ["7.5.0", "21.4.1"], - "dbmaestro-upgrade": ["7.5.0", "21.4.1"], - "dbmaestro-validate": ["7.5.0", "21.4.1"], - "dbmaestro-view-labels": ["7.5.0", "21.4.1"], + "dbmaestro-set-version": ["7.5.0", "21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-sync-permissions": ["21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-task-rollback": ["7.5.0", "21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-transfer-package": [ + "7.5.0", + "21.4.1", + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro-transfer-package-down": ["23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-transfer-package-up": ["23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-update-project": ["23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-update-tag-type-name": [ + "7.5.0", + "21.4.1", + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro-upgrade": ["7.5.0", "21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-validate": ["7.5.0", "21.4.1", "23.1.0", "23.1.1", "23.1.2"], + "dbmaestro-view-labels": ["7.5.0", "21.4.1", "23.1.0", "23.1.1", "23.1.2"], "dbmaestro.dbmaestro-automation-integration-2-4-1.dbmaestro-add-tag-type-utililty-task.4537b95e-61a8-45af-b178-c7e5f86d17b9": [ "21.4.1" ], @@ -74944,7 +76141,460 @@ "dbmaestro.dbmaestro-automation-integration-2-7.dbmaestro-view-labels-utility-task.dbmaestro-view-labels": [ "7.5.0" ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-add-tag-type-utililty-task.49da0505-a53f-46a8-9c14-36ef53457a32": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-add-tag-type-utililty-task.dbmaestro-add-tag-type": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-add-tag-utililty-task.d555d02e-87ef-4481-8267-10b4a8d9fc0b": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-add-tag-utililty-task.dbmaestro-add-tag": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-apply-label-utility-task.12291677-2485-4494-9ee6-8fc1f0b1c2f5": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-apply-label-utility-task.dbmaestro-apply-label": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-backup-release-task.16102e67-5498-4da6-a74a-3f6edab58148": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-backup-release-task.dbmaestro-backup": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-build-build-task.dbmaestro-build": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-build-build-task.e3ea2cf3-557f-4611-ad5a-ad093fea8aa2": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-build-env-to-version-build-task.b520ca01-2912-44ad-9977-caad43d70e66": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-build-env-to-version-build-task.dbmaestro-build-env-to-version": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-cancel-job-utility-task.25dea4be-9073-47c0-8d15-f6d8ac4d9399": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-cancel-job-utility-task.dbmaestro-cancel-job": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-change-schema-password-utility-task.756266d7-4ce1-4522-a934-c08a5e5665f7": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-change-schema-password-utility-task.dbmaestro-change-schema-password": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-create-manifest-file.dbmaestro-create-manifest-file": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-create-manifest-file.f752b241-8fc8-437c-8b19-58ca37c8fac5": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-custom-build-build-task.c1fd831a-3f3e-48f7-8e97-b4462b7bee5a": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-custom-build-build-task.dbmaestro-custom-build": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-delete-project-mapping-utility-task.ad673ad4-77b6-4c54-8a37-21d55d5e880b": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-delete-project-mapping-utility-task.dbmaestro-delete-project-mapping": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-delete-project-utility-task.7ec297dc-e276-4efa-bae7-d4c11e06fcab": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-delete-project-utility-task.dbmaestro-delete-project": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-delete-tag-type-utility-task.b075614e-f76c-485c-a8e0-ad843fad0e36": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-delete-tag-type-utility-task.dbmaestro-delete-tag-type": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-delete-tag-utility-task.a926f430-cee2-4e01-a27b-3b717a2fdc34": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-delete-tag-utility-task.dbmaestro-delete-tag": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-display-match-schemas-utility-task.b1ca1391-e6ee-40f0-b751-cb3fca446451": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-display-match-schemas-utility-task.dbmaestro-display-match-schemas": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-display-project-mapping-utility-task.da6e49d9-4357-4fc8-a7fb-5d9206b562e7": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-display-project-mapping-utility-task.dbmaestro-display-project-mapping": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-export-project-utility-task.18a39101-3589-4644-8f20-898cffeb61d0": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-export-project-utility-task.dbmaestro-export-project": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-activities-task.0c3b6fa3-7234-4332-b743-70a3e776ed04": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-activities-task.dbmaestro-get-activities": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-backups-task.0f0d0489-2b45-4a26-b65f-e6414f9965dd": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-backups-task.dbmaestro-get-backups": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-env-packages-utility-task.dbmaestro-get-env-packages": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-env-packages-utility-task.e372b77b-21a6-4469-b4d9-7abb9d65d53d": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-latest-release-task.8aded5a2-27d8-40cd-86ab-bf0a4ba8770e": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-latest-release-task.dbmaestro-get-latest": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-packages-task.145d2283-1381-4ca9-b6a8-7c57d0b75d9d": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-packages-task.dbmaestro-get-packages": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-project-data-task.2e75c308-cbbc-4e68-b11f-6c985e6a4376": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-project-data-task.dbmaestro-get-project-data": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-roles-task.6de965fa-d4a5-4a42-bbb6-035898549d19": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-roles-task.dbmaestro-get-roles": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-specific-release-task.5ef76ecd-41c5-42a4-9d94-d44314efc517": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-specific-release-task.dbmaestro-get-specific": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-user-project-roles-task.6ccd396f-6642-4079-8653-c20980166070": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-get-user-project-roles-task.dbmaestro-get-user-project-roles": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-import-project-task.c01a83fb-0553-4448-8136-ad7909d8bb33": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-import-project-task.dbmaestro-import-project": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-login-utility-task.285b0614-b6ed-4351-a939-3497730e3814": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-login-utility-task.dbmaestro-login": [ + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-login-utility-task.dbmaestro-sync-permissions": [ + "23.1.0", + "23.1.1" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-package-release-task.dbmaestro-package": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-package-release-task.dc1d078b-b016-4673-99db-260dbf816928": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-pre-check-environment-task.b0dccc97-764d-49e2-ae58-c1df071fea3f": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-pre-check-environment-task.dbmaestro-pre-check-environment": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-pre-check-release-task.656977f5-2a08-4e85-b67b-eaea60b44c76": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-pre-check-release-task.dbmaestro-pre-check": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-project-mapping-utility-task.b2b7480c-7f29-4afe-a33d-23c0d452470f": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-project-mapping-utility-task.dbmaestro-project-mapping": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-run-package-dev-release-task.b6fd383d-fc98-405d-a98a-37a161e7cc9b": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-run-package-dev-release-task.dbmaestro-run-package-dev": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-set-version-utility-task.914acf0d-6c0a-444b-a2ad-3c7f8fa397d0": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-set-version-utility-task.dbmaestro-set-version": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-sync-permissions-task.4eb92e59-8cf6-4b5a-b679-0484a99549ee": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-sync-permissions-task.dbmaestro-sync-permissions": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-task-restore-release-task.a7f5b121-015f-4a44-bb0e-17ab853e6e64": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-task-restore-release-task.dbmaestro-restore": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-task-rollback-release-task.8d20bedf-7996-4cbb-b6f8-53b1dd6b8d9a": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-task-rollback-release-task.dbmaestro-task-rollback": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-transfer-package-down-task.98fee4ab-6711-4399-a8c7-c6a2227d0f10": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-transfer-package-down-task.dbmaestro-transfer-package-down": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-transfer-package-release-task.3123867b-41b3-46b8-b5bb-8af6d48224da": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-transfer-package-release-task.dbmaestro-transfer-package": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-transfer-package-up-task.9fd78d2c-92ed-4734-8b23-ed7d87208c63": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-transfer-package-up-task.dbmaestro-transfer-package-up": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-update-project-task.29dfa0b0-3e4d-408b-9786-859ef8516c28": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-update-project-task.dbmaestro-update-project": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-update-tag-type-name-utility-task.dbmaestro-update-tag-type-name": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-update-tag-type-name-utility-task.f64be191-5efa-4241-8523-b39f37422433": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-upgrade-release-task.dbmaestro-upgrade": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-upgrade-release-task.fe449bb0-b977-42ec-9876-ae9629b5d1ea": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-validate-release-task.3c1dd330-7675-4b14-b528-f982232e4727": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-validate-release-task.dbmaestro-validate": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-view-labels-utility-task.7af26d69-0154-45e2-8a1c-ca0325aac951": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], + "dbmaestro.dbmaestro-automation-integration-23-1-3.dbmaestro-view-labels-utility-task.dbmaestro-view-labels": [ + "23.1.0", + "23.1.1", + "23.1.2" + ], "dbojsendatafactorydeployment": ["0.9.5", "0.9.7"], + "dc1d078b-b016-4673-99db-260dbf816928": ["23.1.0", "23.1.1", "23.1.2"], "dc28e910-44e2-4c2a-9c2a-1eb72b891d68": [ "0.1.0", "0.2.0", @@ -75053,6 +76703,7 @@ "4.1.2" ], "dc430740-1c3a-11e6-83ce-6ba349ca8939": ["0.1.67", "0.1.68"], + "dc642a62-e5cc-49d4-8017-a0b76dd6e04b": ["0.0.0"], "dc66d2f0-a7ba-11e5-ae62-3deab86d85e3": ["0.1.1", "0.2.0"], "dc81d3d1-de91-4433-ad96-b1c83e7ba74f": [ "1.1.76", @@ -75449,7 +77100,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "dd5ff920-784e-4906-83ce-459e1cf8ad82": ["21.4.1"], "dd862edc-5d88-4d2c-b83b-fff2a695e5c0": [ @@ -75477,7 +77129,9 @@ "2.0.15", "2.0.16", "2.0.17", - "2.0.18" + "2.0.18", + "2.0.19", + "2.0.20" ], "dd88f622-7838-44dc-96d6-2372af78775b": ["1.0.2", "1.0.8"], "ddcc8973-36eb-47fb-8d52-0ac405ef1d65": ["1.0.3"], @@ -75525,7 +77179,17 @@ "0.1.33", "0.1.34", "0.1.35", - "0.1.36" + "0.1.36", + "0.1.37", + "0.1.38", + "0.1.39", + "0.1.40", + "0.1.41", + "0.1.42", + "0.1.43", + "0.1.44", + "0.1.45", + "0.1.46" ], "de4be6e2-9c1e-4ae3-9a7e-6854f719bcc3": ["1.0.0"], "de5a1d00-15b4-4678-ad73-b1d8717ea69b": [ @@ -76578,6 +78242,28 @@ "4.0.1002", "4.0.1007" ], + "deepcrawl.lumar-protect-tools.run-lumar-protect-build-task.281f6ba9-3d8f-425d-b63b-86479427ab39": [ + "1.1.0", + "1.1.1", + "1.1.2", + "1.1.3", + "1.1.4", + "1.1.5", + "1.1.6", + "1.1.7", + "1.1.8" + ], + "deepcrawl.lumar-protect-tools.run-lumar-protect-build-task.run-lumar-protect-build-task": [ + "1.1.0", + "1.1.1", + "1.1.2", + "1.1.3", + "1.1.4", + "1.1.5", + "1.1.6", + "1.1.7", + "1.1.8" + ], "def84f71-43aa-4905-b44d-4da5fef782a2": [ "0.1.0", "0.1.1", @@ -76891,6 +78577,7 @@ ], "deltafilecopy": ["1.0.1", "1.0.23", "1.0.24", "1.0.25"], "demo": ["1.0.0"], + "demobuild": ["1.0.5"], "denisporotikov.yandex-disk-publish-build-release-task.yandex-disk-publish-build-release-task.bebb32ce-c324-4bfe-a928-0da040edfcff": [ "0.1.0", "0.5.6", @@ -76905,6 +78592,30 @@ "0.5.8", "0.5.9" ], + "denisrumyantsev.google-play-20230124.google-play-promote.20230124-29d3-482f-97d5-e3189a8347c2": [ + "3.211.1" + ], + "denisrumyantsev.google-play-20230124.google-play-promote.googleplaypromote20230124": [ + "3.211.1" + ], + "denisrumyantsev.google-play-20230124.google-play-release.20230124-620b-11e5-b4cf-8565e60f4d27": [ + "4.217.0" + ], + "denisrumyantsev.google-play-20230124.google-play-release.googleplayrelease20230124": [ + "4.217.0" + ], + "denisrumyantsev.google-play-20230124.google-play-rollout-update.20230124-4e17-4244-b0fb-f540cea78153": [ + "2.211.0" + ], + "denisrumyantsev.google-play-20230124.google-play-rollout-update.googleplayincreaserollout20230124": [ + "2.211.0" + ], + "denisrumyantsev.google-play-20230124.google-play-status-update.20230124-4193-44e5-9db7-58d7d253f4d8": [ + "2.211.0" + ], + "denisrumyantsev.google-play-20230124.google-play-status-update.googleplaystatusupdate20230124": [ + "2.211.0" + ], "denodownload": ["1.0.0"], "denorun": ["1.0.0"], "dependabot": [ @@ -76964,7 +78675,10 @@ "1.13.373", "1.13.377", "1.13.378", - "1.14.404" + "1.14.404", + "1.14.420", + "1.15.453", + "1.16.455" ], "dependency-check-build-task": [ "5.2.1000", @@ -77163,7 +78877,10 @@ "0.15.1239", "0.15.1261", "0.23.1279", - "0.24.1281" + "0.24.1281", + "0.25.1302", + "0.26.1308", + "0.27.1315" ], "deployartifactswithpnp": [ "1.1.31", @@ -77401,7 +79118,8 @@ "2.0.4", "2.0.5", "2.0.6", - "22.6.0" + "22.6.0", + "23.2.0" ], "deploytoazureanalysisservices": ["1.0.0", "1.0.1", "1.0.2"], "deprecatedgooglecloudsdkinstaller": ["0.5.0"], @@ -77544,7 +79262,25 @@ "0.2.1900000206", "0.2.1900000210", "0.2.1900000215", - "0.2.1900000228" + "0.2.1900000228", + "0.2.1900000245", + "0.2.1900000250", + "0.2.1900000264", + "0.2.1900000266", + "0.3.1900000278", + "0.3.1900000280", + "0.3.1900000284", + "0.3.1900000290", + "0.3.1900000292", + "0.3.1900000299", + "0.3.1900000300", + "0.3.1900000309", + "0.3.1900000310", + "0.3.1900000319", + "0.3.1900000324", + "0.3.1900000325", + "0.3.1900000326", + "0.3.1900000328" ], "devcontainers.ci.devcontainersci.devcontainersci": [ "0.2.1900000143", @@ -77556,7 +79292,25 @@ "0.2.1900000206", "0.2.1900000210", "0.2.1900000215", - "0.2.1900000228" + "0.2.1900000228", + "0.2.1900000245", + "0.2.1900000250", + "0.2.1900000264", + "0.2.1900000266", + "0.3.1900000278", + "0.3.1900000280", + "0.3.1900000284", + "0.3.1900000290", + "0.3.1900000292", + "0.3.1900000299", + "0.3.1900000300", + "0.3.1900000309", + "0.3.1900000310", + "0.3.1900000319", + "0.3.1900000324", + "0.3.1900000325", + "0.3.1900000326", + "0.3.1900000328" ], "devcontainersci": [ "0.2.1900000143", @@ -77568,7 +79322,25 @@ "0.2.1900000206", "0.2.1900000210", "0.2.1900000215", - "0.2.1900000228" + "0.2.1900000228", + "0.2.1900000245", + "0.2.1900000250", + "0.2.1900000264", + "0.2.1900000266", + "0.3.1900000278", + "0.3.1900000280", + "0.3.1900000284", + "0.3.1900000290", + "0.3.1900000292", + "0.3.1900000299", + "0.3.1900000300", + "0.3.1900000309", + "0.3.1900000310", + "0.3.1900000319", + "0.3.1900000324", + "0.3.1900000325", + "0.3.1900000326", + "0.3.1900000328" ], "devcreateblueprint": ["1.4.0"], "devenvbuild": ["1.2.0", "2.0.3", "2.0.4", "2.0.5"], @@ -77890,7 +79662,8 @@ "1.2.0", "1.3.0", "1.4.0", - "1.5.0" + "1.5.0", + "1.6.0" ], "digicert.ssm-client-tools-extension.ssm-client-tools-task.ssmclienttoolssetup": [ "0.54.0", @@ -77939,7 +79712,8 @@ "1.2.0", "1.3.0", "1.4.0", - "1.5.0" + "1.5.0", + "1.6.0" ], "digicert.ssm-client-tools-extension.ssm-signing-tools-task.63dc66e6-daa5-4c1c-97f2-4312143a6d6d": [ "0.54.0", @@ -77988,7 +79762,8 @@ "1.2.0", "1.3.0", "1.4.0", - "1.5.0" + "1.5.0", + "1.6.0" ], "digicert.ssm-client-tools-extension.ssm-signing-tools-task.ssmsigningtoolssetup": [ "0.54.0", @@ -78037,7 +79812,8 @@ "1.2.0", "1.3.0", "1.4.0", - "1.5.0" + "1.5.0", + "1.6.0" ], "digitalmedia34.updateconfig.updateconfig-task.a0515ec8-6254-5ffd-932c-86772e2b5960": [ "1.2.1", @@ -78367,6 +80143,64 @@ "2.0.6" ], "displayappcheckvulns": ["0.1.0"], + "distniem": ["0.1.2"], + "distniemanuel.7e2b45ad-7bd8-4319-b713-1cc0be255275.buildtask.09d98ca8-a315-431a-bcb4-30c9c6d140ab": [ + "1.0.5", + "1.0.6", + "1.0.9", + "1.0.10", + "1.0.11", + "1.0.12", + "1.0.13" + ], + "distniemanuel.7e2b45ad-7bd8-4319-b713-1cc0be255275.buildtask.azurepullrequest": [ + "1.0.5", + "1.0.6", + "1.0.9", + "1.0.10", + "1.0.11" + ], + "distniemanuel.7e2b45ad-7bd8-4319-b713-1cc0be255275.buildtask.azurepullrequest1": [ + "1.0.12" + ], + "distniemanuel.7e2b45ad-7bd8-4319-b713-1cc0be255275.buildtask.azurepullrequest2": [ + "1.0.13" + ], + "distniemanuel.7e2b45ad-7bd8-4319-b713-1cc0be255275.buildtask.demobuild": [ + "1.0.5" + ], + "distniemanuel.7e2b45ad-7bd8-4319-b713-1cc0be255275.releasetask.81e2f045-dfc5-4c2b-8ef0-a6221324c281": [ + "1.0.5" + ], + "distniemanuel.7e2b45ad-7bd8-4319-b713-1cc0be255275.releasetask.azurepullrequest": [ + "1.0.5" + ], + "distniemanuel.7e2b45ad-7bd8-4319-b713-1cc0be255275.releasetask.demobuild": [ + "1.0.5" + ], + "distniemanuel.7e2b45ad-7bd8-4319-b713-1cc0be255275.testtask.67795a29-e3af-4b09-b08b-67f48a1593d7": [ + "1.0.5" + ], + "distniemanuel.7e2b45ad-7bd8-4319-b713-1cc0be255275.testtask.azurepullrequest": [ + "1.0.5" + ], + "distniemanuel.7e2b45ad-7bd8-4319-b713-1cc0be255275.testtask.demobuild": [ + "1.0.5" + ], + "distniemanuel.build-release-task.custom-build-release-task.9155350c-422e-44a7-8d98-ed28e4bb8649": [ + "0.1.0" + ], + "distniemanuel.build-release-task.custom-build-release-task.buildandreleasetask": [ + "0.1.0" + ], + "distniemanuel.distniem.passwordgenerator.distniem": ["0.1.2"], + "distniemanuel.distniem.passwordgenerator.ead7a03c-bef1-4d26-b2cb-f03a9eae1041": [ + "0.1.2" + ], + "distniemanuel.distnietest.passwordgenerator.0e968cb0-6bce-11eb-8577-cd64038e734a": [ + "0.1.1" + ], + "distniemanuel.distnietest.passwordgenerator.passwordgenerator": ["0.1.1"], "distribution": [ "1.12.0", "1.12.1", @@ -78954,7 +80788,8 @@ "2.202.0", "2.208.0", "2.208.1", - "2.210.0" + "2.210.0", + "2.217.0" ], "dotnetcoreinstaller-sxs": [ "0.198.0", @@ -79590,7 +81425,8 @@ "1.1.17", "1.1.19", "1.1.20", - "1.1.21" + "1.1.21", + "1.1.23" ], "drmueller2.nugetvulnerabilityscan.nugetvulnerabilityscantask.nugetvulnerabilityscantask": [ "1.0.31", @@ -79615,7 +81451,8 @@ "1.1.17", "1.1.19", "1.1.20", - "1.1.21" + "1.1.21", + "1.1.23" ], "dropmodelstoreax2012": ["0.0.2", "0.0.3"], "droptabularmodeltask": [ @@ -79911,7 +81748,10 @@ "1.0.2", "1.0.3", "1.0.4", - "1.0.5" + "1.0.5", + "1.1.0", + "1.2.0", + "1.2.1" ], "durablefunctionsmonitor.az-func-as-a-graph-do-extension.custom-build-release-task.az-func-as-a-graph": [ "0.1.0", @@ -79941,7 +81781,10 @@ "1.0.2", "1.0.3", "1.0.4", - "1.0.5" + "1.0.5", + "1.1.0", + "1.2.0", + "1.2.1" ], "durgaprasadkatari.datamover.datamover.62c7427a-86cc-4f72-b02e-8056c6c8ea29": [ "1.2.0", @@ -80622,10 +82465,12 @@ "1.0.1239020" ], "dyn365finops.regression-suite-automation-tool-tasks.rsat-task.bad9770c-4811-4fb9-801b-650a6966f454": [ - "1.0.2" + "1.0.2", + "1.0.3" ], "dyn365finops.regression-suite-automation-tool-tasks.rsat-task.rsat": [ - "1.0.2" + "1.0.2", + "1.0.3" ], "dynamics365dataexporter": [ "0.8.0", @@ -80648,8 +82493,6 @@ "0.15.0", "0.16.0" ], - "dynamics365foimportdataviaodata": ["1.0.0", "2.2.0", "3.1.0", "4.1.0"], - "dynamics365forundevopsorchestrator": ["1.1.0", "2.2.0", "3.1.0", "4.1.0"], "dynasist.al-studio-devops.al-studio-docs-task.08210a50-6dfe-42f9-84cb-09d40306178e": [ "0.1.0", "1.0.0", @@ -80854,6 +82697,7 @@ "1.6.29" ], "e13091f0-44d7-4891-bf4a-a73e09231422": ["0.0.8"], + "e1455b3d-5dba-4397-9ed5-0be6bdc23907": ["0.1.0"], "e1504e83-b561-4513-b504-669af78404a1": [ "1.0.2", "1.0.3", @@ -80955,7 +82799,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "e243a9dd-eec9-4968-a5d2-ebf26fd89b18": ["3.0.37"], "e2450612-3a85-413e-8ab6-a4098bf5bebe": [ @@ -80996,7 +82841,13 @@ "1.1.69", "2.0.0" ], - "e2a81a06-bb2a-4223-97b4-9e09b0cfed73": ["1.0.0", "1.5.0", "1.6.0", "1.7.0"], + "e2a81a06-bb2a-4223-97b4-9e09b0cfed73": [ + "1.0.0", + "1.5.0", + "1.6.0", + "1.7.0", + "1.8.0" + ], "e2caf987-8880-4b83-a747-33ff81cccc28": [ "0.0.3", "0.0.4", @@ -81063,6 +82914,9 @@ "0.9.13", "0.9.14", "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2", "1.0.0" ], "e32cef69-9959-488f-8820-afbc87c8a726": [ @@ -81096,6 +82950,7 @@ "0.1.5", "0.1.6" ], + "e372b77b-21a6-4469-b4d9-7abb9d65d53d": ["23.1.0", "23.1.1", "23.1.2"], "e3afaac5-bb5b-4435-9a1d-640552aa018c": ["0.2.32"], "e3b19710-626e-11e6-865c-3771efe12c4b": ["0.6.0", "0.7.1", "0.7.2", "0.7.3"], "e3e21af7-e370-4e5b-8b96-0554ee25a60d": ["0.1.0"], @@ -81121,6 +82976,7 @@ "3.1.1", "3.1.2" ], + "e3ea2cf3-557f-4611-ad5a-ad093fea8aa2": ["23.1.0", "23.1.1", "23.1.2"], "e42cbc98-47bd-48a7-8da5-258698afc839": [ "0.1.9", "0.2.1", @@ -81219,7 +83075,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "e47c77ac-a316-45ce-bb10-5932158c7af4": [ "0.0.1", @@ -81252,6 +83109,14 @@ "1.0.77" ], "e47c77ac-a316-45ce-bb10-5932158c7af6": ["1.0.86", "1.0.87", "1.0.88"], + "e47e20b5-ac68-471a-8029-bdd473d5ac52": [ + "1.0.0", + "1.0.1", + "1.0.2", + "1.0.3", + "1.0.4", + "1.0.5" + ], "e4859781-ffd4-4e1d-80b4-08f7663fac07": [ "1.0.1", "1.0.3", @@ -81303,7 +83168,7 @@ "0.1.30" ], "e4be9ef8-2b4b-4630-b263-ee06af231b31": ["0.1.7", "0.1.8", "0.1.9"], - "e4c104ab-0d8d-4f79-9cdb-4687df347558": ["22.6.0"], + "e4c104ab-0d8d-4f79-9cdb-4687df347558": ["22.6.0", "23.2.0"], "e4d7a958-82c3-4b55-94da-4ff052cdf119": ["0.0.1", "0.0.3", "0.0.4", "0.0.5"], "e4e2625a-f2ba-4f03-a0d4-985103b3c746": ["1.0.1", "1.0.2", "1.0.3"], "e4e76c18-202b-43d8-bd49-e48623290ad2": [ @@ -81452,6 +83317,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -81462,7 +83330,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "e59c5ae6-3afd-479d-bc40-81cd6c541840": [ "1.0.30", @@ -81514,7 +83385,10 @@ "1.46.7", "2.0.3", "2.0.5", - "2.2.2" + "2.2.2", + "2.3.5", + "2.4.2", + "2.5.2" ], "e5bd7351-5d7f-4e5c-a0bc-7341f9c4962b": [ "0.2.0", @@ -81798,7 +83672,8 @@ "0.0.5", "0.0.6", "0.0.7", - "0.1.2" + "0.1.2", + "0.1.3" ], "e7dd893b-1cff-4d8a-a92a-a6ff49fc69fa": ["1.0.1"], "e7e6f2ae-fe5e-4191-9fd3-dbd811fa72e6": [ @@ -82202,7 +84077,13 @@ ], "e94e50f1-f06a-4d82-b20f-2978bd5e3c45": ["1.0.0", "1.1.0", "1.1.1", "1.1.2"], "e96c7e8c-aca1-4eaa-ac86-78e0d639e81f": ["3.0.37"], - "e96f8bf8-2b84-49a1-a98d-33eb4c6f50f5": ["1.0.0", "1.0.5", "1.1.0"], + "e96f8bf8-2b84-49a1-a98d-33eb4c6f50f5": [ + "1.0.0", + "1.0.5", + "1.1.0", + "2.0.0", + "2.0.1" + ], "e96fd8a2-8a8e-4ff3-9d3e-1685f2d0abee": ["0.1.0"], "e9997d32-b64a-4191-9c2d-cc601355b8a0": ["1.0.1"], "e99e48ac-8011-45ca-aa36-fc2cec54ecfb": [ @@ -82419,7 +84300,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "ea42b06e-b052-4e88-bdc7-751acf970077": [ "0.1.1", @@ -82494,6 +84376,7 @@ "3.0.11" ], "ead167ff-f0e0-47c1-84dd-ea323adaa50c": ["1.0.3"], + "ead7a03c-bef1-4d26-b2cb-f03a9eae1041": ["0.1.2"], "ead9d330-9d2a-11e6-9e8e-658cd6b52ad6": [ "0.1.1", "0.1.2", @@ -82548,7 +84431,8 @@ "1.2.1", "2.0.12", "2.0.13", - "3.0.1" + "3.0.1", + "3.0.2" ], "ebd685fe-1b2d-4b7f-aaad-002ecec338b7": [ "8.2.1", @@ -82663,7 +84547,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "ec28b8f3-7c9c-4465-85b7-1b1f2de7b48e": [ "1.4.0", @@ -82699,7 +84584,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "ec87c253-756f-4a7a-be91-4f1c60f9d8fe": [ "1.0.14", @@ -82737,7 +84623,10 @@ "0.15.1239", "0.15.1261", "0.23.1279", - "0.24.1281" + "0.24.1281", + "0.25.1302", + "0.26.1308", + "0.27.1315" ], "ececba64-5712-469e-a07a-29774f35f206": ["1.0.0"], "ecf83a43-ce18-4aa1-9b89-6c6a68619a18": [ @@ -82951,7 +84840,9 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "2.11.3445511", + "3.0.3517186" ], "edee4d57-fd49-466b-bfc3-1cbba4e8c24a": [ "0.0.1", @@ -83098,6 +84989,12 @@ "1.6.0", "2.1.0" ], + "ef33e496-05b4-4e5d-ba93-7e3ae477d9ca": [ + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" + ], "ef5ba6df-1dec-49c8-aeda-15bfdb6f6d56": ["9.0.5", "12.0.6"], "ef6e39d1-dbac-47e0-8c6b-f5735aaa4096": [ "0.5.1", @@ -85081,7 +86978,17 @@ "0.1.33", "0.1.34", "0.1.35", - "0.1.36" + "0.1.36", + "0.1.37", + "0.1.38", + "0.1.39", + "0.1.40", + "0.1.41", + "0.1.42", + "0.1.43", + "0.1.44", + "0.1.45", + "0.1.46" ], "evit15.evit15-build-release-task.generate-test-run.generate-test-run": [ "0.1.0", @@ -85117,7 +87024,17 @@ "0.1.33", "0.1.34", "0.1.35", - "0.1.36" + "0.1.36", + "0.1.37", + "0.1.38", + "0.1.39", + "0.1.40", + "0.1.41", + "0.1.42", + "0.1.43", + "0.1.44", + "0.1.45", + "0.1.46" ], "evit15.evit15-build-release-task.set-automation-status.de0c2390-25d1-4610-ad6d-9bb4b7a7f1f3": [ "0.1.11", @@ -85145,7 +87062,17 @@ "0.1.33", "0.1.34", "0.1.35", - "0.1.36" + "0.1.36", + "0.1.37", + "0.1.38", + "0.1.39", + "0.1.40", + "0.1.41", + "0.1.42", + "0.1.43", + "0.1.44", + "0.1.45", + "0.1.46" ], "evit15.evit15-build-release-task.set-automation-status.set-automation-status": [ "0.1.11", @@ -85173,7 +87100,17 @@ "0.1.33", "0.1.34", "0.1.35", - "0.1.36" + "0.1.36", + "0.1.37", + "0.1.38", + "0.1.39", + "0.1.40", + "0.1.41", + "0.1.42", + "0.1.43", + "0.1.44", + "0.1.45", + "0.1.46" ], "evit15.evit15-build-release-task.set-test-run-status.d8ac0cf9-4bd7-4148-b59b-82fac6393f9e": [ "0.1.9", @@ -85203,7 +87140,17 @@ "0.1.33", "0.1.34", "0.1.35", - "0.1.36" + "0.1.36", + "0.1.37", + "0.1.38", + "0.1.39", + "0.1.40", + "0.1.41", + "0.1.42", + "0.1.43", + "0.1.44", + "0.1.45", + "0.1.46" ], "evit15.evit15-build-release-task.set-test-run-status.set-test-run-status": [ "0.1.9", @@ -85233,7 +87180,17 @@ "0.1.33", "0.1.34", "0.1.35", - "0.1.36" + "0.1.36", + "0.1.37", + "0.1.38", + "0.1.39", + "0.1.40", + "0.1.41", + "0.1.42", + "0.1.43", + "0.1.44", + "0.1.45", + "0.1.46" ], "evysolutionsgmbh.git-tag-version.custom-git-tag-version.f3da490b-e193-425e-aa92-0adcf0139819": [ "1.0.0", @@ -86932,7 +88889,7 @@ "1.4.0", "1.5.0" ], - "extrateststask": ["22.6.0"], + "extrateststask": ["22.6.0", "23.2.0"], "eyalyovel.eyal-tasks.sod-main.a615cd40-5e41-11e5-bee7-bd6eddb93244": [ "0.2.0" ], @@ -87264,7 +89221,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "f12486d0-7d09-11e7-b6b2-091599e20064": [ "0.0.9", @@ -87297,7 +89256,8 @@ "3.1.6", "3.2.0", "3.2.1", - "3.2.2" + "3.2.2", + "3.2.3" ], "f181fab3-e4a9-4f75-9c59-610e1774ee3d": [ "1.0.3", @@ -87559,7 +89519,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "f3da490b-e193-425e-aa92-0adcf0139819": ["1.0.0", "1.1.0", "1.1.1", "1.1.2"], "f3e19d34-4767-42fe-ae2d-971e6c5b1850": ["999.9.1"], @@ -87616,7 +89578,7 @@ "1.0.19", "1.0.20" ], - "f48f2638-81c8-477c-bf62-2b0d870be21f": ["1.0.0"], + "f48f2638-81c8-477c-bf62-2b0d870be21f": ["1.0.0", "1.1.0"], "f4c04016-bb3f-4614-b978-ce92409ce78a": [ "1.432.1656", "1.433.1659", @@ -87715,7 +89677,9 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "2.11.3445511", + "3.0.3517186" ], "f4e98b01-a1a2-45c5-a210-4cc164d972bf": ["1.188.0"], "f4fa7c4e-d870-438a-bf2f-552638cfb7a3": [ @@ -87744,7 +89708,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "f5384bf0-1b5c-11ea-b0cc-5b064956a213": [ "1.0.0", @@ -87929,6 +89896,7 @@ ], "f63a7f0b-a432-4b2b-8ec3-a2a9e089cdf2": ["9.0.4", "12.0.5"], "f63afbd3-a43d-481e-bc66-179141753981": ["1.0.0"], + "f64be191-5efa-4241-8523-b39f37422433": ["23.1.0", "23.1.1", "23.1.2"], "f64d3db3-f19a-41dd-bdb8-f8f0e60a4bb1": [ "8.0.0", "8.0.1", @@ -87994,6 +89962,7 @@ "f702cbfe-5cee-4adc-9a79-cfb9b0679231": ["1.0.3", "2.0.3"], "f702cbfe-5cee-4adc-9a79-cfb9b06792a5": ["0.0.2", "0.0.3"], "f71cf7ec-cc2e-4d4c-b93d-e21e142ae2cf": ["1.0.0"], + "f752b241-8fc8-437c-8b19-58ca37c8fac5": ["23.1.0", "23.1.1", "23.1.2"], "f759bd8d-4303-4888-b473-3154b28879d2": [ "0.4.4", "0.4.5", @@ -88080,6 +90049,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -88090,7 +90062,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "f7c56e2a-d1f1-4cff-b5d3-a32c9516c6e0": ["0.0.1", "0.0.2"], "f7cb8f80-5e35-11e7-8723-9bcb094935b3": ["1.0.0", "1.0.3"], @@ -88123,7 +90098,14 @@ "1.1.0", "1.1.1" ], - "f8b65b7d-54e2-4ab4-aeeb-ca3db08cc6ed": ["1.0.0", "1.0.2"], + "f8b65b7d-54e2-4ab4-aeeb-ca3db08cc6ed": [ + "1.0.0", + "1.0.2", + "1.0.3", + "1.0.4", + "1.0.6", + "1.0.7" + ], "f8b8adae-fba9-45d0-8092-d55b509b8d19": [ "1.0.2", "1.0.4", @@ -88270,7 +90252,10 @@ "1.0.9", "1.0.10", "1.0.11", - "1.0.12" + "1.0.12", + "1.0.13", + "1.0.14", + "1.0.15" ], "f91a591f-e382-4256-9b70-3a114f4f638a": [ "0.0.12", @@ -88500,7 +90485,8 @@ "2.0.9", "2.0.10", "2.0.11", - "2.0.12" + "2.0.12", + "2.0.13" ], "fabce42f-1d38-4004-a1ec-49c90d18e8ea": [ "0.9.0", @@ -88513,34 +90499,6 @@ "0.9.10", "0.9.11" ], - "fabseven.d365fonuggetmanagementtoolsv2.taskimportconfigurations.72dfa944-c991-4332-a81e-71186e4fca9c": [ - "1.0.0", - "2.2.0", - "3.1.0", - "4.1.0" - ], - "fabseven.d365fonuggetmanagementtoolsv2.taskimportconfigurations.dynamics365foimportdataviaodata": [ - "1.0.0", - "2.2.0", - "3.1.0", - "4.1.0" - ], - "fabseven.d365fonuggetmanagementtoolsv2.taskrunnuggetconfigurations.4fe0dbab-291a-4006-ac04-ca63b9550410": [ - "1.0.0", - "1.1.0", - "2.2.0", - "3.1.0", - "4.1.0" - ], - "fabseven.d365fonuggetmanagementtoolsv2.taskrunnuggetconfigurations.dynamics365foimportdataviaodata": [ - "1.0.0" - ], - "fabseven.d365fonuggetmanagementtoolsv2.taskrunnuggetconfigurations.dynamics365forundevopsorchestrator": [ - "1.1.0", - "2.2.0", - "3.1.0", - "4.1.0" - ], "facbe5c0-4767-4288-b2cd-79e9b955a68f": [ "0.1.0", "1.0.0", @@ -88701,7 +90659,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "fb61ed1d-442b-4018-bb46-e54afe16e262": ["1.0.3", "1.0.4"], "fb692f50-03a7-44cf-9110-2a943afeb976": [ @@ -89240,7 +91200,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "fd593137-89b4-4d81-82f1-c098c1343e0a": [ "1.1.0", @@ -89330,7 +91291,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "fd5fe5df-92fb-4dfc-814b-3887c6e28510": [ "0.0.1", @@ -89365,7 +91327,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "fdc8b8d4-78d6-4330-9299-3385f706a758": ["1.0.0", "1.1.0", "1.2.0"], "fdfb7a1e-10ca-4003-9e07-a568a2ee9c0b": [ @@ -89397,6 +91360,7 @@ ], "fe0d5b93-4223-46cd-b031-6d5b0a637d8f": ["9.0.4", "12.0.5"], "fe23a1da-48da-418d-a547-baf81f9d7f70": ["1.188.0"], + "fe449bb0-b977-42ec-9876-ae9629b5d1ea": ["23.1.0", "23.1.1", "23.1.2"], "fe504acc-6115-40cb-89ff-191386b5e7bf": [ "0.0.104", "0.0.134", @@ -89415,6 +91379,8 @@ "0.202.17", "0.202.18", "0.202.19", + "0.202.20", + "0.202.21", "0.203.0", "2.188.0", "2.188.1", @@ -89426,10 +91392,16 @@ "2.202.17", "2.202.18", "2.202.19", + "2.202.20", + "2.202.21", "2.203.0", "3.201.17", "3.201.18", - "3.209.19" + "3.209.19", + "3.209.20", + "3.209.21", + "4.218.20", + "4.218.21" ], "fe725709-3b76-4504-8d6a-a280c20d6ef3": [ "0.0.1", @@ -90448,7 +92420,8 @@ "2.0.27192", "2.0.27255", "2.0.27445", - "3.0.46092" + "3.0.46092", + "4.0.84386" ], "forte-digital.smoketestertask.smoketestertask.smoketester": [ "1.0.1", @@ -90522,7 +92495,8 @@ "2.0.27192", "2.0.27255", "2.0.27445", - "3.0.46092" + "3.0.46092", + "4.0.84386" ], "fortify on demand reporting": [ "0.0.1", @@ -90624,9 +92598,10 @@ "8.2.0", "8.3.0", "8.5.0", - "8.6.0" + "8.6.0", + "8.7.0" ], - "fortifyqualitygate": ["1.0.7", "1.0.16", "2.0.2"], + "fortifyqualitygate": ["1.0.7", "1.0.16", "2.0.2", "2.0.3", "2.0.4"], "fortifysca": [ "1.10.0", "1.11.0", @@ -90820,7 +92795,8 @@ "8.2.0", "8.3.0", "8.5.0", - "8.6.0" + "8.6.0", + "8.7.0" ], "fortifyvsts.hpe-security-fortify-vsts.build-task-fortify-on-demand-static.fortifyondemandstatic": [ "1.10.0", @@ -90856,7 +92832,8 @@ "8.2.0", "8.3.0", "8.5.0", - "8.6.0" + "8.6.0", + "8.7.0" ], "fortifyvsts.hpe-security-fortify-vsts.build-task-fortify-sca-install.818386e5-c8a5-46c3-822d-954b3c8fb131": [ "1.10.0", @@ -91524,12 +93501,16 @@ "gbnz.redis-cache-clear.rediscacheaddkey-release-task.e96f8bf8-2b84-49a1-a98d-33eb4c6f50f5": [ "1.0.0", "1.0.5", - "1.1.0" + "1.1.0", + "2.0.0", + "2.0.1" ], "gbnz.redis-cache-clear.rediscacheaddkey-release-task.rediscacheaddkey": [ "1.0.0", "1.0.5", - "1.1.0" + "1.1.0", + "2.0.0", + "2.0.1" ], "gbnz.redis-cache-clear.rediscacheclear-release-task.f93c2512-0abb-45dd-80f0-a1f43b1080ad": [ "1.0.0", @@ -91546,30 +93527,42 @@ "gbnz.redis-cache-clear.rediscacheclearkey-release-task.98e620c4-e2ad-47cd-bda0-41b028296cbb": [ "1.0.0", "1.0.5", - "1.1.0" + "1.1.0", + "2.0.0", + "2.0.1" ], "gbnz.redis-cache-clear.rediscacheclearkey-release-task.rediscacheclearkey": [ "1.0.0", "1.0.5", - "1.1.0" + "1.1.0", + "2.0.0", + "2.0.1" ], "gbnz.redis-cache-clear.rediscacheflushall-release-task.58a36166-34e3-4e41-ab7b-967dccc53690": [ "1.0.0", "1.0.5", - "1.1.0" + "1.1.0", + "2.0.0", + "2.0.1" ], "gbnz.redis-cache-clear.rediscacheflushall-release-task.rediscacheflushall": [ "1.0.0", "1.0.5", - "1.1.0" + "1.1.0", + "2.0.0", + "2.0.1" ], "gbnz.redis-cache-clear.rediscacheflushdb-release-task.2adf5d8e-029c-4ee6-8dbc-0a895ec2ce05": [ "1.0.0", - "1.1.0" + "1.1.0", + "2.0.0", + "2.0.1" ], "gbnz.redis-cache-clear.rediscacheflushdb-release-task.rediscacheflushdb": [ "1.0.0", - "1.1.0" + "1.1.0", + "2.0.0", + "2.0.1" ], "gcloudrunner": ["0.2.0", "0.2.1", "0.3.0", "0.4.0"], "geeklearningio.gl-vsts-tasks-azure.az-copy-task.azcopy": [ @@ -92272,7 +94265,28 @@ "0.1.33", "0.1.34", "0.1.35", - "0.1.36" + "0.1.36", + "0.1.37", + "0.1.38", + "0.1.39", + "0.1.40", + "0.1.41", + "0.1.42", + "0.1.43", + "0.1.44", + "0.1.45", + "0.1.46" + ], + "generateandpublishvsixtomarketplace": [ + "0.0.1", + "0.0.2", + "0.0.3", + "0.0.4", + "0.0.5", + "0.0.6", + "0.0.7", + "0.0.8", + "0.0.9" ], "generateentityframeworkmigrationscript": [ "0.1.0", @@ -93508,7 +95522,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gitreleasemanager/close": [ "0.0.6", @@ -93530,7 +95547,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gitreleasemanager/create": [ "0.0.6", @@ -93552,7 +95572,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gitreleasemanager/discard": [ "0.0.6", @@ -93574,7 +95597,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gitreleasemanager/open": [ "0.0.6", @@ -93596,7 +95622,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gitreleasemanager/publish": [ "0.8.0", @@ -93614,7 +95643,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gitreleasemanager/setup": [ "0.0.6", @@ -93636,7 +95668,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gitsync": [ "0.3.1", @@ -93722,7 +95757,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gittools.gittools.addasset-gitreleasemanager-task.gitreleasemanager/addasset": [ "0.8.0", @@ -93740,7 +95778,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gittools.gittools.close-gitreleasemanager-task.f5304356-f6e3-48e9-9b65-a9efa41ce7a2": [ "0.0.6", @@ -93762,7 +95803,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gittools.gittools.close-gitreleasemanager-task.gitreleasemanager/close": [ "0.0.6", @@ -93784,7 +95828,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gittools.gittools.create-gitreleasemanager-task.c77d38be-46a9-4ef1-a181-2d6050ed23d2": [ "0.0.6", @@ -93806,7 +95853,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gittools.gittools.create-gitreleasemanager-task.gitreleasemanager/create": [ "0.0.6", @@ -93828,7 +95878,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gittools.gittools.discard-gitreleasemanager-task.9ae78b66-6100-4522-8106-b7ae00bbfcdf": [ "0.0.6", @@ -93850,7 +95903,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gittools.gittools.discard-gitreleasemanager-task.gitreleasemanager/discard": [ "0.0.6", @@ -93872,7 +95928,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gittools.gittools.execute-gitversion-task.9013cf7f-ee8d-49f4-a39b-db244928d391": [ "0.0.6", @@ -93897,6 +95956,9 @@ "0.9.13", "0.9.14", "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2", "1.0.0", "5.0.2" ], @@ -93927,7 +95989,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gittools.gittools.open-gitreleasemanager-task.5d437bf5-f193-4449-b531-c4c69eebaa48": [ "0.0.6", @@ -93949,7 +96014,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gittools.gittools.open-gitreleasemanager-task.gitreleasemanager/open": [ "0.0.6", @@ -93971,7 +96039,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gittools.gittools.publish-gitreleasemanager-task.b3c54483-4140-45d8-b442-3a0b096b5f7f": [ "0.8.0", @@ -93989,7 +96060,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gittools.gittools.publish-gitreleasemanager-task.gitreleasemanager/publish": [ "0.8.0", @@ -94007,7 +96081,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gittools.gittools.setup-gitreleasemanager-task.e3022448-b00d-4b57-b504-606a0bcf8279": [ "0.0.6", @@ -94031,6 +96108,9 @@ "0.9.13", "0.9.14", "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2", "1.0.0" ], "gittools.gittools.setup-gitreleasemanager-task.gitreleasemanager-setup": [ @@ -94058,7 +96138,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gittools.gittools.setup-gitversion-task.a06c02ae-7b9a-4082-90dc-fe27b500e54f": [ "0.0.6", @@ -94083,6 +96166,9 @@ "0.9.13", "0.9.14", "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2", "1.0.0", "5.0.2" ], @@ -94113,7 +96199,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gitversion": ["5.0.0", "5.0.2"], "gitversion-execute": ["0.4.0", "0.5.0", "0.6.0", "1.0.0", "5.0.2"], @@ -94146,7 +96235,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "gitversion/setup": [ "0.0.6", @@ -94168,7 +96260,10 @@ "0.9.11", "0.9.13", "0.9.14", - "0.9.15" + "0.9.15", + "0.10.0", + "0.10.1", + "0.10.2" ], "giuliovdev.hugo-extension.hugo-build-task-v2.528c73d9-c552-4e2d-a26f-fb5c91c32554": [ "2.0.0" @@ -94436,6 +96531,7 @@ "2.208.1", "2.211.0" ], + "googleplayincreaserollout20230124": ["2.211.0"], "googleplaypromote": [ "1.0.0", "1.112.0", @@ -94461,6 +96557,7 @@ "3.208.0", "3.211.1" ], + "googleplaypromote20230124": ["3.211.1"], "googleplayrelease": [ "1.1.0", "1.2.0", @@ -94500,8 +96597,10 @@ "4.203.0", "4.207.0", "4.209.0", - "4.216.0" + "4.216.0", + "4.217.0" ], + "googleplayrelease20230124": ["4.217.0"], "googleplayreleasebundle": [ "3.160.0", "3.163.0", @@ -94524,6 +96623,7 @@ "2.207.0", "2.211.0" ], + "googleplaystatusupdate20230124": ["2.211.0"], "goreleaser": ["0.1.8"], "goreleaser.goreleaser.custom-build-release-task.b4a32eee-3b3e-11ec-8d3d-0242ac130003": [ "0.1.8" @@ -94878,7 +96978,10 @@ "1.0.3", "1.0.4", "1.0.5", - "1.0.6" + "1.0.6", + "1.1.3", + "1.1.4", + "1.1.5" ], "gsoft.lighthouse-vsts.lighthouse.lighthouse": [ "1.0.1", @@ -94886,7 +96989,10 @@ "1.0.3", "1.0.4", "1.0.5", - "1.0.6" + "1.0.6", + "1.1.3", + "1.1.4", + "1.1.5" ], "gsutilrunner": ["0.1.0", "0.2.0", "0.3.0"], "guid-generator": [ @@ -95533,6 +97639,7 @@ "0.4.18", "0.4.19" ], + "hawkscaninstall": ["0.1.0"], "hboelman.azureappservicesetappsettings.hboelman-vsts-release-appsettings.9d2e4cf0-f3bb-11e6-978b-770d284f4f2d": [ "0.3.2", "1.0.1", @@ -95564,10 +97671,27 @@ "2.0.3", "2.0.4", "2.0.5", - "2.0.6" + "2.0.6", + "2.0.7" + ], + "hclappscan": [ + "1.2.6", + "1.2.7", + "1.2.8", + "1.2.9", + "1.2.10", + "1.2.11", + "2.0.0" + ], + "hclappscanoncloud": [ + "2.0.1", + "2.0.2", + "2.0.3", + "2.0.4", + "2.0.5", + "2.0.6", + "2.0.7" ], - "hclappscan": ["1.2.6", "1.2.7", "1.2.8", "1.2.9", "1.2.10", "2.0.0"], - "hclappscanoncloud": ["2.0.1", "2.0.2", "2.0.3", "2.0.4", "2.0.5", "2.0.6"], "hclonetestapitask": [ "0.1.1", "0.3.1", @@ -95602,7 +97726,8 @@ "2.0.3", "2.0.4", "2.0.5", - "2.0.6" + "2.0.6", + "2.0.7" ], "hcltechnologies.applicationsecurity-vsts.custom-ase-task.hcl appscan enterprise": [ "2.0.0", @@ -95611,7 +97736,8 @@ "2.0.3", "2.0.4", "2.0.5", - "2.0.6" + "2.0.6", + "2.0.7" ], "hcltechnologies.applicationsecurity-vsts.custom-asoc-task.46d7c5c4-ec5a-461f-98e9-f8adce322b4e": [ "2.0.0", @@ -95620,7 +97746,8 @@ "2.0.3", "2.0.4", "2.0.5", - "2.0.6" + "2.0.6", + "2.0.7" ], "hcltechnologies.applicationsecurity-vsts.custom-asoc-task.hclappscan": [ "2.0.0" @@ -95631,7 +97758,8 @@ "2.0.3", "2.0.4", "2.0.5", - "2.0.6" + "2.0.6", + "2.0.7" ], "hcltechnologies.applicationsecurity-vsts.custom-build-release-task.6e743613-d4b8-48d2-8ee3-1b8ec3ab00fe": [ "1.0.0", @@ -95646,7 +97774,8 @@ "1.2.7", "1.2.8", "1.2.9", - "1.2.10" + "1.2.10", + "1.2.11" ], "hcltechnologies.applicationsecurity-vsts.custom-build-release-task.applicationsecurity": [ "1.0.0", @@ -95663,7 +97792,8 @@ "1.2.7", "1.2.8", "1.2.9", - "1.2.10" + "1.2.10", + "1.2.11" ], "hcltechnologies.build-release-task-hcl.onetestapi.5ea8b444-ad35-477d-b4f6-f5665b02900f": [ "0.1.1", @@ -95847,6 +97977,16 @@ "0.3.0", "0.5.0" ], + "henningmeyer.querymailer.send-query-task.18370706-38f2-4477-a01b-7d42d6a73660": [ + "0.1.0", + "0.2.0", + "0.3.0" + ], + "henningmeyer.querymailer.send-query-task.querymailer": [ + "0.1.0", + "0.2.0", + "0.3.0" + ], "herusec-scan": ["0.0.4", "0.0.7"], "hey24sheep.envar.environmentvariables.ba15421e-d1b3-4be9-92a2-c5cb7f914e28": [ "0.1.0", @@ -96065,7 +98205,12 @@ "5.4.35", "5.4.48", "5.4.52", - "5.4.55" + "5.4.55", + "5.4.59", + "5.4.61", + "5.4.62", + "5.4.66", + "5.4.67" ], "hlv-download-ftp-artifact": ["1.2.1", "1.2.2"], "hlv-git-commands": ["1.0.0", "1.0.8"], @@ -103386,7 +105531,8 @@ "2.0.9", "2.0.10", "2.0.11", - "2.0.12" + "2.0.12", + "2.0.13" ], "hypervserver": [ "5.1.65", @@ -104127,6 +106273,12 @@ "0.2.38" ], "imdsoftdevops2021.flutter.flutter-test.fluttertest": ["0.2.38"], + "immuniweb.immuniweb-neuron-task.custom-build-release-task.768a5ceb-23d4-446a-9a3a-04db3c4984cc": [ + "0.1.0" + ], + "immuniweb.immuniweb-neuron-task.custom-build-release-task.runneuron": [ + "0.1.0" + ], "import portal configuration": [ "1.1.32", "1.1.34", @@ -104160,12 +106312,14 @@ "imsherlock01.create-annotated-tags.create-annotated-tags-task.2559c3c1-9b1d-41b8-b77e-e729314a491f": [ "0.0.1", "0.0.2", - "0.0.3" + "0.0.3", + "0.0.4" ], "imsherlock01.create-annotated-tags.create-annotated-tags-task.create-annotated-tags": [ "0.0.1", "0.0.2", - "0.0.3" + "0.0.3", + "0.0.4" ], "imsherlock01.deploy-ssrs-reports.delete-report-folder.3fc40e3d-760e-412f-b221-d12155d6fb30": [ "0.0.1", @@ -104503,6 +106657,7 @@ "4.0.8" ], "ineritedprocessmigration": [ + "1.0.1", "1.11.0", "1.11.1", "1.11.21", @@ -104518,7 +106673,8 @@ "1.11.121", "1.11.131", "1.11.141", - "1.11.151" + "1.11.151", + "1.12.41" ], "infamousjoeg.cyberark-conjur-secrets.custom-build-release-task.e9c84774-b108-43c0-b04a-7cfaa4ad6907": [ "1.2.15", @@ -104665,7 +106821,9 @@ "0.1.18", "0.2.0", "1.0.0", - "1.0.5" + "1.0.5", + "1.0.6", + "1.0.7" ], "infracost.infracost-tasks.infracost-setup-task.infracostsetup": [ "0.1.0", @@ -104688,7 +106846,9 @@ "0.1.18", "0.2.0", "1.0.0", - "1.0.5" + "1.0.5", + "1.0.6", + "1.0.7" ], "infracostcomment": [ "0.1.0", @@ -104732,7 +106892,9 @@ "0.1.18", "0.2.0", "1.0.0", - "1.0.5" + "1.0.5", + "1.0.6", + "1.0.7" ], "iniciawindowsservices": [ "0.0.20", @@ -105302,6 +107464,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -105312,7 +107477,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "installbccontainerhelper": [ "0.0.0", @@ -105451,7 +107619,9 @@ "0.6.32", "0.7.5", "0.8.10", - "0.8.34" + "0.8.34", + "0.9.19", + "1.9.19" ], "installmodelax2012": ["0.0.1", "0.0.2", "0.0.4", "0.0.5"], "installmodules": ["1.0.0", "1.0.1", "1.0.2"], @@ -105808,26 +107978,30 @@ "1.4.0", "1.5.0", "1.5.1", - "1.7.0" + "1.7.0", + "1.8.0" ], "invictiltd.acunetix360-extension.acunetix360-task.acunetix360": [ "1.0.0", "1.4.0", "1.5.0", "1.5.1", - "1.7.0" + "1.7.0", + "1.8.0" ], "invictiltd.netsparker-cloud-extension.netsparker-cloud-task.e2a81a06-bb2a-4223-97b4-9e09b0cfed73": [ "1.0.0", "1.5.0", "1.6.0", - "1.7.0" + "1.7.0", + "1.8.0" ], "invictiltd.netsparker-cloud-extension.netsparker-cloud-task.netsparker-cloud": [ "1.0.0", "1.5.0", "1.6.0", - "1.7.0" + "1.7.0", + "1.8.0" ], "invoke-build": ["2.14.0"], "invokemetadefendertask": ["0.3.1", "0.3.3", "0.3.4"], @@ -106056,7 +108230,8 @@ "1.178.2", "1.186.0", "1.189.0", - "1.207.0" + "1.207.0", + "1.218.0" ], "isaacabraham.fake-build.dd88f622-7838-44dc-96d6-2372af78775b.dd88f622-7838-44dc-96d6-2372af78775b": [ "1.0.2", @@ -106252,6 +108427,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -106262,7 +108440,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "isazuredevopsextensionvalidserver": [ "2.0.5", @@ -106314,7 +108495,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "istio": ["1.0.0", "1.0.3"], "itszap.itszap-release-packager.itszap-build-releasepackager.3efc5a90-d2d9-11e5-870b-fddad3389520": [ @@ -106859,6 +109043,22 @@ "1.0.28", "1.0.29" ], + "jasonbjohnson.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.51355d76-dd54-4754-919d-bba27fdf59e4": [ + "0.7.11", + "0.7.12" + ], + "jasonbjohnson.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.terraformcli": [ + "0.7.11", + "0.7.12" + ], + "jasonbjohnson.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-installer.2b4600b9-5cd9-4e3b-9c8b-553c8e58383a": [ + "0.7.11", + "0.7.12" + ], + "jasonbjohnson.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-installer.terraforminstaller": [ + "0.7.11", + "0.7.12" + ], "jasonwhalley.pulumi-installer-task.pulumi-installer-task.af7fa111-9fb4-422f-be9f-95c96deaa4ea": [ "0.1.1", "0.1.2", @@ -107135,7 +109335,23 @@ "0.1.68", "1.1.0", "1.1.1", - "1.1.2" + "1.1.2", + "1.1.3", + "1.1.5", + "1.1.6", + "1.1.7", + "1.1.8", + "1.1.9", + "1.1.10", + "1.1.11", + "1.1.12", + "1.1.13", + "1.1.14", + "1.1.15", + "1.1.16", + "1.1.17", + "1.1.18", + "1.1.19" ], "jaydenmaalouf.terraform-output.terraformoutput.terraformoutput": [ "0.1.0", @@ -107208,7 +109424,23 @@ "0.1.68", "1.1.0", "1.1.1", - "1.1.2" + "1.1.2", + "1.1.3", + "1.1.5", + "1.1.6", + "1.1.7", + "1.1.8", + "1.1.9", + "1.1.10", + "1.1.11", + "1.1.12", + "1.1.13", + "1.1.14", + "1.1.15", + "1.1.16", + "1.1.17", + "1.1.18", + "1.1.19" ], "jb.queue-build.queue-build-task.025bc3d2-c942-42d2-9b76-97db7e884483": [ "1.0.0", @@ -107447,7 +109679,8 @@ "2.202.0", "2.208.0", "2.208.1", - "2.210.0" + "2.210.0", + "2.217.0" ], "jessehouwing.dotnetcore.dotnetcorecli-sxs.dotnetcorecli-sxs": [ "0.4.3", @@ -107456,7 +109689,8 @@ "2.202.0", "2.208.0", "2.208.1", - "2.210.0" + "2.210.0", + "2.217.0" ], "jessehouwing.dotnetcore.dotnetcoreinstaller-sxs.293bf4ff-c53b-5966-a88e-a9bfe843bc1d": [ "0.198.0", @@ -110039,24 +112273,28 @@ "1.199.0", "1.208.0", "1.212.0", - "1.214.0" + "1.214.0", + "1.217.0" ], "jessehouwing.visualstudio.msbuild-sxs.msbuild-sxs": [ "1.198.1", "1.199.0", "1.208.0", "1.212.0", - "1.214.0" + "1.214.0", + "1.217.0" ], "jessehouwing.visualstudio.visualstudiotestplatforminstaller-sxs.a7692b5d-a590-5763-949b-12ac8ed24643": [ "1.151.3", "1.212.0", - "1.214.0" + "1.214.0", + "1.215.0" ], "jessehouwing.visualstudio.visualstudiotestplatforminstaller-sxs.visualstudiotestplatforminstaller-sxs": [ "1.151.3", "1.212.0", - "1.214.0" + "1.214.0", + "1.215.0" ], "jessehouwing.visualstudio.vsbuild-sxs.e611ef14-f538-5f42-8ffc-60c88f7f045c": [ "1.198.1", @@ -110077,14 +112315,16 @@ "2.198.0", "2.203.0", "2.205.0", - "2.210.0" + "2.210.0", + "2.215.0" ], "jessehouwing.visualstudio.vstest-sxs.vstest-sxs": [ "1.198.0", "2.198.0", "2.203.0", "2.205.0", - "2.210.0" + "2.210.0", + "2.215.0" ], "jessehouwing.vsts-ensure-tests-tasks.vsts-ensure-tests-tasks.25d3d29e-5ea1-4453-9ce6-02e1b34ab30c": [ "0.0.0", @@ -110266,7 +112506,10 @@ "2022.1.1", "2022.2.1", "2022.2.4", - "2022.3.0" + "2022.3.0", + "2022.3.2", + "2022.3.3", + "2022.3.4" ], "jetbrains.qodana.qodanascan.qodanascan": [ "1.0.2", @@ -110276,7 +112519,10 @@ "2022.1.1", "2022.2.1", "2022.2.4", - "2022.3.0" + "2022.3.0", + "2022.3.2", + "2022.3.3", + "2022.3.4" ], "jfrog.jfrog-artifactory-vsts-extension.artifactory-collect-issues.07a15c20-6352-1d11-abde-ab31c4c12f1d": [ "1.9.0", @@ -112410,7 +114656,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-audit-task.jfrogaudit": [ "1.0.1", @@ -112420,7 +114668,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-build-scan-task.6344f8dc-e3e4-4658-84c6-bc26f7fd7de2": [ "1.0.1", @@ -112430,7 +114680,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-build-scan-task.jfrogbuildscan": [ "1.0.1", @@ -112440,7 +114692,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-cli-v2.66ef8d68-1df5-479d-9148-c7ed656e8a31": [ "1.0.1", @@ -112450,7 +114704,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-cli-v2.jfrogcliv2": [ "1.0.1", @@ -112460,7 +114716,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-collect-issues.1b03a764-f8b0-4eec-81bf-5abe1a15afff": [ "1.0.1", @@ -112470,7 +114728,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-collect-issues.jfrogcollectissues": [ "1.0.1", @@ -112480,7 +114740,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-conan-build-task.3809c250-e06b-4afe-b9d0-334ad742a7d4": [ "1.0.1", @@ -112490,7 +114752,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-conan-build-task.jfrogconan": [ "1.0.1", @@ -112500,7 +114764,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-discard-builds-task.625ba5b8-a30b-4103-8400-8ec94e2aef16": [ "1.0.1", @@ -112510,7 +114776,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-discard-builds-task.jfrogdiscardbuilds": [ "1.0.1", @@ -112520,7 +114788,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-distribution.ccd991c4-c497-4141-a36d-bd99e5139193": [ "1.0.1", @@ -112530,7 +114800,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-distribution.jfrogdistribution": [ "1.0.1", @@ -112540,15 +114812,21 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-docker-task.1a9ec20c-e108-11ec-9d64-0242ac120002": [ "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-docker-task.jfrogdocker": [ "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-dotnet.16358c16-3185-4979-8375-845dedcb6b8d": [ "1.0.1", @@ -112558,7 +114836,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-dotnet.jfrogdotnetcore": [ "1.0.1", @@ -112568,7 +114848,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-generic-artifacts.c288dcae-5ae4-4a37-a59d-11bb07d393a9": [ "1.0.1", @@ -112578,7 +114860,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-generic-artifacts.jfroggenericartifacts": [ "1.0.1", @@ -112588,7 +114872,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-go.bf0e8eea-ad19-4b7d-8415-374d83397de5": [ "1.0.1", @@ -112598,7 +114884,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-go.jfroggo": [ "1.0.1", @@ -112608,7 +114896,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-gradle.02572ee8-ad56-4738-bed8-63fa41d9f1e0": [ "1.0.1", @@ -112618,7 +114908,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-gradle.jfroggradle": [ "1.0.1", @@ -112628,7 +114920,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-maven.d7eca331-9d2a-405a-9374-4014532462b6": [ "1.0.1", @@ -112638,7 +114932,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-maven.jfrogmaven": [ "1.0.1", @@ -112648,7 +114944,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-npm.3a5a35c4-b755-4821-b4d9-f10ce6e1f86c": [ "1.0.1", @@ -112658,7 +114956,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-npm.jfrognpm": [ "1.0.1", @@ -112668,7 +114968,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-nuget.475870bd-8ef1-45bb-83dd-1b39902a8ace": [ "1.0.1", @@ -112678,7 +114980,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-nuget.jfrognuget": [ "1.0.1", @@ -112688,7 +114992,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-pip.5cfb06f3-4e91-44d8-a850-85c2dc11f36f": [ "1.0.1", @@ -112698,7 +115004,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-pip.jfrogpip": [ "1.0.1", @@ -112708,7 +115016,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-promote-build-task.32f70de9-cdd0-4009-831a-856c52a4a0ba": [ "1.0.1", @@ -112718,7 +115028,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-promote-build-task.jfrogbuildpromotion": [ "1.0.1", @@ -112728,7 +115040,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-publish-build-info.b700f673-acfc-4f5f-8b5e-24a585646319": [ "1.0.1", @@ -112738,7 +115052,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-publish-build-info.jfrogpublishbuildinfo": [ "1.0.1", @@ -112748,7 +115064,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-tools-installer-task.48966110-efbe-4151-a20d-d4160f8d69bb": [ "1.0.1", @@ -112758,7 +115076,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrog.jfrog-azure-devops-extension.jfrog-tools-installer-task.jfrogtoolsinstaller": [ "1.0.1", @@ -112768,7 +115088,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrogaudit": [ "1.0.1", @@ -112778,7 +115100,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrogbuildpromotion": [ "1.0.1", @@ -112788,7 +115112,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrogbuildscan": [ "1.0.1", @@ -112798,7 +115124,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrogcli": [ "1.10.0", @@ -112836,7 +115164,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrogcollectissues": [ "1.0.1", @@ -112846,7 +115176,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrogconan": [ "1.0.1", @@ -112856,7 +115188,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrogdiscardbuilds": [ "1.0.1", @@ -112866,7 +115200,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrogdistribution": [ "1.0.1", @@ -112876,9 +115212,11 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], - "jfrogdocker": ["1.2.0", "1.3.0"], + "jfrogdocker": ["1.2.0", "1.3.0", "1.4.0", "1.4.1"], "jfrogdotnetcore": [ "1.0.1", "1.0.2", @@ -112887,7 +115225,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfroggenericartifacts": [ "1.0.1", @@ -112897,7 +115237,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfroggo": [ "1.0.1", @@ -112907,7 +115249,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfroggradle": [ "1.0.1", @@ -112917,7 +115261,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrogmaven": [ "1.0.1", @@ -112927,7 +115273,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrognpm": [ "1.0.1", @@ -112937,7 +115285,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrognuget": [ "1.0.1", @@ -112947,7 +115297,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrogpip": [ "1.0.1", @@ -112957,7 +115309,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrogpublishbuildinfo": [ "1.0.1", @@ -112967,7 +115321,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jfrogtoolsinstaller": [ "1.0.1", @@ -112977,7 +115333,9 @@ "1.1.0", "1.1.1", "1.2.0", - "1.3.0" + "1.3.0", + "1.4.0", + "1.4.1" ], "jhagestedt.maven-cache.maven-cache-task.e49d7286-e3f9-4fe2-8844-b677a2eed24a": [ "0.1.0", @@ -113393,14 +115751,21 @@ ], "jonas-s.npm-audit.npm-audit-build-task.7890f95d-fd3a-4e5e-8a26-58d1bd0d4e0b": [ "1.0.0", - "1.1.0" + "1.1.0", + "1.2.0" + ], + "jonas-s.npm-audit.npm-audit-build-task.npm-audit": [ + "1.0.0", + "1.1.0", + "1.2.0" ], - "jonas-s.npm-audit.npm-audit-build-task.npm-audit": ["1.0.0", "1.1.0"], "jonas-s.nuget-vulnerability-scan.nuget-vulnerability-scan-build-task.f48f2638-81c8-477c-bf62-2b0d870be21f": [ - "1.0.0" + "1.0.0", + "1.1.0" ], "jonas-s.nuget-vulnerability-scan.nuget-vulnerability-scan-build-task.nugetvulnerabilityscan": [ - "1.0.0" + "1.0.0", + "1.1.0" ], "jonathanball.angular-cli-1.angular-cli-build-task.75b00cae-14b5-414f-b9f1-1aa71b192da2": [ "1.0.0" @@ -115459,7 +117824,8 @@ "8.5.0", "8.6.0", "8.7.0", - "8.8.0" + "8.8.0", + "8.9.0" ], "kine.naverticaltasks.047393e1-82e4-4d24-8275-237409bb378f.publishbcappdocker": [ "1.0.10", @@ -115530,7 +117896,8 @@ "8.5.0", "8.6.0", "8.7.0", - "8.8.0" + "8.8.0", + "8.9.0" ], "kine.naverticaltasks.047393e1-82e4-4d24-8275-237409bb378f.publishdocker": [ "1.0.0", @@ -117628,7 +119995,17 @@ "0.1.6" ], "liero.libman.libmantask.libmantask": ["0.1.5", "0.1.6"], - "lighthouse": ["1.0.1", "1.0.2", "1.0.3", "1.0.4", "1.0.5", "1.0.6"], + "lighthouse": [ + "1.0.1", + "1.0.2", + "1.0.3", + "1.0.4", + "1.0.5", + "1.0.6", + "1.1.3", + "1.1.4", + "1.1.5" + ], "lighthouse-ci": [ "0.1.1", "1.0.1", @@ -119277,7 +121654,8 @@ "1.0.5", "1.0.6", "1.0.7", - "1.0.8" + "1.0.8", + "1.0.9" ], "maciejmaciejewski.azure-pipelines-cucumber.publishcucumberreport.publishcucumberreport": [ "1.0.0", @@ -119288,7 +121666,8 @@ "1.0.5", "1.0.6", "1.0.7", - "1.0.8" + "1.0.8", + "1.0.9" ], "maciejmaciejewski.azure-pipelines-deno.denodownload.b420a230-a2fb-11ea-9147-afd94f8273de": [ "1.0.0" @@ -120635,7 +123014,9 @@ "0.6.32", "0.7.5", "0.8.10", - "0.8.34" + "0.8.34", + "0.9.19", + "1.9.19" ], "mathworks.matlab-azure-devops-extension.installmatlab.installmatlab": [ "0.1.4", @@ -120656,17 +123037,21 @@ "0.6.32", "0.7.5", "0.8.10", - "0.8.34" + "0.8.34", + "0.9.19", + "1.9.19" ], "mathworks.matlab-azure-devops-extension.runmatlabbuild.c61c6fcc-00f1-4aa0-8513-31aad3340512": [ "0.7.5", "0.8.10", - "0.8.34" + "0.8.34", + "0.9.19" ], "mathworks.matlab-azure-devops-extension.runmatlabbuild.runmatlabbuild": [ "0.7.5", "0.8.10", - "0.8.34" + "0.8.34", + "0.9.19" ], "mathworks.matlab-azure-devops-extension.runmatlabcommand.28fdff80-51b4-4b6e-83e1-cfcf3f3b25a6": [ "0.1.4", @@ -120687,7 +123072,8 @@ "0.6.32", "0.7.5", "0.8.10", - "0.8.34" + "0.8.34", + "0.9.19" ], "mathworks.matlab-azure-devops-extension.runmatlabcommand.runmatlabcommand": [ "0.1.4", @@ -120708,7 +123094,8 @@ "0.6.32", "0.7.5", "0.8.10", - "0.8.34" + "0.8.34", + "0.9.19" ], "mathworks.matlab-azure-devops-extension.runmatlabtests.d9f28863-c9b0-4133-9cb8-a6d4744f30ef": [ "0.1.4", @@ -120729,7 +123116,8 @@ "0.6.32", "0.7.5", "0.8.10", - "0.8.34" + "0.8.34", + "0.9.19" ], "mathworks.matlab-azure-devops-extension.runmatlabtests.runmatlabtests": [ "0.1.4", @@ -120750,7 +123138,8 @@ "0.6.32", "0.7.5", "0.8.10", - "0.8.34" + "0.8.34", + "0.9.19" ], "matrix42ag.matrix42extensionspublishingtoolspublic.generate-package-task.de7b28a2-4ca6-4815-854f-851ba605a155": [ "0.1.1", @@ -121466,6 +123855,16 @@ "0.0.4", "0.0.5" ], + "michaelclay.azure-pipelines-allure-report-viewer.publishallurereport.bf52d8fd-c399-4acd-98c7-a03ceee2a973": [ + "1.0.19", + "1.0.20", + "1.0.21" + ], + "michaelclay.azure-pipelines-allure-report-viewer.publishallurereport.publishallurereport": [ + "1.0.19", + "1.0.20", + "1.0.21" + ], "michaelcollins.customemailtask.custom-email-build-task.bc0b0c5b-80c4-4b20-924d-b8d1ccbc0b0c": [ "1.0.0", "1.0.1", @@ -121650,7 +124049,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.add-solution-component.powerplatformaddsolutioncomponent": [ "2.0.3", @@ -121660,7 +124061,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.apply-solution-upgrade.44baeac4-f767-4cb9-83e8-d210ce763397": [ "0.0.23", @@ -121682,7 +124085,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.apply-solution-upgrade.powerplatformapplysolutionupgrade": [ "0.0.23", @@ -121704,15 +124109,21 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.assign-group.47203ae0-e66b-4cc7-bdbd-77ea87aaf473": [ "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.assign-group.powerplatformassigngroup": [ "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.assign-user.4bc2c638-8a95-473d-bc83-2c9ec8b18885": [ "2.0.3", @@ -121722,7 +124133,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.assign-user.powerplatformassignuser": [ "2.0.3", @@ -121732,7 +124145,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.backup-environment.bfd05e80-f553-4a07-aaff-b44ab65bd61d": [ "0.0.1", @@ -121763,7 +124178,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.backup-environment.powerplatformbackupenvironment": [ "0.0.1", @@ -121794,7 +124211,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.checker.54b4d3aa-732f-436b-9996-2a96a6715191": [ "0.0.1", @@ -121825,7 +124244,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.checker.powerplatformchecker": [ "0.0.1", @@ -121856,7 +124277,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.copy-environment.0dba3baf-3724-455d-b194-3c6ec0b56431": [ "0.0.1", @@ -121887,7 +124310,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.copy-environment.powerplatformcopyenvironment": [ "0.0.1", @@ -121918,7 +124343,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.create-environment.9788ca49-dc8f-4d6b-bd5a-bab0fed0bc0c": [ "0.0.1", @@ -121949,7 +124376,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.create-environment.powerplatformcreateenvironment": [ "0.0.1", @@ -121980,7 +124409,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.delete-environment.d06e33c0-b482-48fc-8376-e3623651de01": [ "0.0.1", @@ -122011,7 +124442,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.delete-environment.powerplatformdeleteenvironment": [ "0.0.1", @@ -122042,7 +124475,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.delete-solution.a497eae1-e8b2-4ec8-be6a-e865c0b952c1": [ "0.0.23", @@ -122064,7 +124499,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.delete-solution.powerplatformdeletesolution": [ "0.0.23", @@ -122086,7 +124523,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.deploy-package.6eba22e9-9666-4241-8664-3d96354449c3": [ "0.0.1", @@ -122117,7 +124556,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.deploy-package.powerplatformdeploypackage": [ "0.0.1", @@ -122148,7 +124589,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.download-paportal.75caa998-d6b8-481b-9ac9-63f49bd41e23": [ "0.0.76", @@ -122162,7 +124605,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.download-paportal.powerplatformdownloadpaportal": [ "0.0.76", @@ -122176,21 +124621,27 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.export-data.378ce4ea-1265-49fd-a64d-f36da5b2fb31": [ "2.0.7", "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.export-data.powerplatformexportdata": [ "2.0.7", "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.export-solution.16f6dae7-e6ef-4629-ae75-7988463cb6a6": [ "0.0.1", @@ -122221,7 +124672,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.export-solution.powerplatformexportsolution": [ "0.0.1", @@ -122252,21 +124705,27 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.import-data.975fae62-ca27-4125-8fa5-f7cc0844c4f6": [ "2.0.7", "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.import-data.powerplatformimportdata": [ "2.0.7", "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.import-solution.fb4a48f1-0eeb-4909-9e47-9bc290e1cb89": [ "0.0.1", @@ -122297,7 +124756,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.import-solution.powerplatformimportsolution": [ "0.0.1", @@ -122328,17 +124789,23 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.install-application.4395c90d-df12-4914-a900-98165bddb8cf": [ "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.install-application.powerplatforminstallapplication": [ "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.pack-solution.769929ed-e421-451b-8255-21a8d9d9d3f9": [ "0.0.1", @@ -122369,7 +124836,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.pack-solution.powerplatformpacksolution": [ "0.0.1", @@ -122400,7 +124869,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.publish-customizations.da253d32-26bf-47cc-8994-ddb90bbfbe36": [ "0.0.1", @@ -122431,7 +124902,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.publish-customizations.powerplatformpublishcustomizations": [ "0.0.1", @@ -122462,7 +124935,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.reset-environment.6e960d4e-ff9f-4112-8dd0-db0e97a7f131": [ "0.0.1", @@ -122493,7 +124968,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.reset-environment.powerplatformresetenvironment": [ "0.0.1", @@ -122524,7 +125001,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.restore-environment.f11d7007-9076-4ecf-839f-b46e0f65dbc6": [ "0.0.1", @@ -122555,7 +125034,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.restore-environment.powerplatformrestoreenvironment": [ "0.0.1", @@ -122586,21 +125067,27 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.set-connection-variables.f39f114b-39ae-487c-b3af-2e243c29cbb1": [ "2.0.7", "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.set-connection-variables.powerplatformsetconnectionvariables": [ "2.0.7", "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.set-solution-version.2c73f444-efd5-46b6-9416-44273166267b": [ "0.0.1", @@ -122631,7 +125118,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.set-solution-version.powerplatformsetsolutionversion": [ "0.0.1", @@ -122662,7 +125151,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.tool-installer.8015465b-f367-4ec4-8215-8edf682574d3": [ "0.0.1", @@ -122693,7 +125184,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.tool-installer.powerplatformtoolinstaller": [ "0.0.1", @@ -122724,7 +125217,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.unpack-solution.3cac89bb-1ef1-4aa7-a3c6-36c6e79c700e": [ "0.0.1", @@ -122755,7 +125250,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.unpack-solution.powerplatformunpacksolution": [ "0.0.1", @@ -122786,7 +125283,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.upload-paportal.ce0b296e-f1e6-4be2-a18b-a431c106cb86": [ "0.0.76", @@ -122800,7 +125299,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.upload-paportal.powerplatformuploadpaportal": [ "0.0.76", @@ -122814,7 +125315,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.whoami.d4a5d5cd-341b-47da-88a7-1c2379a0783a": [ "0.0.1", @@ -122845,7 +125348,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-isvexptools.powerplatform-buildtools.whoami.powerplatformwhoami": [ "0.0.1", @@ -122876,7 +125381,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "microsoft-oryx.azurecontainerappsrc.container-apps-deploy-pipelines-task.04e660e2-4ef0-4169-9c5d-23c0579757f6": [ "0.1.0", @@ -122885,7 +125392,13 @@ "0.1.3", "0.1.4", "0.1.6", - "0.1.7" + "0.1.7", + "0.1.8", + "0.1.9", + "0.1.10", + "0.1.11", + "0.1.12", + "0.1.13" ], "microsoft-oryx.azurecontainerappsrc.container-apps-deploy-pipelines-task.azurecontainerappsrc": [ "0.1.0", @@ -122894,7 +125407,13 @@ "0.1.3", "0.1.4", "0.1.6", - "0.1.7" + "0.1.7", + "0.1.8", + "0.1.9", + "0.1.10", + "0.1.11", + "0.1.12", + "0.1.13" ], "microsoftazloadtest": [ "1.1.2", @@ -124736,7 +127255,11 @@ "0.202.17", "0.202.18", "0.202.19", - "0.203.0" + "0.202.20", + "0.202.21", + "0.203.0", + "1.216.20", + "1.216.21" ], "ms-devlabs.custom-terraform-tasks.custom-terraform-installer-task.terraforminstaller": [ "0.0.13", @@ -124750,7 +127273,11 @@ "0.202.17", "0.202.18", "0.202.19", - "0.203.0" + "0.202.20", + "0.202.21", + "0.203.0", + "1.216.20", + "1.216.21" ], "ms-devlabs.custom-terraform-tasks.custom-terraform-release-task.fe504acc-6115-40cb-89ff-191386b5e7bf": [ "0.0.104", @@ -124770,6 +127297,8 @@ "0.202.17", "0.202.18", "0.202.19", + "0.202.20", + "0.202.21", "0.203.0", "2.188.0", "2.188.1", @@ -124781,10 +127310,16 @@ "2.202.17", "2.202.18", "2.202.19", + "2.202.20", + "2.202.21", "2.203.0", "3.201.17", "3.201.18", - "3.209.19" + "3.209.19", + "3.209.20", + "3.209.21", + "4.218.20", + "4.218.21" ], "ms-devlabs.custom-terraform-tasks.custom-terraform-release-task.terraformtask": [ "0.0.104" @@ -124806,6 +127341,8 @@ "0.202.17", "0.202.18", "0.202.19", + "0.202.20", + "0.202.21", "0.203.0" ], "ms-devlabs.custom-terraform-tasks.custom-terraform-release-task.terraformtaskv2": [ @@ -124819,12 +127356,20 @@ "2.202.17", "2.202.18", "2.202.19", + "2.202.20", + "2.202.21", "2.203.0" ], "ms-devlabs.custom-terraform-tasks.custom-terraform-release-task.terraformtaskv3": [ "3.201.17", "3.201.18", - "3.209.19" + "3.209.19", + "3.209.20", + "3.209.21" + ], + "ms-devlabs.custom-terraform-tasks.custom-terraform-release-task.terraformtaskv4": [ + "4.218.20", + "4.218.21" ], "ms-devlabs.utilitytasks.task-pspp.4c073640-a478-11e5-a7e5-850fa42c7a74": [ "0.2.0", @@ -124993,6 +127538,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.124", "4.1.8", "4.1.50", @@ -125004,7 +127552,10 @@ "4.1.142", "4.1.149", "4.1.161", - "4.1.178" + "4.1.178", + "4.1.220", + "4.1.260", + "4.1.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.extension-version-build-task.extensionversion": [ "0.0.0", @@ -125106,6 +127657,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.124", "4.1.8", "4.1.50", @@ -125117,7 +127671,10 @@ "4.1.142", "4.1.149", "4.1.161", - "4.1.178" + "4.1.178", + "4.1.220", + "4.1.260", + "4.1.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.install-extension-build-task.": [ "0.0.0" @@ -125222,6 +127779,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -125232,7 +127792,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.install-extension-build-task.installazuredevopsextension": [ "2.0.5", @@ -125284,6 +127847,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -125294,7 +127860,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.install-extension-build-task.installextension": [ "0.0.0", @@ -125429,6 +127998,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -125439,7 +128011,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.is-valid-extension-agent-build-task.check marketplace validation status.": [ "1.1.65", @@ -125524,6 +128099,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -125534,7 +128112,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.is-valid-extension-build-task.231decda-22cb-4e83-b2f4-31fc86a0de1f": [ "1.1.65", @@ -125617,7 +128198,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.is-valid-extension-build-task.check marketplace validation status.": [ "1.1.65", @@ -125702,7 +128286,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.package-extension-build-task.": [ "0.0.0" @@ -125807,6 +128394,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -125817,7 +128407,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.package-extension-build-task.packageazuredevopsextension": [ "2.0.5", @@ -125869,6 +128462,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -125879,7 +128475,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.package-extension-build-task.packagevstsextension": [ "0.0.0", @@ -126033,6 +128632,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -126043,7 +128645,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.publish-extension-build-task.publishazuredevopsextension": [ "2.0.5", @@ -126095,6 +128700,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -126105,7 +128713,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.publish-extension-build-task.publishextension": [ "0.0.0", @@ -126225,6 +128836,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -126235,7 +128849,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.publish-vs-extension-build-task.publishvisualstudioextension": [ "2.0.5", @@ -126286,6 +128903,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -126296,7 +128916,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.publish-vs-extension-build-task.publishvsextension": [ "1.2.14", @@ -126418,6 +129041,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -126428,7 +129054,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.share-extension-build-task.shareazuredevopsextension": [ "2.0.5", @@ -126479,6 +129108,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -126489,7 +129121,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.share-extension-build-task.shareextension": [ "0.0.0", @@ -126605,6 +129240,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -126615,7 +129253,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.tfx-installer-build-task.tfxinstaller": [ "1.2.30", @@ -126680,6 +129321,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -126690,7 +129334,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.unpublish-extension-build-task.b2664b33-2f30-40a4-b75f-bb9456ad27d2": [ "3.1.60", @@ -126718,6 +129365,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -126728,7 +129378,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-devlabs.vsts-developer-tools-build-tasks.unpublish-extension-build-task.unpublishazuredevopsextension": [ "3.1.60", @@ -126756,6 +129409,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -126766,7 +129422,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "ms-easbuild.buildnotification.task-buildnotification.b0e438f2-18ba-44df-b6e5-1deb7a29811f": [ "1.19.1", @@ -126804,7 +129463,8 @@ "1.4.6", "1.4.7", "1.4.8", - "1.4.9" + "1.4.9", + "1.5.0" ], "ms-omex.prmetrics.prmetrics.prmetrics": [ "1.0.0", @@ -126834,7 +129494,8 @@ "1.4.6", "1.4.7", "1.4.8", - "1.4.9" + "1.4.9", + "1.5.0" ], "ms-openapi.openapidocumenttools.openapidocumentbuilder-build-task.332865cc-aa31-450c-9888-2b2a51e1c5ac": [ "0.0.1", @@ -127166,7 +129827,8 @@ "1.183.0", "1.186.0", "1.189.0", - "1.207.0" + "1.207.0", + "1.218.0" ], "ms-vsclient.app-store.app-store-promote.cbbf7f14-c386-4c1f-80a3-fe500e2bd976": [ "1.0.0", @@ -127184,7 +129846,8 @@ "1.183.0", "1.186.0", "1.189.0", - "1.207.0" + "1.207.0", + "1.218.0" ], "ms-vsclient.app-store.app-store-release.2e371150-da5e-11e5-83da-0943b1acc572": [ "1.0.0", @@ -127207,7 +129870,8 @@ "1.186.0", "1.188.0", "1.189.0", - "1.207.0" + "1.207.0", + "1.218.0" ], "ms-vsclient.app-store.app-store-release.appstorerelease": [ "1.0.0", @@ -127230,7 +129894,8 @@ "1.186.0", "1.188.0", "1.189.0", - "1.207.0" + "1.207.0", + "1.218.0" ], "ms-vsclient.app-store.ipa-resign.cbbf7f14-c386-4c1f-80a3-fe500e2bd977": [ "1.112.0", @@ -127243,7 +129908,8 @@ "1.178.2", "1.186.0", "1.189.0", - "1.207.0" + "1.207.0", + "1.218.0" ], "ms-vsclient.app-store.ipa-resign.iparesign": [ "1.112.0", @@ -127256,7 +129922,8 @@ "1.178.2", "1.186.0", "1.189.0", - "1.207.0" + "1.207.0", + "1.218.0" ], "ms-vsclient.code-push.codepush.tasks.patch.codepushpatch": [ "1.0.0", @@ -127421,7 +130088,8 @@ "4.203.0", "4.207.0", "4.209.0", - "4.216.0" + "4.216.0", + "4.217.0" ], "ms-vsclient.google-play.google-play-release.google-play-release": [ "1.0.0", @@ -127467,7 +130135,8 @@ "4.203.0", "4.207.0", "4.209.0", - "4.216.0" + "4.216.0", + "4.217.0" ], "ms-vsclient.google-play.google-play-rollout-update.f8c97cf9-4e17-4244-b0fb-f540cea78153": [ "1.0.0", @@ -127979,7 +130648,14 @@ "msappcenter.app-center-distribute-v3.custom-build-release-task.appcenterdistributeonpremise": [ "3.173.0" ], - "msbuild-sxs": ["1.198.1", "1.199.0", "1.208.0", "1.212.0", "1.214.0"], + "msbuild-sxs": [ + "1.198.1", + "1.199.0", + "1.208.0", + "1.212.0", + "1.214.0", + "1.217.0" + ], "msbuildhelpertask": [ "0.0.16", "0.1.937", @@ -128672,7 +131348,6 @@ "3.1.0", "3.1.1" ], - "mssql script runner": ["0.1.0", "0.1.1", "0.1.2"], "msswiftkey.android-app-size-diff-utils.android-app-size-diff.911fb029-c89b-4d09-a2d4-610486918018": [ "1.0.0", "1.0.1", @@ -129606,7 +132281,11 @@ "1.411.0", "1.412.0", "1.413.0", - "1.414.0" + "1.414.0", + "1.415.0", + "1.416.0", + "1.419.0", + "1.420.0" ], "ndepend.ndependextension.ndepend-task.ndependtask": [ "1.0.0", @@ -129791,7 +132470,11 @@ "1.411.0", "1.412.0", "1.413.0", - "1.414.0" + "1.414.0", + "1.415.0", + "1.416.0", + "1.419.0", + "1.420.0" ], "ndependtask": [ "1.0.0", @@ -129976,7 +132659,11 @@ "1.411.0", "1.412.0", "1.413.0", - "1.414.0" + "1.414.0", + "1.415.0", + "1.416.0", + "1.419.0", + "1.420.0" ], "needcode.applicationbackup.needcode-applicationbackup.1ae9cc7b-29a4-4614-82df-00dc3ea74cd0": [ "1.0.0", @@ -130168,7 +132855,7 @@ ], "netplus-vsextension-heroku": ["1.0.0", "1.0.6"], "netscalerchangeservicestate": ["0.1.67", "0.1.68"], - "netsparker-cloud": ["1.0.0", "1.5.0", "1.6.0", "1.7.0"], + "netsparker-cloud": ["1.0.0", "1.5.0", "1.6.0", "1.7.0", "1.8.0"], "neudesic.neudesic-devops-framework.xplatgenerate-release-notes.53b075d2-6f98-4419-8fd2-11688a3f0454": [ "3.0.47" ], @@ -130822,7 +133509,10 @@ "1.6.0", "1.6.1", "1.6.2", - "1.6.3" + "1.6.3", + "1.6.4", + "1.6.5", + "1.6.6" ], "nicktolhurst.notion-release-notes.notion-release-notes.31fc17f2-be55-4d37-a5c9-8c50d47612b0": [ "0.1.1", @@ -130998,6 +133688,7 @@ "2.3.48" ], "nkdagility.processtemplate.inheritedprocessmigration-task.c6e8cd46-7141-41d1-b21e-9932e08fa67f": [ + "1.0.1", "1.11.0", "1.11.1", "1.11.21", @@ -131013,9 +133704,11 @@ "1.11.121", "1.11.131", "1.11.141", - "1.11.151" + "1.11.151", + "1.12.41" ], "nkdagility.processtemplate.inheritedprocessmigration-task.ineritedprocessmigration": [ + "1.0.1", "1.11.0", "1.11.1", "1.11.21", @@ -131031,7 +133724,8 @@ "1.11.121", "1.11.131", "1.11.141", - "1.11.151" + "1.11.151", + "1.12.41" ], "nkdagility.processtemplate.processtemplate-task.63823d31-810c-4957-9bc1-859757ace94d": [ "0.2.0", @@ -131057,6 +133751,8 @@ "1.11.13", "1.11.14", "1.11.15", + "1.12.4", + "2.0.0", "2.1.4", "2.1.61", "2.1.78", @@ -131085,6 +133781,7 @@ "2.11.13", "2.11.14", "2.11.15", + "2.12.4", "3.0.0", "3.0.1", "3.11.0", @@ -131103,6 +133800,7 @@ "3.11.13", "3.11.14", "3.11.15", + "3.12.4", "4.0.0", "4.0.2", "4.0.3", @@ -131122,7 +133820,8 @@ "4.11.12", "4.11.13", "4.11.14", - "4.11.15" + "4.11.15", + "4.12.4" ], "nkdagility.processtemplate.processtemplate-task.processtemplate": [ "0.2.0", @@ -131148,11 +133847,13 @@ "1.11.13", "1.11.14", "1.11.15", + "1.12.4", "2.1.4", "2.1.61" ], "nkdagility.processtemplate.processtemplate-task.processtemplatetask": [ "1.9.0", + "2.0.0", "2.1.78", "2.1.710", "2.1.711", @@ -131179,6 +133880,7 @@ "2.11.13", "2.11.14", "2.11.15", + "2.12.4", "3.0.0", "3.0.1", "3.11.0", @@ -131197,6 +133899,7 @@ "3.11.13", "3.11.14", "3.11.15", + "3.12.4", "4.0.0", "4.0.2", "4.0.3", @@ -131216,7 +133919,8 @@ "4.11.12", "4.11.13", "4.11.14", - "4.11.15" + "4.11.15", + "4.12.4" ], "nkdagility.variablehydration.variabledehydration-task.94fd260a-77ed-4c97-a4aa-2a27039e29b8": [ "0.1.0", @@ -131696,44 +134400,64 @@ "nodeandnpmtool": ["0.1.0", "1.0.4", "1.0.5"], "nodejsexec": ["0.1.0", "0.1.3", "0.1.5"], "nodejsrunner": ["0.4.2", "0.6.8", "0.7.8"], - "nokia.ncdcnfsegregationextension.cnfsegregationcontid.6af551d1-13c6-44ce-bb8c-1a4a9c0af93b": [ - "22.6.0" - ], - "nokia.ncdcnfsegregationextension.cnfsegregationcontid.cnfsegregationtask": [ - "22.6.0" - ], "nokia.ncddeployextension.deploycontid.4e6d2469-e404-4080-9719-ac8dc9b7b3ee": [ - "22.6.0" + "22.6.0", + "23.2.0" ], - "nokia.ncddeployextension.deploycontid.deploytask": ["22.6.0"], + "nokia.ncddeployextension.deploycontid.deploytask": ["22.6.0", "23.2.0"], "nokia.ncdextratestsextension.extratestscontid.0b477ee0-b50e-4eb1-84ba-de09326dce3d": [ - "22.6.0" + "22.6.0", + "23.2.0" + ], + "nokia.ncdextratestsextension.extratestscontid.extrateststask": [ + "22.6.0", + "23.2.0" ], - "nokia.ncdextratestsextension.extratestscontid.extrateststask": ["22.6.0"], "nokia.ncdpromotionextension.promotioncontid.79c830dd-92bb-4e02-b330-6638db9df26c": [ - "22.6.0" + "22.6.0", + "23.2.0" + ], + "nokia.ncdpromotionextension.promotioncontid.promotiontask": [ + "22.6.0", + "23.2.0" ], - "nokia.ncdpromotionextension.promotioncontid.promotiontask": ["22.6.0"], "nokia.ncdrepocheckextension.repocheckcontid.e4c104ab-0d8d-4f79-9cdb-4687df347558": [ - "22.6.0" + "22.6.0", + "23.2.0" + ], + "nokia.ncdrepocheckextension.repocheckcontid.repochecktask": [ + "22.6.0", + "23.2.0" ], - "nokia.ncdrepocheckextension.repocheckcontid.repochecktask": ["22.6.0"], "nokia.ncdrollbackextension.rollbackcontid.b6b825f4-533e-42de-82e8-633bb17be567": [ - "22.6.0" + "22.6.0", + "23.2.0" + ], + "nokia.ncdrollbackextension.rollbackcontid.nsrollbacktask": [ + "22.6.0", + "23.2.0" ], - "nokia.ncdrollbackextension.rollbackcontid.nsrollbacktask": ["22.6.0"], "nokia.ncdterminateextension.terminatecontid.b9d2cbbf-a568-432b-bddc-4a8ad11c06a5": [ - "22.6.0" + "22.6.0", + "23.2.0" + ], + "nokia.ncdterminateextension.terminatecontid.terminatenstask": [ + "22.6.0", + "23.2.0" ], - "nokia.ncdterminateextension.terminatecontid.terminatenstask": ["22.6.0"], "nokia.ncdtestnsextension.testcontid.2364f995-5ce9-4f83-87a7-c70166e271b9": [ - "22.6.0" + "22.6.0", + "23.2.0" ], - "nokia.ncdtestnsextension.testcontid.testnstask": ["22.6.0"], + "nokia.ncdtestnsextension.testcontid.testnstask": ["22.6.0", "23.2.0"], "nokia.ncdtestsetupextension.testsetupcontid.bfc50905-2ff3-4d34-be60-b59618fd371e": [ - "22.6.0" + "22.6.0", + "23.2.0" + ], + "nokia.ncdtestsetupextension.testsetupcontid.testsetuptask": [ + "22.6.0", + "23.2.0" ], - "nokia.ncdtestsetupextension.testsetupcontid.testsetuptask": ["22.6.0"], "north52-create-n52-configuration": [ "1.1.0", "1.1.1", @@ -131898,7 +134622,7 @@ "1.0.15", "1.0.16" ], - "npm-audit": ["1.0.0", "1.1.0"], + "npm-audit": ["1.0.0", "1.1.0", "1.2.0"], "nsadiq.newreclicdeploymentmarker.newreclicdeploymentmarker.5164728d-cfca-4576-a066-bde89930bf2b": [ "0.0.16", "1.2.2", @@ -131973,7 +134697,7 @@ "3.0.5", "3.0.6" ], - "nsrollbacktask": ["22.6.0"], + "nsrollbacktask": ["22.6.0", "23.2.0"], "nubeone.tfs-changelog-generator.tfs-changelog-generator-task.29242a04-0b5d-4f5c-9a2a-abbaaba4c690": [ "1.0.0", "1.0.1", @@ -131995,7 +134719,7 @@ "1.1.5" ], "nugetversionsynchronizer": ["0.0.3", "0.0.4"], - "nugetvulnerabilityscan": ["1.0.0"], + "nugetvulnerabilityscan": ["1.0.0", "1.1.0"], "nugetvulnerabilityscantask": [ "1.0.31", "1.0.32", @@ -132019,7 +134743,8 @@ "1.1.17", "1.1.19", "1.1.20", - "1.1.21" + "1.1.21", + "1.1.23" ], "nupkgwrench": [ "0.0.1", @@ -133656,12 +136381,13 @@ "1.2.1", "2.0.12", "2.0.13", - "3.0.1" + "3.0.1", + "3.0.2" ], - "oc-setup": ["1.0.0", "1.0.1", "2.0.12", "2.0.13", "3.0.1"], + "oc-setup": ["1.0.0", "1.0.1", "2.0.12", "2.0.13", "3.0.1", "3.0.2"], "oc3buildtask": ["0.1.0"], "oc3tagtask": ["0.1.0"], - "occonditionalcmd": ["2.0.13", "3.0.1"], + "occonditionalcmd": ["2.0.13", "3.0.1", "3.0.2"], "octane-connection-verifier": ["1.0.0", "1.1.0", "1.4.0"], "octane-end-task": [ "1.0.0", @@ -133708,11 +136434,15 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502" ], "octoinstaller": [ "3.0.162", @@ -133765,12 +136495,20 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" - ], + "5.0.134", + "5.0.465", + "5.0.502", + "6.0.465", + "6.0.502" + ], + "octopusawaittask": ["6.0.465", "6.0.502"], + "octopusbuildinformation": ["6.0.465", "6.0.502"], "octopuscreaterelease": [ "0.4.0", "0.4.5", @@ -133855,6 +136593,8 @@ "3.1.109", "3.1.131", "3.1.134", + "3.1.465", + "3.1.502", "4.0.371", "4.0.375", "4.0.376", @@ -133885,11 +136625,17 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502", + "6.0.465", + "6.0.502" ], "octopusdeploy.octopus-deploy-build-release-tasks.octo-installer.7aeae2f5-8529-4326-b127-a66c334c6e60": [ "3.0.162", @@ -133942,11 +136688,17 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502", + "6.0.465", + "6.0.502" ], "octopusdeploy.octopus-deploy-build-release-tasks.octo-installer.octoinstaller": [ "3.0.162", @@ -133999,11 +136751,33 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502", + "6.0.465", + "6.0.502" + ], + "octopusdeploy.octopus-deploy-build-release-tasks.octopus-await-task.38df691d-23eb-48d4-8638-61764f48bacb": [ + "6.0.465", + "6.0.502" + ], + "octopusdeploy.octopus-deploy-build-release-tasks.octopus-await-task.octopusawaittask": [ + "6.0.465", + "6.0.502" + ], + "octopusdeploy.octopus-deploy-build-release-tasks.octopus-build-information.559b81c9-efc1-40f3-9058-71ab1810d837": [ + "6.0.465", + "6.0.502" + ], + "octopusdeploy.octopus-deploy-build-release-tasks.octopus-build-information.octopusbuildinformation": [ + "6.0.465", + "6.0.502" ], "octopusdeploy.octopus-deploy-build-release-tasks.octopus-cli.ac1f0794-ad67-4c60-a386-8704226392be": [ "4.2.472", @@ -134020,11 +136794,15 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502" ], "octopusdeploy.octopus-deploy-build-release-tasks.octopus-cli.octocli": [ "4.2.472", @@ -134041,11 +136819,15 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502" ], "octopusdeploy.octopus-deploy-build-release-tasks.octopus-create-release.4e131b60-5532-4362-95b6-7c67d9841b4f": [ "0.4.0", @@ -134131,6 +136913,8 @@ "3.1.109", "3.1.131", "3.1.134", + "3.1.465", + "3.1.502", "4.0.371", "4.0.375", "4.0.376", @@ -134161,11 +136945,17 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502", + "6.0.465", + "6.0.502" ], "octopusdeploy.octopus-deploy-build-release-tasks.octopus-create-release.octopuscreaterelease": [ "0.4.0", @@ -134251,6 +137041,8 @@ "3.1.109", "3.1.131", "3.1.134", + "3.1.465", + "3.1.502", "4.0.371", "4.0.375", "4.0.376", @@ -134281,11 +137073,25 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502", + "6.0.465", + "6.0.502" + ], + "octopusdeploy.octopus-deploy-build-release-tasks.octopus-deploy-tenanted.a847e2d1-5435-4d52-a774-6d300953e85f": [ + "6.0.465", + "6.0.502" + ], + "octopusdeploy.octopus-deploy-build-release-tasks.octopus-deploy-tenanted.octopusdeployreleasetenanted": [ + "6.0.465", + "6.0.502" ], "octopusdeploy.octopus-deploy-build-release-tasks.octopus-deploy.8ca1d96a-151d-44b7-bc4f-9251e2ea6971": [ "1.0.1", @@ -134365,6 +137171,8 @@ "3.1.109", "3.1.131", "3.1.134", + "3.1.465", + "3.1.502", "4.0.371", "4.0.375", "4.0.376", @@ -134395,11 +137203,17 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502", + "6.0.465", + "6.0.502" ], "octopusdeploy.octopus-deploy-build-release-tasks.octopus-deploy.octopusdeployrelease": [ "1.0.1", @@ -134479,6 +137293,8 @@ "3.1.109", "3.1.131", "3.1.134", + "3.1.465", + "3.1.502", "4.0.371", "4.0.375", "4.0.376", @@ -134509,11 +137325,17 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502", + "6.0.465", + "6.0.502" ], "octopusdeploy.octopus-deploy-build-release-tasks.octopus-metadata.b1861ef4-b62e-40c1-bcb0-be00d454a8a7": [ "4.0.371", @@ -134546,11 +137368,15 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502" ], "octopusdeploy.octopus-deploy-build-release-tasks.octopus-metadata.octopusmetadata": [ "4.0.371", @@ -134583,11 +137409,31 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502" + ], + "octopusdeploy.octopus-deploy-build-release-tasks.octopus-pack-nuget.72e7a1b6-19bc-48e6-8d20-a81f201d65a3": [ + "6.0.465", + "6.0.502" + ], + "octopusdeploy.octopus-deploy-build-release-tasks.octopus-pack-nuget.octopuspacknuget": [ + "6.0.465", + "6.0.502" + ], + "octopusdeploy.octopus-deploy-build-release-tasks.octopus-pack-zip.3f248d80-a755-498d-863c-f936c5821318": [ + "6.0.465", + "6.0.502" + ], + "octopusdeploy.octopus-deploy-build-release-tasks.octopus-pack-zip.octopuspackzip": [ + "6.0.465", + "6.0.502" ], "octopusdeploy.octopus-deploy-build-release-tasks.octopus-pack.179fac12-2402-486e-80cf-5a6a8571f7c0": [ "1.0.1", @@ -134674,7 +137520,9 @@ "4.3.66", "4.3.109", "4.3.131", - "4.3.134" + "4.3.134", + "4.3.465", + "4.3.502" ], "octopusdeploy.octopus-deploy-build-release-tasks.octopus-pack.octopuspack": [ "1.0.1", @@ -134761,7 +137609,9 @@ "4.3.66", "4.3.109", "4.3.131", - "4.3.134" + "4.3.134", + "4.3.465", + "4.3.502" ], "octopusdeploy.octopus-deploy-build-release-tasks.octopus-promote.1627fcfe-f292-4904-adac-26cfb14bdb07": [ "1.1.20", @@ -134834,6 +137684,8 @@ "3.1.109", "3.1.131", "3.1.134", + "3.1.465", + "3.1.502", "4.0.371", "4.0.375", "4.0.376", @@ -134864,11 +137716,15 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502" ], "octopusdeploy.octopus-deploy-build-release-tasks.octopus-promote.d05ad9a2-5d9e-4a1c-a887-14034334d6f2": [ "1.1.19" @@ -134945,6 +137801,8 @@ "3.1.109", "3.1.131", "3.1.134", + "3.1.465", + "3.1.502", "4.0.371", "4.0.375", "4.0.376", @@ -134975,11 +137833,15 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502" ], "octopusdeploy.octopus-deploy-build-release-tasks.octopus-push.d05ad9a2-5d9e-4a1c-a887-14034334d6f2": [ "1.0.1", @@ -135059,6 +137921,8 @@ "3.1.109", "3.1.131", "3.1.134", + "3.1.465", + "3.1.502", "4.0.371", "4.0.375", "4.0.376", @@ -135089,11 +137953,17 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502", + "6.0.465", + "6.0.502" ], "octopusdeploy.octopus-deploy-build-release-tasks.octopus-push.octopuspush": [ "1.0.1", @@ -135173,6 +138043,8 @@ "3.1.109", "3.1.131", "3.1.134", + "3.1.465", + "3.1.502", "4.0.371", "4.0.375", "4.0.376", @@ -135203,11 +138075,25 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502", + "6.0.465", + "6.0.502" + ], + "octopusdeploy.octopus-deploy-build-release-tasks.octopus-run-runbook.5a2273e0-aa4f-4502-bcba-6817835e2bbd": [ + "6.0.465", + "6.0.502" + ], + "octopusdeploy.octopus-deploy-build-release-tasks.octopus-run-runbook.octopusrunrunbook": [ + "6.0.465", + "6.0.502" ], "octopusdeployrelease": [ "1.0.1", @@ -135287,6 +138173,8 @@ "3.1.109", "3.1.131", "3.1.134", + "3.1.465", + "3.1.502", "4.0.371", "4.0.375", "4.0.376", @@ -135317,12 +138205,19 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502", + "6.0.465", + "6.0.502" ], + "octopusdeployreleasetenanted": ["6.0.465", "6.0.502"], "octopusmetadata": [ "4.0.371", "4.0.375", @@ -135354,11 +138249,15 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502" ], "octopuspack": [ "1.0.1", @@ -135445,8 +138344,12 @@ "4.3.66", "4.3.109", "4.3.131", - "4.3.134" + "4.3.134", + "4.3.465", + "4.3.502" ], + "octopuspacknuget": ["6.0.465", "6.0.502"], + "octopuspackzip": ["6.0.465", "6.0.502"], "octopuspromote": [ "1.1.19", "1.1.20", @@ -135519,6 +138422,8 @@ "3.1.109", "3.1.131", "3.1.134", + "3.1.465", + "3.1.502", "4.0.371", "4.0.375", "4.0.376", @@ -135549,11 +138454,15 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502" ], "octopuspush": [ "1.0.1", @@ -135633,6 +138542,8 @@ "3.1.109", "3.1.131", "3.1.134", + "3.1.465", + "3.1.502", "4.0.371", "4.0.375", "4.0.376", @@ -135663,12 +138574,19 @@ "4.3.109", "4.3.131", "4.3.134", + "4.3.465", + "4.3.502", "5.0.57", "5.0.66", "5.0.109", "5.0.131", - "5.0.134" + "5.0.134", + "5.0.465", + "5.0.502", + "6.0.465", + "6.0.502" ], + "octopusrunrunbook": ["6.0.465", "6.0.502"], "odkmediadevteam.semantic-versioning-for-build.00d41d52-30eb-42cc-9718-b52753e27da2.9def8c2f-98c1-4293-9bff-464769b1e187": [ "1.0.0", "1.0.1", @@ -136189,7 +139107,10 @@ "1.0.9", "1.0.10", "1.0.11", - "1.0.12" + "1.0.12", + "1.0.13", + "1.0.14", + "1.0.15" ], "osservante.osservanterbac.custom-build-release-task2.osservanterbac": [ "0.8.0", @@ -136265,7 +139186,10 @@ "1.0.9", "1.0.10", "1.0.11", - "1.0.12" + "1.0.12", + "1.0.13", + "1.0.14", + "1.0.15" ], "osservanterbac": [ "0.8.0", @@ -136341,7 +139265,10 @@ "1.0.9", "1.0.10", "1.0.11", - "1.0.12" + "1.0.12", + "1.0.13", + "1.0.14", + "1.0.15" ], "ostorlab-azure-security-scanner": [ "1.0.0", @@ -136510,6 +139437,36 @@ "overridelinkedparam": ["0.1.0", "0.1.1", "0.1.2", "0.2.0", "0.2.1", "0.3.0"], "overwrite-template-parameters": ["0.0.1", "0.0.11", "0.0.12", "0.0.13"], "owaspzap": ["0.1.55", "0.1.56", "0.1.57", "1.0.0", "1.0.1"], + "owaspzaponpremisestart": [ + "0.0.3", + "0.0.4", + "0.0.20", + "0.0.21", + "0.0.22", + "0.0.23", + "0.0.24", + "0.0.25", + "0.0.26", + "0.0.27", + "0.0.28", + "0.0.29", + "1.1.8" + ], + "owaspzaponpremisestop": [ + "0.0.3", + "0.0.4", + "0.0.20", + "0.0.21", + "0.0.22", + "0.0.23", + "0.0.24", + "0.0.25", + "0.0.26", + "0.0.27", + "0.0.28", + "0.0.29", + "1.1.8" + ], "owaspzapscan": [ "0.1.2493", "1.0.2544", @@ -136611,6 +139568,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -136621,7 +139581,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "packages-config-merger": ["1.0.2"], "packagesconfigmerger": ["1.0.2"], @@ -136903,7 +139866,11 @@ "5.1.12", "5.1.13", "5.1.14", - "5.1.15" + "5.1.15", + "5.1.16", + "5.1.17", + "5.1.18", + "5.1.19" ], "palmmedia.reportgenerator.reportgenerator-build-release-task.reportgenerator": [ "0.1.0", @@ -137046,7 +140013,11 @@ "5.1.12", "5.1.13", "5.1.14", - "5.1.15" + "5.1.15", + "5.1.16", + "5.1.17", + "5.1.18", + "5.1.19" ], "parallelrunnertask": ["4.0.0"], "parasoft.cpptest-azure-devops.run-cpptest-task.c030fa5b-9e93-47fc-a3ed-3ea4e45ddccf": [ @@ -137433,6 +140404,7 @@ "1.1.0", "1.1.1" ], + "passwordgenerator": ["0.1.1"], "pattontech.adoinstallmodule.adoinstallmodule.298e1d80-87c5-11ed-9ff4-6f09ac3dc39d": [ "1.0.0", "1.1.0", @@ -138599,7 +141571,9 @@ "2.0.17", "2.0.18", "2.0.19", - "2.0.20" + "2.0.20", + "2.0.24", + "2.0.25" ], "philippmanstein.arduino-cli.arduino-cli-build.353dedaa-3740-4ee5-a4f2-ee59f38fdc41": [ "0.1.0", @@ -138754,7 +141728,14 @@ "0.3.4", "0.3.6", "0.3.7", - "0.3.8" + "0.3.8", + "0.3.9", + "0.4.0", + "0.4.1", + "0.4.2", + "0.4.3", + "0.4.4", + "0.4.5" ], "piraces.bicep-tasks.decompile-task.bicepdecompile": [ "0.3.1", @@ -138763,7 +141744,14 @@ "0.3.4", "0.3.6", "0.3.7", - "0.3.8" + "0.3.8", + "0.3.9", + "0.4.0", + "0.4.1", + "0.4.2", + "0.4.3", + "0.4.4", + "0.4.5" ], "piraces.bicep-tasks.install-task.bicepinstall": [ "0.1.0", @@ -138785,7 +141773,14 @@ "0.3.4", "0.3.6", "0.3.7", - "0.3.8" + "0.3.8", + "0.3.9", + "0.4.0", + "0.4.1", + "0.4.2", + "0.4.3", + "0.4.4", + "0.4.5" ], "piraces.bicep-tasks.install-task.c1fb2c87-8141-405c-9ea0-6607cceaca18": [ "0.1.0", @@ -138807,7 +141802,14 @@ "0.3.4", "0.3.6", "0.3.7", - "0.3.8" + "0.3.8", + "0.3.9", + "0.4.0", + "0.4.1", + "0.4.2", + "0.4.3", + "0.4.4", + "0.4.5" ], "piraces.bicep-tasks.run-task.16e7624f-1531-47bc-b81e-7274655f7d13": [ "0.1.0", @@ -138829,7 +141831,14 @@ "0.3.4", "0.3.6", "0.3.7", - "0.3.8" + "0.3.8", + "0.3.9", + "0.4.0", + "0.4.1", + "0.4.2", + "0.4.3", + "0.4.4", + "0.4.5" ], "piraces.bicep-tasks.run-task.bicepbuild": [ "0.1.0", @@ -138851,7 +141860,14 @@ "0.3.4", "0.3.6", "0.3.7", - "0.3.8" + "0.3.8", + "0.3.9", + "0.4.0", + "0.4.1", + "0.4.2", + "0.4.3", + "0.4.4", + "0.4.5" ], "pjcollins.azp-utilities-boots.boots.boots": [ "0.1.0", @@ -139073,11 +142089,14 @@ ], "power-bi-utility-task": ["1.0.24"], "power-crm-service-endpoint-task": ["1.0.3"], + "power-crm-tools-fetchxml-builder-view-data": ["1.1.1", "1.1.2"], + "power-crm-tools-fetchxml-upsert-data": ["1.0.3", "1.0.4"], "power-crm-tools-installer-task": ["1.0.0"], "power-crm-tools-register-image1": ["1.0.3", "1.0.4"], "power-crm-tools-register-step": ["1.0.5", "1.0.14"], "power-crm-tools-register-webhook": ["1.0.5"], "power-crm-tools-webapi-installer": ["1.1.0", "1.1.1"], + "power-crm-tools-webapi-installer-upsert-data": ["1.0.2", "1.0.3"], "power-crm-tools-webapi-register-image": ["1.0.3"], "power-crm-tools-webapi-register-step": ["1.0.8", "1.2.7", "1.2.9"], "powerbi.createworkspace": [ @@ -139351,6 +142370,42 @@ "1.2.11", "1.2.12" ], + "poweronplatforms.akvcodesign.akvcodesign.02dbaba0-04f3-4c6e-a780-d0c4d36a7f8c": [ + "0.0.1", + "0.0.2", + "0.1.0", + "0.1.1", + "0.1.4", + "0.1.5", + "0.1.6", + "0.2.1", + "0.2.2", + "0.2.3", + "0.2.4", + "0.3.0", + "1.0.0", + "1.0.1", + "1.0.2" + ], + "poweronplatforms.akvcodesign.akvcodesign.akv-code-sign": [ + "0.2.1", + "0.2.2", + "0.2.3", + "0.2.4", + "0.3.0", + "1.0.0", + "1.0.1", + "1.0.2" + ], + "poweronplatforms.akvcodesign.akvcodesign.avd-code-sign": [ + "0.0.1", + "0.0.2", + "0.1.0", + "0.1.1", + "0.1.4", + "0.1.5", + "0.1.6" + ], "powerplatformaddsolutioncomponent": [ "2.0.3", "2.0.4", @@ -139359,7 +142414,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "powerplatformapplysolutionupgrade": [ "0.0.23", @@ -139381,9 +142438,11 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], - "powerplatformassigngroup": ["2.0.13", "2.0.15"], + "powerplatformassigngroup": ["2.0.13", "2.0.15", "2.0.16", "2.0.17"], "powerplatformassignuser": [ "2.0.3", "2.0.4", @@ -139392,7 +142451,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "powerplatformbackupenvironment": [ "0.0.1", @@ -139423,7 +142484,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "powerplatformchecker": [ "0.0.1", @@ -139454,7 +142517,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "powerplatformcopyenvironment": [ "0.0.1", @@ -139485,7 +142550,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "powerplatformcreateenvironment": [ "0.0.1", @@ -139516,7 +142583,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "powerplatformdeleteenvironment": [ "0.0.1", @@ -139547,21 +142616,72 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" + ], + "powerplatformdeletesolution": [ + "0.0.23", + "0.0.35", + "0.0.40", + "0.0.41", + "0.0.76", + "0.0.77", + "0.0.81", + "0.0.82", + "0.0.84", + "0.0.85", + "0.0.87", + "0.0.89", + "2.0.3", + "2.0.4", + "2.0.5", + "2.0.7", + "2.0.8", + "2.0.10", + "2.0.13", + "2.0.15", + "2.0.16", + "2.0.17" + ], + "powerplatformdeploypackage": [ + "0.0.1", + "0.0.3", + "0.0.4", + "0.0.8", + "0.0.13", + "0.0.17", + "0.0.19", + "0.0.20", + "0.0.22", + "0.0.23", + "0.0.35", + "0.0.40", + "0.0.41", + "0.0.76", + "0.0.77", + "0.0.81", + "0.0.82", + "0.0.84", + "0.0.85", + "0.0.87", + "0.0.89", + "2.0.3", + "2.0.4", + "2.0.5", + "2.0.7", + "2.0.8", + "2.0.10", + "2.0.13", + "2.0.15", + "2.0.16", + "2.0.17" ], - "powerplatformdeletesolution": [ - "0.0.23", - "0.0.35", - "0.0.40", - "0.0.41", + "powerplatformdownloadpaportal": [ "0.0.76", - "0.0.77", "0.0.81", "0.0.82", "0.0.84", - "0.0.85", - "0.0.87", - "0.0.89", "2.0.3", "2.0.4", "2.0.5", @@ -139569,9 +142689,20 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], - "powerplatformdeploypackage": [ + "powerplatformexportdata": [ + "2.0.7", + "2.0.8", + "2.0.10", + "2.0.13", + "2.0.15", + "2.0.16", + "2.0.17" + ], + "powerplatformexportsolution": [ "0.0.1", "0.0.3", "0.0.4", @@ -139600,24 +142731,20 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], - "powerplatformdownloadpaportal": [ - "0.0.76", - "0.0.81", - "0.0.82", - "0.0.84", - "2.0.3", - "2.0.4", - "2.0.5", + "powerplatformimportdata": [ "2.0.7", "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], - "powerplatformexportdata": ["2.0.7", "2.0.8", "2.0.10", "2.0.13", "2.0.15"], - "powerplatformexportsolution": [ + "powerplatformimportsolution": [ "0.0.1", "0.0.3", "0.0.4", @@ -139646,41 +142773,17 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], - "powerplatformimportdata": ["2.0.7", "2.0.8", "2.0.10", "2.0.13", "2.0.15"], - "powerplatformimportsolution": [ - "0.0.1", - "0.0.3", - "0.0.4", - "0.0.8", - "0.0.13", - "0.0.17", - "0.0.19", - "0.0.20", - "0.0.22", - "0.0.23", - "0.0.35", - "0.0.40", - "0.0.41", - "0.0.76", - "0.0.77", - "0.0.81", - "0.0.82", - "0.0.84", - "0.0.85", - "0.0.87", - "0.0.89", - "2.0.3", - "2.0.4", - "2.0.5", - "2.0.7", - "2.0.8", + "powerplatforminstallapplication": [ "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], - "powerplatforminstallapplication": ["2.0.10", "2.0.13", "2.0.15"], "powerplatformpacksolution": [ "0.0.1", "0.0.3", @@ -139710,7 +142813,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "powerplatformpublishcustomizations": [ "0.0.1", @@ -139741,7 +142846,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "powerplatformresetenvironment": [ "0.0.1", @@ -139772,7 +142879,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "powerplatformrestoreenvironment": [ "0.0.1", @@ -139803,14 +142912,18 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "powerplatformsetconnectionvariables": [ "2.0.7", "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "powerplatformsetsolutionversion": [ "0.0.1", @@ -139841,7 +142954,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "powerplatformtoolinstaller": [ "0.0.1", @@ -139872,7 +142987,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "powerplatformunpacksolution": [ "0.0.1", @@ -139903,7 +143020,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "powerplatformuploadpaportal": [ "0.0.76", @@ -139917,7 +143036,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "powerplatformwhoami": [ "0.0.1", @@ -139948,7 +143069,9 @@ "2.0.8", "2.0.10", "2.0.13", - "2.0.15" + "2.0.15", + "2.0.16", + "2.0.17" ], "powershell": ["1.0.0", "1.0.1", "1.0.2"], "powershell script analyzer": [ @@ -140313,7 +143436,8 @@ "1.4.6", "1.4.7", "1.4.8", - "1.4.9" + "1.4.9", + "1.5.0" ], "process-sass-files": ["0.0.8", "0.0.9", "0.1.0"], "processtabularmodeltask": [ @@ -140349,11 +143473,13 @@ "1.11.13", "1.11.14", "1.11.15", + "1.12.4", "2.1.4", "2.1.61" ], "processtemplatetask": [ "1.9.0", + "2.0.0", "2.1.78", "2.1.710", "2.1.711", @@ -140380,6 +143506,7 @@ "2.11.13", "2.11.14", "2.11.15", + "2.12.4", "3.0.0", "3.0.1", "3.11.0", @@ -140398,6 +143525,7 @@ "3.11.13", "3.11.14", "3.11.15", + "3.12.4", "4.0.0", "4.0.2", "4.0.3", @@ -140417,7 +143545,8 @@ "4.11.12", "4.11.13", "4.11.14", - "4.11.15" + "4.11.15", + "4.12.4" ], "projectfileprops": ["1.0.0", "1.1.2", "1.2.0", "1.2.1"], "projectvarreader": ["0.1.0"], @@ -140503,7 +143632,7 @@ "0.1.38", "0.1.40" ], - "promotiontask": ["22.6.0"], + "promotiontask": ["22.6.0", "23.2.0"], "proofdock.chaos-platform.chaos-attack-runner-task.a0d95e01-832d-4d0f-8114-c6f15c8dd418": [ "0.3.11", "0.3.21", @@ -141244,8 +144373,12 @@ "1.15.1239", "1.15.1261", "1.23.1279", - "1.24.1281" + "1.24.1281", + "1.25.1302", + "1.26.1308", + "1.27.1315" ], + "publishallurereport": ["1.0.19", "1.0.20", "1.0.21"], "publishartifacts-task": [ "0.1.0", "0.1.1", @@ -141305,6 +144438,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -141315,7 +144451,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "publishazuredscpullserverconfigurations": ["1.0.2", "1.0.3", "1.0.4"], "publishbcappdocker": [ @@ -141387,7 +144526,8 @@ "8.5.0", "8.6.0", "8.7.0", - "8.8.0" + "8.8.0", + "8.9.0" ], "publishbcapppertenant": ["1.0.2", "1.0.3"], "publishcostdata": [ @@ -141415,7 +144555,8 @@ "1.0.5", "1.0.6", "1.0.7", - "1.0.8" + "1.0.8", + "1.0.9" ], "publishdacpactask": [ "1.1.0", @@ -141567,6 +144708,7 @@ "1.2.174", "3.0.0" ], + "publishjgivenreport": ["0.4.0", "0.4.1", "0.5.0", "0.5.1", "0.5.2"], "publishmarkdownreports": [ "1.0.0", "1.0.1", @@ -141873,6 +145015,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -141883,7 +145028,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "publishvsextension": [ "1.2.14", @@ -142480,7 +145628,10 @@ "2022.1.1", "2022.2.1", "2022.2.4", - "2022.3.0" + "2022.3.0", + "2022.3.2", + "2022.3.3", + "2022.3.4" ], "quadrotech.adoscheduledworkitemquery.adoscheduledworkitemquery.adoscheduledworkitemquery": [ "0.1.0", @@ -143244,6 +146395,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.124", "4.1.8", "4.1.50", @@ -143255,8 +146409,12 @@ "4.1.142", "4.1.149", "4.1.161", - "4.1.178" + "4.1.178", + "4.1.220", + "4.1.260", + "4.1.268" ], + "querymailer": ["0.1.0", "0.2.0", "0.3.0"], "querysurge-run-suite-task": [ "0.1.18", "0.1.19", @@ -145026,16 +148184,6 @@ "1.0.7", "1.0.8" ], - "ray-lomax.mssql-script-runner.custom-build-release-task.5bb56a8d-9525-4af3-a64d-dae0677dd692": [ - "0.1.0", - "0.1.1", - "0.1.2" - ], - "ray-lomax.mssql-script-runner.custom-build-release-task.mssql script runner": [ - "0.1.0", - "0.1.1", - "0.1.2" - ], "ray-lomax.web-config-changer.custom-build-task.84c56f60-f8ed-11e9-bd58-73f707d2abec": [ "1.0.0", "1.0.1", @@ -146063,7 +149211,8 @@ "1.0.1", "2.0.12", "2.0.13", - "3.0.1" + "3.0.1", + "3.0.2" ], "redhat.openshift-vsts.config-map-task.config-map": [ "0.1.0", @@ -146073,7 +149222,8 @@ "1.0.1", "2.0.12", "2.0.13", - "3.0.1" + "3.0.1", + "3.0.2" ], "redhat.openshift-vsts.oc-cmd-task.ebaf1cdc-a60f-4e57-ba29-e3b8f80aeb1e": [ "1.0.0", @@ -146085,7 +149235,8 @@ "1.2.1", "2.0.12", "2.0.13", - "3.0.1" + "3.0.1", + "3.0.2" ], "redhat.openshift-vsts.oc-cmd-task.oc-cmd": [ "1.0.0", @@ -146097,35 +149248,40 @@ "1.2.1", "2.0.12", "2.0.13", - "3.0.1" + "3.0.1", + "3.0.2" ], "redhat.openshift-vsts.oc-conditional-cmd-task.88e0bab6-9798-47cb-a37d-ef65f41992ae": [ "2.0.13", - "3.0.1" + "3.0.1", + "3.0.2" ], "redhat.openshift-vsts.oc-conditional-cmd-task.occonditionalcmd": [ "2.0.13", - "3.0.1" + "3.0.1", + "3.0.2" ], "redhat.openshift-vsts.oc-setup-task.44babac3-ab28-4f68-b843-bf2c295a4a2d": [ "1.0.0", "1.0.1", "2.0.12", "2.0.13", - "3.0.1" + "3.0.1", + "3.0.2" ], "redhat.openshift-vsts.oc-setup-task.oc-setup": [ "1.0.0", "1.0.1", "2.0.12", "2.0.13", - "3.0.1" + "3.0.1", + "3.0.2" ], - "rediscacheaddkey": ["1.0.0", "1.0.5", "1.1.0"], + "rediscacheaddkey": ["1.0.0", "1.0.5", "1.1.0", "2.0.0", "2.0.1"], "rediscacheclear": ["1.0.0", "1.0.1", "1.0.3", "1.0.4"], - "rediscacheclearkey": ["1.0.0", "1.0.5", "1.1.0"], - "rediscacheflushall": ["1.0.0", "1.0.5", "1.1.0"], - "rediscacheflushdb": ["1.0.0", "1.1.0"], + "rediscacheclearkey": ["1.0.0", "1.0.5", "1.1.0", "2.0.0", "2.0.1"], + "rediscacheflushall": ["1.0.0", "1.0.5", "1.1.0", "2.0.0", "2.0.1"], + "rediscacheflushdb": ["1.0.0", "1.1.0", "2.0.0", "2.0.1"], "redskysoftware.clickoncemore-build-task.clickoncemore-build-task.76fdf717-3934-43da-94f3-3a4d75429686": [ "0.1.0", "0.2.0", @@ -146663,7 +149819,8 @@ "2.425.0", "2.426.0", "2.427.0", - "2.430.0" + "2.430.0", + "2.431.0" ], "releasenoteshub.rnh-pipelinetasks.rnh_trigger_publish_pipelinetask.6b70386a-f361-429f-aa56-2a87bb4e75e4": [ "1.0.0", @@ -147473,7 +150630,7 @@ "2.1.5", "2.1.6" ], - "repochecktask": ["22.6.0"], + "repochecktask": ["22.6.0", "23.2.0"], "reportdelete": ["1.2.0"], "reportgenerator": [ "0.1.0", @@ -147627,7 +150784,11 @@ "5.1.12", "5.1.13", "5.1.14", - "5.1.15" + "5.1.15", + "5.1.16", + "5.1.17", + "5.1.18", + "5.1.19" ], "reporting deploy": [ "2.0.1", @@ -147989,15 +151150,26 @@ "0.3.5", "0.3.6" ], + "revbits-azure-devops": ["0.1.0", "0.2.0"], + "revbits.23109661-d255-48cd-be71-68607cccb11d.custom-build-release-task.014c9bfe-c595-42b2-ba14-9f43c2a0e265": [ + "0.1.0", + "0.2.0" + ], + "revbits.23109661-d255-48cd-be71-68607cccb11d.custom-build-release-task.revbits-azure-devops": [ + "0.1.0", + "0.2.0" + ], "revenera.codeinsight.buildtask.b35a84b6-16c3-4d53-9593-53e8ff6e28ca": [ "2.0.0", "2.1.0", - "3.1.0" + "3.1.0", + "3.2.0" ], "revenera.codeinsight.buildtask.code insight scan": [ "2.0.0", "2.1.0", - "3.1.0" + "3.1.0", + "3.2.0" ], "revenera.installshieldbuild.build-is-task.6b134cb3-d9ca-444e-9273-e89482a70569": [ "1.0.0" @@ -148007,20 +151179,22 @@ "1.0.0" ], "revenera.installshieldbuild.install-is-task.installshieldinstall": ["1.0.0"], - "rezilion": ["2.2.0", "2.3.0", "2.4.0", "2.5.0", "2.6.0"], + "rezilion": ["2.2.0", "2.3.0", "2.4.0", "2.5.0", "2.6.0", "2.7.0"], "rezilionvalidate.rezilion.custom-build-release-task.91031a8b-7661-4210-80d8-6ea5d26ed5fd": [ "2.2.0", "2.3.0", "2.4.0", "2.5.0", - "2.6.0" + "2.6.0", + "2.7.0" ], "rezilionvalidate.rezilion.custom-build-release-task.rezilion": [ "2.2.0", "2.3.0", "2.4.0", "2.5.0", - "2.6.0" + "2.6.0", + "2.7.0" ], "rezstream.appcfg-settings.appcfg-settings.appcfg-settings": [ "0.1.0", @@ -148803,7 +151977,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-androidmanifest-task.versionandroidmanifest": [ "1.24.19", @@ -148870,7 +152045,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-angularfile-task.b667bc49-cad0-48f5-b727-3a6bb418222f": [ "1.31.7", @@ -148930,7 +152106,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-angularfile-task.versionangularfile": [ "1.31.7", @@ -148990,7 +152167,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-appx-task.ea3a1166-3aee-434f-b34d-0bf5f763e1f2": [ "1.1.1", @@ -149080,7 +152258,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-appx-task.versionappx": [ "1.1.1", @@ -149170,7 +152349,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-assemblies-task.e47012ed-074c-4f77-ac9f-a6812f900ab0": [ "1.1.0", @@ -149260,7 +152440,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-assemblies-task.versionassemblies": [ "1.1.0", @@ -149350,7 +152531,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-dacpac-task.fd593137-89b4-4d81-82f1-c098c1343e0a": [ "1.1.0", @@ -149440,7 +152622,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-dacpac-task.versiondacpac": [ "1.1.0", @@ -149530,7 +152713,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-dotnetcoreassemblies-task.4578fa22-6039-4d83-90e0-3e12f68d6b26": [ "1.15.22", @@ -149606,7 +152790,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-dotnetcoreassemblies-task.versiondotnetcoreassemblies": [ "1.15.22", @@ -149682,7 +152867,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-iosplistmanifest-task.e23ccfaa-0d23-4fb7-b9f1-215b3060c452": [ "2.33.16", @@ -149694,7 +152880,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-iosplistmanifest-task.versioniosplistmanifest": [ "2.33.16", @@ -149706,7 +152893,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-jsonfile-task.3190c289-2a62-49c4-a126-df889a58018d": [ "1.31.7", @@ -149766,7 +152954,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-jsonfile-task.versionjsonfile": [ "1.31.7", @@ -149826,7 +153015,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-nuspec-task.dd570fa4-abc8-4845-87b3-04be7f189ad8": [ "1.6.6", @@ -149912,7 +153102,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-nuspec-task.versionnuspec": [ "1.6.6", @@ -149998,7 +153189,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-powershellmodule-task.036278fe-8a47-426b-b5b3-bef05334db00": [ "1.40.4", @@ -150049,7 +153241,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-powershellmodule-task.versionpowershellmodule": [ "1.40.4", @@ -150100,7 +153293,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-sharepointappmanifest-task.2d932e86-7068-4a1e-ab4d-f104fad6db37": [ "1.12.4", @@ -150180,7 +153374,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-sharepointappmanifest-task.versionsharepointappmanifest": [ "1.12.4", @@ -150260,7 +153455,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-vsix-task.76d2151f-27c2-430c-8116-73693d3ab13e": [ "1.2.0", @@ -150350,7 +153546,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-vsix-task.versionvsix": [ "1.2.0", @@ -150440,7 +153637,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-wix-task.fd2ef332-9676-4e8f-8e95-b22be61ec9dd": [ "1.15.22", @@ -150516,7 +153714,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-versioning-task.version-wix-task.versionwix": [ "1.15.22", @@ -150592,7 +153791,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "richardfennellbm.bm-vsts-wikipdfexport-tasks.wikipdfexporttask.48d40d27-32e1-460e-8ea6-0dfb48abdd6f": [ "1.0.17", @@ -150610,7 +153810,9 @@ "2.5.4", "2.6.2", "2.7.4", - "3.0.10" + "3.0.10", + "3.1.2", + "3.2.2" ], "richardfennellbm.bm-vsts-wikipdfexport-tasks.wikipdfexporttask.wikipdfexporttask": [ "1.0.17", @@ -150628,7 +153830,9 @@ "2.5.4", "2.6.2", "2.7.4", - "3.0.10" + "3.0.10", + "3.1.2", + "3.2.2" ], "richardfennellbm.bm-vsts-wikiupdater-tasks.wikifolderupdatertask.2f22eed4-2ef7-407e-98d8-3b20ca0a5352": [ "1.10.21", @@ -150670,7 +153874,10 @@ "1.46.7", "2.0.3", "2.0.5", - "2.2.2" + "2.2.2", + "2.3.5", + "2.4.2", + "2.5.2" ], "richardfennellbm.bm-vsts-wikiupdater-tasks.wikifolderupdatertask.wikifolderupdatertask": [ "1.10.21", @@ -150712,7 +153919,10 @@ "1.46.7", "2.0.3", "2.0.5", - "2.2.2" + "2.2.2", + "2.3.5", + "2.4.2", + "2.5.2" ], "richardfennellbm.bm-vsts-wikiupdater-tasks.wikiupdatertask.e59c5ae6-3afd-479d-bc40-81cd6c541840": [ "1.0.30", @@ -150764,7 +153974,10 @@ "1.46.7", "2.0.3", "2.0.5", - "2.2.2" + "2.2.2", + "2.3.5", + "2.4.2", + "2.5.2" ], "richardfennellbm.bm-vsts-wikiupdater-tasks.wikiupdatertask.wikiupdatertask": [ "1.0.30", @@ -150816,7 +154029,10 @@ "1.46.7", "2.0.3", "2.0.5", - "2.2.2" + "2.2.2", + "2.3.5", + "2.4.2", + "2.5.2" ], "richardfennellbm.bm-vsts-xplatgeneratereleasenotes.xplatgenerate-release-notes.7b0a5887-75c4-4ade-a915-f92a93c934cb": [ "1.0.9", @@ -150979,7 +154195,11 @@ "3.90.11", "4.0.16", "4.1.2", - "4.2.2" + "4.2.2", + "4.3.3", + "4.4.1", + "4.5.2", + "4.6.2" ], "richardfennellbm.bm-vsts-xplatgeneratereleasenotes.xplatgenerate-release-notes.xplatgeneratereleasenotes": [ "1.0.9", @@ -151142,7 +154362,11 @@ "3.90.11", "4.0.16", "4.1.2", - "4.2.2" + "4.2.2", + "4.3.3", + "4.4.1", + "4.5.2", + "4.6.2" ], "richardfennellbm.bm-vsts-yamlgenerator.yamlgeneratortask.02d4adb5-7ba0-4164-ab9b-9c1facc97b3d": [ "1.0.30", @@ -152155,7 +155379,9 @@ "2.0.17", "2.0.18", "2.0.19", - "2.0.20" + "2.0.20", + "2.0.24", + "2.0.25" ], "roboyo.petze.petze.petze": [ "2.0.11", @@ -152167,7 +155393,9 @@ "2.0.17", "2.0.18", "2.0.19", - "2.0.20" + "2.0.20", + "2.0.24", + "2.0.25" ], "rocketchathooknotification": ["1.0.0", "1.0.1", "1.1.0", "1.2.0"], "rocketsurgeonsguild.variable-tools.deserializevariables.ac2148ca-7a62-4363-9cc5-2b9a5de9c037": [ @@ -152623,7 +155851,7 @@ "2.0.5", "2.0.6" ], - "rsat": ["1.0.2"], + "rsat": ["1.0.2", "1.0.3"], "rschiefer.msdeployallthethings.msdeploy-package-sync.bfb8e654-51d4-4ed0-8e04-2b3f0f4fcb6d": [ "0.1.0", "0.2.0", @@ -152964,6 +156192,17 @@ "0.9.191", "0.9.196" ], + "run-lumar-protect-build-task": [ + "1.1.0", + "1.1.1", + "1.1.2", + "1.1.3", + "1.1.4", + "1.1.5", + "1.1.6", + "1.1.7", + "1.1.8" + ], "run-pipeline": ["1.1.1", "1.2.0"], "run-stryker": [ "0.1.0", @@ -153179,10 +156418,11 @@ "3.0.0", "4.0.0" ], + "runhawkscan": ["0.1.0"], "runhelloworld": ["0.1.0"], "runhelloworldapp": ["0.2.0"], "runjtest": ["1.0.0", "1.0.1", "1.0.2", "1.0.3", "1.0.4", "1.0.5"], - "runmatlabbuild": ["0.7.5", "0.8.10", "0.8.34"], + "runmatlabbuild": ["0.7.5", "0.8.10", "0.8.34", "0.9.19"], "runmatlabcommand": [ "0.1.4", "0.1.8", @@ -153202,7 +156442,8 @@ "0.6.32", "0.7.5", "0.8.10", - "0.8.34" + "0.8.34", + "0.9.19" ], "runmatlabtests": [ "0.1.4", @@ -153223,8 +156464,10 @@ "0.6.32", "0.7.5", "0.8.10", - "0.8.34" + "0.8.34", + "0.9.19" ], + "runneuron": ["0.1.0"], "runnotebook": [ "0.1.0", "0.1.1", @@ -155025,7 +158268,8 @@ "0.0.5", "0.0.6", "0.0.7", - "0.1.2" + "0.1.2", + "0.1.3" ], "scribesecurity.valint-cli.custom-build-release-install-task.e7b5f8cb-6824-434d-8a6e-a23d2024ecd6": [ "0.0.1", @@ -155035,7 +158279,8 @@ "0.0.5", "0.0.6", "0.0.7", - "0.1.2" + "0.1.2", + "0.1.3" ], "scribesecurity.valint-cli.custom-build-release-install-task.scribeinstall": [ "0.0.1", @@ -155044,7 +158289,8 @@ "0.0.5", "0.0.6", "0.0.7", - "0.1.2" + "0.1.2", + "0.1.3" ], "scribesecurity.valint-cli.custom-build-release-install-task.valintinstall": [ "0.0.2" @@ -155057,7 +158303,8 @@ "0.0.5", "0.0.6", "0.0.7", - "0.1.2" + "0.1.2", + "0.1.3" ], "scribesecurity.valint-cli.custom-build-release-task.valintcli": [ "0.0.1", @@ -155067,7 +158314,8 @@ "0.0.5", "0.0.6", "0.0.7", - "0.1.2" + "0.1.2", + "0.1.3" ], "scribesolutiondeployment": [ "0.1.0", @@ -158565,16 +161813,6 @@ "2.0.3", "3.0.0" ], - "servicefabricpackageversioning": [ - "1.0.0", - "1.0.1", - "1.0.2", - "1.0.3", - "1.1.0", - "1.2.0", - "1.3.0", - "1.4.0" - ], "servicefabricupdater": [ "1.0.0", "1.1.0", @@ -158708,7 +161946,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow-devops-agent-job-notification": [ "1.12.0", @@ -158723,7 +161962,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow-devops-agent-package-registration": [ "1.13.0", @@ -158737,7 +161977,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow-devops-build-sonar-registration": [ "1.27.0", @@ -158746,7 +161987,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow-devops-config-agent-export-snapshot": [ "1.29.0", @@ -158754,7 +161996,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow-devops-config-agent-get-snapshot": [ "1.29.0", @@ -158762,7 +162005,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow-devops-config-agent-get-snapshot-name": [ "1.29.0", @@ -158770,7 +162014,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow-devops-config-agent-publish-snapshot": [ "1.29.0", @@ -158778,14 +162023,16 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow-devops-config-agent-register-changeset": ["1.29.0", "1.30.0"], "servicenow-devops-config-agent-register-pipeline": [ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow-devops-config-agent-upload-config": [ "1.29.0", @@ -158793,13 +162040,15 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow-devops-config-agent-validate-snapshot": [ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow-devops-release-gate": [ "1.18.0", @@ -158811,7 +162060,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow-devops-release-sonar-registration": [ "1.27.0", @@ -158820,7 +162070,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow-devops-server-artifact-registration": [ "1.13.0", @@ -158834,7 +162085,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow-devops-server-change-acceleration": [ "1.12.0", @@ -158849,7 +162101,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow-devops-server-job-notification": [ "1.12.0", @@ -158864,7 +162117,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow-devops-server-package-registration": [ "1.13.0", @@ -158878,7 +162132,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-cicd.servicenow-cicd-app-install.23e1b115-2add-408e-aad7-a3bd182106b1": [ "1.3.26", @@ -159112,7 +162367,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-artifact-registration.servicenow-devops-agent-artifact-registration": [ "1.13.0", @@ -159126,7 +162382,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-export-snapshot.d4be1abb-797c-4c72-9a8b-e7940d99989b": [ "1.29.0", @@ -159134,7 +162391,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-export-snapshot.servicenow-devops-config-agent-export-snapshot": [ "1.29.0", @@ -159142,7 +162400,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-get-snapshot-name.6e307f2f-97c2-4174-85b7-9f6dc7ea8dea": [ "1.29.0", @@ -159150,7 +162409,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-get-snapshot-name.servicenow-devops-config-agent-get-snapshot-name": [ "1.29.0", @@ -159158,7 +162418,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-get-snapshots.96a3faa7-5340-4256-8917-970ca39bab38": [ "1.29.0", @@ -159166,7 +162427,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-get-snapshots.servicenow-devops-config-agent-get-snapshot": [ "1.29.0", @@ -159174,7 +162436,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-package-registration.d610a5f3-d9ab-417c-a225-acce53c7aa5a": [ "1.13.0", @@ -159188,7 +162451,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-package-registration.servicenow-devops-agent-package-registration": [ "1.13.0", @@ -159202,7 +162466,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-publish-snapshot.fdc14df9-f6cd-4148-b639-3398a4ffafca": [ "1.29.0", @@ -159210,7 +162475,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-publish-snapshot.servicenow-devops-config-agent-publish-snapshot": [ "1.29.0", @@ -159218,7 +162484,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-register-changeset.3b2d7e1e-bfb3-4c31-9dd7-7a8bdd5c7d40": [ "1.29.0", @@ -159226,7 +162493,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-register-changeset.servicenow-devops-config-agent-register-changeset": [ "1.29.0", @@ -159236,7 +162504,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-task.b7625796-8dc6-4ee1-ae78-d6e274262dbe": [ "1.12.0", @@ -159251,7 +162520,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-task.servicenow-devops-agent-job-notification": [ "1.12.0", @@ -159266,7 +162536,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-upload-config.696ef4a7-a01e-46c1-a5f6-95f1cc959a16": [ "1.29.0", @@ -159274,7 +162545,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-upload-config.servicenow-devops-config-agent-upload-config": [ "1.29.0", @@ -159282,19 +162554,22 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-validate-snapshot.c4f259b3-48d0-43c5-bfed-4dae0f926610": [ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-agent-validate-snapshot.servicenow-devops-config-agent-validate-snapshot": [ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-build-sonar-registration.9ceafa4d-f759-4d9f-b792-01921f9c5ef4": [ "1.27.0", @@ -159303,7 +162578,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-build-sonar-registration.servicenow-devops-build-sonar-registration": [ "1.27.0", @@ -159312,7 +162588,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-release-gate.8bf41776-72f2-4374-895d-97fbacd5f8fc": [ "1.18.0", @@ -159324,7 +162601,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-release-gate.servicenow-devops-release-gate": [ "1.18.0", @@ -159336,7 +162614,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-release-sonar-registration.ec14217a-39bb-4f2f-a848-6fc65488b587": [ "1.27.0", @@ -159345,7 +162624,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-release-sonar-registration.servicenow-devops-release-sonar-registration": [ "1.27.0", @@ -159354,7 +162634,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-server-artifact-registration.aee0bd5d-5c2b-4866-88ed-cfe9a12de17c": [ "1.13.0", @@ -159368,7 +162649,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-server-artifact-registration.servicenow-devops-server-artifact-registration": [ "1.13.0", @@ -159382,7 +162664,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-server-change-acceleration-task.cc385e0a-d0b6-44e5-b891-6a20cac0cfe7": [ "1.12.0", @@ -159397,7 +162680,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-server-change-acceleration-task.servicenow-devops-server-change-acceleration": [ "1.12.0", @@ -159412,7 +162696,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-server-package-registration.bd27f3a6-4cd8-4b91-8e69-a979b89df6bb": [ "1.13.0", @@ -159426,7 +162711,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-server-package-registration.servicenow-devops-server-package-registration": [ "1.13.0", @@ -159440,7 +162726,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-server-task.ec5c1f40-f00e-4475-acb4-e86be6d206fa": [ "1.12.0", @@ -159455,7 +162742,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicenow.vss-services-servicenow-devops.servicenowdevops-server-task.servicenow-devops-server-job-notification": [ "1.12.0", @@ -159470,7 +162758,8 @@ "1.33.3", "1.34.1", "1.35.0", - "1.36.0" + "1.36.0", + "1.37.0" ], "servicioswindows": [ "0.0.2", @@ -159573,7 +162862,17 @@ "0.1.33", "0.1.34", "0.1.35", - "0.1.36" + "0.1.36", + "0.1.37", + "0.1.38", + "0.1.39", + "0.1.40", + "0.1.41", + "0.1.42", + "0.1.43", + "0.1.44", + "0.1.45", + "0.1.46" ], "set-azure-ad-application": [ "1.0.1", @@ -159736,7 +163035,17 @@ "0.1.33", "0.1.34", "0.1.35", - "0.1.36" + "0.1.36", + "0.1.37", + "0.1.38", + "0.1.39", + "0.1.40", + "0.1.41", + "0.1.42", + "0.1.43", + "0.1.44", + "0.1.45", + "0.1.46" ], "set-toggle-parameter": [ "0.1.20", @@ -160231,12 +163540,16 @@ "shahyads.fortifyqualitygate.fortifyqualitygate.0f6b6d8f-3f24-4c46-b7c4-4ee4100074d8": [ "1.0.7", "1.0.16", - "2.0.2" + "2.0.2", + "2.0.3", + "2.0.4" ], "shahyads.fortifyqualitygate.fortifyqualitygate.fortifyqualitygate": [ "1.0.7", "1.0.16", - "2.0.2" + "2.0.2", + "2.0.3", + "2.0.4" ], "shahyads.libraryvariableupdater.variableupdater.e6eadbcf-e6bf-498a-93d7-d2bae3bcb6c6": [ "1.0.8", @@ -160414,6 +163727,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -160424,7 +163740,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "shareextension": [ "0.0.0", @@ -160660,7 +163979,9 @@ "1.2.330", "1.2.331", "1.2.334", - "1.2.335" + "1.2.335", + "1.2.344", + "1.2.347" ], "shaykiabramczyk.createpullrequest.createpullrequest.createpullrequest": [ "1.0.0", @@ -160751,7 +164072,9 @@ "1.2.330", "1.2.331", "1.2.334", - "1.2.335" + "1.2.335", + "1.2.344", + "1.2.347" ], "shaykiabramczyk.getrevision.getrevision.7d4e8577-23a5-4682-9d81-b4371623956b": [ "1.0.0" @@ -160856,6 +164179,9 @@ "1.0.1" ], "short-git-version-hash-extractor": ["1.0.1"], + "showallenvironmentvariables": ["0.0.1", "0.0.2"], + "showallpowershellvariables": ["0.0.1", "0.0.11"], + "showallvariables": ["0.0.1"], "showvariables": [ "1.0.12", "1.0.14", @@ -161588,7 +164914,8 @@ "2.0.27192", "2.0.27255", "2.0.27445", - "3.0.46092" + "3.0.46092", + "4.0.84386" ], "smoketestiffailreset": ["1.0.0", "1.0.1", "1.0.2", "1.0.3", "1.0.4"], "smoketestmultiplatform": ["1.1.5", "1.1.6"], @@ -162244,6 +165571,208 @@ "1.1.2", "1.1.9" ], + "solucionespsg.generateandpublishvsixtomarketplace.psg.generateandpublishvsixtomarketplace.5f0427b3-e660-4f4d-9a93-60dd13f40032": [ + "0.0.1", + "0.0.2", + "0.0.3", + "0.0.4", + "0.0.5", + "0.0.6", + "0.0.7", + "0.0.8", + "0.0.9" + ], + "solucionespsg.generateandpublishvsixtomarketplace.psg.generateandpublishvsixtomarketplace.generateandpublishvsixtomarketplace": [ + "0.0.1", + "0.0.2", + "0.0.3", + "0.0.4", + "0.0.5", + "0.0.6", + "0.0.7", + "0.0.8", + "0.0.9" + ], + "solucionespsg.owaspzaponpremisestartstop.psg.owaspzaponpremisestart.31f040e5-e040-4336-878a-59a493355535": [ + "0.0.3", + "0.0.4", + "0.0.20", + "0.0.21", + "0.0.22", + "0.0.23", + "0.0.24", + "0.0.25", + "0.0.26", + "0.0.27", + "0.0.28", + "0.0.29", + "1.1.8" + ], + "solucionespsg.owaspzaponpremisestartstop.psg.owaspzaponpremisestart.owaspzaponpremisestart": [ + "0.0.3", + "0.0.4", + "0.0.20", + "0.0.21", + "0.0.22", + "0.0.23", + "0.0.24", + "0.0.25", + "0.0.26", + "0.0.27", + "0.0.28", + "0.0.29", + "1.1.8" + ], + "solucionespsg.owaspzaponpremisestartstop.psg.owaspzaponpremisestop.31f040e5-e040-4336-878a-59a493355536": [ + "0.0.3", + "0.0.4", + "0.0.20", + "0.0.21", + "0.0.22", + "0.0.23", + "0.0.24", + "0.0.25", + "0.0.26", + "0.0.27", + "0.0.28", + "0.0.29", + "1.1.8" + ], + "solucionespsg.owaspzaponpremisestartstop.psg.owaspzaponpremisestop.owaspzaponpremisestop": [ + "0.0.3", + "0.0.4", + "0.0.20", + "0.0.21", + "0.0.22", + "0.0.23", + "0.0.24", + "0.0.25", + "0.0.26", + "0.0.27", + "0.0.28", + "0.0.29", + "1.1.8" + ], + "solucionespsg.showallenvironmentvariables.psg.showallenvironmentvariables.5f0427b3-e660-4f4d-9a93-60dd13f40029": [ + "0.0.1", + "0.0.2" + ], + "solucionespsg.showallenvironmentvariables.psg.showallenvironmentvariables.showallenvironmentvariables": [ + "0.0.1", + "0.0.2" + ], + "solucionespsg.showallpowershellvariables.psg.showallpowershellvariables.5f0427b3-e660-4f4d-9a93-60dd13f40031": [ + "0.0.1", + "0.0.11" + ], + "solucionespsg.showallpowershellvariables.psg.showallpowershellvariables.showallpowershellvariables": [ + "0.0.1", + "0.0.11" + ], + "solucionespsg.showallvariables.psg.showallvariables.5f0427b3-e660-4f4d-9a93-60dd13f40030": [ + "0.0.1" + ], + "solucionespsg.showallvariables.psg.showallvariables.showallvariables": [ + "0.0.1" + ], + "solucionespsg.updateversionvariablesandpackage.psg.updateversionvariablesandpackage.5f0427b3-e660-4f4d-9a93-60dd13f40028": [ + "0.0.7", + "0.0.8", + "0.0.9", + "0.0.10", + "0.0.11", + "0.0.12", + "0.0.14", + "0.0.15", + "0.0.16", + "0.0.17", + "0.0.18", + "0.0.19", + "0.0.20", + "0.0.21", + "0.0.22", + "0.0.23", + "0.0.24", + "0.0.25", + "0.0.26", + "0.0.27", + "0.0.28", + "0.0.29", + "0.0.30", + "0.0.31", + "0.0.32", + "0.0.33", + "0.0.34", + "0.0.35", + "0.0.36", + "0.0.37", + "0.0.38", + "0.0.39", + "0.0.40", + "0.0.41", + "0.0.42", + "0.0.43", + "0.0.44", + "0.0.45", + "0.0.46", + "0.0.47", + "0.0.48", + "0.0.49", + "0.0.50", + "0.0.51", + "0.0.52", + "0.0.53", + "0.1.54" + ], + "solucionespsg.updateversionvariablesandpackage.psg.updateversionvariablesandpackage.updateversionvariablesandpackage": [ + "0.0.7", + "0.0.8", + "0.0.9", + "0.0.10", + "0.0.11", + "0.0.12", + "0.0.14", + "0.0.15", + "0.0.16", + "0.0.17", + "0.0.18", + "0.0.19", + "0.0.20", + "0.0.21", + "0.0.22", + "0.0.23", + "0.0.24", + "0.0.25", + "0.0.26", + "0.0.27", + "0.0.28", + "0.0.29", + "0.0.30", + "0.0.31", + "0.0.32", + "0.0.33", + "0.0.34", + "0.0.35", + "0.0.36", + "0.0.37", + "0.0.38", + "0.0.39", + "0.0.40", + "0.0.41", + "0.0.42", + "0.0.43", + "0.0.44", + "0.0.45", + "0.0.46", + "0.0.47", + "0.0.48", + "0.0.49", + "0.0.50", + "0.0.51", + "0.0.52", + "0.0.53", + "0.1.54" + ], "sonar-buildbreaker": [ "6.0.0", "6.1.0", @@ -162319,7 +165848,10 @@ "1.32.0", "1.33.0", "1.33.1", - "1.34.0" + "1.34.0", + "1.35.0", + "1.36.0", + "1.37.0" ], "sonarcloudprepare": [ "1.0.0", @@ -162368,7 +165900,10 @@ "1.29.0", "1.30.0", "1.30.1", - "1.31.0" + "1.31.0", + "1.32.0", + "1.33.0", + "1.34.0" ], "sonarcloudpublish": [ "1.0.0", @@ -162430,6 +165965,9 @@ "4.30.0", "4.31.0", "4.32.0", + "4.33.0", + "4.34.0", + "4.35.0", "5.0.0", "5.1.0", "5.2.0", @@ -162441,7 +165979,10 @@ "5.6.1", "5.7.0", "5.8.0", - "5.9.0" + "5.9.0", + "5.10.0", + "5.11.0", + "5.12.0" ], "sonarqubeprepare": [ "4.0.0", @@ -162491,6 +166032,9 @@ "4.30.0", "4.31.0", "4.32.0", + "4.33.0", + "4.34.0", + "4.35.0", "5.0.0", "5.1.0", "5.1.1", @@ -162503,7 +166047,11 @@ "5.6.1", "5.7.0", "5.8.0", - "5.9.0" + "5.9.0", + "5.10.0", + "5.11.0", + "5.11.1", + "5.12.0" ], "sonarqubepublish": [ "4.0.0", @@ -162663,7 +166211,10 @@ "1.29.0", "1.30.0", "1.30.1", - "1.31.0" + "1.31.0", + "1.32.0", + "1.33.0", + "1.34.0" ], "sonarsource.sonarcloud.14d9cde6-c1da-4d55-aa01-2965cd301255.sonarcloudprepare": [ "1.0.0", @@ -162712,7 +166263,10 @@ "1.29.0", "1.30.0", "1.30.1", - "1.31.0" + "1.31.0", + "1.32.0", + "1.33.0", + "1.34.0" ], "sonarsource.sonarcloud.38b27399-a642-40af-bb7d-9971f69712e8.38b27399-a642-40af-bb7d-9971f69712e8": [ "1.0.0", @@ -162797,7 +166351,10 @@ "1.32.0", "1.33.0", "1.33.1", - "1.34.0" + "1.34.0", + "1.35.0", + "1.36.0", + "1.37.0" ], "sonarsource.sonarcloud.ce096e50-6155-4de8-8800-4221aaeed4a1.sonarcloudanalyze": [ "1.0.0", @@ -162842,7 +166399,10 @@ "1.32.0", "1.33.0", "1.33.1", - "1.34.0" + "1.34.0", + "1.35.0", + "1.36.0", + "1.37.0" ], "sonarsource.sonarqube.15b84ca1-b62f-4a2a-a403-89b77a063157.15b84ca1-b62f-4a2a-a403-89b77a063157": [ "2.0.0", @@ -162926,6 +166486,9 @@ "4.30.0", "4.31.0", "4.32.0", + "4.33.0", + "4.34.0", + "4.35.0", "5.0.0", "5.1.0", "5.1.1", @@ -162938,7 +166501,11 @@ "5.6.1", "5.7.0", "5.8.0", - "5.9.0" + "5.9.0", + "5.10.0", + "5.11.0", + "5.11.1", + "5.12.0" ], "sonarsource.sonarqube.15b84ca1-b62f-4a2a-a403-89b77a063157.sonarqubeprepare": [ "4.0.0", @@ -162988,6 +166555,9 @@ "4.30.0", "4.31.0", "4.32.0", + "4.33.0", + "4.34.0", + "4.35.0", "5.0.0", "5.1.0", "5.1.1", @@ -163000,7 +166570,11 @@ "5.6.1", "5.7.0", "5.8.0", - "5.9.0" + "5.9.0", + "5.10.0", + "5.11.0", + "5.11.1", + "5.12.0" ], "sonarsource.sonarqube.15b84ca1-b62f-4a2a-a403-89b77a063157.sonarqubescannermsbuildbegin": [ "2.0.0", @@ -163156,6 +166730,9 @@ "4.30.0", "4.31.0", "4.32.0", + "4.33.0", + "4.34.0", + "4.35.0", "5.0.0", "5.1.0", "5.2.0", @@ -163167,7 +166744,10 @@ "5.6.1", "5.7.0", "5.8.0", - "5.9.0" + "5.9.0", + "5.10.0", + "5.11.0", + "5.12.0" ], "sonarsource.sonarqube.6d01813a-9589-4b15-8491-8164aeb38055.sonarqubeanalyze": [ "4.0.0", @@ -163211,6 +166791,9 @@ "4.30.0", "4.31.0", "4.32.0", + "4.33.0", + "4.34.0", + "4.35.0", "5.0.0", "5.1.0", "5.2.0", @@ -163222,7 +166805,10 @@ "5.6.1", "5.7.0", "5.8.0", - "5.9.0" + "5.9.0", + "5.10.0", + "5.11.0", + "5.12.0" ], "sonarsource.sonarqube.6d01813a-9589-4b15-8491-8164aeb38055.sonarqubescannermsbuildend": [ "2.0.0", @@ -163376,7 +166962,10 @@ "1.6.0", "1.6.1", "1.6.2", - "1.6.3" + "1.6.3", + "1.6.4", + "1.6.5", + "1.6.6" ], "sonatypeintegrations.nexus-iq-azure-extension.nexus-iq-azure-pipeline-task.nexusiqpipelinetask": [ "1.0.0", @@ -163458,7 +167047,10 @@ "1.6.0", "1.6.1", "1.6.2", - "1.6.3" + "1.6.3", + "1.6.4", + "1.6.5", + "1.6.6" ], "soos": [ "0.0.0", @@ -163524,7 +167116,10 @@ "0.1.60", "0.1.61", "0.1.62", - "0.1.63" + "0.1.63", + "0.1.64", + "0.1.65", + "0.1.66" ], "soos.soos-security-analysis.scan-task.b1106b6a-6995-4ff6-ae1d-26dd4fa5fc5e": [ "0.0.1", @@ -163591,7 +167186,10 @@ "0.1.60", "0.1.61", "0.1.62", - "0.1.63" + "0.1.63", + "0.1.64", + "0.1.65", + "0.1.66" ], "soos.soos-security-analysis.scan-task.soos": [ "0.0.0", @@ -163657,7 +167255,10 @@ "0.1.60", "0.1.61", "0.1.62", - "0.1.63" + "0.1.63", + "0.1.64", + "0.1.65", + "0.1.66" ], "souravmishra.buildandreleasetask.custom-build-release-task.a2e330f0-1b07-11e9-837a-a3ec72c2343b": [ "0.3.1", @@ -164255,7 +167856,8 @@ "0.9.7", "0.9.8", "0.9.9", - "0.9.10" + "0.9.10", + "0.9.11" ], "sqlmultidacpacdeployment": [ "1.2.0", @@ -164288,7 +167890,10 @@ "1.15.1239", "1.15.1261", "1.23.1279", - "1.24.1281" + "1.24.1281", + "1.25.1302", + "1.26.1308", + "1.27.1315" ], "sqlplayer.datafactorytools.buildadf.buildadftask": [ "1.1.643", @@ -164308,7 +167913,10 @@ "1.15.1239", "1.15.1261", "1.23.1279", - "1.24.1281" + "1.24.1281", + "1.25.1302", + "1.26.1308", + "1.27.1315" ], "sqlplayer.datafactorytools.deployadffromarm.deployadffromarmtask": [ "0.12.1145", @@ -164317,7 +167925,10 @@ "0.15.1239", "0.15.1261", "0.23.1279", - "0.24.1281" + "0.24.1281", + "0.25.1302", + "0.26.1308", + "0.27.1315" ], "sqlplayer.datafactorytools.deployadffromarm.ecb868a7-3c51-4925-a4b5-c63321b51700": [ "0.12.1145", @@ -164326,7 +167937,10 @@ "0.15.1239", "0.15.1261", "0.23.1279", - "0.24.1281" + "0.24.1281", + "0.25.1302", + "0.26.1308", + "0.27.1315" ], "sqlplayer.datafactorytools.publishadf.1af843b5-35a0-411f-9a18-9eb7a59fb8b8": [ "0.1.0", @@ -164383,7 +167997,10 @@ "1.15.1239", "1.15.1261", "1.23.1279", - "1.24.1281" + "1.24.1281", + "1.25.1302", + "1.26.1308", + "1.27.1315" ], "sqlplayer.datafactorytools.publishadf.publishadftask": [ "0.1.0", @@ -164440,7 +168057,10 @@ "1.15.1239", "1.15.1261", "1.23.1279", - "1.24.1281" + "1.24.1281", + "1.25.1302", + "1.26.1308", + "1.27.1315" ], "sqlplayer.datafactorytools.testadfls.5bf98930-3058-4afe-b031-48d312459df4": [ "1.4.798", @@ -164458,7 +168078,10 @@ "1.15.1239", "1.15.1261", "1.23.1279", - "1.24.1281" + "1.24.1281", + "1.25.1302", + "1.26.1308", + "1.27.1315" ], "sqlplayer.datafactorytools.testadfls.testadflinkedservicetask": [ "1.4.798", @@ -164476,7 +168099,10 @@ "1.15.1239", "1.15.1261", "1.23.1279", - "1.24.1281" + "1.24.1281", + "1.25.1302", + "1.26.1308", + "1.27.1315" ], "sqlplusexecuter-release": [ "1.0.0", @@ -165016,7 +168642,8 @@ "1.2.0", "1.3.0", "1.4.0", - "1.5.0" + "1.5.0", + "1.6.0" ], "ssmsigningtoolssetup": [ "0.54.0", @@ -165065,7 +168692,8 @@ "1.2.0", "1.3.0", "1.4.0", - "1.5.0" + "1.5.0", + "1.6.0" ], "ssrsdeploy": ["0.2.3", "0.2.4", "0.2.5", "0.2.6"], "ssrserviceax2012": [ @@ -165122,6 +168750,16 @@ ], "stack-board-replaces": ["0.0.1"], "stack-board-repos": ["0.0.23"], + "stackhawk.stackhawk-extensions.install-hawkscan-task.1c8b66db-ae40-43b9-9b9b-de7f46787790": [ + "0.1.0" + ], + "stackhawk.stackhawk-extensions.install-hawkscan-task.hawkscaninstall": [ + "0.1.0" + ], + "stackhawk.stackhawk-extensions.run-hawkscan-task.e1455b3d-5dba-4397-9ed5-0be6bdc23907": [ + "0.1.0" + ], + "stackhawk.stackhawk-extensions.run-hawkscan-task.runhawkscan": ["0.1.0"], "stackify.build-release-task.stackify-deployment-task.574f4e45-56f1-4b37-bf2e-d32f59389970": [ "1.0.0" ], @@ -167092,7 +170730,7 @@ "8.0.0" ], "synopsyspolaris": ["1.1.0", "1.1.3", "1.2.0", "1.2.4"], - "syntheticsruntests": ["0.0.1", "0.1.0", "0.1.1"], + "syntheticsruntests": ["0.0.1", "0.1.0", "0.1.1", "0.1.2"], "sysdig": [ "0.2.1", "0.2.5", @@ -167128,7 +170766,9 @@ "1.1.4", "1.1.5", "1.1.6", - "1.1.7" + "1.1.7", + "1.2.1", + "1.2.3" ], "systemsmanagergetparameter": [ "1.0.14", @@ -167829,7 +171469,7 @@ "telegramnotifytask": ["0.1.0"], "tencentcloudcosdeploy": ["1.1.54", "1.1.55"], "tencentcloudrefreshcdn": ["1.0.0", "1.0.18"], - "terminatenstask": ["22.6.0"], + "terminatenstask": ["22.6.0", "23.2.0"], "terraform": [ "1.0.0", "1.0.1", @@ -167976,7 +171616,9 @@ "0.7.5", "0.7.6", "0.7.7", - "0.7.8" + "0.7.8", + "0.7.11", + "0.7.12" ], "terraformdestroy": [ "0.1.0", @@ -168086,13 +171728,19 @@ "0.7.6", "0.7.7", "0.7.8", + "0.7.11", + "0.7.12", "0.197.0", "0.201.0", "0.202.0", "0.202.17", "0.202.18", "0.202.19", - "0.203.0" + "0.202.20", + "0.202.21", + "0.203.0", + "1.216.20", + "1.216.21" ], "terraformoutput": [ "0.1.0", @@ -168171,7 +171819,23 @@ "0.3.1", "1.1.0", "1.1.1", - "1.1.2" + "1.1.2", + "1.1.3", + "1.1.5", + "1.1.6", + "1.1.7", + "1.1.8", + "1.1.9", + "1.1.10", + "1.1.11", + "1.1.12", + "1.1.13", + "1.1.14", + "1.1.15", + "1.1.16", + "1.1.17", + "1.1.18", + "1.1.19" ], "terraformplan": [ "0.2.0", @@ -168201,6 +171865,8 @@ "0.202.17", "0.202.18", "0.202.19", + "0.202.20", + "0.202.21", "0.203.0" ], "terraformtaskv2": [ @@ -168214,9 +171880,18 @@ "2.202.17", "2.202.18", "2.202.19", + "2.202.20", + "2.202.21", "2.203.0" ], - "terraformtaskv3": ["3.201.17", "3.201.18", "3.209.19"], + "terraformtaskv3": [ + "3.201.17", + "3.201.18", + "3.209.19", + "3.209.20", + "3.209.21" + ], + "terraformtaskv4": ["4.218.20", "4.218.21"], "terraformtool": ["0.1.0"], "terraformworkspace": ["0.1.0", "0.2.0", "0.3.0", "0.3.1"], "test_azure_task": [ @@ -168254,7 +171929,10 @@ "1.15.1239", "1.15.1261", "1.23.1279", - "1.24.1281" + "1.24.1281", + "1.25.1302", + "1.26.1308", + "1.27.1315" ], "testcraft.build-release-task.custom-build-release-task.1fd114fb-f623-4c40-a8e8-2095b911a175": [ "0.2.0", @@ -168352,10 +172030,10 @@ "0.2.6", "0.2.7" ], - "testnstask": ["22.6.0"], + "testnstask": ["22.6.0", "23.2.0"], "testproject-run": ["1.0.0"], "testrunperformanceanalyzer": ["0.1.3", "0.9.1", "1.0.0", "1.0.1"], - "testsetuptask": ["22.6.0"], + "testsetuptask": ["22.6.0", "23.2.0"], "tf-buildandreleasetask": ["0.1.0", "1.0.0", "1.0.1"], "tf-vc-add": [ "2.0.1", @@ -169500,6 +173178,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -169510,7 +173191,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "tg.vsts-ssis.buildssis-task.1cbf64a9-c6d0-431b-9d98-8f5d509b5e09": [ "0.0.1148", @@ -170304,7 +173988,10 @@ "1.13.373", "1.13.377", "1.13.378", - "1.14.404" + "1.14.404", + "1.14.420", + "1.15.453", + "1.16.455" ], "tingle-software.dependabot.dependabot.dependabot": [ "1.0.0", @@ -170363,7 +174050,10 @@ "1.13.373", "1.13.377", "1.13.378", - "1.14.404" + "1.14.404", + "1.14.420", + "1.15.453", + "1.16.455" ], "tiobesoftwarebv.tics-azure-devops-plugin.tics-quality-analysis-task.abca0c47-7bc2-4f13-ba9c-ab04b0880cb4": [ "0.1.1" @@ -170403,6 +174093,20 @@ "tmarkovski.projectversionasvariable.versionintovariable.projectversionasvariable": [ "1.0.0" ], + "tngtechnologyconsultinggmbh.jgiventestintegration.custom-publishjgivenreport.6d4b1476-3a89-4eca-ba13-df048e3d697a": [ + "0.4.0", + "0.4.1", + "0.5.0", + "0.5.1", + "0.5.2" + ], + "tngtechnologyconsultinggmbh.jgiventestintegration.custom-publishjgivenreport.publishjgivenreport": [ + "0.4.0", + "0.4.1", + "0.5.0", + "0.5.1", + "0.5.2" + ], "tobania.entityframeworkmigrations.applyentityframeworkmigrationswithmigrate.applyentityframeworkmigrationswithmigrate": [ "0.1.0", "0.1.1", @@ -171376,7 +175080,8 @@ "2.0.1", "2.0.2", "2.0.5", - "2.0.6" + "2.0.6", + "2.0.10" ], "triggerrelease": ["1.1.1", "1.2.0"], "trivy": [ @@ -171488,7 +175193,8 @@ "1.2.12", "1.2.13", "1.2.14", - "1.2.15" + "1.2.15", + "1.2.16" ], "truevelocity.commit-message-validator-build-task.custom-build-release-task.commitmessagevalidator": [ "0.1.0", @@ -171526,7 +175232,8 @@ "1.2.12", "1.2.13", "1.2.14", - "1.2.15" + "1.2.15", + "1.2.16" ], "try1": [ "0.1.0", @@ -171828,6 +175535,8 @@ "1.0.0", "1.0.1", "1.0.2", + "1.3.1", + "1.3.2", "2.0.0", "2.0.1", "2.0.2", @@ -171893,6 +175602,7 @@ "2.6.5", "2.6.6" ], + "twextension12345": ["2.0.0"], "twextension22": [ "1.0.0", "1.0.1", @@ -172180,7 +175890,12 @@ "9.1.11638", "9.1.11639", "9.1.11643", - "9.1.11647" + "9.1.11647", + "9.1.61695", + "9.1.91713", + "9.1.91714", + "9.1.91716", + "9.1.91717" ], "typemock.typemock-tasks-beta.typemocksmartrunner.typemocksmartrunner": [ "8.9.61405", @@ -172222,7 +175937,12 @@ "9.1.11638", "9.1.11639", "9.1.11643", - "9.1.11647" + "9.1.11647", + "9.1.61695", + "9.1.91713", + "9.1.91714", + "9.1.91716", + "9.1.91717" ], "typemock.typemock-tasks-beta.vstestwithtypemock.5e2467be-4fa5-4fe4-b84d-7b276cc1800d": [ "8.9.61405", @@ -172264,7 +175984,12 @@ "9.1.11638", "9.1.11639", "9.1.11643", - "9.1.11647" + "9.1.11647", + "9.1.61695", + "9.1.91713", + "9.1.91714", + "9.1.91716", + "9.1.91717" ], "typemock.typemock-tasks-beta.vstestwithtypemock.vstestwithtypemock": [ "8.9.61405", @@ -172306,7 +176031,12 @@ "9.1.11638", "9.1.11639", "9.1.11643", - "9.1.11647" + "9.1.11647", + "9.1.61695", + "9.1.91713", + "9.1.91714", + "9.1.91716", + "9.1.91717" ], "typemock.typemock-tasks.typemock_smart_runner.84b5a581-2a93-4aa8-b459-8fef028d2d83": [ "8.5.741" @@ -172358,7 +176088,11 @@ "9.1.31663", "9.1.41672", "9.1.51686", - "9.1.61689" + "9.1.61689", + "9.1.71696", + "9.1.81710", + "9.1.91713", + "9.1.91717" ], "typemock.typemock-tasks.typemocksmartrunner.af5a8f5a-e610-49ed-8aa9-821d14beb92c": [ "8.4.1", @@ -172414,7 +176148,11 @@ "9.1.31663", "9.1.41672", "9.1.51686", - "9.1.61689" + "9.1.61689", + "9.1.71696", + "9.1.81710", + "9.1.91713", + "9.1.91717" ], "typemock.typemock-tasks.typemocksmartrunnertask.a0ca5cb2-bacd-46ab-82dc-b0e1984f6006": [ "8.5.742", @@ -172474,7 +176212,11 @@ "9.1.31663", "9.1.41672", "9.1.51686", - "9.1.61689" + "9.1.61689", + "9.1.71696", + "9.1.81710", + "9.1.91713", + "9.1.91717" ], "typemock.typemock-tasks.vstestwithtypemock.d9a4ee62-4f10-4146-8e06-274bd42b7453": [ "8.4.2", @@ -172528,7 +176270,11 @@ "9.1.31663", "9.1.41672", "9.1.51686", - "9.1.61689" + "9.1.61689", + "9.1.71696", + "9.1.81710", + "9.1.91713", + "9.1.91717" ], "typemock.typemock-tasks.vstestwithtypemocktask.b79d073d-713c-4c2b-9ec4-f88d990cfa34": [ "8.5.742", @@ -172624,7 +176370,14 @@ "9.1.31663", "9.1.41672", "9.1.51686", - "9.1.61689" + "9.1.61689", + "9.1.61695", + "9.1.71696", + "9.1.81710", + "9.1.91713", + "9.1.91714", + "9.1.91716", + "9.1.91717" ], "typemocksmartrunnertask": ["8.5.742", "8.5.743"], "typings": ["0.1.0", "0.1.1"], @@ -172664,7 +176417,8 @@ "0.9.7", "0.9.8", "0.9.9", - "0.9.10" + "0.9.10", + "0.9.11" ], "ubitsoft.sql-enlight-vsts-extension.sql-enlight-analyze.sqlenlightanalyze": [ "0.2.2", @@ -172702,7 +176456,8 @@ "0.9.7", "0.9.8", "0.9.9", - "0.9.10" + "0.9.10", + "0.9.11" ], "udclient": ["0.1.0", "0.1.1", "0.121.0"], "udpushcomponentversion": ["0.1.0", "0.1.1", "0.121.0"], @@ -172795,6 +176550,118 @@ "4.0.0" ], "ugly-sql-task": ["0.1.0"], + "uipath.vsts-uipath-package-preview.uipath-assets-preview.83faa8cf-ff90-4cb5-8ca0-389edc2c0af5": [ + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" + ], + "uipath.vsts-uipath-package-preview.uipath-assets-preview.f4df1586-7648-4160-ad6d-a03b05af0004": [ + "2.11.3445511" + ], + "uipath.vsts-uipath-package-preview.uipath-assets-preview.uipathassets-preview": [ + "2.11.3445511", + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" + ], + "uipath.vsts-uipath-package-preview.uipath-deploy-preview.666f48a9-3550-4db6-b74b-2f8aa4b99444": [ + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" + ], + "uipath.vsts-uipath-package-preview.uipath-deploy-preview.72167370-9f1d-47d5-be00-6f2554c20001": [ + "2.11.3445511" + ], + "uipath.vsts-uipath-package-preview.uipath-deploy-preview.uipathdeploy-preview": [ + "2.11.3445511", + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" + ], + "uipath.vsts-uipath-package-preview.uipath-install-platform-preview.0ae6f751-0884-4b80-8cb7-1686f59d4288": [ + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" + ], + "uipath.vsts-uipath-package-preview.uipath-install-platform-preview.723917b2-c29b-4c74-b536-611be986beb2": [ + "2.11.3445511" + ], + "uipath.vsts-uipath-package-preview.uipath-install-platform-preview.uipathinstallplatform-preview": [ + "2.11.3445511", + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" + ], + "uipath.vsts-uipath-package-preview.uipath-pack-preview.33265b4a-5861-41e6-a42c-83efecec0002": [ + "2.11.3445511" + ], + "uipath.vsts-uipath-package-preview.uipath-pack-preview.51d18b73-ba80-440e-95c2-59620cb4be1c": [ + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" + ], + "uipath.vsts-uipath-package-preview.uipath-pack-preview.uipathpack-preview": [ + "2.11.3445511", + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" + ], + "uipath.vsts-uipath-package-preview.uipath-runjob-preview.aef39911-3d63-40d6-bdef-909edadf0005": [ + "2.11.3445511" + ], + "uipath.vsts-uipath-package-preview.uipath-runjob-preview.ef33e496-05b4-4e5d-ba93-7e3ae477d9ca": [ + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" + ], + "uipath.vsts-uipath-package-preview.uipath-runjob-preview.uipathrunjob-preview": [ + "2.11.3445511", + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" + ], + "uipath.vsts-uipath-package-preview.uipath-test-preview.07a04851-f6d3-473a-82e1-e9026d0b5528": [ + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" + ], + "uipath.vsts-uipath-package-preview.uipath-test-preview.edd520aa-3aec-408b-9649-642f8b920003": [ + "2.11.3445511" + ], + "uipath.vsts-uipath-package-preview.uipath-test-preview.uipathtest-preview": [ + "2.11.3445511", + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" + ], + "uipath.vsts-uipath-package-preview.vsts-eventlog-to-tests.0e237901-8ece-4bc9-bedf-05ed7f0e98d5": [ + "1.0.3445511" + ], + "uipath.vsts-uipath-package-preview.vsts-eventlog-to-tests.5ba96c72-cff1-411e-a333-ea2bbf4f2f78": [ + "1.0.3447906", + "1.0.3513646", + "1.0.3517186", + "1.0.3642585" + ], + "uipath.vsts-uipath-package-preview.vsts-eventlog-to-tests.uipathpackage-preview": [ + "1.0.3445511", + "1.0.3447906", + "1.0.3513646", + "1.0.3517186", + "1.0.3642585" + ], "uipath.vsts-uipath-package.uipath-assets.f4df1586-7648-4160-ad6d-a03b05af0004": [ "2.1.1309266", "2.3.1479943", @@ -172812,7 +176679,8 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" ], "uipath.vsts-uipath-package.uipath-assets.uipathassets": [ "2.1.1309266", @@ -172831,7 +176699,8 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" ], "uipath.vsts-uipath-package.uipath-deploy.72167370-9f1d-47d5-be00-6f2554c20001": [ "2.0.965899", @@ -172856,7 +176725,8 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" ], "uipath.vsts-uipath-package.uipath-deploy.uipathdeploy": [ "2.0.965899", @@ -172881,7 +176751,8 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" ], "uipath.vsts-uipath-package.uipath-install-platform.723917b2-c29b-4c74-b536-611be986beb2": [ "2.0.1044033", @@ -172903,7 +176774,8 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" ], "uipath.vsts-uipath-package.uipath-install-platform.uipathinstallplatform": [ "2.8.2109351", @@ -172915,7 +176787,8 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" ], "uipath.vsts-uipath-package.uipath-install-platform.uipathinstallplatform-preview": [ "2.0.1044033", @@ -172952,7 +176825,8 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" ], "uipath.vsts-uipath-package.uipath-pack.uipathpack": [ "2.0.965899", @@ -172977,7 +176851,8 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" ], "uipath.vsts-uipath-package.uipath-runjob.aef39911-3d63-40d6-bdef-909edadf0005": [ "2.1.1309266", @@ -172996,7 +176871,8 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" ], "uipath.vsts-uipath-package.uipath-runjob.uipathrunjob": [ "2.1.1309266", @@ -173015,7 +176891,8 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" ], "uipath.vsts-uipath-package.uipath-test.edd520aa-3aec-408b-9649-642f8b920003": [ "2.0.965899", @@ -173040,7 +176917,8 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" ], "uipath.vsts-uipath-package.uipath-test.uipathtest": [ "2.0.965899", @@ -173065,7 +176943,8 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" ], "uipath.vsts-uipath-package.vsts-eventlog-to-tests.0e237901-8ece-4bc9-bedf-05ed7f0e98d5": [ "0.1.0", @@ -173170,7 +177049,8 @@ "1.0.3094444", "1.0.3105315", "1.0.3206699", - "1.0.3214338" + "1.0.3214338", + "1.0.3517186" ], "uipath.vsts-uipath-package.vsts-eventlog-to-tests.uipathpackage": [ "0.1.0", @@ -173275,7 +177155,8 @@ "1.0.3094444", "1.0.3105315", "1.0.3206699", - "1.0.3214338" + "1.0.3214338", + "1.0.3517186" ], "uipathassets": [ "2.1.1309266", @@ -173294,7 +177175,15 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" + ], + "uipathassets-preview": [ + "2.11.3445511", + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" ], "uipathdeploy": [ "2.0.965899", @@ -173319,7 +177208,15 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" + ], + "uipathdeploy-preview": [ + "2.11.3445511", + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" ], "uipathinstallplatform": [ "2.8.2109351", @@ -173331,7 +177228,8 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" ], "uipathinstallplatform-preview": [ "2.0.1044033", @@ -173343,7 +177241,12 @@ "2.4.1786427", "2.5.1858421", "2.6.1872849", - "2.7.1993735" + "2.7.1993735", + "2.11.3445511", + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" ], "uipathpack": [ "2.0.965899", @@ -173368,7 +177271,15 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" + ], + "uipathpack-preview": [ + "2.11.3445511", + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" ], "uipathpackage": [ "0.1.0", @@ -173473,7 +177384,15 @@ "1.0.3094444", "1.0.3105315", "1.0.3206699", - "1.0.3214338" + "1.0.3214338", + "1.0.3517186" + ], + "uipathpackage-preview": [ + "1.0.3445511", + "1.0.3447906", + "1.0.3513646", + "1.0.3517186", + "1.0.3642585" ], "uipathrunjob": [ "2.1.1309266", @@ -173492,7 +177411,15 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" + ], + "uipathrunjob-preview": [ + "2.11.3445511", + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" ], "uipathtest": [ "2.0.965899", @@ -173517,7 +177444,15 @@ "2.11.3094444", "2.11.3105315", "2.11.3206699", - "2.11.3214338" + "2.11.3214338", + "3.0.3517186" + ], + "uipathtest-preview": [ + "2.11.3445511", + "2.11.3447906", + "3.0.3513646", + "3.0.3517186", + "3.0.3642585" ], "ulrikstrid.vsts-esy.custom-build-release-task.de6ff299-5f71-4949-8fb6-bfb690b9cb5d": [ "0.2.1", @@ -173973,6 +177908,9 @@ "3.5.149", "3.5.161", "3.5.178", + "3.5.220", + "3.5.260", + "3.5.268", "4.0.8", "4.0.50", "4.0.89", @@ -173983,7 +177921,10 @@ "4.0.142", "4.0.149", "4.0.161", - "4.0.178" + "4.0.178", + "4.0.220", + "4.0.260", + "4.0.268" ], "unzip": [ "0.1.1", @@ -174398,6 +178339,55 @@ "1.1.11", "1.1.12" ], + "updateversionvariablesandpackage": [ + "0.0.7", + "0.0.8", + "0.0.9", + "0.0.10", + "0.0.11", + "0.0.12", + "0.0.14", + "0.0.15", + "0.0.16", + "0.0.17", + "0.0.18", + "0.0.19", + "0.0.20", + "0.0.21", + "0.0.22", + "0.0.23", + "0.0.24", + "0.0.25", + "0.0.26", + "0.0.27", + "0.0.28", + "0.0.29", + "0.0.30", + "0.0.31", + "0.0.32", + "0.0.33", + "0.0.34", + "0.0.35", + "0.0.36", + "0.0.37", + "0.0.38", + "0.0.39", + "0.0.40", + "0.0.41", + "0.0.42", + "0.0.43", + "0.0.44", + "0.0.45", + "0.0.46", + "0.0.47", + "0.0.48", + "0.0.49", + "0.0.50", + "0.0.51", + "0.0.52", + "0.0.53", + "0.1.54" + ], "updatewebresources": [ "8.2.1", "8.2.2", @@ -174472,6 +178462,7 @@ ], "upload-app-file": ["2.0.12"], "upload-bom-dtrack-task": [ + "0.0.0", "1.1.0", "1.2.0", "1.3.0", @@ -174487,6 +178478,7 @@ "1.13.0", "1.14.0" ], + "upload-bom-task": ["0.0.0"], "uploadmultipleazurekeyvaultsecrets": [ "0.19340.2", "0.19342.1", @@ -174736,6 +178728,11 @@ "0.2.5" ], "uzgversioning": ["0.1.0", "0.1.1", "0.1.2"], + "v-mopanda.vss-services-ansible.ansible-task.3ff9107a-251e-4828-af68-fcb7090cb3d6": [ + "0.0.5", + "0.0.6" + ], + "v-mopanda.vss-services-ansible.ansible-task.ansible": ["0.0.5", "0.0.6"], "v-nagarajku.vss-services-ansible.ansible-task.2850151b-ec95-4c1e-81a4-917de1f4c0ef": [ "0.0.5", "0.0.7", @@ -174860,7 +178857,8 @@ "0.0.5", "0.0.6", "0.0.7", - "0.1.2" + "0.1.2", + "0.1.3" ], "valintinstall": ["0.0.2"], "variabledehydration": [ @@ -175215,7 +179213,9 @@ "3.14.0", "3.15.0", "3.16.0", - "3.17.0" + "3.17.0", + "3.18.0", + "3.19.0" ], "veracode flaw importer": [ "1.3.0", @@ -175254,7 +179254,9 @@ "3.14.0", "3.15.0", "3.16.0", - "3.17.0" + "3.17.0", + "3.18.0", + "3.19.0" ], "veracode.veracode-vsts-build-extension.veracode-flaw-importer-task.c6f3c728-4d4c-4aa5-a3a1-fc16f6ff9a66": [ "1.3.0", @@ -175293,7 +179295,9 @@ "3.14.0", "3.15.0", "3.16.0", - "3.17.0" + "3.17.0", + "3.18.0", + "3.19.0" ], "veracode.veracode-vsts-build-extension.veracode-flaw-importer-task.veracode flaw importer": [ "1.3.0", @@ -175332,7 +179336,9 @@ "3.14.0", "3.15.0", "3.16.0", - "3.17.0" + "3.17.0", + "3.18.0", + "3.19.0" ], "veracode.veracode-vsts-build-extension.veracode-scanner-task.6292a058-d4f5-407b-b6c6-815df9ee59d6": [ "1.0.0", @@ -175379,7 +179385,9 @@ "3.14.0", "3.15.0", "3.16.0", - "3.17.0" + "3.17.0", + "3.18.0", + "3.19.0" ], "veracode.veracode-vsts-build-extension.veracode-scanner-task.veracode": [ "1.0.0", @@ -175426,7 +179434,9 @@ "3.14.0", "3.15.0", "3.16.0", - "3.17.0" + "3.17.0", + "3.18.0", + "3.19.0" ], "veracodecommunitysast": ["0.0.0", "0.0.1", "0.0.2", "1.0.3"], "veracodecommunityscaadoextension": [ @@ -176012,7 +180022,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "versionangularfile": [ "1.31.7", @@ -176072,7 +180083,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "versionappx": [ "1.1.1", @@ -176162,7 +180174,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "versionassemblies": [ "0.1.3", @@ -176314,7 +180327,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "versionbumpfromfile": ["0.1.0"], "versioncounter": [ @@ -176421,7 +180435,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "versiondotnetcoreassemblies": [ "1.15.22", @@ -176497,7 +180512,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "versionintovariables": ["1.0.0", "1.2.0", "1.2.1"], "versioniosplistmanifest": [ @@ -176510,7 +180526,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "versionjsonfile": [ "1.31.7", @@ -176570,7 +180587,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "versionnuspec": [ "1.6.6", @@ -176656,7 +180674,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "versionpowershellmodule": [ "1.40.4", @@ -176707,7 +180726,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "versionreadertask": [ "1.0.0", @@ -176806,7 +180826,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "versiontosemver2": [ "0.3.0", @@ -176908,7 +180929,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "versionwix": [ "1.15.22", @@ -176984,7 +181006,8 @@ "2.39.2", "2.40.35", "3.0.9", - "3.1.6" + "3.1.6", + "3.2.13" ], "versionwritertask": ["1.0.0"], "vfabing.azurevirtualmachinemanagertask.custom-build-release-task.azurevirtualmachinemanagertask": [ @@ -177056,6 +181079,32 @@ "0.1.27", "0.1.28" ], + "vhorbachov.iiswebapp.iiswebappdeploy-task.6da3e555-04c4-480f-91cd-d93c5e56bbf1": [ + "1.4.7", + "2.0.0" + ], + "vhorbachov.iiswebapp.iiswebappdeploy-task.iiswebappdeploy": [ + "1.4.7", + "2.0.0" + ], + "vhorbachov.iiswebapp.iiswebappmgmt-task.37506ba2-fb91-4417-9e9b-44c355c60135": [ + "1.3.6", + "2.1.3", + "3.0.0" + ], + "vhorbachov.iiswebapp.iiswebappmgmt-task.iiswebappmgmt": [ + "1.3.6", + "2.1.3", + "3.0.0" + ], + "vhorbachov.iiswebapp.sqldacpacdeploy-task.65c38e37-4bbd-4b44-acfd-72adf9dd7579": [ + "1.3.12", + "2.0.0" + ], + "vhorbachov.iiswebapp.sqldacpacdeploy-task.sqldacpacdeploy": [ + "1.3.12", + "2.0.0" + ], "vibrato.sumologic-tools.createsumologiccollectorandhttpsource.31f040e5-e040-4336-878a-59a493355534": [ "0.1.0", "0.1.1", @@ -177756,7 +181805,12 @@ "0.7.20", "0.7.21" ], - "visualstudiotestplatforminstaller-sxs": ["1.151.3", "1.212.0", "1.214.0"], + "visualstudiotestplatforminstaller-sxs": [ + "1.151.3", + "1.212.0", + "1.214.0", + "1.215.0" + ], "vitaliy-leschenko-by.hockeyappuwp.hockeyapp-task.3abefe9e-cc71-4670-b17e-688fcbb49860": [ "1.0.11" ], @@ -178257,7 +182311,14 @@ "1.0.196" ], "vstest_with_typemock": ["8.5.741"], - "vstest-sxs": ["1.198.0", "2.198.0", "2.203.0", "2.205.0", "2.210.0"], + "vstest-sxs": [ + "1.198.0", + "2.198.0", + "2.203.0", + "2.205.0", + "2.210.0", + "2.215.0" + ], "vstestforspecsync": ["1.0.0", "1.0.1", "1.0.5", "1.0.6"], "vstestwithtypemock": [ "8.4.2", @@ -178344,7 +182405,14 @@ "9.1.31663", "9.1.41672", "9.1.51686", - "9.1.61689" + "9.1.61689", + "9.1.61695", + "9.1.71696", + "9.1.81710", + "9.1.91713", + "9.1.91714", + "9.1.91716", + "9.1.91717" ], "vstestwithtypemocktask": ["8.5.742", "8.5.743"], "vsts-chef-task-cookbook-gems": [ @@ -180786,7 +184854,10 @@ "1.46.7", "2.0.3", "2.0.5", - "2.2.2" + "2.2.2", + "2.3.5", + "2.4.2", + "2.5.2" ], "wikipdfexporttask": [ "1.0.17", @@ -180804,7 +184875,9 @@ "2.5.4", "2.6.2", "2.7.4", - "3.0.10" + "3.0.10", + "3.1.2", + "3.2.2" ], "wikiupdatertask": [ "1.0.30", @@ -180856,7 +184929,10 @@ "1.46.7", "2.0.3", "2.0.5", - "2.2.2" + "2.2.2", + "2.3.5", + "2.4.2", + "2.5.2" ], "williamoconnor.azuredevopsapplicationgatewayscaletaskextension.me.williamoconnor.azuredevopsapplicationgatewayscaletaskextension.11f18d28-72b3-41e0-a85b-291e2739752d": [ "1.0.0" @@ -181280,7 +185356,8 @@ "2.5.800", "2.5.801", "2.5.830", - "2.5.835" + "2.5.835", + "3.0.0" ], "worksoft.worksoft-continuoustestingmanager-ps-task.custom-build-release-task.1900c78f-aadb-473b-b6b4-6574ce3f499d": [ "0.0.36", @@ -181302,7 +185379,8 @@ "0.0.52", "0.0.53", "0.0.54", - "0.0.58" + "0.0.58", + "0.0.61" ], "worksoft.worksoft-continuoustestingmanager-ps-task.custom-build-release-task.worksoftcontinuoustestingmanager": [ "0.0.36", @@ -181324,7 +185402,8 @@ "0.0.52", "0.0.53", "0.0.54", - "0.0.58" + "0.0.58", + "0.0.61" ], "worksoft.worksoft-executionmanager-ps-task.custom-build-release-task.472b73f0-49a0-4ff3-b4da-2951343494a6": [ "0.0.19", @@ -181366,7 +185445,8 @@ "0.0.52", "0.0.53", "0.0.54", - "0.0.58" + "0.0.58", + "0.0.61" ], "worksoftexecutionmanager": [ "0.0.19", @@ -181956,7 +186036,11 @@ "3.90.11", "4.0.16", "4.1.2", - "4.2.2" + "4.2.2", + "4.3.3", + "4.4.1", + "4.5.2", + "4.6.2" ], "xplus-executive-automats.ea-integration-custom.custom-build-release-task.c1581b7a-0c70-41a1-89da-cd04c1865b8a": [ "0.0.1", @@ -182019,6 +186103,13 @@ "0.1.1187689", "0.1.1239020" ], + "xrm-world.xrm-documentation-generator.xrm-documentation-generator-task.1e1d8658-3b8a-43ea-b99b-6aca23a44d00": [ + "1.0.0" + ], + "xrm-world.xrm-documentation-generator.xrm-documentation-generator-task.xrmdocumentationgenerator": [ + "1.0.0" + ], + "xrmdocumentationgenerator": ["1.0.0"], "xther-deployment": ["0.1.0", "0.1.1"], "yamlpatch": [ "1.1.4999", @@ -182266,7 +186357,8 @@ "2.0.9", "2.0.10", "2.0.11", - "2.0.12" + "2.0.12", + "2.0.13" ], "yingjieli-demo.hydra-lab.deploy-tests-to-hydra-lab.hydralabdeploytest": [ "0.1.0", @@ -182296,7 +186388,8 @@ "2.0.9", "2.0.10", "2.0.11", - "2.0.12" + "2.0.12", + "2.0.13" ], "yodlabs.o365postmessage.o365postmessagebuild.7ad6b2bf-1c03-4d63-93ed-dccf7d770063": [ "0.9.0", @@ -182624,7 +186717,8 @@ "1.0.1", "1.0.2", "1.0.3", - "1.1.0" + "1.1.0", + "1.2.0" ], "zscaler.zscaler-iac-scan-devops.custom-build-release-task.zscaleriacscan": [ "0.1.0", @@ -182634,7 +186728,8 @@ "1.0.1", "1.0.2", "1.0.3", - "1.1.0" + "1.1.0", + "1.2.0" ], "zscaleriacscan": [ "0.1.0", @@ -182644,7 +186739,8 @@ "1.0.1", "1.0.2", "1.0.3", - "1.1.0" + "1.1.0", + "1.2.0" ], "垀äŧä¸šåžŽäŋĄå‘送æļˆæ¯": ["0.1.0", "0.1.6", "0.2.3"] } diff --git a/data/azure-pipelines-tasks.json b/data/azure-pipelines-tasks.json index 29de8f96ee0cd1..aafd34f6206108 100644 --- a/data/azure-pipelines-tasks.json +++ b/data/azure-pipelines-tasks.json @@ -290,6 +290,7 @@ "3.150.0" ], "appcentertest": [ + "1.218.0", "1.214.0", "1.208.1", "1.208.0", @@ -311,6 +312,7 @@ "1.131.0" ], "ad5cd22a-be4e-48bb-adce-181a32432da5": [ + "1.218.0", "1.214.0", "1.208.1", "1.208.0", @@ -402,6 +404,8 @@ "automatedanalysis": ["0.198.0", "0.171.0"], "6b519857-1a20-4248-bae8-aad039015afb": ["0.198.0", "0.171.0"], "azureappservicemanage": [ + "0.217.2", + "0.217.1", "0.217.0", "0.216.1", "0.216.0", @@ -460,6 +464,8 @@ "0.2.32" ], "f045e430-8704-11e6-968f-e717e6411619": [ + "0.217.2", + "0.217.1", "0.217.0", "0.216.1", "0.216.0", @@ -617,6 +623,7 @@ "1.137.1", "1.137.0", "1.132.0", + "2.217.1", "2.217.0", "2.216.0", "2.215.0", @@ -683,6 +690,7 @@ "1.137.1", "1.137.0", "1.132.0", + "2.217.1", "2.217.0", "2.216.0", "2.215.0", @@ -712,6 +720,7 @@ "2.0.0" ], "azurecloudpowershelldeployment": [ + "1.218.0", "1.202.0", "1.198.0", "1.184.0", @@ -747,6 +756,7 @@ "1.3.4" ], "2ca8fe15-42ea-4b26-80f1-e0738ec17e89": [ + "1.218.0", "1.202.0", "1.198.0", "1.184.0", @@ -781,9 +791,10 @@ "1.3.5", "1.3.4" ], - "azurecontainerapps": ["0.215.0", "0.213.0"], - "cad8dd6a-de28-4d89-a7db-1bc20a2fbb2d": ["0.215.0", "0.213.0"], + "azurecontainerapps": ["0.218.0", "0.215.0", "0.213.0"], + "cad8dd6a-de28-4d89-a7db-1bc20a2fbb2d": ["0.218.0", "0.215.0", "0.213.0"], "azurefilecopy": [ + "1.219.0", "1.202.0", "1.198.0", "1.178.0", @@ -806,6 +817,10 @@ "1.0.116", "1.0.115", "1.0.114", + "2.219.1", + "2.219.0", + "2.218.0", + "2.217.1", "2.217.0", "2.216.1", "2.216.0", @@ -885,6 +900,10 @@ "2.0.2", "2.0.1", "2.0.0", + "3.219.1", + "3.219.0", + "3.218.0", + "3.217.1", "3.217.0", "3.216.1", "3.216.0", @@ -951,6 +970,10 @@ "3.0.3", "3.0.2", "3.0.1", + "4.219.1", + "4.219.0", + "4.218.0", + "4.217.1", "4.217.0", "4.216.1", "4.216.0", @@ -995,6 +1018,10 @@ "4.166.0", "4.165.0", "4.164.0", + "5.219.1", + "5.219.0", + "5.218.0", + "5.217.1", "5.217.0", "5.216.1", "5.216.0", @@ -1010,6 +1037,7 @@ "5.198.0" ], "eb72cb01-a7e5-427b-a8a1-1b31ccac8a43": [ + "1.219.0", "1.202.0", "1.198.0", "1.178.0", @@ -1032,6 +1060,10 @@ "1.0.116", "1.0.115", "1.0.114", + "2.219.1", + "2.219.0", + "2.218.0", + "2.217.1", "2.217.0", "2.216.1", "2.216.0", @@ -1111,6 +1143,10 @@ "2.0.2", "2.0.1", "2.0.0", + "3.219.1", + "3.219.0", + "3.218.0", + "3.217.1", "3.217.0", "3.216.1", "3.216.0", @@ -1177,6 +1213,10 @@ "3.0.3", "3.0.2", "3.0.1", + "4.219.1", + "4.219.0", + "4.218.0", + "4.217.1", "4.217.0", "4.216.1", "4.216.0", @@ -1221,6 +1261,10 @@ "4.166.0", "4.165.0", "4.164.0", + "5.219.1", + "5.219.0", + "5.218.0", + "5.217.1", "5.217.0", "5.216.1", "5.216.0", @@ -1396,6 +1440,8 @@ "1.0.2", "1.0.1", "1.0.0", + "2.219.0", + "2.218.1", "2.216.1", "2.216.0", "2.215.0", @@ -1470,6 +1516,8 @@ "1.0.2", "1.0.1", "1.0.0", + "2.219.0", + "2.218.1", "2.216.1", "2.216.0", "2.215.0", @@ -1482,6 +1530,9 @@ "2.208.0" ], "azurefunctiononkubernetes": [ + "0.219.0", + "0.218.0", + "0.217.0", "0.211.0", "0.210.0", "0.201.0", @@ -1508,9 +1559,16 @@ "0.160.7", "0.160.6", "0.160.5", - "0.160.4" + "0.160.4", + "1.219.0", + "1.218.0", + "1.217.1", + "1.217.0" ], "fd1aa5b9-400c-4f4b-9c0b-069ba74e53c6": [ + "0.219.0", + "0.218.0", + "0.217.0", "0.211.0", "0.210.0", "0.201.0", @@ -1541,10 +1599,15 @@ "0.160.3", "0.160.2", "0.160.1", - "0.160.0" + "0.160.0", + "1.219.0", + "1.218.0", + "1.217.1", + "1.217.0" ], "azurefunctionsonkubernetes": ["0.160.3", "0.160.2", "0.160.1", "0.160.0"], "azurefunction": [ + "1.218.0", "1.217.0", "1.198.0", "1.0.12", @@ -1559,6 +1622,7 @@ "1.0.3" ], "537fdb7a-a601-4537-aa70-92645a2b5ce4": [ + "1.218.0", "1.217.0", "1.198.0", "1.0.12", @@ -1645,6 +1709,8 @@ "2.0.0" ], "azurekeyvault": [ + "1.219.0", + "1.217.1", "1.217.0", "1.216.2", "1.216.1", @@ -1703,6 +1769,8 @@ "1.0.20", "1.0.19", "1.0.18", + "2.219.0", + "2.217.1", "2.217.0", "2.216.3", "2.216.2", @@ -1721,6 +1789,8 @@ "2.186.0" ], "1e244d32-2dd4-4165-96fb-b7441ca9331e": [ + "1.219.0", + "1.217.1", "1.217.0", "1.216.2", "1.216.1", @@ -1779,6 +1849,8 @@ "1.0.20", "1.0.19", "1.0.18", + "2.219.0", + "2.217.1", "2.217.0", "2.216.3", "2.216.2", @@ -1935,6 +2007,7 @@ "1.0.0" ], "azuremysqldeployment": [ + "1.217.1", "1.217.0", "1.216.1", "1.216.0", @@ -2015,6 +2088,7 @@ "1.0.1" ], "bd1bed02-f04e-11e7-8c3f-9a214cf093ae": [ + "1.217.1", "1.217.0", "1.216.1", "1.216.0", @@ -2149,6 +2223,7 @@ "0.0.1" ], "azurepowershell": [ + "2.218.0", "2.202.0", "2.198.0", "2.185.0", @@ -2180,6 +2255,7 @@ "2.1.2", "2.1.1", "2.1.0", + "3.218.0", "3.202.0", "3.198.0", "3.185.0", @@ -2226,6 +2302,8 @@ "3.0.5", "3.0.4", "3.0.3", + "4.218.0", + "4.217.1", "4.217.0", "4.216.1", "4.216.0", @@ -2303,6 +2381,8 @@ "4.0.61", "4.0.45", "4.0.43", + "5.218.0", + "5.217.1", "5.217.0", "5.216.1", "5.216.0", @@ -2344,6 +2424,7 @@ "5.162.0" ], "72a1931b-effb-4d2e-8fd8-f8472a07cb62": [ + "2.218.0", "2.202.0", "2.198.0", "2.185.0", @@ -2375,6 +2456,7 @@ "2.1.2", "2.1.1", "2.1.0", + "3.218.0", "3.202.0", "3.198.0", "3.185.0", @@ -2421,6 +2503,8 @@ "3.0.5", "3.0.4", "3.0.3", + "4.218.0", + "4.217.1", "4.217.0", "4.216.1", "4.216.0", @@ -2498,6 +2582,8 @@ "4.0.61", "4.0.45", "4.0.43", + "5.218.0", + "5.217.1", "5.217.0", "5.216.1", "5.216.0", @@ -2539,6 +2625,7 @@ "5.162.0" ], "azureresourcegroupdeployment": [ + "2.217.1", "2.217.0", "2.216.1", "2.216.0", @@ -2623,6 +2710,7 @@ "2.131.3" ], "94a74903-f93f-4075-884f-dc11f34058b4": [ + "2.217.1", "2.217.0", "2.216.1", "2.216.0", @@ -2705,6 +2793,8 @@ "2.136.0", "2.134.0", "2.131.3", + "3.218.0", + "3.217.1", "3.217.0", "3.216.1", "3.216.0", @@ -2764,6 +2854,8 @@ "3.0.0" ], "azureresourcemanagertemplatedeployment": [ + "3.218.0", + "3.217.1", "3.217.0", "3.216.1", "3.216.0", @@ -2823,6 +2915,7 @@ "3.0.0" ], "azurermwebappdeployment": [ + "3.217.1", "3.217.0", "3.216.1", "3.216.0", @@ -2878,6 +2971,7 @@ "3.4.2", "3.4.1", "3.4.0", + "4.217.2", "4.217.1", "4.217.0", "4.216.2", @@ -2992,6 +3086,7 @@ "4.1.7" ], "497d490f-eea7-4f2b-ab94-48d9c1acdcb1": [ + "3.217.1", "3.217.0", "3.216.1", "3.216.0", @@ -3047,6 +3142,7 @@ "3.4.2", "3.4.1", "3.4.0", + "4.217.2", "4.217.1", "4.217.0", "4.216.2", @@ -3161,6 +3257,8 @@ "4.1.7" ], "azurespringcloud": [ + "0.220.0", + "0.217.1", "0.217.0", "0.216.1", "0.216.0", @@ -3178,6 +3276,8 @@ "0.185.6" ], "5679292e-de0e-473a-948e-4874d2d8ef97": [ + "0.220.0", + "0.217.1", "0.217.0", "0.216.1", "0.216.0", @@ -3195,6 +3295,9 @@ "0.185.6" ], "azurestaticwebapp": [ + "0.220.0", + "0.219.0", + "0.217.0", "0.208.0", "0.203.0", "0.202.0", @@ -3205,6 +3308,9 @@ "0.1.0" ], "18aad896-e191-4720-88d6-8ced4806941a": [ + "0.220.0", + "0.219.0", + "0.217.0", "0.208.0", "0.203.0", "0.202.0", @@ -3215,6 +3321,8 @@ "0.1.0" ], "azurevmssdeployment": [ + "0.218.0", + "0.217.1", "0.217.0", "0.216.1", "0.216.0", @@ -3269,6 +3377,8 @@ "0.0.14" ], "4dda660c-b643-4598-a4a2-61080d0002d9": [ + "0.218.0", + "0.217.1", "0.217.0", "0.216.1", "0.216.0", @@ -3685,8 +3795,13 @@ "2.0.0" ], "cache": ["2.198.0", "2.0.1", "2.0.0"], - "cargoauthenticate": ["0.215.0", "0.214.2"], - "d1d75615-084d-4b9b-91a5-068b5f8c95a9": ["0.215.0", "0.214.2"], + "cargoauthenticate": ["0.218.0", "0.216.0", "0.215.0", "0.214.2"], + "d1d75615-084d-4b9b-91a5-068b5f8c95a9": [ + "0.218.0", + "0.216.0", + "0.215.0", + "0.214.2" + ], "chefknife": [ "1.198.0", "1.0.21", @@ -3834,6 +3949,7 @@ "2.127.0" ], "cocoapods": [ + "0.220.0", "0.212.0", "0.207.0", "0.201.1", @@ -3853,6 +3969,7 @@ "0.131.0" ], "bfc05e0d-839c-42cd-89c7-0f9fbfcab965": [ + "0.220.0", "0.212.0", "0.207.0", "0.201.1", @@ -3938,6 +4055,7 @@ "1.140.0" ], "containerbuild": [ + "0.219.0", "0.217.0", "0.216.1", "0.216.0", @@ -3971,6 +4089,7 @@ "0.160.1" ], "8413c881-4959-43d5-8840-b4ea0ffc5cfe": [ + "0.219.0", "0.217.0", "0.216.1", "0.216.0", @@ -4004,6 +4123,7 @@ "0.160.1" ], "containerstructuretest": [ + "0.219.0", "0.216.0", "0.211.2", "0.211.1", @@ -4032,6 +4152,7 @@ "0.1.0" ], "39bc2c9b-55b7-4835-89cd-6cc699ef7220": [ + "0.219.0", "0.216.0", "0.211.2", "0.211.1", @@ -4360,6 +4481,8 @@ "2.1.35" ], "dockercompose": [ + "0.220.0", + "0.219.0", "0.214.0", "0.198.0", "0.183.0", @@ -4413,6 +4536,8 @@ "0.4.16" ], "6975e2d1-96d3-4afc-8a41-498b5d34ea19": [ + "0.220.0", + "0.219.0", "0.214.0", "0.198.0", "0.183.0", @@ -4466,6 +4591,7 @@ "0.4.16" ], "dockerinstaller": [ + "0.218.0", "0.217.0", "0.216.0", "0.214.0", @@ -4485,6 +4611,7 @@ "0.1.0" ], "8e038650-f7bf-11e8-8a6c-8fff434b4eff": [ + "0.218.0", "0.217.0", "0.216.0", "0.214.0", @@ -4504,6 +4631,8 @@ "0.1.0" ], "docker": [ + "0.219.1", + "0.219.0", "0.214.0", "0.209.0", "0.198.0", @@ -4549,6 +4678,8 @@ "0.3.14", "0.3.13", "0.3.12", + "1.219.1", + "1.219.0", "1.215.0", "1.210.0", "1.198.0", @@ -4610,6 +4741,8 @@ "1.0.2", "1.0.1", "1.0.0", + "2.219.1", + "2.219.0", "2.214.0", "2.212.1", "2.212.0", @@ -4671,6 +4804,8 @@ "2.150.0" ], "e28912f1-0114-4464-802a-a3a35437fd16": [ + "0.219.1", + "0.219.0", "0.214.0", "0.209.0", "0.198.0", @@ -4716,6 +4851,8 @@ "0.3.14", "0.3.13", "0.3.12", + "1.219.1", + "1.219.0", "1.215.0", "1.210.0", "1.198.0", @@ -4777,6 +4914,8 @@ "1.0.2", "1.0.1", "1.0.0", + "2.219.1", + "2.219.0", "2.214.0", "2.212.1", "2.212.0", @@ -4838,6 +4977,7 @@ "2.150.0" ], "dotnetcorecli": [ + "2.217.0", "2.216.0", "2.210.0", "2.214.0", @@ -4929,6 +5069,7 @@ "2.132.1" ], "5541a522-603c-47ad-91fc-a4b1d163081b": [ + "2.217.0", "2.216.0", "2.210.0", "2.214.0", @@ -5110,6 +5251,7 @@ "1.0.2", "1.0.1", "1.0.0", + "2.219.0", "2.207.2", "2.207.3", "2.207.1", @@ -5167,6 +5309,7 @@ "2.0.0" ], "downloadbuildartifacts": [ + "0.217.1", "0.217.0", "0.216.0", "0.212.0", @@ -5219,10 +5362,12 @@ "0.136.2", "0.136.0", "0.135.0", + "1.220.0", "1.193.0", "1.192.0" ], "a433f589-fce1-4460-9ee6-44a624aeb1fb": [ + "0.217.1", "0.217.0", "0.216.0", "0.212.0", @@ -5275,6 +5420,7 @@ "0.136.2", "0.136.0", "0.135.0", + "1.220.0", "1.193.0", "1.192.0" ], @@ -5439,6 +5585,7 @@ "0.148.0" ], "downloadpackage": [ + "0.218.0", "0.215.0", "0.214.0", "0.214.1", @@ -5500,6 +5647,9 @@ "0.1.10", "0.1.9", "0.1.8", + "1.218.1", + "1.218.0", + "1.217.0", "1.216.0", "1.215.1", "1.215.0", @@ -5576,6 +5726,7 @@ "1.148.0" ], "8d6e8f7e-267d-442d-8c92-1f586864c62f": [ + "0.218.0", "0.215.0", "0.214.0", "0.214.1", @@ -5637,6 +5788,9 @@ "0.1.10", "0.1.9", "0.1.8", + "1.218.1", + "1.218.0", + "1.217.0", "1.216.0", "1.215.1", "1.215.0", @@ -6170,6 +6324,8 @@ "0.0.4", "0.0.2", "0.0.1", + "1.218.0", + "1.217.2", "1.217.1", "1.217.0", "1.211.1", @@ -6223,6 +6379,8 @@ "0.0.4", "0.0.2", "0.0.1", + "1.218.0", + "1.217.2", "1.217.1", "1.217.0", "1.211.1", @@ -6316,6 +6474,7 @@ "0.2.0" ], "gradle": [ + "2.219.0", "2.211.0", "2.208.0", "2.200.2", @@ -6360,6 +6519,7 @@ "2.137.0", "2.136.0", "2.135.0", + "3.219.0", "3.216.0", "3.208.0", "3.205.0", @@ -6369,6 +6529,7 @@ "3.192.0" ], "8d8eebd8-2b94-4c97-85af-839254cc6da4": [ + "2.219.0", "2.211.0", "2.208.0", "2.200.2", @@ -6413,6 +6574,7 @@ "2.137.0", "2.136.0", "2.135.0", + "3.219.0", "3.216.0", "3.208.0", "3.205.0", @@ -6510,6 +6672,10 @@ "1.0.0" ], "helmdeploy": [ + "0.218.0", + "0.217.3", + "0.217.2", + "0.217.1", "0.217.0", "0.216.1", "0.216.0", @@ -6628,6 +6794,10 @@ "0.1.8" ], "afa7d54d-537b-4dc8-b60a-e0eeea2c9a87": [ + "0.218.0", + "0.217.3", + "0.217.2", + "0.217.1", "0.217.0", "0.216.1", "0.216.0", @@ -6746,6 +6916,7 @@ "0.1.8" ], "helminstaller": [ + "0.218.0", "0.215.0", "0.213.0", "0.210.0", @@ -6781,6 +6952,7 @@ "0.1.5", "0.1.4", "0.1.3", + "1.218.0", "1.215.0", "1.210.0", "1.198.0", @@ -6818,6 +6990,7 @@ "1.150.0" ], "068d5909-43e6-48c5-9e01-7c8a94816220": [ + "0.218.0", "0.215.0", "0.213.0", "0.210.0", @@ -6853,6 +7026,7 @@ "0.1.5", "0.1.4", "0.1.3", + "1.218.0", "1.215.0", "1.210.0", "1.198.0", @@ -6960,6 +7134,7 @@ "1.2.1" ], "iiswebappdeploymentonmachinegroup": [ + "0.217.0", "0.216.0", "0.215.0", "0.208.0", @@ -7005,6 +7180,7 @@ "0.0.39" ], "1b467810-6725-4b6d-accd-886174c09bba": [ + "0.217.0", "0.216.0", "0.215.0", "0.208.0", @@ -7078,6 +7254,7 @@ "0.5.5" ], "installapplecertificate": [ + "2.219.0", "2.214.0", "2.212.0", "2.200.0", @@ -7115,6 +7292,7 @@ "2.134.1" ], "d2eff759-736d-4b7b-8554-7ba0960d49d6": [ + "2.219.0", "2.214.0", "2.212.0", "2.200.0", @@ -7296,6 +7474,7 @@ "0.119.0" ], "invokerestapi": [ + "1.218.0", "1.217.0", "1.198.0", "1.152.3", @@ -7311,6 +7490,7 @@ "1.0.1" ], "9c3e8943-130d-4c78-ac63-8af81df62dfb": [ + "1.218.0", "1.217.0", "1.198.0", "1.152.3", @@ -7326,6 +7506,9 @@ "1.0.1" ], "javatoolinstaller": [ + "0.220.0", + "0.218.0", + "0.217.1", "0.217.0", "0.216.2", "0.216.1", @@ -7387,6 +7570,9 @@ "0.134.1" ], "c0e0b74f-0931-47c7-ac27-7c5a19456a36": [ + "0.220.0", + "0.218.0", + "0.217.1", "0.217.0", "0.216.2", "0.216.1", @@ -7448,6 +7634,7 @@ "0.134.1" ], "jenkinsdownloadartifacts": [ + "1.217.1", "1.217.0", "1.216.1", "1.216.0", @@ -7487,6 +7674,7 @@ "1.135.0" ], "86c37a92-59a7-444b-93c7-220fcf91e29c": [ + "1.217.1", "1.217.0", "1.216.1", "1.216.0", @@ -7586,6 +7774,7 @@ "2.131.0" ], "kubectlinstaller": [ + "0.218.0", "0.210.0", "0.198.0", "0.181.0", @@ -7624,6 +7813,7 @@ "0.150.0" ], "8413c881-4959-43d5-8840-b4ea0ffc5cfd": [ + "0.218.0", "0.210.0", "0.198.0", "0.181.0", @@ -7662,6 +7852,8 @@ "0.150.0" ], "kubernetesmanifest": [ + "0.219.0", + "0.218.0", "0.212.0", "0.211.0", "0.210.0", @@ -7757,9 +7949,12 @@ "0.0.10", "0.0.1", "0.0.33", - "0.0.30" + "0.0.30", + "1.219.0" ], "dee316a2-586f-4def-be79-488a1f503dfe": [ + "0.219.0", + "0.218.0", "0.212.0", "0.211.0", "0.210.0", @@ -7851,7 +8046,8 @@ "0.0.11", "0.0.5", "0.0.4", - "1.0.4" + "1.0.4", + "1.219.0" ], "kubernetesmanifestbased": ["1.0.4", "0.0.1", "0.0.11"], "dee316a2-586f-4def-be79-488a1f503dee": [ @@ -7863,6 +8059,9 @@ "0.0.30" ], "kubernetes": [ + "0.219.0", + "0.218.1", + "0.218.0", "0.216.0", "0.214.0", "0.213.0", @@ -7928,6 +8127,8 @@ "0.1.23", "0.1.22", "0.1.21", + "1.219.0", + "1.218.0", "1.216.0", "1.214.0", "1.213.1", @@ -8061,6 +8262,9 @@ "1.0.0" ], "cbc316a2-586f-4def-be79-488a1f503564": [ + "0.219.0", + "0.218.1", + "0.218.0", "0.216.0", "0.214.0", "0.213.0", @@ -8126,6 +8330,8 @@ "0.1.23", "0.1.22", "0.1.21", + "1.219.0", + "1.218.0", "1.216.0", "1.214.0", "1.213.1", @@ -8295,6 +8501,8 @@ "0.0.1" ], "mavenauthenticate": [ + "0.218.1", + "0.218.0", "0.213.0", "0.210.0", "0.198.0", @@ -8316,6 +8524,8 @@ "0.1.28" ], "d4b964f9-ea90-41bb-9526-29589628ad90": [ + "0.218.1", + "0.218.0", "0.213.0", "0.210.0", "0.198.0", @@ -8414,6 +8624,7 @@ "2.137.1", "2.137.0", "2.135.0", + "3.219.0", "3.214.0", "3.214.1", "3.211.0", @@ -8499,6 +8710,7 @@ "3.139.2", "3.139.1", "3.139.0", + "4.219.0", "4.214.1", "4.214.0", "4.212.0", @@ -8582,6 +8794,7 @@ "2.137.1", "2.137.0", "2.135.0", + "3.219.0", "3.214.0", "3.214.1", "3.211.0", @@ -8667,6 +8880,7 @@ "3.139.2", "3.139.1", "3.139.0", + "4.219.0", "4.214.1", "4.214.0", "4.212.0", @@ -8826,7 +9040,11 @@ "1.0.1", "1.0.0" ], + "nodetaskrunnerinstaller": ["0.218.0"], + "31c75b2b-bcdf-4706-8d7c-4da6a1959bc2": ["0.218.0"], "nodetool": [ + "0.220.0", + "0.218.0", "0.213.0", "0.211.0", "0.210.1", @@ -8858,6 +9076,8 @@ "0.124.0" ], "31c75bbb-bcdf-4706-8d7c-4da6a1959bc2": [ + "0.220.0", + "0.218.0", "0.213.0", "0.211.0", "0.210.1", @@ -8933,6 +9153,7 @@ "1.0.0" ], "npmauthenticate": [ + "0.218.0", "0.216.1", "0.216.0", "0.215.0", @@ -8991,6 +9212,7 @@ "0.0.2" ], "ad884ca2-732e-4b85-b2d3-ed71bcbd2788": [ + "0.218.0", "0.216.1", "0.216.0", "0.215.0", @@ -9049,6 +9271,7 @@ "0.0.2" ], "npm": [ + "0.218.0", "0.215.1", "0.215.0", "0.210.0", @@ -9070,6 +9293,7 @@ "0.2.25", "0.2.24", "0.2.23", + "1.218.0", "1.215.1", "1.215.0", "1.213.0", @@ -9143,6 +9367,7 @@ "1.0.15" ], "fe47e961-9fa8-4106-8639-368c022d43ad": [ + "0.218.0", "0.215.1", "0.215.0", "0.210.0", @@ -9164,6 +9389,7 @@ "0.2.25", "0.2.24", "0.2.23", + "1.218.0", "1.215.1", "1.215.0", "1.213.0", @@ -9237,6 +9463,7 @@ "1.0.15" ], "nugetauthenticate": [ + "0.220.0", "0.203.0", "0.198.0", "0.194.0", @@ -9260,6 +9487,7 @@ "1.203.0" ], "f5fd8599-ccfa-4d6e-b965-4d14bed7097b": [ + "0.220.0", "0.203.0", "0.198.0", "0.194.0", @@ -9283,6 +9511,8 @@ "1.203.0" ], "nugetcommand": [ + "2.220.1", + "2.220.0", "2.216.0", "2.214.2", "2.214.3", @@ -9376,6 +9606,8 @@ "2.0.27" ], "333b11bd-d341-40d9-afcf-b32d5ce6f23b": [ + "2.220.1", + "2.220.0", "2.216.0", "2.214.2", "2.214.3", @@ -9489,6 +9721,8 @@ "0.2.35", "0.2.34", "0.2.33", + "1.219.0", + "1.216.0", "1.214.0", "1.208.0", "1.206.0", @@ -9553,6 +9787,8 @@ "0.1.75" ], "nugetpublisher": [ + "0.218.1", + "0.218.0", "0.208.1", "0.214.0", "0.208.0", @@ -9605,6 +9841,8 @@ "0.2.37" ], "333b11bd-d341-40d9-afcf-b32d5ce6f25b": [ + "0.218.1", + "0.218.0", "0.208.1", "0.214.0", "0.208.0", @@ -9657,6 +9895,8 @@ "0.2.37" ], "nugetrestore": [ + "1.219.0", + "1.216.0", "1.214.0", "1.208.0", "1.206.0", @@ -9679,6 +9919,8 @@ "1.0.3" ], "nugettoolinstaller": [ + "0.219.0", + "0.218.0", "0.215.0", "0.208.1", "0.214.0", @@ -9722,6 +9964,7 @@ "0.1.7", "0.1.6", "0.1.5", + "1.218.0", "1.215.0", "1.208.1", "1.214.0", @@ -9760,6 +10003,8 @@ "1.149.1" ], "2c65196a-54fd-4a02-9be8-d9d1837b7c5d": [ + "0.219.0", + "0.218.0", "0.215.0", "0.208.1", "0.214.0", @@ -9803,6 +10048,7 @@ "0.1.7", "0.1.6", "0.1.5", + "1.218.0", "1.215.0", "1.208.1", "1.214.0", @@ -9841,6 +10087,9 @@ "1.149.1" ], "nuget": [ + "0.219.0", + "0.218.1", + "0.218.0", "0.208.1", "0.214.0", "0.208.0", @@ -9893,6 +10142,9 @@ "0.1.3" ], "2661b7e5-00f9-4de1-ba41-04e68d70b528": [ + "0.219.0", + "0.218.1", + "0.218.0", "0.208.1", "0.214.0", "0.208.0", @@ -9961,6 +10213,7 @@ "0.157.0" ], "packerbuild": [ + "0.217.1", "0.217.0", "0.216.3", "0.216.2", @@ -10035,6 +10288,7 @@ "1.0.0" ], "845fd4f4-642d-4694-8514-047948a5a556": [ + "0.217.1", "0.217.0", "0.216.3", "0.216.2", @@ -10162,6 +10416,8 @@ "0.1.2", "0.1.1", "0.1.0", + "1.218.1", + "1.218.0", "1.213.0", "1.214.0", "1.206.0", @@ -10232,6 +10488,8 @@ "0.1.2", "0.1.1", "0.1.0", + "1.218.1", + "1.218.0", "1.213.0", "1.214.0", "1.206.0", @@ -10301,6 +10559,7 @@ "3.0.0" ], "powershell": [ + "2.220.0", "2.212.0", "2.210.0", "2.200.0", @@ -10334,6 +10593,7 @@ "2.129.0" ], "e213ff0f-5d5c-4791-802d-52ea3e7be1f1": [ + "2.220.0", "2.212.0", "2.210.0", "2.200.0", @@ -10407,6 +10667,7 @@ "1.135.0" ], "publishcodecoverageresults": [ + "1.219.0", "1.200.0", "1.198.0", "1.189.0", @@ -10443,12 +10704,14 @@ "1.139.1", "1.139.0", "1.131.0", + "2.218.0", "2.217.0", "2.215.0", "2.198.0", "2.159.0" ], "2a7ebc54-c13e-490e-81a5-d7561ab7cd97": [ + "1.219.0", "1.200.0", "1.198.0", "1.189.0", @@ -10485,6 +10748,7 @@ "1.139.1", "1.139.0", "1.131.0", + "2.218.0", "2.217.0", "2.215.0", "2.198.0", @@ -10528,6 +10792,7 @@ ], "publishpipelinemetadata": [ "0.216.0", + "0.217.0", "0.212.0", "0.211.0", "0.210.0", @@ -10546,6 +10811,7 @@ ], "01fa79eb-4c54-41b5-a16f-5cd8d60db88d": [ "0.216.0", + "0.217.0", "0.212.0", "0.211.0", "0.210.0", @@ -10625,6 +10891,7 @@ "1.0.39", "1.0.38", "1.0.37", + "2.216.2", "2.216.1", "2.216.0", "2.210.0", @@ -10712,6 +10979,7 @@ "1.0.39", "1.0.38", "1.0.37", + "2.216.2", "2.216.1", "2.216.0", "2.210.0", @@ -10783,6 +11051,7 @@ "2.0.5" ], "publishtoazureservicebus": [ + "1.217.0", "1.198.0", "1.0.17", "1.0.16", @@ -10799,6 +11068,7 @@ "1.0.5" ], "ba761f24-cbd6-48cb-92f3-fc13396405b1": [ + "1.217.0", "1.198.0", "1.0.17", "1.0.16", @@ -11221,6 +11491,8 @@ "2.1.3" ], "sqlazuredacpacdeployment": [ + "1.219.0", + "1.218.0", "1.217.0", "1.216.0", "1.214.0", @@ -11272,6 +11544,8 @@ "1.1.30" ], "ce85a08b-a538-4d2b-8589-1d37a9ab970f": [ + "1.219.0", + "1.218.0", "1.217.0", "1.216.0", "1.214.0", @@ -11477,6 +11751,7 @@ "0.121.0" ], "twineauthenticate": [ + "0.218.0", "0.214.0", "0.214.1", "0.208.2", @@ -11531,6 +11806,8 @@ "0.1.2", "0.1.1", "0.1.0", + "1.218.1", + "1.218.0", "1.213.0", "1.211.0", "1.208.0", @@ -11548,6 +11825,7 @@ "1.0.0" ], "e4d58330-c771-11e8-8f8f-81fbb42e2824": [ + "0.218.0", "0.214.0", "0.214.1", "0.208.2", @@ -11602,6 +11880,8 @@ "0.1.2", "0.1.1", "0.1.0", + "1.218.1", + "1.218.0", "1.213.0", "1.211.0", "1.208.0", @@ -11619,6 +11899,7 @@ "1.0.0" ], "universalpackages": [ + "0.218.0", "0.215.0", "0.214.0", "0.214.1", @@ -11689,6 +11970,7 @@ "0.0.1" ], "e0b79640-8625-11e8-91be-db2878ff888a": [ + "0.218.0", "0.215.0", "0.214.0", "0.214.1", @@ -11759,6 +12041,7 @@ "0.0.1" ], "usedotnet": [ + "2.219.0", "2.207.2", "2.207.3", "2.207.1", @@ -12104,6 +12387,7 @@ "1.0.89", "1.0.88", "1.0.87", + "2.219.0", "2.215.0", "2.210.0", "2.205.0", @@ -12240,6 +12524,7 @@ "2.135.4", "2.135.3", "2.135.2", + "3.219.0", "3.217.0", "3.210.0", "3.205.0" @@ -12258,6 +12543,7 @@ "1.0.89", "1.0.88", "1.0.87", + "2.219.0", "2.215.0", "2.210.0", "2.205.0", @@ -12394,6 +12680,7 @@ "2.135.4", "2.135.3", "2.135.2", + "3.219.0", "3.217.0", "3.210.0", "3.205.0" diff --git a/data/k8s-images.json b/data/k8s-images.json new file mode 100644 index 00000000000000..8bbb873b13617a --- /dev/null +++ b/data/k8s-images.json @@ -0,0 +1,871 @@ +[ + "addon-builder", + "addon-manager/kube-addon-manager", + "addon-manager/kube-addon-manager-amd64", + "addon-manager/kube-addon-manager-arm", + "addon-manager/kube-addon-manager-arm64", + "addon-manager/kube-addon-manager-ppc64le", + "addon-manager/kube-addon-manager-s390x", + "addon-resizer", + "addon-resizer-amd64", + "addon-resizer-arm", + "addon-resizer-arm64", + "addon-resizer-ppc64le", + "addon-resizer-s390x", + "aggregator", + "alpine-iptables-amd64", + "alpine-iptables-arm", + "alpine-iptables-arm64", + "alpine-with-bash", + "apisnoop/auditlogger", + "apisnoop/snoopdb", + "apparmor-loader", + "artifact-promoter/cip", + "artifact-promoter/cip-auditor", + "artifact-promoter/kpromo", + "artifact-promoter/kpromo-auditor", + "artifact-promoter/vulndash", + "autoscaling/addon-resizer", + "autoscaling/addon-resizer-amd64", + "autoscaling/addon-resizer-arm", + "autoscaling/addon-resizer-arm64", + "autoscaling/addon-resizer-ppc64le", + "autoscaling/addon-resizer-s390x", + "autoscaling/cluster-autoscaler", + "autoscaling/cluster-autoscaler-amd64", + "autoscaling/cluster-autoscaler-arm64", + "autoscaling/vpa-admission-controller", + "autoscaling/vpa-admission-controller-amd64", + "autoscaling/vpa-admission-controller-arm", + "autoscaling/vpa-admission-controller-arm64", + "autoscaling/vpa-admission-controller-ppc64le", + "autoscaling/vpa-admission-controller-s390x", + "autoscaling/vpa-recommender", + "autoscaling/vpa-recommender-amd64", + "autoscaling/vpa-recommender-arm", + "autoscaling/vpa-recommender-arm64", + "autoscaling/vpa-recommender-ppc64le", + "autoscaling/vpa-recommender-s390x", + "autoscaling/vpa-updater", + "autoscaling/vpa-updater-amd64", + "autoscaling/vpa-updater-arm", + "autoscaling/vpa-updater-arm64", + "autoscaling/vpa-updater-ppc64le", + "autoscaling/vpa-updater-s390x", + "bom/bom", + "build-image/debian-base", + "build-image/debian-base-amd64", + "build-image/debian-base-arm", + "build-image/debian-base-arm64", + "build-image/debian-base-ppc64le", + "build-image/debian-base-s390x", + "build-image/debian-hyperkube-base", + "build-image/debian-hyperkube-base-amd64", + "build-image/debian-hyperkube-base-arm", + "build-image/debian-hyperkube-base-arm64", + "build-image/debian-hyperkube-base-ppc64le", + "build-image/debian-hyperkube-base-s390x", + "build-image/debian-iptables", + "build-image/debian-iptables-amd64", + "build-image/debian-iptables-arm", + "build-image/debian-iptables-arm64", + "build-image/debian-iptables-ppc64le", + "build-image/debian-iptables-s390x", + "build-image/distroless-iptables", + "build-image/distroless-iptables-amd64", + "build-image/distroless-iptables-arm", + "build-image/distroless-iptables-arm64", + "build-image/distroless-iptables-ppc64le", + "build-image/distroless-iptables-s390x", + "build-image/go-runner", + "build-image/go-runner-amd64", + "build-image/go-runner-arm", + "build-image/go-runner-arm64", + "build-image/go-runner-ppc64le", + "build-image/go-runner-s390x", + "build-image/kube-cross", + "build-image/kube-cross-amd64", + "build-image/kube-cross-arm64", + "build-image/kube-cross-ppc64le", + "build-image/kube-cross-s390x", + "build-image/setcap", + "build-image/setcap-amd64", + "build-image/setcap-arm", + "build-image/setcap-arm64", + "build-image/setcap-ppc64le", + "build-image/setcap-s390x", + "busybox", + "cadvisor", + "capi-cloudstack/capi-cloudstack-controller", + "capi-docker/capd-manager", + "capi-ibmcloud/cluster-api-ibmcloud-controller", + "capi-kubeadm/cluster-api-kubeadm-controller", + "capi-kubeadm/cluster-api-kubeadm-controller-amd64", + "capi-kubeadm/cluster-api-kubeadm-controller-arm", + "capi-kubeadm/cluster-api-kubeadm-controller-arm64", + "capi-kubeadm/cluster-api-kubeadm-controller-ppc64le", + "capi-kubeadm/cluster-api-kubeadm-controller-s390x", + "capi-openstack/capi-openstack-controller", + "capi-operator/cluster-api-operator", + "cassandra", + "cassandra-e2e-test", + "check-metadata-concealment", + "cloud-controller-manager", + "cloud-controller-manager-amd64", + "cloud-controller-manager-arm", + "cloud-controller-manager-arm64", + "cloud-controller-manager-ppc64le", + "cloud-controller-manager-s390x", + "cloud-provider-gcp/gcp-compute-persistent-disk-csi-driver", + "cloud-provider-gcp/gcp-filestore-csi-driver", + "cloud-provider-ibm/ibm-powervs-block-csi-driver", + "cloud-provider-ibm/ibm-vpc-block-csi-driver", + "cloudsql-authenticator", + "cluster-api-aws/cluster-api-aws-controller", + "cluster-api-aws/cluster-api-aws-controller-amd64", + "cluster-api-aws/cluster-api-aws-controller-arm", + "cluster-api-aws/cluster-api-aws-controller-arm64", + "cluster-api-aws/cluster-api-aws-controller-ppc64le", + "cluster-api-aws/cluster-api-aws-controller-s390x", + "cluster-api-aws/eks-bootstrap-controller", + "cluster-api-aws/eks-controlplane-controller", + "cluster-api-azure/cluster-api-azure-controller", + "cluster-api-do/cluster-api-do-controller", + "cluster-api-gcp/cluster-api-gcp-controller", + "cluster-api-nested/cluster-api-nested-controller", + "cluster-api-nested/nested-controlplane-controller", + "cluster-api/cluster-api-controller", + "cluster-api/cluster-api-controller-amd64", + "cluster-api/cluster-api-controller-arm", + "cluster-api/cluster-api-controller-arm64", + "cluster-api/cluster-api-controller-ppc64le", + "cluster-api/cluster-api-controller-s390x", + "cluster-api/clusterctl", + "cluster-api/kubeadm-bootstrap-controller", + "cluster-api/kubeadm-control-plane-controller", + "cluster-api/plantuml", + "cluster-autoscaler", + "cluster-proportional-autoscaler-amd64", + "cluster-proportional-autoscaler-arm", + "cluster-proportional-autoscaler-arm64", + "cluster-proportional-autoscaler-ppc64le", + "clusterapi-tester", + "clusterregistry", + "conformance", + "conformance-amd64", + "conformance-arm", + "conformance-arm64", + "conformance-ppc64le", + "conformance-s390x", + "coredns", + "coredns/coredns", + "cos-kernel-headers", + "cos-nvidia-driver-install", + "cpa/cluster-proportional-autoscaler", + "cpa/cluster-proportional-autoscaler-amd64", + "cpa/cluster-proportional-autoscaler-arm", + "cpa/cluster-proportional-autoscaler-arm64", + "cpa/cluster-proportional-autoscaler-ppc64le", + "cpa/cpvpa", + "cpa/cpvpa-amd64", + "cpa/cpvpa-arm", + "cpa/cpvpa-arm64", + "cpa/cpvpa-ppc64le", + "cpvpa-amd64", + "csi-secrets-store/driver", + "csi-secrets-store/driver-crds", + "csi/csi-attacher", + "csi/csi-node-driver-registrar", + "csi/csi-provisioner", + "csi/csi-resizer", + "csi/csi-snapshotter", + "csi/livenessprobe", + "csi/mock-driver", + "cuda-vector-add", + "custom-metrics-stackdriver-adapter", + "debian-base", + "debian-base-amd64", + "debian-base-arm", + "debian-base-arm64", + "debian-base-ppc64le", + "debian-base-s390x", + "debian-hyperkube-base", + "debian-hyperkube-base-amd64", + "debian-hyperkube-base-arm", + "debian-hyperkube-base-arm64", + "debian-hyperkube-base-ppc64le", + "debian-hyperkube-base-s390x", + "debian-iptables", + "debian-iptables-amd64", + "debian-iptables-arm", + "debian-iptables-arm64", + "debian-iptables-ppc64le", + "debian-iptables-s390x", + "defaultbackend", + "defaultbackend-amd64", + "defaultbackend-arm", + "defaultbackend-arm64", + "defaultbackend-ppc64le", + "defaultbackend-s390x", + "descheduler/descheduler", + "device-plugin-gpu", + "dns-pod-autoscaler", + "dns-rc-autoscaler", + "dns/k8s-dns-dnsmasq-nanny", + "dns/k8s-dns-dnsmasq-nanny-amd64", + "dns/k8s-dns-dnsmasq-nanny-arm", + "dns/k8s-dns-dnsmasq-nanny-arm64", + "dns/k8s-dns-dnsmasq-nanny-ppc64le", + "dns/k8s-dns-dnsmasq-nanny-s390x", + "dns/k8s-dns-kube-dns", + "dns/k8s-dns-kube-dns-amd64", + "dns/k8s-dns-kube-dns-arm", + "dns/k8s-dns-kube-dns-arm64", + "dns/k8s-dns-kube-dns-ppc64le", + "dns/k8s-dns-kube-dns-s390x", + "dns/k8s-dns-node-cache", + "dns/k8s-dns-node-cache-amd64", + "dns/k8s-dns-node-cache-arm", + "dns/k8s-dns-node-cache-arm64", + "dns/k8s-dns-node-cache-ppc64le", + "dns/k8s-dns-node-cache-s390x", + "dns/k8s-dns-sidecar", + "dns/k8s-dns-sidecar-amd64", + "dns/k8s-dns-sidecar-arm", + "dns/k8s-dns-sidecar-arm64", + "dns/k8s-dns-sidecar-ppc64le", + "dns/k8s-dns-sidecar-s390x", + "dnsmasq", + "dnsmasq-amd64", + "dnsmasq-metrics-amd64", + "dnsmasq-metrics-arm", + "dnsmasq-metrics-arm64", + "dnsmasq-metrics-ppc64le", + "dnsutils", + "e2e-net-amd64", + "e2e-test-images/agnhost", + "e2e-test-images/apparmor-loader", + "e2e-test-images/busybox", + "e2e-test-images/cuda-vector-add", + "e2e-test-images/echoserver", + "e2e-test-images/glusterdynamic-provisioner", + "e2e-test-images/httpd", + "e2e-test-images/ipc-utils", + "e2e-test-images/jessie-dnsutils", + "e2e-test-images/kitten", + "e2e-test-images/metadata-concealment", + "e2e-test-images/nautilus", + "e2e-test-images/nginx", + "e2e-test-images/node-perf/npb-ep", + "e2e-test-images/node-perf/npb-is", + "e2e-test-images/node-perf/tf-wide-deep", + "e2e-test-images/nonewprivs", + "e2e-test-images/nonroot", + "e2e-test-images/perl", + "e2e-test-images/pets/peer-finder", + "e2e-test-images/pets/redis-installer", + "e2e-test-images/pets/zookeeper-installer", + "e2e-test-images/redis", + "e2e-test-images/regression-issue-74839", + "e2e-test-images/resource-consumer", + "e2e-test-images/sample-apiserver", + "e2e-test-images/sample-device-plugin", + "e2e-test-images/volume/gluster", + "e2e-test-images/volume/iscsi", + "e2e-test-images/volume/nfs", + "e2e-test-images/volume/rbd", + "echoserver", + "echoserver-amd64", + "echoserver-arm", + "echoserver-ppc64le", + "elasticsearch", + "eptest", + "etcd", + "etcd-amd64", + "etcd-arm", + "etcd-arm64", + "etcd-empty-dir-cleanup", + "etcd-ppc64le", + "etcd-s390x", + "etcd-statefulset-e2e-test", + "etcd-version-monitor", + "etcd-version-monitor-shyamjvs", + "etcd/etcd", + "etcd/etcd-empty-dir-cleanup", + "etcd_monitor_shyamjvs", + "etcd_probe_shyamjvs", + "etcd_version_monitor", + "etcd_version_monitor_shyamjvs", + "etcdadm/etcd-backup", + "etcdadm/etcd-dump", + "etcdadm/etcd-manager", + "etcdadm/etcd-manager-slim", + "event-exporter", + "example-dns-backend", + "example-dns-frontend", + "example-guestbook-php-redis", + "exechealthz", + "exechealthz-amd64", + "exechealthz-arm", + "exechealthz-arm64", + "exechealthz-ppc64le", + "exechealthz-s390x", + "experimental/conformance", + "experimental/conformance-amd64", + "experimental/conformance-arm", + "experimental/conformance-arm64", + "experimental/conformance-ppc64le", + "experimental/conformance-s390x", + "experimental/kube-apiserver", + "experimental/kube-apiserver-amd64", + "experimental/kube-apiserver-arm", + "experimental/kube-apiserver-arm64", + "experimental/kube-apiserver-ppc64le", + "experimental/kube-apiserver-s390x", + "experimental/kube-scheduler-arm", + "experimental/kube-scheduler-arm64", + "experimental/kube-scheduler-ppc64le", + "experimental/kube-scheduler-s390x", + "explorer", + "external-dns/external-dns", + "fakegitserver", + "federation-apiserver", + "federation-apiserver-amd64", + "federation-apiserver-arm", + "federation-apiserver-arm64", + "federation-apiserver-ppc64le", + "federation-controller-manager", + "federation-controller-manager-amd64", + "federation-controller-manager-arm", + "federation-controller-manager-arm64", + "federation-controller-manager-ppc64le", + "fetcher", + "flannel-amd64", + "flannel-arm", + "flannel-arm64", + "flannel-ppc64le", + "flannel-server-helper", + "fluent-bit-sd", + "fluentd-elasticsearch", + "fluentd-gcp", + "fluentd-gcp-scaler", + "fluentd-journal-gcp", + "fluentd-sidecar-es", + "fluentd-sidecar-gcp", + "galera-install", + "gci-mounter", + "gcp-controller-manager", + "gcsweb", + "gcsweb-amd64", + "gen-swagger-docs", + "git-sync", + "git-sync-amd64", + "git-sync/git-sync", + "github-fetcher", + "github-token-counter", + "github-transform", + "gitolite-http", + "gke-certificates-controller", + "gke-cloud-kms-plugin", + "gke-cloud-kms-sync", + "gke-launcher", + "gke-master-backup", + "gke-metadata-server", + "gke-mpi-api-server", + "gke-mpi-metadata-server", + "gke-node-termination-handler", + "glbc", + "gmsa-webhook/k8s-gmsa-webhook", + "google-containers-test-image", + "goproxy", + "guestbook", + "gvisor-admission-webhook-amd64", + "haproxy", + "healthz-server", + "heapster", + "heapster-amd64", + "heapster-arm", + "heapster-arm64", + "heapster-grafana", + "heapster-grafana-amd64", + "heapster-grafana-arm", + "heapster-grafana-arm64", + "heapster-grafana-ppc64le", + "heapster-grafana-s390x", + "heapster-influxdb", + "heapster-influxdb-amd64", + "heapster-influxdb-arm", + "heapster-influxdb-arm64", + "heapster-influxdb-ppc64le", + "heapster-influxdb-s390x", + "heapster-ppc64le", + "heapster-s390x", + "heapster_grafana", + "heapster_influxdb", + "hostexec", + "hpa-example", + "hpa-example2", + "hugo", + "hyperkube", + "hyperkube-amd64", + "hyperkube-arm", + "hyperkube-arm64", + "hyperkube-ppc64le", + "hyperkube-s390x", + "infra-tools/archeio", + "infra-tools/octodns", + "ingress-gce-404-server-with-metrics-amd64", + "ingress-gce-glbc-amd64", + "ingress-nginx/controller", + "ingress-nginx/controller-chroot", + "ingress-nginx/e2e-test-cfssl", + "ingress-nginx/e2e-test-echo", + "ingress-nginx/e2e-test-fastcgi-helloserver", + "ingress-nginx/e2e-test-httpbin", + "ingress-nginx/e2e-test-runner", + "ingress-nginx/kube-webhook-certgen", + "ingress-nginx/nginx", + "ingress-nginx/nginx-errors", + "ingress-nginx/opentelemetry", + "ingressconformance/echoserver", + "ip-masq-agent", + "ip-masq-agent-amd64", + "ip-masq-agent-arm", + "ip-masq-agent-arm64", + "ip-masq-agent-ppc64le", + "iperf", + "jessie-dnsutils", + "jsandtest", + "k8s-cloud-kms-plugin", + "k8s-custom-iptables", + "k8s-dns-dnsmasq-amd64", + "k8s-dns-dnsmasq-arm", + "k8s-dns-dnsmasq-arm64", + "k8s-dns-dnsmasq-nanny", + "k8s-dns-dnsmasq-nanny-amd64", + "k8s-dns-dnsmasq-nanny-arm", + "k8s-dns-dnsmasq-nanny-arm64", + "k8s-dns-dnsmasq-nanny-ppc64le", + "k8s-dns-dnsmasq-nanny-s390x", + "k8s-dns-dnsmasq-ppc64le", + "k8s-dns-dnsmasq-s390x", + "k8s-dns-e2e-amd64", + "k8s-dns-e2e-arm", + "k8s-dns-e2e-arm64", + "k8s-dns-e2e-ppc64le", + "k8s-dns-ginkgo-amd64", + "k8s-dns-ginkgo-arm", + "k8s-dns-ginkgo-arm64", + "k8s-dns-ginkgo-ppc64le", + "k8s-dns-kube-dns", + "k8s-dns-kube-dns-amd64", + "k8s-dns-kube-dns-arm", + "k8s-dns-kube-dns-arm64", + "k8s-dns-kube-dns-ppc64le", + "k8s-dns-kube-dns-s390x", + "k8s-dns-node-cache", + "k8s-dns-node-cache-amd64", + "k8s-dns-node-cache-arm", + "k8s-dns-node-cache-arm64", + "k8s-dns-node-cache-ppc64le", + "k8s-dns-node-cache-s390x", + "k8s-dns-sidecar", + "k8s-dns-sidecar-amd64", + "k8s-dns-sidecar-arm", + "k8s-dns-sidecar-arm64", + "k8s-dns-sidecar-e2e-amd64", + "k8s-dns-sidecar-e2e-arm", + "k8s-dns-sidecar-e2e-arm64", + "k8s-dns-sidecar-e2e-ppc64le", + "k8s-dns-sidecar-ppc64le", + "k8s-dns-sidecar-s390x", + "k8s-jupyterhub", + "k8s-tpu-operator", + "kas-network-proxy/proxy-agent", + "kas-network-proxy/proxy-server", + "kibana", + "kops/dns-controller", + "kops/dns-controller-amd64", + "kops/dns-controller-arm64", + "kops/kops-controller", + "kops/kops-controller-amd64", + "kops/kops-controller-arm64", + "kops/kube-apiserver-healthcheck", + "kops/kube-apiserver-healthcheck-amd64", + "kops/kube-apiserver-healthcheck-arm64", + "kube-addon-manager", + "kube-addon-manager-amd64", + "kube-addon-manager-arm", + "kube-addon-manager-arm64", + "kube-addon-manager-ppc64le", + "kube-addon-manager-s390x", + "kube-aggregator", + "kube-aggregator-amd64", + "kube-aggregator-arm", + "kube-aggregator-arm64", + "kube-aggregator-ppc64le", + "kube-aggregator-s390x", + "kube-apiserver", + "kube-apiserver-amd64", + "kube-apiserver-arm", + "kube-apiserver-arm64", + "kube-apiserver-ppc64le", + "kube-apiserver-s390x", + "kube-controller-manager", + "kube-controller-manager-amd64", + "kube-controller-manager-arm", + "kube-controller-manager-arm64", + "kube-controller-manager-ppc64le", + "kube-controller-manager-s390x", + "kube-cross", + "kube-discovery-amd64", + "kube-discovery-arm", + "kube-discovery-arm64", + "kube-dns-perf-client-amd64", + "kube-dnsmasq-amd64", + "kube-dnsmasq-arm", + "kube-dnsmasq-arm64", + "kube-dnsmasq-ppc64le", + "kube-haproxy", + "kube-keepalived-vip", + "kube-nethealth-amd64", + "kube-proxy", + "kube-proxy-amd64", + "kube-proxy-arm", + "kube-proxy-arm64", + "kube-proxy-ppc64le", + "kube-proxy-s390x", + "kube-registry-proxy", + "kube-scheduler", + "kube-scheduler-amd64", + "kube-scheduler-arm", + "kube-scheduler-arm64", + "kube-scheduler-ppc64le", + "kube-scheduler-s390x", + "kube-state-metrics", + "kube-state-metrics-amd64", + "kube-state-metrics-arm", + "kube-state-metrics-arm64", + "kube-state-metrics-ppc64le", + "kube-state-metrics-s390x", + "kube-state-metrics/kube-state-metrics", + "kube-state-metrics/kube-state-metrics-amd64", + "kube-state-metrics/kube-state-metrics-arm", + "kube-state-metrics/kube-state-metrics-arm64", + "kube-state-metrics/kube-state-metrics-ppc64le", + "kube-state-metrics/kube-state-metrics-s390x", + "kube-ui", + "kube2sky", + "kube2sky-amd64", + "kube2sky-arm", + "kube2sky-arm64", + "kube2sky-ppc64le", + "kubectl", + "kubedash", + "kubedns-amd64", + "kubedns-arm", + "kubedns-arm64", + "kubedns-ppc64le", + "kubekins-e2e", + "kubekins-job-builder", + "kubekins-test", + "kubelet-to-gcm", + "kubernetes-dashboard", + "kubernetes-dashboard-amd64", + "kubernetes-dashboard-arm", + "kubernetes-dashboard-arm64", + "kubernetes-dashboard-init-amd64", + "kubernetes-dashboard-init-arm", + "kubernetes-dashboard-ppc64le", + "kubernetes-dashboard-s390x", + "kubernetes-kafka", + "kubernetes-zookeeper", + "kubernetes/conformance", + "kubernetes/conformance-amd64", + "kubernetes/conformance-arm", + "kubernetes/conformance-arm64", + "kubernetes/conformance-ppc64le", + "kubernetes/conformance-s390x", + "kubernetes/etcd", + "kubernetes/etcd-empty-dir-cleanup", + "kubernetes/hyperkube", + "kubernetes/hyperkube-amd64", + "kubernetes/hyperkube-arm", + "kubernetes/hyperkube-arm64", + "kubernetes/hyperkube-ppc64le", + "kubernetes/hyperkube-s390x", + "kubernetes/kube-apiserver", + "kubernetes/kube-apiserver-amd64", + "kubernetes/kube-apiserver-arm", + "kubernetes/kube-apiserver-arm64", + "kubernetes/kube-apiserver-ppc64le", + "kubernetes/kube-apiserver-s390x", + "kubernetes/kube-controller-manager", + "kubernetes/kube-controller-manager-amd64", + "kubernetes/kube-controller-manager-arm", + "kubernetes/kube-controller-manager-arm64", + "kubernetes/kube-controller-manager-ppc64le", + "kubernetes/kube-controller-manager-s390x", + "kubernetes/kube-proxy", + "kubernetes/kube-proxy-amd64", + "kubernetes/kube-proxy-arm", + "kubernetes/kube-proxy-arm64", + "kubernetes/kube-proxy-ppc64le", + "kubernetes/kube-proxy-s390x", + "kubernetes/kube-scheduler", + "kubernetes/kube-scheduler-amd64", + "kubernetes/kube-scheduler-arm", + "kubernetes/kube-scheduler-arm64", + "kubernetes/kube-scheduler-ppc64le", + "kubernetes/kube-scheduler-s390x", + "kubernetes/pause", + "kubernetes/pause-amd64", + "kubernetes/pause-arm", + "kubernetes/pause-arm64", + "kubernetes/pause-ppc64le", + "kubernetes/pause-s390x", + "kueue/kueue", + "kustomize/kustomize", + "kwok/cluster", + "kwok/kwok", + "leader-elector", + "liveness", + "loader", + "logexp", + "logexporter", + "logs-generator", + "managed-certificate-controller", + "metadata-proxy", + "metrics-server", + "metrics-server-amd64", + "metrics-server-arm", + "metrics-server-arm64", + "metrics-server-ppc64le", + "metrics-server-s390x", + "metrics-server/metrics-server", + "metrics-server/metrics-server-amd64", + "metrics-server/metrics-server-arm", + "metrics-server/metrics-server-arm64", + "metrics-server/metrics-server-ppc64le", + "metrics-server/metrics-server-s390x", + "minikube-nvidia-driver-installer", + "mongodb-install", + "mounttest", + "mounttest-user", + "multitenancy/externalip-webhook", + "mungegithub", + "mysql-galera", + "mysql-healthz", + "n-way-http", + "netd", + "netd-amd64", + "netexec", + "netproxy", + "nettest", + "networking/ingress-gce-404-server-with-metrics-amd64", + "networking/ip-masq-agent", + "networking/ip-masq-agent-amd64", + "networking/ip-masq-agent-arm", + "networking/ip-masq-agent-arm64", + "networking/ip-masq-agent-ppc64le", + "nfd/node-feature-discovery", + "nfd/node-feature-discovery-operator", + "nginx", + "nginx-ingress", + "nginx-ingress-controller", + "nginx-ingress-controller-amd64", + "nginx-ingress-controller-arm", + "nginx-ingress-controller-arm64", + "nginx-ingress-controller-ppc64le", + "nginx-scale", + "nginx-slim", + "nginx-slim-amd64", + "nginx-slim-arm", + "nginx-slim-arm64", + "nginx-slim-ppc64le", + "nginx-third-party", + "no-snat-test-amd64", + "no-snat-test-proxy-amd64", + "node-conformance", + "node-perf-dash", + "node-problem-detector", + "node-problem-detector/node-problem-detector", + "node-test", + "node-test-amd64", + "node-test-arm", + "node-test-arm64", + "nodejs-election-client", + "non-masquerade-daemon-amd64", + "nonewprivs", + "nvidia-gpu-device-plugin", + "pause", + "pause-amd64", + "pause-arm", + "pause-arm64", + "pause-ppc64le", + "pause-s390x", + "peer-finder", + "perfdash", + "podmaster", + "porter", + "portforwardtester", + "prometheus-adapter/prometheus-adapter", + "prometheus-dummy-exporter", + "prometheus-to-sd", + "provider-aws/aws-ebs-csi-driver", + "provider-aws/cloud-controller-manager", + "provider-os/barbican-kms-plugin", + "provider-os/cinder-csi-plugin", + "provider-os/k8s-keystone-auth", + "provider-os/magnum-auto-healer", + "provider-os/manila-csi-plugin", + "provider-os/octavia-ingress-controller", + "provider-os/openstack-cloud-controller-manager", + "proxy-agent", + "proxy-server", + "proxy-to-service", + "publisher", + "publishing-bot/k8s-publishing-bot", + "python", + "queue-health-base", + "queue-health-graph", + "queue-health-poll", + "redis", + "redis-install", + "redis-install-3.2.0", + "redis-slave", + "registry-promoter-test-image", + "releng/kubepkg", + "releng/kubepkg-rpm", + "releng/releng-ci", + "rescheduler", + "rescheduler-amd64", + "rescheduler-arm", + "rescheduler-arm64", + "rescheduler-ppc64le", + "rescheduler-s390x", + "resource_consumer", + "resource_consumer/controller", + "rethinkdb", + "scheduler-plugins/controller", + "scheduler-plugins/kube-scheduler", + "scl-image-builder/cluster-node-image-builder-amd64", + "sd-dummy-exporter", + "seccomp-operator/seccomp-operator", + "security-profiles-operator-bundle/security-profiles-operator", + "security-profiles-operator-bundle/security-profiles-operator-amd64", + "security-profiles-operator-bundle/security-profiles-operator-arm64", + "security-profiles-operator-bundle/security-profiles-operator-bundle", + "security-profiles-operator-bundle/security-profiles-operator-catalog", + "security-profiles-operator-catalog/security-profiles-operator", + "security-profiles-operator-catalog/security-profiles-operator-amd64", + "security-profiles-operator-catalog/security-profiles-operator-arm64", + "security-profiles-operator-catalog/security-profiles-operator-bundle", + "security-profiles-operator-catalog/security-profiles-operator-catalog", + "security-profiles-operator/security-profiles-operator", + "security-profiles-operator/security-profiles-operator-amd64", + "security-profiles-operator/security-profiles-operator-arm64", + "security-profiles-operator/security-profiles-operator-bundle", + "security-profiles-operator/security-profiles-operator-catalog", + "serve-hostname-amd64", + "serve-hostname-arm", + "serve-hostname-arm64", + "serve-hostname-ppc64le", + "serve-hostname-s390x", + "serve_hostname", + "serve_hostname-amd64", + "serve_hostname-arm", + "serve_hostname-arm64", + "serve_hostname-ppc64le", + "serve_hostname-s390x", + "servicelb", + "shame-mailer", + "shyamjvs-logexp", + "shyamjvs-prometheus-to-sd", + "sig-auth/pod-security-webhook", + "sig-storage/csi-attacher", + "sig-storage/csi-external-health-monitor-agent", + "sig-storage/csi-external-health-monitor-controller", + "sig-storage/csi-node-driver-registrar", + "sig-storage/csi-provisioner", + "sig-storage/csi-resizer", + "sig-storage/csi-snapshotter", + "sig-storage/hello-populator", + "sig-storage/hostpathplugin", + "sig-storage/iscsiplugin", + "sig-storage/livenessprobe", + "sig-storage/local-volume-provisioner", + "sig-storage/mock-driver", + "sig-storage/nfs-provisioner", + "sig-storage/nfs-subdir-external-provisioner", + "sig-storage/nfsplugin", + "sig-storage/smbplugin", + "sig-storage/snapshot-controller", + "sig-storage/snapshot-validation-webhook", + "sig-storage/volume-data-source-validator", + "skydns", + "skydns-amd64", + "skydns-arm", + "skydns-arm64", + "skydns-ppc64le", + "slack-infra/slack-event-log", + "slack-infra/slack-moderator", + "slack-infra/slack-report-message", + "slack-infra/slack-welcomer", + "slack-infra/tempelis", + "slo-monitor", + "spark", + "spark-base", + "spark-driver", + "spark-master", + "spark-worker", + "spartakus-amd64", + "startup-script", + "storage-migrator/storage-version-migration-initializer", + "storage-migrator/storage-version-migration-migrator", + "storage-migrator/storage-version-migration-trigger", + "storage/csi-attacher", + "storage/csi-node-driver-registrar", + "storage/csi-provisioner", + "storage/csi-resizer", + "storage/csi-snapshotter", + "storage/livenessprobe", + "storage/mock-driver", + "stress", + "submit-queue", + "tensorflow-gpu-notebook", + "test-webserver", + "test_subdir_1/test_subdir_2/test_image", + "tf-models", + "tiny-glibc-amd64", + "tiny-glibc-arm", + "tiny-glibc-arm64", + "tiny-glibc-ppc64le", + "toolbox", + "ubuntu", + "ubuntu-nvidia-driver-installer", + "ubuntu-slim", + "ubuntu-slim-amd64", + "ubuntu-slim-arm", + "ubuntu-slim-arm64", + "ubuntu-slim-ppc64le", + "update-demo", + "visio-stencil-creator", + "volume-ceph", + "volume-csi/compute-persistent-disk-csi-driver", + "volume-csi/gcp-compute-persistent-disk-csi-driver", + "volume-csi/gcp-filestore-csi-driver", + "volume-gluster", + "volume-iscsi", + "volume-nfs", + "volume-rbd", + "vpa-admission-controller", + "vpa-recommender", + "vpa-updater", + "watcher-daemonset", + "webhooks-publisher", + "zeppelin", + "zeppelin-proxy", + "zookeeper-install", + "zookeeper-install-3.5.0-alpha" +] diff --git a/data/ubuntu-distro-info.json b/data/ubuntu-distro-info.json index 2127a7dfa71d3a..602853163d9758 100644 --- a/data/ubuntu-distro-info.json +++ b/data/ubuntu-distro-info.json @@ -202,8 +202,8 @@ "series": "bionic", "created": "2017-10-19", "release": "2018-04-26", - "eol": "2023-04-26", - "eol_server": "2023-04-26", + "eol": "2023-05-31", + "eol_server": "2023-05-31", "eol_esm": "2028-04-26" }, "v18.10": { @@ -232,8 +232,8 @@ "series": "focal", "created": "2019-10-17", "release": "2020-04-23", - "eol": "2025-04-23", - "eol_server": "2025-04-23", + "eol": "2025-05-29", + "eol_server": "2025-05-29", "eol_esm": "2030-04-23" }, "v20.10": { @@ -262,8 +262,8 @@ "series": "jammy", "created": "2021-10-14", "release": "2022-04-21", - "eol": "2027-04-21", - "eol_server": "2027-04-21", + "eol": "2027-06-01", + "eol_server": "2027-06-01", "eol_esm": "2032-04-21" }, "v22.10": { diff --git a/docs/development/best-practices.md b/docs/development/best-practices.md index 5f06bc6af06681..30cec02983a843 100644 --- a/docs/development/best-practices.md +++ b/docs/development/best-practices.md @@ -32,6 +32,7 @@ Read the [GitHub Docs, renaming a branch](https://docs.github.com/en/repositorie - Only use `istanbul` comments for unreachable code coverage that is needed for `codecov` completion - Use descriptive `istanbul` comments - Avoid cast or prefer `x as T` instead of `x` cast +- Prefer `satisfies` operator over `as`, read the [TypeScript release notes for `satisfies` operator](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-9.html#the-satisfies-operator) to learn more - Avoid `Boolean` instead use `is` functions from `@sindresorhus/is` package, for example: `is.string` ```ts diff --git a/docs/development/configuration.md b/docs/development/configuration.md index b77fdfd6e3a993..54b007df01d2be 100644 --- a/docs/development/configuration.md +++ b/docs/development/configuration.md @@ -32,7 +32,7 @@ e.g. apply one set of labels for `backend/package.json` and a different set of l module.exports = { npmrc: '//registry.npmjs.org/:_authToken=abc123', baseDir: '/tmp/renovate', - includeForks: true, + forkProcessing: 'enabled', gradle: { enabled: false }, }; ``` diff --git a/docs/development/local-development.md b/docs/development/local-development.md index ef07cd0a5539af..a141a9b3a537aa 100644 --- a/docs/development/local-development.md +++ b/docs/development/local-development.md @@ -11,12 +11,11 @@ For example, if you think anything is unclear, or you think something needs to b You need the following dependencies for local development: - Git `>=2.33.0` -- Node.js `>= 18.12.0` +- Node.js `>=18.12.0` - Yarn `^1.22.5` - C++ compiler We support Node.js versions according to the [Node.js release schedule](https://github.com/nodejs/Release#release-schedule). -If you are using Node.js `<= 18` you need to run `yarn install --ignore-engines`, because we've some `devDependencies` which require Node.js v18+. #### Linux @@ -171,17 +170,6 @@ To do this, see these GitHub guides: ## Tips and tricks -### Running Renovate against forked repositories - -Quite often, the quickest way for you to test or fix something is to fork an existing repository. -But by default Renovate skips over repositories that are forked. -To override this default, you need to specify the setting `includeForks` as `true`. - -Tell Renovate to run on your forked repository by doing one of the following: - -1. Add `"includeForks": true` to the `renovate.json` file in your forked repository -1. Run Renovate with the CLI flag `--renovate-fork=true` - ### Log files Usually, `debug` is good enough to troubleshoot most problems or verify functionality. diff --git a/docs/usage/.pages b/docs/usage/.pages index 377432b3aed333..e6e2117b871bdd 100644 --- a/docs/usage/.pages +++ b/docs/usage/.pages @@ -10,6 +10,7 @@ nav: - ... | modules - Language Support: - 'Bazel': 'bazel.md' + - 'Bicep': 'bicep.md' - 'Docker': 'docker.md' - 'Golang': 'golang.md' - 'Java': 'java.md' diff --git a/docs/usage/about-us.md b/docs/usage/about-us.md index b37185e5d57348..e81a41d3e1e9df 100644 --- a/docs/usage/about-us.md +++ b/docs/usage/about-us.md @@ -37,6 +37,7 @@ Some features made a lot of people happy, and efficient! - [@astellingwerf](https://github.com/astellingwerf) reviews PRs - [@danports](https://github.com/danports) worked on the Flux manager, and other managers. Feel free to ping `@danports` for any Flux-related issue or PR - [@shegox](https://github.com/shegox) worked on the Go manager, and improved our docs +- [@setchy](https://github.com/setchy) focused on Bitbucket Cloud and replacement features ## Renovate development diff --git a/docs/usage/bazel.md b/docs/usage/bazel.md index 01c8008dcd9e3c..2ab85e9923d1ce 100644 --- a/docs/usage/bazel.md +++ b/docs/usage/bazel.md @@ -11,7 +11,7 @@ Renovate supports upgrading dependencies in Bazel `WORKSPACE` files. 1. Bazel support is enabled automatically 2. Renovate will search repositories for any `WORKSPACE` files in the repository -3. Existing dependencies will be extracted from `git_repository` and `http_archive` declarations +3. Existing dependencies will be extracted from `container_pull`, `git_repository`, `go_repository`, `maven_install`, and `http_archive`/`http_file` declarations 4. Renovate will replace any old versions with the latest version available ## git_repository @@ -54,6 +54,23 @@ http_archive( Renovate uses the list of **releases** that it finds at the `url` to detect a new version. +## maven_install + +By default, Maven dependencies are extracted in the context of Gradle versioning scheme. +To change it, configure `packageRules` like this: + +```json +{ + "packageRules": [ + { + "matchManagers": ["bazel"], + "matchDatasources": ["maven"], + "versioning": "maven" + } + ] +} +``` + ## Future work Contributions and/or feature requests are welcome to support more patterns or additional use cases. diff --git a/docs/usage/bicep.md b/docs/usage/bicep.md new file mode 100644 index 00000000000000..ae21a09c0f956a --- /dev/null +++ b/docs/usage/bicep.md @@ -0,0 +1,45 @@ +--- +title: Bicep +description: Bicep dependencies support in Renovate +--- + +# Bicep + +Renovate supports upgrading API versions in `resource` references. +Upgrading `module` versions is not supported. + +## How it works + +1. Renovate searches for `.bicep` files. +2. Renovate parses the files for `resource` types and API versions. +3. Renovate looks up the latest version in the [Azure/bicep-types-az](https://github.com/Azure/bicep-types-az) repository. + +## Known issues + +API version updates of nested resources are not supported. + +The API version of the `blobServices` resource below for example, will not be upgraded: + +```bicep +resource storageAccount 'Microsoft.Storage/storageAccounts@2022-05-01' = { + name: 'test' + kind: 'StorageV2' + sku: { + name: 'Standard_LRS' + } + location: location + + resource blobServices 'blobServices@2022-05-01' = { + name: 'default' + } +} +``` + +## Future work + +- Support [versioned nested resource](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/child-resource-name-type#within-parent-resource) API version upgrades. +- Support [module](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/modules) version upgrades. + - [Public registry](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/modules#public-module-registry) module references. + - [Private registry](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/modules#private-module-registry) module references. + - [Template spec](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/modules#file-in-template-spec) module references. + - [Module aliases](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/bicep-config-modules#aliases-for-modules) support. diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md index ba378faa185545..67f8f640df594d 100644 --- a/docs/usage/configuration-options.md +++ b/docs/usage/configuration-options.md @@ -119,6 +119,37 @@ See [GitHub](https://docs.github.com/en/repositories/managing-your-repositorys-s If configured, Renovate will take a random sample of given size from assignees and assign them only, instead of assigning the entire list of `assignees` you have configured. +## autoReplaceGlobalMatch + +Setting this to `false` will replace only the first match during replacements updates. + +Disabling this is useful for situations where values are repeated within the dependency string, such as when the `currentVersion` is also featured somewhere within the `currentDigest`, but you only want to replace the first instance. + +Consider this example: + +```dockerfile +FROM java:8@sha256:0e8b2a860 +``` + +```json +{ + "packageRules": [ + { + "matchPackageNames": ["java"], + "replacementName": "eclipse-temurin", + "replacementVersion": "11" + } + ] +} +``` + +With the above replacement scenario, the current dependency has a version of `8`, which also features several times within the digest section. + +When using the default `autoReplaceGlobalMatch` configuration, Renovate will attempt to replace all instances of `8` within the dependency string with the `replacementVersion` value of `11`. +This will replace more than is intended and will be caught during replacement validation steps, resulting in the replacement PR to not be created. + +When setting `autoReplaceGlobalMatch` configuration to `false`, Renovate will only replace the first occurrence of `8` and will successfully create a replacement PR. + ## automerge By default, Renovate raises PRs but leaves them to someone or something else to merge them. @@ -153,7 +184,9 @@ So for example you could choose to automerge all (passing) `devDependencies` onl } ``` -Important: Renovate won't automerge on GitHub if a PR has a negative review outstanding. + +!!! warning "Negative reviews on GitHub block Renovate automerge" + Renovate won't automerge on GitHub if a PR has a negative review. !!! note @@ -478,12 +511,13 @@ If enabled, all issues created by Renovate are set as confidential, even in a pu ## configMigration -If enabled, Renovate will raise a pull request if config file migration is needed. +If enabled, Renovate raises a pull request when it needs to migrate the Renovate config file. +Renovate only performs `configMigration` on `.json` and `.json5` files. We're adding new features to Renovate bot often. -Most times you can keep using your Renovate config and benefit from the new features right away. -But sometimes you need to change your Renovate configuration. -To help you with this, Renovate will create config migration pull requests. +Often you can keep using your Renovate config and benefit from the new features right away. +But sometimes you need to update your Renovate configuration. +To help you with this, Renovate will create config migration pull requests, when you enable `configMigration`. Example: @@ -497,13 +531,17 @@ After we changed the [`baseBranches`](https://docs.renovatebot.com/configuration ``` -!!! info - This feature writes plain JSON for `.json` files, and JSON5 for `.json5` files. - JSON5 content can potentially be down leveled (`.json` files) and all comments will be removed. +!!! caution + The `configMigration` feature writes plain JSON for `.json` files, and JSON5 for `.json5` files. + Renovate may downgrade JSON5 content to plain JSON. + When downgrading JSON5 to JSON Renovate may also remove the JSON5 comments. + This can happen because Renovate wrongly converts JSON5 to JSON, thus removing the comments. !!! note - Closing the config migration PR will cause it to be ignored and not being reopend/recreated in the future.', + When you close a config migration PR, Renovate ignores it forever. + This also means that Renovate won't create a config migration PR in future. + If you closed the PR by accident, find the closed PR and re-name the PR title to get a new PR. ## configWarningReuseIssue @@ -544,6 +582,19 @@ If you need to _override_ constraints that Renovate detects from the repository, !!! note Make sure not to mix this up with the term `compatibility`, which Renovate uses in the context of version releases, e.g. if a Docker image is `node:12.16.0-alpine` then the `-alpine` suffix represents `compatibility`. +## constraintsFiltering + +This option controls whether Renovate filters new releases based on configured or detected `constraints`. +Renovate supports two options: + +- `none`: No release filtering (all releases allowed) +- `strict`: If the release's constraints match the package file constraints, then it's included + +We are working on adding more advanced filtering options. + +Note: There must be a `constraints` object in your Renovate config for this to work. +This feature is limited to `packagist`, `npm`, and `pypi` datasources. + ## defaultRegistryUrls Override a datasource's default registries with this config option. @@ -910,6 +961,20 @@ If this option is enabled, reviewers will need to create a new PR if additional !!! note This option is only relevant if you set `forkToken`. +## forkProcessing + +By default, Renovate will skip over any repositories that are forked if Renovate is using `autodiscover` mode. +This includes if the forked repository has a Renovate config file in the repo, because Renovate can't tell if that file was added by the original repository or not. +If you wish to enable processing of a forked repository by Renovate when autodiscovering, you need to add `"forkProcessing": "enabled"` to your repository config or run the CLI command with `--fork-processing=enabled`. + + +!!! note + Only the `onboardingConfigFileName` (which defaults to `renovate.json`) is supported for `forkProcessing`. You cannot use other filenames because Renovate will use the platform API to check only for the default filename. + +If you are running in non-autodiscover mode (e.g. supplying a list of repositories to Renovate) but wish to skip forked repositories, you need to configure `"forkProcessing": "disabled"` in your global config. + +If you are using the hosted Mend Renovate then this option will be configured to `"enabled"` automatically if you "Selected" repositories individually but `"disabled"` if you installed for "All" repositories. If you have installed Renovate into "All" repositories but have a fork you want to use, then add `"forkProcessing": "enabled"` to the repository's `renovate.json` file. + ## gitAuthor You can customize the Git author that's used whenever Renovate creates a commit. @@ -940,7 +1005,7 @@ Example: Ignore the default project level approval(s), so that Renovate bot can automerge its merge requests, without needing approval(s). Under the hood, it creates a MR-level approval rule where `approvals_required` is set to `0`. -This option works only when `automerge=true`, `automergeType=pr` or `automergeType=branch` and `platformAutomerge=true`. +This option works only when `automerge=true`, `automergeType=pr` or `automergeType=branch`, and `platformAutomerge=true`. Also, approval rules overriding should not be [prevented in GitLab settings](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/settings.html#prevent-editing-approval-rules-in-merge-requests). ## golang @@ -1404,14 +1469,6 @@ If you need to force permanent unstable updates for a package, you can add a pac Also check out the `followTag` configuration option above if you wish Renovate to keep you pinned to a particular release tag. -## includeForks - -By default, Renovate will skip over any repositories that are forked. -This includes if the forked repository has a Renovate config file, because Renovate can't tell if that file was added by the original repository or not. -If you wish to enable processing of a forked repository by Renovate, you need to add `"includeForks": true` to your repository config or run the CLI command with `--include-forks=true`. - -If you are using the hosted Mend Renovate then this option will be configured to `true` automatically if you "Selected" repositories individually but remain as `false` if you installed for "All" repositories. - ## includePaths If you wish for Renovate to process only select paths in the repository, use `includePaths`. @@ -1419,6 +1476,16 @@ If you wish for Renovate to process only select paths in the repository, use `in Alternatively, if you need to just _exclude_ certain paths in the repository then consider `ignorePaths` instead. If you are more interested in including only certain package managers (e.g. `npm`), then consider `enabledManagers` instead. +## internalChecksAsSuccess + +By default, internal Renovate checks such as `renovate/stability-days` are not counted towards a branch being "green" or not. +This is primarily to prevent automerge when the only check is a passing Renovate check. + +Internal checks will always be counted/considered if they are in pending or failed states. +If there are multiple passing checks for a branch, including non-Renovate ones, then this setting won't make any difference. + +Change this setting to `true` if you want to use internal Renovate checks towards a passing branch result. + ## internalChecksFilter This setting determines whether Renovate controls when and how filtering of internal checks are performed, particularly when multiple versions of the same update type are available. @@ -1796,7 +1863,7 @@ This field also supports Regular Expressions if they begin and end with `/`. e.g { "packageRules": [ { - "matchBaseBranches": ["/^release\\/.*/"], + "matchBaseBranches": ["/^release/.*/"], "excludePackagePatterns": ["^eslint"], "enabled": false } @@ -2068,6 +2135,39 @@ For example to apply a special label for Major updates: } ``` +### matchConfidence + + +!!! warning + This configuration option needs a Mend API key, and is in private beta testing only. + API keys are not available for free or via the `renovatebot/renovate` repository. + +For example to group high merge confidence updates: + +```json +{ + "packageRules": [ + { + "matchConfidence": ["high", "very high"], + "groupName": "high merge confidence" + } + ] +} +``` + +Tokens can be configured via `hostRules` using the `"merge-confidence"` `hostType`: + +```json +{ + "hostRules": [ + { + "hostType": "merge-confidence", + "token": "********" + } + ] +} +``` + ### customChangelogUrl Use this field to set the source URL for a package, including overriding an existing one. @@ -2109,9 +2209,49 @@ Managers which do not support replacement: - `regex` Use the `replacementName` config option to set the name of a replacement package. -Must be used with `replacementVersion` (see example below). + +Can be used in combination with `replacementVersion`. + You can suggest a new community package rule by editing [the `replacements.ts` file on the Renovate repository](https://github.com/renovatebot/renovate/blob/main/lib/config/presets/internal/replacements.ts) and opening a pull request. +### replacementNameTemplate + + +!!! note + `replacementName` will take precedence if used within the same package rule. + +Use the `replacementNameTemplate` config option to control the replacement name. + +Use the triple brace `{{{ }}}` notation to avoid Handlebars escaping any special characters. + +For example, the following package rule can be used to replace the registry for `docker` images: + +```json +{ + "packageRules": [ + { + "matchDatasources": ["docker"], + "matchPackagePrefix": ["^docker.io/.*)"], + "replacementNameTemplate": "{{{replace 'docker.io/' 'ghcr.io/' packageName}}}" + } + ] +} +``` + +Or, to add a registry prefix to any `docker` images that do not contain an explicit registry: + +```json +{ + "packageRules": [ + { + "matchDatasources": ["docker"], + "matchPackagePrefix": ["^([^.]+)(\\/\\:)?$"], + "replacementNameTemplate": "some.registry.org/{{{packageName}}}" + } + ] +} +``` + ### replacementVersion This config option only works with some managers. @@ -2329,12 +2469,14 @@ The available sections are header, table, notes, changelogs, configDescription, ## prConcurrentLimit -This setting - if enabled - limits Renovate to a maximum of x concurrent PRs open at any time. +This setting - if enabled - limits Renovate to a maximum of `x` concurrent PRs open at any time. This limit is enforced on a per-repository basis. -Note: Renovate always creates security PRs, even if the concurrent PR limit is already reached. -Security PRs have `[SECURITY]` in their PR title. + +!!! note + Renovate always creates security PRs, even if the concurrent PR limit is already reached. + Security PRs have `[SECURITY]` in their PR title. ## prCreation @@ -2769,7 +2911,7 @@ regex definition: { "fileMatch": ["values.yaml$"], "matchStrings": [ - "image:\\s+(?my\\.old\\.registry\\/aRepository\\/andImage):(?[^\\s]+)" + "image:\\s+(?my\\.old\\.registry/aRepository/andImage):(?[^\\s]+)" ], "depNameTemplate": "my.new.registry/aRepository/andImage", "autoReplaceStringTemplate": "image: {{{depName}}}:{{{newValue}}}", diff --git a/docs/usage/docker.md b/docs/usage/docker.md index a484795a4c957e..4a254244b5bb1e 100644 --- a/docs/usage/docker.md +++ b/docs/usage/docker.md @@ -388,7 +388,7 @@ To get access to the token a custom Renovate Docker image is needed that include The Dockerfile to create such an image can look like this: ```Dockerfile -FROM renovate/renovate:34.132.4 +FROM renovate/renovate:35.14.1 # 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/faq.md b/docs/usage/faq.md index 49e975a179ede3..bfe5902dab1eba 100644 --- a/docs/usage/faq.md +++ b/docs/usage/faq.md @@ -33,8 +33,8 @@ If you're self hosting Renovate, use the latest release if possible. | Feature | Platforms which lack feature | See Renovate issue(s) | | -------------------- | ---------------------------------------------------------- | ------------------------------------------------------------ | -| Dependency Dashboard | Azure, BitBucket, BitBucket Server | [#9592](https://github.com/renovatebot/renovate/issues/9592) | -| Hosted app | Azure, BitBucket, BitBucket Server, Forgejo, Gitea, GitLab | | +| Dependency Dashboard | Azure, Bitbucket, Bitbucket Server | [#9592](https://github.com/renovatebot/renovate/issues/9592) | +| Hosted app | Azure, Bitbucket, Bitbucket Server, Forgejo, Gitea, GitLab | | ## Major platform features not supported by Renovate @@ -42,9 +42,10 @@ Some major platform features are not supported at all by Renovate. | Feature name | Platform | See Renovate issue(s) | | --------------------------------------- | ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Jira issues | BitBucket | [#3796](https://github.com/renovatebot/renovate/issues/3796) | +| Jira issues | Bitbucket | [#20568](https://github.com/renovatebot/renovate/issues/20568) | +| Jira issues | Bitbucket Server | [#3796](https://github.com/renovatebot/renovate/issues/3796) | | Merge trains | GitLab | [#5573](https://github.com/renovatebot/renovate/issues/5573) | -| Configurable merge strategy and message | Only BitBucket, Forgejo and Gitea for now | [#10867](https://github.com/renovatebot/renovate/issues/10867) [#10869](https://github.com/renovatebot/renovate/issues/10869) [#10870](https://github.com/renovatebot/renovate/issues/10870) | +| Configurable merge strategy and message | Only Bitbucket, Forgejo and Gitea for now | [#10867](https://github.com/renovatebot/renovate/issues/10867) [#10869](https://github.com/renovatebot/renovate/issues/10869) [#10870](https://github.com/renovatebot/renovate/issues/10870) | ## What is this `main` branch I see in the documentation? diff --git a/docs/usage/getting-started/private-packages.md b/docs/usage/getting-started/private-packages.md index e9aaa54b5b1cc9..3fd93fbef60706 100644 --- a/docs/usage/getting-started/private-packages.md +++ b/docs/usage/getting-started/private-packages.md @@ -231,7 +231,7 @@ The recommended approaches in order of preference are: 1. **Self-hosted hostRules**: Configure a hostRules entry in the bot's `config.js` with the `hostType`, `matchHost` and `token` specified 1. **Renovate App with private modules from npmjs.org**: Add an encrypted `npmToken` to your Renovate config -1. **Renovate App with a private registry**: Add an unencrypted `npmrc` plus an encrypted `npmToken` in config +1. **Renovate App with a private registry**: Add an plaintext `npmrc` plus an encrypted `npmToken` in config These approaches are described in full below. @@ -296,7 +296,7 @@ If you are using the main npmjs registry then you can configure just the `npmTok #### Add an encrypted npm token to Renovate config -If you don't want all users of the repository to see the unencrypted token, you can encrypt it with Renovate's public key instead, so that only Renovate can decrypt it. +If you don't want all users of the repository to see the plaintext token, you can encrypt it with Renovate's public key instead, so that only Renovate can decrypt it. Go to , paste in your npm token, select "Encrypt", then copy the encrypted result. diff --git a/docs/usage/getting-started/use-cases.md b/docs/usage/getting-started/use-cases.md index 514a4d63ba6bbe..2ae0e8eb9e69fe 100644 --- a/docs/usage/getting-started/use-cases.md +++ b/docs/usage/getting-started/use-cases.md @@ -8,7 +8,7 @@ The original use case, and the most popular one, is for developers to automate d ### Updating of package files -We use the term "package file" to describe files which have references to dependencies. +We use the term "package file" to describe files which reference dependencies. Package files are managed by a "package manager". Example package files include: @@ -21,7 +21,7 @@ Example package files include: Renovate: -1. Scans your repositories to detect package files and their dependencies +1. Scans your repositories to find package files and their dependencies 1. Checks if any newer versions exist 1. Raises Pull Requests for available updates @@ -38,7 +38,7 @@ Many package managers support "lock files", which "freeze" the entire dependency npm, Yarn, Bundler, Composer, Poetry, Pipenv, and Cargo all support or use lock files. If you use a lock file then changes to your package file must come with a compatible change to the lock file. -Renovate can patch/update package files directly, but a lock file is too complex to "reverse engineer". +Renovate can patch/update package files directly, but can't "reverse engineer" lock files. This is why Renovate lets the package manager do the lock file update. A simplified example: @@ -52,12 +52,13 @@ A simplified example: ### Custom dependency extraction Renovate supports 60+ types of package files. -Not all dependencies are detected by default, this can be because: +By default, Renovate finds most dependencies, but there are exceptions. +This can be because: - The package manager/file format is not supported, or - The file format is not a standard or is proprietary -If your dependencies are not detected by default, you can use our "regex" manager to set your own custom patterns to extract dependencies. +If your dependencies are not found by default, you can use our "regex" manager to set your own custom patterns to extract dependencies. You configure the regex manager by telling it: - Which file pattern(s) to match @@ -74,7 +75,7 @@ Renovate is increasingly used for purposes which are traditionally described as It's common for repositories to have DevOps-related files like CI/CD configs, or "Infrastructure as Code" (IaC) files. Examples of IaC files are Docker, Kubernetes or Terraform files. -Renovate handles IaC files as "package managers" and "package files" and can detect and update them. +Renovate handles IaC files as "package managers" and "package files" and can find and update them. #### Docker-compatible images @@ -107,7 +108,7 @@ When you're using tag+digest based images, you'll have immutable builds. ### Internal package updates Your company typically has dozens of repositories, if not hundreds or thousands. -These repositories usually rely on other repositories and may have upstream or downstream internal dependencies. +These repositories often rely on other repositories and may have upstream or downstream internal dependencies. In such cases, it is best practice to: - Update downstream links as soon as possible, and @@ -184,7 +185,7 @@ You can use Renovate's "Dependency Dashboard" on platforms which support dynamic When you enable the Dependency Dashboard, Renovate creates a "Dependency Dashboard" issue. This issue lists all updates which are pending, in progress, or were previously closed ignored. -If you want to get an update ahead of schedule, or want to retry a previously closed update, you can select the update's checkbox in the Dependency Dashboard. +If you want to get an update ahead of schedule, or want to retry a previously closed update: select the update's checkbox in the Dependency Dashboard. ### Dependency Dashboard Approval diff --git a/docs/usage/golang.md b/docs/usage/golang.md index ed75cbd47eb029..705e294f208096 100644 --- a/docs/usage/golang.md +++ b/docs/usage/golang.md @@ -47,6 +47,11 @@ The reason for this is that a `go mod tidy` command may make changes to `go.mod` Vendoring of Go Modules is done automatically if `vendor/modules.txt` is present. Renovate will commit all files changed within the `vendor/` folder. + +!!! note + Renovate does not support vendoring major upgrades of Go modules. + Follow issue [#21010](https://github.com/renovatebot/renovate/issues/21010). + ### Go binary version By default, Renovate will keep up with the latest version of the `go` binary. diff --git a/docs/usage/key-concepts/automerge.md b/docs/usage/key-concepts/automerge.md index bee31d4a2f0e79..1ac8ba0877f642 100644 --- a/docs/usage/key-concepts/automerge.md +++ b/docs/usage/key-concepts/automerge.md @@ -119,50 +119,52 @@ The steps to enable GitHub's Merge Queue differ based on whether you use GitHub !!! warning "GitHub Merge Queue is in beta" - GitHub's Merge Queue feature is labeled as a beta feature by GitHub themselves. - The Merge Queue may stop working, have bugs, or maybe you need to update your configuration when GitHub changes things. + GitHub's Merge Queue feature is labeled as a beta feature by GitHub. + The Merge Queue may stop working, have bugs, or you may need to update your configuration when GitHub changes things. #### If you use GitHub Actions If you use GitHub Actions as your CI provider, follow these steps: -1. Add the `on.merge_group` event to your GitHub Action `.yaml` files, for example: - - ```yaml - on: - pull_request: - merge_group: - ``` - -1. On `github.com`: - 1. Go to your repository's "homepage", click on Settings, scroll down to the Pull Requests section, [enable the "Allow auto-merge" checkbox](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-auto-merge-for-pull-requests-in-your-repository#managing-auto-merge) - 1. Go to your repository's branch protection rules for your base branch (usually `main`) and enable the "Require merge queue" setting - 1. Confirm you've set the correct "required checks" for your base branch -1. Allow Renovate to automerge by setting `automerge=true` and `platformAutomerge=true` in your Renovate config file, for example: - - ```json - { - "platformAutomerge": true, - "packageRules": [ - { - "description": "Automerge non-major updates", - "matchUpdateTypes": ["minor", "patch"], - "automerge": true - } - ] - } - ``` +Add the `on.merge_group` event to your GitHub Action `.yaml` files, for example: + +```yaml +on: + pull_request: + merge_group: +``` + +On `github.com`, go to your repository's "homepage", click on Settings, scroll down to the Pull Requests section and [enable the "Allow auto-merge" checkbox](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-auto-merge-for-pull-requests-in-your-repository#managing-auto-merge). + +Then go to your repository's branch protection rules for your base branch (usually `main`) and enable the "Require merge queue" setting. +Confirm you've set the correct "required checks" for your base branch. + +Finally, allow Renovate to automerge by setting `automerge=true` and `platformAutomerge=true` in your Renovate config file, for example: + +```json +{ + "platformAutomerge": true, + "packageRules": [ + { + "description": "Automerge non-major updates", + "matchUpdateTypes": ["minor", "patch"], + "automerge": true + } + ] +} +``` #### If you don't use GitHub Actions If you _don't_ use GitHub Actions as your CI provider, follow these steps: -1. Update your CI provider's configuration so it also runs tests on the temporary `gh-readonly-queue/{base_branch}` branches, read your CI providers's documentation to learn how to do this -1. On `github.com`: - 1. Go to your repository's "homepage", click on Settings, scroll down to the Pull Requests section, [enable the "Allow auto-merge" checkbox](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-auto-merge-for-pull-requests-in-your-repository#managing-auto-merge) - 1. Go to your repository's branch protection rules for your base branch (usually `main`) and enable the "Require merge queue" setting - 1. Confirm you've set the correct "required checks" for your base branch -1. Allow Renovate to automerge by setting `automerge=true` and `platformAutomerge=true` in your Renovate config file (see earlier example) +Update your CI provider's configuration so it also runs tests on the temporary `gh-readonly-queue/{base_branch}` branches, read your CI providers's documentation to learn how to do this. + +On `github.com`, go to your repository's "homepage", click on Settings, scroll down to the Pull Requests section and [enable the "Allow auto-merge" checkbox](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-auto-merge-for-pull-requests-in-your-repository#managing-auto-merge). +Go to your repository's branch protection rules for your base branch (usually `main`) and enable the "Require merge queue" setting. +Confirm you've set the correct "required checks" for your base branch. + +Finally, allow Renovate to automerge by setting `automerge=true` and `platformAutomerge=true` in your Renovate config file (see earlier example). ## Automerging and scheduling diff --git a/docs/usage/python.md b/docs/usage/python.md index db5bb2420e58c3..83c3ed3672e054 100644 --- a/docs/usage/python.md +++ b/docs/usage/python.md @@ -5,13 +5,8 @@ description: Python/pip dependencies support in Renovate # Python package manager support -Renovate supports the following Python package managers: - -- `pip` (e.g. `requirements.txt`, `requirements.pip`) files -- `pipenv` (e.g. `Pipfile`) -- `poetry` (e.g. `pyproject.toml`) -- `setup.py` file -- `setup.cfg` file +Renovate supports several Python package managers, including `pip`, `pipenv`, `poetry`, etc. +See [all supported managers](https://docs.renovatebot.com/modules/manager/). ## Versioning support diff --git a/docs/usage/self-hosted-configuration.md b/docs/usage/self-hosted-configuration.md index f0a8e3787dcaba..4c3c178ef7c660 100644 --- a/docs/usage/self-hosted-configuration.md +++ b/docs/usage/self-hosted-configuration.md @@ -139,6 +139,14 @@ For example: } ``` +## bbUseDevelopmentBranch + +By default, Renovate will use a repository's "main branch" (typically called `main` or `master`) as the "default branch". + +Configuring this to `true` means that Renovate will detect and use the Bitbucket [development branch](https://support.atlassian.com/bitbucket-cloud/docs/branch-a-repository/#The-branching-model) as defined by the repository's branching model. + +If the "development branch" is configured but the branch itself does not exist (e.g. it was deleted), Renovate will fall back to using the repository's "main branch". This fall back behavior matches that of the Bitbucket Cloud web interface. + ## binarySource Renovate often needs to use third-party binaries in its PRs, like `npm` to update `package-lock.json` or `go` to update `go.sum`. @@ -302,9 +310,9 @@ You can skip the host part, and use just the datasource and credentials. Adds a custom prefix to the default Renovate sidecar Docker containers name and label. -For example, if you set `dockerChildPrefix=myprefix_` then the final container created from the `renovate/node` is: +For example, if you set `dockerChildPrefix=myprefix_` then the final container created from the `containerbase/sidecar` is: -- called `myprefix_node` instead of `renovate_node` +- called `myprefix_sidecar` instead of `renovate_sidecar` - labeled `myprefix_child` instead of `renovate_child` @@ -313,19 +321,19 @@ For example, if you set `dockerChildPrefix=myprefix_` then the final container c ## dockerImagePrefix -By default Renovate pulls the sidecar Docker containers from `docker.io/renovate`. +By default Renovate pulls the sidecar Docker containers from `docker.io/containerbase`. You can use the `dockerImagePrefix` option to override this default. -Say you want to pull your images from `ghcr.io/renovatebot`. +Say you want to pull your images from `ghcr.io/containerbase` to bypass Docker Hub limits. You would put this in your configuration file: ```json { - "dockerImagePrefix": "ghcr.io/renovatebot" + "dockerImagePrefix": "ghcr.io/containerbase" } ``` -If you pulled a new `node` image, the final image would be `ghcr.io/renovatebot/node` instead of `docker.io/renovate/node`. +Now when Renovate pulls a new `sidecar` image, the final image is `ghcr.io/containerbase/sidecar` instead of `docker.io/containerbase/sidecar`. ## dockerUser @@ -709,6 +717,10 @@ Set this to an S3 URI to enable S3 backed repository cache. If you're storing the repository cache on Amazon S3 then you may set a folder hierarchy as part of `repositoryCacheType`. For example, `repositoryCacheType: 's3://bucket-name/dir1/.../dirN/'`. + +!!! note + S3 repository is used as a repository cache (e.g. extracted dependencies) and not a lookup cache (e.g. available versions of dependencies). To keep the later remotely, define [Redis URL](#redisurl). + ## requireConfig By default, Renovate needs a Renovate config file in each repository where it runs before it will propose any dependency updates. diff --git a/docs/usage/self-hosted-experimental.md b/docs/usage/self-hosted-experimental.md index 3b0cfb6d780d30..563757351086fa 100644 --- a/docs/usage/self-hosted-experimental.md +++ b/docs/usage/self-hosted-experimental.md @@ -1,11 +1,11 @@ # Self-hosted experimental environment variables -The following environment variables are "experimental" because: +The following environment variables are "experimental" because they: -- They are not commonly needed -- They are typically an effort to work around some other service's or platform's problem -- They can be removed at any time -- They are variables for Renovate's internal use to validate they work as intended +- are not commonly needed +- are typically an effort to work around some other service's or platform's problem +- can be removed at any time +- are variables for Renovate's internal use to validate they work as intended Experimental variables which are commonly used and for which there is no external solution in sight can be converted to an official configuration option by the Renovate bot developers. @@ -38,9 +38,9 @@ If set to any string, Renovate will use this as the `user-agent` it sends with H ## `RENOVATE_X_HARD_EXIT` If set to any value, Renovate will use a "hard" `process.exit()` once all work is done, even if a sub-process is otherwise delaying Node.js from exiting. -See for background on why this was created. +See [issue 8660](https://github.com/renovatebot/renovate/issues/8660) for background on why this was created. -## RENOVATE_X_IGNORE_NODE_WARN +## `RENOVATE_X_IGNORE_NODE_WARN` Suppress the default warning when a deprecated version of Node.js is used to run Renovate. @@ -53,15 +53,15 @@ Read [platform details](modules/platform/gitlab/index.md) to learn why we need t ## `RENOVATE_X_S3_ENDPOINT` -If set, Renovate will use this string as the `endpoint` when instantiating the AWS s3 client. +If set, Renovate will use this string as the `endpoint` when instantiating the AWS S3 client. ## `RENOVATE_X_S3_PATH_STYLE` -If set, Renovate will enable `forcePathStyle` when instantiating the AWS s3 client. +If set, Renovate will enable `forcePathStyle` when instantiating the AWS S3 client. -> Whether to force path style URLs for S3 objects (e.g., `https://s3.amazonaws.com//` instead of `https://.s3.amazonaws.com/` +> Whether to force path style URLs for S3 objects (e.g., `https://s3.amazonaws.com//` instead of `https://.s3.amazonaws.com/`) -Source: [AWS s3 documentation - Interface BucketEndpointInputConfig](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/interfaces/bucketendpointinputconfig.html) +Source: [AWS S3 documentation - Interface BucketEndpointInputConfig](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/interfaces/bucketendpointinputconfig.html) ## `RENOVATE_X_EXEC_GPID_HANDLE` @@ -69,7 +69,17 @@ If set, Renovate will terminate the whole process group of a terminated child pr ## `RENOVATE_X_MATCH_PACKAGE_NAMES_MORE` -If set, Renovate will try to match against `packageName` after trying `depName` When using `matchPackageNames` & `matchPackagePatterns` matchers. +If set, you'll get the following behavior. + +When using `matchPackageNames` and `matchPackagePatterns` matchers: + +1. Renovate first tries to match against `depName` +2. If `depName` doesn't match then Renovate tries to match against `packageName` + +## `RENOVATE_X_MERGE_CONFIDENCE_API_BASE_URL` + +If set, Renovate will query this API for Merge Confidence data. +This feature is in private beta. ## `RENOVATE_X_AUTODISCOVER_REPO_SORT` diff --git a/lib/config/__snapshots__/migration.spec.ts.snap b/lib/config/__snapshots__/migration.spec.ts.snap index fdf32c597a036c..572cc3bbdb1787 100644 --- a/lib/config/__snapshots__/migration.spec.ts.snap +++ b/lib/config/__snapshots__/migration.spec.ts.snap @@ -131,6 +131,7 @@ exports[`config/migration migrateConfig(config, parentConfig) migrates config 1` "config:js-lib", ":dependencyDashboard", ], + "forkProcessing": "enabled", "hostRules": [ { "hostType": "docker", @@ -142,7 +143,6 @@ exports[`config/migration migrateConfig(config, parentConfig) migrates config 1` "ignorePaths": [ "node_modules/", ], - "includeForks": true, "lockFileMaintenance": { "automerge": true, "exposeAllEnv": false, diff --git a/lib/config/decrypt.ts b/lib/config/decrypt.ts index 65099de4aaabf9..660965fc388a12 100644 --- a/lib/config/decrypt.ts +++ b/lib/config/decrypt.ts @@ -6,6 +6,7 @@ import { maskToken } from '../util/mask'; import { regEx } from '../util/regex'; import { addSecretForSanitizing } from '../util/sanitize'; import { GlobalConfig } from './global'; +import { DecryptedObject } from './schema'; import type { RenovateConfig } from './types'; export async function tryDecryptPgp( @@ -92,8 +93,17 @@ export async function tryDecrypt( const decryptedObjStr = await tryDecryptPgp(privateKey, encryptedStr); if (decryptedObjStr) { try { - const decryptedObj = JSON.parse(decryptedObjStr); - const { o: org, r: repo, v: value } = decryptedObj; + const decryptedObj = DecryptedObject.safeParse( + JSON.parse(decryptedObjStr) + ); + // istanbul ignore if + if (!decryptedObj.success) { + const error = new Error('config-validation'); + error.validationError = `Could not parse decrypted config.`; + throw error; + } + + const { o: org, r: repo, v: value } = decryptedObj.data; if (is.nonEmptyString(value)) { if (is.nonEmptyString(org)) { const orgName = org.replace(regEx(/\/$/), ''); // Strip trailing slash diff --git a/lib/config/migrate-validate.spec.ts b/lib/config/migrate-validate.spec.ts index ff6744efd614b8..e64b707b59ecaf 100644 --- a/lib/config/migrate-validate.spec.ts +++ b/lib/config/migrate-validate.spec.ts @@ -37,7 +37,7 @@ describe('config/migrate-validate', () => { it('isOnboarded', async () => { const input: RenovateConfig = {}; const res = await migrateAndValidate( - { ...config, repoIsOnboarded: true, warnings: undefined }, + { ...config, repoIsOnboarded: true }, input ); expect(res.warnings).toBeUndefined(); diff --git a/lib/config/migrations/custom/base-branch-migration.ts b/lib/config/migrations/custom/base-branch-migration.ts index 468bbd8083db59..3a1e0494d3b50c 100644 --- a/lib/config/migrations/custom/base-branch-migration.ts +++ b/lib/config/migrations/custom/base-branch-migration.ts @@ -1,3 +1,4 @@ +import is from '@sindresorhus/is'; import { AbstractMigration } from '../base/abstract-migration'; export class BaseBranchMigration extends AbstractMigration { @@ -5,6 +6,11 @@ export class BaseBranchMigration extends AbstractMigration { override readonly propertyName = 'baseBranch'; override run(value: unknown): void { - this.setSafely('baseBranches', Array.isArray(value) ? value : [value]); + if (is.array(value)) { + this.setSafely('baseBranches', value); + } + if (is.string(value)) { + this.setSafely('baseBranches', [value]); + } } } diff --git a/lib/config/migrations/custom/include-forks-migration.spec.ts b/lib/config/migrations/custom/include-forks-migration.spec.ts new file mode 100644 index 00000000000000..03de829b977e62 --- /dev/null +++ b/lib/config/migrations/custom/include-forks-migration.spec.ts @@ -0,0 +1,34 @@ +import { IncludeForksMigration } from './include-forks-migration'; + +describe('config/migrations/custom/include-forks-migration', () => { + it('should migrate true', () => { + expect(IncludeForksMigration).toMigrate( + { + includeForks: true, + }, + { + forkProcessing: 'enabled', + } + ); + }); + + it('should migrate false', () => { + expect(IncludeForksMigration).toMigrate( + { + includeForks: false, + }, + { + forkProcessing: 'disabled', + } + ); + }); + + it('should not migrate non boolean value', () => { + expect(IncludeForksMigration).toMigrate( + { + includeForks: 'test', + }, + {} + ); + }); +}); diff --git a/lib/config/migrations/custom/include-forks-migration.ts b/lib/config/migrations/custom/include-forks-migration.ts new file mode 100644 index 00000000000000..675d0ff98953d8 --- /dev/null +++ b/lib/config/migrations/custom/include-forks-migration.ts @@ -0,0 +1,13 @@ +import is from '@sindresorhus/is'; +import { AbstractMigration } from '../base/abstract-migration'; + +export class IncludeForksMigration extends AbstractMigration { + override readonly deprecated = true; + override readonly propertyName = 'includeForks'; + + override run(value: unknown): void { + if (is.boolean(value)) { + this.setSafely('forkProcessing', value ? 'enabled' : 'disabled'); + } + } +} diff --git a/lib/config/migrations/custom/packages-migration.ts b/lib/config/migrations/custom/packages-migration.ts index b26d1bdbb842c8..8580b1e5f976f2 100644 --- a/lib/config/migrations/custom/packages-migration.ts +++ b/lib/config/migrations/custom/packages-migration.ts @@ -1,3 +1,5 @@ +import is from '@sindresorhus/is'; +import type { PackageRule } from '../../types'; import { AbstractMigration } from '../base/abstract-migration'; export class PackagesMigration extends AbstractMigration { @@ -7,8 +9,8 @@ export class PackagesMigration extends AbstractMigration { override run(value: unknown): void { const packageRules = this.get('packageRules'); - let newPackageRules = Array.isArray(packageRules) ? packageRules : []; - if (Array.isArray(value)) { + let newPackageRules = is.array(packageRules) ? packageRules : []; + if (is.array(value)) { newPackageRules = newPackageRules.concat(value); } this.setHard('packageRules', newPackageRules); diff --git a/lib/config/migrations/custom/path-rules-migration.ts b/lib/config/migrations/custom/path-rules-migration.ts index 1aaff3d89f44b1..a49b149c99f9a2 100644 --- a/lib/config/migrations/custom/path-rules-migration.ts +++ b/lib/config/migrations/custom/path-rules-migration.ts @@ -1,3 +1,5 @@ +import is from '@sindresorhus/is'; +import type { PackageRule } from '../../types'; import { AbstractMigration } from '../base/abstract-migration'; export class PathRulesMigration extends AbstractMigration { @@ -7,10 +9,10 @@ export class PathRulesMigration extends AbstractMigration { override run(value: unknown): void { const packageRules = this.get('packageRules'); - if (Array.isArray(value)) { + if (is.array(value)) { this.setHard( 'packageRules', - Array.isArray(packageRules) ? packageRules.concat(value) : value + is.array(packageRules) ? packageRules.concat(value) : value ); } } diff --git a/lib/config/migrations/custom/renovate-fork-migration.spec.ts b/lib/config/migrations/custom/renovate-fork-migration.spec.ts index 3e0841ebbce4ad..daa11f1885918c 100644 --- a/lib/config/migrations/custom/renovate-fork-migration.spec.ts +++ b/lib/config/migrations/custom/renovate-fork-migration.spec.ts @@ -7,7 +7,7 @@ describe('config/migrations/custom/renovate-fork-migration', () => { renovateFork: true, }, { - includeForks: true, + forkProcessing: 'enabled', } ); }); @@ -18,7 +18,7 @@ describe('config/migrations/custom/renovate-fork-migration', () => { renovateFork: false, }, { - includeForks: false, + forkProcessing: 'disabled', } ); }); diff --git a/lib/config/migrations/custom/renovate-fork-migration.ts b/lib/config/migrations/custom/renovate-fork-migration.ts index 4a2b0d61d9ddfd..071ffdac5f7ea7 100644 --- a/lib/config/migrations/custom/renovate-fork-migration.ts +++ b/lib/config/migrations/custom/renovate-fork-migration.ts @@ -7,7 +7,7 @@ export class RenovateForkMigration extends AbstractMigration { override run(value: unknown): void { if (is.boolean(value)) { - this.setSafely('includeForks', value); + this.setSafely('forkProcessing', value ? 'enabled' : 'disabled'); } } } diff --git a/lib/config/migrations/custom/schedule-migration.ts b/lib/config/migrations/custom/schedule-migration.ts index 3d5bd434ecb082..6ccbb06067b8a5 100644 --- a/lib/config/migrations/custom/schedule-migration.ts +++ b/lib/config/migrations/custom/schedule-migration.ts @@ -13,7 +13,7 @@ export class ScheduleMigration extends AbstractMigration { if (is.string(value)) { schedules = [value]; } - if (Array.isArray(value)) { + if (is.array(value)) { schedules = [...value]; } // split 'and' diff --git a/lib/config/migrations/migrations-service.ts b/lib/config/migrations/migrations-service.ts index fc23f576e39c9d..de172fdd7c391b 100644 --- a/lib/config/migrations/migrations-service.ts +++ b/lib/config/migrations/migrations-service.ts @@ -24,6 +24,7 @@ import { GoModTidyMigration } from './custom/go-mod-tidy-migration'; import { HostRulesMigration } from './custom/host-rules-migration'; import { IgnoreNodeModulesMigration } from './custom/ignore-node-modules-migration'; import { IgnoreNpmrcFileMigration } from './custom/ignore-npmrc-file-migration'; +import { IncludeForksMigration } from './custom/include-forks-migration'; import { MatchDatasourcesMigration } from './custom/match-datasources-migration'; import { MatchStringsMigration } from './custom/match-strings-migration'; import { NodeMigration } from './custom/node-migration'; @@ -111,6 +112,7 @@ export class MigrationsService { HostRulesMigration, IgnoreNodeModulesMigration, IgnoreNpmrcFileMigration, + IncludeForksMigration, MatchStringsMigration, PackageNameMigration, PackagePatternMigration, diff --git a/lib/config/options/index.ts b/lib/config/options/index.ts index a401297e2dafee..e140838639592a 100644 --- a/lib/config/options/index.ts +++ b/lib/config/options/index.ts @@ -217,6 +217,14 @@ const options: RenovateOptions[] = [ cli: false, env: false, }, + { + name: 'constraintsFiltering', + description: 'Perform release filtering based on language constraints.', + type: 'string', + allowedValues: ['none', 'strict'], + cli: false, + default: 'none', + }, { name: 'repositoryCache', description: @@ -340,7 +348,7 @@ const options: RenovateOptions[] = [ description: 'Change this value to override the default Renovate Docker sidecar image name prefix.', type: 'string', - default: 'docker.io/renovate', + default: 'docker.io/containerbase', globalOnly: true, }, { @@ -411,12 +419,13 @@ const options: RenovateOptions[] = [ experimentalIssues: [17633], }, { - name: 'includeForks', + name: 'forkProcessing', description: - 'Whether to process forked repositories. By default, all forked repositories are skipped.', + 'Whether to process forked repositories. By default, all forked repositories are skipped when in autodiscover mode.', stage: 'repository', - type: 'boolean', - default: false, + type: 'string', + allowedValues: ['auto', 'enabled', 'disabled'], + default: 'auto', }, { name: 'forkToken', @@ -954,7 +963,7 @@ const options: RenovateOptions[] = [ { name: 'matchBaseBranches', description: - 'List of strings containing exact matches (e.g. `["main"]`) and/or regex expressions (e.g. `["/^release\\/.*/"]`). Valid only within a `packageRules` object.', + 'List of strings containing exact matches (e.g. `["main"]`) and/or regex expressions (e.g. `["/^release/.*/"]`). Valid only within a `packageRules` object.', type: 'array', subType: 'string', allowString: true, @@ -1188,6 +1197,13 @@ const options: RenovateOptions[] = [ cli: false, env: false, }, + { + name: 'autoReplaceGlobalMatch', + description: + 'Control whether replacement regular expressions are global matches or only the first match.', + type: 'boolean', + default: true, + }, { name: 'replacementName', description: @@ -1198,6 +1214,16 @@ const options: RenovateOptions[] = [ cli: false, env: false, }, + { + name: 'replacementNameTemplate', + description: 'Controls what the replacement package name.', + type: 'string', + default: '{{{packageName}}}', + stage: 'package', + parent: 'packageRules', + cli: false, + env: false, + }, { name: 'replacementVersion', description: @@ -1208,6 +1234,21 @@ const options: RenovateOptions[] = [ cli: false, env: false, }, + { + name: 'matchConfidence', + description: + 'Merge confidence levels to match against (`low`, `neutral`, `high`, `very high`). Valid only within `packageRules` object.', + type: 'array', + subType: 'string', + allowedValues: ['low', 'neutral', 'high', 'very high'], + allowString: true, + stage: 'package', + parent: 'packageRules', + mergeable: true, + cli: false, + env: false, + experimental: true, + }, { name: 'matchUpdateTypes', description: @@ -1224,6 +1265,7 @@ const options: RenovateOptions[] = [ 'lockFileMaintenance', 'rollback', 'bump', + 'replacement', ], allowString: true, stage: 'package', @@ -1335,7 +1377,7 @@ const options: RenovateOptions[] = [ name: 'rangeStrategy', description: 'Determines how to modify or update existing ranges.', type: 'string', - default: 'replace', + default: 'auto', allowedValues: [ 'auto', 'pin', @@ -1538,6 +1580,13 @@ const options: RenovateOptions[] = [ type: 'integer', default: 0, }, + { + name: 'internalChecksAsSuccess', + description: + 'Whether to consider passing internal checks such as stabilityDays when determining branch status.', + type: 'boolean', + default: false, + }, /* * Undocumented experimental feature { @@ -1572,16 +1621,16 @@ const options: RenovateOptions[] = [ { name: 'prHourlyLimit', description: - 'Rate limit PRs to maximum x created per hour. 0 (default) means no limit.', + 'Rate limit PRs to maximum x created per hour. 0 means no limit.', type: 'integer', - default: 0, // no limit + default: 2, }, { name: 'prConcurrentLimit', description: - 'Limit to a maximum of x concurrent branches/PRs. 0 (default) means no limit.', + 'Limit to a maximum of x concurrent branches/PRs. 0 means no limit.', type: 'integer', - default: 0, // no limit + default: 10, }, { name: 'branchConcurrentLimit', @@ -1606,6 +1655,14 @@ const options: RenovateOptions[] = [ default: true, supportedPlatforms: ['bitbucket', 'bitbucket-server'], }, + { + name: 'bbUseDevelopmentBranch', + description: `Use the repository's [development branch](https://support.atlassian.com/bitbucket-cloud/docs/branch-a-repository/#The-branching-model) as the repository's default branch.`, + type: 'boolean', + default: false, + supportedPlatforms: ['bitbucket'], + globalOnly: true, + }, // Automatic merging { name: 'automerge', @@ -2249,9 +2306,8 @@ const options: RenovateOptions[] = [ 'Maximum duration in minutes to keep datasource cache entries.', type: 'integer', stage: 'repository', - default: 0, + default: 24 * 60, globalOnly: true, - experimental: true, }, { name: 'prBodyDefinitions', diff --git a/lib/config/presets/common.ts b/lib/config/presets/common.ts index 2f72e59cbc2726..b2ff01c1a9dc82 100644 --- a/lib/config/presets/common.ts +++ b/lib/config/presets/common.ts @@ -1,5 +1,6 @@ export const removedPresets: Record = { - ':autodetectPinVersions': ':autodetectRangeStrategy', + ':autodetectPinVersions': null, + ':autodetectRangeStrategy': null, ':automergeBranchMergeCommit': ':automergeBranch', ':automergeBranchPush': ':automergeBranch', ':base': 'config:base', diff --git a/lib/config/presets/gitea/index.ts b/lib/config/presets/gitea/index.ts index dfc8884396195f..8728cf2027637e 100644 --- a/lib/config/presets/gitea/index.ts +++ b/lib/config/presets/gitea/index.ts @@ -37,7 +37,7 @@ export function getPresetFromEndpoint( filePreset: string, presetPath?: string, endpoint = Endpoint, - tag?: string + tag?: string | undefined ): Promise { return fetchPreset({ repo, diff --git a/lib/config/presets/github/index.ts b/lib/config/presets/github/index.ts index 315c5125942ca8..da087ae1c4582e 100644 --- a/lib/config/presets/github/index.ts +++ b/lib/config/presets/github/index.ts @@ -14,7 +14,7 @@ export async function fetchJSONFile( repo: string, fileName: string, endpoint: string, - tag?: string | null + tag?: string | undefined ): Promise { let ref = ''; if (is.nonEmptyString(tag)) { @@ -42,7 +42,7 @@ export function getPresetFromEndpoint( filePreset: string, presetPath?: string, endpoint = Endpoint, - tag?: string + tag?: string | undefined ): Promise { return fetchPreset({ repo, @@ -58,7 +58,7 @@ export function getPreset({ repo, presetName = 'default', presetPath, - tag = undefined, + tag, }: PresetConfig): Promise { return getPresetFromEndpoint(repo, presetName, presetPath, Endpoint, tag); } diff --git a/lib/config/presets/gitlab/index.ts b/lib/config/presets/gitlab/index.ts index 5c2902fc02796f..b1f4071ccd9923 100644 --- a/lib/config/presets/gitlab/index.ts +++ b/lib/config/presets/gitlab/index.ts @@ -24,7 +24,7 @@ export async function fetchJSONFile( repo: string, fileName: string, endpoint: string, - tag?: string | null + tag?: string | undefined ): Promise { let url = endpoint; let ref = ''; @@ -60,7 +60,7 @@ export function getPresetFromEndpoint( presetName: string, presetPath?: string, endpoint = Endpoint, - tag?: string | null + tag?: string | undefined ): Promise { return fetchPreset({ repo, diff --git a/lib/config/presets/index.spec.ts b/lib/config/presets/index.spec.ts index c7b432a0e52211..b79eccdd7face1 100644 --- a/lib/config/presets/index.spec.ts +++ b/lib/config/presets/index.spec.ts @@ -839,11 +839,9 @@ describe('config/presets/index', () => { ':dependencyDashboard', ':semanticPrefixFixDepsChoreOthers', ':ignoreModulesAndTests', - ':autodetectRangeStrategy', - ':prHourlyLimit2', - ':prConcurrentLimit10', 'group:monorepos', 'group:recommended', + 'replacements:all', 'workarounds:all', ], }); diff --git a/lib/config/presets/internal/auto-generate-replacements.ts b/lib/config/presets/internal/auto-generate-replacements.ts index b904b6bcb0c44b..83b07c015bb985 100644 --- a/lib/config/presets/internal/auto-generate-replacements.ts +++ b/lib/config/presets/internal/auto-generate-replacements.ts @@ -4,10 +4,10 @@ import type { Preset } from '../types'; export type Replacement = [string[], string]; export interface ReplacementRule { - matchCurrentVersion: string; + matchCurrentVersion?: string; matchDatasources: string[]; replacements: Replacement[]; - replacementVersion: string; + replacementVersion?: string; } export interface PresetTemplate { diff --git a/lib/config/presets/internal/config.ts b/lib/config/presets/internal/config.ts index 044b55753753a4..451cedb40098ef 100644 --- a/lib/config/presets/internal/config.ts +++ b/lib/config/presets/internal/config.ts @@ -9,11 +9,9 @@ export const presets: Record = { ':dependencyDashboard', ':semanticPrefixFixDepsChoreOthers', ':ignoreModulesAndTests', - ':autodetectRangeStrategy', - ':prHourlyLimit2', - ':prConcurrentLimit10', 'group:monorepos', 'group:recommended', + 'replacements:all', 'workarounds:all', ], }, diff --git a/lib/config/presets/internal/default.ts b/lib/config/presets/internal/default.ts index 0d1daebcef4033..8cef075470f4a3 100644 --- a/lib/config/presets/internal/default.ts +++ b/lib/config/presets/internal/default.ts @@ -10,10 +10,6 @@ export const presets: Record = { assignees: ['{{arg0}}'], description: 'Assign PRs to `{{arg0}}`.', }, - autodetectRangeStrategy: { - description: 'Automatically detect the best rangeStrategy to use.', - rangeStrategy: 'auto', - }, automergeAll: { automerge: true, description: diff --git a/lib/config/presets/internal/group.ts b/lib/config/presets/internal/group.ts index 18a9bf8d2f68f8..4e4d71da789ad3 100644 --- a/lib/config/presets/internal/group.ts +++ b/lib/config/presets/internal/group.ts @@ -314,7 +314,7 @@ const staticGroups = { { groupName: 'PHPStan packages', matchDatasources: ['packagist'], - matchPackagePatterns: ['^phpstan\\/phpstan$', '\\/phpstan-'], + matchPackagePatterns: ['^phpstan/phpstan$', '/phpstan-'], }, ], }, diff --git a/lib/config/presets/internal/monorepo.ts b/lib/config/presets/internal/monorepo.ts index a471cdfbce0ce7..6cb890ae466752 100644 --- a/lib/config/presets/internal/monorepo.ts +++ b/lib/config/presets/internal/monorepo.ts @@ -96,6 +96,7 @@ const repoGroups = { formatjs: 'https://github.com/formatjs/formatjs', framework7: 'https://github.com/framework7io/framework7', gatsby: 'https://github.com/gatsbyjs/gatsby', + gitbeaker: 'https://github.com/jdalrymple/gitbeaker', grafana: 'https://github.com/grafana/grafana', 'graphql-mesh': 'https://github.com/Urigo/graphql-mesh', 'graphql-modules': 'https://github.com/Urigo/graphql-modules', @@ -270,7 +271,7 @@ const patternGroups = { clarity: ['^@cds/', '^@clr/'], embroider: '^@embroider/', fullcalendar: '^@fullcalendar/', - spfx: ['^@microsoft\\/sp-', '^@microsoft\\/eslint-.+-spfx$'], + spfx: ['^@microsoft/sp-', '^@microsoft/eslint-.+-spfx$'], spock: '^org\\.spockframework:spock-', 'syncfusion-dotnet': '^Syncfusion\\.', wordpress: '^@wordpress/', diff --git a/lib/config/presets/internal/replacements.ts b/lib/config/presets/internal/replacements.ts index c8f288b76e0bb9..207c4c94d783d9 100644 --- a/lib/config/presets/internal/replacements.ts +++ b/lib/config/presets/internal/replacements.ts @@ -1,3 +1,5 @@ +import { z } from 'zod'; +import dataFiles from '../../../data-files.generated'; import type { Preset } from '../types'; import { PresetTemplate, @@ -12,12 +14,14 @@ export const presets: Record = { extends: [ 'replacements:apollo-server-to-scoped', 'replacements:babel-eslint-to-eslint-parser', + 'replacements:containerbase', 'replacements:cucumber-to-scoped', 'replacements:fastify-to-scoped', 'replacements:hapi-to-scoped', 'replacements:jade-to-pug', 'replacements:joi-to-scoped', 'replacements:joi-to-unscoped', + 'replacements:k8s-registry-move', 'replacements:middie-to-scoped', 'replacements:now-to-vercel', 'replacements:parcel-css-to-lightningcss', @@ -32,7 +36,7 @@ export const presets: Record = { ], }, 'apollo-server-to-scoped': { - description: '`apollo-server` packages became scoped', + description: '`apollo-server` packages became scoped.', packageRules: [ { matchCurrentVersion: '>=3.10.3', @@ -101,6 +105,39 @@ export const presets: Record = { }, ], }, + containerbase: { + description: 'Replace containerbase dependencies.', + packageRules: [ + { + description: + 'Replace `containerbase/buildpack` with `containerbase/base`.', + matchDatasources: ['docker'], + matchPackageNames: ['containerbase/buildpack'], + replacementName: 'containerbase/base', + }, + { + description: + 'Replace `docker.io/containerbase/buildpack` with `docker.io/containerbase/base`.', + matchDatasources: ['docker'], + matchPackageNames: ['docker.io/containerbase/buildpack'], + replacementName: 'docker.io/containerbase/base', + }, + { + description: + 'Replace `ghcr.io/containerbase/buildpack` with `ghcr.io/containerbase/base`.', + matchDatasources: ['docker'], + matchPackageNames: ['ghcr.io/containerbase/buildpack'], + replacementName: 'ghcr.io/containerbase/base', + }, + { + description: + 'Replace `renovatebot/internal-tools` with `containerbase/internal-tools`.', + matchDatasources: ['github-tags'], + matchPackageNames: ['renovatebot/internal-tools'], + replacementName: 'containerbase/internal-tools', + }, + ], + }, 'cucumber-to-scoped': { description: '`cucumber` became scoped.', packageRules: [ @@ -113,7 +150,7 @@ export const presets: Record = { ], }, 'fastify-to-scoped': { - description: '`fastify` packages became scoped', + description: '`fastify` packages became scoped.', packageRules: [ { matchCurrentVersion: '>=3.3.0 <4.0.0', @@ -539,7 +576,7 @@ export const presets: Record = { ], }, 'parcel-css-to-lightningcss': { - description: '`@parcel/css` was renamed `lightningcss`.', + description: '`@parcel/css` was renamed to `lightningcss`.', packageRules: [ { matchDatasources: ['npm'], @@ -576,7 +613,7 @@ export const presets: Record = { ], }, 'react-scripts-ts-to-react-scripts': { - description: '`react-scripts` supports typescripts since version 2.1.0.', + description: '`react-scripts` supports TypeScript since version `2.1.0`.', packageRules: [ { matchDatasources: ['npm'], @@ -698,6 +735,26 @@ const mui: PresetTemplate = { title: 'material-ui-to-mui', }; +const K8sImagesSchema = z.array(z.string()); + +const k8sImages = K8sImagesSchema.parse( + JSON.parse(dataFiles.get('data/k8s-images.json')!) +); +const k8Registry: PresetTemplate = { + description: + 'The Kubernetes container registry has changed from `k8s.gcr.io` to `registry.k8s.io`.', + packageRules: [ + { + matchDatasources: ['docker'], + replacements: k8sImages.map((k8sImage) => [ + [`k8s.gcr.io/${k8sImage}`], + `registry.k8s.io/${k8sImage}`, + ]), + }, + ], + title: 'k8s-registry-move', +}; + const messageFormat: PresetTemplate = { description: 'The `messageformat` monorepo package naming scheme changed from `messageFormat-{{package}}`-to-`@messageformat/{{package}}`.', @@ -730,4 +787,4 @@ const messageFormat: PresetTemplate = { title: 'messageFormat-{{package}}-to-@messageformat/{{package}}', }; -addPresets(presets, messageFormat, mui); +addPresets(presets, messageFormat, mui, k8Registry); diff --git a/lib/config/presets/local/common.ts b/lib/config/presets/local/common.ts index 144eada8fa4c44..c22e6f86f3dea1 100644 --- a/lib/config/presets/local/common.ts +++ b/lib/config/presets/local/common.ts @@ -8,7 +8,7 @@ export async function fetchJSONFile( repo: string, fileName: string, _endpoint?: string, - tag?: string | null + tag?: string | undefined ): Promise { let raw: string | null; try { @@ -35,7 +35,7 @@ export function getPresetFromEndpoint( filePreset: string, presetPath: string | undefined, endpoint: string, - tag?: string | null + tag?: string | undefined ): Promise { return fetchPreset({ repo, diff --git a/lib/config/presets/types.ts b/lib/config/presets/types.ts index cc31c2e27ab4a9..943739dafa3388 100644 --- a/lib/config/presets/types.ts +++ b/lib/config/presets/types.ts @@ -5,9 +5,9 @@ export type Preset = RenovateConfig & Record; export type PresetConfig = { repo: string; - presetPath?: string; + presetPath?: string | undefined; presetName?: string; - tag?: string; + tag?: string | undefined; }; export interface PresetApi { @@ -19,24 +19,24 @@ export interface PresetApi { export interface ParsedPreset { presetSource: string; repo: string; - presetPath?: string; + presetPath?: string | undefined; presetName: string; - tag?: string; - params?: string[]; + tag?: string | undefined; + params?: string[] | undefined; } export type PresetFetcher = ( repo: string, fileName: string, endpoint: string, - tag?: string | null + tag?: string | undefined ) => Promise; export type FetchPresetConfig = { repo: string; filePreset: string; - presetPath?: string; + presetPath?: string | undefined; endpoint: string; - tag?: string | null; + tag?: string | undefined; fetch: PresetFetcher; }; diff --git a/lib/config/presets/util.ts b/lib/config/presets/util.ts index 270da8757e5ff7..8d8382e3d55609 100644 --- a/lib/config/presets/util.ts +++ b/lib/config/presets/util.ts @@ -17,7 +17,7 @@ export async function fetchPreset({ filePreset, presetPath, endpoint: _endpoint, - tag = null, + tag, fetch, }: FetchPresetConfig): Promise { // TODO: fix me, can be undefiend #7154 diff --git a/lib/config/schema.ts b/lib/config/schema.ts new file mode 100644 index 00000000000000..7a2661c3690112 --- /dev/null +++ b/lib/config/schema.ts @@ -0,0 +1,7 @@ +import { z } from 'zod'; + +export const DecryptedObject = z.object({ + o: z.string().optional(), + r: z.string().optional(), + v: z.string().optional(), +}); diff --git a/lib/config/types.ts b/lib/config/types.ts index d4572fafb49e74..aedf88d6237cdc 100644 --- a/lib/config/types.ts +++ b/lib/config/types.ts @@ -1,8 +1,8 @@ import type { LogLevel } from 'bunyan'; -import type { Range } from 'semver'; import type { PlatformId } from '../constants'; import type { HostRule } from '../types'; import type { GitNoVerifyOption } from '../util/git/types'; +import type { MergeConfidence } from '../util/merge-confidence/types'; export type RenovateConfigStage = | 'global' @@ -26,6 +26,7 @@ export interface RenovateSharedConfig { $schema?: string; automerge?: boolean; automergeStrategy?: MergeStrategy; + autoReplaceGlobalMatch?: boolean; pruneBranchAfterAutomerge?: boolean; branchPrefix?: string; branchPrefixOld?: string; @@ -34,6 +35,9 @@ export interface RenovateSharedConfig { manager?: string; commitMessage?: string; commitMessagePrefix?: string; + commitMessageTopic?: string; + commitMessageAction?: string; + commitMessageExtra?: string; confidential?: boolean; customChangelogUrl?: string; draftPR?: boolean; @@ -49,6 +53,7 @@ export interface RenovateSharedConfig { ignoreDeps?: string[]; ignorePaths?: string[]; ignoreTests?: boolean; + internalChecksAsSuccess?: boolean; labels?: string[]; addLabels?: string[]; dependencyDashboardApproval?: boolean; @@ -188,6 +193,7 @@ export interface RegExManager extends RegexManagerTemplates { } export type UseBaseBranchConfigType = 'merge' | 'none'; +export type ConstraintsFilter = 'strict' | 'none'; // TODO: Proper typings export interface RenovateConfig @@ -212,7 +218,7 @@ export interface RenovateConfig hostRules?: HostRule[]; ignorePresets?: string[]; - includeForks?: boolean; + forkProcessing?: 'auto' | 'enabled' | 'disabled'; isFork?: boolean; fileList?: string[]; @@ -251,7 +257,9 @@ export interface RenovateConfig secrets?: Record; constraints?: Record; - skipInstalls?: boolean; + skipInstalls?: boolean | null; + + constraintsFiltering?: ConstraintsFilter; } export interface AllConfig @@ -317,10 +325,11 @@ export interface PackageRule excludePackagePatterns?: string[]; excludePackagePrefixes?: string[]; matchCurrentValue?: string; - matchCurrentVersion?: string | Range; + matchCurrentVersion?: string; matchSourceUrlPrefixes?: string[]; matchSourceUrls?: string[]; matchUpdateTypes?: UpdateType[]; + matchConfidence?: MergeConfidence[]; registryUrls?: string[] | null; } @@ -451,6 +460,7 @@ export interface PackageRuleInputConfig extends Record { currentVersion?: string; lockedVersion?: string; updateType?: UpdateType; + mergeConfidenceLevel?: MergeConfidence | undefined; isBump?: boolean; sourceUrl?: string | null; language?: string; diff --git a/lib/config/validation.ts b/lib/config/validation.ts index 52d7e9a1deda0a..f5c7b59c5c5657 100644 --- a/lib/config/validation.ts +++ b/lib/config/validation.ts @@ -333,6 +333,7 @@ export async function validateConfig( 'matchSourceUrlPrefixes', 'matchSourceUrls', 'matchUpdateTypes', + 'matchConfidence', ]; if (key === 'packageRules') { for (const [subIndex, packageRule] of val.entries()) { diff --git a/lib/constants/platform.spec.ts b/lib/constants/platform.spec.ts index b663bd5db70cc5..d17b855807bc2b 100644 --- a/lib/constants/platform.spec.ts +++ b/lib/constants/platform.spec.ts @@ -1,4 +1,4 @@ -import { BitBucketTagsDatasource } from '../modules/datasource/bitbucket-tags'; +import { BitbucketTagsDatasource } from '../modules/datasource/bitbucket-tags'; import { GithubReleasesDatasource } from '../modules/datasource/github-releases'; import { GithubTagsDatasource } from '../modules/datasource/github-tags'; import { GitlabPackagesDatasource } from '../modules/datasource/gitlab-packages'; @@ -58,7 +58,7 @@ describe('constants/platform', () => { it('should be part of the BITBUCKET_API_USING_HOST_TYPES ', () => { expect( - BITBUCKET_API_USING_HOST_TYPES.includes(BitBucketTagsDatasource.id) + BITBUCKET_API_USING_HOST_TYPES.includes(BitbucketTagsDatasource.id) ).toBeTrue(); expect(BITBUCKET_API_USING_HOST_TYPES.includes('bitbucket')).toBeTrue(); }); diff --git a/lib/instrumentation/__snapshots__/index.spec.ts.snap b/lib/instrumentation/__snapshots__/index.spec.ts.snap index 385b530d449f37..ca711e00ae88cc 100644 --- a/lib/instrumentation/__snapshots__/index.spec.ts.snap +++ b/lib/instrumentation/__snapshots__/index.spec.ts.snap @@ -15,6 +15,7 @@ MultiSpanProcessor { "_isCalled": false, "_that": [Circular], }, + "_unresolvedExports": Set {}, }, ], } @@ -35,8 +36,10 @@ MultiSpanProcessor { "_isCalled": false, "_that": [Circular], }, + "_unresolvedExports": Set {}, }, BatchSpanProcessor { + "_droppedSpansCount": 0, "_exportTimeoutMillis": 30000, "_exporter": OTLPTraceExporter { "DEFAULT_HEADERS": {}, @@ -82,6 +85,7 @@ exports[`instrumentation/index activate remote logger 1`] = ` MultiSpanProcessor { "_spanProcessors": [ BatchSpanProcessor { + "_droppedSpansCount": 0, "_exportTimeoutMillis": 30000, "_exporter": OTLPTraceExporter { "DEFAULT_HEADERS": {}, diff --git a/lib/instrumentation/decorator.ts b/lib/instrumentation/decorator.ts index 39f1d365a84e39..30f8ce6de1f4bf 100644 --- a/lib/instrumentation/decorator.ts +++ b/lib/instrumentation/decorator.ts @@ -1,3 +1,4 @@ +import { SpanKind } from '@opentelemetry/api'; import { Decorator, decorate } from '../util/decorator'; import type { SpanParameters } from './types'; import { instrument as instrumentFunc } from '.'; @@ -9,7 +10,7 @@ export function instrument({ name, attributes, ignoreParentSpan, - kind, + kind = SpanKind.INTERNAL, }: SpanParameters): Decorator { return decorate(async ({ callback }) => { return await instrumentFunc(name, callback, { diff --git a/lib/instrumentation/types.ts b/lib/instrumentation/types.ts index 8b312d03d754d2..a753ecb56d1436 100644 --- a/lib/instrumentation/types.ts +++ b/lib/instrumentation/types.ts @@ -12,7 +12,7 @@ export interface SpanParameters { /** * Attributes which should be added to the span */ - attributes?: Attributes; + attributes?: Attributes | undefined; /** * Should this span be added to the root span or to the current active span diff --git a/lib/modules/datasource/api.ts b/lib/modules/datasource/api.ts index c61d696bfa18ff..48ffd8c4c97cf0 100644 --- a/lib/modules/datasource/api.ts +++ b/lib/modules/datasource/api.ts @@ -1,8 +1,9 @@ import { ArtifactoryDatasource } from './artifactory'; import { AwsMachineImageDataSource } from './aws-machine-image'; import { AwsRdsDataSource } from './aws-rds'; +import { AzureBicepResourceDatasource } from './azure-bicep-resource'; import { AzurePipelinesTasksDatasource } from './azure-pipelines-tasks'; -import { BitBucketTagsDatasource } from './bitbucket-tags'; +import { BitbucketTagsDatasource } from './bitbucket-tags'; import { CdnJsDatasource } from './cdnjs'; import { ClojureDatasource } from './clojure'; import { ConanDatasource } from './conan'; @@ -19,6 +20,7 @@ import { GalaxyDatasource } from './galaxy'; import { GalaxyCollectionDatasource } from './galaxy-collection'; import { GitRefsDatasource } from './git-refs'; import { GitTagsDatasource } from './git-tags'; +import { GithubReleaseAttachmentsDatasource } from './github-release-attachments'; import { GithubReleasesDatasource } from './github-releases'; import { GithubTagsDatasource } from './github-tags'; import { GitlabPackagesDatasource } from './gitlab-packages'; @@ -58,8 +60,9 @@ export default api; api.set(ArtifactoryDatasource.id, new ArtifactoryDatasource()); api.set(AwsMachineImageDataSource.id, new AwsMachineImageDataSource()); api.set(AwsRdsDataSource.id, new AwsRdsDataSource()); +api.set(AzureBicepResourceDatasource.id, new AzureBicepResourceDatasource()); api.set(AzurePipelinesTasksDatasource.id, new AzurePipelinesTasksDatasource()); -api.set(BitBucketTagsDatasource.id, new BitBucketTagsDatasource()); +api.set(BitbucketTagsDatasource.id, new BitbucketTagsDatasource()); api.set(CdnJsDatasource.id, new CdnJsDatasource()); api.set(ClojureDatasource.id, new ClojureDatasource()); api.set(ConanDatasource.id, new ConanDatasource()); @@ -76,6 +79,10 @@ api.set(GalaxyDatasource.id, new GalaxyDatasource()); api.set(GalaxyCollectionDatasource.id, new GalaxyCollectionDatasource()); api.set(GitRefsDatasource.id, new GitRefsDatasource()); api.set(GitTagsDatasource.id, new GitTagsDatasource()); +api.set( + GithubReleaseAttachmentsDatasource.id, + new GithubReleaseAttachmentsDatasource() +); api.set(GithubReleasesDatasource.id, new GithubReleasesDatasource()); api.set(GithubTagsDatasource.id, new GithubTagsDatasource()); api.set(GitlabPackagesDatasource.id, new GitlabPackagesDatasource()); diff --git a/lib/modules/datasource/artifactory/index.spec.ts b/lib/modules/datasource/artifactory/index.spec.ts index e0d6c1b9499e43..d84c402ef52403 100644 --- a/lib/modules/datasource/artifactory/index.spec.ts +++ b/lib/modules/datasource/artifactory/index.spec.ts @@ -12,7 +12,7 @@ const testRegistryUrl = 'https://jfrog.company.com/artifactory'; const testLookupName = 'project'; const testConfig = { registryUrls: [testRegistryUrl], - depName: testLookupName, + packageName: testLookupName, }; const fixtureReleasesAsFolders = Fixtures.get('releases-as-folders.html'); const fixtureReleasesAsFiles = Fixtures.get('releases-as-files.html'); @@ -70,7 +70,6 @@ describe('modules/datasource/artifactory/index', () => { .reply(200, '\n

Header

\n1.3.0\n'); const res = await getPkgReleases({ registryUrls: [testRegistryUrl, secondRegistryUrl], - depName: testLookupName, datasource, packageName: testLookupName, }); @@ -81,7 +80,6 @@ describe('modules/datasource/artifactory/index', () => { it('returns null without registryUrl + warning', async () => { const res = await getPkgReleases({ datasource, - depName: testLookupName, packageName: testLookupName, }); expect(logger.warn).toHaveBeenCalledTimes(1); diff --git a/lib/modules/datasource/artifactory/readme.md b/lib/modules/datasource/artifactory/readme.md index 87b5342d66e82e..bebfc586c407bb 100644 --- a/lib/modules/datasource/artifactory/readme.md +++ b/lib/modules/datasource/artifactory/readme.md @@ -2,6 +2,6 @@ Artifactory is the recommended registry for Conan packages. This datasource returns releases from given custom `registryUrl`(s). -The target URL is composed by the `registryUrl` and the `packageName`, which defaults to `depName` when `packageName` is not defined. +The target URL is composed by the `registryUrl` and the `packageName`. The release timestamp is taken from the date in the directory listing, and is assumed to be in UTC time. diff --git a/lib/modules/datasource/aws-machine-image/index.spec.ts b/lib/modules/datasource/aws-machine-image/index.spec.ts index d3bca1ce1417f2..ff8f7aef304409 100644 --- a/lib/modules/datasource/aws-machine-image/index.spec.ts +++ b/lib/modules/datasource/aws-machine-image/index.spec.ts @@ -276,7 +276,7 @@ describe('modules/datasource/aws-machine-image/index', () => { mockDescribeImagesCommand(mockEmpty); const res = await getDigest({ datasource, - depName: + packageName: '[{"Name":"owner-id","Values":["602401143452"]},{"Name":"name","Values":["without newValue, without returned images to be null"]}]', }); expect(res).toBeNull(); @@ -286,7 +286,7 @@ describe('modules/datasource/aws-machine-image/index', () => { mockDescribeImagesCommand(mock1Image); const res = await getDigest({ datasource, - depName: + packageName: '[{"Name":"owner-id","Values":["602401143452"]},{"Name":"name","Values":["without newValue, with one matching image to return that image"]}]', }); expect(res).toStrictEqual(image3.Name); @@ -296,7 +296,7 @@ describe('modules/datasource/aws-machine-image/index', () => { mockDescribeImagesCommand(mock3Images); const res = await getDigest({ datasource, - depName: + packageName: '[{"Name":"owner-id","Values":["602401143452"]},{"Name":"name","Values":["without newValue, with 3 matching image to return the newest image"]}]', }); expect(res).toStrictEqual(image3.Name); @@ -307,7 +307,7 @@ describe('modules/datasource/aws-machine-image/index', () => { const res = await getDigest( { datasource, - depName: + packageName: '[{"Name":"owner-id","Values":["602401143452"]},{"Name":"name","Values":["with matching newValue, with 3 matching image to return the matching image"]}]', }, image1.ImageId @@ -320,7 +320,7 @@ describe('modules/datasource/aws-machine-image/index', () => { const res = await getDigest( { datasource, - depName: + packageName: '[{"Name":"owner-id","Values":["602401143452"]},{"Name":"name","Values":["with not matching newValue, with 3 matching images to return the matching image"]}]', }, 'will never match' @@ -334,7 +334,7 @@ describe('modules/datasource/aws-machine-image/index', () => { mockDescribeImagesCommand(mockEmpty); const res = await getPkgReleases({ datasource, - depName: + packageName: '[{"Name":"owner-id","Values":["602401143452"]},{"Name":"name","Values":["without returned images to be null"]}]', }); expect(res).toBeNull(); @@ -344,7 +344,7 @@ describe('modules/datasource/aws-machine-image/index', () => { mockDescribeImagesCommand(mock1Image); const res = await getPkgReleases({ datasource, - depName: + packageName: '[{"Name":"owner-id","Values":["602401143452"]},{"Name":"name","Values":["with one matching image to return that image"]}]', }); expect(res).toStrictEqual({ @@ -363,7 +363,7 @@ describe('modules/datasource/aws-machine-image/index', () => { mockDescribeImagesCommand({ Images: [image2] }); const res = await getPkgReleases({ datasource, - depName: + packageName: '[{"Name":"owner-id","Values":["602401143452"]},{"Name":"name","Values":["with one deprecated matching image to return that image"]}]', }); expect(res).toStrictEqual({ @@ -382,7 +382,7 @@ describe('modules/datasource/aws-machine-image/index', () => { mockDescribeImagesCommand(mock3Images); const res = await getPkgReleases({ datasource, - depName: + packageName: '[{"Name":"owner-id","Values":["602401143452"]},{"Name":"name","Values":["with 3 matching image to return the newest image"]}]', }); expect(res).toStrictEqual({ diff --git a/lib/modules/datasource/aws-rds/index.spec.ts b/lib/modules/datasource/aws-rds/index.spec.ts index fa94db92adcfe6..d0eda95cfac8ff 100644 --- a/lib/modules/datasource/aws-rds/index.spec.ts +++ b/lib/modules/datasource/aws-rds/index.spec.ts @@ -105,7 +105,7 @@ describe('modules/datasource/aws-rds/index', () => { }); const res = await getPkgReleases({ datasource: AwsRdsDataSource.id, - depName: '[{"Name":"engine","Values":["mysql"]}]', + packageName: '[{"Name":"engine","Values":["mysql"]}]', }); expect(res).toBeNull(); }); @@ -117,7 +117,7 @@ describe('modules/datasource/aws-rds/index', () => { }); const res = await getPkgReleases({ datasource: AwsRdsDataSource.id, - depName: '[{"Name":"engine","Values":["mysql"]}]', + packageName: '[{"Name":"engine","Values":["mysql"]}]', }); expect(res).toStrictEqual({ releases: [ @@ -136,7 +136,7 @@ describe('modules/datasource/aws-rds/index', () => { }); const res = await getPkgReleases({ datasource: AwsRdsDataSource.id, - depName: '[{"Name":"engine","Values":["mysql"]}]', + packageName: '[{"Name":"engine","Values":["mysql"]}]', }); expect(res).toStrictEqual({ releases: [ diff --git a/lib/modules/datasource/azure-bicep-resource/index.spec.ts b/lib/modules/datasource/azure-bicep-resource/index.spec.ts new file mode 100644 index 00000000000000..c5b793bcb9509a --- /dev/null +++ b/lib/modules/datasource/azure-bicep-resource/index.spec.ts @@ -0,0 +1,124 @@ +import { codeBlock } from 'common-tags'; +import * as httpMock from '../../../../test/http-mock'; +import { AzureBicepResourceDatasource } from './index'; + +const gitHubHost = 'https://raw.githubusercontent.com'; +const indexPath = '/Azure/bicep-types-az/main/generated/index.json'; + +describe('modules/datasource/azure-bicep-resource/index', () => { + it('should return null when no version is found', async () => { + httpMock + .scope(gitHubHost) + .get(indexPath) + .reply( + 200, + codeBlock` + { + "Resources": {}, + "Functions": {} + } + ` + ); + + const azureBicepResourceDatasource = new AzureBicepResourceDatasource(); + const result = await azureBicepResourceDatasource.getReleases({ + packageName: 'unknown', + }); + + expect(result).toBeNull(); + }); + + it('should return versions when package is a function', async () => { + httpMock + .scope(gitHubHost) + .get(indexPath) + .reply( + 200, + codeBlock` + { + "Resources": {}, + "Functions": { + "microsoft.billing/billingaccounts": { + "2019-10-01-preview": [ + { + "RelativePath": "billing/microsoft.billing/2019-10-01-preview/types.json", + "Index": 307 + } + ], + "2020-05-01": [ + { + "RelativePath": "billing/microsoft.billing/2020-05-01/types.json", + "Index": 287 + } + ] + } + } + } + ` + ); + + const azureBicepResourceDatasource = new AzureBicepResourceDatasource(); + const result = await azureBicepResourceDatasource.getReleases({ + packageName: 'Microsoft.Billing/billingAccounts', + }); + + expect(result).toEqual({ + releases: [ + { + version: '2019-10-01-preview', + changelogUrl: + 'https://learn.microsoft.com/en-us/azure/templates/microsoft.billing/change-log/billingaccounts#2019-10-01-preview', + }, + { + version: '2020-05-01', + changelogUrl: + 'https://learn.microsoft.com/en-us/azure/templates/microsoft.billing/change-log/billingaccounts#2020-05-01', + }, + ], + }); + }); + + it('should return versions when package is a resource', async () => { + httpMock + .scope(gitHubHost) + .get(indexPath) + .reply( + 200, + codeBlock` + { + "Resources": { + "Microsoft.Storage/storageAccounts@2015-05-01-preview": { + "RelativePath": "storage/microsoft.storage/2015-05-01-preview/types.json", + "Index": 31 + }, + "Microsoft.Storage/storageAccounts@2018-02-01": { + "RelativePath": "storage/microsoft.storage/2018-02-01/types.json", + "Index": 85 + } + }, + "Functions": {} + } + ` + ); + + const azureBicepResourceDatasource = new AzureBicepResourceDatasource(); + const result = await azureBicepResourceDatasource.getReleases({ + packageName: 'Microsoft.Storage/storageAccounts', + }); + + expect(result).toEqual({ + releases: [ + { + version: '2015-05-01-preview', + changelogUrl: + 'https://learn.microsoft.com/en-us/azure/templates/microsoft.storage/change-log/storageaccounts#2015-05-01-preview', + }, + { + version: '2018-02-01', + changelogUrl: + 'https://learn.microsoft.com/en-us/azure/templates/microsoft.storage/change-log/storageaccounts#2018-02-01', + }, + ], + }); + }); +}); diff --git a/lib/modules/datasource/azure-bicep-resource/index.ts b/lib/modules/datasource/azure-bicep-resource/index.ts new file mode 100644 index 00000000000000..07c601356d41ec --- /dev/null +++ b/lib/modules/datasource/azure-bicep-resource/index.ts @@ -0,0 +1,88 @@ +import { cache } from '../../../util/cache/package/decorator'; +import * as azureRestApiVersioningApi from '../../versioning/azure-rest-api'; +import { Datasource } from '../datasource'; +import type { GetReleasesConfig, ReleaseResult } from '../types'; +import { BicepTypeIndex } from './schema'; + +const BICEP_TYPES_INDEX_URL = + 'https://raw.githubusercontent.com/Azure/bicep-types-az/main/generated/index.json'; + +export class AzureBicepResourceDatasource extends Datasource { + static readonly id = 'azure-bicep-resource'; + + override readonly defaultConfig = { + commitMessageTopic: 'resource {{depName}}', + commitMessageExtra: 'to {{{newVersion}}}', + prBodyColumns: ['Resource', 'Change'], + prBodyDefinitions: { + Resource: '{{{depNameLinked}}}', + }, + }; + + override readonly defaultVersioning = azureRestApiVersioningApi.id; + + constructor() { + super(AzureBicepResourceDatasource.id); + } + + @cache({ + namespace: `datasource-${AzureBicepResourceDatasource.id}`, + key: ({ packageName }: GetReleasesConfig) => `getReleases-${packageName}`, + }) + async getReleases( + getReleasesConfig: GetReleasesConfig + ): Promise { + const { packageName } = getReleasesConfig; + + const resourceVersionIndex = await this.getResourceVersionIndex(); + const versions = resourceVersionIndex[packageName.toLowerCase()]; + + if (!versions) { + return null; + } + + const firstSlashIndex = packageName.indexOf('/'); + const namespaceProvider = packageName + .slice(0, firstSlashIndex) + .toLowerCase(); + const type = packageName.slice(firstSlashIndex + 1).toLowerCase(); + + return { + releases: versions.map((version) => ({ + version, + changelogUrl: `https://learn.microsoft.com/en-us/azure/templates/${namespaceProvider}/change-log/${type}#${version}`, + })), + }; + } + + @cache({ + namespace: `datasource-${AzureBicepResourceDatasource.id}`, + key: 'getResourceVersionIndex', + ttlMinutes: 24 * 60, + }) + async getResourceVersionIndex(): Promise> { + const res = await this.getBicepTypeIndex(); + + const releaseMap = new Map(); + + for (const resourceReference of Object.keys(res.Resources)) { + const [type, version] = resourceReference.toLowerCase().split('@', 2); + const versions = releaseMap.get(type) ?? []; + versions.push(version); + releaseMap.set(type, versions); + } + + for (const functionResource of Object.entries(res.Functions)) { + const [type, versionMap] = functionResource; + const versions = Object.keys(versionMap); + releaseMap.set(type, versions); + } + + return Object.fromEntries(releaseMap); + } + + private async getBicepTypeIndex(): Promise { + const res = await this.http.getJson(BICEP_TYPES_INDEX_URL, BicepTypeIndex); + return res.body; + } +} diff --git a/lib/modules/datasource/azure-bicep-resource/readme.md b/lib/modules/datasource/azure-bicep-resource/readme.md new file mode 100644 index 00000000000000..b4b0aedabaca41 --- /dev/null +++ b/lib/modules/datasource/azure-bicep-resource/readme.md @@ -0,0 +1 @@ +This data source returns available Bicep resource versions from the official index, which is also used by all Bicep tooling: diff --git a/lib/modules/datasource/azure-bicep-resource/schema.ts b/lib/modules/datasource/azure-bicep-resource/schema.ts new file mode 100644 index 00000000000000..3f229e4c812a4b --- /dev/null +++ b/lib/modules/datasource/azure-bicep-resource/schema.ts @@ -0,0 +1,25 @@ +import { z } from 'zod'; + +export const BicepTypeIndex = z.object({ + Resources: z.record( + z.string(), + z.object({ + RelativePath: z.string(), + Index: z.number(), + }) + ), + Functions: z.record( + z.string(), + z.record( + z.string(), + z.array( + z.object({ + RelativePath: z.string(), + Index: z.number(), + }) + ) + ) + ), +}); + +export type BicepTypeIndex = z.infer; diff --git a/lib/modules/datasource/azure-pipelines-tasks/index.spec.ts b/lib/modules/datasource/azure-pipelines-tasks/index.spec.ts index 4b009a5ae85bfc..75d3b009e7932c 100644 --- a/lib/modules/datasource/azure-pipelines-tasks/index.spec.ts +++ b/lib/modules/datasource/azure-pipelines-tasks/index.spec.ts @@ -6,7 +6,7 @@ describe('modules/datasource/azure-pipelines-tasks/index', () => { expect( await getPkgReleases({ datasource: AzurePipelinesTasksDatasource.id, - depName: 'unknown', + packageName: 'unknown', }) ).toBeNull(); }); @@ -15,7 +15,7 @@ describe('modules/datasource/azure-pipelines-tasks/index', () => { expect( await getPkgReleases({ datasource: AzurePipelinesTasksDatasource.id, - depName: 'AutomatedAnalysis', + packageName: 'AutomatedAnalysis', }) ).toEqual({ releases: [{ version: '0.171.0' }, { version: '0.198.0' }] }); }); @@ -24,7 +24,7 @@ describe('modules/datasource/azure-pipelines-tasks/index', () => { expect( await getPkgReleases({ datasource: AzurePipelinesTasksDatasource.id, - depName: 'AutomatedAnalysis-Marketplace', + packageName: 'AutomatedAnalysis-Marketplace', }) ).toEqual({ releases: [{ version: '0.171.0' }, { version: '0.198.0' }] }); }); @@ -33,7 +33,7 @@ describe('modules/datasource/azure-pipelines-tasks/index', () => { expect( await getPkgReleases({ datasource: AzurePipelinesTasksDatasource.id, - depName: 'automatedanalysis', + packageName: 'automatedanalysis', }) ).toEqual({ releases: [{ version: '0.171.0' }, { version: '0.198.0' }] }); }); diff --git a/lib/modules/datasource/bitbucket-tags/index.spec.ts b/lib/modules/datasource/bitbucket-tags/index.spec.ts index 369f646c3cb170..d2340ea5791070 100644 --- a/lib/modules/datasource/bitbucket-tags/index.spec.ts +++ b/lib/modules/datasource/bitbucket-tags/index.spec.ts @@ -1,8 +1,8 @@ import { getDigest, getPkgReleases } from '..'; import * as httpMock from '../../../../test/http-mock'; -import { BitBucketTagsDatasource } from '.'; +import { BitbucketTagsDatasource } from '.'; -const datasource = BitBucketTagsDatasource.id; +const datasource = BitbucketTagsDatasource.id; describe('modules/datasource/bitbucket-tags/index', () => { describe('getReleases', () => { @@ -32,7 +32,7 @@ describe('modules/datasource/bitbucket-tags/index', () => { .reply(200, body); const res = await getPkgReleases({ datasource, - depName: 'some/dep2', + packageName: 'some/dep2', }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(3); @@ -69,7 +69,7 @@ describe('modules/datasource/bitbucket-tags/index', () => { .reply(200, body); const res = await getDigest({ datasource, - depName: 'some/dep2', + packageName: 'some/dep2', }); expect(res).toMatchSnapshot(); expect(res).toBeString(); @@ -94,7 +94,7 @@ describe('modules/datasource/bitbucket-tags/index', () => { .reply(200, body); const res = await getDigest({ datasource, - depName: 'some/dep2', + packageName: 'some/dep2', }); expect(res).toBeNull(); }); @@ -116,7 +116,7 @@ describe('modules/datasource/bitbucket-tags/index', () => { const res = await getDigest( { datasource, - depName: 'some/dep2', + packageName: 'some/dep2', }, 'v1.0.0' ); diff --git a/lib/modules/datasource/bitbucket-tags/index.ts b/lib/modules/datasource/bitbucket-tags/index.ts index ff5c436bf95b77..10407dce691651 100644 --- a/lib/modules/datasource/bitbucket-tags/index.ts +++ b/lib/modules/datasource/bitbucket-tags/index.ts @@ -7,8 +7,8 @@ import { Datasource } from '../datasource'; import type { DigestConfig, GetReleasesConfig, ReleaseResult } from '../types'; import type { BitbucketCommit, BitbucketTag } from './types'; -export class BitBucketTagsDatasource extends Datasource { - bitbucketHttp = new BitbucketHttp(BitBucketTagsDatasource.id); +export class BitbucketTagsDatasource extends Datasource { + bitbucketHttp = new BitbucketHttp(BitbucketTagsDatasource.id); static readonly id = 'bitbucket-tags'; @@ -18,10 +18,10 @@ export class BitBucketTagsDatasource extends Datasource { static readonly defaultRegistryUrls = ['https://bitbucket.org']; - static readonly cacheNamespace = `datasource-${BitBucketTagsDatasource.id}`; + static readonly cacheNamespace = `datasource-${BitbucketTagsDatasource.id}`; constructor() { - super(BitBucketTagsDatasource.id); + super(BitbucketTagsDatasource.id); } static getRegistryURL(registryUrl?: string): string { @@ -34,22 +34,22 @@ export class BitBucketTagsDatasource extends Datasource { repo: string, type: string ): string { - return `${BitBucketTagsDatasource.getRegistryURL( + return `${BitbucketTagsDatasource.getRegistryURL( registryUrl )}:${repo}:${type}`; } static getSourceUrl(packageName: string, registryUrl?: string): string { - const url = BitBucketTagsDatasource.getRegistryURL(registryUrl); + const url = BitbucketTagsDatasource.getRegistryURL(registryUrl); const normalizedUrl = ensureTrailingSlash(url); return `${normalizedUrl}${packageName}`; } // getReleases fetches list of tags for the repository @cache({ - namespace: BitBucketTagsDatasource.cacheNamespace, + namespace: BitbucketTagsDatasource.cacheNamespace, key: ({ registryUrl, packageName }: GetReleasesConfig) => - BitBucketTagsDatasource.getCacheKey(registryUrl, packageName, 'tags'), + BitbucketTagsDatasource.getCacheKey(registryUrl, packageName, 'tags'), }) async getReleases({ registryUrl, @@ -59,8 +59,8 @@ export class BitBucketTagsDatasource extends Datasource { const bitbucketTags = await utils.accumulateValues(url); const dependency: ReleaseResult = { - sourceUrl: BitBucketTagsDatasource.getSourceUrl(repo, registryUrl), - registryUrl: BitBucketTagsDatasource.getRegistryURL(registryUrl), + sourceUrl: BitbucketTagsDatasource.getSourceUrl(repo, registryUrl), + registryUrl: BitbucketTagsDatasource.getRegistryURL(registryUrl), releases: bitbucketTags.map(({ name, target }) => ({ version: name, gitRef: name, @@ -73,9 +73,9 @@ export class BitBucketTagsDatasource extends Datasource { // getTagCommit fetched the commit has for specified tag @cache({ - namespace: BitBucketTagsDatasource.cacheNamespace, + namespace: BitbucketTagsDatasource.cacheNamespace, key: (registryUrl: string | undefined, repo: string, tag: string): string => - BitBucketTagsDatasource.getCacheKey(registryUrl, repo, `tag-${tag}`), + BitbucketTagsDatasource.getCacheKey(registryUrl, repo, `tag-${tag}`), }) async getTagCommit( _registryUrl: string | undefined, @@ -91,9 +91,9 @@ export class BitBucketTagsDatasource extends Datasource { } @cache({ - namespace: BitBucketTagsDatasource.cacheNamespace, + namespace: BitbucketTagsDatasource.cacheNamespace, key: (registryUrl: string, repo: string) => - BitBucketTagsDatasource.getCacheKey(registryUrl, repo, 'mainbranch'), + BitbucketTagsDatasource.getCacheKey(registryUrl, repo, 'mainbranch'), ttlMinutes: 60, }) async getMainBranch(repo: string): Promise { @@ -107,9 +107,9 @@ export class BitBucketTagsDatasource extends Datasource { // getDigest fetched the latest commit for repository main branch // however, if newValue is provided, then getTagCommit is called @cache({ - namespace: BitBucketTagsDatasource.cacheNamespace, + namespace: BitbucketTagsDatasource.cacheNamespace, key: ({ registryUrl, packageName }: DigestConfig) => - BitBucketTagsDatasource.getCacheKey(registryUrl, packageName, 'digest'), + BitbucketTagsDatasource.getCacheKey(registryUrl, packageName, 'digest'), }) override async getDigest( { packageName: repo, registryUrl }: DigestConfig, diff --git a/lib/modules/datasource/cdnjs/index.spec.ts b/lib/modules/datasource/cdnjs/index.spec.ts index 922777da2e90a2..67b1945a07bfb1 100644 --- a/lib/modules/datasource/cdnjs/index.spec.ts +++ b/lib/modules/datasource/cdnjs/index.spec.ts @@ -18,7 +18,7 @@ describe('modules/datasource/cdnjs/index', () => { await expect( getPkgReleases({ datasource: CdnJsDatasource.id, - depName: 'foo/bar', + packageName: 'foo/bar', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -28,7 +28,7 @@ describe('modules/datasource/cdnjs/index', () => { await expect( getPkgReleases({ datasource: CdnJsDatasource.id, - depName: 'foo/bar', + packageName: 'foo/bar', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -38,7 +38,7 @@ describe('modules/datasource/cdnjs/index', () => { expect( await getPkgReleases({ datasource: CdnJsDatasource.id, - depName: 'foo/bar', + packageName: 'foo/bar', }) ).toBeNull(); }); @@ -51,7 +51,7 @@ describe('modules/datasource/cdnjs/index', () => { expect( await getPkgReleases({ datasource: CdnJsDatasource.id, - depName: 'doesnotexist/doesnotexist', + packageName: 'doesnotexist/doesnotexist', }) ).toBeNull(); }); @@ -61,7 +61,7 @@ describe('modules/datasource/cdnjs/index', () => { await expect( getPkgReleases({ datasource: CdnJsDatasource.id, - depName: 'foo/bar', + packageName: 'foo/bar', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -71,7 +71,7 @@ describe('modules/datasource/cdnjs/index', () => { await expect( getPkgReleases({ datasource: CdnJsDatasource.id, - depName: 'foo/bar', + packageName: 'foo/bar', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -81,7 +81,7 @@ describe('modules/datasource/cdnjs/index', () => { await expect( getPkgReleases({ datasource: CdnJsDatasource.id, - depName: 'foo/bar', + packageName: 'foo/bar', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -91,7 +91,7 @@ describe('modules/datasource/cdnjs/index', () => { await expect( getPkgReleases({ datasource: CdnJsDatasource.id, - depName: 'foo/bar', + packageName: 'foo/bar', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -103,7 +103,7 @@ describe('modules/datasource/cdnjs/index', () => { .reply(200, Fixtures.get('d3-force.json')); const res = await getPkgReleases({ datasource: CdnJsDatasource.id, - depName: 'd3-force/d3-force.js', + packageName: 'd3-force/d3-force.js', }); expect(res).toMatchSnapshot(); }); @@ -115,7 +115,7 @@ describe('modules/datasource/cdnjs/index', () => { .reply(200, Fixtures.get('bulma.json')); const res = await getPkgReleases({ datasource: CdnJsDatasource.id, - depName: 'bulma/only/0.7.5/style.css', + packageName: 'bulma/only/0.7.5/style.css', }); expect(res).toMatchSnapshot(); }); diff --git a/lib/modules/datasource/clojure/index.spec.ts b/lib/modules/datasource/clojure/index.spec.ts index 87b876cb4ef4d7..6e6fef32ebf9e2 100644 --- a/lib/modules/datasource/clojure/index.spec.ts +++ b/lib/modules/datasource/clojure/index.spec.ts @@ -144,10 +144,10 @@ function mockGenericPackage(opts: MockOpts = {}) { } } function get( - depName = 'org.example:package', + packageName = 'org.example:package', ...registryUrls: string[] ): Promise { - const conf = { versioning, datasource: ClojureDatasource.id, depName }; + const conf = { versioning, datasource: ClojureDatasource.id, packageName }; return getPkgReleases(registryUrls ? { ...conf, registryUrls } : conf); } diff --git a/lib/modules/datasource/common.ts b/lib/modules/datasource/common.ts index 69c68360b25a45..f8052e547ba765 100644 --- a/lib/modules/datasource/common.ts +++ b/lib/modules/datasource/common.ts @@ -1,10 +1,15 @@ +import is from '@sindresorhus/is'; import type { GetPkgReleasesConfig } from './types'; export function isGetPkgReleasesConfig( input: unknown ): input is GetPkgReleasesConfig { return ( - (input as GetPkgReleasesConfig).datasource !== undefined && - (input as GetPkgReleasesConfig).depName !== undefined + is.nonEmptyStringAndNotWhitespace( + (input as GetPkgReleasesConfig).datasource + ) && + is.nonEmptyStringAndNotWhitespace( + (input as GetPkgReleasesConfig).packageName + ) ); } diff --git a/lib/modules/datasource/conan/common.ts b/lib/modules/datasource/conan/common.ts index 505aadb2c9669e..4758658f67b437 100644 --- a/lib/modules/datasource/conan/common.ts +++ b/lib/modules/datasource/conan/common.ts @@ -11,7 +11,7 @@ export const conanDatasourceRegex = regEx( ); export function getConanPackage(packageName: string): ConanPackage { - const depName = packageName.split('/')[0]; + const conanName = packageName.split('/')[0]; const userAndChannel = packageName.split('@')[1]; - return { depName, userAndChannel }; + return { conanName, userAndChannel }; } diff --git a/lib/modules/datasource/conan/index.spec.ts b/lib/modules/datasource/conan/index.spec.ts index 68fc393a514315..84c1a98c2fb56b 100644 --- a/lib/modules/datasource/conan/index.spec.ts +++ b/lib/modules/datasource/conan/index.spec.ts @@ -16,14 +16,14 @@ const datasource = ConanDatasource.id; const nonDefaultRegistryUrl = 'https://not.conan.io/'; const config: GetPkgReleasesConfig = { - depName: '', + packageName: '', datasource, versioning: conan.id, registryUrls: [nonDefaultRegistryUrl], }; const digestConfig: GetDigestInputConfig = { - depName: 'fake', + packageName: 'fake', datasource, registryUrls: [nonDefaultRegistryUrl], }; @@ -59,7 +59,6 @@ describe('modules/datasource/conan/index', () => { .scope(nonDefaultRegistryUrl) .get('/v2/conans/search?q=fakepackage') .reply(200); - config.depName = 'fakepackage'; expect( await getPkgReleases({ ...config, @@ -73,7 +72,6 @@ describe('modules/datasource/conan/index', () => { .scope(nonDefaultRegistryUrl) .get('/v2/conans/search?q=fakepackage') .reply(200, {}); - config.depName = 'fakepackage'; expect( await getPkgReleases({ ...config, @@ -88,7 +86,6 @@ describe('modules/datasource/conan/index', () => { .get('/v2/conans/search?q=poco') .reply(404); config.registryUrls = ['https://fake.bintray.com/']; - config.depName = 'poco'; expect( await getPkgReleases({ ...config, @@ -102,7 +99,6 @@ describe('modules/datasource/conan/index', () => { .scope(nonDefaultRegistryUrl) .get('/v2/conans/search?q=fakepackage') .reply(200, fakeJson); - config.depName = 'fakepackage'; expect( await getPkgReleases({ ...config, @@ -116,7 +112,6 @@ describe('modules/datasource/conan/index', () => { .scope(nonDefaultRegistryUrl) .get('/v2/conans/search?q=poco') .reply(200, pocoJson); - config.depName = 'poco'; expect( await getPkgReleases({ ...config, @@ -155,7 +150,6 @@ describe('modules/datasource/conan/index', () => { await getPkgReleases({ ...config, registryUrls: [defaultRegistryUrl], - depName: 'poco', packageName: 'poco/1.2@_/_', }) ).toEqual({ @@ -191,7 +185,6 @@ describe('modules/datasource/conan/index', () => { await getPkgReleases({ ...config, registryUrls: [defaultRegistryUrl], - depName: 'poco', packageName: 'poco/1.2@foo/bar', }) ).toBeNull(); @@ -202,7 +195,7 @@ describe('modules/datasource/conan/index', () => { .scope(nonDefaultRegistryUrl) .get('/v2/conans/search?q=poco') .reply(200, pocoJson); - config.depName = 'poco'; + config.packageName = 'poco'; expect( await getPkgReleases({ ...config, @@ -216,7 +209,7 @@ describe('modules/datasource/conan/index', () => { .scope(nonDefaultRegistryUrl) .get('/v2/conans/search?q=bad') .reply(200, malformedJson); - config.depName = 'bad'; + config.packageName = 'bad'; expect( await getPkgReleases({ ...config, @@ -238,7 +231,7 @@ describe('modules/datasource/conan/index', () => { .get('/v2/conans/search?q=poco') .replyWithError('error'); config.registryUrls = ['https://fake.bintray.com/']; - config.depName = 'poco'; + config.packageName = 'poco'; expect( await getPkgReleases({ ...config, @@ -253,7 +246,7 @@ describe('modules/datasource/conan/index', () => { .get('/v2/conans/search?q=poco') .reply(200, fakeJson); config.registryUrls = ['https://fake.bintray.com']; - config.depName = 'poco'; + config.packageName = 'poco'; expect( await getPkgReleases({ ...config, diff --git a/lib/modules/datasource/conan/index.ts b/lib/modules/datasource/conan/index.ts index 037062c1276140..c77dc6e8126049 100644 --- a/lib/modules/datasource/conan/index.ts +++ b/lib/modules/datasource/conan/index.ts @@ -36,17 +36,17 @@ export class ConanDatasource extends Datasource { } async getConanCenterReleases( - depName: string, + conanName: string, userAndChannel: string ): Promise { if (userAndChannel && userAndChannel !== '@_/_') { logger.debug( - { depName, userAndChannel }, + { conanName, userAndChannel }, 'User/channel not supported for Conan Center lookups' ); return null; } - const url = `https://api.github.com/repos/conan-io/conan-center-index/contents/recipes/${depName}/config.yml`; + const url = `https://api.github.com/repos/conan-io/conan-center-index/contents/recipes/${conanName}/config.yml`; const res = await this.githubHttp.get(url, { headers: { accept: 'application/vnd.github.v3.raw' }, }); @@ -78,7 +78,7 @@ export class ConanDatasource extends Datasource { const revisionLookUp = joinUrlParts( url, 'v2/conans/', - conanPackage.depName, + conanPackage.conanName, newValue, conanPackage.userAndChannel, '/revisions' @@ -102,19 +102,27 @@ export class ConanDatasource extends Datasource { packageName, }: GetReleasesConfig): Promise { const conanPackage = getConanPackage(packageName); - const depName = conanPackage.depName; const userAndChannel = '@' + conanPackage.userAndChannel; if ( is.string(registryUrl) && ensureTrailingSlash(registryUrl) === defaultRegistryUrl ) { - return this.getConanCenterReleases(depName, userAndChannel); + return this.getConanCenterReleases( + conanPackage.conanName, + userAndChannel + ); } - logger.trace({ depName, registryUrl }, 'Looking up conan api dependency'); + logger.trace( + { packageName, registryUrl }, + 'Looking up conan api dependency' + ); if (registryUrl) { const url = ensureTrailingSlash(registryUrl); - const lookupUrl = joinUrlParts(url, `v2/conans/search?q=${depName}`); + const lookupUrl = joinUrlParts( + url, + `v2/conans/search?q=${conanPackage.conanName}` + ); try { const rep = await this.http.getJson(lookupUrl); diff --git a/lib/modules/datasource/conan/types.ts b/lib/modules/datasource/conan/types.ts index 543ff3d6876386..854935c11c2d7b 100644 --- a/lib/modules/datasource/conan/types.ts +++ b/lib/modules/datasource/conan/types.ts @@ -16,6 +16,6 @@ export interface ConanYAML { } export interface ConanPackage { - depName: string; + conanName: string; userAndChannel: string; } diff --git a/lib/modules/datasource/conda/index.spec.ts b/lib/modules/datasource/conda/index.spec.ts index 44235fd2bea0c8..0085c36c69122e 100644 --- a/lib/modules/datasource/conda/index.spec.ts +++ b/lib/modules/datasource/conda/index.spec.ts @@ -5,8 +5,8 @@ import { EXTERNAL_HOST_ERROR } from '../../../constants/error-messages'; import { datasource, defaultRegistryUrl } from './common'; import { CondaDatasource } from './index'; -const depName = 'main/pytest'; -const depUrl = `/${depName}`; +const packageName = 'main/pytest'; +const depUrl = `/${packageName}`; describe('modules/datasource/conda/index', () => { describe('getReleases', () => { @@ -15,7 +15,7 @@ describe('modules/datasource/conda/index', () => { await expect( getPkgReleases({ datasource, - depName, + packageName, }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -25,7 +25,7 @@ describe('modules/datasource/conda/index', () => { expect( await getPkgReleases({ datasource, - depName, + packageName, }) ).toBeNull(); }); @@ -35,7 +35,7 @@ describe('modules/datasource/conda/index', () => { expect( await getPkgReleases({ datasource, - depName, + packageName, }) ).toBeNull(); }); @@ -45,7 +45,7 @@ describe('modules/datasource/conda/index', () => { await expect( getPkgReleases({ datasource, - depName, + packageName, }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -57,7 +57,7 @@ describe('modules/datasource/conda/index', () => { .reply(200, Fixtures.get('pytest.json')); const res = await getPkgReleases({ datasource, - depName, + packageName, }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(94); @@ -67,20 +67,20 @@ describe('modules/datasource/conda/index', () => { const condaDatasource = new CondaDatasource(); const res = await condaDatasource.getReleases({ registryUrl: '', - packageName: depName, + packageName, }); expect(res).toBeNull(); }); it('supports multiple custom datasource urls', async () => { - const depName = 'pytest'; + const packageName = 'pytest'; httpMock .scope('https://api.anaconda.org/package/rapids') - .get(`/${depName}`) + .get(`/${packageName}`) .reply(404); httpMock .scope('https://api.anaconda.org/package/conda-forge') - .get(`/${depName}`) + .get(`/${packageName}`) .reply(200, { html_url: 'http://anaconda.org/anaconda/pytest', dev_url: 'https://github.com/pytest-dev/pytest/', @@ -96,7 +96,7 @@ describe('modules/datasource/conda/index', () => { const res = await getPkgReleases({ ...config, datasource, - depName, + packageName, }); expect(res).toMatchObject({ homepage: 'http://anaconda.org/anaconda/pytest', diff --git a/lib/modules/datasource/cpan/index.spec.ts b/lib/modules/datasource/cpan/index.spec.ts index 1f5f31882c5df3..291da75a49e7e6 100644 --- a/lib/modules/datasource/cpan/index.spec.ts +++ b/lib/modules/datasource/cpan/index.spec.ts @@ -20,7 +20,7 @@ describe('modules/datasource/cpan/index', () => { expect( await getPkgReleases({ datasource: CpanDatasource.id, - depName: 'FooBar', + packageName: 'FooBar', }) ).toBeNull(); }); @@ -30,7 +30,7 @@ describe('modules/datasource/cpan/index', () => { expect( await getPkgReleases({ datasource: CpanDatasource.id, - depName: 'Plack', + packageName: 'Plack', }) ).toBeNull(); }); @@ -40,7 +40,7 @@ describe('modules/datasource/cpan/index', () => { await expect( getPkgReleases({ datasource: CpanDatasource.id, - depName: 'Plack', + packageName: 'Plack', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -50,7 +50,7 @@ describe('modules/datasource/cpan/index', () => { expect( await getPkgReleases({ datasource: CpanDatasource.id, - depName: 'Plack', + packageName: 'Plack', }) ).toBeNull(); }); @@ -66,7 +66,7 @@ describe('modules/datasource/cpan/index', () => { .reply(200, Fixtures.get('Plack.json')); const res = await getPkgReleases({ datasource: CpanDatasource.id, - depName: 'Plack', + packageName: 'Plack', }); expect(res).toMatchObject({ changelogUrl: 'https://metacpan.org/dist/Plack/changes', diff --git a/lib/modules/datasource/crate/index.spec.ts b/lib/modules/datasource/crate/index.spec.ts index c8d0637391734f..4e4e76afbb3d55 100644 --- a/lib/modules/datasource/crate/index.spec.ts +++ b/lib/modules/datasource/crate/index.spec.ts @@ -126,7 +126,7 @@ describe('modules/datasource/crate/index', () => { expect( await getPkgReleases({ datasource, - depName: 'non_existent_crate', + packageName: 'non_existent_crate', registryUrls: [], }) ).toBeNull(); @@ -136,7 +136,7 @@ describe('modules/datasource/crate/index', () => { expect( await getPkgReleases({ datasource, - depName: 'non_existent_crate', + packageName: 'non_existent_crate', registryUrls: ['3'], }) ).toBeNull(); @@ -148,7 +148,7 @@ describe('modules/datasource/crate/index', () => { expect( await getPkgReleases({ datasource, - depName: 'non_existent_crate', + packageName: 'non_existent_crate', registryUrls: ['https://crates.io'], }) ).toBeNull(); @@ -163,7 +163,7 @@ describe('modules/datasource/crate/index', () => { expect( await getPkgReleases({ datasource, - depName: 'non_existent_crate', + packageName: 'non_existent_crate', registryUrls: ['https://crates.io'], }) ).toBeNull(); @@ -175,7 +175,7 @@ describe('modules/datasource/crate/index', () => { expect( await getPkgReleases({ datasource, - depName: 'non_existent_crate', + packageName: 'non_existent_crate', registryUrls: ['https://crates.io'], }) ).toBeNull(); @@ -186,7 +186,7 @@ describe('modules/datasource/crate/index', () => { expect( await getPkgReleases({ datasource, - depName: 'some_crate', + packageName: 'some_crate', registryUrls: ['https://crates.io'], }) ).toBeNull(); @@ -197,7 +197,7 @@ describe('modules/datasource/crate/index', () => { await expect( getPkgReleases({ datasource, - depName: 'some_crate', + packageName: 'some_crate', registryUrls: ['https://crates.io'], }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); @@ -208,7 +208,7 @@ describe('modules/datasource/crate/index', () => { expect( await getPkgReleases({ datasource, - depName: 'some_crate', + packageName: 'some_crate', registryUrls: ['https://crates.io'], }) ).toBeNull(); @@ -223,7 +223,7 @@ describe('modules/datasource/crate/index', () => { .reply(200, Fixtures.get('libc')); const res = await getPkgReleases({ datasource, - depName: 'libc', + packageName: 'libc', registryUrls: ['https://crates.io'], }); expect(res).toMatchSnapshot(); @@ -240,7 +240,7 @@ describe('modules/datasource/crate/index', () => { .reply(200, Fixtures.get('amethyst')); const res = await getPkgReleases({ datasource, - depName: 'amethyst', + packageName: 'amethyst', registryUrls: ['https://crates.io'], }); expect(res).toMatchSnapshot(); @@ -254,7 +254,7 @@ describe('modules/datasource/crate/index', () => { const url = 'https://dl.cloudsmith.io/basic/myorg/myrepo/cargo/index.git'; const res = await getPkgReleases({ datasource, - depName: 'mypkg', + packageName: 'mypkg', registryUrls: [url], }); expect(mockClone).toHaveBeenCalledTimes(0); @@ -267,7 +267,7 @@ describe('modules/datasource/crate/index', () => { const url = 'https://dl.cloudsmith.io/basic/myorg/myrepo/cargo/index.git'; const res = await getPkgReleases({ datasource, - depName: 'mypkg', + packageName: 'mypkg', registryUrls: [url], }); expect(mockClone).toHaveBeenCalled(); @@ -282,7 +282,7 @@ describe('modules/datasource/crate/index', () => { const url = 'https://github.com/mcorbin/testregistry'; const res = await getPkgReleases({ datasource, - depName: 'mypkg', + packageName: 'mypkg', registryUrls: [url], }); expect(mockClone).toHaveBeenCalled(); @@ -297,12 +297,12 @@ describe('modules/datasource/crate/index', () => { const url = 'https://github.com/mcorbin/othertestregistry'; await getPkgReleases({ datasource, - depName: 'mypkg', + packageName: 'mypkg', registryUrls: [url], }); await getPkgReleases({ datasource, - depName: 'mypkg', + packageName: 'mypkg', registryUrls: [url], }); expect(mockClone).toHaveBeenCalledTimes(1); @@ -316,19 +316,19 @@ describe('modules/datasource/crate/index', () => { await Promise.all([ getPkgReleases({ datasource, - depName: 'mypkg', + packageName: 'mypkg', registryUrls: [url], }), getPkgReleases({ datasource, - depName: 'mypkg-2', + packageName: 'mypkg-2', registryUrls: [url], }), ]); await getPkgReleases({ datasource, - depName: 'mypkg-3', + packageName: 'mypkg-3', registryUrls: [url], }); @@ -342,12 +342,12 @@ describe('modules/datasource/crate/index', () => { const result = await getPkgReleases({ datasource, - depName: 'mypkg', + packageName: 'mypkg', registryUrls: [url], }); const result2 = await getPkgReleases({ datasource, - depName: 'mypkg-2', + packageName: 'mypkg-2', registryUrls: [url], }); diff --git a/lib/modules/datasource/dart-version/index.spec.ts b/lib/modules/datasource/dart-version/index.spec.ts index 798bab2496f07d..ae41cd725dfa84 100644 --- a/lib/modules/datasource/dart-version/index.spec.ts +++ b/lib/modules/datasource/dart-version/index.spec.ts @@ -8,7 +8,7 @@ const baseUrl = 'https://storage.googleapis.com'; const urlPath = '/storage/v1/b/dart-archive/o?delimiter=%2F&prefix=channels%2Fstable%2Frelease%2F&alt=json'; const datasource = DartVersionDatasource.id; -const depName = 'dart'; +const packageName = 'dart'; const channels = ['stable', 'beta', 'dev']; describe('modules/datasource/dart-version/index', () => { @@ -18,7 +18,7 @@ describe('modules/datasource/dart-version/index', () => { await expect( getPkgReleases({ datasource, - depName, + packageName, }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -28,7 +28,7 @@ describe('modules/datasource/dart-version/index', () => { expect( await getPkgReleases({ datasource, - depName, + packageName, }) ).toBeNull(); }); @@ -38,7 +38,7 @@ describe('modules/datasource/dart-version/index', () => { expect( await getPkgReleases({ datasource, - depName, + packageName, }) ).toBeNull(); }); @@ -55,7 +55,7 @@ describe('modules/datasource/dart-version/index', () => { const res = await getPkgReleases({ datasource, - depName, + packageName, }); expect(res).toBeDefined(); diff --git a/lib/modules/datasource/dart/index.spec.ts b/lib/modules/datasource/dart/index.spec.ts index b3472322c6b6a1..06bad8e6f21dc4 100644 --- a/lib/modules/datasource/dart/index.spec.ts +++ b/lib/modules/datasource/dart/index.spec.ts @@ -15,7 +15,7 @@ describe('modules/datasource/dart/index', () => { expect( await getPkgReleases({ datasource: DartDatasource.id, - depName: 'non_sense', + packageName: 'non_sense', }) ).toBeNull(); }); @@ -32,7 +32,7 @@ describe('modules/datasource/dart/index', () => { expect( await getPkgReleases({ datasource: DartDatasource.id, - depName: 'shared_preferences', + packageName: 'shared_preferences', }) ).toBeNull(); @@ -47,7 +47,7 @@ describe('modules/datasource/dart/index', () => { expect( await getPkgReleases({ datasource: DartDatasource.id, - depName: 'shared_preferences', + packageName: 'shared_preferences', }) ).toBeNull(); }); @@ -57,7 +57,7 @@ describe('modules/datasource/dart/index', () => { expect( await getPkgReleases({ datasource: DartDatasource.id, - depName: 'shared_preferences', + packageName: 'shared_preferences', }) ).toBeNull(); }); @@ -67,7 +67,7 @@ describe('modules/datasource/dart/index', () => { await expect( getPkgReleases({ datasource: DartDatasource.id, - depName: 'shared_preferences', + packageName: 'shared_preferences', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -77,7 +77,7 @@ describe('modules/datasource/dart/index', () => { expect( await getPkgReleases({ datasource: DartDatasource.id, - depName: 'shared_preferences', + packageName: 'shared_preferences', }) ).toBeNull(); }); @@ -86,7 +86,7 @@ describe('modules/datasource/dart/index', () => { httpMock.scope(baseUrl).get('/shared_preferences').reply(200, body); const res = await getPkgReleases({ datasource: DartDatasource.id, - depName: 'shared_preferences', + packageName: 'shared_preferences', }); expect(res).toMatchSnapshot(); }); diff --git a/lib/modules/datasource/datasource.spec.ts b/lib/modules/datasource/datasource.spec.ts index e36bd37b2eb867..bf74641b1c7b8f 100644 --- a/lib/modules/datasource/datasource.spec.ts +++ b/lib/modules/datasource/datasource.spec.ts @@ -30,7 +30,7 @@ describe('modules/datasource/datasource', () => { httpMock.scope(exampleUrl).get('/').reply(429); await expect( - testDatasource.getReleases(partial({})) + testDatasource.getReleases(partial()) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); }); diff --git a/lib/modules/datasource/datasource.ts b/lib/modules/datasource/datasource.ts index a8cb0b3ebc8a78..95d6abf947b9bc 100644 --- a/lib/modules/datasource/datasource.ts +++ b/lib/modules/datasource/datasource.ts @@ -22,7 +22,7 @@ export abstract class Datasource implements DatasourceApi { defaultRegistryUrls?: string[] | (() => string[]); - defaultVersioning: string | undefined; + defaultVersioning?: string | undefined; registryStrategy: RegistryStrategy | undefined = 'first'; diff --git a/lib/modules/datasource/deno/index.ts b/lib/modules/datasource/deno/index.ts index 1568c1d5cd8234..81b42542b57e2d 100644 --- a/lib/modules/datasource/deno/index.ts +++ b/lib/modules/datasource/deno/index.ts @@ -45,7 +45,7 @@ export class DenoDatasource extends Datasource { const massagedRegistryUrl = registryUrl!; const extractResult = regEx( - '^(https:\\/\\/deno.land\\/)(?[^@\\s]+)' + '^(https://deno.land/)(?[^@\\s]+)' ).exec(packageName); const rawPackageName = extractResult?.groups?.rawPackageName; if (is.nullOrUndefined(rawPackageName)) { diff --git a/lib/modules/datasource/docker/common.ts b/lib/modules/datasource/docker/common.ts index f91b85c1e2049a..467755d9779f6b 100644 --- a/lib/modules/datasource/docker/common.ts +++ b/lib/modules/datasource/docker/common.ts @@ -10,6 +10,8 @@ export const gitRefLabel = 'org.opencontainers.image.revision'; const JFROG_ARTIFACTORY_RES_HEADER = 'x-jfrog-version'; -export function isArtifactoryServer(res: HttpResponse | undefined): boolean { +export function isArtifactoryServer( + res: HttpResponse | undefined +): boolean { return is.string(res?.headers[JFROG_ARTIFACTORY_RES_HEADER]); } diff --git a/lib/modules/datasource/docker/index.spec.ts b/lib/modules/datasource/docker/index.spec.ts index 30b17f3afe7d20..87f1e53a4d5e80 100644 --- a/lib/modules/datasource/docker/index.spec.ts +++ b/lib/modules/datasource/docker/index.spec.ts @@ -5,6 +5,7 @@ import { } from '@aws-sdk/client-ecr'; import { mockClient } from 'aws-sdk-client-mock'; import { getDigest, getPkgReleases } from '..'; +import { range } from '../../../../lib/util/range'; import * as httpMock from '../../../../test/http-mock'; import { logger, mocked } from '../../../../test/util'; import { @@ -221,7 +222,7 @@ describe('modules/datasource/docker/index', () => { }) .reply(401); const res = await getDigest( - { datasource: 'docker', depName: 'some-dep' }, + { datasource: 'docker', packageName: 'some-dep' }, 'some-new-value' ); expect(res).toBeNull(); @@ -237,7 +238,7 @@ describe('modules/datasource/docker/index', () => { }) .replyWithError('error'); const res = await getDigest( - { datasource: 'docker', depName: 'some-dep' }, + { datasource: 'docker', packageName: 'some-dep' }, 'some-new-value' ); expect(res).toBeNull(); @@ -251,7 +252,7 @@ describe('modules/datasource/docker/index', () => { .head('/library/some-dep/manifests/some-new-value') .reply(200, undefined, { 'docker-content-digest': '' }); const res = await getDigest( - { datasource: 'docker', depName: 'some-dep' }, + { datasource: 'docker', packageName: 'some-dep' }, 'some-new-value' ); expect(res).toBeNull(); @@ -277,7 +278,7 @@ describe('modules/datasource/docker/index', () => { hostRules.find.mockReturnValue({}); const res = await getDigest({ datasource: 'docker', - depName: 'some-dep', + packageName: 'some-dep', }); expect(res).toBe('some-digest'); }); @@ -326,7 +327,7 @@ describe('modules/datasource/docker/index', () => { .twice() .reply(200, { token: 'some-token' }); const res = await getDigest( - { datasource: 'docker', depName: 'some-dep' }, + { datasource: 'docker', packageName: 'some-dep' }, 'some-new-value' ); expect(res).toBe( @@ -344,7 +345,7 @@ describe('modules/datasource/docker/index', () => { hostRules.find.mockReturnValue({ insecureRegistry: true }); const res = await getDigest({ datasource: 'docker', - depName: 'some-dep', + packageName: 'some-dep', }); expect(res).toBe('some-digest'); }); @@ -364,7 +365,7 @@ describe('modules/datasource/docker/index', () => { ) .reply(200, '', { 'docker-content-digest': 'some-digest' }); const res = await getDigest( - { datasource: 'docker', depName: 'some-dep' }, + { datasource: 'docker', packageName: 'some-dep' }, 'some-tag' ); expect(res).toBe('some-digest'); @@ -380,7 +381,7 @@ describe('modules/datasource/docker/index', () => { .head('/library/some-dep/manifests/some-tag') .reply(403); const res = await getDigest( - { datasource: 'docker', depName: 'some-dep' }, + { datasource: 'docker', packageName: 'some-dep' }, 'some-tag' ); expect(res).toBeNull(); @@ -405,7 +406,7 @@ describe('modules/datasource/docker/index', () => { await getDigest( { datasource: 'docker', - depName: '123456789.dkr.ecr.us-east-1.amazonaws.com/node', + packageName: '123456789.dkr.ecr.us-east-1.amazonaws.com/node', }, 'some-tag' ) @@ -444,7 +445,7 @@ describe('modules/datasource/docker/index', () => { await getDigest( { datasource: 'docker', - depName: '123456789.dkr.ecr.us-east-1.amazonaws.com/node', + packageName: '123456789.dkr.ecr.us-east-1.amazonaws.com/node', }, 'some-tag' ) @@ -477,7 +478,7 @@ describe('modules/datasource/docker/index', () => { const res = await getDigest( { datasource: 'docker', - depName: '123456789.dkr.ecr.us-east-1.amazonaws.com/node', + packageName: '123456789.dkr.ecr.us-east-1.amazonaws.com/node', }, 'some-tag' ); @@ -494,7 +495,7 @@ describe('modules/datasource/docker/index', () => { const res = await getDigest( { datasource: 'docker', - depName: '123456789.dkr.ecr.us-east-1.amazonaws.com/node', + packageName: '123456789.dkr.ecr.us-east-1.amazonaws.com/node', }, 'some-tag' ); @@ -510,7 +511,7 @@ describe('modules/datasource/docker/index', () => { const res = await getDigest( { datasource: 'docker', - depName: '123456789.dkr.ecr.us-east-1.amazonaws.com/node', + packageName: '123456789.dkr.ecr.us-east-1.amazonaws.com/node', }, 'some-tag' ); @@ -527,7 +528,7 @@ describe('modules/datasource/docker/index', () => { .head('/library/some-dep/manifests/some-new-value') .reply(200, {}, { 'docker-content-digest': 'some-digest' }); const res = await getDigest( - { datasource: 'docker', depName: 'some-dep' }, + { datasource: 'docker', packageName: 'some-dep' }, 'some-new-value' ); expect(res).toBe('some-digest'); @@ -548,7 +549,7 @@ describe('modules/datasource/docker/index', () => { .get('/token?service=&scope=repository:library/some-other-dep:pull') .reply(200, { access_token: 'test' }); const res = await getDigest( - { datasource: 'docker', depName: 'some-other-dep' }, + { datasource: 'docker', packageName: 'some-other-dep' }, '8.0.0-alpine' ); expect(res).toBe('some-digest'); @@ -571,7 +572,7 @@ describe('modules/datasource/docker/index', () => { ) .reply(200, { access_token: 'test' }); const res = await getDigest( - { datasource: 'docker', depName: 'some-other-dep' }, + { datasource: 'docker', packageName: 'some-other-dep' }, '8.0.0-alpine' ); expect(res).toBe('some-digest'); @@ -580,14 +581,14 @@ describe('modules/datasource/docker/index', () => { it('should throw error for 429', async () => { httpMock.scope(baseUrl).get('/').replyWithError({ statusCode: 429 }); await expect( - getDigest({ datasource: 'docker', depName: 'some-dep' }, 'latest') + getDigest({ datasource: 'docker', packageName: 'some-dep' }, 'latest') ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); it('should throw error for 5xx', async () => { httpMock.scope(baseUrl).get('/').replyWithError({ statusCode: 504 }); await expect( - getDigest({ datasource: 'docker', depName: 'some-dep' }, 'latest') + getDigest({ datasource: 'docker', packageName: 'some-dep' }, 'latest') ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -669,7 +670,7 @@ describe('modules/datasource/docker/index', () => { const res = await getDigest( { datasource: 'docker', - depName: 'some-dep', + packageName: 'some-dep', currentDigest, }, 'some-new-value' @@ -762,7 +763,7 @@ describe('modules/datasource/docker/index', () => { const res = await getDigest( { datasource: 'docker', - depName: 'some-dep', + packageName: 'some-dep', currentDigest, }, 'some-new-value' @@ -839,7 +840,7 @@ describe('modules/datasource/docker/index', () => { const res = await getDigest( { datasource: 'docker', - depName: 'some-dep', + packageName: 'some-dep', currentDigest, }, 'some-new-value' @@ -906,7 +907,7 @@ describe('modules/datasource/docker/index', () => { const res = await getDigest( { datasource: 'docker', - depName: 'some-dep', + packageName: 'some-dep', currentDigest, }, 'some-new-value' @@ -991,7 +992,7 @@ describe('modules/datasource/docker/index', () => { const res = await getDigest( { datasource: 'docker', - depName: 'some-dep', + packageName: 'some-dep', currentDigest, }, 'some-new-value' @@ -1044,7 +1045,7 @@ describe('modules/datasource/docker/index', () => { const res = await getDigest( { datasource: 'docker', - depName: 'some-dep', + packageName: 'some-dep', currentDigest, }, 'some-new-value' @@ -1077,7 +1078,7 @@ describe('modules/datasource/docker/index', () => { const res = await getDigest( { datasource: 'docker', - depName: 'some-dep', + packageName: 'some-dep', currentDigest: 'sha256:0101010101010101010101010101010101010101010101010101010101010101', }, @@ -1097,7 +1098,7 @@ describe('modules/datasource/docker/index', () => { .reply(403); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'node', + packageName: 'node', registryUrls: ['https://docker.io'], }); expect(res).toBeNull(); @@ -1127,14 +1128,14 @@ describe('modules/datasource/docker/index', () => { .reply(200, { tags: ['latest'] }, {}); const config = { datasource: DockerDatasource.id, - depName: 'node', + packageName: 'node', registryUrls: ['https://registry.company.com'], }; const res = await getPkgReleases(config); expect(res?.releases).toHaveLength(1); }); - it('uses custom registry in depName', async () => { + it('uses custom registry in packageName', async () => { const tags = ['1.0.0']; httpMock .scope('https://registry.company.com/v2') @@ -1148,7 +1149,7 @@ describe('modules/datasource/docker/index', () => { .reply(200, '', {}); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'registry.company.com/node', + packageName: 'registry.company.com/node', }); expect(res?.releases).toHaveLength(1); }); @@ -1171,7 +1172,7 @@ describe('modules/datasource/docker/index', () => { .reply(200, '', {}); const config = { datasource: DockerDatasource.id, - depName: 'bitnami/redis', + packageName: 'bitnami/redis', registryUrls: ['https://quay.io'], }; const res = await getPkgReleases(config); @@ -1187,33 +1188,50 @@ describe('modules/datasource/docker/index', () => { .reply(500); const config = { datasource: DockerDatasource.id, - depName: 'bitnami/redis', + packageName: 'bitnami/redis', registryUrls: ['https://quay.io'], }; await expect(getPkgReleases(config)).rejects.toThrow(EXTERNAL_HOST_ERROR); }); it('jfrog artifactory - retry tags for official images by injecting `/library` after repository and before image', async () => { - const tags = ['18.0.0']; + const tags1 = [...range(1, 10000)].map((i) => `${i}.0.0`); + const tags2 = [...range(10000, 10050)].map((i) => `${i}.0.0`); httpMock .scope('https://org.jfrog.io/v2') .get('/virtual-mirror/node/tags/list?n=10000') - .reply(200, '', {}) + .reply(200, '', { 'x-jfrog-version': 'Artifactory/7.42.2 74202900' }) .get('/virtual-mirror/node/tags/list?n=10000') .reply(404, '', { 'x-jfrog-version': 'Artifactory/7.42.2 74202900' }) .get('/virtual-mirror/library/node/tags/list?n=10000') .reply(200, '', {}) .get('/virtual-mirror/library/node/tags/list?n=10000') - .reply(200, { tags }, {}) + // Note the Link is incorrect and should be `; rel="next", ` + // Artifactory incorrectly returns a next link without the virtual repository name + // this is due to a bug in Artifactory https://jfrog.atlassian.net/browse/RTFACT-18971 + .reply( + 200, + { tags: tags1 }, + { + 'x-jfrog-version': 'Artifactory/7.42.2 74202900', + link: '; rel="next", ', + } + ) + .get('/virtual-mirror/library/node/tags/list?n=10000&last=10000') + .reply( + 200, + { tags: tags2 }, + { 'x-jfrog-version': 'Artifactory/7.42.2 74202900' } + ) .get('/') .reply(200, '', {}) - .get('/virtual-mirror/node/manifests/18.0.0') + .get('/virtual-mirror/node/manifests/10050.0.0') .reply(200, '', {}); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'org.jfrog.io/virtual-mirror/node', + packageName: 'org.jfrog.io/virtual-mirror/node', }); - expect(res?.releases).toHaveLength(1); + expect(res?.releases).toHaveLength(10050); }); it('uses lower tag limit for ECR deps', async () => { @@ -1232,7 +1250,7 @@ describe('modules/datasource/docker/index', () => { expect( await getPkgReleases({ datasource: DockerDatasource.id, - depName: '123456789.dkr.ecr.us-east-1.amazonaws.com/node', + packageName: '123456789.dkr.ecr.us-east-1.amazonaws.com/node', }) ).toEqual({ registryUrl: 'https://123456789.dkr.ecr.us-east-1.amazonaws.com', @@ -1284,7 +1302,7 @@ describe('modules/datasource/docker/index', () => { expect( await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'public.ecr.aws/amazonlinux/amazonlinux', + packageName: 'public.ecr.aws/amazonlinux/amazonlinux', }) ).toEqual({ registryUrl: 'https://public.ecr.aws', @@ -1338,7 +1356,7 @@ describe('modules/datasource/docker/index', () => { expect( await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'ecr-proxy.company.com/node', + packageName: 'ecr-proxy.company.com/node', }) ).toEqual({ registryUrl: 'https://ecr-proxy.company.com', @@ -1373,7 +1391,7 @@ describe('modules/datasource/docker/index', () => { expect( await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'ecr-proxy.company.com/node', + packageName: 'ecr-proxy.company.com/node', }) ).toBeNull(); }); @@ -1404,7 +1422,7 @@ describe('modules/datasource/docker/index', () => { expect( await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'ecr-proxy.company.com/node', + packageName: 'ecr-proxy.company.com/node', }) ).toBeNull(); }); @@ -1427,7 +1445,7 @@ describe('modules/datasource/docker/index', () => { expect( await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'ecr-proxy.company.com/node', + packageName: 'ecr-proxy.company.com/node', }) ).toBeNull(); }); @@ -1456,7 +1474,7 @@ describe('modules/datasource/docker/index', () => { expect( await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'ecr-proxy.company.com/node', + packageName: 'ecr-proxy.company.com/node', }) ).toBeNull(); }); @@ -1477,7 +1495,7 @@ describe('modules/datasource/docker/index', () => { expect( await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'ecr-proxy.company.com/node', + packageName: 'ecr-proxy.company.com/node', }) ).toBeNull(); }); @@ -1500,7 +1518,7 @@ describe('modules/datasource/docker/index', () => { expect( await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'ecr-proxy.company.com/node', + packageName: 'ecr-proxy.company.com/node', }) ).toBeNull(); }); @@ -1527,7 +1545,7 @@ describe('modules/datasource/docker/index', () => { expect( await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'ecr-proxy.company.com/node', + packageName: 'ecr-proxy.company.com/node', }) ).toBeNull(); }); @@ -1555,7 +1573,7 @@ describe('modules/datasource/docker/index', () => { expect( await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'ecr-proxy.company.com/node', + packageName: 'ecr-proxy.company.com/node', }) ).toBeNull(); }); @@ -1584,7 +1602,7 @@ describe('modules/datasource/docker/index', () => { .reply(200, { token: 'test' }); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'node', + packageName: 'node', }); expect(res?.releases).toHaveLength(1); }); @@ -1612,7 +1630,7 @@ describe('modules/datasource/docker/index', () => { .reply(200, { token: 'test' }); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'docker.io/node', + packageName: 'docker.io/node', }); expect(res?.releases).toHaveLength(1); }); @@ -1638,7 +1656,7 @@ describe('modules/datasource/docker/index', () => { .reply(200); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'k8s.gcr.io/kubernetes-dashboard-amd64', + packageName: 'k8s.gcr.io/kubernetes-dashboard-amd64', }); expect(res?.releases).toHaveLength(1); }); @@ -1652,7 +1670,7 @@ describe('modules/datasource/docker/index', () => { .replyWithError('error'); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'my/node', + packageName: 'my/node', }); expect(res).toBeNull(); }); @@ -1677,7 +1695,7 @@ describe('modules/datasource/docker/index', () => { .reply(200, { token: 'some-token ' }); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'my/node', + packageName: 'my/node', registryUrls: ['https://index.docker.io/'], }); expect(res?.releases).toHaveLength(1); @@ -1693,7 +1711,7 @@ describe('modules/datasource/docker/index', () => { }); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'node', + packageName: 'node', }); expect(res).toBeNull(); }); @@ -1737,7 +1755,7 @@ describe('modules/datasource/docker/index', () => { }); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'registry.company.com/node', + packageName: 'registry.company.com/node', }); expect(res).toStrictEqual({ registryUrl: 'https://registry.company.com', @@ -1788,7 +1806,7 @@ describe('modules/datasource/docker/index', () => { .reply(200, {}); // DockerDatasource.getLabels() inner response const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'registry.company.com/node', + packageName: 'registry.company.com/node', }); expect(res).toStrictEqual({ registryUrl: 'https://registry.company.com', @@ -1842,7 +1860,7 @@ describe('modules/datasource/docker/index', () => { }); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'registry.company.com/node', + packageName: 'registry.company.com/node', }); expect(res).toStrictEqual({ registryUrl: 'https://registry.company.com', @@ -1869,7 +1887,7 @@ describe('modules/datasource/docker/index', () => { }); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'registry.company.com/node', + packageName: 'registry.company.com/node', }); expect(res).toStrictEqual({ registryUrl: 'https://registry.company.com', @@ -1893,7 +1911,7 @@ describe('modules/datasource/docker/index', () => { }); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'registry.company.com/node', + packageName: 'registry.company.com/node', }); expect(res).toStrictEqual({ registryUrl: 'https://registry.company.com', @@ -1914,7 +1932,7 @@ describe('modules/datasource/docker/index', () => { .reply(200, {}); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'registry.company.com/node', + packageName: 'registry.company.com/node', }); expect(res).toStrictEqual({ registryUrl: 'https://registry.company.com', @@ -1955,7 +1973,7 @@ describe('modules/datasource/docker/index', () => { }); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'registry.company.com/node', + packageName: 'registry.company.com/node', }); expect(res).toStrictEqual({ registryUrl: 'https://registry.company.com', @@ -2000,7 +2018,7 @@ describe('modules/datasource/docker/index', () => { }); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'registry.company.com/node', + packageName: 'registry.company.com/node', }); expect(res).toStrictEqual({ registryUrl: 'https://registry.company.com', @@ -2030,7 +2048,7 @@ describe('modules/datasource/docker/index', () => { }); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'registry.company.com/node', + packageName: 'registry.company.com/node', }); expect(res).toStrictEqual({ registryUrl: 'https://registry.company.com', @@ -2080,7 +2098,7 @@ describe('modules/datasource/docker/index', () => { }); const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'registry.company.com/node', + packageName: 'registry.company.com/node', }); expect(res).toStrictEqual({ registryUrl: 'https://registry.company.com', @@ -2136,7 +2154,7 @@ describe('modules/datasource/docker/index', () => { const res = await getPkgReleases({ datasource: DockerDatasource.id, - depName: 'ghcr.io/visualon/drone-git', + packageName: 'ghcr.io/visualon/drone-git', }); expect(res).toStrictEqual({ registryUrl: 'https://ghcr.io', diff --git a/lib/modules/datasource/docker/index.ts b/lib/modules/datasource/docker/index.ts index 4e8127e60426ae..43e66d2321d35c 100644 --- a/lib/modules/datasource/docker/index.ts +++ b/lib/modules/datasource/docker/index.ts @@ -234,7 +234,7 @@ export async function getAuthHeaders( } async function getECRAuthToken( - region: string | undefined, + region: string, opts: HostRule ): Promise { const config: ECRClientConfig = { region }; @@ -883,7 +883,15 @@ export class DockerDatasource extends Datasource { } tags = tags.concat(res.body.tags); const linkHeader = parseLinkHeader(res.headers.link); - url = linkHeader?.next ? URL.resolve(url, linkHeader.next.url) : null; + if (isArtifactoryServer(res)) { + // Artifactory incorrectly returns a next link without the virtual repository name + // this is due to a bug in Artifactory https://jfrog.atlassian.net/browse/RTFACT-18971 + url = linkHeader?.next?.last + ? `${url}&last=${linkHeader.next.last}` + : null; + } else { + url = linkHeader?.next ? URL.resolve(url, linkHeader.next.url) : null; + } page += 1; } while (url && page < 20); return tags; @@ -909,10 +917,9 @@ export class DockerDatasource extends Datasource { tags = await this.getDockerApiTags(registryHost, dockerRepository); } return tags; - } catch (err) /* istanbul ignore next */ { - if (err instanceof ExternalHostError) { - throw err; - } + } catch (_err) /* istanbul ignore next */ { + const err = _err instanceof ExternalHostError ? _err.err : _err; + if ( (err.statusCode === 404 || err.message === PAGE_NOT_FOUND_ERROR) && !dockerRepository.includes('/') @@ -974,7 +981,7 @@ export class DockerDatasource extends Datasource { if (isDockerHost(registryHost)) { logger.info({ err }, 'Docker Hub lookup failure'); } - throw err; + throw _err; } } diff --git a/lib/modules/datasource/dotnet-version/index.spec.ts b/lib/modules/datasource/dotnet-version/index.spec.ts index a0e3e0e18891be..d6bc44a8790aec 100644 --- a/lib/modules/datasource/dotnet-version/index.spec.ts +++ b/lib/modules/datasource/dotnet-version/index.spec.ts @@ -19,7 +19,7 @@ describe('modules/datasource/dotnet-version/index', () => { expect( await getPkgReleases({ datasource: DotnetVersionDatasource.id, - depName: 'non-dotnet', + packageName: 'non-dotnet', }) ).toBeNull(); }); @@ -30,7 +30,7 @@ describe('modules/datasource/dotnet-version/index', () => { expect( await getPkgReleases({ datasource: DotnetVersionDatasource.id, - depName: 'dotnet-sdk', + packageName: 'dotnet-sdk', }) ).toBeNull(); }); @@ -46,7 +46,7 @@ describe('modules/datasource/dotnet-version/index', () => { expect( await getPkgReleases({ datasource: DotnetVersionDatasource.id, - depName: 'dotnet-sdk', + packageName: 'dotnet-sdk', }) ).toBeNull(); }); @@ -57,7 +57,7 @@ describe('modules/datasource/dotnet-version/index', () => { await expect( getPkgReleases({ datasource: DotnetVersionDatasource.id, - depName: 'dotnet-sdk', + packageName: 'dotnet-sdk', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -73,7 +73,7 @@ describe('modules/datasource/dotnet-version/index', () => { await expect( getPkgReleases({ datasource: DotnetVersionDatasource.id, - depName: 'dotnet-sdk', + packageName: 'dotnet-sdk', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -84,7 +84,7 @@ describe('modules/datasource/dotnet-version/index', () => { expect( await getPkgReleases({ datasource: DotnetVersionDatasource.id, - depName: 'dotnet-sdk', + packageName: 'dotnet-sdk', }) ).toBeNull(); }); @@ -100,7 +100,7 @@ describe('modules/datasource/dotnet-version/index', () => { expect( await getPkgReleases({ datasource: DotnetVersionDatasource.id, - depName: 'dotnet-sdk', + packageName: 'dotnet-sdk', }) ).toBeNull(); }); @@ -121,7 +121,7 @@ describe('modules/datasource/dotnet-version/index', () => { const res = await getPkgReleases({ datasource: DotnetVersionDatasource.id, - depName: 'dotnet-sdk', + packageName: 'dotnet-sdk', }); expect(res).toBeDefined(); @@ -155,7 +155,7 @@ describe('modules/datasource/dotnet-version/index', () => { const res = await getPkgReleases({ datasource: DotnetVersionDatasource.id, - depName: 'dotnet-runtime', + packageName: 'dotnet-runtime', }); expect(res).toBeDefined(); diff --git a/lib/modules/datasource/flutter-version/index.spec.ts b/lib/modules/datasource/flutter-version/index.spec.ts index bd217e16e04361..8e333b66583e43 100644 --- a/lib/modules/datasource/flutter-version/index.spec.ts +++ b/lib/modules/datasource/flutter-version/index.spec.ts @@ -7,7 +7,7 @@ import { FlutterVersionDatasource } from '.'; const baseUrl = 'https://storage.googleapis.com'; const urlPath = '/flutter_infra_release/releases/releases_linux.json'; const datasource = FlutterVersionDatasource.id; -const depName = 'flutter'; +const packageName = 'flutter'; describe('modules/datasource/flutter-version/index', () => { describe('getReleases', () => { @@ -16,7 +16,7 @@ describe('modules/datasource/flutter-version/index', () => { await expect( getPkgReleases({ datasource, - depName, + packageName, }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -26,7 +26,7 @@ describe('modules/datasource/flutter-version/index', () => { expect( await getPkgReleases({ datasource, - depName, + packageName, }) ).toBeNull(); }); @@ -36,7 +36,7 @@ describe('modules/datasource/flutter-version/index', () => { expect( await getPkgReleases({ datasource, - depName, + packageName, }) ).toBeNull(); }); @@ -48,7 +48,7 @@ describe('modules/datasource/flutter-version/index', () => { .reply(200, Fixtures.get('index.json')); const res = await getPkgReleases({ datasource, - depName, + packageName, }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(31); diff --git a/lib/modules/datasource/galaxy-collection/index.spec.ts b/lib/modules/datasource/galaxy-collection/index.spec.ts index 019ccaa90e54b8..5c9979779e1ca8 100644 --- a/lib/modules/datasource/galaxy-collection/index.spec.ts +++ b/lib/modules/datasource/galaxy-collection/index.spec.ts @@ -29,7 +29,7 @@ describe('modules/datasource/galaxy-collection/index', () => { expect( await getPkgReleases({ datasource, - depName: 'foo.bar', + packageName: 'foo.bar', }) ).toBeNull(); }); @@ -39,7 +39,7 @@ describe('modules/datasource/galaxy-collection/index', () => { await expect( getPkgReleases({ datasource, - depName: 'foo.bar', + packageName: 'foo.bar', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -52,7 +52,7 @@ describe('modules/datasource/galaxy-collection/index', () => { expect( await getPkgReleases({ datasource, - depName: 'community.kubernetes', + packageName: 'community.kubernetes', }) ).toBeNull(); }); @@ -67,7 +67,7 @@ describe('modules/datasource/galaxy-collection/index', () => { expect( await getPkgReleases({ datasource, - depName: 'community.kubernetes', + packageName: 'community.kubernetes', }) ).toBeNull(); }); @@ -82,7 +82,7 @@ describe('modules/datasource/galaxy-collection/index', () => { await expect( getPkgReleases({ datasource, - depName: 'community.kubernetes', + packageName: 'community.kubernetes', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -103,7 +103,7 @@ describe('modules/datasource/galaxy-collection/index', () => { const res = await getPkgReleases({ datasource, - depName: 'community.kubernetes', + packageName: 'community.kubernetes', }); expect(res).toMatchSnapshot(); expect(res).not.toBeNull(); @@ -115,7 +115,7 @@ describe('modules/datasource/galaxy-collection/index', () => { expect( await getPkgReleases({ datasource, - depName: '', + packageName: '', }) ).toBeNull(); }); @@ -124,7 +124,7 @@ describe('modules/datasource/galaxy-collection/index', () => { expect( await getPkgReleases({ datasource, - depName: '', + packageName: '', }) ).toBeNull(); }); @@ -137,7 +137,7 @@ describe('modules/datasource/galaxy-collection/index', () => { expect( await getPkgReleases({ datasource, - depName: 'foo.bar', + packageName: 'foo.bar', }) ).toBeNull(); }); @@ -157,7 +157,7 @@ describe('modules/datasource/galaxy-collection/index', () => { .reply(200, communityKubernetesDetails0111); const res = await getPkgReleases({ datasource, - depName: 'community.kubernetes', + packageName: 'community.kubernetes', }); expect(res).toMatchSnapshot(); expect(res).not.toBeNull(); diff --git a/lib/modules/datasource/galaxy-collection/index.ts b/lib/modules/datasource/galaxy-collection/index.ts index 701536848b5e14..2e71f354336acd 100644 --- a/lib/modules/datasource/galaxy-collection/index.ts +++ b/lib/modules/datasource/galaxy-collection/index.ts @@ -93,7 +93,7 @@ export class GalaxyCollectionDatasource extends Datasource { try { const release: Release = { version: basicRelease.version, - isDeprecated: basicRelease.isDeprecated, + isDeprecated: !!basicRelease.isDeprecated, downloadUrl: versionDetails.download_url, newDigest: versionDetails.artifact.sha256, dependencies: versionDetails.metadata.dependencies, @@ -118,7 +118,7 @@ export class GalaxyCollectionDatasource extends Datasource { // extract base information which are only provided on the release from the newest release const result: ReleaseResult = { releases: filteredReleases, - sourceUrl: newestVersionDetails?.metadata.repository, + sourceUrl: newestVersionDetails?.metadata.repository ?? null, homepage: newestVersionDetails?.metadata.homepage, tags: newestVersionDetails?.metadata.tags, }; diff --git a/lib/modules/datasource/galaxy/index.spec.ts b/lib/modules/datasource/galaxy/index.spec.ts index 80ca4b8ca298a4..7654329befef6c 100644 --- a/lib/modules/datasource/galaxy/index.spec.ts +++ b/lib/modules/datasource/galaxy/index.spec.ts @@ -16,7 +16,7 @@ describe('modules/datasource/galaxy/index', () => { expect( await getPkgReleases({ datasource: GalaxyDatasource.id, - depName: 'non_existent_crate', + packageName: 'non_existent_crate', }) ).toBeNull(); }); @@ -29,7 +29,7 @@ describe('modules/datasource/galaxy/index', () => { expect( await getPkgReleases({ datasource: GalaxyDatasource.id, - depName: 'non_existent_crate', + packageName: 'non_existent_crate', }) ).toBeNull(); }); @@ -42,7 +42,7 @@ describe('modules/datasource/galaxy/index', () => { expect( await getPkgReleases({ datasource: GalaxyDatasource.id, - depName: 'non_existent_crate', + packageName: 'non_existent_crate', }) ).toBeNull(); }); @@ -55,7 +55,7 @@ describe('modules/datasource/galaxy/index', () => { expect( await getPkgReleases({ datasource: GalaxyDatasource.id, - depName: 'some_crate', + packageName: 'some_crate', }) ).toBeNull(); }); @@ -68,7 +68,7 @@ describe('modules/datasource/galaxy/index', () => { expect( await getPkgReleases({ datasource: GalaxyDatasource.id, - depName: 'some_crate', + packageName: 'some_crate', }) ).toBeNull(); }); @@ -80,7 +80,7 @@ describe('modules/datasource/galaxy/index', () => { .reply(200, Fixtures.get('timezone')); const res = await getPkgReleases({ datasource: GalaxyDatasource.id, - depName: 'yatesr.timezone', + packageName: 'yatesr.timezone', }); expect(res).toMatchSnapshot(); expect(res).not.toBeNull(); @@ -94,7 +94,7 @@ describe('modules/datasource/galaxy/index', () => { .reply(200, Fixtures.get('empty')); const res = await getPkgReleases({ datasource: GalaxyDatasource.id, - depName: 'foo.bar', + packageName: 'foo.bar', }); expect(res).toBeNull(); }); @@ -107,7 +107,7 @@ describe('modules/datasource/galaxy/index', () => { await expect( getPkgReleases({ datasource: GalaxyDatasource.id, - depName: 'some_crate', + packageName: 'some_crate', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -119,7 +119,7 @@ describe('modules/datasource/galaxy/index', () => { .reply(404); const res = await getPkgReleases({ datasource: GalaxyDatasource.id, - depName: 'foo.bar', + packageName: 'foo.bar', }); expect(res).toBeNull(); }); diff --git a/lib/modules/datasource/git-refs/index.spec.ts b/lib/modules/datasource/git-refs/index.spec.ts index 5c1f47ae5913f3..75405d464710de 100644 --- a/lib/modules/datasource/git-refs/index.spec.ts +++ b/lib/modules/datasource/git-refs/index.spec.ts @@ -6,7 +6,7 @@ import { GitRefsDatasource } from '.'; jest.mock('simple-git'); const simpleGit: jest.Mock> = _simpleGit as never; -const depName = 'https://github.com/example/example.git'; +const packageName = 'https://github.com/example/example.git'; const lsRemote1 = Fixtures.get('ls-remote-1.txt'); @@ -22,7 +22,7 @@ describe('modules/datasource/git-refs/index', () => { }); const versions = await getPkgReleases({ datasource, - depName, + packageName, }); expect(versions).toBeNull(); }); @@ -35,7 +35,7 @@ describe('modules/datasource/git-refs/index', () => { }); const { releases } = (await getPkgReleases({ datasource, - depName, + packageName, }))!; expect(releases).toBeEmpty(); }); @@ -48,7 +48,7 @@ describe('modules/datasource/git-refs/index', () => { }); const versions = await getPkgReleases({ datasource, - depName, + packageName, }); expect(versions).toBeNull(); }); @@ -62,7 +62,7 @@ describe('modules/datasource/git-refs/index', () => { const versions = await getPkgReleases({ datasource, - depName, + packageName, }); expect(versions).toMatchSnapshot(); const result = versions?.releases.map((x) => x.version).sort(); diff --git a/lib/modules/datasource/git-refs/readme.md b/lib/modules/datasource/git-refs/readme.md index b0a9b2d27a8402..86d27e39bb9e8d 100644 --- a/lib/modules/datasource/git-refs/readme.md +++ b/lib/modules/datasource/git-refs/readme.md @@ -1,7 +1,7 @@ This datasource can be used in combination with [regex managers](https://docs.renovatebot.com/modules/manager/regex/) to keep dependencies up-to-date which are not specifically supported by Renovate. This datasource returns a reference from a Git repository. -The `depName` (or `packageName` if in use) must be a fully qualified domain name. +The `packageName` must be a fully qualified domain name. To fetch the latest digest of a reference instead of the named reference, specify the reference as the `currentValue` and match on the `currentDigest`. **Usage example** diff --git a/lib/modules/datasource/git-tags/index.spec.ts b/lib/modules/datasource/git-tags/index.spec.ts index d47c6b12e9ed5a..a14744c6f7d6af 100644 --- a/lib/modules/datasource/git-tags/index.spec.ts +++ b/lib/modules/datasource/git-tags/index.spec.ts @@ -6,7 +6,7 @@ import { GitTagsDatasource } from '.'; jest.mock('simple-git'); const simpleGit: jest.Mock> = _simpleGit as never; -const depName = 'https://github.com/example/example.git'; +const packageName = 'https://github.com/example/example.git'; const lsRemote1 = Fixtures.get('ls-remote-1.txt', '../git-refs'); @@ -21,7 +21,7 @@ describe('modules/datasource/git-tags/index', () => { return Promise.resolve('') as Response; }, }); - const versions = await getPkgReleases({ datasource, depName }); + const versions = await getPkgReleases({ datasource, packageName }); expect(versions).toBeNull(); }); @@ -31,7 +31,7 @@ describe('modules/datasource/git-tags/index', () => { throw new Error(); }, }); - const versions = await getPkgReleases({ datasource, depName }); + const versions = await getPkgReleases({ datasource, packageName }); expect(versions).toBeNull(); }); @@ -44,7 +44,7 @@ describe('modules/datasource/git-tags/index', () => { const versions = await getPkgReleases({ datasource, - depName, + packageName, }); expect(versions).toMatchSnapshot(); }); diff --git a/lib/modules/datasource/github-releases/digest.spec.ts b/lib/modules/datasource/github-release-attachments/digest.spec.ts similarity index 80% rename from lib/modules/datasource/github-releases/digest.spec.ts rename to lib/modules/datasource/github-release-attachments/digest.spec.ts index 35fff7e25297ff..19264bc096da19 100644 --- a/lib/modules/datasource/github-releases/digest.spec.ts +++ b/lib/modules/datasource/github-release-attachments/digest.spec.ts @@ -1,17 +1,17 @@ import hasha from 'hasha'; import * as httpMock from '../../../../test/http-mock'; import type { GithubDigestFile } from '../../../util/github/types'; -import { GitHubReleaseMocker } from './test'; +import { GitHubReleaseAttachmentMocker } from './test'; -import { GithubReleasesDatasource } from '.'; +import { GithubReleaseAttachmentsDatasource } from '.'; -describe('modules/datasource/github-releases/digest', () => { +describe('modules/datasource/github-release-attachments/digest', () => { const packageName = 'some/dep'; - const releaseMock = new GitHubReleaseMocker( + const releaseMock = new GitHubReleaseAttachmentMocker( 'https://api.github.com', packageName ); - const githubReleases = new GithubReleasesDatasource(); + const githubReleaseAttachments = new GithubReleaseAttachmentsDatasource(); describe('findDigestAsset', () => { it('finds SHASUMS.txt file containing digest', async () => { @@ -21,7 +21,7 @@ describe('modules/datasource/github-releases/digest', () => { 'another-digest linux-arm64.tar.gz' ); - const digestAsset = await githubReleases.findDigestAsset( + const digestAsset = await githubReleaseAttachments.findDigestAsset( release, 'test-digest' ); @@ -40,7 +40,7 @@ describe('modules/datasource/github-releases/digest', () => { .get(`/repos/${packageName}/releases/download/v1.0.0/SHASUMS.txt`) .reply(200, ''); - const digestAsset = await githubReleases.findDigestAsset( + const digestAsset = await githubReleaseAttachments.findDigestAsset( release, 'test-digest' ); @@ -57,7 +57,7 @@ describe('modules/datasource/github-releases/digest', () => { }); const contentDigest = await hasha.async(content, { algorithm: 'sha256' }); - const digestAsset = await githubReleases.findDigestAsset( + const digestAsset = await githubReleaseAttachments.findDigestAsset( release, contentDigest ); @@ -67,7 +67,7 @@ describe('modules/datasource/github-releases/digest', () => { it('returns null when no assets available', async () => { const release = releaseMock.release('v1.0.0'); - const digestAsset = await githubReleases.findDigestAsset( + const digestAsset = await githubReleaseAttachments.findDigestAsset( release, 'test-digest' ); @@ -89,7 +89,7 @@ describe('modules/datasource/github-releases/digest', () => { 'v1.0.1', 'updated-digest asset.zip' ); - const digest = await githubReleases.mapDigestAssetToRelease( + const digest = await githubReleaseAttachments.mapDigestAssetToRelease( digestAsset, release ); @@ -106,7 +106,7 @@ describe('modules/datasource/github-releases/digest', () => { 'v1.0.1', 'updated-digest asset-1.0.1.zip' ); - const digest = await githubReleases.mapDigestAssetToRelease( + const digest = await githubReleaseAttachments.mapDigestAssetToRelease( digestAssetWithVersion, release ); @@ -118,7 +118,7 @@ describe('modules/datasource/github-releases/digest', () => { 'v1.0.1', 'moot-digest asset.tar.gz' ); - const digest = await githubReleases.mapDigestAssetToRelease( + const digest = await githubReleaseAttachments.mapDigestAssetToRelease( digestAsset, release ); @@ -127,7 +127,7 @@ describe('modules/datasource/github-releases/digest', () => { it('returns null when digest file not found', async () => { const release = releaseMock.release('v1.0.1'); - const digest = await githubReleases.mapDigestAssetToRelease( + const digest = await githubReleaseAttachments.mapDigestAssetToRelease( digestAsset, release ); @@ -151,7 +151,7 @@ describe('modules/datasource/github-releases/digest', () => { algorithm: 'sha256', }); - const digest = await githubReleases.mapDigestAssetToRelease( + const digest = await githubReleaseAttachments.mapDigestAssetToRelease( digestAsset, release ); @@ -160,7 +160,7 @@ describe('modules/datasource/github-releases/digest', () => { it('returns null when not found', async () => { const release = releaseMock.release('v1.0.1'); - const digest = await githubReleases.mapDigestAssetToRelease( + const digest = await githubReleaseAttachments.mapDigestAssetToRelease( digestAsset, release ); diff --git a/lib/modules/datasource/github-release-attachments/index.spec.ts b/lib/modules/datasource/github-release-attachments/index.spec.ts new file mode 100644 index 00000000000000..576bf7a004ff79 --- /dev/null +++ b/lib/modules/datasource/github-release-attachments/index.spec.ts @@ -0,0 +1,154 @@ +import { getDigest, getPkgReleases } from '..'; +import { mocked } from '../../../../test/util'; +import * as githubGraphql from '../../../util/github/graphql'; +import * as _hostRules from '../../../util/host-rules'; +import { GitHubReleaseAttachmentMocker } from './test'; +import { GithubReleaseAttachmentsDatasource } from '.'; + +jest.mock('../../../util/host-rules'); +const hostRules = mocked(_hostRules); + +const githubApiHost = 'https://api.github.com'; + +describe('modules/datasource/github-release-attachments/index', () => { + beforeEach(() => { + hostRules.hosts.mockReturnValue([]); + hostRules.find.mockReturnValue({ + token: 'some-token', + }); + }); + + describe('getReleases', () => { + it('returns releases', async () => { + jest.spyOn(githubGraphql, 'queryReleases').mockResolvedValueOnce([ + { + id: 1, + url: 'https://example.com', + name: 'some/dep2', + description: 'some description', + version: 'a', + releaseTimestamp: '2020-03-09T13:00:00Z', + }, + { + id: 2, + url: 'https://example.com', + name: 'some/dep2', + description: 'some description', + version: 'v', + releaseTimestamp: '2020-03-09T12:00:00Z', + }, + { + id: 3, + url: 'https://example.com', + name: 'some/dep2', + description: 'some description', + version: '1.0.0', + releaseTimestamp: '2020-03-09T11:00:00Z', + }, + { + id: 4, + url: 'https://example.com', + name: 'some/dep2', + description: 'some description', + version: 'v1.1.0', + releaseTimestamp: '2020-03-09T10:00:00Z', + }, + { + id: 5, + url: 'https://example.com', + name: 'some/dep2', + description: 'some description', + version: '2.0.0', + releaseTimestamp: '2020-04-09T10:00:00Z', + isStable: false, + }, + ]); + + const res = await getPkgReleases({ + datasource: GithubReleaseAttachmentsDatasource.id, + packageName: 'some/dep', + }); + + expect(res).toMatchObject({ + registryUrl: 'https://github.com', + releases: [ + { releaseTimestamp: '2020-03-09T11:00:00.000Z', version: '1.0.0' }, + { version: 'v1.1.0', releaseTimestamp: '2020-03-09T10:00:00.000Z' }, + { + version: '2.0.0', + releaseTimestamp: '2020-04-09T10:00:00.000Z', + isStable: false, + }, + ], + sourceUrl: 'https://github.com/some/dep', + }); + }); + }); + + describe('getDigest', () => { + const packageName = 'some/dep'; + const currentValue = 'v1.0.0'; + const currentDigest = 'v1.0.0-digest'; + + const releaseMock = new GitHubReleaseAttachmentMocker( + githubApiHost, + packageName + ); + + it('requires currentDigest', async () => { + const digest = await getDigest( + { datasource: GithubReleaseAttachmentsDatasource.id, packageName }, + currentValue + ); + expect(digest).toBeNull(); + }); + + it('defaults to currentDigest when currentVersion is missing', async () => { + const digest = await getDigest( + { + datasource: GithubReleaseAttachmentsDatasource.id, + packageName, + currentDigest, + }, + currentValue + ); + expect(digest).toEqual(currentDigest); + }); + + it('returns updated digest in new release', async () => { + releaseMock.withDigestFileAsset( + currentValue, + `${currentDigest} asset.zip` + ); + const nextValue = 'v1.0.1'; + const nextDigest = 'updated-digest'; + releaseMock.withDigestFileAsset(nextValue, `${nextDigest} asset.zip`); + const digest = await getDigest( + { + datasource: GithubReleaseAttachmentsDatasource.id, + packageName, + currentValue, + currentDigest, + }, + nextValue + ); + expect(digest).toEqual(nextDigest); + }); + + // This is awkward, but I found returning `null` in this case to not produce an update + // I'd prefer a PR with the old digest (that I can manually patch) to no PR, so I made this decision. + it('ignores failures verifying currentDigest', async () => { + releaseMock.release(currentValue); + const digest = await getDigest( + { + datasource: GithubReleaseAttachmentsDatasource.id, + packageName, + currentValue, + currentDigest, + }, + currentValue + ); + expect(digest).toEqual(currentDigest); + }); + }); +}); diff --git a/lib/modules/datasource/github-release-attachments/index.ts b/lib/modules/datasource/github-release-attachments/index.ts new file mode 100644 index 00000000000000..02516713ee424a --- /dev/null +++ b/lib/modules/datasource/github-release-attachments/index.ts @@ -0,0 +1,250 @@ +import is from '@sindresorhus/is'; +import hasha from 'hasha'; +import { logger } from '../../../logger'; +import { cache } from '../../../util/cache/package/decorator'; +import { queryReleases } from '../../../util/github/graphql'; +import type { + GithubDigestFile, + GithubRestAsset, + GithubRestRelease, +} from '../../../util/github/types'; +import { getApiBaseUrl, getSourceUrl } from '../../../util/github/url'; +import { GithubHttp } from '../../../util/http/github'; +import { newlineRegex, regEx } from '../../../util/regex'; +import { Datasource } from '../datasource'; +import type { + DigestConfig, + GetReleasesConfig, + Release, + ReleaseResult, +} from '../types'; + +export const cacheNamespace = 'datasource-github-releases'; + +function inferHashAlg(digest: string): string { + switch (digest.length) { + case 64: + return 'sha256'; + default: + case 96: + return 'sha512'; + } +} + +export class GithubReleaseAttachmentsDatasource extends Datasource { + static readonly id = 'github-release-attachments'; + + override readonly defaultRegistryUrls = ['https://github.com']; + + override http: GithubHttp; + + constructor() { + super(GithubReleaseAttachmentsDatasource.id); + this.http = new GithubHttp(GithubReleaseAttachmentsDatasource.id); + } + + @cache({ + ttlMinutes: 1440, + namespace: 'datasource-github-releases', + key: (release: GithubRestRelease, digest: string) => + `${release.html_url}:${digest}`, + }) + async findDigestFile( + release: GithubRestRelease, + digest: string + ): Promise { + const smallAssets = release.assets.filter( + (a: GithubRestAsset) => a.size < 5 * 1024 + ); + for (const asset of smallAssets) { + const res = await this.http.get(asset.browser_download_url); + for (const line of res.body.split(newlineRegex)) { + const [lineDigest, lineFilename] = line.split(regEx(/\s+/), 2); + if (lineDigest === digest) { + return { + assetName: asset.name, + digestedFileName: lineFilename, + currentVersion: release.tag_name, + currentDigest: lineDigest, + }; + } + } + } + return null; + } + + @cache({ + ttlMinutes: 1440, + namespace: 'datasource-github-releases', + key: (asset: GithubRestAsset, algorithm: string) => + `${asset.browser_download_url}:${algorithm}:assetDigest`, + }) + async downloadAndDigest( + asset: GithubRestAsset, + algorithm: string + ): Promise { + const res = this.http.stream(asset.browser_download_url); + const digest = await hasha.fromStream(res, { algorithm }); + return digest; + } + + async findAssetWithDigest( + release: GithubRestRelease, + digest: string + ): Promise { + const algorithm = inferHashAlg(digest); + const assetsBySize = release.assets.sort( + (a: GithubRestAsset, b: GithubRestAsset) => { + if (a.size < b.size) { + return -1; + } + if (a.size > b.size) { + return 1; + } + return 0; + } + ); + + for (const asset of assetsBySize) { + const assetDigest = await this.downloadAndDigest(asset, algorithm); + if (assetDigest === digest) { + return { + assetName: asset.name, + currentVersion: release.tag_name, + currentDigest: assetDigest, + }; + } + } + return null; + } + + /** Identify the asset associated with a known digest. */ + async findDigestAsset( + release: GithubRestRelease, + digest: string + ): Promise { + const digestFile = await this.findDigestFile(release, digest); + if (digestFile) { + return digestFile; + } + + const asset = await this.findAssetWithDigest(release, digest); + return asset; + } + + /** Given a digest asset, find the equivalent digest in a different release. */ + async mapDigestAssetToRelease( + digestAsset: GithubDigestFile, + release: GithubRestRelease + ): Promise { + const current = digestAsset.currentVersion.replace(regEx(/^v/), ''); + const next = release.tag_name.replace(regEx(/^v/), ''); + const releaseChecksumAssetName = digestAsset.assetName.replace( + current, + next + ); + const releaseAsset = release.assets.find( + (a: GithubRestAsset) => a.name === releaseChecksumAssetName + ); + if (!releaseAsset) { + return null; + } + if (digestAsset.digestedFileName) { + const releaseFilename = digestAsset.digestedFileName.replace( + current, + next + ); + const res = await this.http.get(releaseAsset.browser_download_url); + for (const line of res.body.split(newlineRegex)) { + const [lineDigest, lineFn] = line.split(regEx(/\s+/), 2); + if (lineFn === releaseFilename) { + return lineDigest; + } + } + } else { + const algorithm = inferHashAlg(digestAsset.currentDigest); + const newDigest = await this.downloadAndDigest(releaseAsset, algorithm); + return newDigest; + } + return null; + } + + /** + * Attempts to resolve the digest for the specified package. + * + * The `newValue` supplied here should be a valid tag for the GitHub release. + * Requires `currentValue` and `currentDigest`. + * + * There may be many assets attached to the release. This function will: + * - Identify the asset pinned by `currentDigest` in the `currentValue` release + * - Download small release assets, parse as checksum manifests (e.g. `SHASUMS.txt`). + * - Download individual assets until `currentDigest` is encountered. This is limited to sha256 and sha512. + * - Map the hashed asset to `newValue` and return the updated digest as a string + */ + override async getDigest( + { + packageName: repo, + currentValue, + currentDigest, + registryUrl, + }: DigestConfig, + newValue: string + ): Promise { + logger.debug( + { repo, currentValue, currentDigest, registryUrl, newValue }, + 'getDigest' + ); + if (!currentDigest) { + return null; + } + if (!currentValue) { + return currentDigest; + } + + const apiBaseUrl = getApiBaseUrl(registryUrl); + const { body: currentRelease } = await this.http.getJson( + `${apiBaseUrl}repos/${repo}/releases/tags/${currentValue}` + ); + const digestAsset = await this.findDigestAsset( + currentRelease, + currentDigest + ); + let newDigest: string | null; + if (!digestAsset || newValue === currentValue) { + newDigest = currentDigest; + } else { + const { body: newRelease } = await this.http.getJson( + `${apiBaseUrl}repos/${repo}/releases/tags/${newValue}` + ); + newDigest = await this.mapDigestAssetToRelease(digestAsset, newRelease); + } + return newDigest; + } + + /** + * This function can be used to fetch releases with a customisable versioning + * (e.g. semver) and with releases. + * + * This function will: + * - Fetch all releases + * - Sanitize the versions if desired (e.g. strip out leading 'v') + * - Return a dependency object containing sourceUrl string and releases array + */ + async getReleases(config: GetReleasesConfig): Promise { + const releasesResult = await queryReleases(config, this.http); + const releases = releasesResult.map((item) => { + const { version, releaseTimestamp, isStable } = item; + const result: Release = { + version, + gitRef: version, + releaseTimestamp, + }; + if (is.boolean(isStable)) { + result.isStable = isStable; + } + return result; + }); + const sourceUrl = getSourceUrl(config.packageName, config.registryUrl); + return { sourceUrl, releases }; + } +} diff --git a/lib/modules/datasource/github-releases/test/index.ts b/lib/modules/datasource/github-release-attachments/test/index.ts similarity index 97% rename from lib/modules/datasource/github-releases/test/index.ts rename to lib/modules/datasource/github-release-attachments/test/index.ts index e7dfcc82c91828..84f6f3086c1e28 100644 --- a/lib/modules/datasource/github-releases/test/index.ts +++ b/lib/modules/datasource/github-release-attachments/test/index.ts @@ -2,7 +2,7 @@ import * as httpMock from '../../../../../test/http-mock'; import { partial } from '../../../../../test/util'; import type { GithubRestRelease } from '../../../../util/github/types'; -export class GitHubReleaseMocker { +export class GitHubReleaseAttachmentMocker { constructor( private readonly githubApiHost: string, private readonly packageName: string diff --git a/lib/modules/datasource/github-releases/index.spec.ts b/lib/modules/datasource/github-releases/index.spec.ts index 2491c1a71f64c1..42f485fa589158 100644 --- a/lib/modules/datasource/github-releases/index.spec.ts +++ b/lib/modules/datasource/github-releases/index.spec.ts @@ -1,17 +1,14 @@ import { getDigest, getPkgReleases } from '..'; +import { mocked } from '../../../../test/util'; import * as githubGraphql from '../../../util/github/graphql'; import * as _hostRules from '../../../util/host-rules'; -import { GitHubReleaseMocker } from './test'; import { GithubReleasesDatasource } from '.'; jest.mock('../../../util/host-rules'); -const hostRules: any = _hostRules; - -const githubApiHost = 'https://api.github.com'; +const hostRules = mocked(_hostRules); describe('modules/datasource/github-releases/index', () => { beforeEach(() => { - jest.resetAllMocks(); hostRules.hosts.mockReturnValue([]); hostRules.find.mockReturnValue({ token: 'some-token', @@ -66,7 +63,7 @@ describe('modules/datasource/github-releases/index', () => { const res = await getPkgReleases({ datasource: GithubReleasesDatasource.id, - depName: 'some/dep', + packageName: 'some/dep', }); expect(res).toMatchObject({ @@ -86,66 +83,73 @@ describe('modules/datasource/github-releases/index', () => { }); describe('getDigest', () => { - const depName = 'some/dep'; + const packageName = 'some/dep'; const currentValue = 'v1.0.0'; - const currentDigest = 'v1.0.0-digest'; - - const releaseMock = new GitHubReleaseMocker(githubApiHost, depName); + const currentDigest = 'sha-of-v1'; + const newValue = 'v15.0.0'; + const newDigest = 'sha-of-v15'; - it('requires currentDigest', async () => { - const digest = await getDigest( - { datasource: GithubReleasesDatasource.id, depName }, - currentValue - ); - expect(digest).toBeNull(); + beforeEach(() => { + jest.spyOn(githubGraphql, 'queryTags').mockResolvedValueOnce([ + { + version: 'v1.0.0', + gitRef: 'v1.0.0', + releaseTimestamp: '2021-01-01', + hash: 'sha-of-v1', + }, + { + version: 'v15.0.0', + gitRef: 'v15.0.0', + releaseTimestamp: '2022-10-01', + hash: 'sha-of-v15', + }, + ]); }); - it('defaults to currentDigest when currentVersion is missing', async () => { + it('should be independent of the current digest', async () => { const digest = await getDigest( { datasource: GithubReleasesDatasource.id, - depName, - currentDigest, + packageName, + currentValue, }, - currentValue + newValue ); - expect(digest).toEqual(currentDigest); + expect(digest).toBe(newDigest); }); - it('returns updated digest in new release', async () => { - releaseMock.withDigestFileAsset( - currentValue, - `${currentDigest} asset.zip` + it('should be independent of the current value', async () => { + const digest = await getDigest( + { datasource: GithubReleasesDatasource.id, packageName }, + newValue ); - const nextValue = 'v1.0.1'; - const nextDigest = 'updated-digest'; - releaseMock.withDigestFileAsset(nextValue, `${nextDigest} asset.zip`); + expect(digest).toBe(newDigest); + }); + + it('returns updated digest in new release', async () => { const digest = await getDigest( { datasource: GithubReleasesDatasource.id, - depName, + packageName, currentValue, currentDigest, }, - nextValue + newValue ); - expect(digest).toEqual(nextDigest); + expect(digest).toEqual(newDigest); }); - // This is awkward, but I found returning `null` in this case to not produce an update - // I'd prefer a PR with the old digest (that I can manually patch) to no PR, so I made this decision. - it('ignores failures verifying currentDigest', async () => { - releaseMock.release(currentValue); + it('returns null if the new value/tag does not exist', async () => { const digest = await getDigest( { datasource: GithubReleasesDatasource.id, - depName, + packageName, currentValue, currentDigest, }, - currentValue + 'unknown-tag' ); - expect(digest).toEqual(currentDigest); + expect(digest).toBeNull(); }); }); }); diff --git a/lib/modules/datasource/github-releases/index.ts b/lib/modules/datasource/github-releases/index.ts index 346fe27e0adca0..11714a8593be37 100644 --- a/lib/modules/datasource/github-releases/index.ts +++ b/lib/modules/datasource/github-releases/index.ts @@ -1,17 +1,9 @@ -// TODO: types (#7154) import is from '@sindresorhus/is'; -import hasha from 'hasha'; import { logger } from '../../../logger'; -import { cache } from '../../../util/cache/package/decorator'; import { queryReleases } from '../../../util/github/graphql'; -import type { - GithubDigestFile, - GithubRestAsset, - GithubRestRelease, -} from '../../../util/github/types'; -import { getApiBaseUrl, getSourceUrl } from '../../../util/github/url'; +import { findCommitOfTag } from '../../../util/github/tags'; +import { getSourceUrl } from '../../../util/github/url'; import { GithubHttp } from '../../../util/http/github'; -import { newlineRegex, regEx } from '../../../util/regex'; import { Datasource } from '../datasource'; import type { DigestConfig, @@ -22,16 +14,6 @@ import type { export const cacheNamespace = 'datasource-github-releases'; -function inferHashAlg(digest: string): string { - switch (digest.length) { - case 64: - return 'sha256'; - default: - case 96: - return 'sha512'; - } -} - export class GithubReleasesDatasource extends Datasource { static readonly id = 'github-releases'; @@ -44,145 +26,17 @@ export class GithubReleasesDatasource extends Datasource { this.http = new GithubHttp(GithubReleasesDatasource.id); } - @cache({ - ttlMinutes: 1440, - namespace: 'datasource-github-releases', - key: (release: GithubRestRelease, digest: string) => - `${release.html_url}:${digest}`, - }) - async findDigestFile( - release: GithubRestRelease, - digest: string - ): Promise { - const smallAssets = release.assets.filter( - (a: GithubRestAsset) => a.size < 5 * 1024 - ); - for (const asset of smallAssets) { - const res = await this.http.get(asset.browser_download_url); - for (const line of res.body.split(newlineRegex)) { - const [lineDigest, lineFilename] = line.split(regEx(/\s+/), 2); - if (lineDigest === digest) { - return { - assetName: asset.name, - digestedFileName: lineFilename, - currentVersion: release.tag_name, - currentDigest: lineDigest, - }; - } - } - } - return null; - } - - @cache({ - ttlMinutes: 1440, - namespace: 'datasource-github-releases', - key: (asset: GithubRestAsset, algorithm: string) => - `${asset.browser_download_url}:${algorithm}:assetDigest`, - }) - async downloadAndDigest( - asset: GithubRestAsset, - algorithm: string - ): Promise { - const res = this.http.stream(asset.browser_download_url); - const digest = await hasha.fromStream(res, { algorithm }); - return digest; - } - - async findAssetWithDigest( - release: GithubRestRelease, - digest: string - ): Promise { - const algorithm = inferHashAlg(digest); - const assetsBySize = release.assets.sort( - (a: GithubRestAsset, b: GithubRestAsset) => { - if (a.size < b.size) { - return -1; - } - if (a.size > b.size) { - return 1; - } - return 0; - } - ); - - for (const asset of assetsBySize) { - const assetDigest = await this.downloadAndDigest(asset, algorithm); - if (assetDigest === digest) { - return { - assetName: asset.name, - currentVersion: release.tag_name, - currentDigest: assetDigest, - }; - } - } - return null; - } - - /** Identify the asset associated with a known digest. */ - async findDigestAsset( - release: GithubRestRelease, - digest: string - ): Promise { - const digestFile = await this.findDigestFile(release, digest); - if (digestFile) { - return digestFile; - } - - const asset = await this.findAssetWithDigest(release, digest); - return asset; - } - - /** Given a digest asset, find the equivalent digest in a different release. */ - async mapDigestAssetToRelease( - digestAsset: GithubDigestFile, - release: GithubRestRelease - ): Promise { - const current = digestAsset.currentVersion.replace(regEx(/^v/), ''); - const next = release.tag_name.replace(regEx(/^v/), ''); - const releaseChecksumAssetName = digestAsset.assetName.replace( - current, - next - ); - const releaseAsset = release.assets.find( - (a: GithubRestAsset) => a.name === releaseChecksumAssetName - ); - if (!releaseAsset) { - return null; - } - if (digestAsset.digestedFileName) { - const releaseFilename = digestAsset.digestedFileName.replace( - current, - next - ); - const res = await this.http.get(releaseAsset.browser_download_url); - for (const line of res.body.split(newlineRegex)) { - const [lineDigest, lineFn] = line.split(regEx(/\s+/), 2); - if (lineFn === releaseFilename) { - return lineDigest; - } - } - } else { - const algorithm = inferHashAlg(digestAsset.currentDigest); - const newDigest = await this.downloadAndDigest(releaseAsset, algorithm); - return newDigest; - } - return null; - } - /** - * github.getDigest + * Attempts to resolve the digest for the specified package. * - * The `newValue` supplied here should be a valid tag for the GitHub release. - * Requires `currentValue` and `currentDigest`. + * The `newValue` supplied here should be a valid tag for the GitHub release. The digest + * of a GitHub release will be the underlying SHA of the release tag. * - * There may be many assets attached to the release. This function will: - * - Identify the asset pinned by `currentDigest` in the `currentValue` release - * - Download small release assets, parse as checksum manifests (e.g. `SHASUMS.txt`). - * - Download individual assets until `currentDigest` is encountered. This is limited to sha256 and sha512. - * - Map the hashed asset to `newValue` and return the updated digest as a string + * Some managers like Bazel will deal with individual artifacts from releases and handle + * the artifact checksum computation separately. This data-source does not know about + * specific artifacts being used, as that could vary per manager */ - override async getDigest( + override getDigest( { packageName: repo, currentValue, @@ -195,37 +49,13 @@ export class GithubReleasesDatasource extends Datasource { { repo, currentValue, currentDigest, registryUrl, newValue }, 'getDigest' ); - if (!currentDigest) { - return null; - } - if (!currentValue) { - return currentDigest; - } - const apiBaseUrl = getApiBaseUrl(registryUrl); - const { body: currentRelease } = await this.http.getJson( - `${apiBaseUrl}repos/${repo}/releases/tags/${currentValue}` - ); - const digestAsset = await this.findDigestAsset( - currentRelease, - currentDigest - ); - let newDigest: string | null; - if (!digestAsset || newValue === currentValue) { - newDigest = currentDigest; - } else { - const { body: newRelease } = await this.http.getJson( - `${apiBaseUrl}repos/${repo}/releases/tags/${newValue}` - ); - newDigest = await this.mapDigestAssetToRelease(digestAsset, newRelease); - } - return newDigest; + return findCommitOfTag(registryUrl, repo, newValue, this.http); } /** - * github.getReleases - * - * This function can be used to fetch releases with a customisable versioning (e.g. semver) and with releases. + * This function can be used to fetch releases with a customizable versioning + * (e.g. semver) and with releases. * * This function will: * - Fetch all releases diff --git a/lib/modules/datasource/github-tags/index.spec.ts b/lib/modules/datasource/github-tags/index.spec.ts index 948a81857263aa..72ae3f11f2421b 100644 --- a/lib/modules/datasource/github-tags/index.spec.ts +++ b/lib/modules/datasource/github-tags/index.spec.ts @@ -114,7 +114,7 @@ describe('modules/datasource/github-tags/index', () => { }); describe('getReleases', () => { - const depName = 'some/dep2'; + const packageName = 'some/dep2'; it('returns tags', async () => { jest.spyOn(githubGraphql, 'queryTags').mockResolvedValueOnce([ @@ -152,7 +152,7 @@ describe('modules/datasource/github-tags/index', () => { }, ]); - const res = await getPkgReleases({ datasource: github.id, depName }); + const res = await getPkgReleases({ datasource: github.id, packageName }); expect(res).toEqual({ registryUrl: 'https://github.com', diff --git a/lib/modules/datasource/github-tags/index.ts b/lib/modules/datasource/github-tags/index.ts index 09d72813011716..f5e32f4f959403 100644 --- a/lib/modules/datasource/github-tags/index.ts +++ b/lib/modules/datasource/github-tags/index.ts @@ -2,6 +2,7 @@ import is from '@sindresorhus/is'; import { logger } from '../../../logger'; import { queryReleases, queryTags } from '../../../util/github/graphql'; import type { GithubReleaseItem } from '../../../util/github/graphql/types'; +import { findCommitOfTag } from '../../../util/github/tags'; import { getApiBaseUrl, getSourceUrl } from '../../../util/github/url'; import { GithubHttp } from '../../../util/http/github'; import { Datasource } from '../datasource'; @@ -24,42 +25,6 @@ export class GithubTagsDatasource extends Datasource { this.http = new GithubHttp(GithubTagsDatasource.id); } - async getTagCommit( - registryUrl: string | undefined, - packageName: string, - tag: string - ): Promise { - logger.trace(`github-tags.getTagCommit(${packageName}, ${tag})`); - try { - const tags = await queryTags({ packageName, registryUrl }, this.http); - // istanbul ignore if - if (!tags.length) { - logger.debug( - `github-tags.getTagCommit(): No tags found for ${packageName}` - ); - } - const tagItem = tags.find(({ version }) => version === tag); - if (tagItem) { - if (tagItem.hash) { - return tagItem.hash; - } - logger.debug( - `github-tags.getTagCommit(): Tag ${tag} has no hash for ${packageName}` - ); - } else { - logger.debug( - `github-tags.getTagCommit(): Tag ${tag} not found for ${packageName}` - ); - } - } catch (err) { - logger.debug( - { githubRepo: packageName, err }, - 'Error getting tag commit from GitHub repo' - ); - } - return null; - } - async getCommit( registryUrl: string | undefined, githubRepo: string @@ -91,7 +56,7 @@ export class GithubTagsDatasource extends Datasource { newValue?: string ): Promise { return newValue - ? this.getTagCommit(registryUrl, repo!, newValue) + ? findCommitOfTag(registryUrl, repo!, newValue, this.http) : this.getCommit(registryUrl, repo!); } diff --git a/lib/modules/datasource/gitlab-packages/index.spec.ts b/lib/modules/datasource/gitlab-packages/index.spec.ts index 697c2123c74ee3..366fd9a7cc51c7 100644 --- a/lib/modules/datasource/gitlab-packages/index.spec.ts +++ b/lib/modules/datasource/gitlab-packages/index.spec.ts @@ -39,7 +39,7 @@ describe('modules/datasource/gitlab-packages/index', () => { const res = await getPkgReleases({ datasource, registryUrls: ['https://gitlab.com'], - depName: 'user/project1:mypkg', + packageName: 'user/project1:mypkg', }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(3); @@ -58,7 +58,7 @@ describe('modules/datasource/gitlab-packages/index', () => { await getPkgReleases({ datasource, registryUrls: ['https://gitlab.com'], - depName: 'user/project1:mypkg', + packageName: 'user/project1:mypkg', }) ).toBeNull(); }); @@ -76,7 +76,7 @@ describe('modules/datasource/gitlab-packages/index', () => { await getPkgReleases({ datasource, registryUrls: ['https://gitlab.com'], - depName: 'user/project1:mypkg', + packageName: 'user/project1:mypkg', }) ).toBeNull(); }); @@ -94,7 +94,7 @@ describe('modules/datasource/gitlab-packages/index', () => { getPkgReleases({ datasource, registryUrls: ['https://gitlab.com'], - depName: 'user/project1:mypkg', + packageName: 'user/project1:mypkg', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); diff --git a/lib/modules/datasource/gitlab-packages/readme.md b/lib/modules/datasource/gitlab-packages/readme.md index e5fc0636d09a5e..54388f498c83ce 100644 --- a/lib/modules/datasource/gitlab-packages/readme.md +++ b/lib/modules/datasource/gitlab-packages/readme.md @@ -1,6 +1,6 @@ [GitLab Packages API](https://docs.gitlab.com/ee/api/packages.html) supports looking up package versions from [all types of packages registry supported by GitLab](https://docs.gitlab.com/ee/user/packages/package_registry/index.html) and can be used in combination with [regex managers](https://docs.renovatebot.com/modules/manager/regex/) to keep dependencies up-to-date which are not specifically supported by Renovate. -To specify which specific repository should be queried when looking up a package, the `depName` should be formed with the project path first, then a `:` and finally the package name. +To specify which specific repository should be queried when looking up a package, the `packageName` should be formed with the project path first, then a `:` and finally the package name. As an example, `gitlab-org/ci-cd/package-stage/feature-testing/new-packages-list:@gitlab-org/nk-js` would look for the`@gitlab-org/nk-js` packages in the generic packages repository of the `gitlab-org/ci-cd/package-stage/feature-testing/new-packages-list` project. diff --git a/lib/modules/datasource/gitlab-releases/index.spec.ts b/lib/modules/datasource/gitlab-releases/index.spec.ts index e0480cd0c7f5d2..2a1d498aa9c3b9 100644 --- a/lib/modules/datasource/gitlab-releases/index.spec.ts +++ b/lib/modules/datasource/gitlab-releases/index.spec.ts @@ -23,7 +23,7 @@ describe('modules/datasource/gitlab-releases/index', () => { const res = await getPkgReleases({ datasource: GitlabReleasesDatasource.id, registryUrls: ['https://gitlab.company.com'], - depName: 'some/dep2', + packageName: 'some/dep2', }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(2); @@ -36,7 +36,7 @@ describe('modules/datasource/gitlab-releases/index', () => { .reply(200, body); const res = await getPkgReleases({ datasource: GitlabReleasesDatasource.id, - depName: 'some/dep2', + packageName: 'some/dep2', }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(2); @@ -50,7 +50,7 @@ describe('modules/datasource/gitlab-releases/index', () => { expect( await getPkgReleases({ datasource: GitlabReleasesDatasource.id, - depName: 'some/dep2', + packageName: 'some/dep2', }) ).toBeNull(); }); diff --git a/lib/modules/datasource/gitlab-releases/readme.md b/lib/modules/datasource/gitlab-releases/readme.md index ae31ae31a00776..5b916841b8c993 100644 --- a/lib/modules/datasource/gitlab-releases/readme.md +++ b/lib/modules/datasource/gitlab-releases/readme.md @@ -1,6 +1,6 @@ [GitLab Releases API](https://docs.gitlab.com/ee/api/releases/) supports looking up [releases supported by GitLab](https://docs.gitlab.com/ee/user/project/releases/) and can be used in combination with [regex managers](https://docs.renovatebot.com/modules/manager/regex/) to keep dependencies up-to-date which are not specifically supported by Renovate. -To specify which specific repository should be queried when looking up a package, the `depName` should be set to the project path. +To specify which specific repository should be queried when looking up a package, the `packageName` should be set to the project path. As an example, `gitlab-org/ci-cd/package-stage/feature-testing/new-packages-list` would look for releases in the `gitlab-org/ci-cd/package-stage/feature-testing/new-packages-list` project. @@ -37,4 +37,4 @@ Now you may use comments in your `versions.ini` files to automatically update de NKJS_VERSION=3.4.0 ``` -By default, `gitlab-releases` uses the `semver` versioning scheme. +By default, `gitlab-releases` uses the `semver-coerced` versioning scheme. diff --git a/lib/modules/datasource/gitlab-tags/index.spec.ts b/lib/modules/datasource/gitlab-tags/index.spec.ts index 49467bd9b4263c..f9b333fe7e4587 100644 --- a/lib/modules/datasource/gitlab-tags/index.spec.ts +++ b/lib/modules/datasource/gitlab-tags/index.spec.ts @@ -29,7 +29,7 @@ describe('modules/datasource/gitlab-tags/index', () => { const res = await getPkgReleases({ datasource, registryUrls: ['https://gitlab.company.com/api/v4/'], - depName: 'some/dep2', + packageName: 'some/dep2', }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(3); @@ -58,7 +58,7 @@ describe('modules/datasource/gitlab-tags/index', () => { const res = await getPkgReleases({ datasource, registryUrls: ['https://my.company.com/gitlab'], - depName: 'some/dep2', + packageName: 'some/dep2', }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(3); @@ -72,7 +72,7 @@ describe('modules/datasource/gitlab-tags/index', () => { .reply(200, body); const res = await getPkgReleases({ datasource, - depName: 'some/dep2', + packageName: 'some/dep2', }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(2); @@ -94,7 +94,7 @@ describe('modules/datasource/gitlab-tags/index', () => { const res = await getDigest({ datasource, registryUrls: ['https://gitlab.company.com/api/v4/'], - depName: 'some/dep2', + packageName: 'some/dep2', }); expect(res).toBe(digest); }); @@ -112,7 +112,7 @@ describe('modules/datasource/gitlab-tags/index', () => { { datasource, registryUrls: ['https://gitlab.company.com/api/v4/'], - depName: 'some/dep2', + packageName: 'some/dep2', }, 'branch' ); @@ -127,7 +127,7 @@ describe('modules/datasource/gitlab-tags/index', () => { const res = await getDigest({ datasource, registryUrls: ['https://gitlab.company.com/api/v4/'], - depName: 'some/dep2', + packageName: 'some/dep2', }); expect(res).toBeNull(); }); @@ -141,7 +141,7 @@ describe('modules/datasource/gitlab-tags/index', () => { { datasource, registryUrls: ['https://gitlab.company.com/api/v4/'], - depName: 'some/dep2', + packageName: 'some/dep2', }, 'unknown-branch' ); diff --git a/lib/modules/datasource/gitlab-tags/readme.md b/lib/modules/datasource/gitlab-tags/readme.md index 881a9ebda937a3..d637c6042cdc24 100644 --- a/lib/modules/datasource/gitlab-tags/readme.md +++ b/lib/modules/datasource/gitlab-tags/readme.md @@ -1,6 +1,6 @@ [GitLab Tags API](https://docs.gitlab.com/ee/api/tags.html) supports looking up [Git tags](https://docs.gitlab.com/ee/topics/git/tags.html#tags) and can be used in combination with [regex managers](https://docs.renovatebot.com/modules/manager/regex/) to keep dependencies up-to-date which are not specifically supported by Renovate. -To specify which specific repository should be queried when looking up a package, the `depName` should be set to the project path. +To specify which specific repository should be queried when looking up a package, the `packageName` should be set to the project path. As an example, `gitlab-org/ci-cd/package-stage/feature-testing/new-packages-list` would look for releases in the `gitlab-org/ci-cd/package-stage/feature-testing/new-packages-list` project. @@ -32,4 +32,4 @@ Now you may use comments in your `versions.ini` files to automatically update de NKJS_VERSION=3.4.0 ``` -By default, `gitlab-tags` uses the `semver` versioning scheme. +By default, `gitlab-tags` uses the `semver-coerced` versioning scheme. diff --git a/lib/modules/datasource/go/__snapshots__/releases-direct.spec.ts.snap b/lib/modules/datasource/go/__snapshots__/releases-direct.spec.ts.snap index 40b52a688f5542..4e65ba27707cd4 100644 --- a/lib/modules/datasource/go/__snapshots__/releases-direct.spec.ts.snap +++ b/lib/modules/datasource/go/__snapshots__/releases-direct.spec.ts.snap @@ -31,7 +31,7 @@ exports[`modules/datasource/go/releases-direct getReleases support git 1`] = ` "version": "v2.0.0", }, ], - "sourceUrl": undefined, + "sourceUrl": null, } `; diff --git a/lib/modules/datasource/go/base.ts b/lib/modules/datasource/go/base.ts index c8e8e557388392..55327a369c98b7 100644 --- a/lib/modules/datasource/go/base.ts +++ b/lib/modules/datasource/go/base.ts @@ -7,7 +7,7 @@ import * as hostRules from '../../../util/host-rules'; import { Http } from '../../../util/http'; import { regEx } from '../../../util/regex'; import { trimLeadingSlash, trimTrailingSlash } from '../../../util/url'; -import { BitBucketTagsDatasource } from '../bitbucket-tags'; +import { BitbucketTagsDatasource } from '../bitbucket-tags'; import { GitTagsDatasource } from '../git-tags'; import { GithubTagsDatasource } from '../github-tags'; import { GitlabTagsDatasource } from '../gitlab-tags'; @@ -53,7 +53,7 @@ export class BaseGoDatasource { const split = goModule.split('/'); const packageName = split[1] + '/' + split[2]; return { - datasource: BitBucketTagsDatasource.id, + datasource: BitbucketTagsDatasource.id, packageName, registryUrl: 'https://bitbucket.org', }; diff --git a/lib/modules/datasource/go/common.ts b/lib/modules/datasource/go/common.ts index 049478ba49748a..593eca50b7522f 100644 --- a/lib/modules/datasource/go/common.ts +++ b/lib/modules/datasource/go/common.ts @@ -1,5 +1,5 @@ import { getSourceUrl as githubSourceUrl } from '../../../util/github/url'; -import { BitBucketTagsDatasource } from '../bitbucket-tags'; +import { BitbucketTagsDatasource } from '../bitbucket-tags'; import { GithubTagsDatasource } from '../github-tags'; import { GitlabTagsDatasource } from '../gitlab-tags'; import { getSourceUrl as gitlabSourceUrl } from '../gitlab-tags/util'; @@ -24,8 +24,8 @@ export function getSourceUrl( return gitlabSourceUrl(packageName, registryUrl); } - if (datasource === BitBucketTagsDatasource.id) { - return BitBucketTagsDatasource.getSourceUrl(packageName, registryUrl); + if (datasource === BitbucketTagsDatasource.id) { + return BitbucketTagsDatasource.getSourceUrl(packageName, registryUrl); } } diff --git a/lib/modules/datasource/go/index.spec.ts b/lib/modules/datasource/go/index.spec.ts index 170c1774e6a697..ab23fe6909d00b 100644 --- a/lib/modules/datasource/go/index.spec.ts +++ b/lib/modules/datasource/go/index.spec.ts @@ -53,25 +53,10 @@ describe('modules/datasource/go/index', () => { delete process.env.GOPROXY; }); - it('fetches release info directly from VCS', async () => { - const expected = { releases: [{ version: '0.0.1' }] }; - getReleasesProxyMock.mockResolvedValue(null); - getReleasesDirectMock.mockResolvedValue(expected); - - const res = await datasource.getReleases({ - packageName: 'golang.org/foo/bar', - }); - - expect(res).toBe(expected); - expect(getReleasesProxyMock).not.toHaveBeenCalled(); - expect(getReleasesDirectMock).toHaveBeenCalled(); - }); - - it('supports GOPROXY', async () => { + it('fetches releases', async () => { const expected = { releases: [{ version: '0.0.1' }] }; getReleasesProxyMock.mockResolvedValue(expected); getReleasesDirectMock.mockResolvedValue(null); - process.env.GOPROXY = 'https://proxy.golang.org,direct'; const res = await datasource.getReleases({ packageName: 'golang.org/foo/bar', diff --git a/lib/modules/datasource/go/index.ts b/lib/modules/datasource/go/index.ts index 6bd4934a63d1e0..4da9a69ae2bf8d 100644 --- a/lib/modules/datasource/go/index.ts +++ b/lib/modules/datasource/go/index.ts @@ -3,7 +3,7 @@ import { cache } from '../../../util/cache/package/decorator'; import { regEx } from '../../../util/regex'; import { addSecretForSanitizing } from '../../../util/sanitize'; import { parseUrl } from '../../../util/url'; -import { BitBucketTagsDatasource } from '../bitbucket-tags'; +import { BitbucketTagsDatasource } from '../bitbucket-tags'; import { Datasource } from '../datasource'; import { GitTagsDatasource } from '../git-tags'; import { GithubTagsDatasource } from '../github-tags'; @@ -36,9 +36,7 @@ export class GoDatasource extends Datasource { key: ({ packageName }: Partial) => `${packageName}-digest`, }) getReleases(config: GetReleasesConfig): Promise { - return process.env.GOPROXY - ? this.goproxy.getReleases(config) - : this.direct.getReleases(config); + return this.goproxy.getReleases(config); } /** @@ -78,7 +76,7 @@ export class GoDatasource extends Datasource { case GithubTagsDatasource.id: { return this.direct.github.getDigest(source, tag); } - case BitBucketTagsDatasource.id: { + case BitbucketTagsDatasource.id: { return this.direct.bitbucket.getDigest?.(source, tag) ?? null; } case GitlabTagsDatasource.id: { diff --git a/lib/modules/datasource/go/readme.md b/lib/modules/datasource/go/readme.md new file mode 100644 index 00000000000000..1546b270d1796c --- /dev/null +++ b/lib/modules/datasource/go/readme.md @@ -0,0 +1,5 @@ +This datasource will default to using the `GOPROXY` settings `https://proxy.golang.org,direct` if there is no value defined in environment variables. + +To override this default and use a different proxy, simply configure `GOPROXY` to an alternative setting in env. + +To override this default and stop using any proxy at all, set `GOPROXY` to the value `direct`. diff --git a/lib/modules/datasource/go/releases-direct.ts b/lib/modules/datasource/go/releases-direct.ts index 07171bef6fda1a..13950d682f5632 100644 --- a/lib/modules/datasource/go/releases-direct.ts +++ b/lib/modules/datasource/go/releases-direct.ts @@ -1,7 +1,7 @@ import { logger } from '../../../logger'; import { cache } from '../../../util/cache/package/decorator'; import { regEx } from '../../../util/regex'; -import { BitBucketTagsDatasource } from '../bitbucket-tags'; +import { BitbucketTagsDatasource } from '../bitbucket-tags'; import { Datasource } from '../datasource'; import { GitTagsDatasource } from '../git-tags'; import { GithubTagsDatasource } from '../github-tags'; @@ -16,14 +16,14 @@ export class GoDirectDatasource extends Datasource { git: GitTagsDatasource; github: GithubTagsDatasource; gitlab: GitlabTagsDatasource; - bitbucket: BitBucketTagsDatasource; + bitbucket: BitbucketTagsDatasource; constructor() { super(GoDirectDatasource.id); this.git = new GitTagsDatasource(); this.github = new GithubTagsDatasource(); this.gitlab = new GitlabTagsDatasource(); - this.bitbucket = new BitBucketTagsDatasource(); + this.bitbucket = new BitbucketTagsDatasource(); } /** @@ -70,7 +70,7 @@ export class GoDirectDatasource extends Datasource { res = await this.gitlab.getReleases(source); break; } - case BitBucketTagsDatasource.id: { + case BitbucketTagsDatasource.id: { res = await this.bitbucket.getReleases(source); break; } @@ -85,7 +85,7 @@ export class GoDirectDatasource extends Datasource { return null; } - const sourceUrl = getSourceUrl(source); + const sourceUrl = getSourceUrl(source) ?? null; /** * github.com/org/mod/submodule should be tagged as submodule/va.b.c diff --git a/lib/modules/datasource/go/releases-goproxy.spec.ts b/lib/modules/datasource/go/releases-goproxy.spec.ts index 4cbc7aa852300c..55250e597fadb4 100644 --- a/lib/modules/datasource/go/releases-goproxy.spec.ts +++ b/lib/modules/datasource/go/releases-goproxy.spec.ts @@ -285,6 +285,30 @@ describe('modules/datasource/go/releases-goproxy', () => { delete process.env.GOINSECURE; }); + it('handles direct', async () => { + process.env.GOPROXY = 'direct'; + + githubGetTags.mockResolvedValueOnce({ + releases: [ + { gitRef: 'v1.0.0', version: 'v1.0.0' }, + { gitRef: 'v1.0.1', version: 'v1.0.1' }, + ], + }); + githubGetReleases.mockResolvedValueOnce({ releases: [] }); + + const res = await datasource.getReleases({ + packageName: 'github.com/google/btree', + }); + + expect(res).toEqual({ + releases: [ + { gitRef: 'v1.0.0', version: 'v1.0.0' }, + { gitRef: 'v1.0.1', version: 'v1.0.1' }, + ], + sourceUrl: 'https://github.com/google/btree', + }); + }); + it('skips GONOPROXY and GOPRIVATE packages', async () => { process.env.GOPROXY = baseUrl; process.env.GOPRIVATE = 'github.com/google/*'; @@ -311,8 +335,6 @@ describe('modules/datasource/go/releases-goproxy', () => { }); it('fetches release data from goproxy', async () => { - process.env.GOPROXY = baseUrl; - httpMock .scope(`${baseUrl}/github.com/google/btree`) .get('/@v/list') diff --git a/lib/modules/datasource/go/releases-goproxy.ts b/lib/modules/datasource/go/releases-goproxy.ts index 000d2473e4ffbd..7d00bfaa18eb45 100644 --- a/lib/modules/datasource/go/releases-goproxy.ts +++ b/lib/modules/datasource/go/releases-goproxy.ts @@ -32,8 +32,10 @@ export class GoProxyDatasource extends Datasource { async getReleases(config: GetReleasesConfig): Promise { const { packageName } = config; logger.trace(`goproxy.getReleases(${packageName})`); - - const goproxy = process.env.GOPROXY; + const goproxy = process.env.GOPROXY ?? 'https://proxy.golang.org,direct'; + if (goproxy === 'direct') { + return this.direct.getReleases(config); + } const proxyList = this.parseGoproxy(goproxy); const noproxy = GoProxyDatasource.parseNoproxy(); @@ -90,7 +92,7 @@ export class GoProxyDatasource extends Datasource { const datasource = await BaseGoDatasource.getDatasource( packageName ); - const sourceUrl = getSourceUrl(datasource); + const sourceUrl = getSourceUrl(datasource) ?? null; result = { releases, sourceUrl }; } catch (err) { logger.trace({ err }, `Can't get datasource for ${packageName}`); @@ -159,11 +161,11 @@ export class GoProxyDatasource extends Datasource { }, asterisk: { match: '*', - value: (_: string) => '[^\\/]*', + value: (_: string) => '[^/]*', }, qmark: { match: '?', - value: (_: string) => '[^\\/]', + value: (_: string) => '[^/]', }, characterRangeOpen: { match: '[', diff --git a/lib/modules/datasource/golang-version/index.spec.ts b/lib/modules/datasource/golang-version/index.spec.ts index 03e876758e0f7a..092600d22f5719 100644 --- a/lib/modules/datasource/golang-version/index.spec.ts +++ b/lib/modules/datasource/golang-version/index.spec.ts @@ -23,7 +23,7 @@ describe('modules/datasource/golang-version/index', () => { .reply(200, golangReleasesContent); const res = await getPkgReleases({ datasource, - depName: 'golang', + packageName: 'golang', }); expect(res?.releases).toHaveLength(132); expect(res?.releases[0]).toEqual({ @@ -44,7 +44,7 @@ describe('modules/datasource/golang-version/index', () => { const res = await getPkgReleases({ ...config, datasource, - depName: 'golang', + packageName: 'golang', }); expect(res?.releases).toHaveLength(132); expect(res?.releases[0]).toEqual({ @@ -61,7 +61,7 @@ describe('modules/datasource/golang-version/index', () => { await expect( getPkgReleases({ datasource, - depName: 'golang', + packageName: 'golang', }) ).rejects.toThrow(ExternalHostError); }); @@ -74,7 +74,7 @@ describe('modules/datasource/golang-version/index', () => { await expect( getPkgReleases({ datasource, - depName: 'golang', + packageName: 'golang', }) ).rejects.toThrow(ExternalHostError); }); @@ -85,7 +85,7 @@ describe('modules/datasource/golang-version/index', () => { .get('/golang/website/HEAD/internal/history/release.go') .reply(200, {}); await expect( - getPkgReleases({ datasource, depName: 'golang' }) + getPkgReleases({ datasource, packageName: 'golang' }) ).rejects.toThrow(ExternalHostError); }); @@ -95,7 +95,7 @@ describe('modules/datasource/golang-version/index', () => { .get('/golang/website/HEAD/internal/history/release.go') .reply(200, golangReleasesInvalidContent3); await expect( - getPkgReleases({ datasource, depName: 'golang' }) + getPkgReleases({ datasource, packageName: 'golang' }) ).rejects.toThrow(ExternalHostError); }); @@ -105,7 +105,7 @@ describe('modules/datasource/golang-version/index', () => { .get('/golang/website/HEAD/internal/history/release.go') .reply(200, golangReleasesInvalidContent4); await expect( - getPkgReleases({ datasource, depName: 'golang' }) + getPkgReleases({ datasource, packageName: 'golang' }) ).rejects.toThrow(ExternalHostError); }); @@ -115,7 +115,7 @@ describe('modules/datasource/golang-version/index', () => { .get('/golang/website/HEAD/internal/history/release.go') .reply(404); expect( - await getPkgReleases({ datasource, depName: 'golang' }) + await getPkgReleases({ datasource, packageName: 'golang' }) ).toBeNull(); }); @@ -125,7 +125,7 @@ describe('modules/datasource/golang-version/index', () => { .get('/golang/website/HEAD/internal/history/release.go') .reply(200, golangReleasesInvalidContent5); await expect( - getPkgReleases({ datasource, depName: 'golang' }) + getPkgReleases({ datasource, packageName: 'golang' }) ).rejects.toThrow(ExternalHostError); }); @@ -135,7 +135,7 @@ describe('modules/datasource/golang-version/index', () => { .get('/golang/website/HEAD/internal/history/release.go') .reply(200, golangReleasesInvalidContent6); await expect( - getPkgReleases({ datasource, depName: 'golang' }) + getPkgReleases({ datasource, packageName: 'golang' }) ).rejects.toThrow(ExternalHostError); }); }); diff --git a/lib/modules/datasource/golang-version/index.ts b/lib/modules/datasource/golang-version/index.ts index d0cd118bbb055d..33a9959da861f2 100644 --- a/lib/modules/datasource/golang-version/index.ts +++ b/lib/modules/datasource/golang-version/index.ts @@ -67,7 +67,7 @@ export class GolangVersionDatasource extends Datasource { lines.splice(0, startOfReleases + 1); // Parse the release list - let release: Omit & { version?: string } = { + let release: Omit & { version?: string | undefined } = { version: undefined, }; let skipFutureRelease = false; diff --git a/lib/modules/datasource/gradle-version/index.spec.ts b/lib/modules/datasource/gradle-version/index.spec.ts index 37afff51b6317b..6bcd65dec8ad99 100644 --- a/lib/modules/datasource/gradle-version/index.spec.ts +++ b/lib/modules/datasource/gradle-version/index.spec.ts @@ -18,7 +18,7 @@ describe('modules/datasource/gradle-version/index', () => { config = { datasource, versioning, - depName: 'abc', + packageName: 'abc', }; }); diff --git a/lib/modules/datasource/helm/index.spec.ts b/lib/modules/datasource/helm/index.spec.ts index 3b75c57e6b82aa..c4dc79ae968b82 100644 --- a/lib/modules/datasource/helm/index.spec.ts +++ b/lib/modules/datasource/helm/index.spec.ts @@ -17,7 +17,7 @@ describe('modules/datasource/helm/index', () => { expect( await getPkgReleases({ datasource: HelmDatasource.id, - depName: undefined as never, // #7154 + packageName: undefined as never, // #7154 registryUrls: ['https://example-repository.com'], }) ).toBeNull(); @@ -32,7 +32,7 @@ describe('modules/datasource/helm/index', () => { expect( await getPkgReleases({ datasource: HelmDatasource.id, - depName: 'some_chart', + packageName: 'some_chart', registryUrls: [], }) ).toBeNull(); @@ -46,7 +46,7 @@ describe('modules/datasource/helm/index', () => { expect( await getPkgReleases({ datasource: HelmDatasource.id, - depName: 'non_existent_chart', + packageName: 'non_existent_chart', registryUrls: ['https://example-repository.com'], }) ).toBeNull(); @@ -60,7 +60,7 @@ describe('modules/datasource/helm/index', () => { expect( await getPkgReleases({ datasource: HelmDatasource.id, - depName: 'non_existent_chart', + packageName: 'non_existent_chart', registryUrls: ['https://example-repository.com'], }) ).toBeNull(); @@ -74,7 +74,7 @@ describe('modules/datasource/helm/index', () => { expect( await getPkgReleases({ datasource: HelmDatasource.id, - depName: 'some_chart', + packageName: 'some_chart', registryUrls: ['https://example-repository.com'], }) ).toBeNull(); @@ -88,7 +88,7 @@ describe('modules/datasource/helm/index', () => { await expect( getPkgReleases({ datasource: HelmDatasource.id, - depName: 'some_chart', + packageName: 'some_chart', registryUrls: ['https://example-repository.com'], }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); @@ -102,7 +102,7 @@ describe('modules/datasource/helm/index', () => { expect( await getPkgReleases({ datasource: HelmDatasource.id, - depName: 'some_chart', + packageName: 'some_chart', registryUrls: ['https://example-repository.com'], }) ).toBeNull(); @@ -115,7 +115,7 @@ describe('modules/datasource/helm/index', () => { .reply(200, '# A comment'); const releases = await getPkgReleases({ datasource: HelmDatasource.id, - depName: 'non_existent_chart', + packageName: 'non_existent_chart', registryUrls: ['https://example-repository.com'], }); expect(releases).toBeNull(); @@ -134,7 +134,7 @@ describe('modules/datasource/helm/index', () => { .reply(200, res); const releases = await getPkgReleases({ datasource: HelmDatasource.id, - depName: 'non_existent_chart', + packageName: 'non_existent_chart', registryUrls: ['https://example-repository.com'], }); expect(releases).toBeNull(); @@ -147,7 +147,7 @@ describe('modules/datasource/helm/index', () => { .reply(200, indexYaml); const releases = await getPkgReleases({ datasource: HelmDatasource.id, - depName: 'non_existent_chart', + packageName: 'non_existent_chart', registryUrls: ['https://example-repository.com'], }); expect(releases).toBeNull(); @@ -160,7 +160,7 @@ describe('modules/datasource/helm/index', () => { .reply(200, indexYaml); const releases = await getPkgReleases({ datasource: HelmDatasource.id, - depName: 'ambassador', + packageName: 'ambassador', registryUrls: ['https://example-repository.com'], }); expect(releases).not.toBeNull(); @@ -174,7 +174,7 @@ describe('modules/datasource/helm/index', () => { .reply(200, indexYaml); const res = await getPkgReleases({ datasource: HelmDatasource.id, - depName: 'ambassador', + packageName: 'ambassador', registryUrls: ['https://example-repository.com/subdir'], }); diff --git a/lib/modules/datasource/hermit/index.ts b/lib/modules/datasource/hermit/index.ts index f2015d3385674b..cb95421f5fe3f7 100644 --- a/lib/modules/datasource/hermit/index.ts +++ b/lib/modules/datasource/hermit/index.ts @@ -34,7 +34,7 @@ export class HermitDatasource extends Datasource { constructor() { super(HermitDatasource.id); this.http = new GithubHttp(id); - this.pathRegex = regEx('^\\/(?[^/]+)\\/(?[^/]+)$'); + this.pathRegex = regEx('^/(?[^/]+)/(?[^/]+)$'); } @cache({ diff --git a/lib/modules/datasource/hex/index.spec.ts b/lib/modules/datasource/hex/index.spec.ts index 1e8401d8cfa0c7..609220fc7a5055 100644 --- a/lib/modules/datasource/hex/index.spec.ts +++ b/lib/modules/datasource/hex/index.spec.ts @@ -29,7 +29,7 @@ describe('modules/datasource/hex/index', () => { expect( await getPkgReleases({ datasource, - depName: 'non_existent_package', + packageName: 'non_existent_package', }) ).toBeNull(); }); @@ -42,7 +42,7 @@ describe('modules/datasource/hex/index', () => { expect( await getPkgReleases({ datasource, - depName: 'non_existent_package', + packageName: 'non_existent_package', }) ).toBeNull(); }); @@ -50,35 +50,35 @@ describe('modules/datasource/hex/index', () => { it('returns null for 404', async () => { httpMock.scope(baseUrl).get('/packages/some_package').reply(404); expect( - await getPkgReleases({ datasource, depName: 'some_package' }) + await getPkgReleases({ datasource, packageName: 'some_package' }) ).toBeNull(); }); it('returns null for 401', async () => { httpMock.scope(baseUrl).get('/packages/some_package').reply(401); expect( - await getPkgReleases({ datasource, depName: 'some_package' }) + await getPkgReleases({ datasource, packageName: 'some_package' }) ).toBeNull(); }); it('throws for 429', async () => { httpMock.scope(baseUrl).get('/packages/some_crate').reply(429); await expect( - getPkgReleases({ datasource, depName: 'some_crate' }) + getPkgReleases({ datasource, packageName: 'some_crate' }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); it('throws for 5xx', async () => { httpMock.scope(baseUrl).get('/packages/some_crate').reply(502); await expect( - getPkgReleases({ datasource, depName: 'some_crate' }) + getPkgReleases({ datasource, packageName: 'some_crate' }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); it('returns null for unknown error', async () => { httpMock.scope(baseUrl).get('/packages/some_package').replyWithError(''); expect( - await getPkgReleases({ datasource, depName: 'some_package' }) + await getPkgReleases({ datasource, packageName: 'some_package' }) ).toBeNull(); }); @@ -99,7 +99,7 @@ describe('modules/datasource/hex/index', () => { const res = await getPkgReleases({ datasource, - depName: 'certifi', + packageName: 'certifi', }); expect(res).toBeNull(); @@ -112,7 +112,7 @@ describe('modules/datasource/hex/index', () => { .reply(200, certifiResponse); const res = await getPkgReleases({ datasource, - depName: 'certifi', + packageName: 'certifi', }); expect(res).toMatchSnapshot(); expect(res).not.toBeNull(); @@ -127,7 +127,7 @@ describe('modules/datasource/hex/index', () => { hostRules.find.mockReturnValueOnce({}); const res = await getPkgReleases({ datasource, - depName: 'certifi', + packageName: 'certifi', }); expect(res).toMatchSnapshot(); expect(res).not.toBeNull(); @@ -151,7 +151,7 @@ describe('modules/datasource/hex/index', () => { const result = await getPkgReleases({ datasource, - depName: 'private_package:renovate_test', + packageName: 'private_package:renovate_test', }); expect(result).toMatchSnapshot(); diff --git a/lib/modules/datasource/hexpm-bob/index.spec.ts b/lib/modules/datasource/hexpm-bob/index.spec.ts index 79b8e6f922e655..25969936b410fa 100644 --- a/lib/modules/datasource/hexpm-bob/index.spec.ts +++ b/lib/modules/datasource/hexpm-bob/index.spec.ts @@ -14,7 +14,7 @@ describe('modules/datasource/hexpm-bob/index', () => { await expect( getPkgReleases({ datasource, - depName: 'elixir', + packageName: 'elixir', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -27,7 +27,7 @@ describe('modules/datasource/hexpm-bob/index', () => { expect( await getPkgReleases({ datasource, - depName: 'elixir', + packageName: 'elixir', }) ).toBeNull(); }); @@ -40,7 +40,7 @@ describe('modules/datasource/hexpm-bob/index', () => { expect( await getPkgReleases({ datasource, - depName: 'elixir', + packageName: 'elixir', }) ).toBeNull(); }); @@ -53,7 +53,7 @@ describe('modules/datasource/hexpm-bob/index', () => { expect( await getPkgReleases({ datasource, - depName: 'elixir', + packageName: 'elixir', }) ).toBeNull(); }); @@ -66,7 +66,7 @@ describe('modules/datasource/hexpm-bob/index', () => { await expect( getPkgReleases({ datasource, - depName: 'elixir', + packageName: 'elixir', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -78,7 +78,7 @@ describe('modules/datasource/hexpm-bob/index', () => { .reply(200, Fixtures.get('elixir/builds.txt')); const res = await getPkgReleases({ datasource, - depName: 'elixir', + packageName: 'elixir', }); expect(res).toEqual({ homepage: 'https://elixir-lang.org/', @@ -126,7 +126,7 @@ describe('modules/datasource/hexpm-bob/index', () => { .reply(200, Fixtures.get('otp/ubuntu-20.04/builds.txt')); const res = await getPkgReleases({ datasource, - depName: 'otp/ubuntu-20.04', + packageName: 'otp/ubuntu-20.04', versioning: 'regex:^(?\\d+?)\\.(?\\d+?)(\\.(?\\d+))?$', }); @@ -162,7 +162,7 @@ describe('modules/datasource/hexpm-bob/index', () => { const res = await getPkgReleases({ datasource, - depName: 'otp/ubuntu-20.04', + packageName: 'otp/ubuntu-20.04', registryUrls: [registryUrl], }); @@ -173,7 +173,7 @@ describe('modules/datasource/hexpm-bob/index', () => { expect( await getPkgReleases({ datasource, - depName: 'invalid', + packageName: 'invalid', }) ).toBeNull(); }); diff --git a/lib/modules/datasource/index.spec.ts b/lib/modules/datasource/index.spec.ts index 3202864da0a583..8b8dac55d090c1 100644 --- a/lib/modules/datasource/index.spec.ts +++ b/lib/modules/datasource/index.spec.ts @@ -24,7 +24,7 @@ import { } from '.'; const datasource = 'dummy'; -const depName = 'package'; +const packageName = 'package'; type RegistriesMock = Record< string, @@ -35,6 +35,7 @@ const defaultRegistriesMock: RegistriesMock = { }; class DummyDatasource extends Datasource { + override defaultVersioning = 'python'; override defaultRegistryUrls = ['https://reg1.com']; constructor(private registriesMock: RegistriesMock = defaultRegistriesMock) { @@ -171,17 +172,17 @@ describe('modules/datasource/index', () => { expect( await getPkgReleases({ datasource: null as never, // #7154 - depName: 'some/dep', + packageName: 'some/dep', }) ).toBeNull(); }); - it('returns null for no depName', async () => { + it('returns null for no packageName', async () => { datasources.set(datasource, new DummyDatasource()); expect( await getPkgReleases({ datasource, - depName: null as never, // #7154 + packageName: null as never, // #7154 }) ).toBeNull(); }); @@ -190,7 +191,7 @@ describe('modules/datasource/index', () => { expect( await getPkgReleases({ datasource: 'some-unknown-datasource', - depName: 'some/dep', + packageName: 'some/dep', }) ).toBeNull(); }); @@ -202,7 +203,11 @@ describe('modules/datasource/index', () => { datasources.set(datasource, new TestDatasource()); const registryUrls = ['https://foo.bar']; - const res = await getPkgReleases({ datasource, depName, registryUrls }); + const res = await getPkgReleases({ + datasource, + packageName, + registryUrls, + }); expect(logger.logger.warn).toHaveBeenCalledWith( { datasource: 'dummy', registryUrls, defaultRegistryUrls: undefined }, @@ -227,7 +232,7 @@ describe('modules/datasource/index', () => { datasources.set(datasource, new TestDatasource()); expect(supportsDigests(datasource)).toBeTrue(); - expect(await getDigest({ datasource, depName })).toBe('123'); + expect(await getDigest({ datasource, packageName })).toBe('123'); }); it('returns replacementName if defined', async () => { @@ -245,7 +250,6 @@ describe('modules/datasource/index', () => { await getDigest({ datasource, packageName: 'pkgName', - depName, replacementName: 'replacement', }) ).toBe('replacement'); @@ -258,13 +262,13 @@ describe('modules/datasource/index', () => { }); it('adds changelogUrl', async () => { - expect(await getPkgReleases({ datasource, depName })).toMatchObject({ + expect(await getPkgReleases({ datasource, packageName })).toMatchObject({ changelogUrl: 'https://foo.bar/package/CHANGELOG.md', }); }); it('adds sourceUrl', async () => { - expect(await getPkgReleases({ datasource, depName })).toMatchObject({ + expect(await getPkgReleases({ datasource, packageName })).toMatchObject({ sourceUrl: 'https://foo.bar/package', }); }); @@ -279,7 +283,7 @@ describe('modules/datasource/index', () => { const res = await getPkgReleases({ datasource, - depName, + packageName, defaultRegistryUrls: ['https://foo.bar'], }); expect(res).toMatchObject({ releases: [{ version: '0.0.1' }] }); @@ -289,7 +293,7 @@ describe('modules/datasource/index', () => { datasources.set(datasource, new DummyDatasource2()); const res = await getPkgReleases({ datasource, - depName, + packageName, }); expect(res).toMatchObject({ releases: [{ version: '1.2.3' }], @@ -301,7 +305,7 @@ describe('modules/datasource/index', () => { datasources.set(datasource, new DummyDatasource3()); const res = await getPkgReleases({ datasource, - depName, + packageName, }); expect(res).toMatchObject({ releases: [{ version: '1.2.3' }], @@ -319,7 +323,7 @@ describe('modules/datasource/index', () => { const res = await getPkgReleases({ datasource, - depName, + packageName, extractVersion: '^(?v\\d+\\.\\d+)', versioning: 'loose', }); @@ -338,7 +342,7 @@ describe('modules/datasource/index', () => { ); const res = await getPkgReleases({ datasource, - depName: 'foobar', + packageName: 'foobar', }); expect(res).toMatchObject({ sourceUrl: 'https://abc.com' }); }); @@ -355,7 +359,7 @@ describe('modules/datasource/index', () => { ); const res = await getPkgReleases({ datasource, - depName: 'foobar', + packageName: 'foobar', }); expect(res).toMatchObject({ sourceUrl: 'https://github.com/Jasig/cas' }); }); @@ -364,7 +368,7 @@ describe('modules/datasource/index', () => { datasources.set(datasource, new DummyDatasource()); const res = await getPkgReleases({ datasource, - depName, + packageName, replacementName: 'def', replacementVersion: '2.0.0', }); @@ -385,7 +389,7 @@ describe('modules/datasource/index', () => { const res = await getPkgReleases({ datasource, - depName, + packageName, registryUrls: ['https://reg1.com'], }); @@ -407,7 +411,7 @@ describe('modules/datasource/index', () => { const res = await getPkgReleases({ datasource, - depName, + packageName, registryUrls, }); @@ -418,7 +422,7 @@ describe('modules/datasource/index', () => { expect(logger.logger.warn).toHaveBeenCalledWith( { datasource: 'dummy', - depName: 'package', + packageName: 'package', registryUrls, }, 'Excess registryUrls found for datasource lookup - using first configured only' @@ -435,13 +439,13 @@ describe('modules/datasource/index', () => { const res = await getPkgReleases({ datasource, - depName, + packageName, registryUrls, }); expect(res).toBeNull(); expect(logger.logger.warn).toHaveBeenCalledWith( - { datasource, depName, registryUrls }, + { datasource, packageName, registryUrls }, 'Excess registryUrls found for datasource lookup - using first configured only' ); }); @@ -478,7 +482,7 @@ describe('modules/datasource/index', () => { }); it('merges custom defaultRegistryUrls and returns success', async () => { - const res = await getPkgReleases({ datasource, depName }); + const res = await getPkgReleases({ datasource, packageName }); expect(res).toMatchObject({ releases: [ @@ -491,7 +495,7 @@ describe('modules/datasource/index', () => { it('ignores custom defaultRegistryUrls if registrUrls are set', async () => { const res = await getPkgReleases({ datasource, - depName, + packageName, defaultRegistryUrls: ['https://reg3.com'], registryUrls: ['https://reg1.com', 'https://reg2.com'], }); @@ -507,7 +511,7 @@ describe('modules/datasource/index', () => { it('merges registries and returns success', async () => { const res = await getPkgReleases({ datasource, - depName, + packageName, registryUrls: ['https://reg1.com', 'https://reg2.com'], }); expect(res).toMatchObject({ @@ -522,7 +526,7 @@ describe('modules/datasource/index', () => { await expect( getPkgReleases({ datasource, - depName, + packageName, registryUrls: [ 'https://reg1.com', 'https://reg2.com', @@ -536,7 +540,7 @@ describe('modules/datasource/index', () => { expect( await getPkgReleases({ datasource, - depName, + packageName, registryUrls: ['https://reg4.com', 'https://reg5.com'], }) ).toBeNull(); @@ -563,7 +567,7 @@ describe('modules/datasource/index', () => { const res = await getPkgReleases({ datasource, - depName, + packageName, registryUrls, }); @@ -585,7 +589,7 @@ describe('modules/datasource/index', () => { const res = await getPkgReleases({ datasource, - depName, + packageName, registryUrls, }); @@ -603,7 +607,7 @@ describe('modules/datasource/index', () => { datasources.set(datasource, new HuntRegistriyDatasource(registries)); await expect( - getPkgReleases({ datasource, depName, registryUrls }) + getPkgReleases({ datasource, packageName, registryUrls }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -621,13 +625,122 @@ describe('modules/datasource/index', () => { const res = await getPkgReleases({ datasource, - depName, + packageName, registryUrls, }); expect(res).toBeNull(); }); }); + + describe('relaseConstraintFiltering', () => { + it('keeps all releases by default', async () => { + const registries = { + 'https://foo.bar': { + releases: [ + { + version: '0.0.1', + constraints: { + python: ['2.7'], + }, + }, + { + version: '0.0.2', + }, + ], + }, + } satisfies RegistriesMock; + datasources.set(datasource, new DummyDatasource(registries)); + const res = await getPkgReleases({ + datasource, + packageName, + defaultRegistryUrls: ['https://foo.bar'], + }); + expect(res).toMatchObject({ + releases: [{ version: '0.0.1' }, { version: '0.0.2' }], + }); + }); + + it('keeps all releases if constraints is set but no value defined for constraintsFiltering', async () => { + const registries = { + 'https://foo.bar': { + releases: [ + { + version: '0.0.1', + constraints: { + python: ['2.7'], + }, + }, + { + version: '0.0.2', + }, + ], + }, + } satisfies RegistriesMock; + datasources.set(datasource, new DummyDatasource(registries)); + const res = await getPkgReleases({ + datasource, + packageName, + defaultRegistryUrls: ['https://foo.bar'], + constraints: { + python: '2.7.0', + }, + }); + expect(res).toMatchObject({ + releases: [{ version: '0.0.1' }, { version: '0.0.2' }], + }); + }); + + it('filters releases if value is strict', async () => { + const registries = { + 'https://foo.bar': { + releases: [ + { + version: '0.0.5', + constraints: { + python: ['>= 3.0.0, < 4.0'], + }, + }, + { + version: '0.0.4', + constraints: { + python: ['>= 2.7, < 4.0'], + }, + }, + { + version: '0.0.3', + constraints: { + python: ['>= 2.7, < 3.0'], + }, + }, + { + version: '0.0.2', + constraints: { + python: ['2.7'], + }, + }, + { + version: '0.0.1', + constraints: { + python: ['1.0'], + }, + }, + ], + }, + } satisfies RegistriesMock; + datasources.set(datasource, new DummyDatasource(registries)); + const res = await getPkgReleases({ + datasource, + packageName, + defaultRegistryUrls: ['https://foo.bar'], + constraints: { python: '>= 2.7, < 3.0' }, + constraintsFiltering: 'strict', + }); + expect(res).toMatchObject({ + releases: [{ version: '0.0.3' }, { version: '0.0.4' }], + }); + }); + }); }); }); }); diff --git a/lib/modules/datasource/index.ts b/lib/modules/datasource/index.ts index dd0d5f198228cc..34e3b652743a38 100644 --- a/lib/modules/datasource/index.ts +++ b/lib/modules/datasource/index.ts @@ -90,7 +90,11 @@ function firstRegistry( ): Promise { if (registryUrls.length > 1) { logger.warn( - { datasource: datasource.id, depName: config.depName, registryUrls }, + { + datasource: datasource.id, + packageName: config.packageName, + registryUrls, + }, 'Excess registryUrls found for datasource lookup - using first configured only' ); } @@ -278,6 +282,7 @@ async function fetchReleases( const datasource = getDatasourceFor(datasourceName); // istanbul ignore if: needs test if (!datasource) { + logger.warn({ datasource: datasourceName }, 'Unknown datasource'); return null; } registryUrls = resolveRegistryUrls( @@ -342,7 +347,7 @@ export async function getPkgReleases( logger.warn('No datasource found'); return null; } - const packageName = config.packageName ?? config.depName; + const packageName = config.packageName; if (!packageName) { logger.error({ config }, 'Datasource getReleases without packageName'); return null; @@ -395,26 +400,29 @@ export async function getPkgReleases( (findRelease) => findRelease.version === filterRelease.version ) === filterIndex ); - // Filter releases for compatibility - for (const [constraintName, constraintValue] of Object.entries( - config.constraints ?? {} - )) { - // Currently we only support if the constraint is a plain version - // TODO: Support range/range compatibility filtering #8476 - if (version.isVersion(constraintValue)) { - res.releases = res.releases.filter((release) => { - const constraint = release.constraints?.[constraintName]; - if (!is.nonEmptyArray(constraint)) { - // A release with no constraints is OK - return true; - } - return constraint.some( - // If any of the release's constraints match, then it's OK - (releaseConstraint) => - !releaseConstraint || - version.matches(constraintValue, releaseConstraint) - ); - }); + if (config?.constraintsFiltering === 'strict') { + // Filter releases for compatibility + for (const [constraintName, constraintValue] of Object.entries( + config.constraints ?? {} + )) { + if (version.isValid(constraintValue)) { + res.releases = res.releases.filter((release) => { + const constraint = release.constraints?.[constraintName]; + if (!is.nonEmptyArray(constraint)) { + // A release with no constraints is OK + return true; + } + + return constraint.some( + // If the constraint value is a subset of any release's constraints, then it's OK + // fallback to release's constraint match if subset is not supported by versioning + (releaseConstraint) => + !releaseConstraint || + (version.subset?.(constraintValue, releaseConstraint) ?? + version.matches(constraintValue, releaseConstraint)) + ); + }); + } } } // Strip constraints from releases result @@ -434,8 +442,7 @@ function getDigestConfig( config: GetDigestInputConfig ): DigestConfig { const { currentValue, currentDigest } = config; - const packageName = - config.replacementName ?? config.packageName ?? config.depName; + const packageName = config.replacementName ?? config.packageName; const [registryUrl] = resolveRegistryUrls( datasource, config.defaultRegistryUrls, diff --git a/lib/modules/datasource/java-version/index.spec.ts b/lib/modules/datasource/java-version/index.spec.ts index d660e43a8fb297..a383933bde5187 100644 --- a/lib/modules/datasource/java-version/index.spec.ts +++ b/lib/modules/datasource/java-version/index.spec.ts @@ -9,7 +9,7 @@ function getPath(page: number, imageType = 'jdk'): string { return `/v3/info/release_versions?page_size=${pageSize}&image_type=${imageType}&project=jdk&release_type=ga&sort_method=DATE&sort_order=DESC&page=${page}`; } -const depName = 'java'; +const packageName = 'java'; describe('modules/datasource/java-version/index', () => { describe('getReleases', () => { @@ -21,7 +21,7 @@ describe('modules/datasource/java-version/index', () => { await expect( getPkgReleases({ datasource, - depName, + packageName, }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -31,7 +31,7 @@ describe('modules/datasource/java-version/index', () => { expect( await getPkgReleases({ datasource, - depName, + packageName, }) ).toBeNull(); }); @@ -41,7 +41,7 @@ describe('modules/datasource/java-version/index', () => { expect( await getPkgReleases({ datasource, - depName, + packageName, }) ).toBeNull(); }); @@ -54,7 +54,7 @@ describe('modules/datasource/java-version/index', () => { expect( await getPkgReleases({ datasource, - depName, + packageName, }) ).toBeNull(); }); @@ -64,7 +64,7 @@ describe('modules/datasource/java-version/index', () => { await expect( getPkgReleases({ datasource, - depName, + packageName, }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -76,7 +76,7 @@ describe('modules/datasource/java-version/index', () => { .reply(200, Fixtures.get('page.json')); const res = await getPkgReleases({ datasource, - depName, + packageName, }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(3); @@ -89,7 +89,7 @@ describe('modules/datasource/java-version/index', () => { .reply(200, Fixtures.get('jre.json')); const res = await getPkgReleases({ datasource, - depName: 'java-jre', + packageName: 'java-jre', }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(2); @@ -107,7 +107,7 @@ describe('modules/datasource/java-version/index', () => { .reply(404); const res = await getPkgReleases({ datasource, - depName, + packageName, }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(50); diff --git a/lib/modules/datasource/jenkins-plugins/index.spec.ts b/lib/modules/datasource/jenkins-plugins/index.spec.ts index 00a0681a19eaca..19b5af60ceeef7 100644 --- a/lib/modules/datasource/jenkins-plugins/index.spec.ts +++ b/lib/modules/datasource/jenkins-plugins/index.spec.ts @@ -12,7 +12,7 @@ describe('modules/datasource/jenkins-plugins/index', () => { const params = { versioning: versioning.id, datasource: JenkinsPluginsDatasource.id, - depName: 'email-ext', + packageName: 'email-ext', registryUrls: ['https://updates.jenkins.io/'], }; @@ -24,7 +24,7 @@ describe('modules/datasource/jenkins-plugins/index', () => { it('returns null for a package miss', async () => { const newparams = { ...params }; - newparams.depName = 'non-existing'; + newparams.packageName = 'non-existing'; httpMock .scope('https://updates.jenkins.io') diff --git a/lib/modules/datasource/kubernetes-api/index.spec.ts b/lib/modules/datasource/kubernetes-api/index.spec.ts index 73542d86e26d4b..d4b2a954e4ca93 100644 --- a/lib/modules/datasource/kubernetes-api/index.spec.ts +++ b/lib/modules/datasource/kubernetes-api/index.spec.ts @@ -6,14 +6,14 @@ const datasource = KubernetesApiDatasource.id; describe('modules/datasource/kubernetes-api/index', () => { describe('getReleases', () => { it('returns null for an unknown Kubernetes API type', async () => { - const res = await getPkgReleases({ datasource, depName: 'Unknown' }); + const res = await getPkgReleases({ datasource, packageName: 'Unknown' }); expect(res).toBeNull(); }); it('returns for a known Kubernetes API type', async () => { const res = await getPkgReleases({ datasource, - depName: 'CSIStorageCapacity', + packageName: 'CSIStorageCapacity', }); expect(res).not.toBeNull(); expect(res).toStrictEqual({ @@ -27,7 +27,7 @@ describe('modules/datasource/kubernetes-api/index', () => { it('is case sensitive', async () => { const res = await getPkgReleases({ datasource, - depName: 'csistoragecapacity', + packageName: 'csistoragecapacity', }); expect(res).toBeNull(); }); diff --git a/lib/modules/datasource/maven/index.spec.ts b/lib/modules/datasource/maven/index.spec.ts index 78cb193587e1d6..0366e8b408d331 100644 --- a/lib/modules/datasource/maven/index.spec.ts +++ b/lib/modules/datasource/maven/index.spec.ts @@ -162,10 +162,10 @@ function mockGenericPackage(opts: MockOpts = {}) { } function get( - depName = 'org.example:package', + packageName = 'org.example:package', ...registryUrls: string[] ): Promise { - const conf = { versioning, datasource, depName }; + const conf = { versioning, datasource, packageName }; return getPkgReleases(registryUrls ? { ...conf, registryUrls } : conf); } diff --git a/lib/modules/datasource/maven/index.ts b/lib/modules/datasource/maven/index.ts index 19e327ec7dd365..a257edfcdeb526 100644 --- a/lib/modules/datasource/maven/index.ts +++ b/lib/modules/datasource/maven/index.ts @@ -53,7 +53,7 @@ function extractVersions(metadata: XmlDocument): string[] { } const mavenCentralHtmlVersionRegex = regEx( - '^(?:[^"]+)\\/<\\/a>\\s+(?\\d\\d\\d\\d-\\d\\d-\\d\\d \\d\\d:\\d\\d)\\s+-$', + '^(?:[^"]+)/\\s+(?\\d\\d\\d\\d-\\d\\d-\\d\\d \\d\\d:\\d\\d)\\s+-$', 'i' ); diff --git a/lib/modules/datasource/maven/s3.spec.ts b/lib/modules/datasource/maven/s3.spec.ts index 6fa44058decc22..0952dad7488645 100644 --- a/lib/modules/datasource/maven/s3.spec.ts +++ b/lib/modules/datasource/maven/s3.spec.ts @@ -18,10 +18,10 @@ const datasource = MavenDatasource.id; const baseUrlS3 = 's3://repobucket'; function get( - depName = 'org.example:package', + packageName = 'org.example:package', ...registryUrls: string[] ): Promise { - const conf = { versioning, datasource, depName }; + const conf = { versioning, datasource, packageName }; return getPkgReleases(registryUrls ? { ...conf, registryUrls } : conf); } diff --git a/lib/modules/datasource/node/index.spec.ts b/lib/modules/datasource/node/index.spec.ts index 234b60e39a8db0..1a68ce8a7506e4 100644 --- a/lib/modules/datasource/node/index.spec.ts +++ b/lib/modules/datasource/node/index.spec.ts @@ -11,7 +11,7 @@ describe('modules/datasource/node/index', () => { await expect( getPkgReleases({ datasource, - depName: 'node', + packageName: 'node', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -24,7 +24,7 @@ describe('modules/datasource/node/index', () => { expect( await getPkgReleases({ datasource, - depName: 'node', + packageName: 'node', }) ).toBeNull(); }); @@ -34,7 +34,7 @@ describe('modules/datasource/node/index', () => { expect( await getPkgReleases({ datasource, - depName: 'node', + packageName: 'node', }) ).toBeNull(); }); @@ -46,7 +46,7 @@ describe('modules/datasource/node/index', () => { .reply(200, Fixtures.get('index.json')); const res = await getPkgReleases({ datasource, - depName: 'node', + packageName: 'node', }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(64); diff --git a/lib/modules/datasource/npm/__snapshots__/index.spec.ts.snap b/lib/modules/datasource/npm/__snapshots__/index.spec.ts.snap index 1eb91eb9fcbdb6..6b9b5b78f2eb9d 100644 --- a/lib/modules/datasource/npm/__snapshots__/index.spec.ts.snap +++ b/lib/modules/datasource/npm/__snapshots__/index.spec.ts.snap @@ -2,6 +2,7 @@ exports[`modules/datasource/npm/index should fetch package info from custom registry 1`] = ` { + "isPrivate": true, "name": "foobar", "registryUrl": "https://npm.mycustomregistry.com", "releases": [ @@ -25,6 +26,7 @@ exports[`modules/datasource/npm/index should fetch package info from custom regi exports[`modules/datasource/npm/index should fetch package info from npm 1`] = ` { + "isPrivate": false, "name": "foobar", "registryUrl": "https://registry.npmjs.org", "releases": [ @@ -48,6 +50,7 @@ exports[`modules/datasource/npm/index should fetch package info from npm 1`] = ` exports[`modules/datasource/npm/index should handle foobar 1`] = ` { + "isPrivate": true, "name": "foobar", "registryUrl": "https://registry.npmjs.org", "releases": [ @@ -71,6 +74,7 @@ exports[`modules/datasource/npm/index should handle foobar 1`] = ` exports[`modules/datasource/npm/index should handle no time 1`] = ` { + "isPrivate": true, "name": "foobar", "registryUrl": "https://registry.npmjs.org", "releases": [ @@ -93,6 +97,7 @@ exports[`modules/datasource/npm/index should handle no time 1`] = ` exports[`modules/datasource/npm/index should not send an authorization header if public package 1`] = ` { + "isPrivate": true, "name": "foobar", "registryUrl": "https://registry.npmjs.org", "releases": [ @@ -116,6 +121,7 @@ exports[`modules/datasource/npm/index should not send an authorization header if exports[`modules/datasource/npm/index should parse repo url (string) 1`] = ` { + "isPrivate": true, "name": "foobar", "registryUrl": "https://registry.npmjs.org", "releases": [ @@ -134,6 +140,7 @@ exports[`modules/datasource/npm/index should parse repo url (string) 1`] = ` exports[`modules/datasource/npm/index should parse repo url 1`] = ` { + "isPrivate": true, "name": "foobar", "registryUrl": "https://registry.npmjs.org", "releases": [ @@ -152,6 +159,7 @@ exports[`modules/datasource/npm/index should parse repo url 1`] = ` exports[`modules/datasource/npm/index should replace any environment variable in npmrc 1`] = ` { + "isPrivate": true, "name": "foobar", "registryUrl": "https://registry.from-env.com", "releases": [ @@ -181,6 +189,7 @@ exports[`modules/datasource/npm/index should return deprecated 1`] = ` Marking the latest version of an npm package as deprecated results in the entire package being considered deprecated, so contact the package author you think this is a mistake.", "deprecationSource": "npm", + "isPrivate": true, "name": "foobar", "registryUrl": "https://registry.npmjs.org", "releases": [ @@ -212,6 +221,7 @@ Marking the latest version of an npm package as deprecated results in the entire exports[`modules/datasource/npm/index should send an authorization header if provided 1`] = ` { + "isPrivate": true, "name": "@foobar/core", "registryUrl": "https://registry.npmjs.org", "releases": [ @@ -235,6 +245,7 @@ exports[`modules/datasource/npm/index should send an authorization header if pro exports[`modules/datasource/npm/index should use default registry if missing from npmrc 1`] = ` { + "isPrivate": true, "name": "foobar", "registryUrl": "https://registry.npmjs.org", "releases": [ @@ -258,6 +269,7 @@ exports[`modules/datasource/npm/index should use default registry if missing fro exports[`modules/datasource/npm/index should use host rules by baseUrl if provided 1`] = ` { + "isPrivate": true, "name": "foobar", "registryUrl": "https://npm.mycustomregistry.com/_packaging/mycustomregistry/npm/registry", "releases": [ @@ -281,6 +293,7 @@ exports[`modules/datasource/npm/index should use host rules by baseUrl if provid exports[`modules/datasource/npm/index should use host rules by hostName if provided 1`] = ` { + "isPrivate": true, "name": "foobar", "registryUrl": "https://npm.mycustomregistry.com", "releases": [ diff --git a/lib/modules/datasource/npm/get.ts b/lib/modules/datasource/npm/get.ts index 54e44742a1d987..dedf43762c76bb 100644 --- a/lib/modules/datasource/npm/get.ts +++ b/lib/modules/datasource/npm/get.ts @@ -99,12 +99,12 @@ export async function getDependency( try { const options: HttpOptions = {}; if (cachedResult?.cacheData?.etag) { - logger.debug('Using cached etag'); + logger.trace({ packageName }, 'Using cached etag'); options.headers = { 'If-None-Match': cachedResult.cacheData.etag }; } const raw = await http.getJson(packageUrl, options); if (cachedResult?.cacheData && raw.statusCode === 304) { - logger.debug({ packageName }, 'Cached npm result is revalidated'); + logger.trace(`Cached npm result for ${packageName} is revalidated`); cachedResult.cacheData.softExpireAt = softExpireAt; await packageCache.set( cacheNamespace, @@ -171,19 +171,12 @@ export async function getDependency( return release; }); logger.trace({ dep }, 'dep'); - // serialize first before saving - // TODO: use dynamic detection of public repos instead of a static list (#9587) - const whitelistedPublicScopes = [ - '@graphql-codegen', - '@storybook', - '@types', - '@typescript-eslint', - ]; + const cacheControl = raw.headers?.['cache-control']; if ( - !raw.authorization && - (whitelistedPublicScopes.includes(packageName.split('/')[0]) || - !packageName.startsWith('@')) + is.nonEmptyString(cacheControl) && + regEx(/(^|,)\s*public\s*(,|$)/).test(cacheControl) ) { + dep.isPrivate = false; const cacheData = { softExpireAt, etag }; await packageCache.set( cacheNamespace, @@ -191,6 +184,8 @@ export async function getDependency( { ...dep, cacheData }, etag ? cacheHardTtlMinutes : cacheMinutes ); + } else { + dep.isPrivate = true; } return dep; } catch (err) { diff --git a/lib/modules/datasource/npm/index.spec.ts b/lib/modules/datasource/npm/index.spec.ts index c40aff8a397f05..d7366d54fd52fc 100644 --- a/lib/modules/datasource/npm/index.spec.ts +++ b/lib/modules/datasource/npm/index.spec.ts @@ -56,7 +56,7 @@ describe('modules/datasource/npm/index', () => { .scope('https://registry.npmjs.org') .get('/foobar') .reply(200, missingVersions); - const res = await getPkgReleases({ datasource, depName: 'foobar' }); + const res = await getPkgReleases({ datasource, packageName: 'foobar' }); expect(res).toBeNull(); }); @@ -64,9 +64,10 @@ describe('modules/datasource/npm/index', () => { httpMock .scope('https://registry.npmjs.org') .get('/foobar') - .reply(200, npmResponse); - const res = await getPkgReleases({ datasource, depName: 'foobar' }); + .reply(200, npmResponse, { 'Cache-control': 'public, expires=300' }); + const res = await getPkgReleases({ datasource, packageName: 'foobar' }); expect(res).toMatchSnapshot(); + expect(res?.isPrivate).toBeFalse(); }); it('should parse repo url', async () => { @@ -89,7 +90,7 @@ describe('modules/datasource/npm/index', () => { }, }; httpMock.scope('https://registry.npmjs.org').get('/foobar').reply(200, pkg); - const res = await getPkgReleases({ datasource, depName: 'foobar' }); + const res = await getPkgReleases({ datasource, packageName: 'foobar' }); expect(res).toMatchSnapshot(); expect(res?.sourceUrl).toBeDefined(); }); @@ -110,7 +111,7 @@ describe('modules/datasource/npm/index', () => { }, }; httpMock.scope('https://registry.npmjs.org').get('/foobar').reply(200, pkg); - const res = await getPkgReleases({ datasource, depName: 'foobar' }); + const res = await getPkgReleases({ datasource, packageName: 'foobar' }); expect(res).toMatchSnapshot(); expect(res?.sourceUrl).toBeDefined(); }); @@ -143,7 +144,7 @@ describe('modules/datasource/npm/index', () => { .scope('https://registry.npmjs.org') .get('/foobar') .reply(200, deprecatedPackage); - const res = await getPkgReleases({ datasource, depName: 'foobar' }); + const res = await getPkgReleases({ datasource, packageName: 'foobar' }); expect(res).toMatchSnapshot(); expect(res?.deprecationMessage).toMatchSnapshot(); }); @@ -153,8 +154,9 @@ describe('modules/datasource/npm/index', () => { .scope('https://registry.npmjs.org') .get('/foobar') .reply(200, npmResponse); - const res = await getPkgReleases({ datasource, depName: 'foobar' }); + const res = await getPkgReleases({ datasource, packageName: 'foobar' }); expect(res).toMatchSnapshot(); + expect(res?.isPrivate).toBeTrue(); }); it('should handle no time', async () => { @@ -163,19 +165,19 @@ describe('modules/datasource/npm/index', () => { .scope('https://registry.npmjs.org') .get('/foobar') .reply(200, npmResponse); - const res = await getPkgReleases({ datasource, depName: 'foobar' }); + const res = await getPkgReleases({ datasource, packageName: 'foobar' }); expect(res).toMatchSnapshot(); }); it('should return null if lookup fails 401', async () => { httpMock.scope('https://registry.npmjs.org').get('/foobar').reply(401); - const res = await getPkgReleases({ datasource, depName: 'foobar' }); + const res = await getPkgReleases({ datasource, packageName: 'foobar' }); expect(res).toBeNull(); }); it('should return null if lookup fails', async () => { httpMock.scope('https://registry.npmjs.org').get('/foobar').reply(404); - const res = await getPkgReleases({ datasource, depName: 'foobar' }); + const res = await getPkgReleases({ datasource, packageName: 'foobar' }); expect(res).toBeNull(); }); @@ -185,35 +187,35 @@ describe('modules/datasource/npm/index', () => { .get('/foobar') .reply(200, 'oops'); await expect( - getPkgReleases({ datasource, depName: 'foobar' }) + getPkgReleases({ datasource, packageName: 'foobar' }) ).rejects.toThrow(); }); it('should throw error for 429', async () => { httpMock.scope('https://registry.npmjs.org').get('/foobar').reply(429); await expect( - getPkgReleases({ datasource, depName: 'foobar' }) + getPkgReleases({ datasource, packageName: 'foobar' }) ).rejects.toThrow(); }); it('should throw error for 5xx', async () => { httpMock.scope('https://registry.npmjs.org').get('/foobar').reply(503); await expect( - getPkgReleases({ datasource, depName: 'foobar' }) + getPkgReleases({ datasource, packageName: 'foobar' }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); it('should throw error for 408', async () => { httpMock.scope('https://registry.npmjs.org').get('/foobar').reply(408); await expect( - getPkgReleases({ datasource, depName: 'foobar' }) + getPkgReleases({ datasource, packageName: 'foobar' }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); it('should throw error for others', async () => { httpMock.scope('https://registry.npmjs.org').get('/foobar').reply(451); await expect( - getPkgReleases({ datasource, depName: 'foobar' }) + getPkgReleases({ datasource, packageName: 'foobar' }) ).rejects.toThrow(); }); @@ -224,7 +226,7 @@ describe('modules/datasource/npm/index', () => { }) .get('/foobar') .reply(200, npmResponse); - const res = await getPkgReleases({ datasource, depName: 'foobar' }); + const res = await getPkgReleases({ datasource, packageName: 'foobar' }); expect(res).toMatchSnapshot(); }); @@ -237,7 +239,7 @@ describe('modules/datasource/npm/index', () => { .reply(200, { ...npmResponse, name: '@foobar/core' }); const res = await getPkgReleases({ datasource, - depName: '@foobar/core', + packageName: '@foobar/core', npmrc: '_auth = 1234', }); expect(res).toMatchSnapshot(); @@ -256,7 +258,11 @@ describe('modules/datasource/npm/index', () => { .get('/foobar') .reply(200, npmResponse); const npmrc = 'registry=https://npm.mycustomregistry.com/'; - const res = await getPkgReleases({ datasource, depName: 'foobar', npmrc }); + const res = await getPkgReleases({ + datasource, + packageName: 'foobar', + npmrc, + }); expect(res).toMatchSnapshot(); }); @@ -278,7 +284,11 @@ describe('modules/datasource/npm/index', () => { .reply(200, npmResponse); const npmrc = 'registry=https://npm.mycustomregistry.com/_packaging/mycustomregistry/npm/registry/'; - const res = await getPkgReleases({ datasource, depName: 'foobar', npmrc }); + const res = await getPkgReleases({ + datasource, + packageName: 'foobar', + npmrc, + }); expect(res).toMatchSnapshot(); }); @@ -295,7 +305,11 @@ describe('modules/datasource/npm/index', () => { .get('/foobar') .reply(200, npmResponse); const npmrc = 'foo=bar'; - const res = await getPkgReleases({ datasource, depName: 'foobar', npmrc }); + const res = await getPkgReleases({ + datasource, + packageName: 'foobar', + npmrc, + }); expect(res).toMatchSnapshot(); }); @@ -305,8 +319,13 @@ describe('modules/datasource/npm/index', () => { .get('/foobar') .reply(200, npmResponse); const npmrc = `registry=https://npm.mycustomregistry.com/`; - const res = await getPkgReleases({ datasource, depName: 'foobar', npmrc }); + const res = await getPkgReleases({ + datasource, + packageName: 'foobar', + npmrc, + }); expect(res).toMatchSnapshot(); + expect(res?.isPrivate).toBeTrue(); }); it('should replace any environment variable in npmrc', async () => { @@ -319,7 +338,11 @@ describe('modules/datasource/npm/index', () => { GlobalConfig.set({ exposeAllEnv: true }); const npmrc = 'registry=${REGISTRY}'; - const res = await getPkgReleases({ datasource, depName: 'foobar', npmrc }); + const res = await getPkgReleases({ + datasource, + packageName: 'foobar', + npmrc, + }); expect(res).toMatchSnapshot(); }); diff --git a/lib/modules/datasource/nuget/index.spec.ts b/lib/modules/datasource/nuget/index.spec.ts index bdc2c914a72734..43e38f25ee56a8 100644 --- a/lib/modules/datasource/nuget/index.spec.ts +++ b/lib/modules/datasource/nuget/index.spec.ts @@ -55,7 +55,7 @@ const nlogMocks = [ const configV3V2 = { datasource, versioning, - depName: 'nunit', + packageName: 'nunit', registryUrls: [ 'https://api.nuget.org/v3/index.json', 'https://www.nuget.org/api/v2/', @@ -65,28 +65,28 @@ const configV3V2 = { const configV2 = { datasource, versioning, - depName: 'nunit', + packageName: 'nunit', registryUrls: ['https://www.nuget.org/api/v2/'], }; const configV3 = { datasource, versioning, - depName: 'nunit', + packageName: 'nunit', registryUrls: ['https://api.nuget.org/v3/index.json'], }; const configV3NotNugetOrg = { datasource, versioning, - depName: 'nunit', + packageName: 'nunit', registryUrls: ['https://myprivatefeed/index.json'], }; const configV3Multiple = { datasource, versioning, - depName: 'nunit', + packageName: 'nunit', registryUrls: [ 'https://api.nuget.org/v3/index.json', 'https://myprivatefeed/index.json', @@ -139,7 +139,7 @@ describe('modules/datasource/nuget/index', () => { const config = { datasource, versioning, - depName: 'nunit', + packageName: 'nunit', registryUrls: ['#$#api.nuget.org/v3/index.xml'], }; @@ -155,7 +155,7 @@ describe('modules/datasource/nuget/index', () => { const config = { datasource, versioning, - depName: 'nunit', + packageName: 'nunit', registryUrls: ['https://my-registry#protocolVersion=3'], }; expect( @@ -389,7 +389,7 @@ describe('modules/datasource/nuget/index', () => { }); const res = await getPkgReleases({ ...configV3, - depName: 'nlog', + packageName: 'nlog', }); expect(res).not.toBeNull(); expect(res).toMatchSnapshot(); diff --git a/lib/modules/datasource/orb/index.spec.ts b/lib/modules/datasource/orb/index.spec.ts index be25548915af2c..2e66d028740b4c 100644 --- a/lib/modules/datasource/orb/index.spec.ts +++ b/lib/modules/datasource/orb/index.spec.ts @@ -34,7 +34,7 @@ describe('modules/datasource/orb/index', () => { expect( await getPkgReleases({ datasource, - depName: 'hyper-expanse/library-release-workflows', + packageName: 'hyper-expanse/library-release-workflows', }) ).toBeNull(); }); @@ -47,7 +47,7 @@ describe('modules/datasource/orb/index', () => { expect( await getPkgReleases({ datasource, - depName: 'hyper-expanse/library-release-wonkflows', + packageName: 'hyper-expanse/library-release-wonkflows', }) ).toBeNull(); }); @@ -57,7 +57,7 @@ describe('modules/datasource/orb/index', () => { expect( await getPkgReleases({ datasource, - depName: 'hyper-expanse/library-release-workflows', + packageName: 'hyper-expanse/library-release-workflows', }) ).toBeNull(); }); @@ -67,7 +67,7 @@ describe('modules/datasource/orb/index', () => { expect( await getPkgReleases({ datasource, - depName: 'hyper-expanse/library-release-workflows', + packageName: 'hyper-expanse/library-release-workflows', }) ).toBeNull(); }); @@ -76,7 +76,7 @@ describe('modules/datasource/orb/index', () => { httpMock.scope(baseUrl).post('/graphql-unstable').reply(200, orbData); const res = await getPkgReleases({ datasource, - depName: 'hyper-expanse/library-release-workflows', + packageName: 'hyper-expanse/library-release-workflows', }); expect(res).toMatchSnapshot(); expect(res).not.toBeNull(); @@ -87,7 +87,7 @@ describe('modules/datasource/orb/index', () => { httpMock.scope(baseUrl).post('/graphql-unstable').reply(200, orbData); const res = await getPkgReleases({ datasource, - depName: 'hyper-expanse/library-release-workflows', + packageName: 'hyper-expanse/library-release-workflows', }); expect(res).toMatchSnapshot(); expect(res?.homepage).toBe('https://google.com'); diff --git a/lib/modules/datasource/packagist/index.spec.ts b/lib/modules/datasource/packagist/index.spec.ts index 88d6775fe1c46d..9f90e007047898 100644 --- a/lib/modules/datasource/packagist/index.spec.ts +++ b/lib/modules/datasource/packagist/index.spec.ts @@ -48,7 +48,7 @@ describe('modules/datasource/packagist/index', () => { ...config, datasource, versioning, - depName: 'something/one', + packageName: 'something/one', }); expect(res).toBeNull(); }); @@ -72,7 +72,7 @@ describe('modules/datasource/packagist/index', () => { ...config, datasource, versioning, - depName: 'vendor/package-name', + packageName: 'vendor/package-name', }); expect(res).toMatchSnapshot(); }); @@ -84,6 +84,8 @@ describe('modules/datasource/packagist/index', () => { .replyWithError({ code: 'ETIMEDOUT' }); httpMock .scope(baseUrl) + .get('/packages.json') + .reply(200, { 'metadata-url': '/p2/%package%.json' }) .get('/p2/vendor/package-name2.json') .reply(200) .get('/p2/vendor/package-name2~dev.json') @@ -92,7 +94,7 @@ describe('modules/datasource/packagist/index', () => { ...config, datasource, versioning, - depName: 'vendor/package-name2', + packageName: 'vendor/package-name2', }); expect(res).toBeNull(); }); @@ -104,6 +106,8 @@ describe('modules/datasource/packagist/index', () => { .reply(403); httpMock .scope(baseUrl) + .get('/packages.json') + .reply(200, { 'metadata-url': '/p2/%package%.json' }) .get('/p2/vendor/package-name.json') .reply(200) .get('/p2/vendor/package-name~dev.json') @@ -112,7 +116,7 @@ describe('modules/datasource/packagist/index', () => { ...config, datasource, versioning, - depName: 'vendor/package-name', + packageName: 'vendor/package-name', }); expect(res).toBeNull(); }); @@ -124,6 +128,8 @@ describe('modules/datasource/packagist/index', () => { .reply(404); httpMock .scope(baseUrl) + .get('/packages.json') + .reply(200, { 'metadata-url': '/p2/%package%.json' }) .get('/p2/drewm/mailchimp-api.json') .reply(200) .get('/p2/drewm/mailchimp-api~dev.json') @@ -132,12 +138,45 @@ describe('modules/datasource/packagist/index', () => { ...config, datasource, versioning, - depName: 'drewm/mailchimp-api', + packageName: 'drewm/mailchimp-api', }); expect(res).toBeNull(); }); it('supports includes packages', async () => { + hostRules.find = jest.fn(() => ({ + username: 'some-username', + password: 'some-password', + })); + const packagesJson = { + packages: [], + includes: { + 'include/all$093530b127abe74defbf21affc9589bf713e4e08f898bf11986842f9956eda86.json': + { + sha256: + '093530b127abe74defbf21affc9589bf713e4e08f898bf11986842f9956eda86', + }, + }, + }; + httpMock + .scope('https://composer.renovatebot.com') + .get('/packages.json') + .reply(200, packagesJson) + .get( + '/include/all$093530b127abe74defbf21affc9589bf713e4e08f898bf11986842f9956eda86.json' + ) + .reply(200, includesJson); + const res = await getPkgReleases({ + ...config, + datasource, + versioning, + packageName: 'guzzlehttp/guzzle', + }); + expect(res).toMatchSnapshot(); + expect(res).not.toBeNull(); + }); + + it('supports older sha1 hashes', async () => { hostRules.find = jest.fn(() => ({ username: 'some-username', password: 'some-password', @@ -160,10 +199,42 @@ describe('modules/datasource/packagist/index', () => { ...config, datasource, versioning, - depName: 'guzzlehttp/guzzle', + packageName: 'guzzlehttp/guzzle', + }); + expect(res).toMatchObject({ + homepage: 'http://guzzlephp.org/', + registryUrl: 'https://composer.renovatebot.com', + releases: [ + { version: '3.0.0' }, + { version: '3.0.1' }, + { version: '3.0.2' }, + { version: '3.0.3' }, + { version: '3.0.4' }, + { version: '3.0.5' }, + { version: '3.0.6' }, + { version: '3.0.7' }, + { version: '3.1.0' }, + { version: '3.1.1' }, + { version: '3.1.2' }, + { version: '3.2.0' }, + { version: '3.3.0' }, + { version: '3.3.1' }, + { version: '3.4.0' }, + { version: '3.4.1' }, + { version: '3.4.2' }, + { version: '3.4.3' }, + { version: '3.5.0' }, + { version: '3.6.0' }, + { version: '3.7.0' }, + { version: '3.7.1' }, + { version: '3.7.2' }, + { version: '3.7.3' }, + { version: '3.7.4' }, + { version: '3.8.0' }, + { version: '3.8.1' }, + ], + sourceUrl: 'https://github.com/guzzle/guzzle', }); - expect(res).toMatchSnapshot(); - expect(res).not.toBeNull(); }); it('supports lazy repositories', async () => { @@ -199,7 +270,7 @@ describe('modules/datasource/packagist/index', () => { ...config, datasource, versioning, - depName: 'guzzlehttp/guzzle', + packageName: 'guzzlehttp/guzzle', }); expect(res).toMatchSnapshot(); expect(res).not.toBeNull(); @@ -244,7 +315,7 @@ describe('modules/datasource/packagist/index', () => { ...config, datasource, versioning, - depName: 'wpackagist-plugin/1beyt', + packageName: 'wpackagist-plugin/1beyt', }); expect(res).toMatchSnapshot(); expect(res).not.toBeNull(); @@ -283,6 +354,8 @@ describe('modules/datasource/packagist/index', () => { .reply(200, fileJson); httpMock .scope(baseUrl) + .get('/packages.json') + .reply(200, { 'metadata-url': '/p2/%package%.json' }) .get('/p2/some/other.json') .reply(200, beytJson) .get('/p2/some/other~dev.json') @@ -291,7 +364,7 @@ describe('modules/datasource/packagist/index', () => { ...config, datasource, versioning, - depName: 'some/other', + packageName: 'some/other', }); expect(res).toBeNull(); }); @@ -323,7 +396,7 @@ describe('modules/datasource/packagist/index', () => { ...config, datasource, versioning, - depName: 'wpackagist-plugin/1beyt', + packageName: 'wpackagist-plugin/1beyt', }); expect(res).toMatchSnapshot(); expect(res).not.toBeNull(); @@ -352,7 +425,7 @@ describe('modules/datasource/packagist/index', () => { ...config, datasource, versioning, - depName: 'wpackagist-plugin/1beyt', + packageName: 'wpackagist-plugin/1beyt', }); expect(res).toMatchSnapshot(); expect(res).not.toBeNull(); @@ -379,6 +452,8 @@ describe('modules/datasource/packagist/index', () => { .reply(200, packagesJson); httpMock .scope(baseUrl) + .get('/packages.json') + .reply(200, { 'metadata-url': '/p2/%package%.json' }) .get('/p2/some/other.json') .reply(200, beytJson) .get('/p2/some/other~dev.json') @@ -387,7 +462,7 @@ describe('modules/datasource/packagist/index', () => { ...config, datasource, versioning, - depName: 'some/other', + packageName: 'some/other', }); expect(res).toBeNull(); }); @@ -395,10 +470,10 @@ describe('modules/datasource/packagist/index', () => { it('processes real versioned data', async () => { httpMock .scope(baseUrl) + .get('/packages.json') + .reply(200, { 'metadata-url': '/p2/%package%.json' }) .get('/p2/drewm/mailchimp-api.json') - .reply(200, mailchimpJson); - httpMock - .scope(baseUrl) + .reply(200, mailchimpJson) .get('/p2/drewm/mailchimp-api~dev.json') .reply(200, mailchimpDevJson); config.registryUrls = ['https://packagist.org']; @@ -407,7 +482,7 @@ describe('modules/datasource/packagist/index', () => { ...config, datasource, versioning, - depName: 'drewm/mailchimp-api', + packageName: 'drewm/mailchimp-api', }) ).toMatchSnapshot(); }); @@ -415,10 +490,10 @@ describe('modules/datasource/packagist/index', () => { it('adds packagist source implicitly', async () => { httpMock .scope(baseUrl) + .get('/packages.json') + .reply(200, { 'metadata-url': '/p2/%package%.json' }) .get('/p2/drewm/mailchimp-api.json') - .reply(200, mailchimpJson); - httpMock - .scope(baseUrl) + .reply(200, mailchimpJson) .get('/p2/drewm/mailchimp-api~dev.json') .reply(200, mailchimpDevJson); config.registryUrls = []; @@ -427,9 +502,45 @@ describe('modules/datasource/packagist/index', () => { ...config, datasource, versioning, - depName: 'drewm/mailchimp-api', + packageName: 'drewm/mailchimp-api', }) ).toMatchSnapshot(); }); + + it('fetches packagist V2 packages', async () => { + httpMock + .scope('https://example.com') + .get('/packages.json') + .reply(200, { + 'metadata-url': 'https://example.com/p2/%package%.json', + }) + .get('/p2/drewm/mailchimp-api.json') + .reply(200, { + minified: 'composer/2.0', + packages: { + 'drewm/mailchimp-api': [ + { + name: 'drewm/mailchimp-api', + version: 'v2.5.4', + }, + ], + }, + }) + .get('/p2/drewm/mailchimp-api~dev.json') + .reply(404); + config.registryUrls = ['https://example.com']; + + const res = await getPkgReleases({ + ...config, + datasource, + versioning, + packageName: 'drewm/mailchimp-api', + }); + + expect(res).toEqual({ + registryUrl: 'https://example.com', + releases: [{ gitRef: 'v2.5.4', version: '2.5.4' }], + }); + }); }); }); diff --git a/lib/modules/datasource/packagist/index.ts b/lib/modules/datasource/packagist/index.ts index b2f9849e540ace..8970551bbd8669 100644 --- a/lib/modules/datasource/packagist/index.ts +++ b/lib/modules/datasource/packagist/index.ts @@ -1,22 +1,22 @@ +import { z } from 'zod'; import { logger } from '../../../logger'; import { ExternalHostError } from '../../../types/errors/external-host-error'; import { cache } from '../../../util/cache/package/decorator'; import * as hostRules from '../../../util/host-rules'; import type { HttpOptions } from '../../../util/http/types'; import * as p from '../../../util/promises'; -import { joinUrlParts, resolveBaseUrl } from '../../../util/url'; +import { replaceUrlPath, resolveBaseUrl } from '../../../util/url'; import * as composerVersioning from '../../versioning/composer'; import { Datasource } from '../datasource'; import type { GetReleasesConfig, ReleaseResult } from '../types'; -import * as schema from './schema'; -import { extractDepReleases } from './schema'; -import type { - AllPackages, - PackageMeta, +import { + PackagesResponse, PackagistFile, RegistryFile, RegistryMeta, -} from './types'; + extractDepReleases, + parsePackagesResponses, +} from './schema'; export class PackagistDatasource extends Datasource { static readonly id = 'packagist'; @@ -40,46 +40,23 @@ export class PackagistDatasource extends Datasource { return username && password ? { username, password } : {}; } - private async getRegistryMeta(regUrl: string): Promise { - const url = resolveBaseUrl(regUrl, 'packages.json'); + private async getJson>( + url: string, + schema: U + ): Promise> { const opts = PackagistDatasource.getHostOpts(url); - const res = (await this.http.getJson(url, opts)).body; - const meta: RegistryMeta = { - providerPackages: {}, - packages: res.packages, - }; - if (res.includes) { - meta.includesFiles = []; - for (const [name, val] of Object.entries(res.includes)) { - const file = { - key: name.replace(val.sha256, '%hash%'), - sha256: val.sha256, - }; - meta.includesFiles.push(file); - } - } - if (res['providers-url']) { - meta.providersUrl = res['providers-url']; - } - if (res['providers-lazy-url']) { - meta.providersLazyUrl = res['providers-lazy-url']; - } - if (res['provider-includes']) { - meta.files = []; - for (const [key, val] of Object.entries(res['provider-includes'])) { - const file = { - key, - sha256: val.sha256, - }; - meta.files.push(file); - } - } - if (res.providers) { - for (const [key, val] of Object.entries(res.providers)) { - meta.providerPackages[key] = val.sha256; - } - } - return meta; + const { body } = await this.http.getJson(url, opts); + return schema.parse(body); + } + + @cache({ + namespace: `datasource-${PackagistDatasource.id}`, + key: (regUrl: string) => `getRegistryMeta:${regUrl}`, + }) + async getRegistryMeta(regUrl: string): Promise { + const url = resolveBaseUrl(regUrl, 'packages.json'); + const result = await this.getJson(url, RegistryMeta); + return result; } private static isPrivatePackage(regUrl: string): boolean { @@ -91,9 +68,9 @@ export class PackagistDatasource extends Datasource { regUrl: string, regFile: RegistryFile ): string { - const { key, sha256 } = regFile; - const fileName = key.replace('%hash%', sha256); - const url = `${regUrl}/${fileName}`; + const { key, hash } = regFile; + const fileName = hash ? key.replace('%hash%', hash) : key; + const url = resolveBaseUrl(regUrl, fileName); return url; } @@ -110,81 +87,87 @@ export class PackagistDatasource extends Datasource { regFile: RegistryFile ): Promise { const url = PackagistDatasource.getPackagistFileUrl(regUrl, regFile); - const opts = PackagistDatasource.getHostOpts(regUrl); - const { body: packagistFile } = await this.http.getJson( - url, - opts - ); + const packagistFile = await this.getJson(url, PackagistFile); return packagistFile; } + async fetchProviderPackages( + regUrl: string, + meta: RegistryMeta + ): Promise { + await p.map(meta.files, async (file) => { + const res = await this.getPackagistFile(regUrl, file); + Object.assign(meta.providerPackages, res.providers); + }); + } + + async fetchIncludesPackages( + regUrl: string, + meta: RegistryMeta + ): Promise { + await p.map(meta.includesFiles, async (file) => { + const res = await this.getPackagistFile(regUrl, file); + for (const [key, val] of Object.entries(res.packages)) { + meta.includesPackages[key] = extractDepReleases(val); + } + }); + } + @cache({ - namespace: `datasource-${PackagistDatasource.id}`, - key: (regUrl: string) => regUrl, + namespace: `datasource-${PackagistDatasource.id}-org`, + key: (registryUrl: string, metadataUrl: string, packageName: string) => + `${registryUrl}:${metadataUrl}:${packageName}`, + ttlMinutes: 10, }) - async getAllPackages(regUrl: string): Promise { - const registryMeta = await this.getRegistryMeta(regUrl); - // istanbul ignore if: needs test - if (!registryMeta) { - return null; - } - - const { - packages, - providersUrl, - providersLazyUrl, - files = [], - includesFiles = [], - providerPackages, - } = registryMeta; + async packagistV2Lookup( + registryUrl: string, + metadataUrl: string, + packageName: string + ): Promise { + const pkgUrl = replaceUrlPath( + registryUrl, + metadataUrl.replace('%package%', packageName) + ); + const pkgPromise = this.getJson(pkgUrl, z.unknown()); - const includesPackages: Record = {}; + const devUrl = replaceUrlPath( + registryUrl, + metadataUrl.replace('%package%', `${packageName}~dev`) + ); + const devPromise = this.getJson(devUrl, z.unknown()).then( + (x) => x, + () => null + ); - const tasks: (() => Promise)[] = []; + const results = await Promise.all([pkgPromise, devPromise]); + return parsePackagesResponses(packageName, results); + } - for (const file of files) { - tasks.push(async () => { - const res = await this.getPackagistFile(regUrl, file); - for (const [name, val] of Object.entries(res.providers)) { - providerPackages[name] = val.sha256; - } - }); + public getPkgUrl( + packageName: string, + registryUrl: string, + registryMeta: RegistryMeta + ): string | null { + if ( + registryMeta.providersUrl && + packageName in registryMeta.providerPackages + ) { + let url = registryMeta.providersUrl.replace('%package%', packageName); + const hash = registryMeta.providerPackages[packageName]; + if (hash) { + url = url.replace('%hash%', hash); + } + return replaceUrlPath(registryUrl, url); } - for (const file of includesFiles) { - tasks.push(async () => { - const res = await this.getPackagistFile(regUrl, file); - for (const [key, val] of Object.entries(res.packages ?? {})) { - includesPackages[key] = extractDepReleases(val); - } - }); + if (registryMeta.providersLazyUrl) { + return replaceUrlPath( + registryUrl, + registryMeta.providersLazyUrl.replace('%package%', packageName) + ); } - await p.all(tasks); - - const allPackages: AllPackages = { - packages, - providersUrl, - providersLazyUrl, - providerPackages, - includesPackages, - }; - return allPackages; - } - - @cache({ - namespace: `datasource-${PackagistDatasource.id}-org`, - key: (regUrl: string) => regUrl, - ttlMinutes: 10, - }) - async packagistOrgLookup(name: string): Promise { - const regUrl = 'https://packagist.org'; - const pkgUrl = joinUrlParts(regUrl, `/p2/${name}.json`); - const devUrl = joinUrlParts(regUrl, `/p2/${name}~dev.json`); - const results = await p.map([pkgUrl, devUrl], (url) => - this.http.getJson(url).then(({ body }) => body) - ); - return schema.parsePackagesResponses(name, results); + return null; } public override async getReleases({ @@ -199,50 +182,35 @@ export class PackagistDatasource extends Datasource { } try { - if (registryUrl === 'https://packagist.org') { - const packagistResult = await this.packagistOrgLookup(packageName); + const meta = await this.getRegistryMeta(registryUrl); + + if (meta.metadataUrl) { + const packagistResult = await this.packagistV2Lookup( + registryUrl, + meta.metadataUrl, + packageName + ); return packagistResult; } - const allPackages = await this.getAllPackages(registryUrl); - // istanbul ignore if: needs test - if (!allPackages) { - return null; - } - const { - packages, - providersUrl, - providersLazyUrl, - providerPackages, - includesPackages, - } = allPackages; - if (packages?.[packageName]) { - const dep = extractDepReleases(packages[packageName]); - return dep; + + if (meta.packages[packageName]) { + const result = extractDepReleases(meta.packages[packageName]); + return result; } - if (includesPackages?.[packageName]) { - return includesPackages[packageName]; + + await this.fetchIncludesPackages(registryUrl, meta); + if (meta.includesPackages[packageName]) { + return meta.includesPackages[packageName]; } - let pkgUrl: string; - if (packageName in providerPackages) { - pkgUrl = resolveBaseUrl( - registryUrl, - providersUrl! - .replace('%package%', packageName) - .replace('%hash%', providerPackages[packageName]) - ); - } else if (providersLazyUrl) { - pkgUrl = resolveBaseUrl( - registryUrl, - providersLazyUrl.replace('%package%', packageName) - ); - } else { + + await this.fetchProviderPackages(registryUrl, meta); + const pkgUrl = this.getPkgUrl(packageName, registryUrl, meta); + if (!pkgUrl) { return null; } - const opts = PackagistDatasource.getHostOpts(registryUrl); - // TODO: fix types (#9610) - const versions = (await this.http.getJson(pkgUrl, opts)).body - .packages[packageName]; - const dep = extractDepReleases(versions); + + const pkgRes = await this.getJson(pkgUrl, PackagesResponse); + const dep = extractDepReleases(pkgRes.packages[packageName]); logger.trace({ dep }, 'dep'); return dep; } catch (err) /* istanbul ignore next */ { diff --git a/lib/modules/datasource/packagist/schema.spec.ts b/lib/modules/datasource/packagist/schema.spec.ts index 9fde962fcc2d5f..ee0f6bbe93ae9a 100644 --- a/lib/modules/datasource/packagist/schema.spec.ts +++ b/lib/modules/datasource/packagist/schema.spec.ts @@ -3,6 +3,7 @@ import { ComposerRelease, ComposerReleases, MinifiedArray, + RegistryMeta, parsePackagesResponse, parsePackagesResponses, } from './schema'; @@ -140,6 +141,14 @@ describe('modules/datasource/packagist/schema', () => { }, }) ).toEqual([{ version: '1.2.3' }]); + expect( + parsePackagesResponse('foo/bar', { + packages: { + 'foo/bar': { '1.2.3': { version: '1.2.3' } }, + 'baz/qux': { '4.5.6': { version: '4.5.6' } }, + }, + }) + ).toEqual([{ version: '1.2.3' }]); }); it('expands minified fields', () => { @@ -242,4 +251,19 @@ describe('modules/datasource/packagist/schema', () => { } satisfies ReleaseResult); }); }); + + describe('RegistryMeta', () => { + it('falls back to default values', () => { + expect(RegistryMeta.parse('nonsense')).toEqual({ + files: [], + includesFiles: [], + packages: {}, + providerPackages: {}, + includesPackages: {}, + providersLazyUrl: null, + providersUrl: null, + metadataUrl: null, + }); + }); + }); }); diff --git a/lib/modules/datasource/packagist/schema.ts b/lib/modules/datasource/packagist/schema.ts index 166a668d5dd8c0..2dca13a950e0f8 100644 --- a/lib/modules/datasource/packagist/schema.ts +++ b/lib/modules/datasource/packagist/schema.ts @@ -1,7 +1,12 @@ import is from '@sindresorhus/is'; import { z } from 'zod'; import { logger } from '../../../logger'; -import { looseObject, looseValue } from '../../../util/schema'; +import { + looseArray, + looseObject, + looseRecord, + looseValue, +} from '../../../util/schema'; import type { Release, ReleaseResult } from '../types'; export const MinifiedArray = z.array(z.record(z.unknown())).transform((xs) => { @@ -54,30 +59,37 @@ export const ComposerRelease = z ); export type ComposerRelease = z.infer; +const ComposerReleasesLooseArray = looseArray(ComposerRelease); +type ComposerReleasesLooseArray = z.infer; + export const ComposerReleases = z .union([ - z.array(looseValue(ComposerRelease)), - z - .record(looseValue(ComposerRelease)) - .transform((map) => Object.values(map)), + MinifiedArray.transform((xs) => ComposerReleasesLooseArray.parse(xs)), + looseRecord(ComposerRelease).transform((map) => Object.values(map)), ]) - .catch([]) - .transform((xs) => xs.filter((x): x is ComposerRelease => x !== null)); + .catch([]); export type ComposerReleases = z.infer; -export const ComposerPackagesResponse = z.object({ - packages: z.record(z.unknown()), -}); +export const ComposerPackagesResponse = z + .object({ + packageName: z.string(), + packagesResponse: z.object({ + packages: z.record(z.unknown()), + }), + }) + .transform( + ({ packageName, packagesResponse }) => + packagesResponse.packages[packageName] + ) + .transform((xs) => ComposerReleases.parse(xs)); +export type ComposerPackagesResponse = z.infer; export function parsePackagesResponse( packageName: string, packagesResponse: unknown ): ComposerReleases { try { - const { packages } = ComposerPackagesResponse.parse(packagesResponse); - const array = MinifiedArray.parse(packages[packageName]); - const releases = ComposerReleases.parse(array); - return releases; + return ComposerPackagesResponse.parse({ packageName, packagesResponse }); } catch (err) { logger.debug( { packageName, err }, @@ -154,3 +166,74 @@ export function parsePackagesResponses( ); return extractReleaseResult(...releaseArrays); } + +export const HashSpec = z.union([ + z + .object({ sha256: z.string().nullable() }) + .transform(({ sha256 }) => ({ hash: sha256 })), + z + .object({ sha1: z.string().nullable() }) + .transform(({ sha1 }) => ({ hash: sha1 })), +]); +export type HashSpec = z.infer; + +export const RegistryFile = z.intersection( + HashSpec, + z.object({ key: z.string() }) +); +export type RegistryFile = z.infer; + +export const PackagesResponse = z.object({ + packages: looseRecord(ComposerReleases), +}); +export type PackagesResponse = z.infer; + +export const PackagistFile = PackagesResponse.merge( + z.object({ + providers: looseRecord(HashSpec).transform((x) => + Object.fromEntries( + Object.entries(x).map(([key, { hash }]) => [key, hash]) + ) + ), + }) +); +export type PackagistFile = z.infer; + +export const RegistryMeta = z + .preprocess( + (x) => (is.plainObject(x) ? x : {}), + PackagistFile.merge( + z.object({ + ['includes']: looseRecord(HashSpec).transform((x) => + Object.entries(x).map(([name, { hash }]) => ({ key: name, hash })) + ), + ['provider-includes']: looseRecord(HashSpec).transform((x) => + Object.entries(x).map(([key, { hash }]) => ({ key, hash })) + ), + ['providers-lazy-url']: looseValue(z.string()), + ['providers-url']: looseValue(z.string()), + ['metadata-url']: looseValue(z.string()), + }) + ) + ) + .transform( + ({ + ['includes']: includesFiles, + ['packages']: packages, + ['provider-includes']: files, + ['providers']: providerPackages, + ['providers-lazy-url']: providersLazyUrl, + ['providers-url']: providersUrl, + ['metadata-url']: metadataUrl, + }) => ({ + packages, + includesFiles, + providerPackages, + files, + providersUrl, + providersLazyUrl, + metadataUrl, + includesPackages: {} as Record, + }) + ); +export type RegistryMeta = z.infer; diff --git a/lib/modules/datasource/packagist/types.ts b/lib/modules/datasource/packagist/types.ts deleted file mode 100644 index 73948fe1df8aed..00000000000000 --- a/lib/modules/datasource/packagist/types.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { ReleaseResult } from '../types'; - -export interface PackageMeta { - includes?: Record; - packages: Record; - 'provider-includes': Record; - providers: Record; - 'providers-lazy-url'?: string; - 'providers-url'?: string; -} -export interface RegistryFile { - key: string; - sha256: string; -} -export interface RegistryMeta { - files?: RegistryFile[]; - providerPackages: Record; - providersUrl?: string; - providersLazyUrl?: string; - includesFiles?: RegistryFile[]; - packages: Record; -} - -export interface PackagistFile { - providers: Record; - packages?: Record; -} - -export interface AllPackages { - packages: Record; - providersUrl?: string; - providersLazyUrl?: string; - providerPackages: Record; - - includesPackages: Record; -} diff --git a/lib/modules/datasource/pod/index.spec.ts b/lib/modules/datasource/pod/index.spec.ts index 96d71bdf59871e..3f90ac87f0dd11 100644 --- a/lib/modules/datasource/pod/index.spec.ts +++ b/lib/modules/datasource/pod/index.spec.ts @@ -7,7 +7,7 @@ import { PodDatasource } from '.'; const config = { versioning: rubyVersioning.id, datasource: PodDatasource.id, - depName: 'foo', + packageName: 'foo', registryUrls: [], }; @@ -31,7 +31,7 @@ describe('modules/datasource/pod/index', () => { expect( await getPkgReleases({ datasource: PodDatasource.id, - depName: 'foobar', + packageName: 'foobar', registryUrls: [], }) ).toBeNull(); diff --git a/lib/modules/datasource/puppet-forge/index.spec.ts b/lib/modules/datasource/puppet-forge/index.spec.ts index c9bf5bdb481e4f..d4430baeb972d0 100644 --- a/lib/modules/datasource/puppet-forge/index.spec.ts +++ b/lib/modules/datasource/puppet-forge/index.spec.ts @@ -18,7 +18,6 @@ describe('modules/datasource/puppet-forge/index', () => { const res = await getPkgReleases({ datasource, - depName: 'puppetlabs/apache', packageName: 'puppetlabs/apache', }); expect(res).toMatchObject({ @@ -41,7 +40,6 @@ describe('modules/datasource/puppet-forge/index', () => { const res = await getPkgReleases({ datasource, - depName: 'puppetlabs/apache', packageName: 'puppetlabs/apache', registryUrls: ['https://forgeapi.puppet.com'], }); @@ -87,7 +85,6 @@ describe('modules/datasource/puppet-forge/index', () => { const res = await getPkgReleases({ datasource, - depName: 'puppetlabs/apache', packageName: 'puppetlabs/apache', }); expect(res).toEqual({ @@ -116,7 +113,7 @@ describe('modules/datasource/puppet-forge/index', () => { const res = await getPkgReleases({ datasource, - depName: 'foobar', + packageName: 'foobar', registryUrls: ['https://forgeapi.puppet.com'], }); expect(res).toBeNull(); @@ -131,7 +128,7 @@ describe('modules/datasource/puppet-forge/index', () => { .reply(404); const res = await getPkgReleases({ datasource, - depName: 'foobar', + packageName: 'foobar', registryUrls: ['https://forgeapi.puppet.com'], }); expect(res).toBeNull(); @@ -146,7 +143,7 @@ describe('modules/datasource/puppet-forge/index', () => { const registryUrls = ['https://puppet.mycustomregistry.com']; const res = await getPkgReleases({ datasource, - depName: 'foobar', + packageName: 'foobar', registryUrls, }); @@ -191,7 +188,7 @@ describe('modules/datasource/puppet-forge/index', () => { const res = await getPkgReleases({ datasource, - depName: 'foobar', + packageName: 'foobar', }); expect(res).toEqual({ @@ -217,7 +214,7 @@ describe('modules/datasource/puppet-forge/index', () => { const res = await getPkgReleases({ datasource, - depName: 'foobar', + packageName: 'foobar', }); expect(res).toBeNull(); diff --git a/lib/modules/datasource/pypi/common.ts b/lib/modules/datasource/pypi/common.ts index 50310011e54b8f..ea46fddcc7530f 100644 --- a/lib/modules/datasource/pypi/common.ts +++ b/lib/modules/datasource/pypi/common.ts @@ -1,6 +1,6 @@ import { regEx } from '../../../util/regex'; -const githubRepoPattern = regEx(/^https?:\/\/github\.com\/[^\\/]+\/[^\\/]+$/); +const githubRepoPattern = regEx(/^https?:\/\/github\.com\/[^/]+\/[^/]+$/); export function isGitHubRepo(url: string): boolean { return !url.includes('sponsors') && githubRepoPattern.test(url); diff --git a/lib/modules/datasource/pypi/index.spec.ts b/lib/modules/datasource/pypi/index.spec.ts index 90a1a252ef7358..7e2df584b795c9 100644 --- a/lib/modules/datasource/pypi/index.spec.ts +++ b/lib/modules/datasource/pypi/index.spec.ts @@ -38,7 +38,7 @@ describe('modules/datasource/pypi/index', () => { expect( await getPkgReleases({ datasource, - depName: 'something', + packageName: 'something', }) ).toBeNull(); }); @@ -49,7 +49,7 @@ describe('modules/datasource/pypi/index', () => { expect( await getPkgReleases({ datasource, - depName: 'something', + packageName: 'something', }) ).toBeNull(); }); @@ -59,7 +59,7 @@ describe('modules/datasource/pypi/index', () => { expect( await getPkgReleases({ datasource, - depName: 'azure-cli-monitor', + packageName: 'azure-cli-monitor', }) ).toMatchSnapshot(); }); @@ -76,7 +76,7 @@ describe('modules/datasource/pypi/index', () => { await getPkgReleases({ ...config, datasource, - depName: 'azure-cli-monitor', + packageName: 'azure-cli-monitor', }) ).toMatchObject({ registryUrl: 'https://custom.pypi.net/foo', @@ -97,7 +97,7 @@ describe('modules/datasource/pypi/index', () => { const res = await getPkgReleases({ ...config, datasource, - depName: 'azure-cli-monitor', + packageName: 'azure-cli-monitor', }); expect(res?.isPrivate).toBeTrue(); }); @@ -125,7 +125,7 @@ describe('modules/datasource/pypi/index', () => { const res = await getPkgReleases({ ...config, datasource, - depName: 'azure-cli-monitor', + packageName: 'azure-cli-monitor', }); expect(res?.releases.pop()).toMatchObject({ version: '0.2.15', @@ -148,7 +148,7 @@ describe('modules/datasource/pypi/index', () => { ( await getPkgReleases({ datasource, - depName: 'something', + packageName: 'something', }) )?.homepage ).toBe('https://microsoft.com'); @@ -172,7 +172,7 @@ describe('modules/datasource/pypi/index', () => { .reply(200, { ...JSON.parse(res1), info }); const result = await getPkgReleases({ datasource, - depName: 'flexget', + packageName: 'flexget', }); expect(result?.sourceUrl).toBe(info.project_urls.Repository); expect(result?.changelogUrl).toBe(info.project_urls.changelog); @@ -192,7 +192,7 @@ describe('modules/datasource/pypi/index', () => { .reply(200, { ...JSON.parse(res1), info }); const result = await getPkgReleases({ datasource, - depName: 'flexget', + packageName: 'flexget', }); expect(result?.sourceUrl).toBeUndefined(); }); @@ -206,7 +206,7 @@ describe('modules/datasource/pypi/index', () => { await getPkgReleases({ datasource, registryUrls: [baseUrl], - depName: 'not_normalized.Package', + packageName: 'not_normalized.Package', }); expect(expectedHttpCall.isDone()).toBeTrue(); @@ -225,7 +225,7 @@ describe('modules/datasource/pypi/index', () => { await getPkgReleases({ datasource, registryUrls: [baseUrl], - depName: 'not_normalized.Package', + packageName: 'not_normalized.Package', }); expect(expectedFallbackHttpCall.isDone()).toBeTrue(); @@ -241,7 +241,7 @@ describe('modules/datasource/pypi/index', () => { await getPkgReleases({ datasource, registryUrls: [simpleRegistryUrl], - depName: 'not_normalized.Package', + packageName: 'not_normalized.Package', }); expect(expectedHttpCall.isDone()).toBeTrue(); @@ -270,7 +270,8 @@ describe('modules/datasource/pypi/index', () => { await getPkgReleases({ datasource, constraints: { python: '2.7' }, - depName: 'doit', + packageName: 'doit', + constraintsFiltering: 'strict', }) ).toMatchSnapshot(); }); @@ -288,7 +289,7 @@ describe('modules/datasource/pypi/index', () => { datasource, ...config, constraints: { python: '2.7' }, - depName: 'dj-database-url', + packageName: 'dj-database-url', }) ).toMatchSnapshot(); }); @@ -306,7 +307,7 @@ describe('modules/datasource/pypi/index', () => { datasource, ...config, constraints: { python: '2.7' }, - depName: 'dj-database-url', + packageName: 'dj-database-url', }) ).toMatchSnapshot(); }); @@ -327,7 +328,7 @@ describe('modules/datasource/pypi/index', () => { datasource, ...config, constraints: { python: '2.7' }, - depName: 'dj-database-url', + packageName: 'dj-database-url', }); expect(res?.isPrivate).toBeTrue(); }); @@ -343,7 +344,7 @@ describe('modules/datasource/pypi/index', () => { const res = await getPkgReleases({ datasource, ...config, - depName: 'package--with-hyphens', + packageName: 'package--with-hyphens', }); expect(res?.releases).toMatchObject([ { version: '2.0.0' }, @@ -365,7 +366,7 @@ describe('modules/datasource/pypi/index', () => { datasource, ...config, constraints: { python: '2.7' }, - depName: 'image-collector', + packageName: 'image-collector', }) ).toMatchSnapshot(); }); @@ -381,7 +382,7 @@ describe('modules/datasource/pypi/index', () => { const res = await getPkgReleases({ datasource, ...config, - depName: 'PackageWithMixedCase', + packageName: 'PackageWithMixedCase', }); expect(res?.releases).toMatchObject([ { version: '2.0.0' }, @@ -401,7 +402,7 @@ describe('modules/datasource/pypi/index', () => { const res = await getPkgReleases({ datasource, ...config, - depName: 'packagewithmixedcase', + packageName: 'packagewithmixedcase', }); expect(res?.releases).toMatchObject([ { version: '2.0.0' }, @@ -421,7 +422,7 @@ describe('modules/datasource/pypi/index', () => { const res = await getPkgReleases({ datasource, ...config, - depName: 'package.with.periods', + packageName: 'package.with.periods', }); expect(res?.releases).toMatchObject([ { version: '2.0.0' }, @@ -443,7 +444,7 @@ describe('modules/datasource/pypi/index', () => { datasource, ...config, constraints: { python: '2.7' }, - depName: 'dj-database-url', + packageName: 'dj-database-url', }) ).toBeNull(); }); @@ -461,7 +462,7 @@ describe('modules/datasource/pypi/index', () => { datasource, ...config, constraints: { python: '2.7' }, - depName: 'dj-database-url', + packageName: 'dj-database-url', }) ).toBeNull(); }); @@ -479,7 +480,7 @@ describe('modules/datasource/pypi/index', () => { datasource, ...config, constraints: { python: '2.7' }, - depName: 'dj-database-url', + packageName: 'dj-database-url', }) ).toBeNull(); }); @@ -499,7 +500,7 @@ describe('modules/datasource/pypi/index', () => { const result = await getPkgReleases({ datasource, ...config, - depName: 'dj-database-url', + packageName: 'dj-database-url', }); expect(result).toMatchSnapshot(); }); @@ -517,7 +518,8 @@ describe('modules/datasource/pypi/index', () => { datasource, constraints: { python: '2.7' }, ...config, - depName: 'dj-database-url', + packageName: 'dj-database-url', + constraintsFiltering: 'strict', }) ).toMatchSnapshot(); }); @@ -533,7 +535,7 @@ describe('modules/datasource/pypi/index', () => { datasource, ...config, constraints: { python: '2.7' }, - depName: 'azure-cli-monitor', + packageName: 'azure-cli-monitor', }) ).toMatchSnapshot(); }); diff --git a/lib/modules/datasource/repology/index.spec.ts b/lib/modules/datasource/repology/index.spec.ts index aabb1b9e800be1..7e7df992af3e08 100644 --- a/lib/modules/datasource/repology/index.spec.ts +++ b/lib/modules/datasource/repology/index.spec.ts @@ -71,7 +71,7 @@ describe('modules/datasource/repology/index', () => { await getPkgReleases({ datasource, versioning, - depName: 'debian_stable/nginx', + packageName: 'debian_stable/nginx', }) ).toBeNull(); }); @@ -88,7 +88,7 @@ describe('modules/datasource/repology/index', () => { await getPkgReleases({ datasource, versioning, - depName: 'this_should/never-exist', + packageName: 'this_should/never-exist', }) ).toBeNull(); }); @@ -107,7 +107,7 @@ describe('modules/datasource/repology/index', () => { getPkgReleases({ datasource, versioning, - depName: 'debian_stable/nginx', + packageName: 'debian_stable/nginx', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -121,7 +121,7 @@ describe('modules/datasource/repology/index', () => { getPkgReleases({ datasource, versioning, - depName: 'debian_stable/nginx', + packageName: 'debian_stable/nginx', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -139,7 +139,7 @@ describe('modules/datasource/repology/index', () => { getPkgReleases({ datasource, versioning, - depName: 'debian_stable/nginx', + packageName: 'debian_stable/nginx', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -158,7 +158,7 @@ describe('modules/datasource/repology/index', () => { getPkgReleases({ datasource, versioning, - depName: 'debian_stable/nginx', + packageName: 'debian_stable/nginx', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -172,7 +172,7 @@ describe('modules/datasource/repology/index', () => { getPkgReleases({ datasource, versioning, - depName: 'debian_stable/nginx', + packageName: 'debian_stable/nginx', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -187,7 +187,7 @@ describe('modules/datasource/repology/index', () => { await getPkgReleases({ datasource, versioning, - depName: 'ubuntu_20_04/git', + packageName: 'ubuntu_20_04/git', }) ).toBeNull(); }); @@ -197,7 +197,7 @@ describe('modules/datasource/repology/index', () => { getPkgReleases({ datasource, versioning, - depName: 'invalid-lookup-name', + packageName: 'invalid-lookup-name', }) ).rejects.toThrow(EXTERNAL_HOST_ERROR); }); @@ -211,7 +211,7 @@ describe('modules/datasource/repology/index', () => { const res = await getPkgReleases({ datasource, versioning, - depName: 'debian_stable/nginx', + packageName: 'debian_stable/nginx', }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(1); @@ -230,7 +230,7 @@ describe('modules/datasource/repology/index', () => { const res = await getPkgReleases({ datasource, versioning, - depName: 'debian_stable/gcc-defaults', + packageName: 'debian_stable/gcc-defaults', }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(1); @@ -246,7 +246,7 @@ describe('modules/datasource/repology/index', () => { const res = await getPkgReleases({ datasource, versioning, - depName: 'debian_stable/gcc-defaults', + packageName: 'debian_stable/gcc-defaults', }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(1); @@ -262,7 +262,7 @@ describe('modules/datasource/repology/index', () => { const res = await getPkgReleases({ datasource, versioning, - depName: 'alpine_3_12/gcc', + packageName: 'alpine_3_12/gcc', }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(1); @@ -278,7 +278,7 @@ describe('modules/datasource/repology/index', () => { const res = await getPkgReleases({ datasource, versioning, - depName: 'debian_stable/pulseaudio-utils', + packageName: 'debian_stable/pulseaudio-utils', }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(1); @@ -297,7 +297,7 @@ describe('modules/datasource/repology/index', () => { const res = await getPkgReleases({ datasource, versioning, - depName: 'centos_8/java-11-openjdk', + packageName: 'centos_8/java-11-openjdk', }); expect(res).toMatchSnapshot(); expect(res?.releases).toHaveLength(6); @@ -325,7 +325,7 @@ describe('modules/datasource/repology/index', () => { const release = await getPkgReleases({ datasource, versioning, - depName: 'dummy/example', + packageName: 'dummy/example', }); expect(release).toBeNull(); @@ -407,7 +407,7 @@ describe('modules/datasource/repology/index', () => { const res = await getPkgReleases({ datasource, versioning, - depName: 'some_repo/some-package', + packageName: 'some_repo/some-package', }); expect(res).toEqual({ registryUrl: 'https://repology.org', @@ -434,7 +434,7 @@ describe('modules/datasource/repology/index', () => { const res = await getPkgReleases({ datasource, versioning, - depName: 'ubuntu_20_04/python3.8', + packageName: 'ubuntu_20_04/python3.8', }); expect(res).toEqual({ registryUrl: 'https://repology.org', diff --git a/lib/modules/datasource/repology/readme.md b/lib/modules/datasource/repology/readme.md index 001015b3f7cfe5..a2aa0dedb6d5c9 100644 --- a/lib/modules/datasource/repology/readme.md +++ b/lib/modules/datasource/repology/readme.md @@ -50,4 +50,4 @@ When the operating system package for `gcc` of `Alpine Linux 3.12` is updated, R !!! tip We recommend you try `loose` or `deb` versioning for distribution packages first. - This is because the version number usually doesn't match Renovate's default `semver` specification. + This is because the version number usually doesn't match Renovate's default `semver-coerced` specification. diff --git a/lib/modules/datasource/ruby-version/index.spec.ts b/lib/modules/datasource/ruby-version/index.spec.ts index 25f55333144bd9..5b082be7e54a45 100644 --- a/lib/modules/datasource/ruby-version/index.spec.ts +++ b/lib/modules/datasource/ruby-version/index.spec.ts @@ -14,7 +14,7 @@ describe('modules/datasource/ruby-version/index', () => { .reply(200, Fixtures.get('releases.html')); const res = await getPkgReleases({ datasource, - depName: 'ruby', + packageName: 'ruby', }); expect(res).toMatchSnapshot(); }); @@ -25,7 +25,7 @@ describe('modules/datasource/ruby-version/index', () => { .get('/en/downloads/releases/') .reply(200, {}); await expect( - getPkgReleases({ datasource, depName: 'ruby' }) + getPkgReleases({ datasource, packageName: 'ruby' }) ).rejects.toThrow(); }); @@ -35,7 +35,7 @@ describe('modules/datasource/ruby-version/index', () => { .get('/en/downloads/releases/') .reply(404); await expect( - getPkgReleases({ datasource, depName: 'ruby' }) + getPkgReleases({ datasource, packageName: 'ruby' }) ).rejects.toThrow(); }); }); diff --git a/lib/modules/datasource/rubygems/index.spec.ts b/lib/modules/datasource/rubygems/index.spec.ts index 77839741bfccd7..aeb874b5af0028 100644 --- a/lib/modules/datasource/rubygems/index.spec.ts +++ b/lib/modules/datasource/rubygems/index.spec.ts @@ -18,7 +18,7 @@ describe('modules/datasource/rubygems/index', () => { const params = { versioning: rubyVersioning.id, datasource: RubyGemsDatasource.id, - depName: 'rails', + packageName: 'rails', registryUrls: [ 'https://thirdparty.com', 'https://firstparty.com/basepath/', diff --git a/lib/modules/datasource/sbt-package/index.spec.ts b/lib/modules/datasource/sbt-package/index.spec.ts index 55f65dae6960a3..b1335ced6e2565 100644 --- a/lib/modules/datasource/sbt-package/index.spec.ts +++ b/lib/modules/datasource/sbt-package/index.spec.ts @@ -39,7 +39,7 @@ describe('modules/datasource/sbt-package/index', () => { const res = await getPkgReleases({ versioning: mavenVersioning.id, datasource: SbtPackageDatasource.id, - depName: 'org.scalatest:scalatest', + packageName: 'org.scalatest:scalatest', registryUrls: ['https://failed_repo/maven'], }); @@ -63,7 +63,7 @@ describe('modules/datasource/sbt-package/index', () => { const res = await getPkgReleases({ versioning: mavenVersioning.id, datasource: SbtPackageDatasource.id, - depName: 'com.example:empty', + packageName: 'com.example:empty', registryUrls: [], }); @@ -98,7 +98,7 @@ describe('modules/datasource/sbt-package/index', () => { const res = await getPkgReleases({ versioning: mavenVersioning.id, datasource: SbtPackageDatasource.id, - depName: 'org.example:example', + packageName: 'org.example:example', registryUrls: [MAVEN_REPO], }); @@ -127,7 +127,7 @@ describe('modules/datasource/sbt-package/index', () => { const res = await getPkgReleases({ versioning: mavenVersioning.id, datasource: SbtPackageDatasource.id, - depName: 'org.example:example_2.12', + packageName: 'org.example:example_2.12', registryUrls: [], }); @@ -168,7 +168,7 @@ describe('modules/datasource/sbt-package/index', () => { const res = await getPkgReleases({ versioning: mavenVersioning.id, datasource: SbtPackageDatasource.id, - depName: 'io.confluent:kafka-avro-serializer', + packageName: 'io.confluent:kafka-avro-serializer', registryUrls: ['https://packages.confluent.io/maven'], }); expect(res).toEqual({ @@ -201,7 +201,7 @@ describe('modules/datasource/sbt-package/index', () => { const res = await getPkgReleases({ versioning: mavenVersioning.id, datasource: SbtPackageDatasource.id, - depName: 'org.example:example', + packageName: 'org.example:example', registryUrls: [MAVEN_REPO], }); @@ -245,7 +245,7 @@ describe('modules/datasource/sbt-package/index', () => { const res = await getPkgReleases({ versioning: mavenVersioning.id, datasource: SbtPackageDatasource.id, - depName: 'org.example:example_2.13', + packageName: 'org.example:example_2.13', registryUrls: [ 'https://gitlab.com/api/v4/projects/123/packages/maven/', ], diff --git a/lib/modules/datasource/sbt-plugin/index.spec.ts b/lib/modules/datasource/sbt-plugin/index.spec.ts index 99a0eda1c59b89..4a8c99d76bfa30 100644 --- a/lib/modules/datasource/sbt-plugin/index.spec.ts +++ b/lib/modules/datasource/sbt-plugin/index.spec.ts @@ -145,7 +145,7 @@ describe('modules/datasource/sbt-plugin/index', () => { await getPkgReleases({ versioning: mavenVersioning.id, datasource: SbtPluginDatasource.id, - depName: 'org.scalatest:scalatest', + packageName: 'org.scalatest:scalatest', registryUrls: ['https://failed_repo/maven'], }) ).toBeNull(); @@ -153,7 +153,7 @@ describe('modules/datasource/sbt-plugin/index', () => { await getPkgReleases({ versioning: mavenVersioning.id, datasource: SbtPluginDatasource.id, - depName: 'org.scalatest:scalaz', + packageName: 'org.scalatest:scalaz', registryUrls: [], }) ).toBeNull(); @@ -164,7 +164,7 @@ describe('modules/datasource/sbt-plugin/index', () => { await getPkgReleases({ versioning: mavenVersioning.id, datasource: SbtPluginDatasource.id, - depName: 'org.foundweekends:sbt-bintray', + packageName: 'org.foundweekends:sbt-bintray', registryUrls: [], }) ).toEqual({ @@ -180,7 +180,7 @@ describe('modules/datasource/sbt-plugin/index', () => { await getPkgReleases({ versioning: mavenVersioning.id, datasource: SbtPluginDatasource.id, - depName: 'org.foundweekends:sbt-bintray_2.12', + packageName: 'org.foundweekends:sbt-bintray_2.12', registryUrls: [], }) ).toEqual({ @@ -196,7 +196,7 @@ describe('modules/datasource/sbt-plugin/index', () => { await getPkgReleases({ versioning: mavenVersioning.id, datasource: SbtPluginDatasource.id, - depName: 'io.get-coursier:sbt-coursier', + packageName: 'io.get-coursier:sbt-coursier', registryUrls: [MAVEN_REPO], }) ).toEqual({ diff --git a/lib/modules/datasource/terraform-module/index.spec.ts b/lib/modules/datasource/terraform-module/index.spec.ts index 04c0e6a9ed7219..de102a2324b298 100644 --- a/lib/modules/datasource/terraform-module/index.spec.ts +++ b/lib/modules/datasource/terraform-module/index.spec.ts @@ -26,7 +26,7 @@ describe('modules/datasource/terraform-module/index', () => { expect( await getPkgReleases({ datasource, - depName: 'hashicorp/consul/aws', + packageName: 'hashicorp/consul/aws', }) ).toBeNull(); }); @@ -41,7 +41,7 @@ describe('modules/datasource/terraform-module/index', () => { expect( await getPkgReleases({ datasource, - depName: 'hashicorp/consul/aws', + packageName: 'hashicorp/consul/aws', }) ).toBeNull(); }); @@ -56,7 +56,7 @@ describe('modules/datasource/terraform-module/index', () => { expect( await getPkgReleases({ datasource, - depName: 'hashicorp/consul/aws', + packageName: 'hashicorp/consul/aws', }) ).toBeNull(); }); @@ -70,7 +70,7 @@ describe('modules/datasource/terraform-module/index', () => { .reply(200, serviceDiscoveryResult); const res = await getPkgReleases({ datasource, - depName: 'hashicorp/consul/aws', + packageName: 'hashicorp/consul/aws', }); expect(res).toEqual({ homepage: 'https://registry.terraform.io/modules/hashicorp/consul/aws', @@ -104,7 +104,7 @@ describe('modules/datasource/terraform-module/index', () => { expect( await getPkgReleases({ datasource, - depName: 'hashicorp/consul/aws', + packageName: 'hashicorp/consul/aws', registryUrls: ['https://terraform.company.com'], }) ).toBeNull(); @@ -120,7 +120,7 @@ describe('modules/datasource/terraform-module/index', () => { expect( await getPkgReleases({ datasource, - depName: 'hashicorp/consul/aws', + packageName: 'hashicorp/consul/aws', registryUrls: ['https://terraform.company.com'], }) ).toBeNull(); @@ -136,7 +136,7 @@ describe('modules/datasource/terraform-module/index', () => { expect( await getPkgReleases({ datasource, - depName: 'hashicorp/consul/aws', + packageName: 'hashicorp/consul/aws', registryUrls: ['https://terraform.company.com'], }) ).toBeNull(); @@ -151,7 +151,7 @@ describe('modules/datasource/terraform-module/index', () => { .reply(200, serviceDiscoveryResult); const res = await getPkgReleases({ datasource, - depName: 'hashicorp/consul/aws', + packageName: 'hashicorp/consul/aws', registryUrls: ['https://terraform.company.com'], }); expect(res).toEqual({ @@ -185,7 +185,7 @@ describe('modules/datasource/terraform-module/index', () => { .reply(200, serviceDiscoveryResult); const res = await getPkgReleases({ datasource, - depName: 'registry.terraform.io/hashicorp/consul/aws', + packageName: 'registry.terraform.io/hashicorp/consul/aws', }); expect(res).toEqual({ homepage: 'https://registry.terraform.io/modules/hashicorp/consul/aws', @@ -220,7 +220,7 @@ describe('modules/datasource/terraform-module/index', () => { .reply(200, serviceDiscoveryResult); const res = await getPkgReleases({ datasource, - depName: 'consul/foo', + packageName: 'consul/foo', registryUrls: ['https://terraform.company.com'], }); expect(res).toBeNull(); @@ -237,7 +237,7 @@ describe('modules/datasource/terraform-module/index', () => { .reply(200, serviceDiscoveryResult); const res = await getPkgReleases({ datasource, - depName: 'consul/foo', + packageName: 'consul/foo', registryUrls: ['https://terraform.company.com'], }); expect(res).toBeNull(); @@ -250,7 +250,7 @@ describe('modules/datasource/terraform-module/index', () => { .reply(404); const res = await getPkgReleases({ datasource, - depName: 'consul/foo', + packageName: 'consul/foo', registryUrls: ['https://terraform.company.com'], }); expect(res).toBeNull(); @@ -266,7 +266,7 @@ describe('modules/datasource/terraform-module/index', () => { const res = await getPkgReleases({ datasource, registryUrls: ['https://terraform.foo.bar'], - depName: 'hashicorp/consul/aws', + packageName: 'hashicorp/consul/aws', }); expect(res).toEqual({ diff --git a/lib/modules/datasource/terraform-provider/index.spec.ts b/lib/modules/datasource/terraform-provider/index.spec.ts index 7fa3d732643f2a..1869bb9041046e 100644 --- a/lib/modules/datasource/terraform-provider/index.spec.ts +++ b/lib/modules/datasource/terraform-provider/index.spec.ts @@ -33,7 +33,7 @@ describe('modules/datasource/terraform-provider/index', () => { expect( await getPkgReleases({ datasource: TerraformProviderDatasource.id, - depName: 'azurerm', + packageName: 'azurerm', }) ).toBeNull(); }); @@ -52,7 +52,7 @@ describe('modules/datasource/terraform-provider/index', () => { expect( await getPkgReleases({ datasource: TerraformProviderDatasource.id, - depName: 'azurerm', + packageName: 'azurerm', }) ).toBeNull(); }); @@ -71,7 +71,7 @@ describe('modules/datasource/terraform-provider/index', () => { expect( await getPkgReleases({ datasource: TerraformProviderDatasource.id, - depName: 'azurerm', + packageName: 'azurerm', }) ).toBeNull(); }); @@ -85,7 +85,7 @@ describe('modules/datasource/terraform-provider/index', () => { .reply(200, serviceDiscoveryResult); const res = await getPkgReleases({ datasource: TerraformProviderDatasource.id, - depName: 'azurerm', + packageName: 'azurerm', }); expect(res).toEqual({ homepage: 'https://registry.terraform.io/providers/hashicorp/azurerm', @@ -114,7 +114,7 @@ describe('modules/datasource/terraform-provider/index', () => { expect( await getPkgReleases({ datasource: TerraformProviderDatasource.id, - depName: 'azurerm', + packageName: 'azurerm', registryUrls: ['https://registry.company.com'], }) ).toBeNull(); @@ -130,7 +130,7 @@ describe('modules/datasource/terraform-provider/index', () => { expect( await getPkgReleases({ datasource: TerraformProviderDatasource.id, - depName: 'azurerm', + packageName: 'azurerm', registryUrls: ['https://registry.company.com'], }) ).toBeNull(); @@ -146,7 +146,7 @@ describe('modules/datasource/terraform-provider/index', () => { expect( await getPkgReleases({ datasource: TerraformProviderDatasource.id, - depName: 'azurerm', + packageName: 'azurerm', registryUrls: ['https://registry.company.com'], }) ).toBeNull(); @@ -161,7 +161,6 @@ describe('modules/datasource/terraform-provider/index', () => { .reply(200, serviceDiscoveryResult); const res = await getPkgReleases({ datasource: TerraformProviderDatasource.id, - depName: 'azure', packageName: 'hashicorp/azurerm', registryUrls: ['https://registry.company.com'], }); @@ -197,7 +196,7 @@ describe('modules/datasource/terraform-provider/index', () => { const res = await getPkgReleases({ datasource: TerraformProviderDatasource.id, - depName: 'google-beta', + packageName: 'google-beta', }); expect(res).toEqual({ registryUrl: 'https://releases.hashicorp.com', @@ -233,7 +232,7 @@ describe('modules/datasource/terraform-provider/index', () => { const res = await getPkgReleases({ datasource: TerraformProviderDatasource.id, - depName: 'datadog', + packageName: 'datadog', }); expect(res).toBeNull(); }); @@ -247,7 +246,7 @@ describe('modules/datasource/terraform-provider/index', () => { expect( await getPkgReleases({ datasource: TerraformProviderDatasource.id, - depName: 'azurerm', + packageName: 'azurerm', }) ).toBeNull(); }); diff --git a/lib/modules/datasource/types.ts b/lib/modules/datasource/types.ts index c9a9677b064bf0..095d9f2ef1fcf1 100644 --- a/lib/modules/datasource/types.ts +++ b/lib/modules/datasource/types.ts @@ -1,9 +1,9 @@ +import type { ConstraintsFilter } from '../../config/types'; import type { ModuleApi } from '../../types'; export interface GetDigestInputConfig { datasource: string; - packageName?: string; - depName: string; + packageName: string; defaultRegistryUrls?: string[]; registryUrls?: string[] | null; additionalRegistryUrls?: string[]; @@ -30,13 +30,13 @@ export interface GetPkgReleasesConfig { registryUrls?: string[] | null; additionalRegistryUrls?: string[]; datasource: string; - depName: string; - packageName?: string; + packageName: string; versioning?: string; extractVersion?: string; constraints?: Record; replacementName?: string; replacementVersion?: string; + constraintsFiltering?: ConstraintsFilter; } export interface Release { @@ -48,12 +48,12 @@ export interface Release { isStable?: boolean; releaseTimestamp?: any; version: string; - newDigest?: string; + newDigest?: string | undefined; constraints?: Record; dependencies?: Record; devDependencies?: Record; registryUrl?: string; - sourceUrl?: string; + sourceUrl?: string | undefined; sourceDirectory?: string; } @@ -61,11 +61,11 @@ export interface ReleaseResult { deprecationMessage?: string; isPrivate?: boolean; releases: Release[]; - tags?: Record; + tags?: Record | undefined; // URL metadata changelogUrl?: string; dependencyUrl?: string; - homepage?: string; + homepage?: string | undefined; gitRef?: string; sourceUrl?: string | null; sourceDirectory?: string; @@ -81,8 +81,8 @@ export interface DatasourceApi extends ModuleApi { getDigest?(config: DigestConfig, newValue?: string): Promise; getReleases(config: GetReleasesConfig): Promise; defaultRegistryUrls?: string[] | (() => string[]); - defaultVersioning?: string; - defaultConfig?: Record; + defaultVersioning?: string | undefined; + defaultConfig?: Record | undefined; /** * Strategy to use when multiple registryUrls are available to the datasource. @@ -90,7 +90,7 @@ export interface DatasourceApi extends ModuleApi { * hunt: registryUrls will be tried in order until one returns a result * merge: all registryUrls will be tried and the results merged if more than one returns a result */ - registryStrategy?: RegistryStrategy; + registryStrategy?: RegistryStrategy | undefined; /** * Whether custom registryUrls are allowed. @@ -102,7 +102,7 @@ export interface DatasourceApi extends ModuleApi { * true: datasoure index wrapper should cache all results (based on registryUrl/packageName) * false: caching is not performed, or performed within the datasource implementation */ - caching?: boolean; + caching?: boolean | undefined; /** optional URLs to add to docs as references */ urls?: string[]; diff --git a/lib/modules/manager/api.ts b/lib/modules/manager/api.ts index e0d77944dfdb79..41dc108d9d1d8c 100644 --- a/lib/modules/manager/api.ts +++ b/lib/modules/manager/api.ts @@ -7,6 +7,7 @@ import * as batect from './batect'; import * as batectWrapper from './batect-wrapper'; import * as bazel from './bazel'; import * as bazelisk from './bazelisk'; +import * as bicep from './bicep'; import * as bitbucketPipelines from './bitbucket-pipelines'; import * as buildkite from './buildkite'; import * as bundler from './bundler'; @@ -94,6 +95,7 @@ api.set('batect', batect); api.set('batect-wrapper', batectWrapper); api.set('bazel', bazel); api.set('bazelisk', bazelisk); +api.set('bicep', bicep); api.set('bitbucket-pipelines', bitbucketPipelines); api.set('buildkite', buildkite); api.set('bundler', bundler); diff --git a/lib/modules/manager/argocd/__fixtures__/malformedApplications.yml b/lib/modules/manager/argocd/__fixtures__/malformedApplications.yml index 574b683230cc89..98e9465c74c0d7 100644 --- a/lib/modules/manager/argocd/__fixtures__/malformedApplications.yml +++ b/lib/modules/manager/argocd/__fixtures__/malformedApplications.yml @@ -9,3 +9,15 @@ spec: # malformed application as the source section is missing apiVersion: argoproj.io/v1alpha1 kind: Application +--- +# malformed application as the sources array is empty +apiVersion: argoproj.io/v1alpha1 +kind: Application +spec: + sources: [] +--- +# malformed application as the source is null +apiVersion: argoproj.io/v1alpha1 +kind: Application +spec: + source: null diff --git a/lib/modules/manager/argocd/__fixtures__/validApplication.yml b/lib/modules/manager/argocd/__fixtures__/validApplication.yml index e06d78e6589295..83f87c47ebfc0a 100644 --- a/lib/modules/manager/argocd/__fixtures__/validApplication.yml +++ b/lib/modules/manager/argocd/__fixtures__/validApplication.yml @@ -75,3 +75,55 @@ spec: chart: some/image3 repoURL: somecontainer.registry.io:443/ targetRevision: 1.0.0 +--- +apiVersion: argoproj.io/v1alpha1 +kind: Application +spec: + sources: + - chart: some/image3 + repoURL: somecontainer.registry.io:443/ + targetRevision: 1.0.0 +--- +apiVersion: argoproj.io/v1alpha1 +kind: Application +spec: + sources: + - ref: foo + repoURL: https://git.example.com/foo/bar.git + targetRevision: v1.2.0 + - chart: some/image3 + repoURL: somecontainer.registry.io:443/ + targetRevision: 1.0.0 + +--- +apiVersion: argoproj.io/v1alpha1 +kind: Application +spec: + sources: + - ref: foo + repoURL: https://git.example.com/foo/bar.git + targetRevision: v1.2.0 + path: bar + - chart: traefik + repoURL: gs://helm-charts-internal + targetRevision: 0.0.2 + helm: + valueFiles: + - $foo/values.yaml + +--- +apiVersion: argoproj.io/v1alpha1 +kind: Application +spec: + sources: + - ref: foo + repoURL: https://git.example.com/foo/bar.git + targetRevision: v1.2.0 + path: bar + - chart: somechart + repoURL: https://foo.io/repo + targetRevision: 0.0.2 + helm: + valueFiles: + - $foo/values.yaml + diff --git a/lib/modules/manager/argocd/__fixtures__/validApplicationSet.yml b/lib/modules/manager/argocd/__fixtures__/validApplicationSet.yml index e17a7e7bdc7fc7..4207c92ddffbf7 100644 --- a/lib/modules/manager/argocd/__fixtures__/validApplicationSet.yml +++ b/lib/modules/manager/argocd/__fixtures__/validApplicationSet.yml @@ -73,3 +73,73 @@ spec: destination: name: '{{server}}' namespace: podinfo +--- +apiVersion: argoproj.io/v1alpha1 +kind: ApplicationSet +metadata: + name: podinfo +spec: + generators: + - clusters: {} + template: + metadata: + name: '{{name}}-podinfo' + spec: + project: default + sources: + - chart: some/image3 + repoURL: somecontainer.registry.io:443/ + targetRevision: 1.0.0 + destination: + name: '{{server}}' + namespace: podinfo +--- +apiVersion: argoproj.io/v1alpha1 +kind: ApplicationSet +metadata: + name: podinfo +spec: + generators: + - clusters: {} + template: + metadata: + name: '{{name}}-podinfo' + spec: + project: default + sources: + - ref: foo + repoURL: https://git.example.com/foo/bar.git + targetRevision: v1.2.0 + - chart: some/image3 + repoURL: somecontainer.registry.io:443/ + targetRevision: 1.0.0 + destination: + name: '{{server}}' + namespace: podinfo +--- +apiVersion: argoproj.io/v1alpha1 +kind: ApplicationSet +metadata: + name: podinfo +spec: + generators: + - clusters: {} + template: + metadata: + name: '{{name}}-podinfo' + spec: + project: default + sources: + - ref: foo + repoURL: https://git.example.com/foo/bar.git + targetRevision: v1.2.0 + path: bar + - chart: somechart + repoURL: https://foo.io/repo + targetRevision: 0.0.2 + helm: + valueFiles: + - $foo/values.yaml + destination: + name: '{{server}}' + namespace: podinfo diff --git a/lib/modules/manager/argocd/extract.spec.ts b/lib/modules/manager/argocd/extract.spec.ts index 3413c86012edc1..003276cd78b521 100644 --- a/lib/modules/manager/argocd/extract.spec.ts +++ b/lib/modules/manager/argocd/extract.spec.ts @@ -74,6 +74,43 @@ describe('modules/manager/argocd/extract', () => { datasource: 'docker', depName: 'somecontainer.registry.io:443/some/image3', }, + { + currentValue: '1.0.0', + datasource: 'docker', + depName: 'somecontainer.registry.io:443/some/image3', + }, + { + currentValue: 'v1.2.0', + datasource: 'git-tags', + depName: 'https://git.example.com/foo/bar.git', + }, + { + currentValue: '1.0.0', + datasource: 'docker', + depName: 'somecontainer.registry.io:443/some/image3', + }, + { + currentValue: 'v1.2.0', + datasource: 'git-tags', + depName: 'https://git.example.com/foo/bar.git', + }, + { + currentValue: '0.0.2', + datasource: 'helm', + depName: 'traefik', + registryUrls: ['gs://helm-charts-internal'], + }, + { + currentValue: 'v1.2.0', + datasource: 'git-tags', + depName: 'https://git.example.com/foo/bar.git', + }, + { + currentValue: '0.0.2', + datasource: 'helm', + depName: 'somechart', + registryUrls: ['https://foo.io/repo'], + }, ], }); }); @@ -110,6 +147,32 @@ describe('modules/manager/argocd/extract', () => { depName: 'podinfo', registryUrls: ['https://stefanprodan.github.io/podinfo'], }, + { + currentValue: '1.0.0', + datasource: 'docker', + depName: 'somecontainer.registry.io:443/some/image3', + }, + { + currentValue: 'v1.2.0', + datasource: 'git-tags', + depName: 'https://git.example.com/foo/bar.git', + }, + { + currentValue: '1.0.0', + datasource: 'docker', + depName: 'somecontainer.registry.io:443/some/image3', + }, + { + currentValue: 'v1.2.0', + datasource: 'git-tags', + depName: 'https://git.example.com/foo/bar.git', + }, + { + currentValue: '0.0.2', + datasource: 'helm', + depName: 'somechart', + registryUrls: ['https://foo.io/repo'], + }, ], }); }); diff --git a/lib/modules/manager/argocd/extract.ts b/lib/modules/manager/argocd/extract.ts index eed4b535357c83..93a3ce116f2be3 100644 --- a/lib/modules/manager/argocd/extract.ts +++ b/lib/modules/manager/argocd/extract.ts @@ -1,6 +1,7 @@ import is from '@sindresorhus/is'; import { loadAll } from 'js-yaml'; import { logger } from '../../../logger'; +import { coerceArray } from '../../../util/array'; import { trimTrailingSlash } from '../../../util/url'; import { DockerDatasource } from '../../datasource/docker'; import { GitTagsDatasource } from '../../datasource/git-tags'; @@ -10,22 +11,37 @@ import type { PackageDependency, PackageFileContent, } from '../types'; -import type { ApplicationDefinition, ApplicationSource } from './types'; +import type { + ApplicationDefinition, + ApplicationSource, + ApplicationSpec, +} from './types'; import { fileTestRegex } from './util'; -function createDependency( - definition: ApplicationDefinition -): PackageDependency | null { - let source: ApplicationSource; - switch (definition.kind) { - case 'Application': - source = definition?.spec?.source; - break; - case 'ApplicationSet': - source = definition?.spec?.template?.spec?.source; - break; +export function extractPackageFile( + content: string, + fileName: string, + _config?: ExtractConfig +): PackageFileContent | null { + // check for argo reference. API version for the kind attribute is used + if (fileTestRegex.test(content) === false) { + return null; } + let definitions: ApplicationDefinition[]; + try { + definitions = loadAll(content) as ApplicationDefinition[]; + } catch (err) { + logger.debug({ err, fileName }, 'Failed to parse ArgoCD definition.'); + return null; + } + + const deps = definitions.filter(is.plainObject).flatMap(processAppSpec); + + return deps.length ? { deps } : null; +} + +function processSource(source: ApplicationSource): PackageDependency | null { if ( !source || !is.nonEmptyString(source.repoURL) || @@ -66,28 +82,27 @@ function createDependency( }; } -export function extractPackageFile( - content: string, - fileName: string, - _config?: ExtractConfig -): PackageFileContent | null { - // check for argo reference. API version for the kind attribute is used - if (fileTestRegex.test(content) === false) { - return null; +function processAppSpec( + definition: ApplicationDefinition +): PackageDependency[] { + const spec: ApplicationSpec | null | undefined = + definition.kind === 'Application' + ? definition?.spec + : definition?.spec?.template?.spec; + + if (is.nullOrUndefined(spec)) { + return []; } - let definitions: ApplicationDefinition[]; - try { - definitions = loadAll(content) as ApplicationDefinition[]; - } catch (err) { - logger.debug({ err, fileName }, 'Failed to parse ArgoCD definition.'); - return null; + const deps: (PackageDependency | null)[] = []; + + if (is.nonEmptyObject(spec.source)) { + deps.push(processSource(spec.source)); } - const deps = definitions - .filter(is.plainObject) - .map((definition) => createDependency(definition)) - .filter(is.truthy); + for (const source of coerceArray(spec.sources)) { + deps.push(processSource(source)); + } - return deps.length ? { deps } : null; + return deps.filter(is.truthy); } diff --git a/lib/modules/manager/argocd/types.ts b/lib/modules/manager/argocd/types.ts index 95420e8c0fd59f..f8b473e6d195af 100644 --- a/lib/modules/manager/argocd/types.ts +++ b/lib/modules/manager/argocd/types.ts @@ -8,20 +8,21 @@ export interface ApplicationSource { targetRevision: string; } +export interface ApplicationSpec { + source?: ApplicationSource; + sources?: ApplicationSource[]; +} + export interface Application extends KubernetesResource { kind: 'Application'; - spec: { - source: ApplicationSource; - }; + spec: ApplicationSpec; } export interface ApplicationSet extends KubernetesResource { kind: 'ApplicationSet'; spec: { template: { - spec: { - source: ApplicationSource; - }; + spec: ApplicationSpec; }; }; } diff --git a/lib/modules/manager/asdf/extract.spec.ts b/lib/modules/manager/asdf/extract.spec.ts index 67126828fd6a66..dd323150f2b1fd 100644 --- a/lib/modules/manager/asdf/extract.spec.ts +++ b/lib/modules/manager/asdf/extract.spec.ts @@ -49,12 +49,14 @@ bun 0.2.2 cargo-make 0.36.2 clojure 1.11.1.1182 crystal 1.6.1 +dart 2.19.3 deno 1.26.2 direnv 2.32.1 dprint 0.32.2 elixir 1.14.1 elm 0.19.1 erlang 25.1.2 +flutter 3.7.6 gauche 0.9.12 gohugo extended_0.104.3 golang 1.19.2 @@ -75,6 +77,7 @@ ocaml 4.14.0 perl 5.37.5 php 8.1.12 pnpm 7.26.2 +pulumi 3.57.1 python 3.11.0 ruby 3.1.2 rust 1.64.0 @@ -130,6 +133,11 @@ dummy 1.2.3 packageName: 'crystal-lang/crystal', depName: 'crystal', }, + { + currentValue: '2.19.3', + datasource: 'dart-version', + depName: 'dart', + }, { currentValue: '1.26.2', datasource: 'github-releases', @@ -170,6 +178,11 @@ dummy 1.2.3 'regex:^(?\\d+?)\\.(?\\d+?)(\\.(?\\d+))?$', depName: 'erlang', }, + { + currentValue: '3.7.6', + datasource: 'flutter-version', + depName: 'flutter', + }, { currentValue: '0.9.12', datasource: 'docker', @@ -304,6 +317,13 @@ dummy 1.2.3 depName: 'pnpm', versioning: 'semver', }, + { + currentValue: '3.57.1', + datasource: 'github-releases', + packageName: 'pulumi/pulumi', + depName: 'pulumi', + extractVersion: '^v(?\\S+)', + }, { currentValue: '3.11.0', datasource: 'github-tags', diff --git a/lib/modules/manager/asdf/index.ts b/lib/modules/manager/asdf/index.ts index f488800413c158..134ac7e3663a5d 100644 --- a/lib/modules/manager/asdf/index.ts +++ b/lib/modules/manager/asdf/index.ts @@ -1,4 +1,6 @@ +import { DartVersionDatasource } from '../../datasource/dart-version'; import { DockerDatasource } from '../../datasource/docker'; +import { FlutterVersionDatasource } from '../../datasource/flutter-version'; import { GithubReleasesDatasource } from '../../datasource/github-releases'; import { GithubTagsDatasource } from '../../datasource/github-tags'; import { HexpmBobDatasource } from '../../datasource/hexpm-bob'; @@ -24,4 +26,6 @@ export const supportedDatasources = [ NodeDatasource.id, NpmDatasource.id, RubyVersionDatasource.id, + DartVersionDatasource.id, + FlutterVersionDatasource.id, ]; diff --git a/lib/modules/manager/asdf/upgradeable-tooling.ts b/lib/modules/manager/asdf/upgradeable-tooling.ts index 878f7d28a918e6..287c6610386b26 100644 --- a/lib/modules/manager/asdf/upgradeable-tooling.ts +++ b/lib/modules/manager/asdf/upgradeable-tooling.ts @@ -1,4 +1,6 @@ +import { DartVersionDatasource } from '../../datasource/dart-version'; import { DockerDatasource } from '../../datasource/docker'; +import { FlutterVersionDatasource } from '../../datasource/flutter-version'; import { GithubReleasesDatasource } from '../../datasource/github-releases'; import { GithubTagsDatasource } from '../../datasource/github-tags'; import { HexpmBobDatasource } from '../../datasource/hexpm-bob'; @@ -80,6 +82,12 @@ export const upgradeableTooling: Record = { packageName: 'crystal-lang/crystal', }, }, + dart: { + asdfPluginUrl: 'https://github.com/PatOConnor43/asdf-dart', + config: { + datasource: DartVersionDatasource.id, + }, + }, deno: { asdfPluginUrl: 'https://github.com/asdf-community/asdf-deno', config: { @@ -125,6 +133,12 @@ export const upgradeableTooling: Record = { versioning: `${regexVersioning.id}:^(?\\d+?)\\.(?\\d+?)(\\.(?\\d+))?$`, }, }, + flutter: { + asdfPluginUrl: 'https://github.com/oae/asdf-flutter', + config: { + datasource: FlutterVersionDatasource.id, + }, + }, gauche: { asdfPluginUrl: 'https://github.com/sakuro/asdf-gauche', config: { @@ -286,6 +300,14 @@ export const upgradeableTooling: Record = { versioning: semverVersioning.id, }, }, + pulumi: { + asdfPluginUrl: 'https://github.com/canha/asdf-pulumi.git', + config: { + datasource: GithubReleasesDatasource.id, + packageName: 'pulumi/pulumi', + extractVersion: '^v(?\\S+)', + }, + }, python: { asdfPluginUrl: 'https://github.com/danhper/asdf-python', config: { diff --git a/lib/modules/manager/bazel/rules/index.spec.ts b/lib/modules/manager/bazel/rules/index.spec.ts index a1b9a955361469..6bdfbc9fde6406 100644 --- a/lib/modules/manager/bazel/rules/index.spec.ts +++ b/lib/modules/manager/bazel/rules/index.spec.ts @@ -378,6 +378,7 @@ describe('modules/manager/bazel/rules/index', () => { { currentValue: '1.1.1', datasource: 'maven', + versioning: 'gradle', depType: 'maven_install', depName: 'com.example1:foo', registryUrls: [ @@ -388,6 +389,7 @@ describe('modules/manager/bazel/rules/index', () => { { currentValue: '2.2.2', datasource: 'maven', + versioning: 'gradle', depType: 'maven_install', depName: 'com.example2:bar', registryUrls: [ @@ -398,6 +400,7 @@ describe('modules/manager/bazel/rules/index', () => { { currentValue: '3.3.3', datasource: 'maven', + versioning: 'gradle', depType: 'maven_install', depName: 'com.example3:baz', registryUrls: [ diff --git a/lib/modules/manager/bazel/rules/maven.ts b/lib/modules/manager/bazel/rules/maven.ts index 448185e371a0fc..5107ea1ad49905 100644 --- a/lib/modules/manager/bazel/rules/maven.ts +++ b/lib/modules/manager/bazel/rules/maven.ts @@ -1,6 +1,7 @@ import is from '@sindresorhus/is'; import { z } from 'zod'; import { MavenDatasource } from '../../../datasource/maven'; +import { id as versioning } from '../../../versioning/gradle'; import type { PackageDependency } from '../../types'; export const mavenRules = ['maven_install'] as const; @@ -52,6 +53,7 @@ export const MavenTarget = z }): PackageDependency[] => artifacts.map(({ group, artifact, version: currentValue }) => ({ datasource: MavenDatasource.id, + versioning, depName: `${group}:${artifact}`, currentValue, depType, diff --git a/lib/modules/manager/bazelisk/index.ts b/lib/modules/manager/bazelisk/index.ts index 345989e1b4c99a..350125b3b3a06c 100644 --- a/lib/modules/manager/bazelisk/index.ts +++ b/lib/modules/manager/bazelisk/index.ts @@ -3,7 +3,7 @@ import { GithubReleasesDatasource } from '../../datasource/github-releases'; export { extractPackageFile } from './extract'; export const defaultConfig = { - fileMatch: ['(^|\\/)\\.bazelversion$'], + fileMatch: ['(^|/)\\.bazelversion$'], pinDigests: false, }; diff --git a/lib/modules/manager/bicep/extract.spec.ts b/lib/modules/manager/bicep/extract.spec.ts new file mode 100644 index 00000000000000..7c9d8bcb8ab8b2 --- /dev/null +++ b/lib/modules/manager/bicep/extract.spec.ts @@ -0,0 +1,278 @@ +import { codeBlock } from 'common-tags'; +import { extractPackageFile } from '.'; + +describe('modules/manager/bicep/extract', () => { + it('should extract a normal resource', async () => { + const result = await extractPackageFile( + codeBlock` + param location string = resourceGroup().location + + resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = { + name: 'test' + kind: 'StorageV2' + sku: { + name: 'Standard_LRS' + } + location: location + } + `, + '', + {} + ); + + expect(result).toEqual({ + deps: [ + { + autoReplaceStringTemplate: "'{{depName}}@{{newValue}}'", + currentValue: '2022-09-01', + datasource: 'azure-bicep-resource', + depName: 'Microsoft.Storage/storageAccounts', + replaceString: "'Microsoft.Storage/storageAccounts@2022-09-01'", + versioning: 'azure-rest-api', + }, + ], + }); + }); + + it('should not extract a commented out resource', async () => { + const result = await extractPackageFile( + codeBlock` + // param location string = resourceGroup().location + + // resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = { + // name: 'test' + // kind: 'StorageV2' + // sku: { + // name: 'Standard_LRS' + // } + // location: location + // } + `, + '', + {} + ); + + expect(result).toBeNull(); + }); + + it('should extract a conditional resource', async () => { + const result = await extractPackageFile( + codeBlock` + param location string = resourceGroup().location + + resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = if(0 == 1) { + name: 'test' + kind: 'StorageV2' + sku: { + name: 'Standard_LRS' + } + location: location + } + `, + '', + {} + ); + + expect(result).toEqual({ + deps: [ + { + autoReplaceStringTemplate: "'{{depName}}@{{newValue}}'", + currentValue: '2022-09-01', + datasource: 'azure-bicep-resource', + depName: 'Microsoft.Storage/storageAccounts', + replaceString: "'Microsoft.Storage/storageAccounts@2022-09-01'", + versioning: 'azure-rest-api', + }, + ], + }); + }); + + it('should extract a existing resource', async () => { + const result = await extractPackageFile( + codeBlock` + resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' existing = { + name: 'test' + } + + output id string = storageAccount.id + `, + '', + {} + ); + + expect(result).toEqual({ + deps: [ + { + autoReplaceStringTemplate: "'{{depName}}@{{newValue}}'", + currentValue: '2022-09-01', + datasource: 'azure-bicep-resource', + depName: 'Microsoft.Storage/storageAccounts', + replaceString: "'Microsoft.Storage/storageAccounts@2022-09-01'", + versioning: 'azure-rest-api', + }, + ], + }); + }); + + it('should extract a conditional loop resource', async () => { + const result = await extractPackageFile( + codeBlock` + param location string = resourceGroup().location + + resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = [for name in ['test', 'test2']: if(42 == 'the answer') { + name: name + kind: 'StorageV2' + sku: { + name: 'Standard_LRS' + } + location: location + }] + `, + '', + {} + ); + + expect(result).toEqual({ + deps: [ + { + autoReplaceStringTemplate: "'{{depName}}@{{newValue}}'", + currentValue: '2022-09-01', + datasource: 'azure-bicep-resource', + depName: 'Microsoft.Storage/storageAccounts', + replaceString: "'Microsoft.Storage/storageAccounts@2022-09-01'", + versioning: 'azure-rest-api', + }, + ], + }); + }); + + it('should extract a loop resource', async () => { + const result = await extractPackageFile( + codeBlock` + param location string = resourceGroup().location + + resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = [for name in ['test', 'test2']: { + name: name + kind: 'StorageV2' + sku: { + name: 'Standard_LRS' + } + location: location + }] + `, + '', + {} + ); + + expect(result).toEqual({ + deps: [ + { + autoReplaceStringTemplate: "'{{depName}}@{{newValue}}'", + currentValue: '2022-09-01', + datasource: 'azure-bicep-resource', + depName: 'Microsoft.Storage/storageAccounts', + replaceString: "'Microsoft.Storage/storageAccounts@2022-09-01'", + versioning: 'azure-rest-api', + }, + ], + }); + }); + + it('should not extract a nested unversioned resource', async () => { + const result = await extractPackageFile( + codeBlock` + param location string = resourceGroup().location + + resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = { + name: 'test' + kind: 'StorageV2' + sku: { + name: 'Standard_LRS' + } + location: location + + resource blobServices 'blobServices' = { + name: 'default' + } + } + `, + '', + {} + ); + + expect(result).toEqual({ + deps: [ + { + autoReplaceStringTemplate: "'{{depName}}@{{newValue}}'", + currentValue: '2022-09-01', + datasource: 'azure-bicep-resource', + depName: 'Microsoft.Storage/storageAccounts', + replaceString: "'Microsoft.Storage/storageAccounts@2022-09-01'", + versioning: 'azure-rest-api', + }, + ], + }); + }); + + it('should not extract a nested versioned resource', async () => { + const result = await extractPackageFile( + codeBlock` + param location string = resourceGroup().location + + resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = { + name: 'test' + kind: 'StorageV2' + sku: { + name: 'Standard_LRS' + } + location: location + + resource blobServices 'blobServices@2022-09-01' = { + name: 'default' + } + } + `, + '', + {} + ); + + expect(result).toEqual({ + deps: [ + { + autoReplaceStringTemplate: "'{{depName}}@{{newValue}}'", + currentValue: '2022-09-01', + datasource: 'azure-bicep-resource', + depName: 'Microsoft.Storage/storageAccounts', + replaceString: "'Microsoft.Storage/storageAccounts@2022-09-01'", + versioning: 'azure-rest-api', + }, + ], + }); + }); + + it('should extract a sub resource', async () => { + const result = await extractPackageFile( + codeBlock` + resource storageAccount 'Microsoft.Storage/storageAccounts/blobServices/containers@2022-09-01' = { + name: 'parent/child/this' + } + `, + '', + {} + ); + + expect(result).toEqual({ + deps: [ + { + autoReplaceStringTemplate: "'{{depName}}@{{newValue}}'", + currentValue: '2022-09-01', + datasource: 'azure-bicep-resource', + depName: 'Microsoft.Storage/storageAccounts/blobServices/containers', + replaceString: + "'Microsoft.Storage/storageAccounts/blobServices/containers@2022-09-01'", + versioning: 'azure-rest-api', + }, + ], + }); + }); +}); diff --git a/lib/modules/manager/bicep/extract.ts b/lib/modules/manager/bicep/extract.ts new file mode 100644 index 00000000000000..a104d213648530 --- /dev/null +++ b/lib/modules/manager/bicep/extract.ts @@ -0,0 +1,45 @@ +import { newlineRegex, regEx } from '../../../util/regex'; +import { AzureBicepResourceDatasource } from '../../datasource/azure-bicep-resource'; +import type { + ExtractConfig, + PackageDependency, + PackageFileContent, +} from '../types'; + +const RESOURCE_REGEX = regEx( + /resource\s+[A-Za-z0-9_]+\s+(?'(?.+\..+\/.+)@(?.+?)')/ +); + +export function extractPackageFile( + content: string, + packageFile: string, + config: ExtractConfig +): Promise { + const deps: PackageDependency[] = []; + + for (const line of content.split(newlineRegex)) { + const trimmedLine = line?.trim(); + if (!trimmedLine || trimmedLine.startsWith('//')) { + continue; + } + + const match = RESOURCE_REGEX.exec(trimmedLine); + + if (!match?.groups) { + continue; + } + + const { depName, currentValue, replaceString } = match.groups; + + deps.push({ + datasource: AzureBicepResourceDatasource.id, + versioning: 'azure-rest-api', + depName, + currentValue, + autoReplaceStringTemplate: "'{{depName}}@{{newValue}}'", + replaceString, + }); + } + + return Promise.resolve(deps.length ? { deps } : null); +} diff --git a/lib/modules/manager/bicep/index.ts b/lib/modules/manager/bicep/index.ts new file mode 100644 index 00000000000000..6d03e93e34b143 --- /dev/null +++ b/lib/modules/manager/bicep/index.ts @@ -0,0 +1,9 @@ +import { AzureBicepResourceDatasource } from '../../datasource/azure-bicep-resource'; + +export { extractPackageFile } from './extract'; + +export const defaultConfig = { + fileMatch: ['\\.bicep$'], +}; + +export const supportedDatasources = [AzureBicepResourceDatasource.id]; diff --git a/lib/modules/manager/bicep/readme.md b/lib/modules/manager/bicep/readme.md new file mode 100644 index 00000000000000..0ed4154adfa570 --- /dev/null +++ b/lib/modules/manager/bicep/readme.md @@ -0,0 +1 @@ +Updates the Azure REST API version of `resource`s in [Bicep](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview) files. diff --git a/lib/modules/manager/bitbucket-pipelines/__fixtures__/bitbucket-pipelines.yaml b/lib/modules/manager/bitbucket-pipelines/__fixtures__/bitbucket-pipelines.yaml index ec44288c93764c..c56064f849f004 100644 --- a/lib/modules/manager/bitbucket-pipelines/__fixtures__/bitbucket-pipelines.yaml +++ b/lib/modules/manager/bitbucket-pipelines/__fixtures__/bitbucket-pipelines.yaml @@ -6,6 +6,7 @@ pipelines: name: Build and Test image: node:10.15.2 script: + - pipe: docker://jfrogecosystem/jfrog-setup-cli:2.0.2 - npm install - npm test - npm run dist @@ -21,4 +22,4 @@ pipelines: AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION: "us-east-1" S3_BUCKET: "my-bucket-name" - LOCAL_PATH: "dist" \ No newline at end of file + LOCAL_PATH: "dist" diff --git a/lib/modules/manager/bitbucket-pipelines/extract.spec.ts b/lib/modules/manager/bitbucket-pipelines/extract.spec.ts index 70607241007e82..cec1fdd230ccf4 100644 --- a/lib/modules/manager/bitbucket-pipelines/extract.spec.ts +++ b/lib/modules/manager/bitbucket-pipelines/extract.spec.ts @@ -29,6 +29,15 @@ describe('modules/manager/bitbucket-pipelines/extract', () => { "depType": "docker", "replaceString": "node:10.15.2", }, + { + "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}", + "currentDigest": undefined, + "currentValue": "2.0.2", + "datasource": "docker", + "depName": "jfrogecosystem/jfrog-setup-cli", + "depType": "docker", + "replaceString": "jfrogecosystem/jfrog-setup-cli:2.0.2", + }, { "currentValue": "0.2.1", "datasource": "bitbucket-tags", @@ -37,7 +46,7 @@ describe('modules/manager/bitbucket-pipelines/extract', () => { }, ] `); - expect(res?.deps).toHaveLength(3); + expect(res?.deps).toHaveLength(4); }); }); }); diff --git a/lib/modules/manager/bitbucket-pipelines/extract.ts b/lib/modules/manager/bitbucket-pipelines/extract.ts index 1b3f67d363dfad..f033e89c2a2c6a 100644 --- a/lib/modules/manager/bitbucket-pipelines/extract.ts +++ b/lib/modules/manager/bitbucket-pipelines/extract.ts @@ -1,5 +1,6 @@ import { logger } from '../../../logger'; import { newlineRegex, regEx } from '../../../util/regex'; +import { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags'; import { getDep } from '../dockerfile/extract'; import type { PackageDependency, PackageFileContent } from '../types'; @@ -15,40 +16,19 @@ export function extractPackageFile(content: string): PackageFileContent | null { const pipeMatch = pipeRegex.exec(line); if (pipeMatch) { const pipe = pipeMatch[1]; - const [depName, currentValue] = pipe.split(':'); - const dep: PackageDependency = { - depName, - currentValue, - datasource: 'bitbucket-tags', - }; - - logger.trace( - { - depName: dep.depName, - currentValue: dep.currentValue, - }, - 'Bitbucket pipe' - ); - dep.depType = 'bitbucket-tags'; - deps.push(dep); + if (pipe.startsWith('docker://')) { + const currentPipe = pipe.replace('docker://', ''); + addDepAsDockerImage(deps, currentPipe); + } else { + addDepAsBitbucketTag(deps, pipe); + } } const dockerImageMatch = dockerImageRegex.exec(line); if (dockerImageMatch) { const currentFrom = dockerImageMatch[1]; - const dep = getDep(currentFrom); - - logger.trace( - { - depName: dep.depName, - currentValue: dep.currentValue, - currentDigest: dep.currentDigest, - }, - 'Docker image' - ); - dep.depType = 'docker'; - deps.push(dep); + addDepAsDockerImage(deps, currentFrom); } } } catch (err) /* istanbul ignore next */ { @@ -59,3 +39,25 @@ export function extractPackageFile(content: string): PackageFileContent | null { } return { deps }; } +function addDepAsBitbucketTag( + deps: PackageDependency>[], + pipe: string +): void { + const [depName, currentValue] = pipe.split(':'); + const dep: PackageDependency = { + depName, + currentValue, + datasource: BitbucketTagsDatasource.id, + }; + dep.depType = 'bitbucket-tags'; + deps.push(dep); +} + +function addDepAsDockerImage( + deps: PackageDependency>[], + currentDockerImage: string +): void { + const dep = getDep(currentDockerImage); + dep.depType = 'docker'; + deps.push(dep); +} diff --git a/lib/modules/manager/bundler/artifacts.spec.ts b/lib/modules/manager/bundler/artifacts.spec.ts index 7271c99dab2035..a2eab121cdc71f 100644 --- a/lib/modules/manager/bundler/artifacts.spec.ts +++ b/lib/modules/manager/bundler/artifacts.spec.ts @@ -280,7 +280,7 @@ describe('modules/manager/bundler/artifacts', () => { }) ).toEqual([updatedGemfileLock]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -291,7 +291,7 @@ describe('modules/manager/bundler/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool ruby 1.2.0' + ' && ' + @@ -340,7 +340,7 @@ describe('modules/manager/bundler/artifacts', () => { }) ).toEqual([updatedGemfileLock]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -351,7 +351,7 @@ describe('modules/manager/bundler/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool ruby 1.2.5' + ' && ' + @@ -402,7 +402,7 @@ describe('modules/manager/bundler/artifacts', () => { }) ).toEqual([updatedGemfileLock]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -413,7 +413,7 @@ describe('modules/manager/bundler/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool ruby 1.3.0' + ' && ' + @@ -463,7 +463,7 @@ describe('modules/manager/bundler/artifacts', () => { }) ).toEqual([updatedGemfileLock]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -475,7 +475,7 @@ describe('modules/manager/bundler/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool ruby 1.2.0' + ' && ' + @@ -534,7 +534,7 @@ describe('modules/manager/bundler/artifacts', () => { }) ).toEqual([updatedGemfileLock]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -545,7 +545,7 @@ describe('modules/manager/bundler/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool ruby 1.2.0' + ' && ' + @@ -606,7 +606,7 @@ describe('modules/manager/bundler/artifacts', () => { }) ).toEqual([updatedGemfileLock]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -617,7 +617,7 @@ describe('modules/manager/bundler/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool ruby 1.2.0' + ' && ' + @@ -677,7 +677,7 @@ describe('modules/manager/bundler/artifacts', () => { }) ).toEqual([updatedGemfileLock]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -688,7 +688,7 @@ describe('modules/manager/bundler/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool ruby 1.2.0' + ' && ' + diff --git a/lib/modules/manager/cargo/artifacts.spec.ts b/lib/modules/manager/cargo/artifacts.spec.ts index f7be45d07709d6..1ad6453f3c6331 100644 --- a/lib/modules/manager/cargo/artifacts.spec.ts +++ b/lib/modules/manager/cargo/artifacts.spec.ts @@ -210,7 +210,7 @@ describe('modules/manager/cargo/artifacts', () => { }, ]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, {}, { cmd: @@ -220,7 +220,7 @@ describe('modules/manager/cargo/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar ' + + 'containerbase/sidecar ' + 'bash -l -c "' + 'install-tool rust 1.65.0' + ' && ' + diff --git a/lib/modules/manager/cargo/index.ts b/lib/modules/manager/cargo/index.ts index c7768858e33808..45ee9c4fada786 100644 --- a/lib/modules/manager/cargo/index.ts +++ b/lib/modules/manager/cargo/index.ts @@ -3,6 +3,7 @@ import { CrateDatasource } from '../../datasource/crate'; import * as cargoVersioning from '../../versioning/cargo'; import { updateArtifacts } from './artifacts'; import { extractPackageFile } from './extract'; +export { getRangeStrategy } from './range'; export const language: ProgrammingLanguage = 'rust'; export const supportsLockFileMaintenance = true; @@ -13,7 +14,6 @@ export const defaultConfig = { commitMessageTopic: 'Rust crate {{depName}}', fileMatch: ['(^|/)Cargo\\.toml$'], versioning: cargoVersioning.id, - rangeStrategy: 'bump', }; export const supportedDatasources = [CrateDatasource.id]; diff --git a/lib/modules/manager/cargo/range.spec.ts b/lib/modules/manager/cargo/range.spec.ts new file mode 100644 index 00000000000000..0356aac6a8cd22 --- /dev/null +++ b/lib/modules/manager/cargo/range.spec.ts @@ -0,0 +1,14 @@ +import type { RangeConfig } from '../types'; +import { getRangeStrategy } from '.'; + +describe('modules/manager/cargo/range', () => { + it('returns same if not auto', () => { + const config: RangeConfig = { rangeStrategy: 'widen' }; + expect(getRangeStrategy(config)).toBe('widen'); + }); + + it('defaults to bump', () => { + const config: RangeConfig = { rangeStrategy: 'auto' }; + expect(getRangeStrategy(config)).toBe('bump'); + }); +}); diff --git a/lib/modules/manager/cargo/range.ts b/lib/modules/manager/cargo/range.ts new file mode 100644 index 00000000000000..8f3d6e7eb54595 --- /dev/null +++ b/lib/modules/manager/cargo/range.ts @@ -0,0 +1,8 @@ +import type { RangeStrategy } from '../../../types'; +import type { RangeConfig } from '../types'; + +export function getRangeStrategy({ + rangeStrategy, +}: RangeConfig): RangeStrategy { + return rangeStrategy === 'auto' ? 'bump' : rangeStrategy; +} diff --git a/lib/modules/manager/circleci/extract.ts b/lib/modules/manager/circleci/extract.ts index 4f3bc24ab9c4ae..3557cb7a2f6a2b 100644 --- a/lib/modules/manager/circleci/extract.ts +++ b/lib/modules/manager/circleci/extract.ts @@ -41,7 +41,6 @@ export function extractPackageFile(content: string): PackageFileContent | null { packageName: orbName, commitMessageTopic: '{{{depName}}} orb', versioning: npmVersioning.id, - rangeStrategy: 'pin', }; deps.push(dep); } diff --git a/lib/modules/manager/circleci/index.ts b/lib/modules/manager/circleci/index.ts index 8505e9d39ce635..183098e281c8b8 100644 --- a/lib/modules/manager/circleci/index.ts +++ b/lib/modules/manager/circleci/index.ts @@ -1,6 +1,7 @@ import { DockerDatasource } from '../../datasource/docker'; import { OrbDatasource } from '../../datasource/orb'; import { extractPackageFile } from './extract'; +export { getRangeStrategy } from './range'; export { extractPackageFile }; diff --git a/lib/modules/manager/circleci/range.spec.ts b/lib/modules/manager/circleci/range.spec.ts new file mode 100644 index 00000000000000..40fb6c583d8d5e --- /dev/null +++ b/lib/modules/manager/circleci/range.spec.ts @@ -0,0 +1,14 @@ +import type { RangeConfig } from '../types'; +import { getRangeStrategy } from '.'; + +describe('modules/manager/circleci/range', () => { + it('returns same if not auto', () => { + const config: RangeConfig = { rangeStrategy: 'widen' }; + expect(getRangeStrategy(config)).toBe('widen'); + }); + + it('defaults to bump', () => { + const config: RangeConfig = { rangeStrategy: 'auto', depType: 'require' }; + expect(getRangeStrategy(config)).toBe('pin'); + }); +}); diff --git a/lib/modules/manager/circleci/range.ts b/lib/modules/manager/circleci/range.ts new file mode 100644 index 00000000000000..2c3311a8ca0c2a --- /dev/null +++ b/lib/modules/manager/circleci/range.ts @@ -0,0 +1,8 @@ +import type { RangeStrategy } from '../../../types'; +import type { RangeConfig } from '../types'; + +export function getRangeStrategy({ + rangeStrategy, +}: RangeConfig): RangeStrategy { + return rangeStrategy === 'auto' ? 'pin' : rangeStrategy; +} diff --git a/lib/modules/manager/cocoapods/__snapshots__/artifacts.spec.ts.snap b/lib/modules/manager/cocoapods/__snapshots__/artifacts.spec.ts.snap index f23ccb9731a49f..3dab15063ae67d 100644 --- a/lib/modules/manager/cocoapods/__snapshots__/artifacts.spec.ts.snap +++ b/lib/modules/manager/cocoapods/__snapshots__/artifacts.spec.ts.snap @@ -57,13 +57,13 @@ exports[`modules/manager/cocoapods/artifacts returns pod exec error 1`] = ` exports[`modules/manager/cocoapods/artifacts returns updated Podfile 1`] = ` [ { - "cmd": "docker pull renovate/sidecar", + "cmd": "docker pull containerbase/sidecar", "options": { "encoding": "utf-8", }, }, { - "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/cache":"/tmp/cache" -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" renovate/sidecar bash -l -c "install-tool ruby 3.1.0 && install-tool cocoapods 3.1.0 && gem install cocoapods-acknowledgements && pod install"", + "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/cache":"/tmp/cache" -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" containerbase/sidecar bash -l -c "install-tool ruby 3.1.0 && install-tool cocoapods 3.1.0 && gem install cocoapods-acknowledgements && pod install"", "options": { "cwd": "/tmp/github/some/repo", "encoding": "utf-8", @@ -88,13 +88,13 @@ exports[`modules/manager/cocoapods/artifacts returns updated Podfile 1`] = ` exports[`modules/manager/cocoapods/artifacts returns updated Podfile and Pods files 1`] = ` [ { - "cmd": "docker pull renovate/sidecar", + "cmd": "docker pull containerbase/sidecar", "options": { "encoding": "utf-8", }, }, { - "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/cache":"/tmp/cache" -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" renovate/sidecar bash -l -c "install-tool ruby 3.1.0 && install-tool cocoapods 3.1.0 && pod install"", + "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/cache":"/tmp/cache" -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" containerbase/sidecar bash -l -c "install-tool ruby 3.1.0 && install-tool cocoapods 3.1.0 && pod install"", "options": { "cwd": "/tmp/github/some/repo", "encoding": "utf-8", diff --git a/lib/modules/manager/cocoapods/artifacts.spec.ts b/lib/modules/manager/cocoapods/artifacts.spec.ts index 514954474de213..a4caf0fe10d5b8 100644 --- a/lib/modules/manager/cocoapods/artifacts.spec.ts +++ b/lib/modules/manager/cocoapods/artifacts.spec.ts @@ -252,7 +252,7 @@ describe('modules/manager/cocoapods/artifacts', () => { config, }); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker run --rm --name=renovate_sidecar --label=renovate_child ' + @@ -261,7 +261,7 @@ describe('modules/manager/cocoapods/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool ruby 3.1.0' + ' && ' + diff --git a/lib/modules/manager/cocoapods/extract.ts b/lib/modules/manager/cocoapods/extract.ts index e251df745da8ab..ddb17826e75413 100644 --- a/lib/modules/manager/cocoapods/extract.ts +++ b/lib/modules/manager/cocoapods/extract.ts @@ -9,7 +9,7 @@ import type { PackageDependency, PackageFileContent } from '../types'; import type { ParsedLine } from './types'; const regexMappings = [ - regEx(`^\\s*pod\\s+(['"])(?[^'"/]+)(\\/(?[^'"]+))?(['"])`), + regEx(`^\\s*pod\\s+(['"])(?[^'"/]+)(/(?[^'"]+))?(['"])`), regEx( `^\\s*pod\\s+(['"])[^'"]+(['"])\\s*,\\s*(['"])(?[^'"]+)(['"])\\s*$` ), diff --git a/lib/modules/manager/composer/artifacts.spec.ts b/lib/modules/manager/composer/artifacts.spec.ts index 2191ab49e9998a..d7486171970396 100644 --- a/lib/modules/manager/composer/artifacts.spec.ts +++ b/lib/modules/manager/composer/artifacts.spec.ts @@ -461,7 +461,7 @@ describe('modules/manager/composer/artifacts', () => { ]); expect(execSnapshots).toMatchObject([ { - cmd: 'docker pull renovate/sidecar', + cmd: 'docker pull containerbase/sidecar', options: { encoding: 'utf-8', }, @@ -481,7 +481,7 @@ describe('modules/manager/composer/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool php 7.3' + ' && ' + diff --git a/lib/modules/manager/composer/extract.spec.ts b/lib/modules/manager/composer/extract.spec.ts index bee3f2ec6cbd7a..617db0e7245fe2 100644 --- a/lib/modules/manager/composer/extract.spec.ts +++ b/lib/modules/manager/composer/extract.spec.ts @@ -1,3 +1,4 @@ +import { codeBlock } from 'common-tags'; import { Fixtures } from '../../../../test/fixtures'; import { fs } from '../../../../test/util'; import { extractPackageFile } from '.'; @@ -248,6 +249,35 @@ describe('modules/manager/composer/extract', () => { }); }); + it('skips path dependencies', async () => { + const res = await extractPackageFile( + codeBlock` + { + "name": "acme/path-sources", + "description": "Fetch Packages via path", + "repositories": { + "acme/path1": { + "type": "path", + "url": "packages/acme/path1" + } + }, + "require": { + "acme/path1": "*" + } + } + `, + packageFile + ); + expect(res?.deps).toEqual([ + { + currentValue: '*', + depName: 'acme/path1', + depType: 'require', + skipReason: 'path-dependency', + }, + ]); + }); + it('extracts dependencies with lock file', async () => { fs.readLocalFile.mockResolvedValue('some content'); const res = await extractPackageFile(requirements1, packageFile); diff --git a/lib/modules/manager/composer/extract.ts b/lib/modules/manager/composer/extract.ts index 2b8588b7bb5716..ae40abec469249 100644 --- a/lib/modules/manager/composer/extract.ts +++ b/lib/modules/manager/composer/extract.ts @@ -46,6 +46,7 @@ function parseRepositories( switch (repo.type) { case 'vcs': case 'git': + case 'path': repositories[name!] = repo; break; case 'composer': @@ -144,6 +145,14 @@ export async function extractPackageFile( datasource = GitTagsDatasource.id; packageName = repositories[depName].url; break; + case 'path': + deps.push({ + depType, + depName, + currentValue, + skipReason: 'path-dependency', + }); + continue; } } const dep: PackageDependency = { diff --git a/lib/modules/manager/composer/range.spec.ts b/lib/modules/manager/composer/range.spec.ts index 87f65b9c67c98a..944797d5c8b556 100644 --- a/lib/modules/manager/composer/range.spec.ts +++ b/lib/modules/manager/composer/range.spec.ts @@ -12,7 +12,7 @@ describe('modules/manager/composer/range', () => { rangeStrategy: 'auto', depType: 'require-dev', }; - expect(getRangeStrategy(config)).toBe('replace'); + expect(getRangeStrategy(config)).toBe('update-lockfile'); }); it('replaces project require', () => { @@ -21,7 +21,7 @@ describe('modules/manager/composer/range', () => { managerData: { composerJsonType: 'project' }, depType: 'require', }; - expect(getRangeStrategy(config)).toBe('replace'); + expect(getRangeStrategy(config)).toBe('update-lockfile'); }); it('widens complex ranges', () => { @@ -42,9 +42,9 @@ describe('modules/manager/composer/range', () => { expect(getRangeStrategy(config)).toBe('widen'); }); - it('defaults to replace', () => { + it('defaults to update-lockfile', () => { const config: RangeConfig = { rangeStrategy: 'auto', depType: 'require' }; - expect(getRangeStrategy(config)).toBe('replace'); + expect(getRangeStrategy(config)).toBe('update-lockfile'); }); it('defaults to widen for TYPO3 extensions', () => { diff --git a/lib/modules/manager/composer/range.ts b/lib/modules/manager/composer/range.ts index dd70eb54f92c38..a1faa3f6f1b8d4 100644 --- a/lib/modules/manager/composer/range.ts +++ b/lib/modules/manager/composer/range.ts @@ -23,5 +23,5 @@ export function getRangeStrategy(config: RangeConfig): RangeStrategy { ) { return 'widen'; } - return 'replace'; + return 'update-lockfile'; } diff --git a/lib/modules/manager/composer/types.ts b/lib/modules/manager/composer/types.ts index 896ff7bd8b0dee..c46f294d0cf861 100644 --- a/lib/modules/manager/composer/types.ts +++ b/lib/modules/manager/composer/types.ts @@ -1,7 +1,7 @@ // istanbul ignore file: types only export interface Repo { name?: string; - type: 'composer' | 'git' | 'package' | 'vcs'; + type: 'composer' | 'git' | 'package' | 'path' | 'vcs'; packagist?: boolean; 'packagist.org'?: boolean; url: string; diff --git a/lib/modules/manager/conan/index.ts b/lib/modules/manager/conan/index.ts index 2ac518f4609b76..3dc5571dedc4c7 100644 --- a/lib/modules/manager/conan/index.ts +++ b/lib/modules/manager/conan/index.ts @@ -1,4 +1,5 @@ export { extractPackageFile } from './extract'; +export { getRangeStrategy } from './range'; import { ConanDatasource } from '../../datasource/conan'; import * as conan from '../../versioning/conan'; @@ -6,7 +7,6 @@ export const defaultConfig = { fileMatch: ['(^|/)conanfile\\.(txt|py)$'], datasource: ConanDatasource.id, versioning: conan.id, - rangeStrategy: 'bump', enabled: false, // See https://github.com/renovatebot/renovate/issues/14170 }; diff --git a/lib/modules/manager/conan/range.spec.ts b/lib/modules/manager/conan/range.spec.ts new file mode 100644 index 00000000000000..7dcee82fb9712b --- /dev/null +++ b/lib/modules/manager/conan/range.spec.ts @@ -0,0 +1,14 @@ +import type { RangeConfig } from '../types'; +import { getRangeStrategy } from '.'; + +describe('modules/manager/conan/range', () => { + it('returns same if not auto', () => { + const config: RangeConfig = { rangeStrategy: 'widen' }; + expect(getRangeStrategy(config)).toBe('widen'); + }); + + it('defaults to bump', () => { + const config: RangeConfig = { rangeStrategy: 'auto', depType: 'require' }; + expect(getRangeStrategy(config)).toBe('bump'); + }); +}); diff --git a/lib/modules/manager/conan/range.ts b/lib/modules/manager/conan/range.ts new file mode 100644 index 00000000000000..8f3d6e7eb54595 --- /dev/null +++ b/lib/modules/manager/conan/range.ts @@ -0,0 +1,8 @@ +import type { RangeStrategy } from '../../../types'; +import type { RangeConfig } from '../types'; + +export function getRangeStrategy({ + rangeStrategy, +}: RangeConfig): RangeStrategy { + return rangeStrategy === 'auto' ? 'bump' : rangeStrategy; +} diff --git a/lib/modules/manager/deps-edn/extract.ts b/lib/modules/manager/deps-edn/extract.ts index e3ddc9df7ac2d6..1684aba2acf2bf 100644 --- a/lib/modules/manager/deps-edn/extract.ts +++ b/lib/modules/manager/deps-edn/extract.ts @@ -1,6 +1,6 @@ import is from '@sindresorhus/is'; import { regEx } from '../../../util/regex'; -import { BitBucketTagsDatasource } from '../../datasource/bitbucket-tags'; +import { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags'; import { ClojureDatasource } from '../../datasource/clojure'; import { CLOJARS_REPO } from '../../datasource/clojure/common'; import { GitRefsDatasource } from '../../datasource/git-refs'; @@ -66,7 +66,7 @@ function resolveGitPackageFromEdnKey( const bitbucketDependencyGroups = bitbucketDependencyRegex.exec(key)?.groups; if (bitbucketDependencyGroups?.packageName) { - dep.datasource = BitBucketTagsDatasource.id; + dep.datasource = BitbucketTagsDatasource.id; dep.packageName = bitbucketDependencyGroups.packageName; return; } diff --git a/lib/modules/manager/dockerfile/index.ts b/lib/modules/manager/dockerfile/index.ts index 0f6e68b7f61ca3..0e011c1730d1d4 100644 --- a/lib/modules/manager/dockerfile/index.ts +++ b/lib/modules/manager/dockerfile/index.ts @@ -7,7 +7,10 @@ export const language: ProgrammingLanguage = 'docker'; export { extractPackageFile }; export const defaultConfig = { - fileMatch: ['(^|/|\\.)Dockerfile$', '(^|/)Dockerfile[^/]*$'], + fileMatch: [ + '(^|/|\\.)(Docker|Container)file$', + '(^|/)(Docker|Container)file[^/]*$', + ], }; export const supportedDatasources = [DockerDatasource.id]; diff --git a/lib/modules/manager/dockerfile/readme.md b/lib/modules/manager/dockerfile/readme.md index 24a3d124c558b1..f2158d91b4679b 100644 --- a/lib/modules/manager/dockerfile/readme.md +++ b/lib/modules/manager/dockerfile/readme.md @@ -1,10 +1,10 @@ -Extracts all Docker images in a `Dockerfile`. +Extracts image references in a `Dockerfile` and/or `Containerfile`. Renovate's managers does not understand versioning, that's up to Renovate's versioning modules. -The default Docker versioning for Docker datasources treats suffixes as "compatibility", for example: `-alpine`. -Many Docker images are _not_ SemVer compliant because they use such suffixes in their tags. +The default `docker` versioning for container image datasources treats suffixes as "compatibility", for example: `-alpine`. +Many container images are _not_ SemVer compliant because they use such suffixes in their tags. -If Renovate does not update your Dockerfile images correctly, you may need to tell Renovate what versioning it should use. +If Renovate does not update your container images correctly, you may need to tell Renovate what versioning it should use. For example, if you know that an image follows SemVer, you can tell Renovate to use `"semver"` versioning for that image: ```json diff --git a/lib/modules/manager/flux/common.ts b/lib/modules/manager/flux/common.ts index 320e7b9f31b92b..3d9b97896f1128 100644 --- a/lib/modules/manager/flux/common.ts +++ b/lib/modules/manager/flux/common.ts @@ -1,7 +1,7 @@ import { regEx } from '../../../util/regex'; export const systemManifestRegex = - '(^|\\/)flux-system\\/(?:.+\\/)?gotk-components\\.yaml$'; + '(^|/)flux-system/(?:.+/)?gotk-components\\.yaml$'; export function isSystemManifest(file: string): boolean { return regEx(systemManifestRegex).test(file); diff --git a/lib/modules/manager/flux/extract.spec.ts b/lib/modules/manager/flux/extract.spec.ts index c4a77cf7f64c42..6e8b4694637ab0 100644 --- a/lib/modules/manager/flux/extract.spec.ts +++ b/lib/modules/manager/flux/extract.spec.ts @@ -2,7 +2,7 @@ import { codeBlock } from 'common-tags'; import { Fixtures } from '../../../../test/fixtures'; import { GlobalConfig } from '../../../config/global'; import type { RepoGlobalConfig } from '../../../config/types'; -import { BitBucketTagsDatasource } from '../../datasource/bitbucket-tags'; +import { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags'; import { DockerDatasource } from '../../datasource/docker'; import { GitRefsDatasource } from '../../datasource/git-refs'; import { GitTagsDatasource } from '../../datasource/git-tags'; @@ -455,7 +455,7 @@ describe('modules/manager/flux/extract', () => { deps: [ { currentValue: '2020.5.6+staging.ze', - datasource: BitBucketTagsDatasource.id, + datasource: BitbucketTagsDatasource.id, depName: 'renovate-repo', packageName: 'renovatebot/renovate', sourceUrl: 'https://bitbucket.org/renovatebot/renovate', diff --git a/lib/modules/manager/flux/extract.ts b/lib/modules/manager/flux/extract.ts index 91db3749a90c17..41bc404242f4ac 100644 --- a/lib/modules/manager/flux/extract.ts +++ b/lib/modules/manager/flux/extract.ts @@ -2,7 +2,7 @@ import { loadAll } from 'js-yaml'; import { logger } from '../../../logger'; import { readLocalFile } from '../../../util/fs'; import { regEx } from '../../../util/regex'; -import { BitBucketTagsDatasource } from '../../datasource/bitbucket-tags'; +import { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags'; import { GitRefsDatasource } from '../../datasource/git-refs'; import { GitTagsDatasource } from '../../datasource/git-tags'; import { GithubReleasesDatasource } from '../../datasource/github-releases'; @@ -130,7 +130,7 @@ function resolveGitRepositoryPerSourceTag( const bitbucketMatchGroups = bitbucketUrlRegex.exec(gitUrl)?.groups; if (bitbucketMatchGroups) { - dep.datasource = BitBucketTagsDatasource.id; + dep.datasource = BitbucketTagsDatasource.id; dep.packageName = bitbucketMatchGroups.packageName; dep.sourceUrl = `https://bitbucket.org/${dep.packageName}`; return; diff --git a/lib/modules/manager/flux/index.ts b/lib/modules/manager/flux/index.ts index af5907558b3e20..58d21b8673d27f 100644 --- a/lib/modules/manager/flux/index.ts +++ b/lib/modules/manager/flux/index.ts @@ -1,4 +1,4 @@ -import { BitBucketTagsDatasource } from '../../datasource/bitbucket-tags'; +import { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags'; import { DockerDatasource } from '../../datasource/docker'; import { GitRefsDatasource } from '../../datasource/git-refs'; import { GitTagsDatasource } from '../../datasource/git-tags'; @@ -21,7 +21,7 @@ export const supportedDatasources = [ GithubTagsDatasource.id, GitlabTagsDatasource.id, GitTagsDatasource.id, - BitBucketTagsDatasource.id, + BitbucketTagsDatasource.id, HelmDatasource.id, DockerDatasource.id, ]; diff --git a/lib/modules/manager/fvm/index.ts b/lib/modules/manager/fvm/index.ts index 68b30f31387696..ebb67637e31e32 100644 --- a/lib/modules/manager/fvm/index.ts +++ b/lib/modules/manager/fvm/index.ts @@ -6,6 +6,6 @@ export { extractPackageFile } from './extract'; export const supportedDatasources = [FlutterVersionDatasource.id]; export const defaultConfig = { - fileMatch: ['(^|\\/)\\.fvm\\/fvm_config\\.json$'], + fileMatch: ['(^|/)\\.fvm/fvm_config\\.json$'], versioning: semverVersioning.id, }; diff --git a/lib/modules/manager/github-actions/index.ts b/lib/modules/manager/github-actions/index.ts index 8d6dc9282c5561..c2d7ad80bb6e42 100644 --- a/lib/modules/manager/github-actions/index.ts +++ b/lib/modules/manager/github-actions/index.ts @@ -4,8 +4,8 @@ export { extractPackageFile } from './extract'; export const defaultConfig = { fileMatch: [ - '^(workflow-templates|\\.github\\/workflows)\\/[^/]+\\.ya?ml$', - '(^|\\/)action\\.ya?ml$', + '^(workflow-templates|\\.github/workflows)/[^/]+\\.ya?ml$', + '(^|/)action\\.ya?ml$', ], }; diff --git a/lib/modules/manager/gitlabci/utils.ts b/lib/modules/manager/gitlabci/utils.ts index d8afde40bae366..15f094742b1282 100644 --- a/lib/modules/manager/gitlabci/utils.ts +++ b/lib/modules/manager/gitlabci/utils.ts @@ -16,7 +16,7 @@ export function replaceReferenceTags(content: string): string { } const depProxyRe = regEx( - `(?\\$\\{?CI_DEPENDENCY_PROXY_(?:DIRECT_)?GROUP_IMAGE_PREFIX\\}?\\/)(?.+)` + `(?\\$\\{?CI_DEPENDENCY_PROXY_(?:DIRECT_)?GROUP_IMAGE_PREFIX\\}?/)(?.+)` ); /** diff --git a/lib/modules/manager/gomod/artifacts.spec.ts b/lib/modules/manager/gomod/artifacts.spec.ts index 16c65b5fdfafbd..667eee6bdd7a3d 100644 --- a/lib/modules/manager/gomod/artifacts.spec.ts +++ b/lib/modules/manager/gomod/artifacts.spec.ts @@ -298,7 +298,7 @@ describe('modules/manager/gomod/artifacts', () => { }, ]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -315,7 +315,7 @@ describe('modules/manager/gomod/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool golang 1.14.0' + ' && ' + @@ -455,7 +455,7 @@ describe('modules/manager/gomod/artifacts', () => { }, ]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -485,7 +485,7 @@ describe('modules/manager/gomod/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool golang 1.14.0' + ' && ' + @@ -566,7 +566,7 @@ describe('modules/manager/gomod/artifacts', () => { }, ]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, {}, { options: { @@ -980,7 +980,7 @@ describe('modules/manager/gomod/artifacts', () => { { file: { contents: 'New go.sum 2', path: 'go.mod', type: 'addition' } }, ]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, {}, { cmd: @@ -997,7 +997,7 @@ describe('modules/manager/gomod/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool golang 1.14.0' + ' && ' + @@ -1045,7 +1045,7 @@ describe('modules/manager/gomod/artifacts', () => { { file: { contents: 'New go.sum 2', path: 'go.mod', type: 'addition' } }, ]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, {}, { cmd: @@ -1062,7 +1062,7 @@ describe('modules/manager/gomod/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool golang 1.14.0' + ' && ' + @@ -1110,7 +1110,7 @@ describe('modules/manager/gomod/artifacts', () => { { file: { contents: 'New go.sum 2', path: 'go.mod', type: 'addition' } }, ]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, {}, { cmd: @@ -1127,7 +1127,7 @@ describe('modules/manager/gomod/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool golang 1.14.0' + ' && ' + @@ -1175,7 +1175,7 @@ describe('modules/manager/gomod/artifacts', () => { { file: { contents: 'New go.sum 2', path: 'go.mod', type: 'addition' } }, ]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, {}, { cmd: @@ -1192,7 +1192,7 @@ describe('modules/manager/gomod/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool golang 1.14.0' + ' && ' + @@ -1249,12 +1249,13 @@ describe('modules/manager/gomod/artifacts', () => { expect( await gomod.updateArtifacts({ packageFileName: 'go.mod', - updatedDeps: [{ depName: 'github.com/google/go-github/v24' }], + updatedDeps: [ + { depName: 'github.com/google/go-github/v24', newVersion: 'v28.0.0' }, + ], newPackageFileContent: gomod1, config: { ...config, updateType: 'major', - newMajor: 28, postUpdateOptions: ['gomodUpdateImportPaths'], }, }) @@ -1287,29 +1288,36 @@ describe('modules/manager/gomod/artifacts', () => { ]); }); - it('returns go.mod if only go.mod changes', async () => { + it('updates correct import paths with gomodUpdateImportPaths and multiple dependencies', async () => { fs.readLocalFile.mockResolvedValueOnce('Current go.sum'); fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename const execSnapshots = mockExecAll(); git.getRepoStatus.mockResolvedValueOnce( partial({ - modified: ['go.mod'], + modified: ['go.sum', 'main.go'], }) ); - fs.readLocalFile.mockResolvedValueOnce('New go.mod'); + fs.readLocalFile + .mockResolvedValueOnce('New go.sum') + .mockResolvedValueOnce('New main.go') + .mockResolvedValueOnce('New go.mod'); expect( await gomod.updateArtifacts({ packageFileName: 'go.mod', - updatedDeps: [{ depName: 'github.com/google/go-github/v24' }], + updatedDeps: [ + { depName: 'github.com/google/go-github/v24', newVersion: 'v28.0.0' }, + { depName: 'github.com/caarlos0/env/v6', newVersion: 'v7.0.0' }, + ], newPackageFileContent: gomod1, config: { ...config, updateType: 'major', - newMajor: 28, - postUpdateOptions: [], + postUpdateOptions: ['gomodUpdateImportPaths'], }, }) ).toEqual([ + { file: { type: 'addition', path: 'go.sum', contents: 'New go.sum' } }, + { file: { type: 'addition', path: 'main.go', contents: 'New main.go' } }, { file: { type: 'addition', path: 'go.mod', contents: 'New go.mod' } }, ]); expect(execSnapshots).toMatchObject([ @@ -1317,6 +1325,26 @@ describe('modules/manager/gomod/artifacts', () => { cmd: 'go get -d -t ./...', options: { cwd: '/tmp/github/some/repo' }, }, + { + cmd: 'go install github.com/marwan-at-work/mod/cmd/mod@latest', + options: { cwd: '/tmp/github/some/repo' }, + }, + { + cmd: 'mod upgrade --mod-name=github.com/google/go-github/v24 -t=28', + options: { cwd: '/tmp/github/some/repo' }, + }, + { + cmd: 'mod upgrade --mod-name=github.com/caarlos0/env/v6 -t=7', + options: { cwd: '/tmp/github/some/repo' }, + }, + { + cmd: 'go mod tidy', + options: { cwd: '/tmp/github/some/repo' }, + }, + { + cmd: 'go mod tidy', + options: { cwd: '/tmp/github/some/repo' }, + }, ]); }); @@ -1324,9 +1352,96 @@ describe('modules/manager/gomod/artifacts', () => { fs.readLocalFile.mockResolvedValueOnce('Current go.sum'); fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename const execSnapshots = mockExecAll(); + git.getRepoStatus.mockResolvedValueOnce({ + modified: ['go.sum'], + } as StatusResult); + fs.readLocalFile + .mockResolvedValueOnce('New go.sum') + .mockResolvedValueOnce('New go.mod'); + expect( + await gomod.updateArtifacts({ + packageFileName: 'go.mod', + updatedDeps: [ + { depName: 'github.com/pkg/errors', newVersion: 'v1.0.0' }, + ], + newPackageFileContent: gomod1, + config: { + ...config, + updateType: 'major', + postUpdateOptions: ['gomodUpdateImportPaths'], + }, + }) + ).toEqual([ + { file: { type: 'addition', path: 'go.sum', contents: 'New go.sum' } }, + { file: { type: 'addition', path: 'go.mod', contents: 'New go.mod' } }, + ]); + expect(execSnapshots).toMatchObject([ + { + cmd: 'go get -d -t ./...', + options: { cwd: '/tmp/github/some/repo' }, + }, + { + cmd: 'go mod tidy', + options: { cwd: '/tmp/github/some/repo' }, + }, + { + cmd: 'go mod tidy', + options: { cwd: '/tmp/github/some/repo' }, + }, + ]); + }); + + it('skips updating import paths when invalid major version', async () => { + fs.readLocalFile.mockResolvedValueOnce('Current go.sum'); + fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename + const execSnapshots = mockExecAll(); + git.getRepoStatus.mockResolvedValueOnce({ + modified: ['go.sum'], + } as StatusResult); + fs.readLocalFile + .mockResolvedValueOnce('New go.sum') + .mockResolvedValueOnce('New go.mod'); + expect( + await gomod.updateArtifacts({ + packageFileName: 'go.mod', + updatedDeps: [ + { depName: 'github.com/pkg/errors', newVersion: 'vx.0.0' }, + ], + newPackageFileContent: gomod1, + config: { + ...config, + updateType: 'major', + postUpdateOptions: ['gomodUpdateImportPaths'], + }, + }) + ).toEqual([ + { file: { type: 'addition', path: 'go.sum', contents: 'New go.sum' } }, + { file: { type: 'addition', path: 'go.mod', contents: 'New go.mod' } }, + ]); + expect(execSnapshots).toMatchObject([ + { + cmd: 'go get -d -t ./...', + options: { cwd: '/tmp/github/some/repo' }, + }, + { + cmd: 'go mod tidy', + options: { cwd: '/tmp/github/some/repo' }, + }, + { + cmd: 'go mod tidy', + options: { cwd: '/tmp/github/some/repo' }, + }, + ]); + }); + + it('skips updating import paths when incompatible version', async () => { + fs.readLocalFile + .mockResolvedValueOnce('Current go.sum') + .mockResolvedValueOnce(null); // vendor modules filename + const execSnapshots = mockExecAll(); git.getRepoStatus.mockResolvedValueOnce( partial({ - modified: ['go.sum', 'main.go'], + modified: ['go.sum'], }) ); fs.readLocalFile @@ -1335,12 +1450,16 @@ describe('modules/manager/gomod/artifacts', () => { expect( await gomod.updateArtifacts({ packageFileName: 'go.mod', - updatedDeps: [{ depName: 'github.com/pkg/errors' }], + updatedDeps: [ + { + depName: 'github.com/docker/docker', + newVersion: 'v23.0.0+incompatible', + }, + ], newPackageFileContent: gomod1, config: { ...config, updateType: 'major', - newMajor: 1, postUpdateOptions: ['gomodUpdateImportPaths'], }, }) @@ -1353,6 +1472,14 @@ describe('modules/manager/gomod/artifacts', () => { cmd: 'go get -d -t ./...', options: { cwd: '/tmp/github/some/repo' }, }, + { + cmd: 'go mod tidy', + options: { cwd: '/tmp/github/some/repo' }, + }, + { + cmd: 'go mod tidy', + options: { cwd: '/tmp/github/some/repo' }, + }, ]); }); @@ -1446,12 +1573,13 @@ describe('modules/manager/gomod/artifacts', () => { expect( await gomod.updateArtifacts({ packageFileName: 'go.mod', - updatedDeps: [{ depName: 'github.com/google/go-github/v24' }], + updatedDeps: [ + { depName: 'github.com/google/go-github/v24', newVersion: 'v28.0.0' }, + ], newPackageFileContent: gomod1, config: { ...config, updateType: 'major', - newMajor: 28, postUpdateOptions: ['gomodUpdateImportPaths'], constraints: { gomodMod: 'v1.2.3', @@ -1504,12 +1632,13 @@ describe('modules/manager/gomod/artifacts', () => { expect( await gomod.updateArtifacts({ packageFileName: 'go.mod', - updatedDeps: [{ depName: 'github.com/google/go-github/v24' }], + updatedDeps: [ + { depName: 'github.com/google/go-github/v24', newVersion: 'v28.0.0' }, + ], newPackageFileContent: gomod1, config: { ...config, updateType: 'major', - newMajor: 28, postUpdateOptions: ['gomodUpdateImportPaths'], constraints: { gomodMod: 'a.b.c', @@ -1545,7 +1674,7 @@ describe('modules/manager/gomod/artifacts', () => { ]); }); - it('skips updating import paths for gopkg.in dependencies', async () => { + it('updates import paths for gopkg.in dependencies including v0 to v1', async () => { fs.readLocalFile.mockResolvedValueOnce('Current go.sum'); fs.readLocalFile.mockResolvedValueOnce(null); // vendor modules filename const execSnapshots = mockExecAll(); @@ -1560,12 +1689,14 @@ describe('modules/manager/gomod/artifacts', () => { expect( await gomod.updateArtifacts({ packageFileName: 'go.mod', - updatedDeps: [{ depName: 'gopkg.in/yaml.v2' }], + updatedDeps: [ + { depName: 'gopkg.in/yaml.v2', newVersion: 'v28.0.0' }, + { depName: 'gopkg.in/foo.v0', newVersion: 'v1.0.0' }, + ], newPackageFileContent: gomod1, config: { ...config, updateType: 'major', - newMajor: 28, postUpdateOptions: ['gomodUpdateImportPaths'], }, }) @@ -1578,6 +1709,18 @@ describe('modules/manager/gomod/artifacts', () => { cmd: 'go get -d -t ./...', options: { cwd: '/tmp/github/some/repo' }, }, + { + cmd: 'go install github.com/marwan-at-work/mod/cmd/mod@latest', + options: { cwd: '/tmp/github/some/repo' }, + }, + { + cmd: 'mod upgrade --mod-name=gopkg.in/yaml.v2 -t=28', + options: { cwd: '/tmp/github/some/repo' }, + }, + { + cmd: 'mod upgrade --mod-name=gopkg.in/foo.v0 -t=1', + options: { cwd: '/tmp/github/some/repo' }, + }, { cmd: 'go mod tidy', options: { cwd: '/tmp/github/some/repo' }, @@ -1609,11 +1752,12 @@ describe('modules/manager/gomod/artifacts', () => { }); const res = await gomod.updateArtifacts({ packageFileName: 'go.mod', - updatedDeps: [{ depName: 'github.com/google/go-github/v24' }], + updatedDeps: [ + { depName: 'github.com/google/go-github/v24', newVersion: 'v28.0.0' }, + ], newPackageFileContent: gomod1, config: { updateType: 'major', - newMajor: 28, postUpdateOptions: ['gomodUpdateImportPaths'], }, }); @@ -1667,11 +1811,12 @@ describe('modules/manager/gomod/artifacts', () => { }); const res = await gomod.updateArtifacts({ packageFileName: 'go.mod', - updatedDeps: [{ depName: 'github.com/google/go-github/v24' }], + updatedDeps: [ + { depName: 'github.com/google/go-github/v24', newVersion: 'v28.0.0' }, + ], newPackageFileContent: gomod1, config: { updateType: 'major', - newMajor: 28, postUpdateOptions: ['gomodUpdateImportPaths'], }, }); @@ -1683,7 +1828,7 @@ describe('modules/manager/gomod/artifacts', () => { ]); const expectedResult = [ { - cmd: 'docker pull renovate/sidecar', + cmd: 'docker pull containerbase/sidecar', }, {}, { @@ -1701,7 +1846,7 @@ describe('modules/manager/gomod/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool golang 1.17.0' + ' && ' + @@ -1739,11 +1884,12 @@ describe('modules/manager/gomod/artifacts', () => { }); const res = await gomod.updateArtifacts({ packageFileName: 'go.mod', - updatedDeps: [{ depName: 'github.com/google/go-github/v24' }], + updatedDeps: [ + { depName: 'github.com/google/go-github/v24', newVersion: 'v28.0.0' }, + ], newPackageFileContent: gomod1, config: { updateType: 'major', - newMajor: 28, postUpdateOptions: ['gomodUpdateImportPaths'], constraints: { go: '1.14', @@ -1757,7 +1903,7 @@ describe('modules/manager/gomod/artifacts', () => { ]); const expectedResult = [ { - cmd: 'docker pull renovate/sidecar', + cmd: 'docker pull containerbase/sidecar', }, {}, { @@ -1775,7 +1921,7 @@ describe('modules/manager/gomod/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool golang 1.14.0' + ' && ' + diff --git a/lib/modules/manager/gomod/artifacts.ts b/lib/modules/manager/gomod/artifacts.ts index 512178edc60397..6ef9025014685b 100644 --- a/lib/modules/manager/gomod/artifacts.ts +++ b/lib/modules/manager/gomod/artifacts.ts @@ -1,4 +1,5 @@ import is from '@sindresorhus/is'; +import semver from 'semver'; import upath from 'upath'; import { GlobalConfig } from '../../../config/global'; import type { PlatformId } from '../../../constants'; @@ -32,6 +33,8 @@ const githubApiUrls = new Set([ 'https://api.github.com/', ]); +const { major, valid } = semver; + function getGitEnvironmentVariables(): NodeJS.ProcessEnv { let environmentVariables: NodeJS.ProcessEnv = {}; @@ -113,14 +116,36 @@ function addAuthFromHostRule( function getUpdateImportPathCmds( updatedDeps: PackageDependency[], - { constraints, newMajor }: UpdateArtifactsConfig + { constraints }: UpdateArtifactsConfig ): string[] { + // Check if we fail to parse any major versions and log that they're skipped + const invalidMajorDeps = updatedDeps.filter( + ({ newVersion }) => !valid(newVersion) + ); + if (invalidMajorDeps.length > 0) { + invalidMajorDeps.forEach(({ depName }) => + logger.warn(`Could not get major version of ${depName!}. Ignoring`) + ); + } + const updateImportCommands = updatedDeps - .map((dep) => dep.depName!) - .filter((x) => !x.startsWith('gopkg.in')) - // TODO: types (#7154) - // eslint-disable-next-line @typescript-eslint/restrict-template-expressions - .map((depName) => `mod upgrade --mod-name=${depName} -t=${newMajor}`); + .filter( + ({ newVersion }) => + valid(newVersion) && !newVersion!.endsWith('+incompatible') + ) + .map(({ depName, newVersion }) => ({ + depName: depName!, + newMajor: major(newVersion!), + })) + // Skip path updates going from v0 to v1 + .filter( + ({ depName, newMajor }) => depName.startsWith('gopkg.in/') || newMajor > 1 + ) + + .map( + ({ depName, newMajor }) => + `mod upgrade --mod-name=${depName} -t=${newMajor}` + ); if (updateImportCommands.length > 0) { let installMarwanModArgs = @@ -275,11 +300,11 @@ export async function updateArtifacts({ logger.trace({ cmd, args }, 'go get command included'); execCommands.push(`${cmd} ${args}`); - // Update import paths on major updates above v1 + // Update import paths on major updates const isImportPathUpdateRequired = config.postUpdateOptions?.includes('gomodUpdateImportPaths') && - config.updateType === 'major' && - config.newMajor! > 1; + config.updateType === 'major'; + if (isImportPathUpdateRequired) { const updateImportCmds = getUpdateImportPathCmds(updatedDeps, config); if (updateImportCmds.length > 0) { diff --git a/lib/modules/manager/gomod/extract.spec.ts b/lib/modules/manager/gomod/extract.spec.ts index 4d9b35b36ff95f..c1503da32c2656 100644 --- a/lib/modules/manager/gomod/extract.spec.ts +++ b/lib/modules/manager/gomod/extract.spec.ts @@ -67,7 +67,6 @@ replace ( currentValue: '1.18', datasource: 'golang-version', versioning: 'go-mod-directive', - rangeStrategy: 'replace', }, { managerData: { diff --git a/lib/modules/manager/gomod/extract.ts b/lib/modules/manager/gomod/extract.ts index 2d99d83f48ab5a..5f6352d2a35197 100644 --- a/lib/modules/manager/gomod/extract.ts +++ b/lib/modules/manager/gomod/extract.ts @@ -46,7 +46,6 @@ function getGoDep(lineNumber: number, goVer: string): PackageDependency { currentValue: goVer, datasource: GolangVersionDatasource.id, versioning: 'go-mod-directive', - rangeStrategy: 'replace', }; } diff --git a/lib/modules/manager/gomod/readme.md b/lib/modules/manager/gomod/readme.md index e17e507cc135e3..62d912c31d59ac 100644 --- a/lib/modules/manager/gomod/readme.md +++ b/lib/modules/manager/gomod/readme.md @@ -1,3 +1,5 @@ +### Post-Update Options + You might be interested in the following `postUpdateOptions`: 1. `gomodTidy` - if you'd like Renovate to run `go mod tidy` after every update before raising the PR @@ -23,3 +25,20 @@ Indirect updates are disabled by default. To enable them, add a package rule suc ] } ``` + +### Private Modules Authentication + +Before running the `go` commands to update the `go.sum`, Renovate exports `git` [`insteadOf`](https://git-scm.com/docs/git-config#Documentation/git-config.txt-urlltbasegtinsteadOf) directives in environment variables. + +The following logic is executed prior to "artifacts" updating: + +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 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 the following characteristics: + +- No `hostType` is defined, or +- `hostType` is `go`, or +- `hostType` is a platform (`github`, `gitlab`, `azure`, etc.) diff --git a/lib/modules/manager/gomod/update.spec.ts b/lib/modules/manager/gomod/update.spec.ts index 240eb184eec377..6270bb8cc74300 100644 --- a/lib/modules/manager/gomod/update.spec.ts +++ b/lib/modules/manager/gomod/update.spec.ts @@ -96,7 +96,7 @@ describe('modules/manager/gomod/update', () => { depType: 'require', }; const res = updateDependency({ fileContent: gomod1, upgrade }); - expect(res).not.toEqual(gomod2); + expect(res).not.toEqual(gomod1); expect(res).toContain('github.com/pkg/errors/v2 v2.0.0'); }); @@ -112,10 +112,27 @@ describe('modules/manager/gomod/update', () => { }; const res = updateDependency({ fileContent: gomod1, upgrade }); expect(res).toMatchSnapshot(); - expect(res).not.toEqual(gomod2); + expect(res).not.toEqual(gomod1); expect(res).toContain('gopkg.in/russross/blackfriday.v2 v2.0.0'); }); + it('skip replacing incompatible major updates', () => { + const upgrade = { + depName: 'github.com/Azure/azure-sdk-for-go', + managerData: { lineNumber: 8 }, + newMajor: 26, + updateType: 'major' as UpdateType, + currentValue: 'v25.1.0+incompatible', + newValue: 'v26.0.0+incompatible', + depType: 'require', + }; + const res = updateDependency({ fileContent: gomod1, upgrade }); + expect(res).not.toEqual(gomod1); + expect(res).toContain( + 'github.com/Azure/azure-sdk-for-go v26.0.0+incompatible' + ); + }); + it('returns null if mismatch', () => { const upgrade = { depName: 'github.com/aws/aws-sdk-go', diff --git a/lib/modules/manager/gomod/update.ts b/lib/modules/manager/gomod/update.ts index 47202948da111f..d2839abce36647 100644 --- a/lib/modules/manager/gomod/update.ts +++ b/lib/modules/manager/gomod/update.ts @@ -105,7 +105,8 @@ export function updateDependency({ ); } else if ( upgrade.newMajor! > 1 && - !newLine.includes(`/v${upgrade.newMajor}`) + !newLine.includes(`/v${upgrade.newMajor}`) && + !upgrade.newValue!.endsWith('+incompatible') ) { if (depName === depNameNoVersion) { // If package currently has no version, pin to latest one. diff --git a/lib/modules/manager/gradle-wrapper/artifacts.spec.ts b/lib/modules/manager/gradle-wrapper/artifacts.spec.ts index 184e18eac25eab..d6996cde05251e 100644 --- a/lib/modules/manager/gradle-wrapper/artifacts.spec.ts +++ b/lib/modules/manager/gradle-wrapper/artifacts.spec.ts @@ -198,7 +198,7 @@ describe('modules/manager/gradle-wrapper/artifacts', () => { }, ]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -209,7 +209,7 @@ describe('modules/manager/gradle-wrapper/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool java 11.0.1' + ' && ' + diff --git a/lib/modules/manager/gradle-wrapper/util.spec.ts b/lib/modules/manager/gradle-wrapper/util.spec.ts index e5e3ba7bb2d93d..c743eb8dd510b8 100644 --- a/lib/modules/manager/gradle-wrapper/util.spec.ts +++ b/lib/modules/manager/gradle-wrapper/util.spec.ts @@ -39,6 +39,12 @@ describe('modules/manager/gradle-wrapper/util', () => { GlobalConfig.set({ binarySource: 'docker' }); expect(getJavaConstraint('7.0.1')).toBe('^16.0.0'); }); + + it('return ^17.0.0 for docker gradle >= 7.3', () => { + GlobalConfig.set({ binarySource: 'docker' }); + expect(getJavaConstraint('7.3.0')).toBe('^17.0.0'); + expect(getJavaConstraint('8.0.1')).toBe('^17.0.0'); + }); }); describe('extractGradleVersion()', () => { diff --git a/lib/modules/manager/gradle-wrapper/utils.ts b/lib/modules/manager/gradle-wrapper/utils.ts index cbd7a0f9629120..0f410433714eb3 100644 --- a/lib/modules/manager/gradle-wrapper/utils.ts +++ b/lib/modules/manager/gradle-wrapper/utils.ts @@ -21,6 +21,20 @@ export function gradleWrapperFileName(): string { return './gradlew'; } +export function nullRedirectionCommand(): string { + if ( + os.platform() === 'win32' && + GlobalConfig.get('binarySource') !== 'docker' + ) { + // TODO: Windows environment without docker needs to be implemented + logger.debug( + 'Updating artifacts may fail due to excessive output from "gradle.bat :dependencies" command.' + ); + return ''; + } + return ' > /dev/null'; +} + export async function prepareGradleCommand( gradlewFile: string ): Promise { @@ -48,6 +62,10 @@ export function getJavaConstraint( gradleVersion: string | null | undefined ): string | null { const major = gradleVersion ? gradleVersioning.getMajor(gradleVersion) : null; + const minor = gradleVersion ? gradleVersioning.getMinor(gradleVersion) : null; + if (major && (major > 7 || (major >= 7 && minor && minor >= 3))) { + return '^17.0.0'; + } if (major && major >= 7) { return '^16.0.0'; } diff --git a/lib/modules/manager/gradle/artifacts.spec.ts b/lib/modules/manager/gradle/artifacts.spec.ts index b3b0426da2b3d9..a3cd828eb39d3f 100644 --- a/lib/modules/manager/gradle/artifacts.spec.ts +++ b/lib/modules/manager/gradle/artifacts.spec.ts @@ -83,7 +83,7 @@ describe('modules/manager/gradle/artifacts', () => { content = 'New gradle.lockfile'; } else if (fileName === 'gradle/wrapper/gradle-wrapper.properties') { content = - 'distributionUrl=https\\://services.gradle.org/distributions/gradle-7.4-bin.zip'; + 'distributionUrl=https\\://services.gradle.org/distributions/gradle-7.2-bin.zip'; } return Promise.resolve(content); @@ -158,7 +158,49 @@ describe('modules/manager/gradle/artifacts', () => { }, }, { - cmd: './gradlew --console=plain -q :dependencies --update-locks org.junit.jupiter:junit-jupiter-api,org.junit.jupiter:junit-jupiter-engine', + cmd: './gradlew --console=plain -q :dependencies --update-locks org.junit.jupiter:junit-jupiter-api,org.junit.jupiter:junit-jupiter-engine > /dev/null', + options: { + cwd: '/tmp/github/some/repo', + }, + }, + ]); + }); + + it('updates lock file in win32', async () => { + osPlatformSpy.mockReturnValue('win32'); + + const execSnapshots = mockExecAll(); + + const res = await updateArtifacts({ + packageFileName: 'build.gradle', + updatedDeps: [ + { depName: 'org.junit.jupiter:junit-jupiter-api' }, + { depName: 'org.junit.jupiter:junit-jupiter-engine' }, + ], + newPackageFileContent: '', + config: {}, + }); + + expect(res).toEqual([ + { + file: { + type: 'addition', + path: 'gradle.lockfile', + contents: 'New gradle.lockfile', + }, + }, + ]); + + // In win32, gradle.bat will be used and /dev/null redirection isn't used yet + expect(execSnapshots).toMatchObject([ + { + cmd: 'gradlew.bat --console=plain -q properties', + options: { + cwd: '/tmp/github/some/repo', + }, + }, + { + cmd: 'gradlew.bat --console=plain -q :dependencies --update-locks org.junit.jupiter:junit-jupiter-api,org.junit.jupiter:junit-jupiter-engine', options: { cwd: '/tmp/github/some/repo', }, @@ -200,7 +242,7 @@ describe('modules/manager/gradle/artifacts', () => { }, }, { - cmd: './gradlew --console=plain -q :dependencies --update-locks org.springframework.boot:org.springframework.boot.gradle.plugin', + cmd: './gradlew --console=plain -q :dependencies --update-locks org.springframework.boot:org.springframework.boot.gradle.plugin > /dev/null', options: { cwd: '/tmp/github/some/repo', }, @@ -250,7 +292,7 @@ describe('modules/manager/gradle/artifacts', () => { }, }, { - cmd: './gradlew --console=plain -q :dependencies --write-locks', + cmd: './gradlew --console=plain -q :dependencies --write-locks > /dev/null', options: { cwd: '/tmp/github/some/repo', }, @@ -279,7 +321,7 @@ describe('modules/manager/gradle/artifacts', () => { }, ]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -290,7 +332,7 @@ describe('modules/manager/gradle/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool java 16.0.1' + ' && ' + @@ -308,11 +350,11 @@ describe('modules/manager/gradle/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool java 16.0.1' + ' && ' + - './gradlew --console=plain -q :dependencies --write-locks' + + './gradlew --console=plain -q :dependencies --write-locks > /dev/null' + '"', options: { cwd: '/tmp/github/some/repo' }, }, @@ -347,7 +389,7 @@ describe('modules/manager/gradle/artifacts', () => { }, { cmd: 'install-tool java 16.0.1' }, { - cmd: './gradlew --console=plain -q :dependencies --write-locks', + cmd: './gradlew --console=plain -q :dependencies --write-locks > /dev/null', options: { cwd: '/tmp/github/some/repo' }, }, ]); @@ -383,7 +425,7 @@ describe('modules/manager/gradle/artifacts', () => { }, }, { - cmd: './gradlew --console=plain -q :dependencies :sub1:dependencies :sub2:dependencies --write-locks', + cmd: './gradlew --console=plain -q :dependencies :sub1:dependencies :sub2:dependencies --write-locks > /dev/null', options: { cwd: '/tmp/github/some/repo', }, @@ -484,7 +526,7 @@ describe('modules/manager/gradle/artifacts', () => { }, { cmd: 'install-tool java 11.0.1' }, { - cmd: './gradlew --console=plain -q :dependencies --write-locks', + cmd: './gradlew --console=plain -q :dependencies --write-locks > /dev/null', options: { cwd: '/tmp/github/some/repo' }, }, ]); diff --git a/lib/modules/manager/gradle/artifacts.ts b/lib/modules/manager/gradle/artifacts.ts index bc10e3c8a97a6a..671aa24a628fc7 100644 --- a/lib/modules/manager/gradle/artifacts.ts +++ b/lib/modules/manager/gradle/artifacts.ts @@ -13,6 +13,7 @@ import { extractGradleVersion, getJavaConstraint, gradleWrapperFileName, + nullRedirectionCommand, prepareGradleCommand, } from '../gradle-wrapper/utils'; import type { UpdateArtifact, UpdateArtifactsResult } from '../types'; @@ -157,6 +158,14 @@ export async function updateArtifacts({ cmd += ` --update-locks ${updatedDepNames.map(quote).join(',')}`; } + // `./gradlew :dependencies` command can output huge text due to `:dependencies` + // that renders dependency graphs. Given the output can exceed `ExecOptions.maxBuffer` size, + // drop stdout from the command. + // + // Note: Windows without docker doesn't supported this yet + const nullRedirection = nullRedirectionCommand(); + cmd += nullRedirection; + await writeLocalFile(packageFileName, newPackageFileContent); await exec(cmd, execOptions); diff --git a/lib/modules/manager/gradle/extract.spec.ts b/lib/modules/manager/gradle/extract.spec.ts index 32ceb9a1e5f922..c5ea256fcc971c 100644 --- a/lib/modules/manager/gradle/extract.spec.ts +++ b/lib/modules/manager/gradle/extract.spec.ts @@ -41,7 +41,7 @@ describe('modules/manager/gradle/extract', () => { expect( await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ) ).toBeNull(); @@ -54,7 +54,7 @@ describe('modules/manager/gradle/extract', () => { jest.spyOn(parser, 'parseGradle').mockImplementationOnce(() => { throw err; }); - await extractAllPackageFiles(partial({}), [filename]); + await extractAllPackageFiles(partial(), [filename]); expect(logger.logger.warn).toHaveBeenCalledWith( { err, config: {}, packageFile: filename }, @@ -70,7 +70,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); @@ -97,7 +97,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); @@ -127,7 +127,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); @@ -174,7 +174,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); @@ -199,7 +199,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); @@ -233,7 +233,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); @@ -281,7 +281,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); @@ -342,7 +342,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); @@ -380,7 +380,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); expect(res).toMatchObject([ @@ -494,7 +494,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); @@ -610,7 +610,7 @@ describe('modules/manager/gradle/extract', () => { expect( await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ) ).toBeNull(); @@ -632,7 +632,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); expect(res).toMatchObject([ @@ -675,7 +675,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); expect(res).toMatchObject([ @@ -745,7 +745,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); @@ -825,7 +825,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); @@ -847,7 +847,7 @@ describe('modules/manager/gradle/extract', () => { expect( await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ) ).toBeNull(); @@ -861,7 +861,7 @@ describe('modules/manager/gradle/extract', () => { expect( await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ) ).toBeNull(); @@ -881,7 +881,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); @@ -929,7 +929,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); expect(res).toBeNull(); @@ -943,7 +943,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); expect(res).toBeNull(); @@ -970,7 +970,7 @@ describe('modules/manager/gradle/extract', () => { mockFs(fsMock); const res = await extractAllPackageFiles( - partial({}), + partial(), Object.keys(fsMock) ); diff --git a/lib/modules/manager/gradle/index.ts b/lib/modules/manager/gradle/index.ts index bb0ce8edd10c74..ad83ff7f60ba5d 100644 --- a/lib/modules/manager/gradle/index.ts +++ b/lib/modules/manager/gradle/index.ts @@ -12,12 +12,12 @@ export const supportsLockFileMaintenance = true; export const defaultConfig = { fileMatch: [ '\\.gradle(\\.kts)?$', - '(^|\\/)gradle\\.properties$', - '(^|\\/)gradle\\/.+\\.toml$', + '(^|/)gradle\\.properties$', + '(^|/)gradle/.+\\.toml$', '\\.versions\\.toml$', // The two below is for gradle-consistent-versions plugin - `(^|\\/)versions.props$`, - `(^|\\/)versions.lock$`, + `(^|/)versions.props$`, + `(^|/)versions.lock$`, ], timeout: 600, versioning: gradleVersioning.id, diff --git a/lib/modules/manager/gradle/parser.spec.ts b/lib/modules/manager/gradle/parser.spec.ts index 5b1a99bcf741af..99bb0063431c9b 100644 --- a/lib/modules/manager/gradle/parser.spec.ts +++ b/lib/modules/manager/gradle/parser.spec.ts @@ -157,6 +157,7 @@ describe('modules/manager/gradle/parser', () => { releaseCoroutines: "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.26.1-eap13" api: "org.slf4j:slf4j-api:$slfj4Version", ] + foo = [ group: "org.slf4j", name: "slf4j-ext", version: slfj4Version ] `; const { deps } = parseGradle(input); @@ -176,6 +177,11 @@ describe('modules/manager/gradle/parser', () => { groupName: 'slfj4Version', currentValue: '2.0.0', }, + { + depName: 'org.slf4j:slf4j-ext', + groupName: 'slfj4Version', + currentValue: '2.0.0', + }, ]); }); }); @@ -702,6 +708,7 @@ describe('modules/manager/gradle/parser', () => { ${''} | ${'library("foo", "bar", "baz", "qux").version("1.2.3")'} | ${null} ${''} | ${'library("foo.bar", "foo", "bar").version("1.2.3", "4.5.6")'} | ${null} ${''} | ${'library("foo", bar, "baz").version("1.2.3")'} | ${null} + ${''} | ${'plugin("foo.bar", "foo").version("1.2.3")'} | ${{ depName: 'foo', currentValue: '1.2.3' }} ${''} | ${'alias("foo.bar").to("foo", "bar").version("1.2.3")'} | ${{ depName: 'foo:bar', currentValue: '1.2.3' }} ${'version("baz", "1.2.3")'} | ${'alias("foo.bar").to("foo", "bar").versionRef("baz")'} | ${{ depName: 'foo:bar', currentValue: '1.2.3' }} ${'version("baz", "1.2.3")'} | ${'alias("foo.bar").to("foo", "bar").version("${baz}")'} | ${{ depName: 'foo:bar', currentValue: '1.2.3' }} @@ -889,28 +896,31 @@ describe('modules/manager/gradle/parser', () => { describe('implicit gradle plugins', () => { test.each` - def | input | output - ${'baz = "1.2.3"'} | ${'checkstyle { toolVersion = "${baz}" }'} | ${{ depName: 'checkstyle', packageName: GRADLE_PLUGINS['checkstyle'], currentValue: '1.2.3' }} - ${''} | ${'codenarc { toolVersion = "1.2.3" }'} | ${{ depName: 'codenarc', packageName: GRADLE_PLUGINS['codenarc'], currentValue: '1.2.3' }} - ${''} | ${'detekt { toolVersion = "1.2.3" }'} | ${{ depName: 'detekt', packageName: GRADLE_PLUGINS['detekt'], currentValue: '1.2.3' }} - ${''} | ${'findbugs { toolVersion = "1.2.3" }'} | ${{ depName: 'findbugs', packageName: GRADLE_PLUGINS['findbugs'], currentValue: '1.2.3' }} - ${''} | ${'googleJavaFormat { toolVersion = "1.2.3" }'} | ${{ depName: 'googleJavaFormat', packageName: GRADLE_PLUGINS['googleJavaFormat'], currentValue: '1.2.3' }} - ${'baz = "1.2.3"'} | ${'jacoco { toolVersion = baz }'} | ${{ depName: 'jacoco', packageName: GRADLE_PLUGINS['jacoco'], currentValue: '1.2.3', groupName: 'baz' }} - ${'baz = "1.2.3"'} | ${'jacoco { toolVersion = property("baz") }'} | ${{ depName: 'jacoco', packageName: GRADLE_PLUGINS['jacoco'], currentValue: '1.2.3' }} - ${''} | ${'lombok { version = "1.2.3" }'} | ${{ depName: 'lombok', packageName: GRADLE_PLUGINS['lombok'], currentValue: '1.2.3' }} - ${''} | ${'lombok { version.set("1.2.3") }'} | ${{ depName: 'lombok', packageName: GRADLE_PLUGINS['lombok'], currentValue: '1.2.3' }} - ${''} | ${'lombok { version.value("1.2.3") }'} | ${{ depName: 'lombok', packageName: GRADLE_PLUGINS['lombok'], currentValue: '1.2.3' }} - ${''} | ${'pmd { toolVersion = "1.2.3" }'} | ${{ depName: 'pmd', packageName: GRADLE_PLUGINS['pmd'], currentValue: '1.2.3' }} - ${''} | ${'pmd { toolVersion.set("1.2.3") }'} | ${{ depName: 'pmd', packageName: GRADLE_PLUGINS['pmd'], currentValue: '1.2.3' }} - ${''} | ${'pmd { toolVersion.value("1.2.3") }'} | ${{ depName: 'pmd', packageName: GRADLE_PLUGINS['pmd'], currentValue: '1.2.3' }} - ${''} | ${'pmd { foo = "bar"; toolVersion = "1.2.3" }'} | ${{ depName: 'pmd', packageName: GRADLE_PLUGINS['pmd'], currentValue: '1.2.3' }} - ${''} | ${'spotbugs { toolVersion = "1.2.3" }'} | ${{ depName: 'spotbugs', packageName: GRADLE_PLUGINS['spotbugs'], currentValue: '1.2.3' }} - ${''} | ${'pmd { toolVersion = "@@@" }'} | ${null} - ${''} | ${'pmd { toolVersion = "${baz}" }'} | ${null} - ${'baz = "1.2.3"'} | ${'pmd { toolVersion = "${baz}.456" }'} | ${{ depName: 'pmd', currentValue: '1.2.3.456', skipReason: 'unknown-version' }} - ${'baz = "1.2.3"'} | ${'pmd { toolVersion = baz + ".456" }'} | ${{ depName: 'pmd', currentValue: '1.2.3.456', skipReason: 'unknown-version' }} - ${''} | ${'pmd { [toolVersion = "6.36.0"] }'} | ${null} - ${''} | ${'unknown { toolVersion = "1.2.3" }'} | ${null} + def | input | output + ${'baz = "1.2.3"'} | ${'checkstyle { toolVersion = "${baz}" }'} | ${{ depName: 'checkstyle', packageName: GRADLE_PLUGINS['checkstyle'][1], currentValue: '1.2.3' }} + ${'baz = "1.2.3"'} | ${'checkstyle { toolVersion "${baz}" }'} | ${{ depName: 'checkstyle', packageName: GRADLE_PLUGINS['checkstyle'][1], currentValue: '1.2.3' }} + ${''} | ${'codenarc { toolVersion = "1.2.3" }'} | ${{ depName: 'codenarc', packageName: GRADLE_PLUGINS['codenarc'][1], currentValue: '1.2.3' }} + ${''} | ${'detekt { toolVersion = "1.2.3" }'} | ${{ depName: 'detekt', packageName: GRADLE_PLUGINS['detekt'][1], currentValue: '1.2.3' }} + ${''} | ${'findbugs { toolVersion = "1.2.3" }'} | ${{ depName: 'findbugs', packageName: GRADLE_PLUGINS['findbugs'][1], currentValue: '1.2.3' }} + ${''} | ${'googleJavaFormat { toolVersion = "1.2.3" }'} | ${{ depName: 'googleJavaFormat', packageName: GRADLE_PLUGINS['googleJavaFormat'][1], currentValue: '1.2.3' }} + ${'baz = "1.2.3"'} | ${'jacoco { toolVersion = baz }'} | ${{ depName: 'jacoco', packageName: GRADLE_PLUGINS['jacoco'][1], currentValue: '1.2.3', groupName: 'baz' }} + ${'baz = "1.2.3"'} | ${'jacoco { toolVersion = property("baz") }'} | ${{ depName: 'jacoco', packageName: GRADLE_PLUGINS['jacoco'][1], currentValue: '1.2.3' }} + ${''} | ${'lombok { version = "1.2.3" }'} | ${{ depName: 'lombok', packageName: GRADLE_PLUGINS['lombok'][1], currentValue: '1.2.3' }} + ${''} | ${'lombok { version.set("1.2.3") }'} | ${{ depName: 'lombok', packageName: GRADLE_PLUGINS['lombok'][1], currentValue: '1.2.3' }} + ${''} | ${'lombok { version.value("1.2.3") }'} | ${{ depName: 'lombok', packageName: GRADLE_PLUGINS['lombok'][1], currentValue: '1.2.3' }} + ${''} | ${'pmd { toolVersion = "1.2.3" }'} | ${{ depName: 'pmd', packageName: GRADLE_PLUGINS['pmd'][1], currentValue: '1.2.3' }} + ${''} | ${'pmd { toolVersion.set("1.2.3") }'} | ${{ depName: 'pmd', packageName: GRADLE_PLUGINS['pmd'][1], currentValue: '1.2.3' }} + ${''} | ${'pmd { toolVersion.value("1.2.3") }'} | ${{ depName: 'pmd', packageName: GRADLE_PLUGINS['pmd'][1], currentValue: '1.2.3' }} + ${''} | ${'pmd { foo = "bar"; toolVersion = "1.2.3" }'} | ${{ depName: 'pmd', packageName: GRADLE_PLUGINS['pmd'][1], currentValue: '1.2.3' }} + ${''} | ${'spotbugs { toolVersion = "1.2.3" }'} | ${{ depName: 'spotbugs', packageName: GRADLE_PLUGINS['spotbugs'][1], currentValue: '1.2.3' }} + ${''} | ${'pmd { toolVersion = "@@@" }'} | ${null} + ${''} | ${'pmd { toolVersion = "${baz}" }'} | ${null} + ${'baz = "1.2.3"'} | ${'pmd { toolVersion = "${baz}.456" }'} | ${{ depName: 'pmd', currentValue: '1.2.3.456', skipReason: 'unknown-version' }} + ${'baz = "1.2.3"'} | ${'pmd { toolVersion = baz + ".456" }'} | ${{ depName: 'pmd', currentValue: '1.2.3.456', skipReason: 'unknown-version' }} + ${''} | ${'pmd { [toolVersion = "6.36.0"] }'} | ${null} + ${''} | ${'unknown { toolVersion = "1.2.3" }'} | ${null} + ${''} | ${'composeOptions { kotlinCompilerExtensionVersion = "1.2.3" }'} | ${{ depName: 'composeOptions', packageName: GRADLE_PLUGINS['composeOptions'][1], currentValue: '1.2.3' }} + ${''} | ${'jmh { jmhVersion = "1.2.3" }'} | ${{ depName: 'jmh', packageName: GRADLE_PLUGINS['jmh'][1], currentValue: '1.2.3' }} `('$def | $input', ({ def, input, output }) => { const { deps } = parseGradle([def, input].join('\n')); expect(deps).toMatchObject([output].filter(is.truthy)); diff --git a/lib/modules/manager/gradle/parser.ts b/lib/modules/manager/gradle/parser.ts index 02a788145d25c7..edc00409118741 100644 --- a/lib/modules/manager/gradle/parser.ts +++ b/lib/modules/manager/gradle/parser.ts @@ -56,6 +56,7 @@ export function parseGradle( registryUrls: [], varTokens: [], + tmpNestingDepth: [], tmpTokenStore: {}, tokenMap: {}, }); diff --git a/lib/modules/manager/gradle/parser/assignments.ts b/lib/modules/manager/gradle/parser/assignments.ts index b820145d49dea7..a05802061829dc 100644 --- a/lib/modules/manager/gradle/parser/assignments.ts +++ b/lib/modules/manager/gradle/parser/assignments.ts @@ -1,15 +1,19 @@ -import { query as q } from 'good-enough-parser'; +import { parser, query as q } from 'good-enough-parser'; import { regEx } from '../../../../util/regex'; import type { Ctx } from '../types'; import { cleanupTempVars, coalesceVariable, + increaseNestingDepth, + prependNestingDepth, qStringValue, qTemplateString, qVariableAssignmentIdentifier, + reduceNestingDepth, storeInTokenMap, storeVarToken, } from './common'; +import { qGroovyMapNotationDependencies } from './dependencies'; import { handleAssignment } from './handlers'; // foo = "1.2.3" @@ -62,24 +66,36 @@ const qKotlinSingleExtraVarAssignment = q }) .handler(cleanupTempVars); -// foo: "1.2.3" -const qGroovySingleMapOfVarAssignment = q - .sym(storeVarToken) - .handler((ctx) => { - ctx.tmpTokenStore.backupVarTokens = ctx.varTokens; - return ctx; - }) - .handler(coalesceVariable) - .handler((ctx) => storeInTokenMap(ctx, 'keyToken')) - .op(':') - .join(qTemplateString) - .handler((ctx) => storeInTokenMap(ctx, 'valToken')) - .handler(handleAssignment) - .handler((ctx) => { - ctx.varTokens = ctx.tmpTokenStore.backupVarTokens!; - ctx.varTokens.pop(); - return ctx; - }); +const qGroovySingleMapOfVarAssignment = q.alt( + // foo: [group: "foo", name: "bar", version: "1.2.3"] + q.begin().join(qGroovyMapNotationDependencies).end(), + // foo: "1.2.3" + q + .sym(storeVarToken) + .handler(prependNestingDepth) + .handler(coalesceVariable) + .handler((ctx) => storeInTokenMap(ctx, 'keyToken')) + .op(':') + .join(qTemplateString) + .handler((ctx) => storeInTokenMap(ctx, 'valToken')) + .handler(handleAssignment) +); + +const qGroovyMapOfExpr = ( + search: q.QueryBuilder +): q.QueryBuilder => + q.alt( + q.sym(storeVarToken).op(':').tree({ + type: 'wrapped-tree', + maxDepth: 1, + startsWith: '[', + endsWith: ']', + preHandler: increaseNestingDepth, + search, + postHandler: reduceNestingDepth, + }), + qGroovySingleMapOfVarAssignment + ); // versions = [ android: [ buildTools: '30.0.3' ], kotlin: '1.4.30' ] const qGroovyMultiVarAssignment = qVariableAssignmentIdentifier @@ -89,59 +105,37 @@ const qGroovyMultiVarAssignment = qVariableAssignmentIdentifier maxDepth: 1, startsWith: '[', endsWith: ']', - search: q.alt( - q - .sym(storeVarToken) - .op(':') - .tree({ - type: 'wrapped-tree', - maxDepth: 1, - startsWith: '[', - endsWith: ']', - search: q.alt( - q - .sym(storeVarToken) - .op(':') - .tree({ - type: 'wrapped-tree', - maxDepth: 1, - startsWith: '[', - endsWith: ']', - search: qGroovySingleMapOfVarAssignment, - postHandler: (ctx) => { - ctx.varTokens.pop(); - return ctx; - }, - }), - qGroovySingleMapOfVarAssignment - ), - postHandler: (ctx) => { - ctx.varTokens.pop(); - return ctx; - }, - }), - qGroovySingleMapOfVarAssignment - ), + preHandler: increaseNestingDepth, + search: qGroovyMapOfExpr(qGroovyMapOfExpr(qGroovySingleMapOfVarAssignment)), + postHandler: reduceNestingDepth, }) .handler(cleanupTempVars); // "foo1" to "bar1" const qKotlinSingleMapOfVarAssignment = qStringValue .sym('to') - .handler((ctx) => { - ctx.tmpTokenStore.backupVarTokens = ctx.varTokens; - return ctx; - }) + .handler(prependNestingDepth) .handler(coalesceVariable) .handler((ctx) => storeInTokenMap(ctx, 'keyToken')) .join(qTemplateString) .handler((ctx) => storeInTokenMap(ctx, 'valToken')) - .handler(handleAssignment) - .handler((ctx) => { - ctx.varTokens = ctx.tmpTokenStore.backupVarTokens!; - ctx.varTokens.pop(); - return ctx; - }); + .handler(handleAssignment); + +const qKotlinMapOfExpr = ( + search: q.QueryBuilder +): q.QueryBuilder => + q.alt( + qStringValue.sym('to').sym('mapOf').tree({ + type: 'wrapped-tree', + maxDepth: 1, + startsWith: '(', + endsWith: ')', + preHandler: increaseNestingDepth, + search, + postHandler: reduceNestingDepth, + }), + qKotlinSingleMapOfVarAssignment + ); // val versions = mapOf("foo1" to "bar1", "foo2" to "bar2", "foo3" to "bar3") const qKotlinMultiMapOfVarAssignment = qVariableAssignmentIdentifier @@ -152,39 +146,9 @@ const qKotlinMultiMapOfVarAssignment = qVariableAssignmentIdentifier maxDepth: 1, startsWith: '(', endsWith: ')', - search: q.alt( - qStringValue - .sym('to') - .sym('mapOf') - .tree({ - type: 'wrapped-tree', - maxDepth: 1, - startsWith: '(', - endsWith: ')', - search: q.alt( - qStringValue - .sym('to') - .sym('mapOf') - .tree({ - type: 'wrapped-tree', - maxDepth: 1, - startsWith: '(', - endsWith: ')', - search: qKotlinSingleMapOfVarAssignment, - postHandler: (ctx: Ctx) => { - ctx.varTokens.pop(); - return ctx; - }, - }), - qKotlinSingleMapOfVarAssignment - ), - postHandler: (ctx: Ctx) => { - ctx.varTokens.pop(); - return ctx; - }, - }), - qKotlinSingleMapOfVarAssignment - ), + preHandler: increaseNestingDepth, + search: qKotlinMapOfExpr(qKotlinMapOfExpr(qKotlinSingleMapOfVarAssignment)), + postHandler: reduceNestingDepth, }) .handler(cleanupTempVars); diff --git a/lib/modules/manager/gradle/parser/common.spec.ts b/lib/modules/manager/gradle/parser/common.spec.ts index c1b6879406d73b..c2742363c049a7 100644 --- a/lib/modules/manager/gradle/parser/common.spec.ts +++ b/lib/modules/manager/gradle/parser/common.spec.ts @@ -4,8 +4,11 @@ import type { Ctx, PackageVariables } from '../types'; import { cleanupTempVars, coalesceVariable, + increaseNestingDepth, interpolateString, loadFromTokenMap, + prependNestingDepth, + reduceNestingDepth, storeInTokenMap, storeVarToken, stripReservedPrefixFromKeyTokens, @@ -13,7 +16,7 @@ import { describe('modules/manager/gradle/parser/common', () => { let ctx: Ctx; - const token = partial({}); + const token = partial({ value: 'test' }); beforeEach(() => { ctx = { @@ -26,6 +29,7 @@ describe('modules/manager/gradle/parser/common', () => { registryUrls: [], varTokens: [], + tmpNestingDepth: [], tmpTokenStore: {}, tokenMap: {}, }; @@ -36,6 +40,33 @@ describe('modules/manager/gradle/parser/common', () => { expect(ctx.varTokens).toStrictEqual([token]); }); + it('increaseNestingDepth', () => { + ctx.tmpNestingDepth = ctx.varTokens = [token]; + increaseNestingDepth(ctx); + expect(ctx).toMatchObject({ + tmpNestingDepth: [token, token], + varTokens: [], + }); + }); + + it('reduceNestingDepth', () => { + ctx.tmpNestingDepth = [token, token]; + reduceNestingDepth(ctx); + expect(ctx.tmpNestingDepth).toHaveLength(1); + }); + + it('prependNestingDepth', () => { + ctx.tmpNestingDepth = ctx.varTokens = [token]; + prependNestingDepth(ctx); + expect(ctx.varTokens).toStrictEqual([token, token]); + + coalesceVariable(ctx); + expect(ctx).toMatchObject({ + tmpNestingDepth: [{ value: 'test' }], + varTokens: [{ value: 'test.test' }], + }); + }); + it('storeInTokenMap', () => { ctx.varTokens = [token]; storeInTokenMap(ctx, 'foo'); @@ -98,13 +129,13 @@ describe('modules/manager/gradle/parser/common', () => { expect( interpolateString( partial([{ type: 'symbol', value: 'foo' }]), - partial({}) + partial() ) ).toBeNull(); expect( interpolateString( partial([{ type: '_', value: 'foo' }]), - partial({}) + partial() ) ).toBeNull(); }); diff --git a/lib/modules/manager/gradle/parser/common.ts b/lib/modules/manager/gradle/parser/common.ts index 6f73dae18b4178..4693da32c294f6 100644 --- a/lib/modules/manager/gradle/parser/common.ts +++ b/lib/modules/manager/gradle/parser/common.ts @@ -1,4 +1,5 @@ import { lexer, parser, query as q } from 'good-enough-parser'; +import { clone } from '../../../../util/clone'; import { regEx } from '../../../../util/regex'; import type { Ctx, NonEmptyArray, PackageVariables } from '../types'; @@ -10,15 +11,23 @@ export const REGISTRY_URLS = { }; export const GRADLE_PLUGINS = { - checkstyle: 'com.puppycrawl.tools:checkstyle', - codenarc: 'org.codenarc:CodeNarc', - detekt: 'io.gitlab.arturbosch.detekt:detekt-core', - findbugs: 'com.google.code.findbugs:findbugs', - googleJavaFormat: 'com.google.googlejavaformat:google-java-format', - jacoco: 'org.jacoco:jacoco', - lombok: 'org.projectlombok:lombok', - pmd: 'net.sourceforge.pmd:pmd-java', - spotbugs: 'com.github.spotbugs:spotbugs', + checkstyle: ['toolVersion', 'com.puppycrawl.tools:checkstyle'], + codenarc: ['toolVersion', 'org.codenarc:CodeNarc'], + composeOptions: [ + 'kotlinCompilerExtensionVersion', + 'androidx.compose.compiler:compiler', + ], + detekt: ['toolVersion', 'io.gitlab.arturbosch.detekt:detekt-core'], + findbugs: ['toolVersion', 'com.google.code.findbugs:findbugs'], + googleJavaFormat: [ + 'toolVersion', + 'com.google.googlejavaformat:google-java-format', + ], + jacoco: ['toolVersion', 'org.jacoco:jacoco'], + jmh: ['jmhVersion', 'org.openjdk.jmh:jmh-core'], + lombok: ['version', 'org.projectlombok:lombok'], + pmd: ['toolVersion', 'net.sourceforge.pmd:pmd-java'], + spotbugs: ['toolVersion', 'com.github.spotbugs:spotbugs'], }; export const ANNOYING_METHODS: ReadonlySet = new Set([ @@ -39,6 +48,22 @@ export function storeVarToken(ctx: Ctx, node: lexer.Token): Ctx { return ctx; } +export function increaseNestingDepth(ctx: Ctx): Ctx { + ctx.tmpNestingDepth.push(...ctx.varTokens); + ctx.varTokens = []; + return ctx; +} + +export function reduceNestingDepth(ctx: Ctx): Ctx { + ctx.tmpNestingDepth.pop(); + return ctx; +} + +export function prependNestingDepth(ctx: Ctx): Ctx { + ctx.varTokens = [...clone(ctx.tmpNestingDepth), ...ctx.varTokens]; + return ctx; +} + export function storeInTokenMap(ctx: Ctx, tokenMapKey: string): Ctx { ctx.tokenMap[tokenMapKey] = ctx.varTokens; ctx.varTokens = []; diff --git a/lib/modules/manager/gradle/parser/dependencies.ts b/lib/modules/manager/gradle/parser/dependencies.ts index 098a2367e0e79d..bb194aea6be94d 100644 --- a/lib/modules/manager/gradle/parser/dependencies.ts +++ b/lib/modules/manager/gradle/parser/dependencies.ts @@ -79,7 +79,7 @@ const qDependencySet = q .handler(cleanupTempVars); // group: "foo", name: "bar", version: "1.2.3" -const qGroovyMapNotationDependencies = q +export const qGroovyMapNotationDependencies = q .sym('group') .op(':') .join(qGroupId) @@ -162,29 +162,38 @@ export const qLongFormDep = q // pmd { toolVersion = "1.2.3" } const qImplicitGradlePlugin = q - .sym(regEx(`^(?:${Object.keys(GRADLE_PLUGINS).join('|')})$`), storeVarToken) - .handler((ctx) => storeInTokenMap(ctx, 'pluginName')) - .tree({ - type: 'wrapped-tree', - maxDepth: 1, - maxMatches: 1, - startsWith: '{', - endsWith: '}', - search: q.sym(regEx(/^(?:toolVersion|version)$/)).alt( - // toolVersion = "1.2.3" - q.op('=').join(qVersion), - // toolVersion.set("1.2.3"), toolVersion.value("1.2.3") + .alt( + ...Object.keys(GRADLE_PLUGINS).map((pluginName) => q - .op('.') - .sym(regEx(/^(?:set|value)$/)) + .sym(pluginName, storeVarToken) + .handler((ctx) => storeInTokenMap(ctx, 'pluginName')) .tree({ + type: 'wrapped-tree', maxDepth: 1, - startsWith: '(', - endsWith: ')', - search: q.begin().join(qVersion).end(), + maxMatches: 1, + startsWith: '{', + endsWith: '}', + search: q + .sym( + GRADLE_PLUGINS[pluginName as keyof typeof GRADLE_PLUGINS][0] + ) + .alt( + // toolVersion = "1.2.3" + q.opt(q.op('=')).join(qVersion), + // toolVersion.set("1.2.3"), toolVersion.value("1.2.3") + q + .op('.') + .sym(regEx(/^(?:set|value)$/)) + .tree({ + maxDepth: 1, + startsWith: '(', + endsWith: ')', + search: q.begin().join(qVersion).end(), + }) + ), }) - ), - }) + ) + ) .handler(handleImplicitGradlePlugin) .handler(cleanupTempVars); diff --git a/lib/modules/manager/gradle/parser/handlers.ts b/lib/modules/manager/gradle/parser/handlers.ts index 1b633d2d788359..44f3f970064a53 100644 --- a/lib/modules/manager/gradle/parser/handlers.ts +++ b/lib/modules/manager/gradle/parser/handlers.ts @@ -397,7 +397,7 @@ export function handleImplicitGradlePlugin(ctx: Ctx): Ctx { } const groupIdArtifactId = - GRADLE_PLUGINS[pluginName as keyof typeof GRADLE_PLUGINS]; + GRADLE_PLUGINS[pluginName as keyof typeof GRADLE_PLUGINS][1]; const dep = parseDependencyString(`${groupIdArtifactId}:${versionValue}`); if (!dep) { return ctx; diff --git a/lib/modules/manager/gradle/parser/version-catalogs.ts b/lib/modules/manager/gradle/parser/version-catalogs.ts index 30bcb78f5ecf68..f08b32767e38e4 100644 --- a/lib/modules/manager/gradle/parser/version-catalogs.ts +++ b/lib/modules/manager/gradle/parser/version-catalogs.ts @@ -8,7 +8,7 @@ import { storeInTokenMap, storeVarToken, } from './common'; -import { handleLibraryDep } from './handlers'; +import { handleLibraryDep, handlePlugin } from './handlers'; const qGroupId = qValueMatcher.handler((ctx) => storeInTokenMap(ctx, 'groupId') @@ -61,6 +61,28 @@ const qVersionCatalogDependencies = q .handler(handleLibraryDep) .handler(cleanupTempVars); +// plugin("foo.bar", "foo:bar") +const qVersionCatalogPlugins = q + .sym('plugin', storeVarToken) + .handler((ctx) => storeInTokenMap(ctx, 'methodName')) + .tree({ + type: 'wrapped-tree', + maxDepth: 1, + startsWith: '(', + endsWith: ')', + search: q + .begin() + .join(qStringValue) + .handler((ctx) => storeInTokenMap(ctx, 'alias')) + .op(',') + .alt(qStringValue) + .handler((ctx) => storeInTokenMap(ctx, 'pluginName')) + .end(), + }) + .opt(qVersionCatalogVersion) + .handler(handlePlugin) + .handler(cleanupTempVars); + // alias("foo.bar").to("foo", "bar").version("1.2.3") const qVersionCatalogAliasDependencies = q .sym('alias') @@ -90,5 +112,6 @@ const qVersionCatalogAliasDependencies = q export const qVersionCatalogs = q.alt( qVersionCatalogDependencies, + qVersionCatalogPlugins, qVersionCatalogAliasDependencies ); diff --git a/lib/modules/manager/gradle/readme.md b/lib/modules/manager/gradle/readme.md index 407861566bb9e9..31fcbc59952917 100644 --- a/lib/modules/manager/gradle/readme.md +++ b/lib/modules/manager/gradle/readme.md @@ -1,2 +1,8 @@ The `gradle` manager uses a custom parser written in JavaScript, similar to many others managers. It does not call `gradle` directly in order to extract a list of dependencies. + +### Updating lockfiles + +Updating lockfiles is done with `./gradlew :dependencies --wirte/update-locks` command. +This command can output excessive text to the console. +While running the command, the output to stdout is dropped when you run Renovate on most platforms other than Windows. diff --git a/lib/modules/manager/gradle/types.ts b/lib/modules/manager/gradle/types.ts index a4646dbef8ab86..7222c36345aa71 100644 --- a/lib/modules/manager/gradle/types.ts +++ b/lib/modules/manager/gradle/types.ts @@ -82,6 +82,7 @@ export interface Ctx { registryUrls: PackageRegistry[]; varTokens: lexer.Token[]; + tmpNestingDepth: lexer.Token[]; tmpTokenStore: Record; tokenMap: Record; } diff --git a/lib/modules/manager/helmfile/__fixtures__/multidoc.yaml b/lib/modules/manager/helmfile/__fixtures__/multidoc.yaml index 69d3c8544701a0..d42bd70e57cfd2 100644 --- a/lib/modules/manager/helmfile/__fixtures__/multidoc.yaml +++ b/lib/modules/manager/helmfile/__fixtures__/multidoc.yaml @@ -25,6 +25,8 @@ repositories: url: https://charts.bitnami.com/bitnami - name: prometheus-community url: https://prometheus-community.github.io/helm-charts +- name: incubator + url: https://charts.helm.sh/incubator/ templates: external-chart: &external-chart @@ -72,3 +74,24 @@ releases: {{`{{ range .Alerts }} *Alert:* {{ .Annotations.summary }} {{ end }}`}} + +- name: raw1 + chart: incubator/raw + version: 0.1.0 + values: + - resources: + - apiVersion: v1 + kind: ConfigMap + metadata: + name: raw1 + namespace: default + data: + foo: FOO + strategicMergePatches: + - apiVersion: v1 + kind: ConfigMap + metadata: + name: raw1 + namespace: default + data: + bar: BAR diff --git a/lib/modules/manager/helmfile/__snapshots__/extract.spec.ts.snap b/lib/modules/manager/helmfile/__snapshots__/extract.spec.ts.snap index dbe1c07f508bbc..49b560fae84aa4 100644 --- a/lib/modules/manager/helmfile/__snapshots__/extract.spec.ts.snap +++ b/lib/modules/manager/helmfile/__snapshots__/extract.spec.ts.snap @@ -30,6 +30,16 @@ exports[`modules/manager/helmfile/extract extractPackageFile() parses multidoc y "depName": "external-dns", "skipReason": "invalid-version", }, + { + "currentValue": "0.1.0", + "depName": "raw", + "managerData": { + "needKustomize": true, + }, + "registryUrls": [ + "https://charts.helm.sh/incubator/", + ], + }, ], } `; diff --git a/lib/modules/manager/helmfile/artifacts.spec.ts b/lib/modules/manager/helmfile/artifacts.spec.ts index 9c699bcfbbf9e0..f4c448451ac191 100644 --- a/lib/modules/manager/helmfile/artifacts.spec.ts +++ b/lib/modules/manager/helmfile/artifacts.spec.ts @@ -42,8 +42,9 @@ releases: chart: oauth2-proxy/oauth2-proxy version: 6.8.0 `; + const lockFile = codeBlock` -version: 0.150.0 +version: 0.151.0 dependencies: - name: backstage repository: https://backstage.github.io/charts @@ -51,11 +52,11 @@ dependencies: - name: oauth2-proxy repository: https://oauth2-proxy.github.io/manifests version: 6.2.1 -digest: sha256:98c605fc3de51960ad1eb022f01dfae3bb0a1a06549e56fa39ec86db2a9a072d -generated: "2023-01-23T12:13:46.487247+01:00" +digest: sha256:e284706b71f37b757a536703da4cb148d67901afbf1ab431f7d60a9852ca6eef +generated: "2023-03-08T21:32:06.122276997+01:00" `; const lockFileTwo = codeBlock` -version: 0.150.0 +version: 0.151.0 dependencies: - name: backstage repository: https://backstage.github.io/charts @@ -63,8 +64,8 @@ dependencies: - name: oauth2-proxy repository: https://oauth2-proxy.github.io/manifests version: 6.8.0 -digest: sha256:8ceea14d17c0f3c108a26ba341c63380e2426db66484d2b2876ab6e636e52af4 -generated: "2023-01-23T12:16:41.881988+01:00" +digest: sha256:9d83889176d005effb86041d30c20361625561cbfb439cbd16d7243225bac17c +generated: "2023-03-08T21:30:48.273709455+01:00" `; describe('modules/manager/helmfile/artifacts', () => { @@ -155,7 +156,7 @@ describe('modules/manager/helmfile/artifacts', () => { { binarySource: 'docker', expectedCommands: [ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -165,12 +166,14 @@ describe('modules/manager/helmfile/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar ' + + 'containerbase/sidecar ' + 'bash -l -c "' + 'install-tool helm v3.7.2' + ' && ' + 'install-tool helmfile v0.129.0' + ' && ' + + 'install-tool kustomize 5.0.0' + + ' && ' + 'helmfile deps -f helmfile.yaml' + '"', }, @@ -181,6 +184,7 @@ describe('modules/manager/helmfile/artifacts', () => { expectedCommands: [ { cmd: 'install-tool helm v3.7.2' }, { cmd: 'install-tool helmfile v0.129.0' }, + { cmd: 'install-tool kustomize 5.0.0' }, { cmd: 'helmfile deps -f helmfile.yaml' }, ], }, @@ -203,7 +207,12 @@ describe('modules/manager/helmfile/artifacts', () => { datasource.getPkgReleases.mockResolvedValueOnce({ releases: [{ version: 'v0.129.0' }], }); - const updatedDeps = [{ depName: 'dep1' }]; + datasource.getPkgReleases.mockResolvedValueOnce({ + releases: [{ version: '5.0.0' }], + }); + const updatedDeps = [ + { depName: 'dep1', managerData: { needKustomize: true } }, + ]; expect( await helmfile.updateArtifacts({ packageFileName: 'helmfile.yaml', diff --git a/lib/modules/manager/helmfile/artifacts.ts b/lib/modules/manager/helmfile/artifacts.ts index c7a9f23ae5ff0c..578372e1068361 100644 --- a/lib/modules/manager/helmfile/artifacts.ts +++ b/lib/modules/manager/helmfile/artifacts.ts @@ -3,7 +3,7 @@ import { quote } from 'shlex'; import { TEMPORARY_ERROR } from '../../../constants/error-messages'; import { logger } from '../../../logger'; import { exec } from '../../../util/exec'; -import type { ExecOptions } from '../../../util/exec/types'; +import type { ToolConstraint } from '../../../util/exec/types'; import { getSiblingFileName, readLocalFile, @@ -40,21 +40,30 @@ export async function updateArtifacts({ try { await writeLocalFile(packageFileName, newPackageFileContent); - const execOptions: ExecOptions = { + const toolConstraints: ToolConstraint[] = [ + { + toolName: 'helm', + constraint: config.constraints?.helm, + }, + { + toolName: 'helmfile', + constraint: config.constraints?.helmfile, + }, + ]; + const needKustomize = updatedDeps.some( + (dep) => dep.managerData?.needKustomize + ); + if (needKustomize) { + toolConstraints.push({ + toolName: 'kustomize', + constraint: config.constraints?.kustomize, + }); + } + await exec(`helmfile deps -f ${quote(packageFileName)}`, { docker: {}, extraEnv: {}, - toolConstraints: [ - { - toolName: 'helm', - constraint: config.constraints?.helm, - }, - { - toolName: 'helmfile', - constraint: config.constraints?.helmfile, - }, - ], - }; - await exec(`helmfile deps -f ${quote(packageFileName)}`, execOptions); + toolConstraints, + }); const newHelmLockContent = await readLocalFile(lockFileName, 'utf8'); if (existingLockFileContent === newHelmLockContent) { diff --git a/lib/modules/manager/helmfile/extract.spec.ts b/lib/modules/manager/helmfile/extract.spec.ts index f3f535df14bf66..6b312da7b7ff9d 100644 --- a/lib/modules/manager/helmfile/extract.spec.ts +++ b/lib/modules/manager/helmfile/extract.spec.ts @@ -199,6 +199,7 @@ describe('modules/manager/helmfile/extract', () => { { depName: 'kube-prometheus-stack', currentValue: '13.7' }, { depName: 'invalid', skipReason: 'invalid-name' }, { depName: 'external-dns', skipReason: 'invalid-version' }, + { depName: 'raw', managerData: { needKustomize: true } }, ], }); }); diff --git a/lib/modules/manager/helmfile/extract.ts b/lib/modules/manager/helmfile/extract.ts index 5477a52dc4aff3..70b79c72001a1c 100644 --- a/lib/modules/manager/helmfile/extract.ts +++ b/lib/modules/manager/helmfile/extract.ts @@ -10,6 +10,7 @@ import type { PackageFileContent, } from '../types'; import type { Doc } from './types'; +import { areKustomizationsUsed } from './utils'; const isValidChartName = (name: string | undefined): boolean => !!name && !regEx(/[!@#$%^&*(),.?":{}/|<>A-Z]/).test(name); @@ -92,7 +93,9 @@ export function extractPackageFile( .concat([config.registryAliases?.[repoName]] as string[]) .filter(is.string), }; - + if (areKustomizationsUsed(dep)) { + res.managerData = { needKustomize: true }; + } // in case of OCI repository, we need a PackageDependency with a DockerDatasource and a packageName const repository = doc.repositories?.find( (repo) => repo.name === repoName diff --git a/lib/modules/manager/helmfile/types.ts b/lib/modules/manager/helmfile/types.ts index f2a9593e7cd509..d38263d102190b 100644 --- a/lib/modules/manager/helmfile/types.ts +++ b/lib/modules/manager/helmfile/types.ts @@ -1,7 +1,10 @@ -interface Release { +export interface Release { name: string; chart: string; version: string; + strategicMergePatches?: unknown; + jsonPatches?: unknown; + transformers?: unknown; } interface Repository { diff --git a/lib/modules/manager/helmfile/utils.ts b/lib/modules/manager/helmfile/utils.ts new file mode 100644 index 00000000000000..415925b9d10aa0 --- /dev/null +++ b/lib/modules/manager/helmfile/utils.ts @@ -0,0 +1,10 @@ +import type { Release } from './types'; + +/** Returns true if kustomize specific keys exist in a helmfile release */ +export function areKustomizationsUsed(release: Release): boolean { + return ( + release.strategicMergePatches !== undefined || + release.jsonPatches !== undefined || + release.transformers !== undefined + ); +} diff --git a/lib/modules/manager/helmv3/__snapshots__/artifacts.spec.ts.snap b/lib/modules/manager/helmv3/__snapshots__/artifacts.spec.ts.snap index 205dd8746507ec..6fcb8eb6787c86 100644 --- a/lib/modules/manager/helmv3/__snapshots__/artifacts.spec.ts.snap +++ b/lib/modules/manager/helmv3/__snapshots__/artifacts.spec.ts.snap @@ -399,7 +399,7 @@ exports[`modules/manager/helmv3/artifacts returns updated Chart.lock for lockfil exports[`modules/manager/helmv3/artifacts returns updated Chart.lock with docker 1`] = ` [ { - "cmd": "docker pull renovate/sidecar", + "cmd": "docker pull containerbase/sidecar", "options": { "encoding": "utf-8", }, @@ -411,7 +411,7 @@ exports[`modules/manager/helmv3/artifacts returns updated Chart.lock with docker }, }, { - "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e HELM_EXPERIMENTAL_OCI -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" renovate/sidecar bash -l -c "install-tool helm v3.7.2 && helm repo add repo-test --registry-config /tmp/renovate/cache/__renovate-private-cache/registry.json --repository-config /tmp/renovate/cache/__renovate-private-cache/repositories.yaml --repository-cache /tmp/renovate/cache/__renovate-private-cache/repositories https://gitlab.com/api/v4/projects/xxxxxxx/packages/helm/stable && helm dependency update --registry-config /tmp/renovate/cache/__renovate-private-cache/registry.json --repository-config /tmp/renovate/cache/__renovate-private-cache/repositories.yaml --repository-cache /tmp/renovate/cache/__renovate-private-cache/repositories ''"", + "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e HELM_EXPERIMENTAL_OCI -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" containerbase/sidecar bash -l -c "install-tool helm v3.7.2 && helm repo add repo-test --registry-config /tmp/renovate/cache/__renovate-private-cache/registry.json --repository-config /tmp/renovate/cache/__renovate-private-cache/repositories.yaml --repository-cache /tmp/renovate/cache/__renovate-private-cache/repositories https://gitlab.com/api/v4/projects/xxxxxxx/packages/helm/stable && helm dependency update --registry-config /tmp/renovate/cache/__renovate-private-cache/registry.json --repository-config /tmp/renovate/cache/__renovate-private-cache/repositories.yaml --repository-cache /tmp/renovate/cache/__renovate-private-cache/repositories ''"", "options": { "cwd": "/tmp/github/some/repo", "encoding": "utf-8", @@ -518,7 +518,7 @@ exports[`modules/manager/helmv3/artifacts sets repositories from registryAliases exports[`modules/manager/helmv3/artifacts sets repositories from registryAliases with docker 1`] = ` [ { - "cmd": "docker pull renovate/sidecar", + "cmd": "docker pull containerbase/sidecar", "options": { "encoding": "utf-8", }, @@ -530,7 +530,7 @@ exports[`modules/manager/helmv3/artifacts sets repositories from registryAliases }, }, { - "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e HELM_EXPERIMENTAL_OCI -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" renovate/sidecar bash -l -c "install-tool helm v3.7.2 && helm repo add stable --registry-config /tmp/renovate/cache/__renovate-private-cache/registry.json --repository-config /tmp/renovate/cache/__renovate-private-cache/repositories.yaml --repository-cache /tmp/renovate/cache/__renovate-private-cache/repositories the_stable_url && helm repo add repo1 --registry-config /tmp/renovate/cache/__renovate-private-cache/registry.json --repository-config /tmp/renovate/cache/__renovate-private-cache/repositories.yaml --repository-cache /tmp/renovate/cache/__renovate-private-cache/repositories the_repo1_url && helm repo add repo-test --registry-config /tmp/renovate/cache/__renovate-private-cache/registry.json --repository-config /tmp/renovate/cache/__renovate-private-cache/repositories.yaml --repository-cache /tmp/renovate/cache/__renovate-private-cache/repositories https://gitlab.com/api/v4/projects/xxxxxxx/packages/helm/stable && helm dependency update --registry-config /tmp/renovate/cache/__renovate-private-cache/registry.json --repository-config /tmp/renovate/cache/__renovate-private-cache/repositories.yaml --repository-cache /tmp/renovate/cache/__renovate-private-cache/repositories ''"", + "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e HELM_EXPERIMENTAL_OCI -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" containerbase/sidecar bash -l -c "install-tool helm v3.7.2 && helm repo add stable --registry-config /tmp/renovate/cache/__renovate-private-cache/registry.json --repository-config /tmp/renovate/cache/__renovate-private-cache/repositories.yaml --repository-cache /tmp/renovate/cache/__renovate-private-cache/repositories the_stable_url && helm repo add repo1 --registry-config /tmp/renovate/cache/__renovate-private-cache/registry.json --repository-config /tmp/renovate/cache/__renovate-private-cache/repositories.yaml --repository-cache /tmp/renovate/cache/__renovate-private-cache/repositories the_repo1_url && helm repo add repo-test --registry-config /tmp/renovate/cache/__renovate-private-cache/registry.json --repository-config /tmp/renovate/cache/__renovate-private-cache/repositories.yaml --repository-cache /tmp/renovate/cache/__renovate-private-cache/repositories https://gitlab.com/api/v4/projects/xxxxxxx/packages/helm/stable && helm dependency update --registry-config /tmp/renovate/cache/__renovate-private-cache/registry.json --repository-config /tmp/renovate/cache/__renovate-private-cache/repositories.yaml --repository-cache /tmp/renovate/cache/__renovate-private-cache/repositories ''"", "options": { "cwd": "/tmp/github/some/repo", "encoding": "utf-8", diff --git a/lib/modules/manager/index.ts b/lib/modules/manager/index.ts index 4d7500b8836129..26befb170ef57b 100644 --- a/lib/modules/manager/index.ts +++ b/lib/modules/manager/index.ts @@ -87,6 +87,9 @@ export function getRangeStrategy(config: RangeConfig): RangeStrategy | null { return managerRangeStrategy; } if (rangeStrategy === 'auto') { + if (m.updateLockedDependency) { + return 'update-lockfile'; + } // default to 'replace' for auto return 'replace'; } diff --git a/lib/modules/manager/maven-wrapper/artifacts.spec.ts b/lib/modules/manager/maven-wrapper/artifacts.spec.ts index c90b68fc7018c8..01e55ce5b2f160 100644 --- a/lib/modules/manager/maven-wrapper/artifacts.spec.ts +++ b/lib/modules/manager/maven-wrapper/artifacts.spec.ts @@ -193,7 +193,7 @@ describe('modules/manager/maven-wrapper/artifacts', () => { ]); expect(execSnapshots).toMatchObject([ { - cmd: 'docker pull renovate/sidecar', + cmd: 'docker pull containerbase/sidecar', options: { encoding: 'utf-8' }, }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, @@ -204,7 +204,7 @@ describe('modules/manager/maven-wrapper/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "../.." ' + - 'renovate/sidecar' + + 'containerbase/sidecar' + ' bash -l -c "' + 'install-tool java 17.0.0 ' + '&& ' + diff --git a/lib/modules/manager/mint/index.ts b/lib/modules/manager/mint/index.ts index 34ac5845807e30..fffd5aadb1ddf5 100644 --- a/lib/modules/manager/mint/index.ts +++ b/lib/modules/manager/mint/index.ts @@ -8,5 +8,5 @@ export { extractPackageFile } from './extract'; export const supportedDatasources = [GitTagsDatasource.id]; export const defaultConfig = { - fileMatch: ['(^|\\/)Mintfile$'], + fileMatch: ['(^|/)Mintfile$'], }; diff --git a/lib/modules/manager/mix/__snapshots__/artifacts.spec.ts.snap b/lib/modules/manager/mix/__snapshots__/artifacts.spec.ts.snap index 8970d0fae224e5..8c77419ecea365 100644 --- a/lib/modules/manager/mix/__snapshots__/artifacts.spec.ts.snap +++ b/lib/modules/manager/mix/__snapshots__/artifacts.spec.ts.snap @@ -21,7 +21,7 @@ exports[`modules/manager/mix/artifacts authenticates to private repositories 2`] }, }, { - "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/cache":"/tmp/cache" -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" renovate/sidecar bash -l -c "install-tool erlang 24.3.4.2 && install-tool elixir v1.13.4 && mix hex.organization auth renovate_test --key valid_test_token && mix deps.update private_package other_package"", + "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/cache":"/tmp/cache" -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" containerbase/sidecar bash -l -c "install-tool erlang 24.3.4.2 && install-tool elixir v1.13.4 && mix hex.organization auth renovate_test --key valid_test_token && mix deps.update private_package other_package"", "options": { "cwd": "/tmp/github/some/repo", "encoding": "utf-8", @@ -69,7 +69,7 @@ exports[`modules/manager/mix/artifacts returns null if unchanged 1`] = ` exports[`modules/manager/mix/artifacts returns updated mix.lock 1`] = ` [ { - "cmd": "docker pull renovate/sidecar", + "cmd": "docker pull containerbase/sidecar", "options": { "encoding": "utf-8", }, @@ -81,7 +81,7 @@ exports[`modules/manager/mix/artifacts returns updated mix.lock 1`] = ` }, }, { - "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/cache":"/tmp/cache" -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" renovate/sidecar bash -l -c "install-tool erlang 24.3.4.2 && install-tool elixir 1.13.4 && mix deps.update plug"", + "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/cache":"/tmp/cache" -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" containerbase/sidecar bash -l -c "install-tool erlang 24.3.4.2 && install-tool elixir 1.13.4 && mix deps.update plug"", "options": { "cwd": "/tmp/github/some/repo", "encoding": "utf-8", diff --git a/lib/modules/manager/nix/artifacts.spec.ts b/lib/modules/manager/nix/artifacts.spec.ts index 474768a28a4c60..7b4808aed1bb70 100644 --- a/lib/modules/manager/nix/artifacts.spec.ts +++ b/lib/modules/manager/nix/artifacts.spec.ts @@ -137,7 +137,7 @@ describe('modules/manager/nix/artifacts', () => { }, ]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -147,7 +147,7 @@ describe('modules/manager/nix/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar ' + + 'containerbase/sidecar ' + 'bash -l -c "' + 'install-tool nix 2.10.0 ' + '&& ' + @@ -268,7 +268,7 @@ describe('modules/manager/nix/artifacts', () => { }, ]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -278,7 +278,7 @@ describe('modules/manager/nix/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar ' + + 'containerbase/sidecar ' + 'bash -l -c "' + 'install-tool nix 2.10.0 ' + '&& ' + diff --git a/lib/modules/manager/nix/index.ts b/lib/modules/manager/nix/index.ts index 58b43af4843689..7cdfa48cdeb1bd 100644 --- a/lib/modules/manager/nix/index.ts +++ b/lib/modules/manager/nix/index.ts @@ -6,7 +6,7 @@ export { updateArtifacts } from './artifacts'; export const supportsLockFileMaintenance = true; export const defaultConfig = { - fileMatch: ['(^|\\/)flake\\.nix$'], + fileMatch: ['(^|/)flake\\.nix$'], commitMessageTopic: 'nixpkgs', commitMessageExtra: 'to {{newValue}}', enabled: false, diff --git a/lib/modules/manager/npm/extract/index.spec.ts b/lib/modules/manager/npm/extract/index.spec.ts index e6672bd53f89ee..1932f6fd8525ab 100644 --- a/lib/modules/manager/npm/extract/index.spec.ts +++ b/lib/modules/manager/npm/extract/index.spec.ts @@ -1,6 +1,6 @@ import { Fixtures } from '../../../../../test/fixtures'; import { fs } from '../../../../../test/util'; -import { getConfig } from '../../../../config/defaults'; +import type { ExtractConfig } from '../../types'; import * as npmExtract from '.'; jest.mock('../../../../util/fs'); @@ -8,8 +8,9 @@ const realFs = jest.requireActual( '../../../../util/fs' ); -// TODO: fix types -const defaultConfig = getConfig(); +const defaultExtractConfig = { + skipInstalls: null, +} satisfies ExtractConfig; const input01Content = Fixtures.get('inputs/01.json', '..'); const input02Content = Fixtures.get('inputs/02.json', '..'); @@ -35,7 +36,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( 'not json', 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toBeNull(); }); @@ -44,7 +45,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( invalidNameContent, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchSnapshot({ deps: [{ skipReason: 'invalid-name' }], @@ -55,7 +56,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( vendorisedContent, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toBeNull(); }); @@ -65,7 +66,7 @@ describe('modules/manager/npm/extract/index', () => { npmExtract.extractPackageFile( '{ "renovate": {} }', 'backend/package.json', - defaultConfig + defaultExtractConfig ) ).rejects.toThrow(); }); @@ -74,7 +75,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( '{ "renovate": {} }', 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toBeNull(); }); @@ -83,7 +84,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( '{"dependencies": true, "devDependencies": []}', 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toBeNull(); }); @@ -92,7 +93,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( input01Content, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchSnapshot({ deps: [ @@ -119,7 +120,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( input01GlobContent, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res?.deps).toHaveLength(13); expect(res).toMatchSnapshot({ @@ -154,7 +155,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( input01Content, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchSnapshot({ managerData: { @@ -183,7 +184,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( input01Content, 'package.json', - { ...defaultConfig, npmrc: 'config-npmrc' } + { ...defaultExtractConfig, npmrc: 'config-npmrc' } ); expect(res?.npmrc).toBe('config-npmrc'); }); @@ -281,7 +282,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( input01Content, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchSnapshot({ managerData: { @@ -302,7 +303,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( input01Content, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchSnapshot({ managerData: { @@ -323,7 +324,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( input01Content, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchSnapshot({ managerData: { @@ -344,7 +345,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( workspacesSimpleContent, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchSnapshot({ managerData: { workspacesPackages: ['packages/*'] }, @@ -361,7 +362,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( workspacesSimpleContent, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchSnapshot({ managerData: { workspacesPackages: ['packages/*'] }, @@ -378,7 +379,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( workspacesContent, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchSnapshot({ managerData: { workspacesPackages: ['packages/*'] }, @@ -411,7 +412,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( pJsonStr, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchSnapshot({ extractedConstraints: { @@ -494,7 +495,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( pJsonStr, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchSnapshot({ deps: [ @@ -525,7 +526,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( pJsonStr, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchSnapshot({ deps: [ @@ -568,7 +569,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( pJsonStr, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchObject({ @@ -622,7 +623,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( pJsonStr, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchSnapshot({ deps: [ @@ -735,7 +736,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( pJsonStr, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchSnapshot({ deps: [ @@ -760,7 +761,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( input01Content, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchSnapshot(); }); @@ -773,7 +774,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( pJsonStr, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchSnapshot({ extractedConstraints: { yarn: '3.0.0' }, @@ -815,7 +816,7 @@ describe('modules/manager/npm/extract/index', () => { const res = await npmExtract.extractPackageFile( content, 'package.json', - defaultConfig + defaultExtractConfig ); expect(res).toMatchObject({ deps: [ diff --git a/lib/modules/manager/npm/post-update/__snapshots__/yarn.spec.ts.snap b/lib/modules/manager/npm/post-update/__snapshots__/yarn.spec.ts.snap index 0c307b7c7eccbf..ec217838dca065 100644 --- a/lib/modules/manager/npm/post-update/__snapshots__/yarn.spec.ts.snap +++ b/lib/modules/manager/npm/post-update/__snapshots__/yarn.spec.ts.snap @@ -884,7 +884,7 @@ exports[`modules/manager/npm/post-update/yarn performs lock file updates using y }, }, { - "cmd": "yarn up some-dep@^1.0.0", + "cmd": "yarn up 'some-dep@^1.0.0'", "options": { "cwd": "some-dir", "encoding": "utf-8", @@ -934,7 +934,7 @@ exports[`modules/manager/npm/post-update/yarn performs lock file updates using y }, }, { - "cmd": "yarn up some-dep@^1.0.0 --mode=update-lockfile", + "cmd": "yarn up 'some-dep@^1.0.0' --mode=update-lockfile", "options": { "cwd": "some-dir", "encoding": "utf-8", diff --git a/lib/modules/manager/npm/post-update/lerna.spec.ts b/lib/modules/manager/npm/post-update/lerna.spec.ts index 40a219bd9bbde7..b6ae8f2fe77b29 100644 --- a/lib/modules/manager/npm/post-update/lerna.spec.ts +++ b/lib/modules/manager/npm/post-update/lerna.spec.ts @@ -27,7 +27,7 @@ function lernaPkgFileWithoutLernaDep( }; } -const config = partial({}); +const config = partial(); describe('modules/manager/npm/post-update/lerna', () => { const globalConfig: RepoGlobalConfig = { @@ -144,7 +144,7 @@ describe('modules/manager/npm/post-update/lerna', () => { ); expect(execSnapshots).toMatchObject([ { - cmd: 'docker pull renovate/sidecar', + cmd: 'docker pull containerbase/sidecar', }, { cmd: 'docker ps --filter name=renovate_sidecar -aq', @@ -155,7 +155,7 @@ describe('modules/manager/npm/post-update/lerna', () => { '-v "/tmp/cache":"/tmp/cache" ' + '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + - '-w "some-dir" renovate/sidecar ' + + '-w "some-dir" containerbase/sidecar ' + 'bash -l -c "' + 'install-tool node 16.16.0 ' + '&& ' + diff --git a/lib/modules/manager/npm/post-update/lerna.ts b/lib/modules/manager/npm/post-update/lerna.ts index 72db5a57ad7aa0..da3614f85f6123 100644 --- a/lib/modules/manager/npm/post-update/lerna.ts +++ b/lib/modules/manager/npm/post-update/lerna.ts @@ -40,7 +40,7 @@ export async function generateLockFiles( lockFileDir: string, config: PostUpdateConfig, env: NodeJS.ProcessEnv, - skipInstalls?: boolean + skipInstalls?: boolean | null ): Promise { const lernaClient = lernaPackageFile.managerData?.lernaClient; if (!is.nonEmptyString(lernaClient)) { diff --git a/lib/modules/manager/npm/post-update/npm.spec.ts b/lib/modules/manager/npm/post-update/npm.spec.ts index 73703f8ef0f92b..3ecda1373e87a0 100644 --- a/lib/modules/manager/npm/post-update/npm.spec.ts +++ b/lib/modules/manager/npm/post-update/npm.spec.ts @@ -258,7 +258,7 @@ describe('modules/manager/npm/post-update/npm', () => { expect(fs.readLocalFile).toHaveBeenCalledTimes(1); expect(res.lockFile).toBe('package-lock-contents'); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -267,7 +267,7 @@ describe('modules/manager/npm/post-update/npm', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "some-dir" ' + - 'renovate/sidecar ' + + 'containerbase/sidecar ' + 'bash -l -c "' + 'install-tool node 16.16.0 ' + '&& ' + diff --git a/lib/modules/manager/npm/post-update/pnpm.spec.ts b/lib/modules/manager/npm/post-update/pnpm.spec.ts index 8f5091329b7dfe..5089b185d1660f 100644 --- a/lib/modules/manager/npm/post-update/pnpm.spec.ts +++ b/lib/modules/manager/npm/post-update/pnpm.spec.ts @@ -108,7 +108,7 @@ describe('modules/manager/npm/post-update/pnpm', () => { it('uses constraint version if parent json has constraints', async () => { const execSnapshots = mockExecAll(); - const configTemp = partial({}); + const configTemp = partial(); const fileContent = Fixtures.get('parent/package.json'); fs.readLocalFile .mockResolvedValueOnce(fileContent) @@ -150,7 +150,7 @@ describe('modules/manager/npm/post-update/pnpm', () => { it('uses packageManager version and puts it into constraint', async () => { const execSnapshots = mockExecAll(); - const configTemp = partial({}); + const configTemp = partial(); const fileContent = Fixtures.get('manager-field/package.json'); fs.readLocalFile .mockResolvedValueOnce(fileContent) @@ -192,7 +192,7 @@ describe('modules/manager/npm/post-update/pnpm', () => { it('uses skips pnpm v7 if lockfileVersion indicates <7', async () => { mockExecAll(); - const configTemp = partial({}); + const configTemp = partial(); fs.readLocalFile .mockResolvedValueOnce('{}') // package.json .mockResolvedValue('lockfileVersion: 5.3\n'); // pnpm-lock.yaml @@ -223,7 +223,7 @@ describe('modules/manager/npm/post-update/pnpm', () => { expect(fs.readLocalFile).toHaveBeenCalledTimes(1); expect(res.lockFile).toBe('package-lock-contents'); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -232,7 +232,7 @@ describe('modules/manager/npm/post-update/pnpm', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "some-dir" ' + - 'renovate/sidecar ' + + 'containerbase/sidecar ' + 'bash -l -c "' + 'install-tool node 16.16.0 ' + '&& install-tool pnpm 6.0.0 ' + diff --git a/lib/modules/manager/npm/post-update/yarn.spec.ts b/lib/modules/manager/npm/post-update/yarn.spec.ts index 43c775685d250b..3a525661942559 100644 --- a/lib/modules/manager/npm/post-update/yarn.spec.ts +++ b/lib/modules/manager/npm/post-update/yarn.spec.ts @@ -555,10 +555,10 @@ describe('modules/manager/npm/post-update/yarn', () => { expect(res.lockFile).toBe(plocktest1YarnLockV1); const options = { encoding: 'utf-8' }; expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar', options }, + { cmd: 'docker pull containerbase/sidecar', options }, { cmd: - `docker run --rm --name=renovate_sidecar --label=renovate_child -v ".":"." -v "/tmp/cache":"/tmp/cache" -e CI -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "some-dir" renovate/sidecar ` + + `docker run --rm --name=renovate_sidecar --label=renovate_child -v ".":"." -v "/tmp/cache":"/tmp/cache" -e CI -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "some-dir" containerbase/sidecar ` + `bash -l -c "` + `install-tool node 16.16.0` + ` && ` + diff --git a/lib/modules/manager/npm/post-update/yarn.ts b/lib/modules/manager/npm/post-update/yarn.ts index a05dd4b7bb8f33..eb11a5f281606a 100644 --- a/lib/modules/manager/npm/post-update/yarn.ts +++ b/lib/modules/manager/npm/post-update/yarn.ts @@ -199,8 +199,7 @@ export async function generateLockFile( if (yarnUpdate && !isYarn1) { logger.debug('Updating Yarn binary'); // TODO: types (#7154) - // eslint-disable-next-line @typescript-eslint/restrict-template-expressions - commands.push(`yarn set version ${yarnUpdate.newValue}`); + commands.push(`yarn set version ${quote(yarnUpdate.newValue!)}`); } // This command updates the lock file based on package.json @@ -218,6 +217,7 @@ export async function generateLockFile( .map((update) => update.depName) .filter(is.string) .filter(uniqueStrings) + .map(quote) .join(' ')}${cmdOptions}` ); } else { @@ -225,9 +225,9 @@ export async function generateLockFile( commands.push( `yarn up ${lockUpdates // TODO: types (#7154) - // eslint-disable-next-line @typescript-eslint/restrict-template-expressions - .map((update) => `${update.depName}@${update.newValue}`) + .map((update) => `${update.depName!}@${update.newValue!}`) .filter(uniqueStrings) + .map(quote) .join(' ')}${cmdOptions}` ); } diff --git a/lib/modules/manager/npm/range.spec.ts b/lib/modules/manager/npm/range.spec.ts index 997567a68da128..4898d3f18c5197 100644 --- a/lib/modules/manager/npm/range.spec.ts +++ b/lib/modules/manager/npm/range.spec.ts @@ -7,22 +7,6 @@ describe('modules/manager/npm/range', () => { expect(getRangeStrategy(config)).toBe('widen'); }); - it('replaces devDependencies', () => { - const config: RangeConfig = { - rangeStrategy: 'auto', - depType: 'devDependencies', - }; - expect(getRangeStrategy(config)).toBe('replace'); - }); - - it('replaces app dependencies', () => { - const config: RangeConfig = { - rangeStrategy: 'auto', - depType: 'dependencies', - }; - expect(getRangeStrategy(config)).toBe('replace'); - }); - it('widens peerDependencies', () => { const config: RangeConfig = { rangeStrategy: 'auto', @@ -49,11 +33,11 @@ describe('modules/manager/npm/range', () => { expect(getRangeStrategy(config)).toBe('widen'); }); - it('defaults to replace', () => { + it('defaults to update-lockfile', () => { const config: RangeConfig = { rangeStrategy: 'auto', depType: 'dependencies', }; - expect(getRangeStrategy(config)).toBe('replace'); + expect(getRangeStrategy(config)).toBe('update-lockfile'); }); }); diff --git a/lib/modules/manager/npm/range.ts b/lib/modules/manager/npm/range.ts index ed56cb10705d7a..91d8ceca3be5ac 100644 --- a/lib/modules/manager/npm/range.ts +++ b/lib/modules/manager/npm/range.ts @@ -25,5 +25,5 @@ export function getRangeStrategy(config: RangeConfig): RangeStrategy { if (isComplexRange) { return 'widen'; } - return 'replace'; + return 'update-lockfile'; } diff --git a/lib/modules/manager/npm/update/locked-dependency/common/parent-version.ts b/lib/modules/manager/npm/update/locked-dependency/common/parent-version.ts index 3aab1c2583470e..5c0a95316fce20 100644 --- a/lib/modules/manager/npm/update/locked-dependency/common/parent-version.ts +++ b/lib/modules/manager/npm/update/locked-dependency/common/parent-version.ts @@ -8,15 +8,17 @@ import { api as semver } from '../../../../../versioning/npm'; const pkgCache = new Map>(); -function getPkgReleasesCached(depName: string): Promise { - let cachedResult = pkgCache.get(depName); +function getPkgReleasesCached( + packageName: string +): Promise { + let cachedResult = pkgCache.get(packageName); if (!cachedResult) { const lookupConfig: GetPkgReleasesConfig = { datasource: 'npm', - depName, + packageName, }; cachedResult = getPkgReleases(lookupConfig); - pkgCache.set(depName, cachedResult); + pkgCache.set(packageName, cachedResult); } return cachedResult; } diff --git a/lib/modules/manager/nuget/artifacts.spec.ts b/lib/modules/manager/nuget/artifacts.spec.ts index aa22079b096e2c..b6ae31d6cc5749 100644 --- a/lib/modules/manager/nuget/artifacts.spec.ts +++ b/lib/modules/manager/nuget/artifacts.spec.ts @@ -6,6 +6,7 @@ import type { RepoGlobalConfig } from '../../../config/types'; import * as docker from '../../../util/exec/docker'; import * as _hostRules from '../../../util/host-rules'; import type { UpdateArtifactsConfig } from '../types'; +import type { Registry } from './types'; import * as util from './util'; import * as nuget from '.'; @@ -248,7 +249,7 @@ describe('modules/manager/nuget/artifacts', () => { ]); expect(execSnapshots).toMatchObject([ { - cmd: 'docker pull renovate/sidecar', + cmd: 'docker pull containerbase/sidecar', }, { cmd: 'docker ps --filter name=renovate_sidecar -aq', @@ -263,7 +264,7 @@ describe('modules/manager/nuget/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar ' + + 'containerbase/sidecar ' + 'bash -l -c "' + 'install-tool dotnet 7.0.100' + ' && ' + @@ -420,16 +421,23 @@ describe('modules/manager/nuget/artifacts', () => { name: 'myRegistry', url: 'https://my-registry.example.org', }, - ] as never); - hostRules.find.mockImplementationOnce((search) => { - if ( - search.hostType === 'nuget' && - search.url === 'https://my-registry.example.org' - ) { - return { - username: 'some-username', - password: 'some-password', - }; + { + name: 'myRegistry2', + url: 'https://my-registry2.example.org', + }, + ] satisfies Registry[]); + hostRules.find.mockImplementation((search) => { + if (search.hostType === 'nuget') { + if (search.url === 'https://my-registry.example.org') { + return { + username: 'some-username', + password: 'some-password', + }; + } else { + return { + password: 'some-password', + }; + } } return {}; }); @@ -455,6 +463,11 @@ describe('modules/manager/nuget/artifacts', () => { 'dotnet nuget add source https://my-registry.example.org/ --configfile /tmp/renovate/cache/__renovate-private-cache/nuget/nuget.config ' + '--name myRegistry --username some-username --password some-password --store-password-in-clear-text', }, + { + cmd: + 'dotnet nuget add source https://my-registry2.example.org/ --configfile /tmp/renovate/cache/__renovate-private-cache/nuget/nuget.config ' + + '--name myRegistry2 --password some-password --store-password-in-clear-text', + }, { cmd: 'dotnet restore project.csproj --force-evaluate --configfile /tmp/renovate/cache/__renovate-private-cache/nuget/nuget.config', }, diff --git a/lib/modules/manager/nuget/artifacts.ts b/lib/modules/manager/nuget/artifacts.ts index 2d2f4e1a6af3bf..4b84ca0406edac 100644 --- a/lib/modules/manager/nuget/artifacts.ts +++ b/lib/modules/manager/nuget/artifacts.ts @@ -38,7 +38,7 @@ async function addSourceCmds( (await getConfiguredRegistries(packageFileName)) ?? getDefaultRegistries(); const result: string[] = []; for (const registry of registries) { - const { username, password } = hostRules.find({ + const { password, username } = hostRules.find({ hostType: NugetDatasource.id, url: registry.url, }); @@ -50,9 +50,14 @@ async function addSourceCmds( // Add name for registry, if known. addSourceCmd += ` --name ${quote(registry.name)}`; } - if (username && password) { - // Add registry credentials from host rules, if configured. - addSourceCmd += ` --username ${quote(username)} --password ${quote( + // Add registry credentials from host rules, if configured. + if (username) { + // Add username from host rules, if configured. + addSourceCmd += ` --username ${quote(username)}`; + } + if (password) { + // Add password from host rules, if configured. + addSourceCmd += ` --password ${quote( password )} --store-password-in-clear-text`; } diff --git a/lib/modules/manager/nuget/index.ts b/lib/modules/manager/nuget/index.ts index 8f2a3253eb924f..c34ca3a67d8e78 100644 --- a/lib/modules/manager/nuget/index.ts +++ b/lib/modules/manager/nuget/index.ts @@ -12,8 +12,8 @@ export const defaultConfig = { fileMatch: [ '\\.(?:cs|fs|vb)proj$', '\\.(?:props|targets)$', - '(^|\\/)dotnet-tools\\.json$', - '(^|\\/)global\\.json$', + '(^|/)dotnet-tools\\.json$', + '(^|/)global\\.json$', ], }; diff --git a/lib/modules/manager/pip-compile/artifacts.spec.ts b/lib/modules/manager/pip-compile/artifacts.spec.ts index c55714dda42a41..94c8463f29e48d 100644 --- a/lib/modules/manager/pip-compile/artifacts.spec.ts +++ b/lib/modules/manager/pip-compile/artifacts.spec.ts @@ -114,7 +114,7 @@ describe('modules/manager/pip-compile/artifacts', () => { ).not.toBeNull(); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -125,7 +125,7 @@ describe('modules/manager/pip-compile/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar ' + + 'containerbase/sidecar ' + 'bash -l -c "' + 'install-tool python 3.10.2 ' + '&& ' + @@ -231,7 +231,7 @@ describe('modules/manager/pip-compile/artifacts', () => { ).not.toBeNull(); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -242,7 +242,7 @@ describe('modules/manager/pip-compile/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar ' + + 'containerbase/sidecar ' + 'bash -l -c "' + 'install-tool python 3.10.2 ' + '&& ' + diff --git a/lib/modules/manager/pip_requirements/artifacts.spec.ts b/lib/modules/manager/pip_requirements/artifacts.spec.ts index 1031300d02734d..69e2152cea29b2 100644 --- a/lib/modules/manager/pip_requirements/artifacts.spec.ts +++ b/lib/modules/manager/pip_requirements/artifacts.spec.ts @@ -207,7 +207,7 @@ describe('modules/manager/pip_requirements/artifacts', () => { ]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -218,7 +218,7 @@ describe('modules/manager/pip_requirements/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar ' + + 'containerbase/sidecar ' + 'bash -l -c "' + 'install-tool python 3.10.2 ' + '&& ' + diff --git a/lib/modules/manager/pipenv/__snapshots__/artifacts.spec.ts.snap b/lib/modules/manager/pipenv/__snapshots__/artifacts.spec.ts.snap index 231d1d43302a11..81581b65c5806e 100644 --- a/lib/modules/manager/pipenv/__snapshots__/artifacts.spec.ts.snap +++ b/lib/modules/manager/pipenv/__snapshots__/artifacts.spec.ts.snap @@ -99,7 +99,7 @@ exports[`modules/manager/pipenv/artifacts returns updated Pipfile.lock 1`] = ` exports[`modules/manager/pipenv/artifacts supports docker mode 1`] = ` [ { - "cmd": "docker pull renovate/sidecar", + "cmd": "docker pull containerbase/sidecar", "options": { "encoding": "utf-8", }, @@ -111,7 +111,7 @@ exports[`modules/manager/pipenv/artifacts supports docker mode 1`] = ` }, }, { - "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e PIPENV_CACHE_DIR -e PIP_CACHE_DIR -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" renovate/sidecar bash -l -c "install-tool python 3.7.6 && pip install --user pipenv && pipenv lock"", + "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e PIPENV_CACHE_DIR -e PIP_CACHE_DIR -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" containerbase/sidecar bash -l -c "install-tool python 3.7.6 && pip install --user pipenv && pipenv lock"", "options": { "cwd": "/tmp/github/some/repo", "encoding": "utf-8", @@ -138,7 +138,7 @@ exports[`modules/manager/pipenv/artifacts supports docker mode 1`] = ` exports[`modules/manager/pipenv/artifacts uses pipenv version from Pipfile 1`] = ` [ { - "cmd": "docker pull renovate/sidecar", + "cmd": "docker pull containerbase/sidecar", "options": { "encoding": "utf-8", }, @@ -150,7 +150,7 @@ exports[`modules/manager/pipenv/artifacts uses pipenv version from Pipfile 1`] = }, }, { - "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e PIPENV_CACHE_DIR -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" renovate/sidecar bash -l -c "install-tool python 3.10.2 && pip install --user pipenv==2020.8.13 && pipenv lock"", + "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e PIPENV_CACHE_DIR -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" containerbase/sidecar bash -l -c "install-tool python 3.10.2 && pip install --user pipenv==2020.8.13 && pipenv lock"", "options": { "cwd": "/tmp/github/some/repo", "encoding": "utf-8", @@ -176,7 +176,7 @@ exports[`modules/manager/pipenv/artifacts uses pipenv version from Pipfile 1`] = exports[`modules/manager/pipenv/artifacts uses pipenv version from Pipfile dev packages 1`] = ` [ { - "cmd": "docker pull renovate/sidecar", + "cmd": "docker pull containerbase/sidecar", "options": { "encoding": "utf-8", }, @@ -188,7 +188,7 @@ exports[`modules/manager/pipenv/artifacts uses pipenv version from Pipfile dev p }, }, { - "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e PIPENV_CACHE_DIR -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" renovate/sidecar bash -l -c "install-tool python 3.10.2 && pip install --user pipenv==2020.8.13 && pipenv lock"", + "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e PIPENV_CACHE_DIR -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" containerbase/sidecar bash -l -c "install-tool python 3.10.2 && pip install --user pipenv==2020.8.13 && pipenv lock"", "options": { "cwd": "/tmp/github/some/repo", "encoding": "utf-8", @@ -214,7 +214,7 @@ exports[`modules/manager/pipenv/artifacts uses pipenv version from Pipfile dev p exports[`modules/manager/pipenv/artifacts uses pipenv version from config 1`] = ` [ { - "cmd": "docker pull renovate/sidecar", + "cmd": "docker pull containerbase/sidecar", "options": { "encoding": "utf-8", }, @@ -226,7 +226,7 @@ exports[`modules/manager/pipenv/artifacts uses pipenv version from config 1`] = }, }, { - "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e PIPENV_CACHE_DIR -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" renovate/sidecar bash -l -c "install-tool python 3.10.2 && pip install --user pipenv==2020.1.1 && pipenv lock"", + "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v "/tmp/github/some/repo":"/tmp/github/some/repo" -v "/tmp/renovate/cache":"/tmp/renovate/cache" -e PIPENV_CACHE_DIR -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "/tmp/github/some/repo" containerbase/sidecar bash -l -c "install-tool python 3.10.2 && pip install --user pipenv==2020.1.1 && pipenv lock"", "options": { "cwd": "/tmp/github/some/repo", "encoding": "utf-8", diff --git a/lib/modules/manager/pipenv/artifacts.ts b/lib/modules/manager/pipenv/artifacts.ts index 0e7e6909da100c..e6959984718669 100644 --- a/lib/modules/manager/pipenv/artifacts.ts +++ b/lib/modules/manager/pipenv/artifacts.ts @@ -15,11 +15,12 @@ import type { UpdateArtifactsConfig, UpdateArtifactsResult, } from '../types'; +import { PipfileLockSchema } from './schema'; function getPythonConstraint( existingLockFileContent: string, config: UpdateArtifactsConfig -): string | undefined | null { +): string | undefined { const { constraints = {} } = config; const { python } = constraints; @@ -28,14 +29,20 @@ function getPythonConstraint( return python; } try { - const pipfileLock = JSON.parse(existingLockFileContent); - if (pipfileLock?._meta?.requires?.python_version) { - const pythonVersion: string = pipfileLock._meta.requires.python_version; + const result = PipfileLockSchema.safeParse( + JSON.parse(existingLockFileContent) + ); + // istanbul ignore if: not easily testable + if (!result.success) { + logger.warn({ error: result.error }, 'Invalid Pipfile.lock'); + return undefined; + } + if (result.data._meta?.requires?.python_version) { + const pythonVersion = result.data._meta.requires.python_version; return `== ${pythonVersion}.*`; } - if (pipfileLock?._meta?.requires?.python_full_version) { - const pythonFullVersion: string = - pipfileLock._meta.requires.python_full_version; + if (result.data._meta?.requires?.python_full_version) { + const pythonFullVersion = result.data._meta.requires.python_full_version; return `== ${pythonFullVersion}`; } } catch (err) { @@ -56,14 +63,19 @@ function getPipenvConstraint( return pipenv; } try { - const pipfileLock = JSON.parse(existingLockFileContent); - if (pipfileLock?.default?.pipenv?.version) { - const pipenvVersion: string = pipfileLock.default.pipenv.version; - return pipenvVersion; + const result = PipfileLockSchema.safeParse( + JSON.parse(existingLockFileContent) + ); + // istanbul ignore if: not easily testable + if (!result.success) { + logger.warn({ error: result.error }, 'Invalid Pipfile.lock'); + return ''; + } + if (result.data.default?.pipenv?.version) { + return result.data.default.pipenv.version; } - if (pipfileLock?.develop?.pipenv?.version) { - const pipenvVersion: string = pipfileLock.develop.pipenv.version; - return pipenvVersion; + if (result.data.develop?.pipenv?.version) { + return result.data.develop.pipenv.version; } } catch (err) { // Do nothing diff --git a/lib/modules/manager/pipenv/schema.ts b/lib/modules/manager/pipenv/schema.ts new file mode 100644 index 00000000000000..a57cac2148fdce --- /dev/null +++ b/lib/modules/manager/pipenv/schema.ts @@ -0,0 +1,24 @@ +import { z } from 'zod'; + +const PipfileLockEntrySchema = z + .record( + z.string(), + z.object({ + version: z.string().optional(), + }) + ) + .optional(); +export const PipfileLockSchema = z.object({ + _meta: z + .object({ + requires: z + .object({ + python_version: z.string().optional(), + python_full_version: z.string().optional(), + }) + .optional(), + }) + .optional(), + default: PipfileLockEntrySchema, + develop: PipfileLockEntrySchema, +}); diff --git a/lib/modules/manager/poetry/artifacts.spec.ts b/lib/modules/manager/poetry/artifacts.spec.ts index 7ca281a043d5cc..733d5ad9870bdc 100644 --- a/lib/modules/manager/poetry/artifacts.spec.ts +++ b/lib/modules/manager/poetry/artifacts.spec.ts @@ -267,7 +267,7 @@ describe('modules/manager/poetry/artifacts', () => { }, ]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -278,7 +278,7 @@ describe('modules/manager/poetry/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar ' + + 'containerbase/sidecar ' + 'bash -l -c "' + 'install-tool python 3.4.2 ' + '&& ' + @@ -330,7 +330,7 @@ describe('modules/manager/poetry/artifacts', () => { }, ]); expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/sidecar' }, + { cmd: 'docker pull containerbase/sidecar' }, { cmd: 'docker ps --filter name=renovate_sidecar -aq' }, { cmd: @@ -341,7 +341,7 @@ describe('modules/manager/poetry/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar ' + + 'containerbase/sidecar ' + 'bash -l -c "' + 'install-tool python 2.7.5 ' + '&& ' + diff --git a/lib/modules/manager/pre-commit/extract.ts b/lib/modules/manager/pre-commit/extract.ts index f7450cf713e9a8..7c9fba7561835f 100644 --- a/lib/modules/manager/pre-commit/extract.ts +++ b/lib/modules/manager/pre-commit/extract.ts @@ -83,7 +83,7 @@ function extractDependency( const urlMatchers = [ // This splits "http://my.github.com/user/repo" -> "my.github.com" "user/repo - regEx('^https?:\\/\\/(?[^\\/]+)\\/(?\\S*)'), + regEx('^https?://(?[^/]+)/(?\\S*)'), // This splits "git@private.registry.com:user/repo" -> "private.registry.com" "user/repo regEx('^git@(?[^:]+):(?\\S*)'), // This split "git://github.com/pre-commit/pre-commit-hooks" -> "github.com" "pre-commit/pre-commit-hooks" diff --git a/lib/modules/manager/pub/artifacts.spec.ts b/lib/modules/manager/pub/artifacts.spec.ts index 857f67cd3d850d..af46405b091b6e 100644 --- a/lib/modules/manager/pub/artifacts.spec.ts +++ b/lib/modules/manager/pub/artifacts.spec.ts @@ -162,7 +162,7 @@ describe('modules/manager/pub/artifacts', () => { ]); expect(execSnapshots).toMatchObject([ { - cmd: 'docker pull renovate/sidecar', + cmd: 'docker pull containerbase/sidecar', }, { cmd: 'docker ps --filter name=renovate_sidecar -aq', @@ -175,7 +175,7 @@ describe('modules/manager/pub/artifacts', () => { '-e BUILDPACK_CACHE_DIR ' + '-e CONTAINERBASE_CACHE_DIR ' + '-w "/tmp/github/some/repo" ' + - 'renovate/sidecar ' + + 'containerbase/sidecar ' + 'bash -l -c "' + `install-tool ${params.sdk} 3.3.9` + ' && ' + diff --git a/lib/modules/manager/puppet/index.ts b/lib/modules/manager/puppet/index.ts index 8743d2d408cfde..2b0735bb4c4c93 100644 --- a/lib/modules/manager/puppet/index.ts +++ b/lib/modules/manager/puppet/index.ts @@ -8,7 +8,7 @@ export { extractPackageFile } from './extract'; export const language: ProgrammingLanguage = 'ruby'; export const defaultConfig = { - fileMatch: ['(^|\\/)Puppetfile$'], + fileMatch: ['(^|/)Puppetfile$'], }; export const supportedDatasources = [ diff --git a/lib/modules/manager/range.spec.ts b/lib/modules/manager/range.spec.ts index 0cfbbe5a5176c7..7f1c3b2b58079e 100644 --- a/lib/modules/manager/range.spec.ts +++ b/lib/modules/manager/range.spec.ts @@ -16,12 +16,20 @@ describe('modules/manager/range', () => { rangeStrategy: 'auto', depType: 'dependencies', }; - expect(getRangeStrategy(config)).toBe('replace'); + expect(getRangeStrategy(config)).toBe('update-lockfile'); + }); + + it('defaults to update-lockfile if updateLockedDependency() is supported', () => { + const config: RangeConfig = { + manager: 'bundler', + rangeStrategy: 'auto', + }; + expect(getRangeStrategy(config)).toBe('update-lockfile'); }); it('defaults to replace', () => { const config: RangeConfig = { - manager: 'circleci', + manager: 'sbt', rangeStrategy: 'auto', }; expect(getRangeStrategy(config)).toBe('replace'); diff --git a/lib/modules/manager/regex/readme.md b/lib/modules/manager/regex/readme.md index a4a0ab618557b4..e2a7efe66fe380 100644 --- a/lib/modules/manager/regex/readme.md +++ b/lib/modules/manager/regex/readme.md @@ -20,7 +20,7 @@ Before Renovate can look up a dependency and decide about updates, it needs this - The dependency's name - Which `datasource` to use: npm, Docker, GitHub tags, and so on. For how to format this references see [datasource overview](https://docs.renovatebot.com/modules/datasource/#supported-datasources) -- Which version scheme to use: defaults to `semver`, but you may set another value like `pep440`. Supported versioning schemes can be found in the [versioning overview](https://docs.renovatebot.com/modules/versioning/#supported-versioning) +- Which version scheme to use: defaults to `semver-coerced`, but you may set another value like `pep440`. Supported versioning schemes can be found in the [versioning overview](https://docs.renovatebot.com/modules/versioning/#supported-versioning) Configuration-wise, it works like this: @@ -29,7 +29,7 @@ Configuration-wise, it works like this: - You can optionally have a `packageName` capture group or a `packageNameTemplate` if it differs from `depName` - You must have either a `datasource` capture group or a `datasourceTemplate` config field - You can optionally have a `depType` capture group or a `depTypeTemplate` config field -- You can optionally have a `versioning` capture group or a `versioningTemplate` config field. If neither are present, `semver` will be used as the default +- You can optionally have a `versioning` capture group or a `versioningTemplate` config field. If neither are present, `semver-coerced` will be used as the default - You can optionally have an `extractVersion` capture group or an `extractVersionTemplate` config field - You can optionally have a `currentDigest` capture group. - You can optionally have a `registryUrl` capture group or a `registryUrlTemplate` config field @@ -119,7 +119,7 @@ You could configure Renovate to update the `Dockerfile` like this: } ``` -We could drop the `versioningTemplate` because Renovate defaults to `semver` versioning. +We could drop the `versioningTemplate` because Renovate defaults to `∆semver-coerced` versioning. But we included the `versioningTemplate` config option to show you why we call these fields _templates_: because they are compiled using Handlebars and so can be composed from values you collect in named capture groups. You should use triple brace `{{{ }}}` templates like `{{{versioning}}}` to be safe. @@ -180,8 +180,8 @@ For example: "fileMatch": [".*y[a]?ml$"], "matchStringsStrategy": "combination", "matchStrings": [ - "['\"]?(?/pipeline-fragments\\/fragment-version-check)['\"]?\\s*ref:\\s['\"]?(?[\\d-]*)['\"]?", - "['\"]?(?pipeline-solutions\\/gitlab\\/fragments\\/fragment-version-check)['\"]?\\s*ref:\\s['\"]?(?[\\d-]*)['\"]?" + "['\"]?(?/pipeline-fragments/fragment-version-check)['\"]?\\s*ref:\\s['\"]?(?[\\d-]*)['\"]?", + "['\"]?(?pipeline-solutions/gitlab/fragments/fragment-version-check)['\"]?\\s*ref:\\s['\"]?(?[\\d-]*)['\"]?" ], "depNameTemplate": "pipeline-solutions/gitlab/fragments/fragment-version-check", "autoReplaceStringTemplate": "'{{{depName}}}'\n ref: {{{newValue}}}", diff --git a/lib/modules/manager/sbt/extract.spec.ts b/lib/modules/manager/sbt/extract.spec.ts index c40d21fb74f01e..24bce088c6bd82 100644 --- a/lib/modules/manager/sbt/extract.spec.ts +++ b/lib/modules/manager/sbt/extract.spec.ts @@ -1,3 +1,4 @@ +import { codeBlock } from 'common-tags'; import { Fixtures } from '../../../../test/fixtures'; import { extractPackageFile as extract } from '.'; @@ -378,5 +379,63 @@ describe('modules/manager/sbt/extract', () => { packageFileVersion: undefined, }); }); + + it('extract sbt version', () => { + expect( + extract( + codeBlock` + sbt.version=1.6.0 + `, + 'project/build.properties' + ) + ).toMatchObject({ + deps: [ + { + datasource: 'github-releases', + packageName: 'sbt/sbt', + depName: 'sbt/sbt', + currentValue: '1.6.0', + replaceString: 'sbt.version=1.6.0', + versioning: 'semver', + extractVersion: '^v(?\\S+)', + }, + ], + }); + }); + + it('extract sbt version if the file contains other properties', () => { + expect( + extract( + codeBlock` + sbt.version=1.6.0 + another.conf=1.4.0 + `, + 'project/build.properties' + ) + ).toMatchObject({ + deps: [ + { + datasource: 'github-releases', + packageName: 'sbt/sbt', + depName: 'sbt/sbt', + currentValue: '1.6.0', + replaceString: 'sbt.version=1.6.0', + versioning: 'semver', + extractVersion: '^v(?\\S+)', + }, + ], + }); + }); + + it('ignores build.properties file if does not contain sbt version', () => { + expect( + extract( + codeBlock` + another.conf=1.4.0 + `, + 'project/build.properties' + ) + ).toBeNull(); + }); }); }); diff --git a/lib/modules/manager/sbt/extract.ts b/lib/modules/manager/sbt/extract.ts index 7ad6d298bb3b8a..db076c8f5b1e9f 100644 --- a/lib/modules/manager/sbt/extract.ts +++ b/lib/modules/manager/sbt/extract.ts @@ -2,6 +2,7 @@ import { lang, query as q } from 'good-enough-parser'; import { logger } from '../../../logger'; import { regEx } from '../../../util/regex'; import { parseUrl } from '../../../util/url'; +import { GithubReleasesDatasource } from '../../datasource/github-releases'; import { MavenDatasource } from '../../datasource/maven'; import { SbtPackageDatasource } from '../../datasource/sbt-package'; import { @@ -10,6 +11,7 @@ import { } from '../../datasource/sbt-plugin'; import { get } from '../../versioning'; import * as mavenVersioning from '../../versioning/maven'; +import * as semverVersioning from '../../versioning/semver'; import { REGISTRY_URLS } from '../gradle/parser/common'; import type { PackageDependency, PackageFileContent } from '../types'; import { normalizeScalaVersion } from './util'; @@ -36,6 +38,10 @@ interface Ctx { const scala = lang.createLang('scala'); +const sbtVersionRegex = regEx( + 'sbt\\.version *= *(?\\d+\\.\\d+\\.\\d+)' +); + const scalaVersionMatch = q .sym('scalaVersion') .op(':=') @@ -285,8 +291,34 @@ const query = q.tree({ export function extractPackageFile( content: string, - _packageFile: string + packageFile: string ): PackageFileContent | null { + if ( + packageFile === 'project/build.properties' || + packageFile.endsWith('/project/build.properties') + ) { + const regexResult = sbtVersionRegex.exec(content); + const sbtVersion = regexResult?.groups?.version; + const matchString = regexResult?.[0]; + if (sbtVersion) { + const sbtDependency: PackageDependency = { + datasource: GithubReleasesDatasource.id, + depName: 'sbt/sbt', + packageName: 'sbt/sbt', + versioning: semverVersioning.id, + currentValue: sbtVersion, + replaceString: matchString, + extractVersion: '^v(?\\S+)', + }; + + return { + deps: [sbtDependency], + }; + } else { + return null; + } + } + let parsedResult: Ctx | null = null; try { @@ -296,7 +328,7 @@ export function extractPackageFile( registryUrls: [REGISTRY_URLS.mavenCentral], }); } catch (err) /* istanbul ignore next */ { - logger.warn({ err }, 'Sbt parsing error'); + logger.warn({ err, packageFile }, 'Sbt parsing error'); } if (!parsedResult) { diff --git a/lib/modules/manager/sbt/index.ts b/lib/modules/manager/sbt/index.ts index 48e0fa094b3b47..111c1e52e5da6b 100644 --- a/lib/modules/manager/sbt/index.ts +++ b/lib/modules/manager/sbt/index.ts @@ -1,3 +1,4 @@ +import { GithubReleasesDatasource } from '../../datasource/github-releases'; import { MavenDatasource } from '../../datasource/maven'; import { SbtPackageDatasource } from '../../datasource/sbt-package'; import { SbtPluginDatasource } from '../../datasource/sbt-plugin'; @@ -10,9 +11,14 @@ export const supportedDatasources = [ MavenDatasource.id, SbtPackageDatasource.id, SbtPluginDatasource.id, + GithubReleasesDatasource.id, // For sbt itself ]; export const defaultConfig = { - fileMatch: ['\\.sbt$', 'project/[^/]*.scala$'], + fileMatch: [ + '\\.sbt$', + 'project/[^/]*\\.scala$', + 'project/build\\.properties$', + ], versioning: ivyVersioning.id, }; diff --git a/lib/modules/manager/setup-cfg/__fixtures__/setup-cfg-1.txt b/lib/modules/manager/setup-cfg/__fixtures__/setup-cfg-1.txt index 9eb2f867909aa2..1fb0cbd0328acd 100644 --- a/lib/modules/manager/setup-cfg/__fixtures__/setup-cfg-1.txt +++ b/lib/modules/manager/setup-cfg/__fixtures__/setup-cfg-1.txt @@ -17,6 +17,8 @@ install_requires = requests[security] ~=2.18 compact~=1.2.3;python>'3.10' +install_requires= + responses >=2.27.0 setup_requires = six ~=1.4 diff --git a/lib/modules/manager/setup-cfg/__snapshots__/extract.spec.ts.snap b/lib/modules/manager/setup-cfg/__snapshots__/extract.spec.ts.snap index 453adf55dcd223..bef317998567c0 100644 --- a/lib/modules/manager/setup-cfg/__snapshots__/extract.spec.ts.snap +++ b/lib/modules/manager/setup-cfg/__snapshots__/extract.spec.ts.snap @@ -83,6 +83,12 @@ exports[`modules/manager/setup-cfg/extract extractPackageFile() extracts depende "depName": "compact", "depType": "install", }, + { + "currentValue": ">=2.27.0", + "datasource": "pypi", + "depName": "responses", + "depType": "install", + }, { "currentValue": "~=1.4", "datasource": "pypi", diff --git a/lib/modules/manager/setup-cfg/extract.spec.ts b/lib/modules/manager/setup-cfg/extract.spec.ts index c369d075955985..efa02d5cc1fb70 100644 --- a/lib/modules/manager/setup-cfg/extract.spec.ts +++ b/lib/modules/manager/setup-cfg/extract.spec.ts @@ -24,6 +24,7 @@ describe('modules/manager/setup-cfg/extract', () => { { depName: 'nmspc.pkg', currentValue: '==1.0' }, { depName: 'requests', currentValue: '~=2.18' }, { depName: 'compact', currentValue: '~=1.2.3' }, + { depName: 'responses', currentValue: '>=2.27.0' }, { depName: 'six', currentValue: '~=1.4' }, { depName: 'tqdm', currentValue: '~=4.19' }, { depName: 'tenacity', currentValue: '~=6.0' }, diff --git a/lib/modules/manager/setup-cfg/extract.ts b/lib/modules/manager/setup-cfg/extract.ts index f006ef70ba6378..1b73ebb63c22da 100644 --- a/lib/modules/manager/setup-cfg/extract.ts +++ b/lib/modules/manager/setup-cfg/extract.ts @@ -11,7 +11,7 @@ function getSectionName(str: string): string { } function getSectionRecord(str: string): string { - const [, sectionRecord] = regEx(/^([^\s]+)\s+=/).exec(str) ?? []; + const [, sectionRecord] = regEx(/^([^\s]+)\s*=/).exec(str) ?? []; return sectionRecord; } diff --git a/lib/modules/manager/swift/extract.ts b/lib/modules/manager/swift/extract.ts index a969fd99f905b0..c142e44cd59869 100644 --- a/lib/modules/manager/swift/extract.ts +++ b/lib/modules/manager/swift/extract.ts @@ -119,6 +119,7 @@ function getMatch(str: string, state: string | null): MatchResult | null { } function getDepName(url: string | null): string | null { + // istanbul ignore if if (!url) { return null; } @@ -154,6 +155,10 @@ export function extractPackageFile(content: string): PackageFileContent | null { let currentValue: string | null = null; function yieldDep(): void { + // istanbul ignore if + if (!packageName) { + return; + } const depName = getDepName(packageName); if (depName && currentValue) { const dep: PackageDependency = { diff --git a/lib/modules/manager/swift/index.ts b/lib/modules/manager/swift/index.ts index c41cdba0bf620a..bbb83400ecc243 100644 --- a/lib/modules/manager/swift/index.ts +++ b/lib/modules/manager/swift/index.ts @@ -2,6 +2,7 @@ import { GitTagsDatasource } from '../../datasource/git-tags'; import * as swiftVersioning from '../../versioning/swift'; export { extractPackageFile } from './extract'; +export { getRangeStrategy } from './range'; export const displayName = 'Swift Package Manager'; export const url = 'https://www.swift.org/package-manager/'; @@ -11,6 +12,5 @@ export const supportedDatasources = [GitTagsDatasource.id]; export const defaultConfig = { fileMatch: ['(^|/)Package\\.swift'], versioning: swiftVersioning.id, - rangeStrategy: 'bump', pinDigests: false, }; diff --git a/lib/modules/manager/swift/range.spec.ts b/lib/modules/manager/swift/range.spec.ts new file mode 100644 index 00000000000000..4f20913fca3bc5 --- /dev/null +++ b/lib/modules/manager/swift/range.spec.ts @@ -0,0 +1,16 @@ +import type { RangeConfig } from '../types'; +import { getRangeStrategy } from '.'; + +describe('modules/manager/swift/range', () => { + describe('getRangeStrategy()', () => { + it('returns same if not auto', () => { + const config: RangeConfig = { rangeStrategy: 'widen' }; + expect(getRangeStrategy(config)).toBe('widen'); + }); + + it('defaults to update-lockfile', () => { + const config: RangeConfig = { rangeStrategy: 'auto' }; + expect(getRangeStrategy(config)).toBe('bump'); + }); + }); +}); diff --git a/lib/modules/manager/swift/range.ts b/lib/modules/manager/swift/range.ts new file mode 100644 index 00000000000000..8f3d6e7eb54595 --- /dev/null +++ b/lib/modules/manager/swift/range.ts @@ -0,0 +1,8 @@ +import type { RangeStrategy } from '../../../types'; +import type { RangeConfig } from '../types'; + +export function getRangeStrategy({ + rangeStrategy, +}: RangeConfig): RangeStrategy { + return rangeStrategy === 'auto' ? 'bump' : rangeStrategy; +} diff --git a/lib/modules/manager/terraform/extractors/others/modules.ts b/lib/modules/manager/terraform/extractors/others/modules.ts index 82835cd6745f08..3eba9cc81aa02c 100644 --- a/lib/modules/manager/terraform/extractors/others/modules.ts +++ b/lib/modules/manager/terraform/extractors/others/modules.ts @@ -1,7 +1,7 @@ import is from '@sindresorhus/is'; import { logger } from '../../../../../logger'; import { regEx } from '../../../../../util/regex'; -import { BitBucketTagsDatasource } from '../../../../datasource/bitbucket-tags'; +import { BitbucketTagsDatasource } from '../../../../datasource/bitbucket-tags'; import { GitTagsDatasource } from '../../../../datasource/git-tags'; import { GithubTagsDatasource } from '../../../../datasource/github-tags'; import { TerraformModuleDatasource } from '../../../../datasource/terraform-module'; @@ -78,7 +78,7 @@ export class ModuleExtractor extends DependencyExtractor { bitbucketRefMatch.groups.project; dep.packageName = dep.depName; dep.currentValue = bitbucketRefMatch.groups.tag; - dep.datasource = BitBucketTagsDatasource.id; + dep.datasource = BitbucketTagsDatasource.id; } else if (azureDevOpsSshRefMatch?.groups) { dep.depType = 'module'; dep.depName = `${azureDevOpsSshRefMatch.groups.organization}/${azureDevOpsSshRefMatch.groups.project}/${azureDevOpsSshRefMatch.groups.repository}${azureDevOpsSshRefMatch.groups.modulepath}`; diff --git a/lib/modules/manager/terraform/index.ts b/lib/modules/manager/terraform/index.ts index 06aedc5420739c..d429e781909add 100644 --- a/lib/modules/manager/terraform/index.ts +++ b/lib/modules/manager/terraform/index.ts @@ -1,4 +1,4 @@ -import { BitBucketTagsDatasource } from '../../datasource/bitbucket-tags'; +import { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags'; import { DockerDatasource } from '../../datasource/docker'; import { GitTagsDatasource } from '../../datasource/git-tags'; import { GithubReleasesDatasource } from '../../datasource/github-releases'; @@ -12,7 +12,7 @@ export { updateLockedDependency } from './lockfile/update-locked'; export { extractPackageFile } from './extract'; export const supportedDatasources = [ - BitBucketTagsDatasource.id, + BitbucketTagsDatasource.id, DockerDatasource.id, GitTagsDatasource.id, GithubTagsDatasource.id, diff --git a/lib/modules/manager/terraform/lockfile/hash.ts b/lib/modules/manager/terraform/lockfile/hash.ts index d3b37571630a2d..25afff41e2abef 100644 --- a/lib/modules/manager/terraform/lockfile/hash.ts +++ b/lib/modules/manager/terraform/lockfile/hash.ts @@ -32,7 +32,7 @@ export class TerraformProviderHash { // add double space, the filename and a new line char rootHash.update(' '); - const fileName = file.replace(regEx(/^.*[\\/]/), ''); + const fileName = file.replace(regEx(/^.*[/]/), ''); rootHash.update(fileName); rootHash.update('\n'); } diff --git a/lib/modules/manager/terraform/lockfile/index.ts b/lib/modules/manager/terraform/lockfile/index.ts index 69d7968d1ac5e6..d4421c3d41310a 100644 --- a/lib/modules/manager/terraform/lockfile/index.ts +++ b/lib/modules/manager/terraform/lockfile/index.ts @@ -25,7 +25,7 @@ async function updateAllLocks( const updateConfig: GetPkgReleasesConfig = { versioning: 'hashicorp', datasource: 'terraform-provider', - depName: lock.packageName, + packageName: lock.packageName, }; const { releases } = (await getPkgReleases(updateConfig)) ?? {}; // istanbul ignore if: needs test diff --git a/lib/modules/manager/terraform/lockfile/util.ts b/lib/modules/manager/terraform/lockfile/util.ts index 774be9e7284914..2f59bb1e566722 100644 --- a/lib/modules/manager/terraform/lockfile/util.ts +++ b/lib/modules/manager/terraform/lockfile/util.ts @@ -10,7 +10,7 @@ import type { } from './types'; const providerStartLineRegex = regEx( - `^provider "(?[^/]*)\\/(?[^/]*)\\/(?[^/]*)"` + `^provider "(?[^/]*)/(?[^/]*)/(?[^/]*)"` ); const versionLineRegex = regEx( `^(?[\\s]*version[\\s]*=[\\s]*")(?[^"']+)(?".*)$` diff --git a/lib/modules/manager/types.ts b/lib/modules/manager/types.ts index c1fc93c79c3f81..80f84fe48094df 100644 --- a/lib/modules/manager/types.ts +++ b/lib/modules/manager/types.ts @@ -8,6 +8,7 @@ import type { import type { ProgrammingLanguage } from '../../constants'; import type { ModuleApi, RangeStrategy, SkipReason } from '../../types'; import type { FileChange } from '../../util/git/types'; +import type { MergeConfidence } from '../../util/merge-confidence/types'; export type Result = T | Promise; @@ -19,7 +20,7 @@ export interface ExtractConfig extends CustomExtractConfig { registryAliases?: Record; npmrc?: string; npmrcMerge?: boolean; - skipInstalls?: boolean; + skipInstalls?: boolean | null; } export interface CustomExtractConfig extends RegexManagerTemplates { @@ -63,7 +64,7 @@ export interface PackageFileContent> lockFiles?: string[]; npmrc?: string; packageFileVersion?: string; - skipInstalls?: boolean; + skipInstalls?: boolean | null; matchStrings?: string[]; matchStringsStrategy?: MatchStringsStrategy; } @@ -73,32 +74,6 @@ export interface PackageFile> packageFile: string; } -export interface Package extends ManagerData { - currentValue?: string | null; - currentDigest?: string; - depName?: string; - depType?: string; - fileReplacePosition?: number; - groupName?: string; - lineNumber?: number; - packageName?: string | null; - target?: string; - versioning?: string; - dataType?: string; - enabled?: boolean; - - // npm manager - bumpVersion?: ReleaseType | string; - npmPackageAlias?: boolean; - packageFileVersion?: string; - gitRef?: boolean; - sourceUrl?: string | null; - pinDigests?: boolean; - currentRawValue?: string; - major?: { enabled?: boolean }; - prettyDepType?: string; -} - export interface LookupUpdate { bucket?: string; branchName?: string; @@ -120,6 +95,7 @@ export interface LookupUpdate { pendingVersions?: string[]; newVersion?: string; updateType?: UpdateType; + mergeConfidenceLevel?: MergeConfidence | undefined; userStrings?: Record; checksumUrl?: string; downloadUrl?: string; @@ -127,7 +103,29 @@ export interface LookupUpdate { registryUrl?: string; } -export interface PackageDependency> extends Package { +export interface PackageDependency> + extends ManagerData { + currentValue?: string | null; + currentDigest?: string; + depName?: string; + depType?: string; + fileReplacePosition?: number; + groupName?: string; + lineNumber?: number; + packageName?: string; + target?: string; + versioning?: string; + dataType?: string; + enabled?: boolean; + bumpVersion?: ReleaseType | string; + npmPackageAlias?: boolean; + packageFileVersion?: string; + gitRef?: boolean; + sourceUrl?: string | null; + pinDigests?: boolean; + currentRawValue?: string; + major?: { enabled?: boolean }; + prettyDepType?: string; newValue?: string; warnings?: ValidationMessage[]; commitMessageTopic?: string; @@ -147,7 +145,6 @@ export interface PackageDependency> extends Package { updates?: LookupUpdate[]; replaceString?: string; autoReplaceStringTemplate?: string; - depIndex?: number; editFile?: string; separateMinorPatch?: boolean; extractVersion?: string; @@ -155,7 +152,7 @@ export interface PackageDependency> extends Package { variableName?: string; } -export interface Upgrade> extends Package { +export interface Upgrade> extends PackageDependency { isLockfileUpdate?: boolean; currentRawValue?: any; depGroup?: string; @@ -274,7 +271,7 @@ export interface PostUpdateConfig> ManagerData { updatedPackageFiles?: FileChange[]; postUpdateOptions?: string[]; - skipInstalls?: boolean; + skipInstalls?: boolean | null; ignoreScripts?: boolean; packageFile?: string; diff --git a/lib/modules/manager/woodpecker/index.ts b/lib/modules/manager/woodpecker/index.ts index aa823a82e0621e..07a0c38a5c7702 100644 --- a/lib/modules/manager/woodpecker/index.ts +++ b/lib/modules/manager/woodpecker/index.ts @@ -7,7 +7,7 @@ export const language: ProgrammingLanguage = 'docker'; export { extractPackageFile }; export const defaultConfig = { - fileMatch: ['^\\.woodpecker(?:\\/[^/]+)?\\.ya?ml$'], + fileMatch: ['^\\.woodpecker(?:/[^/]+)?\\.ya?ml$'], }; export const supportedDatasources = [DockerDatasource.id]; diff --git a/lib/modules/platform/azure/index.spec.ts b/lib/modules/platform/azure/index.spec.ts index 0767c3157ba400..74df14dd818684 100644 --- a/lib/modules/platform/azure/index.spec.ts +++ b/lib/modules/platform/azure/index.spec.ts @@ -577,10 +577,28 @@ describe('modules/platform/azure/index', () => { ]), } as any) ); - const res = await azure.getBranchStatus('somebranch'); + const res = await azure.getBranchStatus('somebranch', true); expect(res).toBe('green'); }); + it('should not treat internal checks as success', async () => { + await initRepo({ repository: 'some/repo' }); + azureApi.gitApi.mockImplementationOnce( + () => + ({ + getBranch: jest.fn(() => ({ commit: { commitId: 'abcd1234' } })), + getStatuses: jest.fn(() => [ + { + state: GitStatusState.Succeeded, + context: { genre: 'renovate' }, + }, + ]), + } as any) + ); + const res = await azure.getBranchStatus('somebranch', false); + expect(res).toBe('yellow'); + }); + it('should pass through failed', async () => { await initRepo({ repository: 'some/repo' }); azureApi.gitApi.mockImplementationOnce( @@ -590,7 +608,7 @@ describe('modules/platform/azure/index', () => { getStatuses: jest.fn(() => [{ state: GitStatusState.Error }]), } as any) ); - const res = await azure.getBranchStatus('somebranch'); + const res = await azure.getBranchStatus('somebranch', true); expect(res).toBe('red'); }); @@ -603,7 +621,7 @@ describe('modules/platform/azure/index', () => { getStatuses: jest.fn(() => [{ state: GitStatusState.Pending }]), } as any) ); - const res = await azure.getBranchStatus('somebranch'); + const res = await azure.getBranchStatus('somebranch', true); expect(res).toBe('yellow'); }); @@ -616,7 +634,7 @@ describe('modules/platform/azure/index', () => { getStatuses: jest.fn(() => []), } as any) ); - const res = await azure.getBranchStatus('somebranch'); + const res = await azure.getBranchStatus('somebranch', true); expect(res).toBe('yellow'); }); }); diff --git a/lib/modules/platform/azure/index.ts b/lib/modules/platform/azure/index.ts index e20acd9cf72f3d..2ddcc08a3dc834 100644 --- a/lib/modules/platform/azure/index.ts +++ b/lib/modules/platform/azure/index.ts @@ -381,7 +381,8 @@ export async function getBranchStatusCheck( } export async function getBranchStatus( - branchName: string + branchName: string, + internalChecksAsSuccess: boolean ): Promise { logger.debug(`getBranchStatus(${branchName})`); const statuses = await getStatusCheck(branchName); @@ -406,6 +407,19 @@ export async function getBranchStatus( if (noOfPending) { return 'yellow'; } + if ( + !internalChecksAsSuccess && + statuses.every( + (status) => + status.state === GitStatusState.Succeeded && + status.context?.genre === 'renovate' + ) + ) { + logger.debug( + 'Successful checks are all internal renovate/ checks, so returning "pending" branch status' + ); + return 'yellow'; + } return 'green'; } diff --git a/lib/modules/platform/bitbucket-server/index.md b/lib/modules/platform/bitbucket-server/index.md index 002f70e20c30fd..8d4ec5417b953d 100644 --- a/lib/modules/platform/bitbucket-server/index.md +++ b/lib/modules/platform/bitbucket-server/index.md @@ -1,4 +1,4 @@ -# Bitbucket Server Support +# Bitbucket Data Center and Server ## Authentication diff --git a/lib/modules/platform/bitbucket-server/index.spec.ts b/lib/modules/platform/bitbucket-server/index.spec.ts index 7b9b5a346321fa..6c8965a2ab87dd 100644 --- a/lib/modules/platform/bitbucket-server/index.spec.ts +++ b/lib/modules/platform/bitbucket-server/index.spec.ts @@ -1749,7 +1749,9 @@ Followed by some information. failed: 0, }); - expect(await bitbucket.getBranchStatus('somebranch')).toBe('green'); + expect(await bitbucket.getBranchStatus('somebranch', true)).toBe( + 'green' + ); }); it('should be pending', async () => { @@ -1764,7 +1766,9 @@ Followed by some information. failed: 0, }); - expect(await bitbucket.getBranchStatus('somebranch')).toBe('yellow'); + expect(await bitbucket.getBranchStatus('somebranch', true)).toBe( + 'yellow' + ); scope .get( @@ -1776,7 +1780,9 @@ Followed by some information. failed: 0, }); - expect(await bitbucket.getBranchStatus('somebranch')).toBe('yellow'); + expect(await bitbucket.getBranchStatus('somebranch', true)).toBe( + 'yellow' + ); }); it('should be failed', async () => { @@ -1791,7 +1797,9 @@ Followed by some information. failed: 1, }); - expect(await bitbucket.getBranchStatus('somebranch')).toBe('red'); + expect(await bitbucket.getBranchStatus('somebranch', true)).toBe( + 'red' + ); scope .get( @@ -1799,15 +1807,17 @@ Followed by some information. ) .replyWithError('requst-failed'); - expect(await bitbucket.getBranchStatus('somebranch')).toBe('red'); + expect(await bitbucket.getBranchStatus('somebranch', true)).toBe( + 'red' + ); }); it('throws repository-changed', async () => { git.branchExists.mockReturnValue(false); await initRepo(); - await expect(bitbucket.getBranchStatus('somebranch')).rejects.toThrow( - REPOSITORY_CHANGED - ); + await expect( + bitbucket.getBranchStatus('somebranch', true) + ).rejects.toThrow(REPOSITORY_CHANGED); }); }); diff --git a/lib/modules/platform/bitbucket-server/index.ts b/lib/modules/platform/bitbucket-server/index.ts index acdc8bd71fce18..47fecb5852cb1d 100644 --- a/lib/modules/platform/bitbucket-server/index.ts +++ b/lib/modules/platform/bitbucket-server/index.ts @@ -148,7 +148,7 @@ export async function getJsonFile( return JSON5.parse(raw); } -// Initialize BitBucket Server by getting base branch +// Initialize Bitbucket Server by getting base branch export async function initRepo({ repository, cloneSubmodules, diff --git a/lib/modules/platform/bitbucket/__snapshots__/index.spec.ts.snap b/lib/modules/platform/bitbucket/__snapshots__/index.spec.ts.snap index 02bcf79aa67c85..1818c5b6361ede 100644 --- a/lib/modules/platform/bitbucket/__snapshots__/index.spec.ts.snap +++ b/lib/modules/platform/bitbucket/__snapshots__/index.spec.ts.snap @@ -140,7 +140,17 @@ exports[`modules/platform/bitbucket/index initRepo() works with username and pas } `; -exports[`modules/platform/bitbucket/index massageMarkdown() returns diff files 1`] = `"**foo**bartext"`; +exports[`modules/platform/bitbucket/index massageMarkdown() returns diff files 1`] = ` +"**foo** + + +**text** + + + + +" +`; exports[`modules/platform/bitbucket/index updatePr() rethrows exception when PR update error due to unknown reviewers error 1`] = `"Response code 400 (Bad Request)"`; diff --git a/lib/modules/platform/bitbucket/comments.ts b/lib/modules/platform/bitbucket/comments.ts index d077fb583f44e3..6aefe689edf3c5 100644 --- a/lib/modules/platform/bitbucket/comments.ts +++ b/lib/modules/platform/bitbucket/comments.ts @@ -13,7 +13,7 @@ interface Comment { export type CommentsConfig = Pick; -interface EnsureBitBucketCommentConfig extends EnsureCommentConfig { +interface EnsureBitbucketCommentConfig extends EnsureCommentConfig { config: CommentsConfig; } @@ -71,7 +71,7 @@ export async function ensureComment({ number: prNo, topic, content, -}: EnsureBitBucketCommentConfig): Promise { +}: EnsureBitbucketCommentConfig): Promise { try { const comments = await getComments(config, prNo); let body: string; diff --git a/lib/modules/platform/bitbucket/index.md b/lib/modules/platform/bitbucket/index.md index 68fdfe608e01e4..7b8da4676f7972 100644 --- a/lib/modules/platform/bitbucket/index.md +++ b/lib/modules/platform/bitbucket/index.md @@ -28,8 +28,4 @@ Remember to: ## Unsupported platform features/concepts - Adding assignees to PRs not supported (does not seem to be a Bitbucket concept) -- `automergeStrategy=rebase` not supported by BitBucket Cloud, see [Jira issue BCLOUD-16610](https://jira.atlassian.com/browse/BCLOUD-16610) - -## Features requiring implementation - -- Creating issues not implemented yet, e.g. when there is a config error +- `automergeStrategy=rebase` not supported by Bitbucket Cloud, see [Jira issue BCLOUD-16610](https://jira.atlassian.com/browse/BCLOUD-16610) diff --git a/lib/modules/platform/bitbucket/index.spec.ts b/lib/modules/platform/bitbucket/index.spec.ts index 32a85c0b5148c2..03337462d67624 100644 --- a/lib/modules/platform/bitbucket/index.spec.ts +++ b/lib/modules/platform/bitbucket/index.spec.ts @@ -171,6 +171,58 @@ describe('modules/platform/bitbucket/index', () => { }); }); + describe('bbUseDevelopmentBranch', () => { + it('not enabled: defaults to using main branch', async () => { + httpMock + .scope(baseUrl) + .get('/2.0/repositories/some/repo') + .reply(200, { owner: {}, mainbranch: { name: 'master' } }); + + const res = await bitbucket.initRepo({ + repository: 'some/repo', + bbUseDevelopmentBranch: false, + }); + + expect(res.defaultBranch).toBe('master'); + }); + + it('enabled: uses development branch when development branch exists', async () => { + httpMock + .scope(baseUrl) + .get('/2.0/repositories/some/repo') + .reply(200, { owner: {}, mainbranch: { name: 'master' } }) + .get('/2.0/repositories/some/repo/branching-model') + .reply(200, { + development: { name: 'develop', branch: { name: 'develop' } }, + }); + + const res = await bitbucket.initRepo({ + repository: 'some/repo', + bbUseDevelopmentBranch: true, + }); + + expect(res.defaultBranch).toBe('develop'); + }); + + it('enabled: falls back to mainbranch if development branch does not exist', async () => { + httpMock + .scope(baseUrl) + .get('/2.0/repositories/some/repo') + .reply(200, { owner: {}, mainbranch: { name: 'master' } }) + .get('/2.0/repositories/some/repo/branching-model') + .reply(200, { + development: { name: 'develop' }, + }); + + const res = await bitbucket.initRepo({ + repository: 'some/repo', + bbUseDevelopmentBranch: true, + }); + + expect(res.defaultBranch).toBe('master'); + }); + }); + describe('getRepoForceRebase()', () => { it('always return false, since bitbucket does not support force rebase', async () => { const actual = await bitbucket.getRepoForceRebase(); @@ -225,7 +277,7 @@ describe('modules/platform/bitbucket/index', () => { }, ], }); - expect(await bitbucket.getBranchStatus('master')).toBe('red'); + expect(await bitbucket.getBranchStatus('master', true)).toBe('red'); }); it('getBranchStatus 4', async () => { @@ -250,7 +302,7 @@ describe('modules/platform/bitbucket/index', () => { }, ], }); - expect(await bitbucket.getBranchStatus('branch')).toBe('green'); + expect(await bitbucket.getBranchStatus('branch', true)).toBe('green'); }); it('getBranchStatus 5', async () => { @@ -275,7 +327,9 @@ describe('modules/platform/bitbucket/index', () => { }, ], }); - expect(await bitbucket.getBranchStatus('pending/branch')).toBe('yellow'); + expect(await bitbucket.getBranchStatus('pending/branch', true)).toBe( + 'yellow' + ); }); it('getBranchStatus 6', async () => { @@ -297,9 +351,34 @@ describe('modules/platform/bitbucket/index', () => { .reply(200, { values: [], }); - expect(await bitbucket.getBranchStatus('branch-with-empty-status')).toBe( - 'yellow' - ); + expect( + await bitbucket.getBranchStatus('branch-with-empty-status', true) + ).toBe('yellow'); + }); + + it('getBranchStatus 7', async () => { + const scope = await initRepoMock(); + scope + .get('/2.0/repositories/some/repo/refs/branches/branch') + .reply(200, { + name: 'branch', + target: { + hash: 'branch_hash', + parents: [{ hash: 'master_hash' }], + }, + }) + .get( + '/2.0/repositories/some/repo/commit/branch_hash/statuses?pagelen=100' + ) + .reply(200, { + values: [ + { + key: 'renovate/stability-days', + state: 'SUCCESSFUL', + }, + ], + }); + expect(await bitbucket.getBranchStatus('branch', false)).toBe('yellow'); }); }); @@ -378,10 +457,12 @@ describe('modules/platform/bitbucket/index', () => { describe('findIssue()', () => { it('does not throw', async () => { + httpMock.scope(baseUrl).get('/2.0/user').reply(200, { uuid: '12345' }); + await bitbucket.initPlatform({ username: 'renovate', password: 'pass' }); const scope = await initRepoMock({}, { has_issues: true }); scope .get( - '/2.0/repositories/some/repo/issues?q=title%3D%22title%22%20AND%20(state%20%3D%20%22new%22%20OR%20state%20%3D%20%22open%22)%20AND%20reporter.username%3D%22abc%22' + '/2.0/repositories/some/repo/issues?q=title%3D%22title%22%20AND%20(state%20%3D%20%22new%22%20OR%20state%20%3D%20%22open%22)%20AND%20reporter.uuid%3D%2212345%22' ) .reply(200, { values: [ @@ -409,7 +490,7 @@ describe('modules/platform/bitbucket/index', () => { ); scope .get( - '/2.0/repositories/some/empty/issues?q=title%3D%22title%22%20AND%20(state%20%3D%20%22new%22%20OR%20state%20%3D%20%22open%22)%20AND%20reporter.username%3D%22abc%22' + '/2.0/repositories/some/empty/issues?q=title%3D%22title%22%20AND%20(state%20%3D%20%22new%22%20OR%20state%20%3D%20%22open%22)' ) .reply(200, { values: [], @@ -423,7 +504,7 @@ describe('modules/platform/bitbucket/index', () => { const scope = await initRepoMock({}, { has_issues: true }); scope .get( - '/2.0/repositories/some/repo/issues?q=title%3D%22title%22%20AND%20(state%20%3D%20%22new%22%20OR%20state%20%3D%20%22open%22)%20AND%20reporter.username%3D%22abc%22' + '/2.0/repositories/some/repo/issues?q=title%3D%22title%22%20AND%20(state%20%3D%20%22new%22%20OR%20state%20%3D%20%22open%22)' ) .reply(200, { values: [ @@ -455,11 +536,11 @@ describe('modules/platform/bitbucket/index', () => { ); scope .get( - '/2.0/repositories/some/empty/issues?q=title%3D%22title%22%20AND%20(state%20%3D%20%22new%22%20OR%20state%20%3D%20%22open%22)%20AND%20reporter.username%3D%22abc%22' + '/2.0/repositories/some/empty/issues?q=title%3D%22title%22%20AND%20(state%20%3D%20%22new%22%20OR%20state%20%3D%20%22open%22)' ) .reply(200, { values: [] }) .get( - '/2.0/repositories/some/empty/issues?q=title%3D%22old-title%22%20AND%20(state%20%3D%20%22new%22%20OR%20state%20%3D%20%22open%22)%20AND%20reporter.username%3D%22abc%22' + '/2.0/repositories/some/empty/issues?q=title%3D%22old-title%22%20AND%20(state%20%3D%20%22new%22%20OR%20state%20%3D%20%22open%22)' ) .reply(200, { values: [] }) .post('/2.0/repositories/some/empty/issues') @@ -477,7 +558,7 @@ describe('modules/platform/bitbucket/index', () => { const scope = await initRepoMock({}, { has_issues: true }); scope .get( - '/2.0/repositories/some/repo/issues?q=title%3D%22title%22%20AND%20(state%20%3D%20%22new%22%20OR%20state%20%3D%20%22open%22)%20AND%20reporter.username%3D%22abc%22' + '/2.0/repositories/some/repo/issues?q=title%3D%22title%22%20AND%20(state%20%3D%20%22new%22%20OR%20state%20%3D%20%22open%22)' ) .reply(200, { values: [ @@ -514,7 +595,7 @@ describe('modules/platform/bitbucket/index', () => { const scope = await initRepoMock({}, { has_issues: true }); scope .get( - '/2.0/repositories/some/repo/issues?q=title%3D%22title%22%20AND%20(state%20%3D%20%22new%22%20OR%20state%20%3D%20%22open%22)%20AND%20reporter.username%3D%22abc%22' + '/2.0/repositories/some/repo/issues?q=title%3D%22title%22%20AND%20(state%20%3D%20%22new%22%20OR%20state%20%3D%20%22open%22)' ) .reply(200, { values: [ @@ -545,11 +626,13 @@ describe('modules/platform/bitbucket/index', () => { }); it('get issues', async () => { + httpMock.scope(baseUrl).get('/2.0/user').reply(200, { uuid: '12345' }); + await bitbucket.initPlatform({ username: 'renovate', password: 'pass' }); const scope = await initRepoMock({}, { has_issues: true }); scope .get('/2.0/repositories/some/repo/issues') .query({ - q: '(state = "new" OR state = "open") AND reporter.username="abc"', + q: '(state = "new" OR state = "open") AND reporter.uuid="12345"', }) .reply(200, { values: [ @@ -576,7 +659,7 @@ describe('modules/platform/bitbucket/index', () => { scope .get('/2.0/repositories/some/repo/issues') .query({ - q: '(state = "new" OR state = "open") AND reporter.username="abc"', + q: '(state = "new" OR state = "open")', }) .reply(500, {}); const issues = await bitbucket.getIssueList(); @@ -1059,8 +1142,10 @@ describe('modules/platform/bitbucket/index', () => { describe('massageMarkdown()', () => { it('returns diff files', () => { const prBody = - '
foobar
text
' + - '\n---\n\n - [ ] rebase\n'; + '
foo\n
\n\n
text' + + '\n---\n\n - [ ] rebase\n' + + '\n\n
\n\n
\n
'; + expect(bitbucket.massageMarkdown(prBody)).toMatchSnapshot(); }); }); diff --git a/lib/modules/platform/bitbucket/index.ts b/lib/modules/platform/bitbucket/index.ts index 818351c0d82ff5..dda49add7a2748 100644 --- a/lib/modules/platform/bitbucket/index.ts +++ b/lib/modules/platform/bitbucket/index.ts @@ -39,6 +39,7 @@ import type { EffectiveReviewer, PagedResult, PrResponse, + RepoBranchingModel, RepoInfo, RepoInfoBody, } from './types'; @@ -159,6 +160,7 @@ export async function initRepo({ repository, cloneSubmodules, ignorePrAuthor, + bbUseDevelopmentBranch, }: RepoParams): Promise { logger.debug(`initRepo("${repository}")`); const opts = hostRules.find({ @@ -167,10 +169,10 @@ export async function initRepo({ }); config = { repository, - username: opts.username, ignorePrAuthor, } as Config; let info: RepoInfo; + let mainBranch: string; try { info = utils.repoInfoTransformer( ( @@ -179,7 +181,23 @@ export async function initRepo({ ) ).body ); - config.defaultBranch = info.mainbranch; + + mainBranch = info.mainbranch; + + if (bbUseDevelopmentBranch) { + // Fetch Bitbucket development branch + const developmentBranch = ( + await bitbucketHttp.getJson( + `/2.0/repositories/${repository}/branching-model` + ) + ).body.development?.branch?.name; + + if (developmentBranch) { + mainBranch = developmentBranch; + } + } + + config.defaultBranch = mainBranch; config = { ...config, @@ -221,7 +239,7 @@ export async function initRepo({ cloneSubmodules, }); const repoConfig: RepoResult = { - defaultBranch: info.mainbranch, + defaultBranch: mainBranch, isFork: info.isFork, repoFingerprint: repoFingerprint(info.uuid, defaults.endpoint), }; @@ -355,7 +373,8 @@ async function getStatus( } // Returns the combined status for a branch. export async function getBranchStatus( - branchName: string + branchName: string, + internalChecksAsSuccess: boolean ): Promise { logger.debug(`getBranchStatus(${branchName})`); const statuses = await getStatus(branchName); @@ -377,6 +396,18 @@ export async function getBranchStatus( if (noOfPending) { return 'yellow'; } + if ( + !internalChecksAsSuccess && + statuses.every( + (status) => + status.state === 'SUCCESSFUL' && status.key?.startsWith('renovate/') + ) + ) { + logger.debug( + 'Successful checks are all internal renovate/ checks, so returning "pending" branch status' + ); + return 'yellow'; + } return 'green'; } @@ -430,13 +461,14 @@ type BbIssue = { id: number; title: string; content?: { raw: string } }; async function findOpenIssues(title: string): Promise { try { - const filter = encodeURIComponent( - [ - `title=${JSON.stringify(title)}`, - '(state = "new" OR state = "open")', - `reporter.username="${config.username}"`, - ].join(' AND ') - ); + const filters = [ + `title=${JSON.stringify(title)}`, + '(state = "new" OR state = "open")', + ]; + if (renovateUserUuid) { + filters.push(`reporter.uuid="${renovateUserUuid}"`); + } + const filter = encodeURIComponent(filters.join(' AND ')); return ( ( await bitbucketHttp.getJson<{ values: BbIssue[] }>( @@ -486,7 +518,7 @@ export function massageMarkdown(input: string): string { 'by renaming this PR to start with "rebase!"' ) .replace(regEx(/<\/?summary>/g), '**') - .replace(regEx(/<\/?details>/g), '') + .replace(regEx(/<\/?(details|blockquote)>/g), '') .replace(regEx(`\n---\n\n.*?.*?\n`), '') .replace(regEx(/\]\(\.\.\/pull\//g), '](../../pull-requests/') .replace(regEx(//g), ''); @@ -498,8 +530,6 @@ export async function ensureIssue({ body, }: EnsureIssueConfig): Promise { logger.debug(`ensureIssue()`); - const description = massageMarkdown(sanitize(body)); - /* istanbul ignore if */ if (!config.has_issues) { logger.warn('Issues are disabled - cannot ensureIssue'); @@ -508,6 +538,8 @@ export async function ensureIssue({ } try { let issues = await findOpenIssues(title); + const description = massageMarkdown(sanitize(body)); + if (!issues.length && reuseTitle) { issues = await findOpenIssues(reuseTitle); } @@ -517,6 +549,7 @@ export async function ensureIssue({ await closeIssue(issue.id); } const [issue] = issues; + if ( issue.title !== title || String(issue.content?.raw).trim() !== description.trim() @@ -570,12 +603,11 @@ export async function getIssueList(): Promise { return []; } try { - const filter = encodeURIComponent( - [ - '(state = "new" OR state = "open")', - `reporter.username="${config.username}"`, - ].join(' AND ') - ); + const filters = ['(state = "new" OR state = "open")']; + if (renovateUserUuid) { + filters.push(`reporter.uuid="${renovateUserUuid}"`); + } + const filter = encodeURIComponent(filters.join(' AND ')); return ( ( await bitbucketHttp.getJson<{ values: Issue[] }>( diff --git a/lib/modules/platform/bitbucket/types.ts b/lib/modules/platform/bitbucket/types.ts index 94e58f61673b61..0ffb4b9623cb77 100644 --- a/lib/modules/platform/bitbucket/types.ts +++ b/lib/modules/platform/bitbucket/types.ts @@ -15,8 +15,6 @@ export interface Config { owner: string; prList: Pr[]; repository: string; - username: string; - userUuid: string; ignorePrAuthor: boolean; } @@ -36,6 +34,15 @@ export interface RepoInfo { uuid: string; } +export interface RepoBranchingModel { + development: { + name: string; + branch?: { + name: string; + }; + }; +} + export interface BranchResponse { target: { hash: string; diff --git a/lib/modules/platform/codecommit/index.md b/lib/modules/platform/codecommit/index.md index de47f7b3aa5ab0..6e54fbf819a5d5 100644 --- a/lib/modules/platform/codecommit/index.md +++ b/lib/modules/platform/codecommit/index.md @@ -133,7 +133,6 @@ module.exports = { password: 'SECRET_ACCESS_KEY_GOES_HERE', token: 'AWS_SESSION_TOKEN_GOES_HERE', gitAuthor: 'your_email@domain', - prConcurrentLimit: 10, packageRules: [ { matchPackageNames: ['package_name', 'package_name2'], @@ -142,3 +141,59 @@ module.exports = { ], }; ``` + +## CodeBuild examples + +Create a repository with `buildspec.yml`. +This repository will be your BuildProject job repository to run Renovate on your repositories. + +### Renovate Docker `buildspec.yml` + +```yml +version: 0.2 +env: + shell: bash + git-credential-helper: yes + variables: + RENOVATE_PLATFORM: 'codecommit' + RENOVATE_REPOSITORIES: '["repoName1", "repoName2"]' + RENOVATE_CONFIG: '{"extends":["config:base"]}' + LOG_LEVEL: 'debug' + AWS_REGION: 'us-east-1' +phases: + build: + on-failure: CONTINUE + commands: + - docker run --rm -e AWS_REGION -e RENOVATE_CONFIG -e RENOVATE_PLATFORM -e RENOVATE_REPOSITORIES -e LOG_LEVEL renovate/renovate +``` + +### Renovate CLI `buildspec.yml` + +```yml +version: 0.2 +env: + shell: bash + git-credential-helper: yes + variables: + RENOVATE_PLATFORM: 'codecommit' + RENOVATE_REPOSITORIES: '["repoName1", "repoName2"]' + RENOVATE_CONFIG: '{"extends":["config:base"]}' + LOG_LEVEL: 'debug' + AWS_REGION: 'us-east-1' +phases: + build: + on-failure: CONTINUE + commands: + - npm install -g renovate + - renovate +``` + +### Notes + +In order to reduce Renovate BuildProject time and avoid `npm install`. + +We recommend you install Renovate on the BuildProject Renovate job repository. + +You can add `config.js` global config to the repository. + +You can add the BuildProject repository to the `RENOVATE_REPOSITORIES` variable and get updates on new Renovate versions. diff --git a/lib/modules/platform/default-scm.spec.ts b/lib/modules/platform/default-scm.spec.ts index 2ec02871c8d32d..023948fa3dacae 100644 --- a/lib/modules/platform/default-scm.spec.ts +++ b/lib/modules/platform/default-scm.spec.ts @@ -15,7 +15,7 @@ describe('modules/platform/default-scm', () => { it('delegate commitAndPush to util/git', async () => { git.commitFiles.mockResolvedValueOnce('sha'); - await defaultGitScm.commitAndPush(partial({})); + await defaultGitScm.commitAndPush(partial()); expect(git.commitFiles).toHaveBeenCalledTimes(1); }); diff --git a/lib/modules/platform/gitea/index.spec.ts b/lib/modules/platform/gitea/index.spec.ts index 8a27641c73037d..5142b0d8299ff6 100644 --- a/lib/modules/platform/gitea/index.spec.ts +++ b/lib/modules/platform/gitea/index.spec.ts @@ -632,7 +632,7 @@ describe('modules/platform/gitea/index', () => { }) ); - return gitea.getBranchStatus('some-branch'); + return gitea.getBranchStatus('some-branch', true); }; it('should return yellow for unknown result', async () => { @@ -654,7 +654,7 @@ describe('modules/platform/gitea/index', () => { it('should abort when branch status returns 404', async () => { helper.getCombinedCommitStatus.mockRejectedValueOnce({ statusCode: 404 }); - await expect(gitea.getBranchStatus('some-branch')).rejects.toThrow( + await expect(gitea.getBranchStatus('some-branch', true)).rejects.toThrow( REPOSITORY_CHANGED ); }); @@ -664,10 +664,47 @@ describe('modules/platform/gitea/index', () => { new Error('getCombinedCommitStatus()') ); - await expect(gitea.getBranchStatus('some-branch')).rejects.toThrow( + await expect(gitea.getBranchStatus('some-branch', true)).rejects.toThrow( 'getCombinedCommitStatus()' ); }); + + it('should treat internal checks as success', async () => { + helper.getCombinedCommitStatus.mockResolvedValueOnce({ + worstStatus: 'success', + statuses: [ + { + id: 1, + status: 'success', + context: 'renovate/stability-days', + description: 'internal check', + target_url: '', + created_at: '', + }, + ], + }); + expect(await gitea.getBranchStatus('some-branch', true)).toBe('green'); + }); + + it('should not treat internal checks as success', async () => { + await initFakeRepo(); + helper.getCombinedCommitStatus.mockResolvedValueOnce( + partial({ + worstStatus: 'success', + statuses: [ + { + id: 1, + status: 'success', + context: 'renovate/stability-days', + description: 'internal check', + target_url: '', + created_at: '', + }, + ], + }) + ); + expect(await gitea.getBranchStatus('some-branch', false)).toBe('yellow'); + }); }); describe('getBranchStatusCheck', () => { @@ -1075,7 +1112,7 @@ describe('modules/platform/gitea/index', () => { }); it('should abort when response for created pull request is invalid', async () => { - helper.createPR.mockResolvedValueOnce(partial({})); + helper.createPR.mockResolvedValueOnce(partial()); await initFakeRepo(); await expect( @@ -1940,7 +1977,7 @@ describe('modules/platform/gitea/index', () => { }); it('returns null on missing content', async () => { - helper.getRepoContents.mockResolvedValueOnce(partial({})); + helper.getRepoContents.mockResolvedValueOnce(partial()); await initFakeRepo({ full_name: 'some/repo' }); expect(await gitea.getJsonFile('file.json')).toBeNull(); }); diff --git a/lib/modules/platform/gitea/index.ts b/lib/modules/platform/gitea/index.ts index d650a6955104c0..3eff6f1ecb4770 100644 --- a/lib/modules/platform/gitea/index.ts +++ b/lib/modules/platform/gitea/index.ts @@ -387,7 +387,10 @@ const platform: Platform = { } }, - async getBranchStatus(branchName: string): Promise { + async getBranchStatus( + branchName: string, + internalChecksAsSuccess: boolean + ): Promise { let ccs: CombinedCommitStatus; try { ccs = await helper.getCombinedCommitStatus(config.repository, branchName); @@ -404,6 +407,17 @@ const platform: Platform = { } logger.debug({ ccs }, 'Branch status check result'); + if ( + !internalChecksAsSuccess && + ccs.worstStatus === 'success' && + ccs.statuses.every((status) => status.context?.startsWith('renovate/')) + ) { + logger.debug( + 'Successful checks are all internal renovate/ checks, so returning "pending" branch status' + ); + return 'yellow'; + } + return helper.giteaToRenovateStatusMapping[ccs.worstStatus] ?? 'yellow'; }, diff --git a/lib/modules/platform/github/common.ts b/lib/modules/platform/github/common.ts index 62e12a6ce645e3..db8a22b3c84dcb 100644 --- a/lib/modules/platform/github/common.ts +++ b/lib/modules/platform/github/common.ts @@ -50,6 +50,10 @@ export function coerceRestPr(pr: GhRestPr): GhPr { result.closedAt = pr.closed_at; } + if (pr.base?.ref) { + result.targetBranch = pr.base.ref; + } + schema.match(platformSchemas.Pr, result, 'warn'); return result; } diff --git a/lib/modules/platform/github/index.md b/lib/modules/platform/github/index.md index 6540a424234468..6c06159d857b38 100644 --- a/lib/modules/platform/github/index.md +++ b/lib/modules/platform/github/index.md @@ -20,6 +20,11 @@ You can choose where you want to set `endpoint`: - In a environment variable - In a CLI parameter + +!!! tip "Labels and forking mode" + If you're self-hosting Renovate on GitHub.com with GitHub Actions in forking mode, and want Renovate to apply labels then you must give the PAT `triage` level rights on `issues`. + The `triage` level allows the PAT to apply/dismiss existing labels. + ## Running as a GitHub App Instead of a bot account with a Personal Access Token you can run `renovate` as a self-hosted [GitHub App](https://docs.github.com/en/developers/apps/getting-started-with-apps). diff --git a/lib/modules/platform/github/index.spec.ts b/lib/modules/platform/github/index.spec.ts index acdf7859662641..c9dd817f40ee39 100644 --- a/lib/modules/platform/github/index.spec.ts +++ b/lib/modules/platform/github/index.spec.ts @@ -650,7 +650,7 @@ describe('modules/platform/github/index', () => { const pr1: GhRestPr = { number: 1, head: { ref: 'branch-1', sha: '111', repo: { full_name: 'some/repo' } }, - base: { repo: { pushed_at: '' } }, + base: { repo: { pushed_at: '' }, ref: 'repo/fork_branch' }, state: 'open', title: 'PR #1', created_at: t1, @@ -998,10 +998,32 @@ describe('modules/platform/github/index', () => { .reply(200, []); await github.initRepo({ repository: 'some/repo' }); - const res = await github.getBranchStatus('somebranch'); + const res = await github.getBranchStatus('somebranch', true); expect(res).toBe('green'); }); + it('should not consider internal statuses as success', async () => { + const scope = httpMock.scope(githubApiHost); + initRepoMock(scope, 'some/repo'); + scope + .get('/repos/some/repo/commits/somebranch/status') + .reply(200, { + state: 'success', + statuses: [ + { + context: 'renovate/stability-days', + state: 'success', + }, + ], + }) + .get('/repos/some/repo/commits/somebranch/check-runs?per_page=100') + .reply(200, []); + + await github.initRepo({ repository: 'some/repo' }); + const res = await github.getBranchStatus('somebranch', false); + expect(res).toBe('yellow'); + }); + it('should pass through failed', async () => { const scope = httpMock.scope(githubApiHost); initRepoMock(scope, 'some/repo'); @@ -1014,7 +1036,7 @@ describe('modules/platform/github/index', () => { .reply(200, []); await github.initRepo({ repository: 'some/repo' }); - const res = await github.getBranchStatus('somebranch'); + const res = await github.getBranchStatus('somebranch', true); expect(res).toBe('red'); }); @@ -1029,7 +1051,7 @@ describe('modules/platform/github/index', () => { .get('/repos/some/repo/commits/somebranch/check-runs?per_page=100') .reply(200, []); await github.initRepo({ repository: 'some/repo' }); - const res = await github.getBranchStatus('somebranch'); + const res = await github.getBranchStatus('somebranch', true); expect(res).toBe('yellow'); }); @@ -1061,7 +1083,7 @@ describe('modules/platform/github/index', () => { ], }); await github.initRepo({ repository: 'some/repo' }); - const res = await github.getBranchStatus('somebranch'); + const res = await github.getBranchStatus('somebranch', true); expect(res).toBe('red'); }); @@ -1099,7 +1121,7 @@ describe('modules/platform/github/index', () => { ], }); await github.initRepo({ repository: 'some/repo' }); - const res = await github.getBranchStatus('somebranch'); + const res = await github.getBranchStatus('somebranch', true); expect(res).toBe('green'); }); @@ -1130,7 +1152,7 @@ describe('modules/platform/github/index', () => { ], }); await github.initRepo({ repository: 'some/repo' }); - const res = await github.getBranchStatus('somebranch'); + const res = await github.getBranchStatus('somebranch', true); expect(res).toBe('yellow'); }); }); diff --git a/lib/modules/platform/github/index.ts b/lib/modules/platform/github/index.ts index 7422d4a6ff93d0..caf65f1acb4c16 100644 --- a/lib/modules/platform/github/index.ts +++ b/lib/modules/platform/github/index.ts @@ -821,7 +821,8 @@ async function getStatus( // Returns the combined status for a branch. export async function getBranchStatus( - branchName: string + branchName: string, + internalChecksAsSuccess: boolean ): Promise { logger.debug(`getBranchStatus(${branchName})`); let commitStatus: CombinedBranchStatus; @@ -841,6 +842,18 @@ export async function getBranchStatus( { state: commitStatus.state, statuses: commitStatus.statuses }, 'branch status check result' ); + if (commitStatus.statuses && !internalChecksAsSuccess) { + commitStatus.statuses = commitStatus.statuses.filter( + (status) => + status.state !== 'success' || !status.context?.startsWith('renovate/') + ); + if (!commitStatus.statuses.length) { + logger.debug( + 'Successful checks are all internal renovate/ checks, so returning "pending" branch status' + ); + commitStatus.state = 'pending'; + } + } let checkRuns: { name: string; status: string; conclusion: string }[] = []; // API is supported in oldest available GHE version 2.19 try { diff --git a/lib/modules/platform/github/types.ts b/lib/modules/platform/github/types.ts index 9c62287dcfd79a..fd06dcf31b2d82 100644 --- a/lib/modules/platform/github/types.ts +++ b/lib/modules/platform/github/types.ts @@ -41,6 +41,7 @@ export interface GhRestPr { repo: { pushed_at?: string; }; + ref: string; }; mergeable_state: string; number: number; diff --git a/lib/modules/platform/gitlab/index.spec.ts b/lib/modules/platform/gitlab/index.spec.ts index 4a1fe03a7d9de0..5990f566b0aeb2 100644 --- a/lib/modules/platform/gitlab/index.spec.ts +++ b/lib/modules/platform/gitlab/index.spec.ts @@ -532,7 +532,7 @@ describe('modules/platform/gitlab/index', () => { '/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me' ) .reply(200, []); - const res = await gitlab.getBranchStatus('somebranch'); + const res = await gitlab.getBranchStatus('somebranch', true); expect(res).toBe('yellow'); }); @@ -574,7 +574,7 @@ describe('modules/platform/gitlab/index', () => { status: 'success', }, }); - const res = await gitlab.getBranchStatus('some-branch'); + const res = await gitlab.getBranchStatus('some-branch', true); expect(res).toBe('green'); }); @@ -592,10 +592,28 @@ describe('modules/platform/gitlab/index', () => { '/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me' ) .reply(200, []); - const res = await gitlab.getBranchStatus('somebranch'); + const res = await gitlab.getBranchStatus('somebranch', true); expect(res).toBe('green'); }); + it('returns pending if all are internal success', async () => { + const scope = await initRepo(); + scope + .get( + '/api/v4/projects/some%2Frepo/repository/commits/0d9c7726c3d628b7e28af234595cfd20febdbf8e/statuses' + ) + .reply(200, [ + { name: 'renovate/stability-days', status: 'success' }, + { name: 'renovate/other', status: 'success' }, + ]) + .get( + '/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me' + ) + .reply(200, []); + const res = await gitlab.getBranchStatus('somebranch', false); + expect(res).toBe('yellow'); + }); + it('returns success if optional jobs fail', async () => { const scope = await initRepo(); scope @@ -610,7 +628,7 @@ describe('modules/platform/gitlab/index', () => { '/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me' ) .reply(200, []); - const res = await gitlab.getBranchStatus('somebranch'); + const res = await gitlab.getBranchStatus('somebranch', true); expect(res).toBe('green'); }); @@ -625,7 +643,7 @@ describe('modules/platform/gitlab/index', () => { '/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me' ) .reply(200, []); - const res = await gitlab.getBranchStatus('somebranch'); + const res = await gitlab.getBranchStatus('somebranch', true); expect(res).toBe('green'); }); @@ -640,7 +658,7 @@ describe('modules/platform/gitlab/index', () => { '/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me' ) .reply(200, []); - const res = await gitlab.getBranchStatus('somebranch'); + const res = await gitlab.getBranchStatus('somebranch', true); expect(res).toBe('green'); }); @@ -655,7 +673,7 @@ describe('modules/platform/gitlab/index', () => { '/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me' ) .reply(200, []); - const res = await gitlab.getBranchStatus('somebranch'); + const res = await gitlab.getBranchStatus('somebranch', true); expect(res).toBe('yellow'); }); @@ -670,7 +688,7 @@ describe('modules/platform/gitlab/index', () => { '/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me' ) .reply(200, []); - const res = await gitlab.getBranchStatus('somebranch'); + const res = await gitlab.getBranchStatus('somebranch', true); expect(res).toBe('red'); }); @@ -689,7 +707,7 @@ describe('modules/platform/gitlab/index', () => { '/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me' ) .reply(200, []); - const res = await gitlab.getBranchStatus('somebranch'); + const res = await gitlab.getBranchStatus('somebranch', true); expect(res).toBe('red'); }); @@ -704,7 +722,7 @@ describe('modules/platform/gitlab/index', () => { '/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me' ) .reply(200, []); - const res = await gitlab.getBranchStatus('somebranch'); + const res = await gitlab.getBranchStatus('somebranch', true); expect(res).toBe('yellow'); }); @@ -712,7 +730,7 @@ describe('modules/platform/gitlab/index', () => { expect.assertions(1); git.branchExists.mockReturnValue(false); await initRepo(); - await expect(gitlab.getBranchStatus('somebranch')).rejects.toThrow( + await expect(gitlab.getBranchStatus('somebranch', true)).rejects.toThrow( REPOSITORY_CHANGED ); }); diff --git a/lib/modules/platform/gitlab/index.ts b/lib/modules/platform/gitlab/index.ts index cf41c134d7dddc..98d034915baaff 100644 --- a/lib/modules/platform/gitlab/index.ts +++ b/lib/modules/platform/gitlab/index.ts @@ -396,7 +396,8 @@ const gitlabToRenovateStatusMapping: Record = { // Returns the combined status for a branch. export async function getBranchStatus( - branchName: string + branchName: string, + internalChecksAsSuccess: boolean ): Promise { logger.debug(`getBranchStatus(${branchName})`); @@ -428,6 +429,19 @@ export async function getBranchStatus( // Return 'pending' if we have no status checks return 'yellow'; } + if ( + !internalChecksAsSuccess && + branchStatuses.every( + (check) => + check.name?.startsWith('renovate/') && + gitlabToRenovateStatusMapping[check.status] === 'green' + ) + ) { + logger.debug( + 'Successful checks are all internal renovate/ checks, so returning "pending" branch status' + ); + return 'yellow'; + } let status: BranchStatus = 'green'; // default to green res .filter((check) => !check.allow_failure) diff --git a/lib/modules/platform/types.ts b/lib/modules/platform/types.ts index 07272f44987eba..06b9fc1896db75 100644 --- a/lib/modules/platform/types.ts +++ b/lib/modules/platform/types.ts @@ -38,10 +38,11 @@ export interface RepoParams { endpoint?: string; gitUrl?: GitUrlOption; forkToken?: string; - includeForks?: boolean; + forkProcessing?: 'enabled' | 'disabled'; renovateUsername?: string; cloneSubmodules?: boolean; ignorePrAuthor?: boolean; + bbUseDevelopmentBranch?: boolean; } export interface PrDebugData { @@ -94,6 +95,7 @@ export type PlatformPrOptions = { usePlatformAutomerge?: boolean; forkModeDisallowMaintainerEdits?: boolean; }; + export interface CreatePRConfig { sourceBranch: string; targetBranch: string; @@ -204,7 +206,10 @@ export interface Platform { getPr(number: number): Promise; findPr(findPRConfig: FindPRConfig): Promise; refreshPr?(number: number): Promise; - getBranchStatus(branchName: string): Promise; + getBranchStatus( + branchName: string, + internalChecksAsSuccess: boolean + ): Promise; getBranchPr(branchName: string): Promise; initPlatform(config: PlatformParams): Promise; filterUnavailableUsers?(users: string[]): Promise; diff --git a/lib/modules/versioning/api.ts b/lib/modules/versioning/api.ts index 3fc867e4472a72..56b21ce27e5092 100644 --- a/lib/modules/versioning/api.ts +++ b/lib/modules/versioning/api.ts @@ -1,4 +1,5 @@ import * as amazonMachineImage from './aws-machine-image'; +import * as azureRestApi from './azure-rest-api'; import * as cargo from './cargo'; import * as composer from './composer'; import * as conan from './conan'; @@ -38,6 +39,7 @@ const api = new Map(); export default api; api.set(amazonMachineImage.id, amazonMachineImage.api); +api.set(azureRestApi.id, azureRestApi.api); api.set(cargo.id, cargo.api); api.set(composer.id, composer.api); api.set(conan.id, conan.api); diff --git a/lib/modules/versioning/azure-rest-api/index.spec.ts b/lib/modules/versioning/azure-rest-api/index.spec.ts new file mode 100644 index 00000000000000..f556cae4e4f411 --- /dev/null +++ b/lib/modules/versioning/azure-rest-api/index.spec.ts @@ -0,0 +1,137 @@ +import { api as azureRestApi } from '.'; + +describe('modules/versioning/azure-rest-api/index', () => { + it.each` + version | expected + ${'0000-00-00'} | ${true} + ${'2023-01-01'} | ${true} + ${'2023-01-01-preview'} | ${true} + ${'2023-01-01-alpha'} | ${true} + ${'2023-01-01-beta'} | ${true} + ${'2023-01-01-rc'} | ${true} + ${'2023-01-01-privatepreview'} | ${true} + ${'2023-01-01preview'} | ${false} + ${'2023-01-01 '} | ${false} + ${' 2023-01-01'} | ${false} + ${'2023-01-01-'} | ${false} + ${'2023 01 01'} | ${false} + ${'2023-01-01-23'} | ${false} + ${'2023.01.01'} | ${false} + ${'2023_01_01'} | ${false} + ${'2023/01/01'} | ${false} + `('isValid("$version") === $expected', ({ version, expected }) => { + expect(azureRestApi.isValid(version)).toBe(expected); + }); + + it.each` + version | expected + ${'2023-01-01'} | ${true} + ${'2023-01-01-preview'} | ${true} + `('isCompatible("$version") === $expected', ({ version, expected }) => { + expect(azureRestApi.isCompatible(version)).toBe(expected); + }); + + it.each` + version | expected + ${'2023-01-01'} | ${true} + ${'2023-01-01-preview'} | ${false} + ${'2023-01-01-rc'} | ${false} + ${'2023-01-01-alpha'} | ${false} + ${'2023-01-01-beta'} | ${false} + ${'2023-01-01-privatepreview'} | ${false} + `('isStable("$version") === $expected', ({ version, expected }) => { + expect(azureRestApi.isStable(version)).toBe(expected); + }); + + it.each` + version | expected + ${'2023-01-01'} | ${true} + ${'2023-01-01-preview'} | ${true} + `('isSingleVersion("$version") === $expected', ({ version, expected }) => { + expect(azureRestApi.isSingleVersion(version)).toBe(expected); + }); + + it.each` + version | expected + ${'2023-01-01'} | ${true} + ${'2023-01-01-preview'} | ${true} + ${undefined} | ${false} + ${null} | ${false} + ${123} | ${false} + ${'1.2.3'} | ${false} + `('isVersion("$version") === $expected', ({ version, expected }) => { + expect(azureRestApi.isVersion(version)).toBe(expected); + }); + + it.each` + version | expected + ${'2023-01-01'} | ${20230101} + ${'2023-01-01-preview'} | ${20230101} + `('getMajor("$version") === 1', ({ version, expected }) => { + expect(azureRestApi.getMajor(version)).toBe(expected); + }); + + it.each` + version + ${'2023-01-01'} + ${'2023-01-01-preview'} + `('getMinor("$version") === 0', ({ version }) => { + expect(azureRestApi.getMinor(version)).toBe(0); + }); + + it.each` + version + ${'2023-01-01'} + ${'2023-01-01-preview'} + `('getPatch("$version") === 0', ({ version }) => { + expect(azureRestApi.getPatch(version)).toBe(0); + }); + + it.each` + version | other | expected + ${'2023-01-01'} | ${'2023-01-01'} | ${true} + ${'2023-01-01-preview'} | ${'2023-01-01-preview'} | ${true} + ${'2023-01-01'} | ${'2023-01-02'} | ${false} + ${'2023-01-01'} | ${'2023-02-01'} | ${false} + ${'2023-01-01'} | ${'2024-01-01'} | ${false} + `( + 'equals("$version", "$other") === $expected', + ({ version, other, expected }) => { + expect(azureRestApi.equals(version, other)).toBe(expected); + } + ); + + it.each` + version | other | expected + ${'2023-01-01'} | ${'2023-01-02'} | ${false} + ${'2023-01-01'} | ${'2023-02-01'} | ${false} + ${'2023-01-01'} | ${'2024-01-01'} | ${false} + ${'2023-01-01'} | ${'2023-01-01'} | ${false} + ${'2023-01-01-preview'} | ${'2023-01-01-preview'} | ${false} + ${'2023-01-02'} | ${'2023-01-01'} | ${true} + ${'2023-02-01'} | ${'2023-01-01'} | ${true} + ${'2024-01-01'} | ${'2023-01-01'} | ${true} + `( + 'isGreaterThan("$version", "$other") === $expected', + ({ version, other, expected }) => { + expect(azureRestApi.isGreaterThan(version, other)).toBe(expected); + } + ); + + it.each` + version | other | expected + ${'2023-01-01'} | ${'2023-01-01'} | ${0} + ${'2023-01-01-preview'} | ${'2023-01-01-preview'} | ${0} + ${'2023-01-01'} | ${'2023-01-02'} | ${-1} + ${'2023-01-01'} | ${'2023-02-01'} | ${-1} + ${'2023-01-01'} | ${'2024-01-01'} | ${-1} + ${'2023-01-02'} | ${'2023-01-01'} | ${1} + ${'2023-02-01'} | ${'2023-01-01'} | ${1} + ${'2024-01-01'} | ${'2023-01-01'} | ${1} + `( + 'sortVersions("$version", "$other") === $expected', + ({ version, other, expected }) => { + expect(azureRestApi.sortVersions(version, other)).toBe(expected); + } + ); +}); diff --git a/lib/modules/versioning/azure-rest-api/index.ts b/lib/modules/versioning/azure-rest-api/index.ts new file mode 100644 index 00000000000000..1d6436d0eebedf --- /dev/null +++ b/lib/modules/versioning/azure-rest-api/index.ts @@ -0,0 +1,49 @@ +import { regEx } from '../../../util/regex'; +import { GenericVersion, GenericVersioningApi } from '../generic'; +import type { VersioningApi } from '../types'; + +export const id = 'azure-rest-api'; +export const displayName = 'azure-rest-api'; + +export const urls = [ + 'https://github.com/microsoft/api-guidelines/blob/vNext/azure/Guidelines.md#api-versioning', +]; + +export const supportsRanges = false; + +const AZURE_REST_API_VERSION_REGEX = regEx( + /^(?\d{4})-(?\d{2})-(?\d{2})(?-[a-z]+)?$/ +); + +class AzureRestApiVersioningApi extends GenericVersioningApi { + protected _parse(version: string): GenericVersion | null { + if (!version) { + return null; + } + + const matchGroups = AZURE_REST_API_VERSION_REGEX.exec(version)?.groups; + + if (!matchGroups) { + return null; + } + + const { year, month, day, prerelease } = matchGroups; + + return { + release: [parseInt(`${year}${month}${day}`), 0, 0], + prerelease, + }; + } + + protected override _compare(_version: string, _other: string): number { + if (_version === _other) { + return 0; + } + + return _version > _other ? 1 : -1; + } +} + +export const api: VersioningApi = new AzureRestApiVersioningApi(); + +export default api; diff --git a/lib/modules/versioning/azure-rest-api/readme.md b/lib/modules/versioning/azure-rest-api/readme.md new file mode 100644 index 00000000000000..d92970ee68072b --- /dev/null +++ b/lib/modules/versioning/azure-rest-api/readme.md @@ -0,0 +1,3 @@ +The Azure REST APIs use a `YYYY-MM-DD` version with an optional `-preview` suffix: + +Internally at Microsoft they are using other additional suffixes: diff --git a/lib/modules/versioning/cargo/index.spec.ts b/lib/modules/versioning/cargo/index.spec.ts index beb92118f248e0..c9cc7d47f098a8 100644 --- a/lib/modules/versioning/cargo/index.spec.ts +++ b/lib/modules/versioning/cargo/index.spec.ts @@ -111,11 +111,11 @@ describe('modules/versioning/cargo/index', () => { ${' = 1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'} ${'= 1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'= 1.1.0'} ${'1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'1.1.0'} - ${'^1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.0.7'} | ${'^1.0'} + ${'^1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.0.7'} | ${'^1.0.7'} ${'^1.0.0'} | ${'replace'} | ${'1.0.0'} | ${'2.0.7'} | ${'^2.0.0'} ${'1.0.0'} | ${'replace'} | ${'1.0.0'} | ${'2.0.7'} | ${'2.0.0'} - ${'^1'} | ${'bump'} | ${'1.0.0'} | ${'2.1.7'} | ${'^2'} - ${'~1'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1'} + ${'^1'} | ${'bump'} | ${'1.0.0'} | ${'2.1.7'} | ${'^2.1.7'} + ${'~1'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1.1.7'} ${'5'} | ${'bump'} | ${'5.0.0'} | ${'5.1.7'} | ${'5'} ${'5'} | ${'bump'} | ${'5.0.0'} | ${'6.1.7'} | ${'6'} ${'5.0'} | ${'bump'} | ${'5.0.0'} | ${'5.0.7'} | ${'5.0'} diff --git a/lib/modules/versioning/composer/index.spec.ts b/lib/modules/versioning/composer/index.spec.ts index 21b03a642a03a6..f5ad722ef60478 100644 --- a/lib/modules/versioning/composer/index.spec.ts +++ b/lib/modules/versioning/composer/index.spec.ts @@ -116,6 +116,26 @@ describe('modules/versioning/composer/index', () => { expect(semver.matches(a, b)).toBe(expected); }); + test.each` + a | b | expected + ${'1.0.0'} | ${'1.0.0'} | ${true} + ${'1.0.0'} | ${'>=1.0.0'} | ${true} + ${'1.1.0'} | ${'^1.0.0'} | ${true} + ${'>=1.0.0'} | ${'>=1.0.0'} | ${true} + ${'~1.0.0'} | ${'~1.0.0'} | ${true} + ${'^1.0.0'} | ${'^1.0.0'} | ${true} + ${'>=1.0.0'} | ${'>=1.1.0'} | ${false} + ${'~1.0.0'} | ${'~1.1.0'} | ${false} + ${'^1.0.0'} | ${'^1.1.0'} | ${false} + ${'>=1.0.0'} | ${'<1.0.0'} | ${false} + ${'~1.0.0'} | ${'~0.9.0'} | ${false} + ${'^1.0.0'} | ${'^0.9.0'} | ${false} + ${'^1.1.0 || ^2.0.0'} | ${'^1.0.0 || ^2.0.0'} | ${true} + ${'^1.0.0 || ^2.0.0'} | ${'^1.1.0 || ^2.0.0'} | ${false} + `('subset("$a", "$b") === $expected', ({ a, b, expected }) => { + expect(semver.subset!(a, b)).toBe(expected); + }); + test.each` currentValue | rangeStrategy | currentVersion | newVersion | expected ${'~1.0'} | ${'pin'} | ${'1.0'} | ${'V1.1'} | ${'V1.1'} @@ -147,7 +167,7 @@ describe('modules/versioning/composer/index', () => { ${'~1.0 || >=3.0 <=4.0'} | ${'widen'} | ${'2.9.0'} | ${'5.0.0'} | ${'~1.0 || >=3.0 <=5.0'} ${'+4.0.0'} | ${'replace'} | ${'4.0.0'} | ${'4.2.0'} | ${'4.2.0'} ${'v4.0.0'} | ${'replace'} | ${'4.0.0'} | ${'4.2.0'} | ${'v4.2.0'} - ${'^v1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'^v1.1'} + ${'^v1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'^v1.1.7'} ${'^v1.0@beta'} | ${'bump'} | ${'1.0.0-beta3'} | ${'1.0.0-beta5'} | ${'^v1.0.0-beta5@beta'} ${'^v1.0@beta'} | ${'replace'} | ${'1.0.0-beta3'} | ${'2.0.0-beta5'} | ${'^v2.0.0-beta5@beta'} ${'^4.0@alpha'} | ${'replace'} | ${'4.0.0-alpha1'} | ${'4.0.0-beta5'} | ${'^4.0.0-beta5@alpha'} diff --git a/lib/modules/versioning/composer/index.ts b/lib/modules/versioning/composer/index.ts index 45740464213f83..1c1db9884b2d42 100644 --- a/lib/modules/versioning/composer/index.ts +++ b/lib/modules/versioning/composer/index.ts @@ -163,6 +163,10 @@ function minSatisfyingVersion( ); } +function subset(subRange: string, superRange: string): boolean | undefined { + return npm.subset!(composer2npm(subRange), composer2npm(superRange)); +} + function getNewValue({ currentValue, rangeStrategy, @@ -304,5 +308,6 @@ export const api: VersioningApi = { minSatisfyingVersion, getNewValue, sortVersions, + subset, }; export default api; diff --git a/lib/modules/versioning/hashicorp/convertor.ts b/lib/modules/versioning/hashicorp/convertor.ts index cf5ba17cdb275a..9f784f58f87829 100644 --- a/lib/modules/versioning/hashicorp/convertor.ts +++ b/lib/modules/versioning/hashicorp/convertor.ts @@ -1,3 +1,4 @@ +import { logger } from '../../../logger'; import { regEx } from '../../../util/regex'; /** @@ -16,10 +17,18 @@ export function hashicorp2npm(input: string): string { regEx(/^\s*(|=|!=|>|<|>=|<=|~>)\s*v?((\d+)(\.\d+){0,2}[\w-+]*)\s*$/) ); if (!r) { - throw new Error('invalid hashicorp constraint'); + logger.warn( + { constraint: input, element: single }, + 'Invalid hashicorp constraint' + ); + throw new Error('Invalid hashicorp constraint'); } if (r[1] === '!=') { - throw new Error('unsupported != in hashicorp constraint'); + logger.warn( + { constraint: input, element: single }, + 'Unsupported hashicorp constraint' + ); + throw new Error('Unsupported hashicorp constraint'); } return { operator: r[1], diff --git a/lib/modules/versioning/helm/index.spec.ts b/lib/modules/versioning/helm/index.spec.ts index 58584c94858622..1ef08aa9b16cfe 100644 --- a/lib/modules/versioning/helm/index.spec.ts +++ b/lib/modules/versioning/helm/index.spec.ts @@ -34,13 +34,13 @@ describe('modules/versioning/helm/index', () => { test.each` currentValue | rangeStrategy | currentVersion | newVersion | expected ${'=1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'} - ${'^1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.0.7'} | ${'^1.0'} + ${'^1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.0.7'} | ${'^1.0.7'} ${'^1'} | ${'bump'} | ${'1.0.0'} | ${'1.0.7-prerelease.1'} | ${'^1.0.7-prerelease.1'} - ${'^1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'^1.1'} - ${'~1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1.1'} + ${'^1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'^1.1.7'} + ${'~1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1.1.7'} ${'~1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.0.7-prerelease.1'} | ${'~1.0.7-prerelease.1'} - ${'^1'} | ${'bump'} | ${'1.0.0'} | ${'2.1.7'} | ${'^2'} - ${'~1'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1'} + ${'^1'} | ${'bump'} | ${'1.0.0'} | ${'2.1.7'} | ${'^2.1.7'} + ${'~1'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1.1.7'} ${'5'} | ${'bump'} | ${'5.0.0'} | ${'5.1.7'} | ${'5'} ${'5'} | ${'bump'} | ${'5.0.0'} | ${'6.1.7'} | ${'6'} ${'5.0'} | ${'bump'} | ${'5.0.0'} | ${'5.0.7'} | ${'5.0'} diff --git a/lib/modules/versioning/index.spec.ts b/lib/modules/versioning/index.spec.ts index b7c8d3e28afa59..9fe12ce0d6c38d 100644 --- a/lib/modules/versioning/index.spec.ts +++ b/lib/modules/versioning/index.spec.ts @@ -3,6 +3,7 @@ import { loadModules } from '../../util/modules'; import { isVersioningApiConstructor } from './common'; import { GenericVersion, GenericVersioningApi } from './generic'; import * as semverVersioning from './semver'; +import * as semverCoercedVersioning from './semver-coerced'; import type { VersioningApi, VersioningApiConstructor } from './types'; import * as allVersioning from '.'; @@ -57,12 +58,12 @@ describe('modules/versioning/index', () => { } }); - it('should fallback to semver', () => { + it('should fallback to semver-coerced', () => { expect(allVersioning.get(undefined)).toBe( - allVersioning.get(semverVersioning.id) + allVersioning.get(semverCoercedVersioning.id) ); expect(allVersioning.get('unknown')).toBe( - allVersioning.get(semverVersioning.id) + allVersioning.get(semverCoercedVersioning.id) ); }); @@ -82,6 +83,7 @@ describe('modules/versioning/index', () => { 'toLocaleString', 'toString', 'valueOf', + 'subset', ]; const npmApi = Object.keys(allVersioning.get(semverVersioning.id)) .filter((val) => !optionalFunctions.includes(val)) diff --git a/lib/modules/versioning/index.ts b/lib/modules/versioning/index.ts index 616d9e03bb3268..b26e22d9552ede 100644 --- a/lib/modules/versioning/index.ts +++ b/lib/modules/versioning/index.ts @@ -1,10 +1,13 @@ import { logger } from '../../logger'; import versionings from './api'; import { isVersioningApiConstructor } from './common'; +import * as semverCoerced from './semver-coerced'; import type { VersioningApi, VersioningApiConstructor } from './types'; export * from './types'; +const defaultVersioning = semverCoerced; + export const getVersioningList = (): string[] => Array.from(versionings.keys()); /** * Get versioning map. Can be used to dynamically add new versioning type @@ -16,8 +19,10 @@ export const getVersionings = (): Map< export function get(versioning: string | undefined): VersioningApi { if (!versioning) { - logger.trace('Missing versioning, using semver as fallback.'); - return versionings.get('semver') as VersioningApi; + logger.trace( + `Missing versioning, using ${defaultVersioning.id} as fallback.` + ); + return defaultVersioning.api; } const [versioningName, ...versioningRest] = versioning.split(':'); const versioningConfig = versioningRest.length @@ -26,8 +31,11 @@ export function get(versioning: string | undefined): VersioningApi { const theVersioning = versionings.get(versioningName); if (!theVersioning) { - logger.info({ versioning }, 'Unknown versioning - defaulting to semver'); - return versionings.get('semver') as VersioningApi; + logger.info( + { versioning }, + `Unknown versioning - defaulting to ${defaultVersioning.id}` + ); + return defaultVersioning.api; } if (isVersioningApiConstructor(theVersioning)) { return new theVersioning(versioningConfig); diff --git a/lib/modules/versioning/kubernetes-api/index.ts b/lib/modules/versioning/kubernetes-api/index.ts index c620991813d0fb..afcdf95438da3b 100644 --- a/lib/modules/versioning/kubernetes-api/index.ts +++ b/lib/modules/versioning/kubernetes-api/index.ts @@ -10,7 +10,7 @@ export const supportsRanges = false; export class KubernetesApiVersioningApi extends RegExpVersioningApi { private static readonly versionRegex = - '^(?:(?\\S+)\\/)?v(?\\d+)(?(?:alpha|beta)\\d+)?$'; + '^(?:(?\\S+)/)?v(?\\d+)(?(?:alpha|beta)\\d+)?$'; public constructor() { super(KubernetesApiVersioningApi.versionRegex); diff --git a/lib/modules/versioning/npm/index.spec.ts b/lib/modules/versioning/npm/index.spec.ts index 8330064d653422..d67a02b1b4ba34 100644 --- a/lib/modules/versioning/npm/index.spec.ts +++ b/lib/modules/versioning/npm/index.spec.ts @@ -55,17 +55,37 @@ describe('modules/versioning/npm/index', () => { expect(res).toBe(isSingle); }); + test.each` + a | b | expected + ${'1.0.0'} | ${'1.0.0'} | ${true} + ${'1.0.0'} | ${'>=1.0.0'} | ${true} + ${'1.1.0'} | ${'^1.0.0'} | ${true} + ${'>=1.0.0'} | ${'>=1.0.0'} | ${true} + ${'~1.0.0'} | ${'~1.0.0'} | ${true} + ${'^1.0.0'} | ${'^1.0.0'} | ${true} + ${'>=1.0.0'} | ${'>=1.1.0'} | ${false} + ${'~1.0.0'} | ${'~1.1.0'} | ${false} + ${'^1.0.0'} | ${'^1.1.0'} | ${false} + ${'>=1.0.0'} | ${'<1.0.0'} | ${false} + ${'~1.0.0'} | ${'~0.9.0'} | ${false} + ${'^1.0.0'} | ${'^0.9.0'} | ${false} + ${'^1.1.0 || ^2.0.0'} | ${'^1.0.0 || ^2.0.0'} | ${true} + ${'^1.0.0 || ^2.0.0'} | ${'^1.1.0 || ^2.0.0'} | ${false} + `('subset("$a", "$b") === $expected', ({ a, b, expected }) => { + expect(semver.subset!(a, b)).toBe(expected); + }); + test.each` currentValue | rangeStrategy | currentVersion | newVersion | expected ${'=1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'} - ${'^1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.0.7'} | ${'^1.0'} + ${'^1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.0.7'} | ${'^1.0.7'} ${'^1'} | ${'bump'} | ${'1.0.0'} | ${'1.0.7-prerelease.1'} | ${'^1.0.7-prerelease.1'} ${'~> 1.0.0'} | ${'replace'} | ${'1.0.0'} | ${'1.1.7'} | ${'~> 1.1.0'} - ${'^1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'^1.1'} - ${'~1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1.1'} + ${'^1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'^1.1.7'} + ${'~1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1.1.7'} ${'~1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.0.7-prerelease.1'} | ${'~1.0.7-prerelease.1'} - ${'^1'} | ${'bump'} | ${'1.0.0'} | ${'2.1.7'} | ${'^2'} - ${'~1'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1'} + ${'^1'} | ${'bump'} | ${'1.0.0'} | ${'2.1.7'} | ${'^2.1.7'} + ${'~1'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1.1.7'} ${'5'} | ${'bump'} | ${'5.0.0'} | ${'5.1.7'} | ${'5'} ${'5'} | ${'bump'} | ${'5.0.0'} | ${'6.1.7'} | ${'6'} ${'5.0'} | ${'bump'} | ${'5.0.0'} | ${'5.0.7'} | ${'5.0'} diff --git a/lib/modules/versioning/npm/index.ts b/lib/modules/versioning/npm/index.ts index 0f5d75cce198d5..6ece07d64fbf30 100644 --- a/lib/modules/versioning/npm/index.ts +++ b/lib/modules/versioning/npm/index.ts @@ -33,6 +33,7 @@ const { ltr: isLessThanRange, gt: isGreaterThan, eq: equals, + subset, } = semver; // If this is left as an alias, inputs like "17.04.0" throw errors @@ -63,6 +64,7 @@ export const api: VersioningApi = { getSatisfyingVersion, minSatisfyingVersion, sortVersions, + subset, }; export default api; diff --git a/lib/modules/versioning/npm/range.ts b/lib/modules/versioning/npm/range.ts index 37140e3d9cce2f..f8c37b0157bb65 100644 --- a/lib/modules/versioning/npm/range.ts +++ b/lib/modules/versioning/npm/range.ts @@ -136,33 +136,9 @@ export function getNewValue({ }); } if (element.operator === '^') { - const split = currentValue.split('.'); - if (suffix.length) { - return `^${newVersion}`; - } - if (split.length === 1) { - // ^4 - return `^${toVersionMajor}`; - } - if (split.length === 2) { - // ^4.1 - return `^${toVersionMajor}.${toVersionMinor}`; - } return `^${newVersion}`; } if (element.operator === '~') { - const split = currentValue.split('.'); - if (suffix.length) { - return `~${newVersion}`; - } - if (split.length === 1) { - // ~4 - return `~${toVersionMajor}`; - } - if (split.length === 2) { - // ~4.1 - return `~${toVersionMajor}.${toVersionMinor}`; - } return `~${newVersion}`; } if (element.operator === '=') { diff --git a/lib/modules/versioning/poetry/index.spec.ts b/lib/modules/versioning/poetry/index.spec.ts index 7d919a24c6cbb2..a5323ada04410f 100644 --- a/lib/modules/versioning/poetry/index.spec.ts +++ b/lib/modules/versioning/poetry/index.spec.ts @@ -189,15 +189,15 @@ describe('modules/versioning/poetry/index', () => { ${' = 1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'} ${' = 1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'} ${'= 1.0.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.0'} | ${'=1.1.0'} - ${'^1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.0.7'} | ${'^1.0'} + ${'^1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.0.7'} | ${'^1.0.7'} ${'^1.0.0'} | ${'replace'} | ${'1.0.0'} | ${'2.0.7'} | ${'^2.0.0'} ${'^5.0.3'} | ${'replace'} | ${'5.3.1'} | ${'5.5'} | ${'^5.0.3'} ${'1.0.0'} | ${'replace'} | ${'1.0.0'} | ${'2.0.7'} | ${'2.0.7'} ${'^1.0.0'} | ${'replace'} | ${'1.0.0'} | ${'2.0.7'} | ${'^2.0.0'} ${'^0.5.15'} | ${'replace'} | ${'0.5.15'} | ${'0.6'} | ${'^0.5.15'} ${'^0.5.15'} | ${'replace'} | ${'0.5.15'} | ${'0.6b.4'} | ${'^0.5.15'} - ${'^1'} | ${'bump'} | ${'1.0.0'} | ${'2.1.7'} | ${'^2'} - ${'~1'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1'} + ${'^1'} | ${'bump'} | ${'1.0.0'} | ${'2.1.7'} | ${'^2.1.7'} + ${'~1'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1.1.7'} ${'5'} | ${'bump'} | ${'5.0.0'} | ${'5.1.7'} | ${'5'} ${'5'} | ${'bump'} | ${'5.0.0'} | ${'6.1.7'} | ${'6'} ${'5.0'} | ${'bump'} | ${'5.0.0'} | ${'5.0.7'} | ${'5.0'} @@ -211,7 +211,7 @@ describe('modules/versioning/poetry/index', () => { ${'^0.8.0-alpha.0'} | ${'bump'} | ${'0.8.0-alpha.0'} | ${'0.8.0-alpha.1'} | ${'^0.8.0-alpha.1'} ${'^0.8.0-alpha.0'} | ${'bump'} | ${'0.8.0-alpha.0'} | ${'0.8.0a1'} | ${'^0.8.0-alpha.1'} ${'^1.0.0'} | ${'replace'} | ${'1.0.0'} | ${'1.2.3'} | ${'^1.0.0'} - ${'~1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1.1'} + ${'~1.0'} | ${'bump'} | ${'1.0.0'} | ${'1.1.7'} | ${'~1.1.7'} ${'1.0.*'} | ${'replace'} | ${'1.0.0'} | ${'1.1.0'} | ${'1.1.*'} ${'1.*'} | ${'replace'} | ${'1.0.0'} | ${'2.1.0'} | ${'2.*'} ${'~0.6.1'} | ${'replace'} | ${'0.6.8'} | ${'0.7.0-rc.2'} | ${'~0.7.0-rc'} @@ -258,3 +258,23 @@ describe('modules/versioning/poetry/index', () => { expect(versioning.sortVersions(a, b)).toEqual(expected); }); }); + +test.each` + a | b | expected + ${'1.0.0'} | ${'1.0.0'} | ${true} + ${'1.0.0'} | ${'>=1.0.0'} | ${true} + ${'1.1.0'} | ${'^1.0.0'} | ${true} + ${'>=1.0.0'} | ${'>=1.0.0'} | ${true} + ${'~1.0.0'} | ${'~1.0.0'} | ${true} + ${'^1.0.0'} | ${'^1.0.0'} | ${true} + ${'>=1.0.0'} | ${'>=1.1.0'} | ${false} + ${'~1.0.0'} | ${'~1.1.0'} | ${false} + ${'^1.0.0'} | ${'^1.1.0'} | ${false} + ${'>=1.0.0'} | ${'<1.0.0'} | ${false} + ${'~1.0.0'} | ${'~0.9.0'} | ${false} + ${'^1.0.0'} | ${'^0.9.0'} | ${false} + ${'^1.1.0 || ^2.0.0'} | ${'^1.0.0 || ^2.0.0'} | ${true} + ${'^1.0.0 || ^2.0.0'} | ${'^1.1.0 || ^2.0.0'} | ${false} +`('subset("$a", "$b") === $expected', ({ a, b, expected }) => { + expect(versioning.subset!(a, b)).toBe(expected); +}); diff --git a/lib/modules/versioning/poetry/index.ts b/lib/modules/versioning/poetry/index.ts index 230bbb46228a9c..a4f50f42104379 100644 --- a/lib/modules/versioning/poetry/index.ts +++ b/lib/modules/versioning/poetry/index.ts @@ -232,6 +232,10 @@ function sortVersions(a: string, b: string): number { return npm.sortVersions(poetry2semver(a) ?? '', poetry2semver(b) ?? ''); } +function subset(subRange: string, superRange: string): boolean | undefined { + return npm.subset!(poetry2npm(subRange), poetry2npm(superRange)); +} + export const api: VersioningApi = { equals, getMajor, @@ -249,5 +253,6 @@ export const api: VersioningApi = { matches, minSatisfyingVersion, sortVersions, + subset, }; export default api; diff --git a/lib/modules/versioning/python/index.spec.ts b/lib/modules/versioning/python/index.spec.ts index 7cd3b9edfa11fb..710e5ff18fa1a4 100644 --- a/lib/modules/versioning/python/index.spec.ts +++ b/lib/modules/versioning/python/index.spec.ts @@ -97,6 +97,27 @@ describe('modules/versioning/python/index', () => { ); test('getNewValue()', () => { - expect(versioning.getNewValue(partial({}))).toBeNull(); + expect(versioning.getNewValue(partial())).toBeNull(); }); }); + +test.each` + a | b | expected + ${'1.0.0'} | ${'1.0.0'} | ${true} + ${'1.0.0'} | ${'>=1.0.0'} | ${true} + ${'1.1.0'} | ${'^1.0.0'} | ${true} + ${'>=1.0.0'} | ${'>=1.0.0'} | ${true} + ${'~1.0.0'} | ${'~1.0.0'} | ${true} + ${'^1.0.0'} | ${'^1.0.0'} | ${true} + ${'>=1.0.0'} | ${'>=1.1.0'} | ${false} + ${'~1.0.0'} | ${'~1.1.0'} | ${false} + ${'^1.0.0'} | ${'^1.1.0'} | ${false} + ${'>=1.0.0'} | ${'<1.0.0'} | ${false} + ${'~1.0.0'} | ${'~0.9.0'} | ${false} + ${'^1.0.0'} | ${'^0.9.0'} | ${false} + ${'^1.1.0 || ^2.0.0'} | ${'^1.0.0 || ^2.0.0'} | ${true} + ${'^1.0.0 || ^2.0.0'} | ${'^1.1.0 || ^2.0.0'} | ${false} + ${'1.2.3foo'} | ${'~1.1.0'} | ${undefined} +`('subset("$a", "$b") === $expected', ({ a, b, expected }) => { + expect(versioning.subset!(a, b)).toBe(expected); +}); diff --git a/lib/modules/versioning/python/index.ts b/lib/modules/versioning/python/index.ts index 7128ae92d76b46..7e287abc052d86 100644 --- a/lib/modules/versioning/python/index.ts +++ b/lib/modules/versioning/python/index.ts @@ -45,6 +45,12 @@ function getNewValue(_: NewValueConfig): string | null { return null; } +function subset(subRange: string, superRange: string): boolean | undefined { + return poetry.isValid(subRange) && poetry.isValid(superRange) + ? poetry.subset!(subRange, superRange) + : undefined; +} + export const api: VersioningApi = { ...poetry, getNewValue, @@ -53,5 +59,6 @@ export const api: VersioningApi = { isValid, matches, minSatisfyingVersion, + subset, }; export default api; diff --git a/lib/modules/versioning/semver-coerced/readme.md b/lib/modules/versioning/semver-coerced/readme.md index cc058f2825ad54..c6f315d9117e09 100644 --- a/lib/modules/versioning/semver-coerced/readme.md +++ b/lib/modules/versioning/semver-coerced/readme.md @@ -1,5 +1,8 @@ Renovate's Coerced Semantic Versioning is a forgiving variant of [Semantic Versioning 2.0](https://semver.org) with coercion enabled for versions. -This versioning provides a very forgiving translation of inputs in non-strict-SemVer format into strict SemVer. For example, "v1" is coerced into "1.0.0", "2.1" => "2.1.0", "~3.1" => "3.1.0", "1.1-foo" => "1.1.0". Look at the Coercion section of [this page](https://www.npmjs.com/package/semver) for more info on input coercion. +This versioning provides a very forgiving translation of inputs in non-strict-SemVer format into strict SemVer. +For example, "v1" is coerced into "1.0.0", "2.1" => "2.1.0", "~3.1" => "3.1.0", "1.1-foo" => "1.1.0". +Look at the Coercion section of [this page](https://www.npmjs.com/package/semver) for more info on input coercion. -Since this versioning is very forgiving, it doesn't actually provide the coercion for version ranges. The range functions only accept strict SemVer as input and equivalent to those provided by the Renovate's semver versioning. +Since this versioning is very forgiving, it doesn't actually provide the coercion for version ranges. +The range functions only accept strict SemVer as input and equivalent to those provided by the Renovate's semver versioning. diff --git a/lib/modules/versioning/types.ts b/lib/modules/versioning/types.ts index 362a6bd0d0d78e..a1808b08cb1c45 100644 --- a/lib/modules/versioning/types.ts +++ b/lib/modules/versioning/types.ts @@ -1,4 +1,4 @@ -import type { Range, SemVer } from 'semver'; +import type { SemVer } from 'semver'; import type { RangeStrategy } from '../../types'; export interface NewValueConfig { @@ -94,9 +94,18 @@ export interface VersioningApi { /** * Check whether the `version` satisfies the `range` constraint. */ - matches(version: string, range: string | Range): boolean; + matches(version: string, range: string): boolean; valueToVersion?(version: string): string; + + /** + * @returns true if subRange is entirely contained by superRange, false otherwise, + * and undefined if it cannot determine it. + * + * @param subRange - the sub range + * @param superRange - the dom range + */ + subset?(subRange: string, superRange: string): boolean | undefined; } export interface VersioningApiConstructor { diff --git a/lib/util/cache/memory/types.ts b/lib/util/cache/memory/types.ts new file mode 100644 index 00000000000000..c122e353b083f3 --- /dev/null +++ b/lib/util/cache/memory/types.ts @@ -0,0 +1,4 @@ +export interface LookupStats { + datasource: string; + duration: number; +} diff --git a/lib/util/cache/package/decorator.spec.ts b/lib/util/cache/package/decorator.spec.ts index 6d892c681aec2c..1501b13098997c 100644 --- a/lib/util/cache/package/decorator.spec.ts +++ b/lib/util/cache/package/decorator.spec.ts @@ -1,6 +1,4 @@ import os from 'os'; -import { mock } from 'jest-mock-extended'; -import type { GetReleasesConfig } from '../../../modules/datasource'; import * as memCache from '../memory'; import { cache } from './decorator'; import * as packageCache from '.'; @@ -8,116 +6,140 @@ import * as packageCache from '.'; jest.mock('./file'); describe('util/cache/package/decorator', () => { - const spy = jest.fn(() => Promise.resolve()); + const setCache = jest.spyOn(packageCache, 'set'); - beforeAll(async () => { + let count = 1; + const getValue = jest.fn(() => { + const res = String(100 * count + 10 * count + count); + count += 1; + return Promise.resolve(res); + }); + + beforeEach(async () => { memCache.init(); await packageCache.init({ cacheDir: os.tmpdir() }); + count = 1; }); it('should cache string', async () => { - class MyClass { - @cache({ namespace: 'namespace', key: 'key' }) - public async getNumber(): Promise { - await spy(); - return Math.random(); + class Class { + @cache({ namespace: 'some-namespace', key: 'some-key' }) + public fn(): Promise { + return getValue(); } } - const myClass = new MyClass(); - expect(await myClass.getNumber()).toEqual(await myClass.getNumber()); - expect(await myClass.getNumber()).toBeDefined(); - expect(spy).toHaveBeenCalledTimes(1); + const obj = new Class(); + + expect(await obj.fn()).toBe('111'); + expect(await obj.fn()).toBe('111'); + expect(await obj.fn()).toBe('111'); + + expect(getValue).toHaveBeenCalledTimes(1); + expect(setCache).toHaveBeenCalledOnceWith( + 'some-namespace', + 'some-key', + '111', + 30 + ); }); - it('Do not cache', async () => { - class MyClass { + it('disables cache if cacheability check is false', async () => { + class Class { @cache({ namespace: 'namespace', key: 'key', cacheable: () => false }) - public async getString( - cacheKey: string, - test: string | null - ): Promise { - await spy(); - return test; + public fn(): Promise { + return getValue(); } } - const myClass = new MyClass(); - expect(await myClass.getString('null', null)).toBeNull(); - expect(await myClass.getString('null', null)).toBeNull(); - expect(await myClass.getString('test', 'test')).toBe('test'); - expect(await myClass.getString('test', 'test')).toBe('test'); - expect(spy).toHaveBeenCalledTimes(4); + const obj = new Class(); + + expect(await obj.fn()).toBe('111'); + expect(await obj.fn()).toBe('222'); + expect(await obj.fn()).toBe('333'); + + expect(getValue).toHaveBeenCalledTimes(3); + expect(setCache).not.toHaveBeenCalled(); }); - it('Do cache null', async () => { - class MyClass { - @cache({ namespace: 'namespace', key: (cacheKey, test) => cacheKey }) - public async getString( - cacheKey: string, - test: string | null - ): Promise { - await spy(); - return test; + it('caches null values', async () => { + class Class { + @cache({ namespace: 'namespace', key: 'key' }) + public async fn(val: string | null): Promise { + await getValue(); + return val; } } - const myClass = new MyClass(); - expect(await myClass.getString('null', null)).toBeNull(); - expect(await myClass.getString('null', null)).toBeNull(); - expect(await myClass.getString('test', 'test')).toBe('test'); - expect(await myClass.getString('test', 'test')).toBeDefined(); - expect(spy).toHaveBeenCalledTimes(2); + const obj = new Class(); + + expect(await obj.fn(null)).toBeNull(); + expect(await obj.fn(null)).toBeNull(); + expect(await obj.fn(null)).toBeNull(); + + expect(getValue).toHaveBeenCalledTimes(1); + expect(setCache).toHaveBeenCalledOnceWith('namespace', 'key', null, 30); }); - it('Do not cache undefined', async () => { - class MyClass { - @cache({ namespace: 'namespace', key: 'undefined' }) - public async getString(): Promise { - await spy(); + it('does not cache undefined', async () => { + class Class { + @cache({ namespace: 'namespace', key: 'key' }) + public async fn(): Promise { + await getValue(); return undefined; } } - const myClass = new MyClass(); - expect(await myClass.getString()).toBeUndefined(); - expect(await myClass.getString()).toEqual(await myClass.getString()); - expect(spy).toHaveBeenCalledTimes(3); + const obj = new Class(); + + expect(await obj.fn()).toBeUndefined(); + expect(await obj.fn()).toBeUndefined(); + expect(await obj.fn()).toBeUndefined(); + + expect(getValue).toHaveBeenCalledTimes(3); + expect(setCache).not.toHaveBeenCalled(); }); - it('should cache function', async () => { - class MyClass { + it('computes cache namespace and key from arguments', async () => { + type Arg = { + foo: 'namespace'; + bar: 'key'; + }; + + class Class { @cache({ - namespace: (arg: GetReleasesConfig) => arg.registryUrl ?? 'default', - key: () => 'key', + namespace: (prefix: string, arg: Arg) => `${prefix}-${arg.foo}`, + key: (prefix: string, arg: Arg) => `${prefix}-${arg.bar}`, }) - public async getNumber(_: GetReleasesConfig): Promise { - await spy(); - return Math.random(); + public fn(_prefix: string, _arg: Arg): Promise { + return getValue(); } } - const myClass = new MyClass(); - const getReleasesConfig: GetReleasesConfig = { - registryUrl: 'registry', - ...mock(), - }; - expect(await myClass.getNumber(getReleasesConfig)).toEqual( - await myClass.getNumber(getReleasesConfig) + const obj = new Class(); + const arg: Arg = { foo: 'namespace', bar: 'key' }; + + expect(await obj.fn('some', arg)).toBe('111'); + expect(await obj.fn('some', arg)).toBe('111'); + + expect(getValue).toHaveBeenCalledTimes(1); + expect(setCache).toHaveBeenCalledOnceWith( + 'some-namespace', + 'some-key', + '111', + 30 ); - expect(await myClass.getNumber(getReleasesConfig)).toBeDefined(); - expect(spy).toHaveBeenCalledTimes(1); }); - it('works', async () => { - class MyClass { - public async getNumber(): Promise { - await spy(); - return Math.random(); + it('wraps class methods', async () => { + class Class { + public fn(): Promise { + return getValue(); } } const decorator = cache({ namespace: 'namespace', key: 'key' }); - const getNumber = decorator( - MyClass.prototype, - 'getNumber', - undefined as never - ); + const fn = decorator(Class.prototype, 'fn', undefined as never); + + expect(await fn.value?.()).toBe('111'); + expect(await fn.value?.()).toBe('111'); + expect(await fn.value?.()).toBe('111'); - expect(await getNumber.value?.()).toBeNumber(); + expect(getValue).toHaveBeenCalledTimes(1); + expect(setCache).toHaveBeenCalledOnceWith('namespace', 'key', '111', 30); }); }); diff --git a/lib/util/cache/package/file.spec.ts b/lib/util/cache/package/file.spec.ts index bc15188900ceb9..f34ef5ee3fdf54 100644 --- a/lib/util/cache/package/file.spec.ts +++ b/lib/util/cache/package/file.spec.ts @@ -1,5 +1,6 @@ import os from 'os'; -import { get, init, set } from './file'; +import cacache from 'cacache'; +import { cleanup, get, init, set } from './file'; describe('util/cache/package/file', () => { it('returns if uninitiated', async () => { @@ -23,4 +24,14 @@ describe('util/cache/package/file', () => { await set('test', 'key', 1234, -5); expect(await get('test', 'key')).toBeUndefined(); }); + + it('cleans up', async () => { + const cacheFileName = init(os.tmpdir()); + await set('test', 'valid', 1234); + await set('test', 'expired', 1234, -5); + await cacache.put(cacheFileName, 'invalid', 'not json'); + await cleanup(); + const entries = await cacache.ls(cacheFileName); + expect(Object.keys(entries)).toEqual(['test-valid']); + }); }); diff --git a/lib/util/cache/package/file.ts b/lib/util/cache/package/file.ts index 4ed8baaea7a325..1415f8f2d83bed 100644 --- a/lib/util/cache/package/file.ts +++ b/lib/util/cache/package/file.ts @@ -64,7 +64,42 @@ export async function set( ); } -export function init(cacheDir: string): void { +export function init(cacheDir: string): string { cacheFileName = upath.join(cacheDir, '/renovate/renovate-cache-v1'); logger.debug('Initializing Renovate internal cache into ' + cacheFileName); + return cacheFileName; +} + +export async function cleanup(): Promise { + logger.debug('Checking file package cache for expired items'); + try { + let totalCount = 0; + let deletedCount = 0; + const startTime = Date.now(); + for await (const item of cacache.ls.stream(cacheFileName)) { + totalCount += 1; + const cachedItem = item as unknown as cacache.CacheObject; + const res = await cacache.get(cacheFileName, cachedItem.key); + let cachedValue: any; + try { + cachedValue = JSON.parse(res.data.toString()); + } catch (err) { + logger.debug('Error parsing cached value - deleting'); + } + if ( + !cachedValue || + (cachedValue?.expiry && + DateTime.local() > DateTime.fromISO(cachedValue.expiry)) + ) { + await cacache.rm.entry(cacheFileName, cachedItem.key); + deletedCount += 1; + } + } + const durationMs = Math.round(Date.now() - startTime); + logger.debug( + `Deleted ${deletedCount} of ${totalCount} file cached entries in ${durationMs}ms` + ); + } catch (err) /* istanbul ignore next */ { + logger.warn({ err }, 'Error cleaning up expired file cache'); + } } diff --git a/lib/util/cache/package/index.spec.ts b/lib/util/cache/package/index.spec.ts index 24f1cb5e5f47ad..65bbab5c49b58f 100644 --- a/lib/util/cache/package/index.spec.ts +++ b/lib/util/cache/package/index.spec.ts @@ -7,6 +7,9 @@ describe('util/cache/package/index', () => { it('returns undefined if not initialized', async () => { expect(await get('test', 'missing-key')).toBeUndefined(); expect(await set('test', 'some-key', 'some-value', 5)).toBeUndefined(); + expect(async () => { + await cleanup({}); + }).not.toThrow(); }); it('sets and gets file', async () => { diff --git a/lib/util/cache/package/index.ts b/lib/util/cache/package/index.ts index 635ceea48d84aa..438095147c78c6 100644 --- a/lib/util/cache/package/index.ts +++ b/lib/util/cache/package/index.ts @@ -4,7 +4,7 @@ import * as fileCache from './file'; import * as redisCache from './redis'; import type { PackageCache } from './types'; -let cacheProxy: PackageCache; +let cacheProxy: PackageCache | undefined; function getGlobalKey(namespace: string, key: string): string { return `global%%${namespace}%%${key}`; @@ -65,6 +65,7 @@ export async function init(config: AllConfig): Promise { cacheProxy = { get: fileCache.get, set: fileCache.set, + cleanup: fileCache.cleanup, }; } } @@ -73,4 +74,7 @@ export async function cleanup(config: AllConfig): Promise { if (config?.redisUrl) { await redisCache.end(); } + if (cacheProxy?.cleanup) { + await cacheProxy.cleanup(); + } } diff --git a/lib/util/cache/package/types.ts b/lib/util/cache/package/types.ts index 51fa8a0e7ca520..d345b6d4d2670f 100644 --- a/lib/util/cache/package/types.ts +++ b/lib/util/cache/package/types.ts @@ -7,4 +7,6 @@ export interface PackageCache { value: T, ttlMinutes?: number ): Promise; + + cleanup?(): Promise; } diff --git a/lib/util/emoji.ts b/lib/util/emoji.ts index a6aadb70375743..9fe537dc050079 100644 --- a/lib/util/emoji.ts +++ b/lib/util/emoji.ts @@ -7,8 +7,10 @@ import { } from 'emojibase'; import emojibaseEmojiRegex from 'emojibase-regex/emoji.js'; import SHORTCODE_REGEX from 'emojibase-regex/shortcode.js'; +import { z } from 'zod'; import type { RenovateConfig } from '../config/types'; import dataFiles from '../data-files.generated'; +import { logger } from '../logger'; import { regEx } from './regex'; let unicodeEmoji = true; @@ -17,13 +19,25 @@ let mappingsInitialized = false; const shortCodesByHex = new Map(); const hexCodesByShort = new Map(); +const EmojiShortcodesSchema = z.record( + z.string(), + z.union([z.string(), z.array(z.string())]) +); + function lazyInitMappings(): void { if (!mappingsInitialized) { - const table: Record = JSON.parse( - dataFiles.get('node_modules/emojibase-data/en/shortcodes/github.json')! + const result = EmojiShortcodesSchema.safeParse( + JSON.parse( + dataFiles.get('node_modules/emojibase-data/en/shortcodes/github.json')! + ) ); - for (const [hex, val] of Object.entries(table)) { - const shortCodes: string[] = is.array(val) ? val : [val]; + // istanbul ignore if: not easily testable + if (!result.success) { + logger.warn({ error: result.error }, 'Unable to parse emoji shortcodes'); + return; + } + for (const [hex, val] of Object.entries(result.data)) { + const shortCodes = is.array(val) ? val : [val]; shortCodesByHex.set(hex, `:${shortCodes[0]}:`); shortCodes.forEach((shortCode) => { hexCodesByShort.set(`:${shortCode}:`, hex); diff --git a/lib/util/exec/containerbase.ts b/lib/util/exec/containerbase.ts index 3d7571f160da16..ed55be68f8879c 100644 --- a/lib/util/exec/containerbase.ts +++ b/lib/util/exec/containerbase.ts @@ -17,138 +17,144 @@ import type { Opt, ToolConfig, ToolConstraint } from './types'; const allToolConfig: Record = { bundler: { datasource: 'rubygems', - depName: 'bundler', + packageName: 'bundler', versioning: rubyVersioningId, }, cocoapods: { datasource: 'rubygems', - depName: 'cocoapods', + packageName: 'cocoapods', versioning: rubyVersioningId, }, composer: { datasource: 'github-releases', - depName: 'composer/composer', + packageName: 'composer/composer', versioning: composerVersioningId, }, corepack: { datasource: 'npm', - depName: 'corepack', + packageName: 'corepack', versioning: npmVersioningId, }, dotnet: { datasource: 'dotnet-version', - depName: 'dotnet-sdk', + packageName: 'dotnet-sdk', versioning: semverVersioningId, }, erlang: { datasource: 'github-releases', - depName: 'containerbase/erlang-prebuild', + packageName: 'containerbase/erlang-prebuild', versioning: semverCoercedVersioningId, }, elixir: { datasource: 'github-releases', - depName: 'elixir-lang/elixir', + packageName: 'elixir-lang/elixir', versioning: semverVersioningId, }, flux: { datasource: 'github-releases', - depName: 'fluxcd/flux2', + packageName: 'fluxcd/flux2', versioning: semverVersioningId, }, golang: { datasource: 'golang-version', - depName: 'golang', + packageName: 'golang', versioning: npmVersioningId, }, helm: { datasource: 'github-releases', - depName: 'helm/helm', + packageName: 'helm/helm', versioning: semverVersioningId, }, helmfile: { datasource: 'github-releases', - depName: 'helmfile/helmfile', + packageName: 'helmfile/helmfile', versioning: semverVersioningId, }, java: { datasource: 'java-version', - depName: 'java', + packageName: 'java', versioning: npmVersioningId, }, jb: { datasource: 'github-releases', - depName: 'jsonnet-bundler/jsonnet-bundler', + packageName: 'jsonnet-bundler/jsonnet-bundler', + versioning: semverVersioningId, + }, + kustomize: { + datasource: 'github-releases', + packageName: 'kubernetes-sigs/kustomize', + extractVersion: '^kustomize/v(?.*)$', versioning: semverVersioningId, }, lerna: { datasource: 'npm', - depName: 'lerna', + packageName: 'lerna', versioning: npmVersioningId, }, nix: { datasource: 'github-tags', - depName: 'NixOS/nix', + packageName: 'NixOS/nix', versioning: semverVersioningId, }, node: { datasource: 'node', - depName: 'node', + packageName: 'node', versioning: nodeVersioningId, }, npm: { datasource: 'npm', - depName: 'npm', + packageName: 'npm', hash: true, versioning: npmVersioningId, }, php: { datasource: 'github-releases', - depName: 'containerbase/php-prebuild', + packageName: 'containerbase/php-prebuild', versioning: composerVersioningId, }, pnpm: { datasource: 'npm', - depName: 'pnpm', + packageName: 'pnpm', versioning: npmVersioningId, }, poetry: { datasource: 'pypi', - depName: 'poetry', + packageName: 'poetry', versioning: pep440VersioningId, }, python: { datasource: 'github-releases', - depName: 'containerbase/python-prebuild', + packageName: 'containerbase/python-prebuild', versioning: pythonVersioningId, }, ruby: { datasource: 'github-releases', - depName: 'containerbase/ruby-prebuild', + packageName: 'containerbase/ruby-prebuild', versioning: rubyVersioningId, }, rust: { datasource: 'docker', - depName: 'rust', + packageName: 'rust', versioning: semverVersioningId, }, yarn: { datasource: 'npm', - depName: 'yarn', + packageName: 'yarn', versioning: npmVersioningId, }, 'yarn-slim': { datasource: 'npm', - depName: 'yarn', + packageName: 'yarn', versioning: npmVersioningId, }, dart: { datasource: 'dart-version', - depName: 'dart', + packageName: 'dart', versioning: semverVersioningId, }, flutter: { datasource: 'flutter-version', - depName: 'flutter', + packageName: 'flutter', versioning: semverVersioningId, }, }; diff --git a/lib/util/exec/docker/index.spec.ts b/lib/util/exec/docker/index.spec.ts index 8231750f0d7a24..cdbfade27138d0 100644 --- a/lib/util/exec/docker/index.spec.ts +++ b/lib/util/exec/docker/index.spec.ts @@ -216,7 +216,7 @@ describe('util/exec/docker/index', () => { (vol ? `${vol} ` : '') + `-e FOO -e BAR ` + `-w "/tmp/foobar" ` + - `renovate/${img} ` + + `containerbase/${img} ` + `bash -l -c "foo && bar"`; beforeEach(() => { diff --git a/lib/util/exec/docker/index.ts b/lib/util/exec/docker/index.ts index d980793c2e3879..9d192db5908359 100644 --- a/lib/util/exec/docker/index.ts +++ b/lib/util/exec/docker/index.ts @@ -81,7 +81,7 @@ function prepareCommands(commands: Opt[]): string[] { } export async function getDockerTag( - depName: string, + packageName: string, constraint: string, scheme: string ): Promise { @@ -96,12 +96,12 @@ export async function getDockerTag( } logger.debug( - { depName, scheme, constraint }, + { packageName, scheme, constraint }, `Found version constraint - checking for a compatible image to use` ); const imageReleases = await getPkgReleases({ datasource: 'docker', - depName, + packageName, versioning: scheme, }); if (imageReleases?.releases) { @@ -117,17 +117,17 @@ export async function getDockerTag( const version = versions.sort(ver.sortVersions.bind(ver)).pop(); if (version) { logger.debug( - { depName, scheme, constraint, version }, + { packageName, scheme, constraint, version }, `Found compatible image version` ); return version; } } else { - logger.error(`No ${depName} releases found`); + logger.error(`No ${packageName} releases found`); return 'latest'; } logger.warn( - { depName, constraint, scheme }, + { packageName, constraint, scheme }, 'Failed to find a tag satisfying constraint, using "latest" tag instead' ); return 'latest'; @@ -259,7 +259,9 @@ export async function generateDockerCommand( result.push(`-w "${cwd}"`); } - image = `${ensureTrailingSlash(dockerImagePrefix ?? 'renovate')}${image}`; + image = `${ensureTrailingSlash( + dockerImagePrefix ?? 'containerbase' + )}${image}`; // TODO: add constraint: const tag = getDockerTag(image, sideCarImageVersion, 'semver'); logger.debug( diff --git a/lib/util/exec/index.spec.ts b/lib/util/exec/index.spec.ts index 03f36081d68b88..909880e061ad0e 100644 --- a/lib/util/exec/index.spec.ts +++ b/lib/util/exec/index.spec.ts @@ -54,7 +54,7 @@ describe('util/exec/index', () => { }); const image = dockerModule.sideCarImage; - const fullImage = `renovate/${image}`; + const fullImage = `containerbase/${image}`; const name = `renovate_${image}`; const inCmd = 'echo hello'; const outCmd = ['echo hello']; @@ -397,9 +397,9 @@ describe('util/exec/index', () => { inCmd, inOpts: { docker }, outCmd: [ - `docker pull ghcr.io/renovatebot/${image}`, + `docker pull ghcr.io/containerbase/${image}`, dockerRemoveCmd, - `docker run --rm --name=${name} --label=renovate_child ${defaultVolumes} -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "${cwd}" ghcr.io/renovatebot/${image} bash -l -c "${inCmd}"`, + `docker run --rm --name=${name} --label=renovate_child ${defaultVolumes} -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR -w "${cwd}" ghcr.io/containerbase/${image} bash -l -c "${inCmd}"`, ], outOpts: [ dockerPullOpts, @@ -413,7 +413,7 @@ describe('util/exec/index', () => { }, ], adminConfig: { - dockerImagePrefix: 'ghcr.io/renovatebot', + dockerImagePrefix: 'ghcr.io/containerbase', binarySource: 'docker', }, }, @@ -792,17 +792,17 @@ describe('util/exec/index', () => { expect(actualCmd).toEqual([ `echo hello`, `echo hello`, - `docker pull renovate/${image}`, + `docker pull ${fullImage}`, `docker ps --filter name=renovate_${image} -aq`, - `docker run --rm --name=renovate_${image} --label=renovate_child ${defaultCacheVolume} -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR renovate/${image} bash -l -c "echo hello"`, + `docker run --rm --name=renovate_${image} --label=renovate_child ${defaultCacheVolume} -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR ${fullImage} bash -l -c "echo hello"`, `docker ps --filter name=renovate_${image} -aq`, - `docker run --rm --name=renovate_${image} --label=renovate_child ${defaultCacheVolume} -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR renovate/${image} bash -l -c "echo hello"`, + `docker run --rm --name=renovate_${image} --label=renovate_child ${defaultCacheVolume} -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR ${fullImage} bash -l -c "echo hello"`, `echo hello`, `echo hello`, `docker ps --filter name=renovate_${image} -aq`, - `docker run --rm --name=renovate_${image} --label=renovate_child ${defaultCacheVolume} -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR renovate/${image} bash -l -c "echo hello"`, + `docker run --rm --name=renovate_${image} --label=renovate_child ${defaultCacheVolume} -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR ${fullImage} bash -l -c "echo hello"`, `docker ps --filter name=renovate_${image} -aq`, - `docker run --rm --name=renovate_${image} --label=renovate_child ${defaultCacheVolume} -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR renovate/${image} bash -l -c "echo hello"`, + `docker run --rm --name=renovate_${image} --label=renovate_child ${defaultCacheVolume} -e BUILDPACK_CACHE_DIR -e CONTAINERBASE_CACHE_DIR ${fullImage} bash -l -c "echo hello"`, ]); }); diff --git a/lib/util/exec/index.ts b/lib/util/exec/index.ts index ccb99ef13e9a42..c3e802ae892168 100644 --- a/lib/util/exec/index.ts +++ b/lib/util/exec/index.ts @@ -187,7 +187,8 @@ export async function exec( try { res = await rawExec(rawCmd, rawOptions); } catch (err) { - logger.debug({ err }, 'rawExec err'); + const durationMs = Math.round(Date.now() - startTime); + logger.debug({ err, durationMs }, 'rawExec err'); if (useDocker) { await removeDockerContainer(sideCarImage, dockerChildPrefix).catch( (removeErr: Error) => { diff --git a/lib/util/exec/types.ts b/lib/util/exec/types.ts index 14f7d78d5c678f..80cedbe66da617 100644 --- a/lib/util/exec/types.ts +++ b/lib/util/exec/types.ts @@ -7,7 +7,8 @@ export interface ToolConstraint { export interface ToolConfig { datasource: string; - depName: string; + extractVersion?: string; + packageName: string; hash?: boolean; versioning: string; } diff --git a/lib/util/git/index.ts b/lib/util/git/index.ts index 6df7303b275c57..37ec3f5eef35ab 100644 --- a/lib/util/git/index.ts +++ b/lib/util/git/index.ts @@ -31,7 +31,10 @@ import { incLimitedValue } from '../../workers/global/limits'; import { getCache } from '../cache/repository'; import { newlineRegex, regEx } from '../regex'; import { parseGitAuthor } from './author'; -import { getCachedBehindBaseResult } from './behind-base-branch-cache'; +import { + getCachedBehindBaseResult, + setCachedBehindBaseResult, +} from './behind-base-branch-cache'; import { getNoVerify, simpleGitConfig } from './config'; import { getCachedConflictResult, @@ -108,10 +111,6 @@ export async function gitRetry(gitFunc: () => Promise): Promise { throw lastError; } -function localName(branchName: string): string { - return branchName.replace(regEx(/^origin\//), ''); -} - async function isDirectory(dir: string): Promise { try { return (await fs.stat(dir)).isDirectory(); @@ -568,11 +567,13 @@ export async function isBranchBehindBase( branchName: string, baseBranch: string ): Promise { + const baseBranchSha = getBranchCommit(baseBranch); + const branchSha = getBranchCommit(branchName); let isBehind = getCachedBehindBaseResult( branchName, - getBranchCommit(branchName), // branch sha + branchSha, baseBranch, - getBranchCommit(baseBranch) // base branch sha + baseBranchSha ); if (isBehind !== null) { logger.debug(`branch.isBehindBase(): using cached result "${isBehind}"`); @@ -583,18 +584,15 @@ export async function isBranchBehindBase( await syncGit(); try { - const { currentBranchSha, currentBranch } = config; - const branches = await git.branch([ - '--remotes', - '--verbose', - '--contains', - config.currentBranchSha, - ]); - isBehind = !branches.all.map(localName).includes(branchName); + const behindCount = ( + await git.raw(['rev-list', '--count', `${branchSha!}..${baseBranchSha!}`]) + ).trim(); + isBehind = behindCount !== '0'; logger.debug( - { currentBranch, currentBranchSha }, + { baseBranch, branchName }, `branch.isBehindBase(): ${isBehind}` ); + setCachedBehindBaseResult(branchName, isBehind); return isBehind; } catch (err) /* istanbul ignore next */ { const errChecked = checkForPlatformFailure(err); diff --git a/lib/util/git/types.ts b/lib/util/git/types.ts index ef0e18e86c8744..bacf172951c0dc 100644 --- a/lib/util/git/types.ts +++ b/lib/util/git/types.ts @@ -25,6 +25,7 @@ export interface LocalConfig extends StorageConfig { currentBranchSha: string; branchCommits: Record; branchIsModified: Record; + commitBranches: Record; ignoredAuthors: string[]; gitAuthorName?: string | null; gitAuthorEmail?: string; diff --git a/lib/util/github/graphql/cache-strategies/abstract-cache-strategy.ts b/lib/util/github/graphql/cache-strategies/abstract-cache-strategy.ts index 26d75d8d54c358..07a29b0d126de6 100644 --- a/lib/util/github/graphql/cache-strategies/abstract-cache-strategy.ts +++ b/lib/util/github/graphql/cache-strategies/abstract-cache-strategy.ts @@ -1,3 +1,4 @@ +import { dequal } from 'dequal'; import { DateTime } from 'luxon'; import type { GithubDatasourceItem, @@ -35,7 +36,20 @@ export abstract class AbstractGithubGraphqlCacheStrategy< */ private items: Record | undefined; protected createdAt = this.now; - protected updatedAt = this.now; + + /** + * This flag helps to indicate whether the cache record + * should be persisted after the current cache access cycle. + */ + protected hasUpdatedItems = false; + + /** + * Loading and persisting data is delegated to the concrete strategy. + */ + abstract load(): Promise | undefined>; + abstract persist( + cacheRecord: GithubGraphqlCacheRecord + ): Promise; constructor( protected readonly cacheNs: string, @@ -54,7 +68,6 @@ export abstract class AbstractGithubGraphqlCacheStrategy< let result: GithubGraphqlCacheRecord = { items: {}, createdAt: this.createdAt.toISO(), - updatedAt: this.updatedAt.toISO(), }; const storedData = await this.load(); @@ -68,7 +81,6 @@ export abstract class AbstractGithubGraphqlCacheStrategy< } this.createdAt = DateTime.fromISO(result.createdAt); - this.updatedAt = DateTime.fromISO(result.updatedAt); this.items = result.items; return this.items; } @@ -99,9 +111,14 @@ export abstract class AbstractGithubGraphqlCacheStrategy< // If we reached previously stored item that is stabilized, // we assume the further pagination will not yield any new items. const oldItem = cachedItems[version]; - if (oldItem && this.isStabilized(oldItem)) { - isPaginationDone = true; - break; + if (oldItem) { + if (this.isStabilized(oldItem)) { + isPaginationDone = true; + } + + if (!dequal(oldItem, item)) { + this.hasUpdatedItems = true; + } } cachedItems[version] = item; @@ -130,23 +147,11 @@ export abstract class AbstractGithubGraphqlCacheStrategy< return Object.values(resultItems); } - /** - * Update `updatedAt` field and persist the data. - */ private async store(cachedItems: Record): Promise { const cacheRecord: GithubGraphqlCacheRecord = { items: cachedItems, createdAt: this.createdAt.toISO(), - updatedAt: this.now.toISO(), }; await this.persist(cacheRecord); } - - /** - * Loading and persisting data is delegated to the concrete strategy. - */ - abstract load(): Promise | undefined>; - abstract persist( - cacheRecord: GithubGraphqlCacheRecord - ): Promise; } diff --git a/lib/util/github/graphql/cache-strategies/memory-cache-strategy.spec.ts b/lib/util/github/graphql/cache-strategies/memory-cache-strategy.spec.ts index 1e725e36c5b4c4..96e88b48bf4ca3 100644 --- a/lib/util/github/graphql/cache-strategies/memory-cache-strategy.spec.ts +++ b/lib/util/github/graphql/cache-strategies/memory-cache-strategy.spec.ts @@ -26,7 +26,6 @@ describe('util/github/graphql/cache-strategies/memory-cache-strategy', () => { const cacheRecord: CacheRecord = { items, createdAt: isoTs('2022-10-01 15:30'), - updatedAt: isoTs('2022-10-30 12:35'), }; memCache.set('github-graphql-cache:foo:bar', clone(cacheRecord)); @@ -40,10 +39,7 @@ describe('util/github/graphql/cache-strategies/memory-cache-strategy', () => { expect(res).toEqual(Object.values(items)); expect(isPaginationDone).toBe(true); - expect(memCache.get('github-graphql-cache:foo:bar')).toEqual({ - ...cacheRecord, - updatedAt: isoTs(now), - }); + expect(memCache.get('github-graphql-cache:foo:bar')).toEqual(cacheRecord); // One second later, the cache is invalid now = '2022-10-31 15:30:00'; @@ -58,7 +54,6 @@ describe('util/github/graphql/cache-strategies/memory-cache-strategy', () => { expect(memCache.get('github-graphql-cache:foo:bar')).toEqual({ items: {}, createdAt: isoTs(now), - updatedAt: isoTs(now), }); }); @@ -71,7 +66,6 @@ describe('util/github/graphql/cache-strategies/memory-cache-strategy', () => { const cacheRecord: CacheRecord = { items: oldItems, createdAt: isoTs('2022-10-30 12:00'), - updatedAt: isoTs('2022-10-30 12:00'), }; memCache.set('github-graphql-cache:foo:bar', clone(cacheRecord)); @@ -96,7 +90,6 @@ describe('util/github/graphql/cache-strategies/memory-cache-strategy', () => { '4': newItem, }, createdAt: isoTs('2022-10-30 12:00'), - updatedAt: isoTs(now), }); }); @@ -109,7 +102,6 @@ describe('util/github/graphql/cache-strategies/memory-cache-strategy', () => { const cacheRecord: CacheRecord = { items: oldItems, createdAt: isoTs('2022-10-30 12:00'), - updatedAt: isoTs('2022-10-30 12:00'), }; memCache.set('github-graphql-cache:foo:bar', clone(cacheRecord)); @@ -127,6 +119,42 @@ describe('util/github/graphql/cache-strategies/memory-cache-strategy', () => { expect(isPaginationDone).toBe(true); }); + it('reconciles entire page', async () => { + const oldItems = { + '1': { releaseTimestamp: isoTs('2020-01-01 00:00'), version: '1' }, + '2': { releaseTimestamp: isoTs('2020-01-01 01:00'), version: '2' }, + '3': { releaseTimestamp: isoTs('2020-01-01 02:00'), version: '3' }, + }; + const cacheRecord: CacheRecord = { + items: oldItems, + createdAt: isoTs('2022-12-31 12:00'), + }; + memCache.set('github-graphql-cache:foo:bar', clone(cacheRecord)); + + const now = '2022-12-31 23:59'; + mockTime(now); + + const page = [ + { version: '1', releaseTimestamp: isoTs('2022-12-31 10:00') }, + { version: '2', releaseTimestamp: isoTs('2022-12-31 11:00') }, + { version: '3', releaseTimestamp: isoTs('2022-12-31 12:00') }, + { version: '4', releaseTimestamp: isoTs('2022-12-31 13:00') }, + ].reverse(); + + const strategy = new GithubGraphqlMemoryCacheStrategy('foo', 'bar'); + const isPaginationDone = await strategy.reconcile(page); + + expect(isPaginationDone).toBe(true); + expect(memCache.get('github-graphql-cache:foo:bar')).toMatchObject({ + items: { + '1': { releaseTimestamp: isoTs('2022-12-31 10:00') }, + '2': { releaseTimestamp: isoTs('2022-12-31 11:00') }, + '3': { releaseTimestamp: isoTs('2022-12-31 12:00') }, + '4': { releaseTimestamp: isoTs('2022-12-31 13:00') }, + }, + }); + }); + it('detects removed packages', async () => { const items = { // stabilized @@ -144,7 +172,6 @@ describe('util/github/graphql/cache-strategies/memory-cache-strategy', () => { const cacheRecord: CacheRecord = { items, createdAt: isoTs('2022-10-30 12:00'), - updatedAt: isoTs('2022-10-30 12:00'), }; memCache.set('github-graphql-cache:foo:bar', clone(cacheRecord)); @@ -182,7 +209,6 @@ describe('util/github/graphql/cache-strategies/memory-cache-strategy', () => { '8': { version: '8', releaseTimestamp: isoTs('2022-10-08 10:00') }, }, createdAt: isoTs('2022-10-30 12:00'), - updatedAt: isoTs('2022-10-31 15:30'), }); }); }); diff --git a/lib/util/github/graphql/cache-strategies/package-cache-strategy.spec.ts b/lib/util/github/graphql/cache-strategies/package-cache-strategy.spec.ts index 0e2f3f6c8ba6d2..ea2809c2e0a8c4 100644 --- a/lib/util/github/graphql/cache-strategies/package-cache-strategy.spec.ts +++ b/lib/util/github/graphql/cache-strategies/package-cache-strategy.spec.ts @@ -18,46 +18,52 @@ describe('util/github/graphql/cache-strategies/package-cache-strategy', () => { const cacheSet = jest.spyOn(packageCache, 'set'); it('reconciles old cache record with new items', async () => { + const item1 = { version: '1', releaseTimestamp: isoTs('2020-01-01 10:00') }; + const item2 = { version: '2', releaseTimestamp: isoTs('2020-01-01 11:00') }; + const item3 = { version: '3', releaseTimestamp: isoTs('2020-01-01 12:00') }; + const oldItems = { - '1': { version: '1', releaseTimestamp: isoTs('2020-01-01 10:00') }, - '2': { version: '2', releaseTimestamp: isoTs('2020-01-01 11:00') }, - '3': { version: '3', releaseTimestamp: isoTs('2020-01-01 12:00') }, + '1': item1, + '2': item2, + '3': item3, }; const cacheRecord: CacheRecord = { items: oldItems, createdAt: isoTs('2022-10-15 12:00'), - updatedAt: isoTs('2022-10-15 12:00'), }; cacheGet.mockResolvedValueOnce(clone(cacheRecord)); const now = '2022-10-30 12:00'; mockTime(now); + const updatedItem = { + ...item3, + releaseTimestamp: isoTs('2020-01-01 12:30'), + }; const newItem = { version: '4', releaseTimestamp: isoTs('2022-10-15 18:00'), }; - const page = [newItem]; + const page = [newItem, updatedItem]; const strategy = new GithubGraphqlPackageCacheStrategy('foo', 'bar'); const isPaginationDone = await strategy.reconcile(page); const res = await strategy.finalize(); - expect(res).toEqual([...Object.values(oldItems), newItem]); - expect(isPaginationDone).toBe(false); + expect(res).toEqual([item1, item2, updatedItem, newItem]); + expect(isPaginationDone).toBe(true); expect(cacheSet.mock.calls).toEqual([ [ 'foo', 'bar', { items: { - '1': { version: '1', releaseTimestamp: isoTs('2020-01-01 10:00') }, - '2': { version: '2', releaseTimestamp: isoTs('2020-01-01 11:00') }, - '3': { version: '3', releaseTimestamp: isoTs('2020-01-01 12:00') }, - '4': { version: '4', releaseTimestamp: isoTs('2022-10-15 18:00') }, + '1': item1, + '2': item2, + '3': updatedItem, + '4': newItem, }, createdAt: isoTs('2022-10-15 12:00'), - updatedAt: isoTs('2022-10-30 12:00'), }, 15 * 24 * 60, ], diff --git a/lib/util/github/graphql/cache-strategies/package-cache-strategy.ts b/lib/util/github/graphql/cache-strategies/package-cache-strategy.ts index 4bafebda533523..1de0b93b52312d 100644 --- a/lib/util/github/graphql/cache-strategies/package-cache-strategy.ts +++ b/lib/util/github/graphql/cache-strategies/package-cache-strategy.ts @@ -15,17 +15,19 @@ export class GithubGraphqlPackageCacheStrategy< async persist( cacheRecord: GithubGraphqlCacheRecord ): Promise { - const expiry = this.createdAt.plus({ - days: AbstractGithubGraphqlCacheStrategy.cacheTTLDays, - }); - const ttlMinutes = expiry.diff(this.now, ['minutes']).as('minutes'); - if (ttlMinutes && ttlMinutes > 0) { - await packageCache.set( - this.cacheNs, - this.cacheKey, - cacheRecord, - ttlMinutes - ); + if (this.hasUpdatedItems) { + const expiry = this.createdAt.plus({ + days: AbstractGithubGraphqlCacheStrategy.cacheTTLDays, + }); + const ttlMinutes = expiry.diff(this.now, ['minutes']).as('minutes'); + if (ttlMinutes && ttlMinutes > 0) { + await packageCache.set( + this.cacheNs, + this.cacheKey, + cacheRecord, + ttlMinutes + ); + } } } } diff --git a/lib/util/github/graphql/datasource-fetcher.spec.ts b/lib/util/github/graphql/datasource-fetcher.spec.ts index 673a96c0eefa29..e9489664772f8c 100644 --- a/lib/util/github/graphql/datasource-fetcher.spec.ts +++ b/lib/util/github/graphql/datasource-fetcher.spec.ts @@ -44,11 +44,14 @@ const adapter: GithubGraphqlDatasourceAdapter< version, releaseTimestamp, foo, - }: TestAdapterInput): TestAdapterOutput => ({ - version, - releaseTimestamp, - bar: foo, - }), + }: TestAdapterInput): TestAdapterOutput | null => + version && releaseTimestamp && foo + ? { + version, + releaseTimestamp, + bar: foo, + } + : null, }; function resp( @@ -208,6 +211,7 @@ describe('util/github/graphql/datasource-fetcher', () => { resp(false, [ { version: v3, releaseTimestamp: t3, foo: '3' }, { version: v2, releaseTimestamp: t2, foo: '2' }, + {} as never, { version: v1, releaseTimestamp: t1, foo: '1' }, ]) ); diff --git a/lib/util/github/graphql/datasource-fetcher.ts b/lib/util/github/graphql/datasource-fetcher.ts index 6ab09ebb56f75d..ca53fb6eff753b 100644 --- a/lib/util/github/graphql/datasource-fetcher.ts +++ b/lib/util/github/graphql/datasource-fetcher.ts @@ -239,8 +239,14 @@ export class GithubGraphqlDatasourceFetcher< const resultItems: ResultItem[] = []; for (const node of queryResult.nodes) { const item = this.datasourceAdapter.transform(node); - // istanbul ignore if: will be tested later if (!item) { + logger.once.info( + { + packageName: `${this.repoOwner}/${this.repoName}`, + baseUrl: this.baseUrl, + }, + `GitHub GraphQL datasource: skipping empty item` + ); continue; } resultItems.push(item); diff --git a/lib/util/github/graphql/index.spec.ts b/lib/util/github/graphql/index.spec.ts index 315ee6afc57cdd..a234bac6dd19c0 100644 --- a/lib/util/github/graphql/index.spec.ts +++ b/lib/util/github/graphql/index.spec.ts @@ -52,12 +52,14 @@ describe('util/github/graphql/index', () => { payload: { nodes: [ { - id: 123, - name: 'name', - description: 'description', version: '1.2.3', releaseTimestamp: '2024-09-24', + isDraft: false, + isPrerelease: false, url: 'https://example.com', + id: 123, + name: 'name', + description: 'description', }, ], }, @@ -69,12 +71,12 @@ describe('util/github/graphql/index', () => { expect(res).toEqual([ { - id: 123, - name: 'name', - description: 'description', version: '1.2.3', releaseTimestamp: '2024-09-24', url: 'https://example.com', + id: 123, + name: 'name', + description: 'description', }, ]); }); diff --git a/lib/util/github/graphql/query-adapters/releases-query-adapter.spec.ts b/lib/util/github/graphql/query-adapters/releases-query-adapter.spec.ts index 0bd88165e6b2d9..7e874c311eff30 100644 --- a/lib/util/github/graphql/query-adapters/releases-query-adapter.spec.ts +++ b/lib/util/github/graphql/query-adapters/releases-query-adapter.spec.ts @@ -1,5 +1,5 @@ -import type { GithubGraphqlRelease } from '../types'; import { adapter } from './releases-query-adapter'; +import type { GithubGraphqlRelease } from './releases-query-adapter'; const item: GithubGraphqlRelease = { version: '1.2.3', @@ -28,6 +28,10 @@ describe('util/github/graphql/query-adapters/releases-query-adapter', () => { expect(adapter.transform({ ...item, isDraft: true })).toBeNull(); }); + it('handles invalid items', () => { + expect(adapter.transform({} as never)).toBeNull(); + }); + it('marks prereleases as unstable', () => { expect(adapter.transform({ ...item, isPrerelease: true })).toMatchObject({ isStable: false, diff --git a/lib/util/github/graphql/query-adapters/releases-query-adapter.ts b/lib/util/github/graphql/query-adapters/releases-query-adapter.ts index e149a0b25a4ced..65cf0cfb10a2d5 100644 --- a/lib/util/github/graphql/query-adapters/releases-query-adapter.ts +++ b/lib/util/github/graphql/query-adapters/releases-query-adapter.ts @@ -1,6 +1,6 @@ +import { z } from 'zod'; import type { GithubGraphqlDatasourceAdapter, - GithubGraphqlRelease, GithubReleaseItem, } from '../types'; import { prepareQuery } from '../util'; @@ -30,7 +30,24 @@ const query = prepareQuery(` } `); +const GithubGraphqlRelease = z.object({ + version: z.string(), + releaseTimestamp: z.string(), + isDraft: z.boolean(), + isPrerelease: z.boolean(), + url: z.string(), + id: z.number().nullable(), + name: z.string().nullable(), + description: z.string().nullable(), +}); +export type GithubGraphqlRelease = z.infer; + function transform(item: GithubGraphqlRelease): GithubReleaseItem | null { + const releaseItem = GithubGraphqlRelease.safeParse(item); + if (!releaseItem.success) { + return null; + } + const { version, releaseTimestamp, @@ -40,7 +57,7 @@ function transform(item: GithubGraphqlRelease): GithubReleaseItem | null { id, name, description, - } = item; + } = releaseItem.data; if (isDraft) { return null; @@ -50,11 +67,20 @@ function transform(item: GithubGraphqlRelease): GithubReleaseItem | null { version, releaseTimestamp, url, - id, - name, - description, }; + if (id) { + result.id = id; + } + + if (name) { + result.name = name; + } + + if (description) { + result.description = description; + } + if (isPrerelease) { result.isStable = false; } diff --git a/lib/util/github/graphql/query-adapters/tags-query-adapter.ts b/lib/util/github/graphql/query-adapters/tags-query-adapter.ts index 7d1e034bfa1595..0fbb2cf7728ccc 100644 --- a/lib/util/github/graphql/query-adapters/tags-query-adapter.ts +++ b/lib/util/github/graphql/query-adapters/tags-query-adapter.ts @@ -1,12 +1,30 @@ -import type { - GithubGraphqlDatasourceAdapter, - GithubGraphqlTag, - GithubTagItem, -} from '../types'; +import { z } from 'zod'; +import type { GithubGraphqlDatasourceAdapter, GithubTagItem } from '../types'; import { prepareQuery } from '../util'; const key = 'github-tags-datasource-v2'; +const GithubGraphqlTag = z.object({ + version: z.string(), + target: z.union([ + z.object({ + type: z.literal('Commit'), + oid: z.string(), + releaseTimestamp: z.string(), + }), + z.object({ + type: z.literal('Tag'), + target: z.object({ + oid: z.string(), + }), + tagger: z.object({ + releaseTimestamp: z.string(), + }), + }), + ]), +}); +export type GithubGraphqlTag = z.infer; + const query = prepareQuery(` refs( first: $count @@ -41,16 +59,17 @@ const query = prepareQuery(` }`); function transform(item: GithubGraphqlTag): GithubTagItem | null { - const { version, target } = item; - if (target.type === 'Commit') { - const { oid: hash, releaseTimestamp } = target; - return { version, gitRef: version, hash, releaseTimestamp }; - } else if (target.type === 'Tag') { - const { oid: hash } = target.target; - const { releaseTimestamp } = target.tagger; - return { version, gitRef: version, hash, releaseTimestamp }; + const res = GithubGraphqlTag.safeParse(item); + if (!res.success) { + return null; } - return null; + const { version, target } = item; + const releaseTimestamp = + target.type === 'Commit' + ? target.releaseTimestamp + : target.tagger.releaseTimestamp; + const hash = target.type === 'Commit' ? target.oid : target.target.oid; + return { version, gitRef: version, hash, releaseTimestamp }; } export const adapter: GithubGraphqlDatasourceAdapter< diff --git a/lib/util/github/graphql/readme.md b/lib/util/github/graphql/readme.md index 002a45c11530c1..6a094e4cbf7f6d 100644 --- a/lib/util/github/graphql/readme.md +++ b/lib/util/github/graphql/readme.md @@ -99,7 +99,6 @@ As we retrieve items during the fetch process, we gradually construct a data str "2.0.0": { "version": "2.0.0", "releaseTimestamp": "2022-09-01" }, }, "createdAt": "2022-12-20", - "updatedAt": "2022-12-20", } ``` @@ -159,7 +158,6 @@ Given we performed fetch at the day of latest release, new cache looks like: "2.0.0": { "version": "2.0.0", "releaseTimestamp": "2022-09-01" }, }, "createdAt": "2022-12-20", - "updatedAt": "2022-12-30", } ``` diff --git a/lib/util/github/graphql/types.ts b/lib/util/github/graphql/types.ts index 7b20caeed7b8b2..41344df196f769 100644 --- a/lib/util/github/graphql/types.ts +++ b/lib/util/github/graphql/types.ts @@ -55,21 +55,7 @@ export interface GithubPackageConfig { /** * Default: https://api.github.com */ - registryUrl?: string; -} - -/** - * GraphQL shape for releases - */ -export interface GithubGraphqlRelease { - version: string; - releaseTimestamp: string; - isDraft: boolean; - isPrerelease: boolean; - url: string; - id: number; - name: string; - description: string; + registryUrl?: string | undefined; } /** @@ -78,31 +64,9 @@ export interface GithubGraphqlRelease { export interface GithubReleaseItem extends GithubDatasourceItem { isStable?: boolean; url: string; - id: number; - name: string; - description: string; -} - -/** - * GraphQL shape for tags - */ -export interface GithubGraphqlTag { - version: string; - target: - | { - type: 'Commit'; - oid: string; - releaseTimestamp: string; - } - | { - type: 'Tag'; - target: { - oid: string; - }; - tagger: { - releaseTimestamp: string; - }; - }; + id?: number; + name?: string; + description?: string; } /** @@ -128,7 +92,6 @@ export interface GithubGraphqlCacheRecord< > { items: Record; createdAt: string; - updatedAt: string; } export interface GithubGraphqlCacheStrategy< diff --git a/lib/util/github/tags.spec.ts b/lib/util/github/tags.spec.ts new file mode 100644 index 00000000000000..9747b8acf12846 --- /dev/null +++ b/lib/util/github/tags.spec.ts @@ -0,0 +1,78 @@ +import { GithubHttp } from '../http/github'; +import * as githubGraphql from './graphql'; +import { findCommitOfTag } from './tags'; + +describe('util/github/tags', () => { + describe('findCommitOfTag', () => { + const http = new GithubHttp(); + const queryTagsSpy = jest.spyOn(githubGraphql, 'queryTags'); + + it('should be able to find the hash of a Git tag', async () => { + queryTagsSpy.mockResolvedValueOnce([ + { + version: 'v1.0.0', + gitRef: 'v1.0.0', + releaseTimestamp: '2021-01-01', + hash: '123', + }, + { + version: 'v2.0.0', + gitRef: 'v2.0.0', + releaseTimestamp: '2022-01-01', + hash: 'abc', + }, + ]); + + const commit = await findCommitOfTag( + undefined, + 'some-org/repo', + 'v2.0.0', + http + ); + expect(commit).toBe('abc'); + }); + + it('should support passing a custom registry URL', async () => { + queryTagsSpy.mockResolvedValueOnce([]); + + const commit = await findCommitOfTag( + 'https://my-enterprise-github.dev', + 'some-org/repo', + 'v2.0.0', + http + ); + expect(commit).toBeNull(); + expect(githubGraphql.queryTags).toHaveBeenCalledWith( + { + packageName: 'some-org/repo', + registryUrl: 'https://my-enterprise-github.dev', + }, + http + ); + }); + + it('should return `null` if the tag does not exist', async () => { + queryTagsSpy.mockResolvedValueOnce([]); + + const commit = await findCommitOfTag( + undefined, + 'some-org/repo', + 'v2.0.0', + http + ); + expect(commit).toBeNull(); + }); + + it('should gracefully return `null` if tags cannot be queried', async () => { + queryTagsSpy.mockRejectedValue(new Error('some error')); + + const commit = await findCommitOfTag( + undefined, + 'some-org/repo', + 'v2.0.0', + http + ); + expect(commit).toBeNull(); + }); + }); +}); diff --git a/lib/util/github/tags.ts b/lib/util/github/tags.ts new file mode 100644 index 00000000000000..51101958af8413 --- /dev/null +++ b/lib/util/github/tags.ts @@ -0,0 +1,39 @@ +import { logger } from '../../logger'; +import type { GithubHttp } from '../http/github'; +import { queryTags } from './graphql'; + +export async function findCommitOfTag( + registryUrl: string | undefined, + packageName: string, + tag: string, + http: GithubHttp +): Promise { + logger.trace(`github/tags.findCommitOfTag(${packageName}, ${tag})`); + try { + const tags = await queryTags({ packageName, registryUrl }, http); + if (!tags.length) { + logger.debug( + `github/tags.findCommitOfTag(): No tags found for ${packageName}` + ); + } + const tagItem = tags.find(({ version }) => version === tag); + if (tagItem) { + if (tagItem.hash) { + return tagItem.hash; + } + logger.debug( + `github/tags.findCommitOfTag: Tag ${tag} has no hash for ${packageName}` + ); + } else { + logger.debug( + `github/tags.findCommitOfTag: Tag ${tag} not found for ${packageName}` + ); + } + } catch (err) { + logger.debug( + { githubRepo: packageName, err }, + 'Error getting tag commit from GitHub repo' + ); + } + return null; +} diff --git a/lib/util/merge-confidence/common.ts b/lib/util/merge-confidence/common.ts new file mode 100644 index 00000000000000..94a7033290d976 --- /dev/null +++ b/lib/util/merge-confidence/common.ts @@ -0,0 +1,6 @@ +export const MERGE_CONFIDENCE = [ + 'low', + 'neutral', + 'high', + 'very high', +] as const; diff --git a/lib/util/merge-confidence/index.spec.ts b/lib/util/merge-confidence/index.spec.ts index 142a1f540fcf94..b64be0b932373b 100644 --- a/lib/util/merge-confidence/index.spec.ts +++ b/lib/util/merge-confidence/index.spec.ts @@ -1,13 +1,22 @@ import * as httpMock from '../../../test/http-mock'; +import { EXTERNAL_HOST_ERROR } from '../../constants/error-messages'; +import { logger } from '../../logger'; +import type { HostRule } from '../../types'; import * as memCache from '../cache/memory'; import * as hostRules from '../host-rules'; import { getMergeConfidenceLevel, + initConfig, + initMergeConfidence, isActiveConfidenceLevel, + resetConfig, satisfiesConfidenceLevel, } from '.'; describe('util/merge-confidence/index', () => { + const apiBaseUrl = 'https://www.baseurl.com/'; + const defaultApiBaseUrl = 'https://badges.renovateapi.com/'; + describe('isActiveConfidenceLevel()', () => { it('returns false if null', () => { expect(isActiveConfidenceLevel(null as never)).toBeFalse(); @@ -40,157 +49,323 @@ describe('util/merge-confidence/index', () => { }); }); - describe('getMergeConfidenceLevel()', () => { + describe('API calling functions', () => { + const hostRule: HostRule = { + hostType: 'merge-confidence', + token: 'some-token', + }; + beforeEach(() => { - hostRules.clear(); + jest.resetAllMocks(); + process.env.RENOVATE_X_MERGE_CONFIDENCE_API_BASE_URL = apiBaseUrl; + hostRules.add(hostRule); + initConfig(); memCache.reset(); }); - it('returns neutral if undefined updateType', async () => { - expect( - await getMergeConfidenceLevel( - 'npm', - 'renovate', - '25.0.0', - '25.0.0', - undefined as never - ) - ).toBe('neutral'); + afterEach(() => { + hostRules.clear(); + resetConfig(); }); - it('returns neutral if irrelevant updateType', async () => { - expect( - await getMergeConfidenceLevel( - 'npm', - 'renovate', - '24.1.0', - '25.0.0', - 'bump' - ) - ).toBe('neutral'); - }); + describe('getMergeConfidenceLevel()', () => { + it('returns neutral if undefined updateType', async () => { + expect( + await getMergeConfidenceLevel( + 'npm', + 'renovate', + '25.0.0', + '25.0.0', + undefined as never + ) + ).toBe('neutral'); + }); - it('returns high if pinning', async () => { - expect( - await getMergeConfidenceLevel( - 'npm', - 'renovate', - '25.0.1', - '25.0.1', - 'pin' - ) - ).toBe('high'); - }); + it('returns neutral if irrelevant updateType', async () => { + expect( + await getMergeConfidenceLevel( + 'npm', + 'renovate', + '24.1.0', + '25.0.0', + 'bump' + ) + ).toBe('neutral'); + }); - it('returns neutral if no token', async () => { - expect( - await getMergeConfidenceLevel( - 'npm', - 'renovate', - '24.2.0', - '25.0.0', - 'major' - ) - ).toBe('neutral'); - }); + it('returns high if pinning', async () => { + expect( + await getMergeConfidenceLevel( + 'npm', + 'renovate', + '25.0.1', + '25.0.1', + 'pin' + ) + ).toBe('high'); + }); - it('returns valid confidence level', async () => { - hostRules.add({ hostType: 'merge-confidence', token: '123test' }); - const datasource = 'npm'; - const depName = 'renovate'; - const currentVersion = '24.3.0'; - const newVersion = '25.0.0'; - httpMock - .scope('https://badges.renovateapi.com') - .get( - `/packages/${datasource}/${depName}/${newVersion}/confidence.api/${currentVersion}` - ) - .reply(200, { confidence: 'high' }); - expect( - await getMergeConfidenceLevel( - datasource, - depName, - currentVersion, - newVersion, - 'major' - ) - ).toBe('high'); - }); + it('returns undefined if no token', async () => { + resetConfig(); + hostRules.clear(); - it('returns neutral if invalid confidence level', async () => { - hostRules.add({ hostType: 'merge-confidence', token: '123test' }); - const datasource = 'npm'; - const depName = 'renovate'; - const currentVersion = '25.0.0'; - const newVersion = '25.1.0'; - httpMock - .scope('https://badges.renovateapi.com') - .get( - `/packages/${datasource}/${depName}/${newVersion}/confidence.api/${currentVersion}` - ) - .reply(200, { nope: 'nope' }); - expect( - await getMergeConfidenceLevel( - datasource, - depName, - currentVersion, - newVersion, - 'minor' - ) - ).toBe('neutral'); - }); + expect( + await getMergeConfidenceLevel( + 'npm', + 'renovate', + '24.2.0', + '25.0.0', + 'major' + ) + ).toBeUndefined(); + }); + + it('returns undefined if datasource is unsupported', async () => { + expect( + await getMergeConfidenceLevel( + 'not-npm', + 'renovate', + '24.2.0', + '25.0.0', + 'major' + ) + ).toBeUndefined(); + }); + + it('returns valid confidence level', async () => { + const datasource = 'npm'; + const depName = 'renovate'; + const currentVersion = '24.3.0'; + const newVersion = '25.0.0'; + httpMock + .scope(apiBaseUrl) + .get( + `/api/mc/json/${datasource}/${depName}/${currentVersion}/${newVersion}` + ) + .reply(200, { confidence: 'high' }); + + expect( + await getMergeConfidenceLevel( + datasource, + depName, + currentVersion, + newVersion, + 'major' + ) + ).toBe('high'); + }); + + it('returns neutral on invalid merge confidence response from api', async () => { + const datasource = 'npm'; + const depName = 'renovate'; + const currentVersion = '25.0.0'; + const newVersion = '25.1.0'; + httpMock + .scope(apiBaseUrl) + .get( + `/api/mc/json/${datasource}/${depName}/${currentVersion}/${newVersion}` + ) + .reply(200, { invalid: 'invalid' }); + + expect( + await getMergeConfidenceLevel( + datasource, + depName, + currentVersion, + newVersion, + 'minor' + ) + ).toBe('neutral'); + }); + + it('returns neutral on non 403/5xx error from API', async () => { + const datasource = 'npm'; + const depName = 'renovate'; + const currentVersion = '25.0.0'; + const newVersion = '25.4.0'; + httpMock + .scope(apiBaseUrl) + .get( + `/api/mc/json/${datasource}/${depName}/${currentVersion}/${newVersion}` + ) + .reply(400); + + expect( + await getMergeConfidenceLevel( + datasource, + depName, + currentVersion, + newVersion, + 'minor' + ) + ).toBe('neutral'); + expect(logger.warn).toHaveBeenCalledWith( + expect.anything(), + 'error fetching merge confidence data' + ); + }); + + it('throws on 403-Forbidden response from API', async () => { + const datasource = 'npm'; + const packageName = 'renovate'; + const currentVersion = '25.0.0'; + const newVersion = '25.4.0'; + httpMock + .scope(apiBaseUrl) + .get( + `/api/mc/json/${datasource}/${packageName}/${currentVersion}/${newVersion}` + ) + .reply(403); - it('returns neutral if exception from API', async () => { - hostRules.add({ hostType: 'merge-confidence', token: '123test' }); - const datasource = 'npm'; - const depName = 'renovate'; - const currentVersion = '25.0.0'; - const newVersion = '25.4.0'; - httpMock - .scope('https://badges.renovateapi.com') - .get( - `/packages/${datasource}/${depName}/${newVersion}/confidence.api/${currentVersion}` - ) - .reply(403); - expect( - await getMergeConfidenceLevel( - datasource, - depName, - currentVersion, - newVersion, - 'minor' - ) - ).toBe('neutral'); - - // FIXME: no cache hit - httpMock - .scope('https://badges.renovateapi.com') - .get( - `/packages/${datasource}/${depName}-new/${newVersion}/confidence.api/${currentVersion}` - ) - .reply(403); - // memory cache - expect( - await getMergeConfidenceLevel( - datasource, - depName + '-new', - currentVersion, - newVersion, - 'minor' - ) - ).toBe('neutral'); + await expect( + getMergeConfidenceLevel( + datasource, + packageName, + currentVersion, + newVersion, + 'minor' + ) + ).rejects.toThrow(EXTERNAL_HOST_ERROR); + expect(logger.error).toHaveBeenCalledWith( + expect.anything(), + 'merge confidence API token rejected - aborting run' + ); + }); + + it('throws on server error responses', async () => { + const datasource = 'npm'; + const packageName = 'renovate'; + const currentVersion = '25.0.0'; + const newVersion = '25.4.0'; + httpMock + .scope(apiBaseUrl) + .get( + `/api/mc/json/${datasource}/${packageName}/${currentVersion}/${newVersion}` + ) + .reply(503); + + await expect( + getMergeConfidenceLevel( + datasource, + packageName, + currentVersion, + newVersion, + 'minor' + ) + ).rejects.toThrow(EXTERNAL_HOST_ERROR); + expect(logger.error).toHaveBeenCalledWith( + expect.anything(), + 'merge confidence API failure: 5xx - aborting run' + ); + }); + + it('returns high if pinning digest', async () => { + expect( + await getMergeConfidenceLevel( + 'npm', + 'renovate', + '25.0.1', + '25.0.1', + 'pinDigest' + ) + ).toBe('high'); + }); }); - it('returns high if pinning digest', async () => { - expect( - await getMergeConfidenceLevel( - 'npm', - 'renovate', - '25.0.1', - '25.0.1', - 'pinDigest' - ) - ).toBe('high'); + describe('initMergeConfidence()', () => { + it('using default base url if none is set', async () => { + resetConfig(); + delete process.env.RENOVATE_X_MERGE_CONFIDENCE_API_BASE_URL; + httpMock + .scope(defaultApiBaseUrl) + .get(`/api/mc/availability`) + .reply(200); + + await expect(initMergeConfidence()).toResolve(); + expect(logger.trace).toHaveBeenCalledWith( + 'using default merge confidence API base URL' + ); + expect(logger.debug).toHaveBeenCalledWith( + 'merge confidence API - successfully authenticated' + ); + }); + + it('warns and then resolves if base url is invalid', async () => { + resetConfig(); + process.env.RENOVATE_X_MERGE_CONFIDENCE_API_BASE_URL = + 'invalid-url.com'; + httpMock + .scope(defaultApiBaseUrl) + .get(`/api/mc/availability`) + .reply(200); + + await expect(initMergeConfidence()).toResolve(); + expect(logger.warn).toHaveBeenCalledWith( + expect.anything(), + 'invalid merge confidence API base URL found in environment variables - using default value instead' + ); + expect(logger.debug).toHaveBeenCalledWith( + 'merge confidence API - successfully authenticated' + ); + }); + + it('resolves if no token', async () => { + resetConfig(); + hostRules.clear(); + + await expect(initMergeConfidence()).toResolve(); + expect(logger.trace).toHaveBeenCalledWith( + 'merge confidence API usage is disabled' + ); + }); + + it('resolves when token is valid', async () => { + httpMock.scope(apiBaseUrl).get(`/api/mc/availability`).reply(200); + + await expect(initMergeConfidence()).toResolve(); + expect(logger.debug).toHaveBeenCalledWith( + 'merge confidence API - successfully authenticated' + ); + }); + + it('throws on 403-Forbidden from mc API', async () => { + httpMock.scope(apiBaseUrl).get(`/api/mc/availability`).reply(403); + + await expect(initMergeConfidence()).rejects.toThrow( + EXTERNAL_HOST_ERROR + ); + expect(logger.error).toHaveBeenCalledWith( + expect.anything(), + 'merge confidence API token rejected - aborting run' + ); + }); + + it('throws on 5xx host errors from mc API', async () => { + httpMock.scope(apiBaseUrl).get(`/api/mc/availability`).reply(503); + + await expect(initMergeConfidence()).rejects.toThrow( + EXTERNAL_HOST_ERROR + ); + expect(logger.error).toHaveBeenCalledWith( + expect.anything(), + 'merge confidence API failure: 5xx - aborting run' + ); + }); + + it('throws on ECONNRESET', async () => { + httpMock + .scope(apiBaseUrl) + .get(`/api/mc/availability`) + .replyWithError({ code: 'ECONNRESET' }); + + await expect(initMergeConfidence()).rejects.toThrow( + EXTERNAL_HOST_ERROR + ); + expect(logger.error).toHaveBeenCalledWith( + expect.anything(), + 'merge confidence API request failed - aborting run' + ); + }); }); }); }); diff --git a/lib/util/merge-confidence/index.ts b/lib/util/merge-confidence/index.ts index 87574a244a45c1..a63d389c5312f8 100644 --- a/lib/util/merge-confidence/index.ts +++ b/lib/util/merge-confidence/index.ts @@ -1,15 +1,19 @@ +import is from '@sindresorhus/is'; import type { UpdateType } from '../../config/types'; import { logger } from '../../logger'; -import * as memCache from '../cache/memory'; +import { ExternalHostError } from '../../types/errors/external-host-error'; import * as packageCache from '../cache/package'; import * as hostRules from '../host-rules'; import { Http } from '../http'; +import { MERGE_CONFIDENCE } from './common'; +import type { MergeConfidence } from './types'; -const http = new Http('merge-confidence'); +const hostType = 'merge-confidence'; +const http = new Http(hostType); +let token: string | undefined; +let apiBaseUrl: string | undefined; -const MERGE_CONFIDENCE = ['low', 'neutral', 'high', 'very high']; -type MergeConfidenceTuple = typeof MERGE_CONFIDENCE; -export type MergeConfidence = MergeConfidenceTuple[number]; +const supportedDatasources = ['npm', 'maven', 'pypi']; export const confidenceLevels: Record = { low: -1, @@ -18,8 +22,22 @@ export const confidenceLevels: Record = { 'very high': 2, }; +export function initConfig(): void { + apiBaseUrl = getApiBaseUrl(); + token = getApiToken(); +} + +export function resetConfig(): void { + token = undefined; + apiBaseUrl = undefined; +} + +export function isMergeConfidence(value: string): value is MergeConfidence { + return MERGE_CONFIDENCE.includes(value as MergeConfidence); +} + export function isActiveConfidenceLevel(confidence: string): boolean { - return confidence !== 'low' && MERGE_CONFIDENCE.includes(confidence); + return isMergeConfidence(confidence) && confidence !== 'low'; } export function satisfiesConfidenceLevel( @@ -44,51 +62,180 @@ const updateTypeConfidenceMapping: Record = patch: null, }; +/** + * Retrieves the merge confidence of a package update if the merge confidence API is enabled. Otherwise, undefined is returned. + * + * @param datasource + * @param depName + * @param currentVersion + * @param newVersion + * @param updateType + * + * @returns The merge confidence level for the given package release. + * @throws {ExternalHostError} If a request has been made and an error occurs during the request, such as a timeout, connection reset, authentication failure, or internal server error. + */ export async function getMergeConfidenceLevel( datasource: string, depName: string, currentVersion: string, newVersion: string, updateType: UpdateType -): Promise { +): Promise { + if (is.nullOrUndefined(apiBaseUrl) || is.nullOrUndefined(token)) { + return undefined; + } + + if (!supportedDatasources.includes(datasource)) { + return undefined; + } + if (!(currentVersion && newVersion && updateType)) { return 'neutral'; } + const mappedConfidence = updateTypeConfidenceMapping[updateType]; if (mappedConfidence) { return mappedConfidence; } - const { token } = hostRules.find({ - hostType: 'merge-confidence', - url: 'https://badges.renovateapi.com', - }); - if (!token) { - logger.warn('No Merge Confidence API token found'); - return 'neutral'; - } - // istanbul ignore if - if (memCache.get('merge-confidence-invalid-token')) { + + return await queryApi(datasource, depName, currentVersion, newVersion); +} + +/** + * Queries the Merge Confidence API with the given package release information. + * + * @param datasource + * @param depName + * @param currentVersion + * @param newVersion + * + * @returns The merge confidence level for the given package release. + * @throws {ExternalHostError} if a timeout or connection reset error, authentication failure, or internal server error occurs during the request. + * + * @remarks + * Results are cached for 60 minutes to reduce the number of API calls. + */ +async function queryApi( + datasource: string, + depName: string, + currentVersion: string, + newVersion: string +): Promise { + // istanbul ignore if: defensive, already been validated before calling this function + if (is.nullOrUndefined(apiBaseUrl) || is.nullOrUndefined(token)) { return 'neutral'; } - const url = `https://badges.renovateapi.com/packages/${datasource}/${depName}/${newVersion}/confidence.api/${currentVersion}`; - const cachedResult = await packageCache.get('merge-confidence', token + url); + + const url = `${apiBaseUrl}api/mc/json/${datasource}/${depName}/${currentVersion}/${newVersion}`; + const cacheKey = `${token}:${url}`; + const cachedResult = await packageCache.get(hostType, cacheKey); + // istanbul ignore if if (cachedResult) { + logger.debug( + { datasource, depName, currentVersion, newVersion, cachedResult }, + 'using merge confidence cached result' + ); return cachedResult; } - let confidence = 'neutral'; + + let confidence: MergeConfidence = 'neutral'; try { const res = (await http.getJson<{ confidence: MergeConfidence }>(url)).body; - if (MERGE_CONFIDENCE.includes(res.confidence)) { + if (isMergeConfidence(res.confidence)) { confidence = res.confidence; } } catch (err) { - logger.debug({ err }, 'Error fetching merge confidence'); - if (err.statusCode === 403) { - memCache.set('merge-confidence-invalid-token', true); - logger.warn('Merge Confidence API token rejected'); - } + apiErrorHandler(err); } - await packageCache.set('merge-confidence', token + url, confidence, 60); + + await packageCache.set(hostType, cacheKey, confidence, 60); return confidence; } + +/** + * Checks the health of the Merge Confidence API by attempting to authenticate with it. + * + * @returns Resolves when the API health check is completed successfully. + * + * @throws {ExternalHostError} if a timeout, connection reset error, authentication failure, or internal server error occurs during the request. + * + * @remarks + * This function first checks that the API base URL and an authentication bearer token are defined before attempting to + * authenticate with the API. If either the base URL or token is not defined, it will immediately return + * without making a request. + */ +export async function initMergeConfidence(): Promise { + initConfig(); + + if (is.nullOrUndefined(apiBaseUrl) || is.nullOrUndefined(token)) { + logger.trace('merge confidence API usage is disabled'); + return; + } + + const url = `${apiBaseUrl}api/mc/availability`; + try { + await http.get(url); + } catch (err) { + apiErrorHandler(err); + } + + logger.debug('merge confidence API - successfully authenticated'); + return; +} + +function getApiBaseUrl(): string { + const defaultBaseUrl = 'https://badges.renovateapi.com/'; + const baseFromEnv = process.env.RENOVATE_X_MERGE_CONFIDENCE_API_BASE_URL; + + if (is.nullOrUndefined(baseFromEnv)) { + logger.trace('using default merge confidence API base URL'); + return defaultBaseUrl; + } + + try { + const parsedBaseUrl = new URL(baseFromEnv).toString(); + logger.trace( + { baseUrl: parsedBaseUrl }, + 'using merge confidence API base found in environment variables' + ); + return parsedBaseUrl; + } catch (err) { + logger.warn( + { err, baseFromEnv }, + 'invalid merge confidence API base URL found in environment variables - using default value instead' + ); + return defaultBaseUrl; + } +} + +function getApiToken(): string | undefined { + return hostRules.find({ + hostType, + })?.token; +} + +/** + * Handles errors returned by the Merge Confidence API. + * + * @param err - The error object returned by the API. + * @throws {ExternalHostError} if a timeout or connection reset error, authentication failure, or internal server error occurs during the request. + */ +function apiErrorHandler(err: any): void { + if (err.code === 'ETIMEDOUT' || err.code === 'ECONNRESET') { + logger.error({ err }, 'merge confidence API request failed - aborting run'); + throw new ExternalHostError(err, hostType); + } + + if (err.statusCode === 403) { + logger.error({ err }, 'merge confidence API token rejected - aborting run'); + throw new ExternalHostError(err, hostType); + } + + if (err.statusCode >= 500 && err.statusCode < 600) { + logger.error({ err }, 'merge confidence API failure: 5xx - aborting run'); + throw new ExternalHostError(err, hostType); + } + + logger.warn({ err }, 'error fetching merge confidence data'); +} diff --git a/lib/util/merge-confidence/types.ts b/lib/util/merge-confidence/types.ts new file mode 100644 index 00000000000000..686f36546d0849 --- /dev/null +++ b/lib/util/merge-confidence/types.ts @@ -0,0 +1,3 @@ +import type { MERGE_CONFIDENCE } from './common'; + +export type MergeConfidence = (typeof MERGE_CONFIDENCE)[number]; diff --git a/lib/util/modules.ts b/lib/util/modules.ts index e0bc3596cc0bf4..f0c6d4991335b3 100644 --- a/lib/util/modules.ts +++ b/lib/util/modules.ts @@ -1,10 +1,9 @@ import fs from 'fs'; import upath from 'upath'; -import { regEx } from './regex'; function relatePath(here: string, there: string): string { - const thereParts = upath.normalizeTrim(there).split(regEx(/[\\/]/)); - const hereParts = upath.normalizeTrim(here).split(regEx(/[\\/]/)); + const thereParts = upath.normalizeTrim(there).split('/'); + const hereParts = upath.normalizeTrim(here).split('/'); let idx = 0; while ( diff --git a/lib/util/package-rules/index.spec.ts b/lib/util/package-rules/index.spec.ts index 8e1651e1e3bea4..dc3d30bc62882e 100644 --- a/lib/util/package-rules/index.spec.ts +++ b/lib/util/package-rules/index.spec.ts @@ -1,6 +1,7 @@ import type { PackageRuleInputConfig, UpdateType } from '../../config/types'; import { DockerDatasource } from '../../modules/datasource/docker'; import { OrbDatasource } from '../../modules/datasource/orb'; +import type { MergeConfidence } from '../merge-confidence/types'; import { applyPackageRules } from './index'; type TestConfig = PackageRuleInputConfig & { @@ -625,6 +626,60 @@ describe('util/package-rules/index', () => { expect(res.x).toBeUndefined(); }); + it('matches matchConfidence', () => { + const config: TestConfig = { + packageRules: [ + { + matchConfidence: ['high'], + x: 1, + }, + ], + }; + const dep = { + depType: 'dependencies', + depName: 'a', + mergeConfidenceLevel: 'high' as MergeConfidence, + }; + const res = applyPackageRules({ ...config, ...dep }); + expect(res.x).toBe(1); + }); + + it('non-matches matchConfidence', () => { + const config: TestConfig = { + packageRules: [ + { + matchConfidence: ['high'], + x: 1, + }, + ], + }; + const dep = { + depType: 'dependencies', + depName: 'a', + mergeConfidenceLevel: 'low' as MergeConfidence, + }; + const res = applyPackageRules({ ...config, ...dep }); + expect(res.x).toBeUndefined(); + }); + + it('does not match matchConfidence when there is no mergeConfidenceLevel', () => { + const config: TestConfig = { + packageRules: [ + { + matchConfidence: ['high'], + x: 1, + }, + ], + }; + const dep = { + depType: 'dependencies', + depName: 'a', + mergeConfidenceLevel: undefined, + }; + const res = applyPackageRules({ ...config, ...dep }); + expect(res.x).toBeUndefined(); + }); + it('filters naked depType', () => { const config: TestConfig = { packageRules: [ @@ -662,6 +717,7 @@ describe('util/package-rules/index', () => { it('checks if matchCurrentVersion selector is valid and satisfies the condition on range overlap', () => { const config: TestConfig = { + versioning: 'semver', packageRules: [ { matchPackageNames: ['test'], @@ -699,6 +755,7 @@ describe('util/package-rules/index', () => { it('checks if matchCurrentVersion selector is valid and satisfies the condition on pinned to range overlap', () => { const config: TestConfig = { + versioning: 'semver', packageRules: [ { matchPackageNames: ['test'], diff --git a/lib/util/package-rules/matchers.ts b/lib/util/package-rules/matchers.ts index 6697839344baac..2a11fdd8180d58 100644 --- a/lib/util/package-rules/matchers.ts +++ b/lib/util/package-rules/matchers.ts @@ -8,6 +8,7 @@ import { DepTypesMatcher } from './dep-types'; import { FilesMatcher } from './files'; import { LanguagesMatcher } from './languages'; import { ManagersMatcher } from './managers'; +import { MergeConfidenceMatcher } from './merge-confidence'; import { PackageNameMatcher } from './package-names'; import { PackagePatternsMatcher } from './package-patterns'; import { PackagePrefixesMatcher } from './package-prefixes'; @@ -36,6 +37,7 @@ matchers.push([new BaseBranchesMatcher()]); matchers.push([new ManagersMatcher()]); matchers.push([new DatasourcesMatcher()]); matchers.push([new UpdateTypesMatcher()]); +matchers.push([new MergeConfidenceMatcher()]); matchers.push([new SourceUrlsMatcher(), new SourceUrlPrefixesMatcher()]); matchers.push([new CurrentValueMatcher()]); matchers.push([new CurrentVersionMatcher()]); diff --git a/lib/util/package-rules/merge-confidence.ts b/lib/util/package-rules/merge-confidence.ts new file mode 100644 index 00000000000000..a29a6cfb55d43c --- /dev/null +++ b/lib/util/package-rules/merge-confidence.ts @@ -0,0 +1,19 @@ +import is from '@sindresorhus/is'; +import type { PackageRule, PackageRuleInputConfig } from '../../config/types'; +import { Matcher } from './base'; + +export class MergeConfidenceMatcher extends Matcher { + override matches( + { mergeConfidenceLevel }: PackageRuleInputConfig, + { matchConfidence }: PackageRule + ): boolean | null { + if (is.nullOrUndefined(matchConfidence)) { + return null; + } + return ( + is.array(matchConfidence) && + is.nonEmptyString(mergeConfidenceLevel) && + matchConfidence.includes(mergeConfidenceLevel) + ); + } +} diff --git a/lib/util/url.spec.ts b/lib/util/url.spec.ts index d1e9e0e17ede33..27652dc9c515f6 100644 --- a/lib/util/url.spec.ts +++ b/lib/util/url.spec.ts @@ -6,57 +6,91 @@ import { joinUrlParts, parseLinkHeader, parseUrl, + replaceUrlPath, resolveBaseUrl, trimTrailingSlash, validateUrl, } from './url'; describe('util/url', () => { - test.each([ - ['http://foo.io', '', 'http://foo.io'], - ['http://foo.io/', '', 'http://foo.io'], - ['http://foo.io', '/', 'http://foo.io/'], - ['http://foo.io/', '/', 'http://foo.io/'], - - ['http://foo.io', '/aaa', 'http://foo.io/aaa'], - ['http://foo.io', 'aaa', 'http://foo.io/aaa'], - ['http://foo.io/', '/aaa', 'http://foo.io/aaa'], - ['http://foo.io/', 'aaa', 'http://foo.io/aaa'], - ['http://foo.io', '/aaa/', 'http://foo.io/aaa/'], - ['http://foo.io', 'aaa/', 'http://foo.io/aaa/'], - ['http://foo.io/', '/aaa/', 'http://foo.io/aaa/'], - ['http://foo.io/', 'aaa/', 'http://foo.io/aaa/'], - - ['http://foo.io/aaa', '/bbb', 'http://foo.io/aaa/bbb'], - ['http://foo.io/aaa', 'bbb', 'http://foo.io/aaa/bbb'], - ['http://foo.io/aaa/', '/bbb', 'http://foo.io/aaa/bbb'], - ['http://foo.io/aaa/', 'bbb', 'http://foo.io/aaa/bbb'], - - ['http://foo.io/aaa', '/bbb/', 'http://foo.io/aaa/bbb/'], - ['http://foo.io/aaa', 'bbb/', 'http://foo.io/aaa/bbb/'], - ['http://foo.io/aaa/', '/bbb/', 'http://foo.io/aaa/bbb/'], - ['http://foo.io/aaa/', 'bbb/', 'http://foo.io/aaa/bbb/'], - - ['http://foo.io', 'http://bar.io/bbb', 'http://bar.io/bbb'], - ['http://foo.io/', 'http://bar.io/bbb', 'http://bar.io/bbb'], - ['http://foo.io/aaa', 'http://bar.io/bbb', 'http://bar.io/bbb'], - ['http://foo.io/aaa/', 'http://bar.io/bbb', 'http://bar.io/bbb'], - - ['http://foo.io', 'http://bar.io/bbb/', 'http://bar.io/bbb/'], - ['http://foo.io/', 'http://bar.io/bbb/', 'http://bar.io/bbb/'], - ['http://foo.io/aaa', 'http://bar.io/bbb/', 'http://bar.io/bbb/'], - ['http://foo.io/aaa/', 'http://bar.io/bbb/', 'http://bar.io/bbb/'], - - ['http://foo.io', 'aaa?bbb=z', 'http://foo.io/aaa?bbb=z'], - ['http://foo.io', '/aaa?bbb=z', 'http://foo.io/aaa?bbb=z'], - ['http://foo.io/', 'aaa?bbb=z', 'http://foo.io/aaa?bbb=z'], - ['http://foo.io/', '/aaa?bbb=z', 'http://foo.io/aaa?bbb=z'], - - ['http://foo.io', 'aaa/?bbb=z', 'http://foo.io/aaa?bbb=z'], - ])('%s + %s => %s', (baseUrl, x, result) => { + test.each` + baseUrl | x | result + ${'http://foo.io'} | ${''} | ${'http://foo.io'} + ${'http://foo.io/'} | ${''} | ${'http://foo.io'} + ${'http://foo.io'} | ${'/'} | ${'http://foo.io/'} + ${'http://foo.io/'} | ${'/'} | ${'http://foo.io/'} + ${'http://foo.io'} | ${'/aaa'} | ${'http://foo.io/aaa'} + ${'http://foo.io'} | ${'aaa'} | ${'http://foo.io/aaa'} + ${'http://foo.io/'} | ${'/aaa'} | ${'http://foo.io/aaa'} + ${'http://foo.io/'} | ${'aaa'} | ${'http://foo.io/aaa'} + ${'http://foo.io'} | ${'/aaa/'} | ${'http://foo.io/aaa/'} + ${'http://foo.io'} | ${'aaa/'} | ${'http://foo.io/aaa/'} + ${'http://foo.io/'} | ${'/aaa/'} | ${'http://foo.io/aaa/'} + ${'http://foo.io/'} | ${'aaa/'} | ${'http://foo.io/aaa/'} + ${'http://foo.io/aaa'} | ${'/bbb'} | ${'http://foo.io/aaa/bbb'} + ${'http://foo.io/aaa'} | ${'bbb'} | ${'http://foo.io/aaa/bbb'} + ${'http://foo.io/aaa/'} | ${'/bbb'} | ${'http://foo.io/aaa/bbb'} + ${'http://foo.io/aaa/'} | ${'bbb'} | ${'http://foo.io/aaa/bbb'} + ${'http://foo.io/aaa'} | ${'/bbb/'} | ${'http://foo.io/aaa/bbb/'} + ${'http://foo.io/aaa'} | ${'bbb/'} | ${'http://foo.io/aaa/bbb/'} + ${'http://foo.io/aaa/'} | ${'/bbb/'} | ${'http://foo.io/aaa/bbb/'} + ${'http://foo.io/aaa/'} | ${'bbb/'} | ${'http://foo.io/aaa/bbb/'} + ${'http://foo.io'} | ${'http://bar.io/bbb'} | ${'http://bar.io/bbb'} + ${'http://foo.io/'} | ${'http://bar.io/bbb'} | ${'http://bar.io/bbb'} + ${'http://foo.io/aaa'} | ${'http://bar.io/bbb'} | ${'http://bar.io/bbb'} + ${'http://foo.io/aaa/'} | ${'http://bar.io/bbb'} | ${'http://bar.io/bbb'} + ${'http://foo.io'} | ${'http://bar.io/bbb/'} | ${'http://bar.io/bbb/'} + ${'http://foo.io/'} | ${'http://bar.io/bbb/'} | ${'http://bar.io/bbb/'} + ${'http://foo.io/aaa'} | ${'http://bar.io/bbb/'} | ${'http://bar.io/bbb/'} + ${'http://foo.io/aaa/'} | ${'http://bar.io/bbb/'} | ${'http://bar.io/bbb/'} + ${'http://foo.io'} | ${'aaa?bbb=z'} | ${'http://foo.io/aaa?bbb=z'} + ${'http://foo.io'} | ${'/aaa?bbb=z'} | ${'http://foo.io/aaa?bbb=z'} + ${'http://foo.io/'} | ${'aaa?bbb=z'} | ${'http://foo.io/aaa?bbb=z'} + ${'http://foo.io/'} | ${'/aaa?bbb=z'} | ${'http://foo.io/aaa?bbb=z'} + ${'http://foo.io'} | ${'aaa/?bbb=z'} | ${'http://foo.io/aaa?bbb=z'} + `('$baseUrl + $x => $result', ({ baseUrl, x, result }) => { expect(resolveBaseUrl(baseUrl, x)).toBe(result); }); + test.each` + baseUrl | x | result + ${'http://foo.io'} | ${''} | ${'http://foo.io'} + ${'http://foo.io/'} | ${''} | ${'http://foo.io'} + ${'http://foo.io'} | ${'/'} | ${'http://foo.io/'} + ${'http://foo.io/'} | ${'/'} | ${'http://foo.io/'} + ${'http://foo.io'} | ${'/aaa'} | ${'http://foo.io/aaa'} + ${'http://foo.io'} | ${'aaa'} | ${'http://foo.io/aaa'} + ${'http://foo.io/'} | ${'/aaa'} | ${'http://foo.io/aaa'} + ${'http://foo.io/'} | ${'aaa'} | ${'http://foo.io/aaa'} + ${'http://foo.io'} | ${'/aaa/'} | ${'http://foo.io/aaa/'} + ${'http://foo.io'} | ${'aaa/'} | ${'http://foo.io/aaa/'} + ${'http://foo.io/'} | ${'/aaa/'} | ${'http://foo.io/aaa/'} + ${'http://foo.io/'} | ${'aaa/'} | ${'http://foo.io/aaa/'} + ${'http://foo.io/aaa'} | ${'/bbb'} | ${'http://foo.io/bbb'} + ${'http://foo.io/aaa'} | ${'bbb'} | ${'http://foo.io/bbb'} + ${'http://foo.io/aaa/'} | ${'/bbb'} | ${'http://foo.io/bbb'} + ${'http://foo.io/aaa/'} | ${'bbb'} | ${'http://foo.io/bbb'} + ${'http://foo.io/aaa'} | ${'/bbb/'} | ${'http://foo.io/bbb/'} + ${'http://foo.io/aaa'} | ${'bbb/'} | ${'http://foo.io/bbb/'} + ${'http://foo.io/aaa/'} | ${'/bbb/'} | ${'http://foo.io/bbb/'} + ${'http://foo.io/aaa/'} | ${'bbb/'} | ${'http://foo.io/bbb/'} + ${'http://foo.io'} | ${'http://bar.io/bbb'} | ${'http://bar.io/bbb'} + ${'http://foo.io/'} | ${'http://bar.io/bbb'} | ${'http://bar.io/bbb'} + ${'http://foo.io/aaa'} | ${'http://bar.io/bbb'} | ${'http://bar.io/bbb'} + ${'http://foo.io/aaa/'} | ${'http://bar.io/bbb'} | ${'http://bar.io/bbb'} + ${'http://foo.io'} | ${'http://bar.io/bbb/'} | ${'http://bar.io/bbb/'} + ${'http://foo.io/'} | ${'http://bar.io/bbb/'} | ${'http://bar.io/bbb/'} + ${'http://foo.io/aaa'} | ${'http://bar.io/bbb/'} | ${'http://bar.io/bbb/'} + ${'http://foo.io/aaa/'} | ${'http://bar.io/bbb/'} | ${'http://bar.io/bbb/'} + ${'http://foo.io'} | ${'aaa?bbb=z'} | ${'http://foo.io/aaa?bbb=z'} + ${'http://foo.io'} | ${'/aaa?bbb=z'} | ${'http://foo.io/aaa?bbb=z'} + ${'http://foo.io/'} | ${'aaa?bbb=z'} | ${'http://foo.io/aaa?bbb=z'} + ${'http://foo.io/'} | ${'/aaa?bbb=z'} | ${'http://foo.io/aaa?bbb=z'} + ${'http://foo.io'} | ${'aaa/?bbb=z'} | ${'http://foo.io/aaa?bbb=z'} + `('replaceUrlPath("$baseUrl", "$x") => $result', ({ baseUrl, x, result }) => { + expect(replaceUrlPath(baseUrl, x)).toBe(result); + }); + it('getQueryString', () => { expect(getQueryString({ a: 1, b: [1, 2] })).toBe('a=1&b=1&b=2'); }); diff --git a/lib/util/url.ts b/lib/util/url.ts index 0f48f048ff15e4..7d4c1551d819d2 100644 --- a/lib/util/url.ts +++ b/lib/util/url.ts @@ -30,6 +30,12 @@ export function trimLeadingSlash(path: string): string { return path.replace(/^\/+/, ''); } +/** + * Resolves an input path against a base URL + * + * @param baseUrl - base URL to resolve against + * @param input - input path (if this is a full URL, it will be returned) + */ export function resolveBaseUrl(baseUrl: string, input: string | URL): string { const inputString = input.toString(); @@ -44,10 +50,25 @@ export function resolveBaseUrl(baseUrl: string, input: string | URL): string { return host ? inputString : urlJoin(baseUrl, pathname || ''); } +/** + * Replaces the path of a URL with a new path + * + * @param baseUrl - source URL + * @param path - replacement path (if this is a full URL, it will be returned) + */ +export function replaceUrlPath(baseUrl: string | URL, path: string): string { + if (parseUrl(path)) { + return path; + } + + const { origin } = is.string(baseUrl) ? new URL(baseUrl) : baseUrl; + return urlJoin(origin, path); +} + export function getQueryString(params: Record): string { const usp = new URLSearchParams(); for (const [k, v] of Object.entries(params)) { - if (Array.isArray(v)) { + if (is.array(v)) { for (const item of v) { usp.append(k, item.toString()); } @@ -55,8 +76,7 @@ export function getQueryString(params: Record): string { usp.append(k, v.toString()); } } - const res = usp.toString(); - return res; + return usp.toString(); } export function validateUrl(url?: string, httpOnly = true): boolean { diff --git a/lib/workers/global/config/parse/cli.ts b/lib/workers/global/config/parse/cli.ts index 019dc343e95728..f12305fa3e28ab 100644 --- a/lib/workers/global/config/parse/cli.ts +++ b/lib/workers/global/config/parse/cli.ts @@ -32,6 +32,8 @@ export function getConfig(input: string[]): AllConfig { .replace(/^--dry-run$/, '--dry-run=true') .replace(/^--require-config$/, '--require-config=true') .replace('--aliases', '--registry-aliases') + .replace('--include-forks=true', '--fork-processing=enabled') + .replace('--include-forks', '--fork-processing=enabled') ) .filter((a) => !a.startsWith('--git-fs')); const options = getOptions(); diff --git a/lib/workers/global/config/parse/index.ts b/lib/workers/global/config/parse/index.ts index 5bfed02cbf2060..0823d06c6ff5d9 100644 --- a/lib/workers/global/config/parse/index.ts +++ b/lib/workers/global/config/parse/index.ts @@ -99,6 +99,12 @@ export async function parseConfigs( config.endpoint = ensureTrailingSlash(config.endpoint); } + // Massage forkProcessing + if (!config.autodiscover && config.forkProcessing !== 'disabled') { + logger.debug('Enabling forkProcessing while in non-autodiscover mode'); + config.forkProcessing = 'enabled'; + } + // Remove log file entries delete config.logFile; delete config.logFileLevel; diff --git a/lib/workers/global/initialize.ts b/lib/workers/global/initialize.ts index 73a2d5eefb7229..3ec5c90ab6fdee 100644 --- a/lib/workers/global/initialize.ts +++ b/lib/workers/global/initialize.ts @@ -9,6 +9,7 @@ import * as packageCache from '../../util/cache/package'; import { setEmojiConfig } from '../../util/emoji'; import { validateGitVersion } from '../../util/git'; import * as hostRules from '../../util/host-rules'; +import { initMergeConfidence } from '../../util/merge-confidence'; import { setMaxLimit } from './limits'; async function setDirectories(input: AllConfig): Promise { @@ -74,6 +75,7 @@ export async function globalInitialize( limitCommitsPerRun(config); setEmojiConfig(config); setGlobalHostRules(config); + await initMergeConfidence(); return config; } diff --git a/lib/workers/repository/cache.ts b/lib/workers/repository/cache.ts index b4657d1a7b8e21..e80979449435d9 100644 --- a/lib/workers/repository/cache.ts +++ b/lib/workers/repository/cache.ts @@ -9,6 +9,9 @@ import type { BranchCache, BranchUpgradeCache, } from '../../util/cache/repository/types'; +import { getCachedBehindBaseResult } from '../../util/git/behind-base-branch-cache'; +import { getCachedConflictResult } from '../../util/git/conflicts-cache'; +import { getCachedModifiedResult } from '../../util/git/modified-cache'; import { getCachedPristineResult } from '../../util/git/pristine'; import type { BranchConfig, BranchUpgradeConfig } from '../types'; import { getPrCache } from './update/pr/pr-cache'; @@ -48,21 +51,33 @@ async function generateBranchCache( ): Promise { const { baseBranch, branchName } = branch; try { - const sha = await scm.getBranchCommit(branchName); + const branchSha = await scm.getBranchCommit(branchName); const baseBranchSha = await scm.getBranchCommit(baseBranch); const pristine = getCachedPristineResult(branchName); let prNo = null; - let isModified = false; - let isBehindBase = false; - let isConflicted = false; - if (sha) { + let isModified: boolean | undefined; + let isBehindBase: boolean | undefined; + let isConflicted: boolean | undefined; + if (baseBranchSha && branchSha) { const branchPr = await platform.getBranchPr(branchName); if (branchPr) { prNo = branchPr.number; } - isModified = await scm.isBranchModified(branchName); - isBehindBase = await scm.isBranchBehindBase(branchName, baseBranch); - isConflicted = await scm.isBranchConflicted(baseBranch, branchName); + isModified = getCachedModifiedResult(branchName, branchSha) ?? undefined; + isBehindBase = + getCachedBehindBaseResult( + branchName, + branchSha, + baseBranch, + baseBranchSha + ) ?? undefined; + isConflicted = + getCachedConflictResult( + branchName, + branchSha, + baseBranch, + baseBranchSha + ) ?? undefined; } const automerge = !!branch.automerge; const upgrades: BranchUpgradeCache[] = branch.upgrades @@ -82,7 +97,7 @@ async function generateBranchCache( pristine, prCache, prNo, - sha, + sha: branchSha, upgrades, }; } catch (error) { diff --git a/lib/workers/repository/changelog/index.spec.ts b/lib/workers/repository/changelog/index.spec.ts index ad2a87d84a8428..5ad0dd54bf60c4 100644 --- a/lib/workers/repository/changelog/index.spec.ts +++ b/lib/workers/repository/changelog/index.spec.ts @@ -17,8 +17,8 @@ describe('workers/repository/changelog/index', () => { mockedFunction(getChangeLogJSON).mockResolvedValueOnce(null); const branches = [ partial({ logJSON: null }), - partial({}), - partial({}), + partial(), + partial(), ]; await expect(embedChangelogs(branches)).toResolve(); expect(branches).toEqual([ @@ -29,7 +29,7 @@ describe('workers/repository/changelog/index', () => { }); it('needsChangelogs', () => { - expect(needsChangelogs(partial({}))).toBeFalse(); + expect(needsChangelogs(partial())).toBeFalse(); expect( needsChangelogs( partial({ diff --git a/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data-formatted.json b/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data-formatted.json index 1891c1584d8928..4b038d5bb25af1 100644 --- a/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data-formatted.json +++ b/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data-formatted.json @@ -1,4 +1,4 @@ { "filename": "renovate.json", - "content": "{\n \"extends\": [\n \":separateMajorReleases\",\n \":prImmediately\",\n \":renovatePrefix\",\n \":semanticPrefixFixDepsChoreOthers\",\n \":updateNotScheduled\",\n \":automergeDisabled\",\n \":maintainLockFilesDisabled\",\n \":autodetectRangeStrategy\",\n \"group:monorepos\"\n ],\n \"onboarding\": false,\n \"rangeStrategy\": \"replace\",\n \"semanticCommits\": \"enabled\",\n \"timezone\": \"US/Central\",\n \"baseBranches\": [\"main\"]\n}\n" + "content": "{\n \"extends\": [\n \":separateMajorReleases\",\n \":prImmediately\",\n \":renovatePrefix\",\n \":semanticPrefixFixDepsChoreOthers\",\n \":updateNotScheduled\",\n \":automergeDisabled\",\n \":maintainLockFilesDisabled\",\n \"group:monorepos\"\n ],\n \"onboarding\": false,\n \"rangeStrategy\": \"replace\",\n \"semanticCommits\": \"enabled\",\n \"timezone\": \"US/Central\",\n \"baseBranches\": [\"main\"]\n}\n" } diff --git a/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data.json b/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data.json index 1266070dddb070..1e9f8833a3cd35 100644 --- a/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data.json +++ b/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data.json @@ -1,5 +1,5 @@ { - "content": "{\n \"extends\": [\n \":separateMajorReleases\",\n \":prImmediately\",\n \":renovatePrefix\",\n \":semanticPrefixFixDepsChoreOthers\",\n \":updateNotScheduled\",\n \":automergeDisabled\",\n \":maintainLockFilesDisabled\",\n \":autodetectRangeStrategy\",\n \"group:monorepos\"\n ],\n \"onboarding\": false,\n \"rangeStrategy\": \"replace\",\n \"semanticCommits\": \"enabled\",\n \"timezone\": \"US/Central\",\n \"baseBranches\": [\n \"main\"\n ]\n}\n", + "content": "{\n \"extends\": [\n \":separateMajorReleases\",\n \":prImmediately\",\n \":renovatePrefix\",\n \":semanticPrefixFixDepsChoreOthers\",\n \":updateNotScheduled\",\n \":automergeDisabled\",\n \":maintainLockFilesDisabled\",\n \"group:monorepos\"\n ],\n \"onboarding\": false,\n \"rangeStrategy\": \"replace\",\n \"semanticCommits\": \"enabled\",\n \"timezone\": \"US/Central\",\n \"baseBranches\": [\n \"main\"\n ]\n}\n", "filename": "renovate.json", "indent": { "amount": 2, diff --git a/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data.json5 b/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data.json5 index c80dcb42b6fc18..22888d346d99ef 100644 --- a/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data.json5 +++ b/lib/workers/repository/config-migration/branch/__fixtures__/migrated-data.json5 @@ -1,5 +1,5 @@ { - "content": "{\n extends: [\n ':separateMajorReleases',\n ':prImmediately',\n ':renovatePrefix',\n ':semanticPrefixFixDepsChoreOthers',\n ':updateNotScheduled',\n ':automergeDisabled',\n ':maintainLockFilesDisabled',\n ':autodetectRangeStrategy',\n 'group:monorepos',\n ],\n onboarding: false,\n rangeStrategy: 'replace',\n semanticCommits: 'enabled',\n timezone: 'US/Central',\n baseBranches: [\n 'main',\n ],\n}\n", + "content": "{\n extends: [\n ':separateMajorReleases',\n ':prImmediately',\n ':renovatePrefix',\n ':semanticPrefixFixDepsChoreOthers',\n ':updateNotScheduled',\n ':automergeDisabled',\n ':maintainLockFilesDisabled',\n 'group:monorepos',\n ],\n onboarding: false,\n rangeStrategy: 'replace',\n semanticCommits: 'enabled',\n timezone: 'US/Central',\n baseBranches: [\n 'main',\n ],\n}\n", "filename": "renovate.json5", "indent": { "amount": 2, diff --git a/lib/workers/repository/config-migration/branch/__fixtures__/migrated.json b/lib/workers/repository/config-migration/branch/__fixtures__/migrated.json index 549d809c236d17..66b64ae3c892ba 100644 --- a/lib/workers/repository/config-migration/branch/__fixtures__/migrated.json +++ b/lib/workers/repository/config-migration/branch/__fixtures__/migrated.json @@ -7,7 +7,6 @@ ":updateNotScheduled", ":automergeDisabled", ":maintainLockFilesDisabled", - ":autodetectRangeStrategy", "group:monorepos" ], "onboarding": false, diff --git a/lib/workers/repository/config-migration/branch/__fixtures__/renovate.json b/lib/workers/repository/config-migration/branch/__fixtures__/renovate.json index 6ea0880bb10555..1a0a9efc29e9bc 100644 --- a/lib/workers/repository/config-migration/branch/__fixtures__/renovate.json +++ b/lib/workers/repository/config-migration/branch/__fixtures__/renovate.json @@ -8,7 +8,6 @@ ":updateNotScheduled", ":automergeDisabled", ":maintainLockFilesDisabled", - ":autodetectRangeStrategy", "group:monorepos", "helpers:oddIsUnstablePackages" ], diff --git a/lib/workers/repository/config-migration/branch/__fixtures__/renovate.json5 b/lib/workers/repository/config-migration/branch/__fixtures__/renovate.json5 index 2d13ebc63f59bc..559b6b98790621 100644 --- a/lib/workers/repository/config-migration/branch/__fixtures__/renovate.json5 +++ b/lib/workers/repository/config-migration/branch/__fixtures__/renovate.json5 @@ -7,7 +7,6 @@ ':updateNotScheduled', ':automergeDisabled', ':maintainLockFilesDisabled', - ':autodetectRangeStrategy', 'group:monorepos', 'helpers:oddIsUnstablePackages' ], diff --git a/lib/workers/repository/config-migration/branch/create.spec.ts b/lib/workers/repository/config-migration/branch/create.spec.ts index 820333110d73d8..d1e450be9d8598 100644 --- a/lib/workers/repository/config-migration/branch/create.spec.ts +++ b/lib/workers/repository/config-migration/branch/create.spec.ts @@ -29,7 +29,7 @@ describe('workers/repository/config-migration/branch/create', () => { migratedConfigData = { content: renovateConfig, filename, - indent: partial({}), + indent: partial(), }; prettierSpy.mockResolvedValueOnce(migratedConfigData.content); }); diff --git a/lib/workers/repository/config-migration/branch/rebase.spec.ts b/lib/workers/repository/config-migration/branch/rebase.spec.ts index 836ef9fda72bad..1ac78e49ad3322 100644 --- a/lib/workers/repository/config-migration/branch/rebase.spec.ts +++ b/lib/workers/repository/config-migration/branch/rebase.spec.ts @@ -43,7 +43,7 @@ describe('workers/repository/config-migration/branch/rebase', () => { const migratedConfigData: MigratedData = { content: '', filename: '', - indent: partial({}), + indent: partial(), }; beforeEach(() => { diff --git a/lib/workers/repository/config-migration/index.spec.ts b/lib/workers/repository/config-migration/index.spec.ts index f15f4bd75d5d75..3ab683886d360c 100644 --- a/lib/workers/repository/config-migration/index.spec.ts +++ b/lib/workers/repository/config-migration/index.spec.ts @@ -24,7 +24,7 @@ describe('workers/repository/config-migration/index', () => { mockedFunction(MigratedDataFactory.getAsync).mockResolvedValue({ filename, content, - indent: partial({}), + indent: partial(), }); }); diff --git a/lib/workers/repository/config-migration/pr/__fixtures__/migrated-data.json b/lib/workers/repository/config-migration/pr/__fixtures__/migrated-data.json index 0dce506326bb55..3375b555e6f10c 100644 --- a/lib/workers/repository/config-migration/pr/__fixtures__/migrated-data.json +++ b/lib/workers/repository/config-migration/pr/__fixtures__/migrated-data.json @@ -1,4 +1,4 @@ { "configFileName": "renovate.json", - "migratedContent": "{\n \"extends\": [\n \":separateMajorReleases\",\n \":prImmediately\",\n \":renovatePrefix\",\n \":semanticPrefixFixDepsChoreOthers\",\n \":updateNotScheduled\",\n \":automergeDisabled\",\n \":maintainLockFilesDisabled\",\n \":autodetectRangeStrategy\",\n \"group:monorepos\"\n ],\n \"onboarding\": false,\n \"rangeStrategy\": \"replace\",\n \"semanticCommits\": \"enabled\",\n \"timezone\": \"US/Central\",\n \"baseBranches\": [\n \"main\"\n ]\n}\n" + "migratedContent": "{\n \"extends\": [\n \":separateMajorReleases\",\n \":prImmediately\",\n \":renovatePrefix\",\n \":semanticPrefixFixDepsChoreOthers\",\n \":updateNotScheduled\",\n \":automergeDisabled\",\n \":maintainLockFilesDisabled\",\n \"group:monorepos\"\n ],\n \"onboarding\": false,\n \"rangeStrategy\": \"replace\",\n \"semanticCommits\": \"enabled\",\n \"timezone\": \"US/Central\",\n \"baseBranches\": [\n \"main\"\n ]\n}\n" } diff --git a/lib/workers/repository/config-migration/pr/index.spec.ts b/lib/workers/repository/config-migration/pr/index.spec.ts index 10ca2b4c46ac5d..e0dc57d32f908c 100644 --- a/lib/workers/repository/config-migration/pr/index.spec.ts +++ b/lib/workers/repository/config-migration/pr/index.spec.ts @@ -29,7 +29,7 @@ describe('workers/repository/config-migration/pr/index', () => { const migratedData: MigratedData = { content: migratedContent, filename: configFileName, - indent: partial({}), + indent: partial(), }; let config: RenovateConfig; @@ -49,7 +49,7 @@ describe('workers/repository/config-migration/pr/index', () => { describe('ensureConfigMigrationPr()', () => { beforeEach(() => { spy.mockImplementation((input) => input); - platform.createPr.mockResolvedValueOnce(partial({})); + platform.createPr.mockResolvedValueOnce(partial()); }); let createPrBody: string; @@ -166,7 +166,7 @@ describe('workers/repository/config-migration/pr/index', () => { await ensureConfigMigrationPr(config, { content: migratedContent, filename: 'renovate.json5', - indent: partial({}), + indent: partial(), }); expect(platform.createPr).toHaveBeenCalledTimes(1); expect(platform.createPr.mock.calls[0][0].prBody).toMatchSnapshot(); diff --git a/lib/workers/repository/configured.ts b/lib/workers/repository/configured.ts index 80e88016f5c9c5..d6b57ee7a33291 100644 --- a/lib/workers/repository/configured.ts +++ b/lib/workers/repository/configured.ts @@ -8,7 +8,7 @@ export function checkIfConfigured(config: RenovateConfig): void { if (config.enabled === false) { throw new Error(REPOSITORY_DISABLED_BY_CONFIG); } - if (config.isFork && !config.includeForks) { + if (config.isFork && config.forkProcessing !== 'enabled') { throw new Error(REPOSITORY_FORKED); } } diff --git a/lib/workers/repository/extract/extract-fingerprint-config.spec.ts b/lib/workers/repository/extract/extract-fingerprint-config.spec.ts index e18da13569c136..76977db7552183 100644 --- a/lib/workers/repository/extract/extract-fingerprint-config.spec.ts +++ b/lib/workers/repository/extract/extract-fingerprint-config.spec.ts @@ -99,7 +99,10 @@ describe('workers/repository/extract/extract-fingerprint-config', () => { ).toEqual({ enabled: true, fileList: [], - fileMatch: ['(^|/|\\.)Dockerfile$', '(^|/)Dockerfile[^/]*$'], + fileMatch: [ + '(^|/|\\.)(Docker|Container)file$', + '(^|/)(Docker|Container)file[^/]*$', + ], ignorePaths: ['**/node_modules/**', '**/bower_components/**'], includePaths: [], manager: 'dockerfile', diff --git a/lib/workers/repository/extract/index.ts b/lib/workers/repository/extract/index.ts index 57395bf4075eb9..a2337de4a45d26 100644 --- a/lib/workers/repository/extract/index.ts +++ b/lib/workers/repository/extract/index.ts @@ -52,12 +52,20 @@ export async function extractAllDependencies( extractResult.extractionFingerprints[manager] = hashMap.get(manager); } + const extractDurations: Record = {}; const extractResults = await Promise.all( extractList.map(async (managerConfig) => { + const start = Date.now(); const packageFiles = await getManagerPackageFiles(managerConfig); + const durationMs = Math.round(Date.now() - start); + extractDurations[managerConfig.manager] = durationMs; return { manager: managerConfig.manager, packageFiles }; }) ); + logger.debug( + { managers: extractDurations }, + 'manager extract durations (ms)' + ); let fileCount = 0; for (const { manager, packageFiles } of extractResults) { if (packageFiles?.length) { diff --git a/lib/workers/repository/extract/manager-files.spec.ts b/lib/workers/repository/extract/manager-files.spec.ts index 502ab7a53a2abb..3dbafbc1512a0c 100644 --- a/lib/workers/repository/extract/manager-files.spec.ts +++ b/lib/workers/repository/extract/manager-files.spec.ts @@ -59,7 +59,7 @@ describe('workers/repository/extract/manager-files', () => { expect(res).toEqual([ { packageFile: 'Dockerfile', - deps: [{ depIndex: 0 }, { depIndex: 1, replaceString: 'abc' }], + deps: [{}, { replaceString: 'abc' }], }, ]); }); diff --git a/lib/workers/repository/extract/manager-files.ts b/lib/workers/repository/extract/manager-files.ts index 561456a27bd0f8..f74196bd6b0835 100644 --- a/lib/workers/repository/extract/manager-files.ts +++ b/lib/workers/repository/extract/manager-files.ts @@ -35,13 +35,6 @@ export async function getManagerPackageFiles( config, fileList ); - if (allPackageFiles) { - for (const packageFile of allPackageFiles) { - for (let index = 0; index < packageFile.deps.length; index += 1) { - packageFile.deps[index].depIndex = index; - } - } - } return allPackageFiles; } const packageFiles: PackageFile[] = []; @@ -56,9 +49,6 @@ export async function getManagerPackageFiles( config ); if (res) { - for (let index = 0; index < res.deps.length; index += 1) { - res.deps[index].depIndex = index; - } packageFiles.push({ ...res, packageFile, diff --git a/lib/workers/repository/index.ts b/lib/workers/repository/index.ts index 0d6f4dd0e7af91..5352b8123ed482 100644 --- a/lib/workers/repository/index.ts +++ b/lib/workers/repository/index.ts @@ -24,7 +24,7 @@ import { ensureOnboardingPr } from './onboarding/pr'; import { extractDependencies, updateRepo } from './process'; import type { ExtractResult } from './process/extract-update'; import { ProcessResult, processResult } from './result'; -import { printRequestStats } from './stats'; +import { printLookupStats, printRequestStats } from './stats'; // istanbul ignore next export async function renovateRepository( @@ -109,6 +109,7 @@ export async function renovateRepository( const splits = getSplits(); logger.debug(splits, 'Repository timing splits (milliseconds)'); printRequestStats(); + printLookupStats(); printDnsStats(); clearDnsCache(); schemaUtil.reportErrors(); diff --git a/lib/workers/repository/init/apis.spec.ts b/lib/workers/repository/init/apis.spec.ts index 2daa89b7d150fd..b87e59d4013abf 100644 --- a/lib/workers/repository/init/apis.spec.ts +++ b/lib/workers/repository/init/apis.spec.ts @@ -15,7 +15,7 @@ describe('workers/repository/init/apis', () => { config.warnings = []; config.token = 'some-token'; delete config.optimizeForDisabled; - delete config.includeForks; + delete config.forkProcessing; }); afterEach(() => { @@ -53,15 +53,30 @@ describe('workers/repository/init/apis', () => { isFork: true, repoFingerprint: '123', }); - platform.getJsonFile.mockResolvedValueOnce({ includeForks: false }); + platform.getJsonFile.mockResolvedValueOnce({ + forkProcessing: 'disabled', + }); await expect( initApis({ ...config, - includeForks: false, + forkProcessing: 'disabled', }) ).rejects.toThrow(REPOSITORY_FORKED); }); + it('does not throw for includeForks=true', async () => { + platform.initRepo.mockResolvedValueOnce({ + defaultBranch: 'master', + isFork: true, + repoFingerprint: '123', + }); + platform.getJsonFile.mockResolvedValueOnce({ + includeForks: true, + }); + const workerPlatformConfig = await initApis(config); + expect(workerPlatformConfig).toBeTruthy(); + }); + it('ignores platform.getJsonFile() failures', async () => { platform.initRepo.mockResolvedValueOnce({ defaultBranch: 'master', @@ -73,7 +88,7 @@ describe('workers/repository/init/apis', () => { initApis({ ...config, optimizeForDisabled: true, - includeForks: false, + forkProcessing: 'disabled', isFork: true, }) ).resolves.not.toThrow(); @@ -85,7 +100,9 @@ describe('workers/repository/init/apis', () => { isFork: false, repoFingerprint: '123', }); - platform.getJsonFile.mockResolvedValueOnce({ includeForks: false }); + platform.getJsonFile.mockResolvedValueOnce({ + forkProcessing: 'disabled', + }); const workerPlatformConfig = await initApis({ ...config, optimizeForDisabled: true, @@ -107,7 +124,9 @@ describe('workers/repository/init/apis', () => { isFork: false, repoFingerprint: '123', }); - platform.getJsonFile.mockResolvedValueOnce({ includeForks: false }); + platform.getJsonFile.mockResolvedValueOnce({ + forkProcessing: 'disabled', + }); const workerPlatformConfig = await initApis({ ...config, optimizeForDisabled: true, @@ -124,7 +143,7 @@ describe('workers/repository/init/apis', () => { isFork: false, repoFingerprint: '123', }); - platform.getJsonFile.mockResolvedValueOnce({ includeForks: false }); + platform.getJsonFile.mockResolvedValueOnce({ forkProcessing: false }); const workerPlatformConfig = await initApis({ ...config, optimizeForDisabled: true, diff --git a/lib/workers/repository/init/apis.ts b/lib/workers/repository/init/apis.ts index d1d425ad335ed4..1eec1212a139db 100644 --- a/lib/workers/repository/init/apis.ts +++ b/lib/workers/repository/init/apis.ts @@ -4,6 +4,7 @@ import { REPOSITORY_DISABLED_BY_CONFIG, REPOSITORY_FORKED, } from '../../../constants/error-messages'; +import { logger } from '../../../logger'; import { RepoParams, RepoResult, platform } from '../../../modules/platform'; // TODO: fix types (#7154) @@ -37,11 +38,15 @@ async function validateOptimizeForDisabled( } async function validateIncludeForks(config: RenovateConfig): Promise { - if (!config.includeForks && config.isFork) { + if (config.forkProcessing !== 'enabled' && config.isFork) { const renovateConfig = await getJsonFile(defaultConfigFile(config)); - if (!renovateConfig?.includeForks) { + if ( + renovateConfig?.includeForks !== true && + renovateConfig?.forkProcessing !== 'enabled' + ) { throw new Error(REPOSITORY_FORKED); } + logger.debug('Repository config enables forks - continuing'); } } diff --git a/lib/workers/repository/init/merge.spec.ts b/lib/workers/repository/init/merge.spec.ts index 0c29c095427f39..5a03b80b845ced 100644 --- a/lib/workers/repository/init/merge.spec.ts +++ b/lib/workers/repository/init/merge.spec.ts @@ -3,12 +3,16 @@ import { fs, getConfig, git, + logger, mocked, + partial, platform, } from '../../../../test/util'; import * as _migrateAndValidate from '../../../config/migrate-validate'; import * as _migrate from '../../../config/migration'; +import * as repoCache from '../../../util/cache/repository'; import { initRepoCache } from '../../../util/cache/repository/init'; +import type { RepoCacheData } from '../../../util/cache/repository/types'; import { checkForRepoConfigError, detectRepoFileConfig, @@ -45,6 +49,21 @@ describe('workers/repository/init/merge', () => { expect(await detectRepoFileConfig()).toEqual({}); }); + it('returns config if not found - uses cache', async () => { + jest + .spyOn(repoCache, 'getCache') + .mockReturnValueOnce( + partial({ configFileName: 'renovate.json' }) + ); + platform.getRawFile.mockRejectedValueOnce(new Error()); + git.getFileList.mockResolvedValue(['package.json']); + fs.readLocalFile.mockResolvedValue('{}'); + expect(await detectRepoFileConfig()).toEqual({}); + expect(logger.logger.debug).toHaveBeenCalledWith( + 'Existing config file no longer exists' + ); + }); + it('uses package.json config if found', async () => { git.getFileList.mockResolvedValue(['package.json']); const pJson = JSON.stringify({ diff --git a/lib/workers/repository/init/merge.ts b/lib/workers/repository/init/merge.ts index cf4dd8106b9b55..04c3cba0e61cba 100644 --- a/lib/workers/repository/init/merge.ts +++ b/lib/workers/repository/init/merge.ts @@ -17,6 +17,7 @@ import { import { logger } from '../../../logger'; import * as npmApi from '../../../modules/datasource/npm'; import { platform } from '../../../modules/platform'; +import { ExternalHostError } from '../../../types/errors/external-host-error'; import { getCache } from '../../../util/cache/repository'; import { readLocalFile } from '../../../util/fs'; import { getFileList } from '../../../util/git'; @@ -51,7 +52,16 @@ export async function detectRepoFileConfig(): Promise { const cache = getCache(); let { configFileName } = cache; if (configFileName) { - const configFileRaw = await platform.getRawFile(configFileName); + let configFileRaw: string | null; + try { + configFileRaw = await platform.getRawFile(configFileName); + } catch (err) { + // istanbul ignore if + if (err instanceof ExternalHostError) { + throw err; + } + configFileRaw = null; + } if (configFileRaw) { let configFileParsed = JSON5.parse(configFileRaw); if (configFileName !== 'package.json') { @@ -61,6 +71,7 @@ export async function detectRepoFileConfig(): Promise { return { configFileName, configFileParsed }; // don't return raw 'package.json' } else { logger.debug('Existing config file no longer exists'); + delete cache.configFileName; } } configFileName = (await detectConfigFile()) ?? undefined; diff --git a/lib/workers/repository/init/vulnerability.spec.ts b/lib/workers/repository/init/vulnerability.spec.ts index 527fa506a5c1bd..10e1df6b8b6bb8 100644 --- a/lib/workers/repository/init/vulnerability.spec.ts +++ b/lib/workers/repository/init/vulnerability.spec.ts @@ -48,7 +48,7 @@ describe('workers/repository/init/vulnerability', () => { // TODO #7154 delete config.vulnerabilityAlerts!.enabled; platform.getVulnerabilityAlerts.mockResolvedValue([ - partial({}), + partial(), { dismissReason: null, vulnerableManifestFilename: 'package-lock.json', diff --git a/lib/workers/repository/onboarding/branch/index.ts b/lib/workers/repository/onboarding/branch/index.ts index e2b07ce4bebaaa..2add4def7375e7 100644 --- a/lib/workers/repository/onboarding/branch/index.ts +++ b/lib/workers/repository/onboarding/branch/index.ts @@ -28,7 +28,7 @@ export async function checkOnboardingBranch( logger.debug('Repo is onboarded'); return { ...config, repoIsOnboarded }; } - if (config.isFork && !config.includeForks) { + if (config.isFork && config.forkProcessing !== 'enabled') { throw new Error(REPOSITORY_FORKED); } logger.debug('Repo is not onboarded'); diff --git a/lib/workers/repository/onboarding/pr/index.spec.ts b/lib/workers/repository/onboarding/pr/index.spec.ts index 4ec902ae2f662f..500a62d1e71ea0 100644 --- a/lib/workers/repository/onboarding/pr/index.spec.ts +++ b/lib/workers/repository/onboarding/pr/index.spec.ts @@ -39,7 +39,7 @@ describe('workers/repository/onboarding/pr/index', () => { packageFiles = { npm: [{ packageFile: 'package.json', deps: [] }] }; branches = []; platform.massageMarkdown = jest.fn((input) => input); - platform.createPr.mockResolvedValueOnce(partial({})); + platform.createPr.mockResolvedValueOnce(partial()); GlobalConfig.reset(); }); diff --git a/lib/workers/repository/onboarding/pr/index.ts b/lib/workers/repository/onboarding/pr/index.ts index d1d7ce2b71422e..923dec654e8c2d 100644 --- a/lib/workers/repository/onboarding/pr/index.ts +++ b/lib/workers/repository/onboarding/pr/index.ts @@ -171,7 +171,10 @@ If you need any further assistance then you can also [request help here](${ prTitle: config.onboardingPrTitle!, prBody, labels, - platformOptions: getPlatformPrOptions({ ...config, automerge: false }), + platformOptions: getPlatformPrOptions({ + ...config, + automerge: false, + }), }); logger.info( { pr: `Pull Request #${pr!.number}` }, diff --git a/lib/workers/repository/process/__snapshots__/fetch.spec.ts.snap b/lib/workers/repository/process/__snapshots__/fetch.spec.ts.snap index 0342ca9a090742..50e2e373af26d3 100644 --- a/lib/workers/repository/process/__snapshots__/fetch.spec.ts.snap +++ b/lib/workers/repository/process/__snapshots__/fetch.spec.ts.snap @@ -11,6 +11,7 @@ exports[`workers/repository/process/fetch fetchUpdates() fetches updates 1`] = ` { "datasource": "maven", "depName": "bbb", + "packageName": "bbb", "updates": [ "a", "b", @@ -30,16 +31,19 @@ exports[`workers/repository/process/fetch fetchUpdates() handles ignored, skippe "deps": [ { "depName": "abcd", + "packageName": "abcd", "skipReason": "ignored", "updates": [], }, { "depName": "foo", + "packageName": "foo", "skipReason": "disabled", "updates": [], }, { "depName": "skipped", + "packageName": "skipped", "skipReason": "some-reason", "updates": [], }, diff --git a/lib/workers/repository/process/fetch.ts b/lib/workers/repository/process/fetch.ts index 6d46cb4402ee98..38dc52b314be76 100644 --- a/lib/workers/repository/process/fetch.ts +++ b/lib/workers/repository/process/fetch.ts @@ -12,6 +12,8 @@ import type { PackageFile, } from '../../../modules/manager/types'; import { ExternalHostError } from '../../../types/errors/external-host-error'; +import * as memCache from '../../../util/cache/memory'; +import type { LookupStats } from '../../../util/cache/memory/types'; import { clone } from '../../../util/clone'; import { applyPackageRules } from '../../../util/package-rules'; import * as p from '../../../util/promises'; @@ -28,7 +30,8 @@ async function fetchDepUpdates( if (is.string(dep.depName)) { dep.depName = dep.depName.trim(); } - if (!is.nonEmptyString(dep.depName)) { + dep.packageName ??= dep.depName; + if (!is.nonEmptyString(dep.packageName)) { dep.skipReason = 'invalid-name'; } if (dep.isInternal && !packageFileConfig.updateInternalDeps) { @@ -44,6 +47,7 @@ async function fetchDepUpdates( depConfig = mergeChildConfig(depConfig, datasourceDefaultConfig); depConfig.versioning ??= getDefaultVersioning(depConfig.datasource); depConfig = applyPackageRules(depConfig); + depConfig.packageName ??= depConfig.depName; if (depConfig.ignoreDeps!.includes(depName!)) { // TODO: fix types (#7154) logger.debug(`Dependency: ${depName!}, is ignored`); @@ -54,10 +58,15 @@ async function fetchDepUpdates( } else { if (depConfig.datasource) { try { + const start = Date.now(); dep = { ...dep, ...(await lookupUpdates(depConfig as LookupUpdateConfig)), }; + const duration = Date.now() - start; + const lookups = memCache.get('lookup-stats') || []; + lookups.push({ datasource: depConfig.datasource, duration }); + memCache.set('lookup-stats', lookups); } catch (err) { if ( packageFileConfig.repoIsOnboarded || diff --git a/lib/workers/repository/process/limits.spec.ts b/lib/workers/repository/process/limits.spec.ts index 2b8feb28536ece..4e09fb513daee0 100644 --- a/lib/workers/repository/process/limits.spec.ts +++ b/lib/workers/repository/process/limits.spec.ts @@ -41,13 +41,14 @@ describe('workers/repository/process/limits', () => { }); it('returns prHourlyLimit if errored', async () => { - config.prHourlyLimit = 2; + config.prHourlyLimit = 5; platform.getPrList.mockRejectedValue('Unknown error'); const res = await limits.getPrHourlyRemaining(config); - expect(res).toBe(2); + expect(res).toBe(5); }); it('returns 99 if no hourly limit', async () => { + config.prHourlyLimit = 0; const res = await limits.getPrHourlyRemaining(config); expect(res).toBe(99); }); @@ -73,6 +74,7 @@ describe('workers/repository/process/limits', () => { }); it('returns 99 if no concurrent limit', async () => { + config.prConcurrentLimit = 0; const res = await limits.getConcurrentPrsRemaining(config, []); expect(res).toBe(99); }); @@ -80,16 +82,16 @@ describe('workers/repository/process/limits', () => { describe('getPrsRemaining()', () => { it('returns hourly limit', async () => { - config.prHourlyLimit = 5; + config.prHourlyLimit = 1; platform.getPrList.mockResolvedValueOnce([]); const res = await limits.getPrsRemaining(config, []); - expect(res).toBe(5); + expect(res).toBe(1); }); it('returns concurrent limit', async () => { - config.prConcurrentLimit = 5; + config.prConcurrentLimit = 1; const res = await limits.getPrsRemaining(config, []); - expect(res).toBe(5); + expect(res).toBe(1); }); }); @@ -120,9 +122,9 @@ describe('workers/repository/process/limits', () => { expect(res).toBe(99); }); - it('returns 99 if no limits are set', async () => { + it('returns 10 if no limits are set', async () => { const res = await limits.getConcurrentBranchesRemaining(config, []); - expect(res).toBe(99); + expect(res).toBe(10); }); it('returns prConcurrentLimit if errored', async () => { diff --git a/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap b/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap index 7aa6e537ce89d7..e913e5426085b9 100644 --- a/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap +++ b/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap @@ -8,7 +8,7 @@ exports[`workers/repository/process/lookup/index .lookupUpdates() handles digest "fixedVersion": "8.0.0", "homepage": undefined, "isSingleVersion": true, - "registryUrl": undefined, + "registryUrl": "https://index.docker.io", "sourceUrl": "https://github.com/nodejs/node", "updates": [ { @@ -54,7 +54,7 @@ exports[`workers/repository/process/lookup/index .lookupUpdates() handles digest "dependencyUrl": undefined, "fixedVersion": "8.1.0", "homepage": undefined, - "registryUrl": undefined, + "registryUrl": "https://index.docker.io", "sourceUrl": "https://github.com/nodejs/node", "updates": [ { @@ -77,7 +77,7 @@ exports[`workers/repository/process/lookup/index .lookupUpdates() handles digest "fixedVersion": "8.0.0", "homepage": undefined, "isSingleVersion": true, - "registryUrl": undefined, + "registryUrl": "https://index.docker.io", "sourceUrl": "https://github.com/nodejs/node", "updates": [ { @@ -128,26 +128,6 @@ exports[`workers/repository/process/lookup/index .lookupUpdates() handles git su } `; -exports[`workers/repository/process/lookup/index .lookupUpdates() handles replacements 1`] = ` -{ - "changelogUrl": undefined, - "currentVersion": "1.4.1", - "dependencyUrl": undefined, - "fixedVersion": "1.4.1", - "homepage": undefined, - "registryUrl": "https://registry.npmjs.org", - "sourceUrl": "https://github.com/kriskowal/q", - "updates": [ - { - "newName": "r", - "newValue": "2.0.0", - "updateType": "replacement", - }, - ], - "versioning": "npm", - "warnings": [], -} -`; exports[`workers/repository/process/lookup/index .lookupUpdates() handles sourceUrl packageRules with version restrictions 1`] = ` { @@ -556,7 +536,7 @@ exports[`workers/repository/process/lookup/index .lookupUpdates() skips uncompat "fixedVersion": "8", "homepage": undefined, "isSingleVersion": true, - "registryUrl": undefined, + "registryUrl": "https://index.docker.io", "sourceUrl": "https://github.com/nodejs/node", "updates": [ { @@ -615,7 +595,7 @@ exports[`workers/repository/process/lookup/index .lookupUpdates() skips uncompat "fixedVersion": "8.1.0", "homepage": undefined, "isSingleVersion": true, - "registryUrl": undefined, + "registryUrl": "https://index.docker.io", "sourceUrl": "https://github.com/nodejs/node", "updates": [ { diff --git a/lib/workers/repository/process/lookup/filter-checks.ts b/lib/workers/repository/process/lookup/filter-checks.ts index 93044425c83425..4cd6ac70f6150d 100644 --- a/lib/workers/repository/process/lookup/filter-checks.ts +++ b/lib/workers/repository/process/lookup/filter-checks.ts @@ -62,7 +62,7 @@ export async function filterInternalChecks( if (is.integer(stabilityDays) && releaseTimestamp) { if (getElapsedDays(releaseTimestamp) < stabilityDays) { // Skip it if it doesn't pass checks - logger.debug( + logger.trace( { depName, check: 'stabilityDays' }, `Release ${candidateRelease.version} is pending status checks` ); @@ -73,16 +73,17 @@ export async function filterInternalChecks( // TODO #7154 if (isActiveConfidenceLevel(minimumConfidence!)) { - const confidenceLevel = await getMergeConfidenceLevel( - datasource!, - depName!, - currentVersion!, - newVersion, - updateType! - ); + const confidenceLevel = + (await getMergeConfidenceLevel( + datasource!, + depName!, + currentVersion!, + newVersion, + updateType! + )) ?? 'neutral'; // TODO #7154 if (!satisfiesConfidenceLevel(confidenceLevel, minimumConfidence!)) { - logger.debug( + logger.trace( { depName, check: 'minimumConfidence' }, `Release ${candidateRelease.version} is pending status checks` ); @@ -97,7 +98,7 @@ export async function filterInternalChecks( if (!release) { if (pendingReleases.length) { // If all releases were pending then just take the highest - logger.debug( + logger.trace( { depName, bucket }, 'All releases are pending - using latest' ); diff --git a/lib/workers/repository/process/lookup/generate.ts b/lib/workers/repository/process/lookup/generate.ts index 3df6376504b689..5ad3cefff1d30d 100644 --- a/lib/workers/repository/process/lookup/generate.ts +++ b/lib/workers/repository/process/lookup/generate.ts @@ -1,19 +1,21 @@ +import is from '@sindresorhus/is'; import { logger } from '../../../../logger'; import type { Release } from '../../../../modules/datasource'; import type { LookupUpdate } from '../../../../modules/manager/types'; import type { VersioningApi } from '../../../../modules/versioning'; import type { RangeStrategy } from '../../../../types'; +import { getMergeConfidenceLevel } from '../../../../util/merge-confidence'; import type { LookupUpdateConfig } from './types'; import { getUpdateType } from './update-type'; -export function generateUpdate( +export async function generateUpdate( config: LookupUpdateConfig, versioning: VersioningApi, rangeStrategy: RangeStrategy, currentVersion: string, bucket: string, release: Release -): LookupUpdate { +): Promise { const newVersion = release.version; const update: LookupUpdate = { bucket, @@ -77,6 +79,16 @@ export function generateUpdate( update.updateType = update.updateType ?? getUpdateType(config, versioning, currentVersion, newVersion); + const { datasource, packageName, packageRules } = config; + if (packageRules?.some((pr) => is.nonEmptyArray(pr.matchConfidence))) { + update.mergeConfidenceLevel = await getMergeConfidenceLevel( + datasource, + packageName, + currentVersion, + newVersion, + update.updateType + ); + } if (!versioning.isVersion(update.newValue)) { update.isRange = true; } diff --git a/lib/workers/repository/process/lookup/index.spec.ts b/lib/workers/repository/process/lookup/index.spec.ts index a9ed162fc30eee..2039816e067f5f 100644 --- a/lib/workers/repository/process/lookup/index.spec.ts +++ b/lib/workers/repository/process/lookup/index.spec.ts @@ -1,6 +1,7 @@ +import * as hostRules from '../../../../../lib/util/host-rules'; import { Fixtures } from '../../../../../test/fixtures'; import * as httpMock from '../../../../../test/http-mock'; -import { getConfig, mocked, partial } from '../../../../../test/util'; +import { getConfig, partial } from '../../../../../test/util'; import { CONFIG_VALIDATION } from '../../../../constants/error-messages'; import { DockerDatasource } from '../../../../modules/datasource/docker'; import { GitRefsDatasource } from '../../../../modules/datasource/git-refs'; @@ -14,12 +15,14 @@ import { id as gitVersioningId } from '../../../../modules/versioning/git'; import { id as npmVersioningId } from '../../../../modules/versioning/npm'; import { id as pep440VersioningId } from '../../../../modules/versioning/pep440'; import { id as poetryVersioningId } from '../../../../modules/versioning/poetry'; +import type { HostRule } from '../../../../types'; +import * as memCache from '../../../../util/cache/memory'; import * as githubGraphql from '../../../../util/github/graphql'; +import { initConfig, resetConfig } from '../../../../util/merge-confidence'; +import * as McApi from '../../../../util/merge-confidence'; import type { LookupUpdateConfig } from './types'; import * as lookup from '.'; -jest.mock('../../../../modules/datasource/docker'); - const fixtureRoot = '../../../../config/npm'; const qJson = { ...Fixtures.getJson('01.json', fixtureRoot), @@ -33,8 +36,6 @@ const typescriptJson = Fixtures.get('typescript.json', fixtureRoot); const vueJson = Fixtures.get('vue.json', fixtureRoot); const webpackJson = Fixtures.get('webpack.json', fixtureRoot); -const docker = mocked(DockerDatasource.prototype); - let config: LookupUpdateConfig; describe('workers/repository/process/lookup/index', () => { @@ -43,7 +44,16 @@ describe('workers/repository/process/lookup/index', () => { 'getReleases' ); + const getDockerReleases = jest.spyOn( + DockerDatasource.prototype, + 'getReleases' + ); + + const getDockerDigest = jest.spyOn(DockerDatasource.prototype, 'getDigest'); + beforeEach(() => { + // TODO: fix wrong tests + jest.resetAllMocks(); // TODO: fix types #7154 config = partial(getConfig() as never); config.manager = 'npm'; @@ -62,18 +72,19 @@ describe('workers/repository/process/lookup/index', () => { // TODO: fix mocks afterEach(() => { httpMock.clear(false); + hostRules.clear(); }); describe('.lookupUpdates()', () => { it('returns null if unknown datasource', async () => { - config.depName = 'some-dep'; + config.packageName = 'some-dep'; config.datasource = 'does not exist'; expect((await lookup.lookupUpdates(config)).updates).toEqual([]); }); it('returns rollback for pinned version', async () => { config.currentValue = '0.9.99'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; config.rollbackPrs = true; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); @@ -85,7 +96,7 @@ describe('workers/repository/process/lookup/index', () => { it('returns rollback for ranged version', async () => { config.currentValue = '^0.9.99'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; config.rollbackPrs = true; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); @@ -97,7 +108,7 @@ describe('workers/repository/process/lookup/index', () => { it('supports minor and major upgrades for tilde ranges', async () => { config.currentValue = '^0.4.0'; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -110,7 +121,7 @@ describe('workers/repository/process/lookup/index', () => { it('supports lock file updates mixed with regular updates', async () => { config.currentValue = '^0.4.0'; config.rangeStrategy = 'update-lockfile'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; config.separateMinorPatch = true; config.lockedVersion = '0.4.0'; @@ -126,7 +137,7 @@ describe('workers/repository/process/lookup/index', () => { config.groupName = 'somegroup'; config.currentValue = '0.4.0'; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = await lookup.lookupUpdates(config); @@ -138,7 +149,7 @@ describe('workers/repository/process/lookup/index', () => { config.groupName = 'somegroup'; config.currentValue = '0.4.0'; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.separateMinorPatch = true; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); @@ -152,7 +163,7 @@ describe('workers/repository/process/lookup/index', () => { config.currentValue = '0.4.0'; config.rangeStrategy = 'pin'; config.separateMajorMinor = false; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = await lookup.lookupUpdates(config); @@ -164,7 +175,7 @@ describe('workers/repository/process/lookup/index', () => { config.minor = { automerge: true }; config.currentValue = '^0.4.0'; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -177,7 +188,7 @@ describe('workers/repository/process/lookup/index', () => { it('enforces allowedVersions', async () => { config.currentValue = '0.4.0'; config.allowedVersions = '<1'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toHaveLength(1); @@ -186,7 +197,7 @@ describe('workers/repository/process/lookup/index', () => { it('enforces allowedVersions with regex', async () => { config.currentValue = '0.4.0'; config.allowedVersions = '/^0/'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toHaveLength(1); @@ -195,7 +206,7 @@ describe('workers/repository/process/lookup/index', () => { it('enforces allowedVersions with negative regex', async () => { config.currentValue = '0.4.0'; config.allowedVersions = '!/^1/'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toHaveLength(1); @@ -204,7 +215,7 @@ describe('workers/repository/process/lookup/index', () => { it('falls back to semver syntax allowedVersions', async () => { config.currentValue = '0.4.0'; config.allowedVersions = '<1'; - config.depName = 'q'; + config.packageName = 'q'; config.versioning = dockerVersioningId; // this doesn't make sense but works for this test config.datasource = NpmDatasource.id; // this doesn't make sense but works for this test httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); @@ -214,7 +225,7 @@ describe('workers/repository/process/lookup/index', () => { it('falls back to pep440 syntax allowedVersions', async () => { config.currentValue = '0.4.0'; config.allowedVersions = '==0.9.4'; - config.depName = 'q'; + config.packageName = 'q'; config.versioning = poetryVersioningId; // this doesn't make sense but works for this test config.datasource = NpmDatasource.id; // this doesn't make sense but works for this test httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); @@ -224,7 +235,7 @@ describe('workers/repository/process/lookup/index', () => { it('skips invalid allowedVersions', async () => { config.currentValue = '0.4.0'; config.allowedVersions = 'less than 1'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); await expect(lookup.lookupUpdates(config)).rejects.toThrow( @@ -235,7 +246,7 @@ describe('workers/repository/process/lookup/index', () => { it('returns patch update even if separate patches not configured', async () => { config.currentValue = '0.9.0'; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = await lookup.lookupUpdates(config); @@ -254,7 +265,7 @@ describe('workers/repository/process/lookup/index', () => { }; config.currentValue = '0.9.0'; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = await lookup.lookupUpdates(config); @@ -266,7 +277,7 @@ describe('workers/repository/process/lookup/index', () => { config.separateMinorPatch = true; config.currentValue = '0.9.0'; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -279,7 +290,7 @@ describe('workers/repository/process/lookup/index', () => { config.separateMinorPatch = true; config.currentValue = '0.8.0'; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = await lookup.lookupUpdates(config); @@ -291,7 +302,7 @@ describe('workers/repository/process/lookup/index', () => { config.separateMajorMinor = false; config.currentValue = '^0.4.0'; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -304,7 +315,7 @@ describe('workers/repository/process/lookup/index', () => { config.separateMajorMinor = false; config.currentValue = '1.0.0'; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -315,7 +326,7 @@ describe('workers/repository/process/lookup/index', () => { it('uses minimum version for vulnerabilityAlerts', async () => { config.currentValue = '1.0.0'; config.isVulnerabilityAlert = true; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = (await lookup.lookupUpdates(config)).updates; @@ -326,7 +337,7 @@ describe('workers/repository/process/lookup/index', () => { it('supports minor and major upgrades for ranged versions', async () => { config.currentValue = '~0.4.0'; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -345,7 +356,7 @@ describe('workers/repository/process/lookup/index', () => { config.currentValue = '*'; config.rangeStrategy = strategy; config.lockedVersion = '0.4.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -366,7 +377,7 @@ describe('workers/repository/process/lookup/index', () => { config.currentValue = 'x'; config.rangeStrategy = strategy; config.lockedVersion = '0.4.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -379,7 +390,7 @@ describe('workers/repository/process/lookup/index', () => { it('supports pinning for x-range-all (no lockfile)', async () => { config.currentValue = '*'; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect(await lookup.lookupUpdates(config)).toMatchObject({ @@ -390,7 +401,7 @@ describe('workers/repository/process/lookup/index', () => { it('covers pinning an unsupported x-range-all value', async () => { config.currentValue = ''; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toEqual([]); @@ -407,7 +418,7 @@ describe('workers/repository/process/lookup/index', () => { async ({ strategy }) => { config.currentValue = 'X'; config.rangeStrategy = strategy; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -420,7 +431,7 @@ describe('workers/repository/process/lookup/index', () => { it('ignores pinning for ranges when other upgrade exists', async () => { config.currentValue = '~0.9.0'; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -432,7 +443,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades minor ranged versions', async () => { config.currentValue = '~1.0.0'; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -445,7 +456,7 @@ describe('workers/repository/process/lookup/index', () => { config.currentValue = '^1.2.1'; config.lockedVersion = '1.2.1'; config.rangeStrategy = 'update-lockfile'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = await lookup.lookupUpdates(config); @@ -457,7 +468,7 @@ describe('workers/repository/process/lookup/index', () => { config.currentValue = '^1.2.1'; config.lockedVersion = '1.2.1'; config.rangeStrategy = 'in-range-only'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = await lookup.lookupUpdates(config); @@ -469,7 +480,7 @@ describe('workers/repository/process/lookup/index', () => { config.currentValue = '~1.2.0'; config.lockedVersion = '1.2.0'; config.rangeStrategy = 'in-range-only'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = await lookup.lookupUpdates(config); @@ -491,7 +502,7 @@ describe('workers/repository/process/lookup/index', () => { it('handles unconstrainedValue values', async () => { config.lockedVersion = '1.2.1'; config.rangeStrategy = 'update-lockfile'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = await lookup.lookupUpdates(config); @@ -517,7 +528,7 @@ describe('workers/repository/process/lookup/index', () => { it('widens minor ranged versions if configured', async () => { config.currentValue = '~1.3.0'; config.rangeStrategy = 'widen'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -528,7 +539,7 @@ describe('workers/repository/process/lookup/index', () => { it('replaces minor complex ranged versions if configured', async () => { config.currentValue = '~1.2.0 || ~1.3.0'; config.rangeStrategy = 'replace'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -539,7 +550,7 @@ describe('workers/repository/process/lookup/index', () => { it('widens major ranged versions if configured', async () => { config.currentValue = '^2.0.0'; config.rangeStrategy = 'widen'; - config.depName = 'webpack'; + config.packageName = 'webpack'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -553,7 +564,7 @@ describe('workers/repository/process/lookup/index', () => { it('replaces major complex ranged versions if configured', async () => { config.currentValue = '^1.0.0 || ^2.0.0'; config.rangeStrategy = 'replace'; - config.depName = 'webpack'; + config.packageName = 'webpack'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -567,7 +578,7 @@ describe('workers/repository/process/lookup/index', () => { it('pins minor ranged versions', async () => { config.currentValue = '^1.0.0'; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -579,7 +590,7 @@ describe('workers/repository/process/lookup/index', () => { config.currentValue = '^1.0.0'; config.lockedVersion = '1.0.0'; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -590,7 +601,7 @@ describe('workers/repository/process/lookup/index', () => { it('ignores minor ranged versions when not pinning', async () => { config.rangeStrategy = 'replace'; config.currentValue = '^1.0.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toHaveLength(0); @@ -600,7 +611,7 @@ describe('workers/repository/process/lookup/index', () => { config.rangeStrategy = 'replace'; config.currentValue = '^1.0.0'; config.lockedVersion = '1.1.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toHaveLength(0); @@ -609,7 +620,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades tilde ranges', async () => { config.rangeStrategy = 'pin'; config.currentValue = '~1.3.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -621,7 +632,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades .x minor ranges', async () => { config.currentValue = '1.3.x'; config.rangeStrategy = 'pin'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -633,7 +644,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades tilde ranges without pinning', async () => { config.rangeStrategy = 'replace'; config.currentValue = '~1.3.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -644,7 +655,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades .x major ranges without pinning', async () => { config.rangeStrategy = 'replace'; config.currentValue = '0.x'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -655,7 +666,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades .x minor ranges without pinning', async () => { config.rangeStrategy = 'replace'; config.currentValue = '1.3.x'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -666,7 +677,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades .x complex minor ranges without pinning', async () => { config.rangeStrategy = 'widen'; config.currentValue = '1.2.x - 1.3.x'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -677,7 +688,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades shorthand major ranges without pinning', async () => { config.rangeStrategy = 'replace'; config.currentValue = '0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -688,7 +699,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades shorthand minor ranges without pinning', async () => { config.rangeStrategy = 'replace'; config.currentValue = '1.3'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -699,7 +710,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades multiple tilde ranges without pinning', async () => { config.rangeStrategy = 'replace'; config.currentValue = '~0.7.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -711,7 +722,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades multiple caret ranges without pinning', async () => { config.rangeStrategy = 'replace'; config.currentValue = '^0.7.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -723,7 +734,7 @@ describe('workers/repository/process/lookup/index', () => { it('supports complex ranges', async () => { config.rangeStrategy = 'widen'; config.currentValue = '^0.7.0 || ^0.8.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = await lookup.lookupUpdates(config); @@ -737,7 +748,7 @@ describe('workers/repository/process/lookup/index', () => { it('supports complex major ranges', async () => { config.rangeStrategy = 'widen'; config.currentValue = '^1.0.0 || ^2.0.0'; - config.depName = 'webpack'; + config.packageName = 'webpack'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -754,7 +765,7 @@ describe('workers/repository/process/lookup/index', () => { it('supports complex major hyphen ranges', async () => { config.rangeStrategy = 'widen'; config.currentValue = '1.x - 2.x'; - config.depName = 'webpack'; + config.packageName = 'webpack'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -768,7 +779,7 @@ describe('workers/repository/process/lookup/index', () => { it('widens .x OR ranges', async () => { config.rangeStrategy = 'widen'; config.currentValue = '1.x || 2.x'; - config.depName = 'webpack'; + config.packageName = 'webpack'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -782,7 +793,7 @@ describe('workers/repository/process/lookup/index', () => { it('widens stanndalone major OR ranges', async () => { config.rangeStrategy = 'widen'; config.currentValue = '1 || 2'; - config.depName = 'webpack'; + config.packageName = 'webpack'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -796,7 +807,7 @@ describe('workers/repository/process/lookup/index', () => { it('supports complex tilde ranges', async () => { config.rangeStrategy = 'widen'; config.currentValue = '~1.2.0 || ~1.3.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -807,7 +818,7 @@ describe('workers/repository/process/lookup/index', () => { it('returns nothing for greater than ranges', async () => { config.rangeStrategy = 'replace'; config.currentValue = '>= 0.7.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toHaveLength(0); @@ -816,7 +827,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades less than equal ranges without pinning', async () => { config.rangeStrategy = 'replace'; config.currentValue = '<= 0.7.2'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -828,7 +839,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades less than ranges without pinning', async () => { config.rangeStrategy = 'replace'; config.currentValue = '< 0.7.2'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -840,7 +851,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades less than major ranges', async () => { config.rangeStrategy = 'replace'; config.currentValue = '< 1'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -851,7 +862,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades less than equal minor ranges', async () => { config.rangeStrategy = 'replace'; config.currentValue = '<= 1.3'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -862,7 +873,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades equal minor ranges', async () => { config.rangeStrategy = 'replace'; config.currentValue = '=1.3.1'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -874,7 +885,7 @@ describe('workers/repository/process/lookup/index', () => { config.rangeStrategy = 'replace'; config.respectLatest = false; config.currentValue = '<= 1'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -885,7 +896,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades major less than equal ranges', async () => { config.rangeStrategy = 'replace'; config.currentValue = '<= 1.0.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = await lookup.lookupUpdates(config); @@ -896,7 +907,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades major less than ranges without pinning', async () => { config.rangeStrategy = 'replace'; config.currentValue = '< 1.0.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = await lookup.lookupUpdates(config); @@ -907,7 +918,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades major greater than less than ranges without pinning', async () => { config.rangeStrategy = 'widen'; config.currentValue = '>= 0.5.0 < 1.0.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = await lookup.lookupUpdates(config); @@ -918,7 +929,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades minor greater than less than ranges without pinning', async () => { config.rangeStrategy = 'widen'; config.currentValue = '>= 0.5.0 <0.8'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = await lookup.lookupUpdates(config); @@ -930,7 +941,7 @@ describe('workers/repository/process/lookup/index', () => { it('upgrades minor greater than less than equals ranges without pinning', async () => { config.rangeStrategy = 'widen'; config.currentValue = '>= 0.5.0 <= 0.8.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = await lookup.lookupUpdates(config); @@ -942,7 +953,7 @@ describe('workers/repository/process/lookup/index', () => { it('rejects reverse ordered less than greater than', async () => { config.rangeStrategy = 'widen'; config.currentValue = '<= 0.8.0 >= 0.5.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = await lookup.lookupUpdates(config); @@ -952,7 +963,7 @@ describe('workers/repository/process/lookup/index', () => { it('supports > latest versions if configured', async () => { config.respectLatest = false; config.currentValue = '1.4.1'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -962,7 +973,7 @@ describe('workers/repository/process/lookup/index', () => { it('should ignore unstable versions if the current version is stable', async () => { config.currentValue = '2.5.16'; - config.depName = 'vue'; + config.packageName = 'vue'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -973,7 +984,7 @@ describe('workers/repository/process/lookup/index', () => { it('should ignore unstable versions from datasource', async () => { config.currentValue = '1.4.4'; - config.depName = 'some/action'; + config.packageName = 'some/action'; config.datasource = GithubReleasesDatasource.id; getGithubReleases.mockResolvedValueOnce({ releases: [ @@ -989,7 +1000,7 @@ describe('workers/repository/process/lookup/index', () => { it('should return pendingChecks', async () => { config.currentValue = '1.4.4'; - config.depName = 'some/action'; + config.packageName = 'some/action'; config.datasource = GithubReleasesDatasource.id; config.stabilityDays = 14; config.internalChecksFilter = 'strict'; @@ -1012,7 +1023,7 @@ describe('workers/repository/process/lookup/index', () => { it('should return pendingVersions', async () => { config.currentValue = '1.4.4'; - config.depName = 'some/action'; + config.packageName = 'some/action'; config.datasource = GithubReleasesDatasource.id; config.stabilityDays = 3; config.internalChecksFilter = 'strict'; @@ -1037,7 +1048,7 @@ describe('workers/repository/process/lookup/index', () => { config.currentValue = '2.5.16'; config.ignoreUnstable = false; config.respectLatest = false; - config.depName = 'vue'; + config.packageName = 'vue'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -1051,7 +1062,7 @@ describe('workers/repository/process/lookup/index', () => { it('should allow unstable versions if the current version is unstable', async () => { config.currentValue = '3.1.0-dev.20180731'; - config.depName = 'typescript'; + config.packageName = 'typescript'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -1065,7 +1076,7 @@ describe('workers/repository/process/lookup/index', () => { it('should not jump unstable versions', async () => { config.currentValue = '3.0.1-insiders.20180726'; - config.depName = 'typescript'; + config.packageName = 'typescript'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -1080,7 +1091,7 @@ describe('workers/repository/process/lookup/index', () => { it('should update pinned versions if updatePinnedDependencies=true', async () => { config.currentValue = '0.0.34'; config.updatePinnedDependencies = true; - config.depName = '@types/helmet'; + config.packageName = '@types/helmet'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -1095,7 +1106,7 @@ describe('workers/repository/process/lookup/index', () => { it('should not update pinned versions if updatePinnedDependencies=false', async () => { config.currentValue = '0.0.34'; config.updatePinnedDependencies = false; - config.depName = '@types/helmet'; + config.packageName = '@types/helmet'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -1107,7 +1118,7 @@ describe('workers/repository/process/lookup/index', () => { it('should follow dist-tag even if newer version exists', async () => { config.currentValue = '3.0.1-insiders.20180713'; - config.depName = 'typescript'; + config.packageName = 'typescript'; config.datasource = NpmDatasource.id; config.followTag = 'insiders'; httpMock @@ -1122,7 +1133,7 @@ describe('workers/repository/process/lookup/index', () => { it('should roll back to dist-tag if current version is higher', async () => { config.currentValue = '3.1.0-dev.20180813'; - config.depName = 'typescript'; + config.packageName = 'typescript'; config.datasource = NpmDatasource.id; config.followTag = 'insiders'; config.rollbackPrs = true; @@ -1138,7 +1149,7 @@ describe('workers/repository/process/lookup/index', () => { it('should jump unstable versions if followTag', async () => { config.currentValue = '3.0.0-insiders.20180706'; - config.depName = 'typescript'; + config.packageName = 'typescript'; config.datasource = NpmDatasource.id; config.followTag = 'insiders'; httpMock @@ -1153,7 +1164,7 @@ describe('workers/repository/process/lookup/index', () => { it('should update nothing if current version is dist-tag', async () => { config.currentValue = '3.0.1-insiders.20180726'; - config.depName = 'typescript'; + config.packageName = 'typescript'; config.datasource = NpmDatasource.id; config.followTag = 'insiders'; httpMock @@ -1166,7 +1177,7 @@ describe('workers/repository/process/lookup/index', () => { it('should warn if no version matches dist-tag', async () => { config.currentValue = '3.0.1-dev.20180726'; - config.depName = 'typescript'; + config.packageName = 'typescript'; config.datasource = NpmDatasource.id; config.followTag = 'foo'; httpMock @@ -1178,7 +1189,7 @@ describe('workers/repository/process/lookup/index', () => { expect(res.updates).toHaveLength(0); expect(res.warnings).toHaveLength(1); expect(res.warnings[0].message).toBe( - "Can't find version with tag foo for typescript" + "Can't find version with tag foo for npm package typescript" ); }); @@ -1186,7 +1197,7 @@ describe('workers/repository/process/lookup/index', () => { config.currentValue = 'v1.0.0'; config.currentDigest = 'bla'; config.digestOneAndOnly = true; - config.depName = 'angular/angular'; + config.packageName = 'angular/angular'; config.datasource = GithubTagsDatasource.id; // Only mock calls once so that the second invocation results in @@ -1215,7 +1226,7 @@ describe('workers/repository/process/lookup/index', () => { it('should not warn if no new digest could be found', async () => { config.currentValue = 'v1.0.0'; config.digestOneAndOnly = true; - config.depName = 'angular/angular'; + config.packageName = 'angular/angular'; config.pinDigests = true; config.datasource = GithubTagsDatasource.id; @@ -1240,7 +1251,7 @@ describe('workers/repository/process/lookup/index', () => { it('should treat zero zero tilde ranges as 0.0.x', async () => { config.rangeStrategy = 'replace'; config.currentValue = '~0.0.34'; - config.depName = '@types/helmet'; + config.packageName = '@types/helmet'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -1252,7 +1263,7 @@ describe('workers/repository/process/lookup/index', () => { it('should treat zero zero caret ranges as pinned', async () => { config.rangeStrategy = 'replace'; config.currentValue = '^0.0.34'; - config.depName = '@types/helmet'; + config.packageName = '@types/helmet'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -1265,7 +1276,7 @@ describe('workers/repository/process/lookup/index', () => { it('should downgrade from missing versions', async () => { config.currentValue = '1.16.1'; - config.depName = 'coffeelint'; + config.packageName = 'coffeelint'; config.datasource = NpmDatasource.id; config.rollbackPrs = true; httpMock @@ -1279,7 +1290,7 @@ describe('workers/repository/process/lookup/index', () => { it('should upgrade to only one major', async () => { config.currentValue = '1.0.0'; - config.depName = 'webpack'; + config.packageName = 'webpack'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -1292,7 +1303,7 @@ describe('workers/repository/process/lookup/index', () => { it('should upgrade to two majors', async () => { config.currentValue = '1.0.0'; config.separateMultipleMajor = true; - config.depName = 'webpack'; + config.packageName = 'webpack'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -1305,7 +1316,7 @@ describe('workers/repository/process/lookup/index', () => { it('does not jump major unstable', async () => { config.currentValue = '^4.4.0-canary.3'; config.rangeStrategy = 'replace'; - config.depName = 'next'; + config.packageName = 'next'; config.datasource = NpmDatasource.id; httpMock .scope('https://registry.npmjs.org') @@ -1318,7 +1329,7 @@ describe('workers/repository/process/lookup/index', () => { it('supports in-range caret updates', async () => { config.rangeStrategy = 'bump'; config.currentValue = '^1.0.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -1329,7 +1340,7 @@ describe('workers/repository/process/lookup/index', () => { it('supports in-range tilde updates', async () => { config.rangeStrategy = 'bump'; config.currentValue = '~1.0.0'; - config.depName = 'q'; + config.packageName = 'q'; config.separateMinorPatch = true; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); @@ -1342,7 +1353,7 @@ describe('workers/repository/process/lookup/index', () => { it('supports in-range tilde patch updates', async () => { config.rangeStrategy = 'bump'; config.currentValue = '~1.0.0'; - config.depName = 'q'; + config.packageName = 'q'; config.separateMinorPatch = true; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); @@ -1355,7 +1366,7 @@ describe('workers/repository/process/lookup/index', () => { it('supports in-range gte updates', async () => { config.rangeStrategy = 'bump'; config.currentValue = '>=1.0.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ @@ -1366,7 +1377,7 @@ describe('workers/repository/process/lookup/index', () => { it('supports majorgte updates', async () => { config.rangeStrategy = 'bump'; config.currentValue = '>=0.9.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; config.separateMajorMinor = false; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); @@ -1378,7 +1389,7 @@ describe('workers/repository/process/lookup/index', () => { it('rejects in-range unsupported operator', async () => { config.rangeStrategy = 'bump'; config.currentValue = '>1.0.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([]); @@ -1387,7 +1398,7 @@ describe('workers/repository/process/lookup/index', () => { it('rejects non-fully specified in-range updates', async () => { config.rangeStrategy = 'bump'; config.currentValue = '1.x'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([]); @@ -1396,14 +1407,14 @@ describe('workers/repository/process/lookup/index', () => { it('rejects complex range in-range updates', async () => { config.rangeStrategy = 'bump'; config.currentValue = '^0.9.0 || ^1.0.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); expect((await lookup.lookupUpdates(config)).updates).toMatchObject([]); }); it('replaces non-range in-range updates', async () => { - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; config.packageFile = 'package.json'; config.rangeStrategy = 'bump'; @@ -1415,7 +1426,7 @@ describe('workers/repository/process/lookup/index', () => { }); it('handles github 404', async () => { - config.depName = 'foo'; + config.packageName = 'foo'; config.datasource = GithubTagsDatasource.id; config.packageFile = 'package.json'; config.currentValue = '1.0.0'; @@ -1424,7 +1435,7 @@ describe('workers/repository/process/lookup/index', () => { }); it('handles pypi 404', async () => { - config.depName = 'foo'; + config.packageName = 'foo'; config.datasource = PypiDatasource.id; config.packageFile = 'requirements.txt'; config.currentValue = '1.0.0'; @@ -1436,7 +1447,7 @@ describe('workers/repository/process/lookup/index', () => { }); it('handles packagist', async () => { - config.depName = 'foo/bar'; + config.packageName = 'foo/bar'; config.datasource = PackagistDatasource.id; config.packageFile = 'composer.json'; config.currentValue = '1.0.0'; @@ -1449,7 +1460,7 @@ describe('workers/repository/process/lookup/index', () => { }); it('handles unknown datasource', async () => { - config.depName = 'foo'; + config.packageName = 'foo'; config.datasource = 'typo'; config.packageFile = 'package.json'; config.currentValue = '1.0.0'; @@ -1464,7 +1475,7 @@ describe('workers/repository/process/lookup/index', () => { config.rangeStrategy = 'pin'; config.lockedVersion = '0.9.4'; config.currentValue = '~=0.9'; - config.depName = 'q'; + config.packageName = 'q'; // TODO: we are using npm as source to test pep440 (#9721) config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); @@ -1477,7 +1488,7 @@ describe('workers/repository/process/lookup/index', () => { it('returns complex object', async () => { config.currentValue = '1.3.0'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); const res = await lookup.lookupUpdates(config); @@ -1487,7 +1498,7 @@ describe('workers/repository/process/lookup/index', () => { it('ignores deprecated', async () => { config.currentValue = '1.3.0'; - config.depName = 'q2'; + config.packageName = 'q2'; config.datasource = NpmDatasource.id; const returnJson = JSON.parse(JSON.stringify(qJson)); returnJson.name = 'q2'; @@ -1503,7 +1514,7 @@ describe('workers/repository/process/lookup/index', () => { it('is deprecated', async () => { config.currentValue = '1.3.0'; - config.depName = 'q3'; + config.packageName = 'q3'; config.datasource = NpmDatasource.id; const returnJson = { ...JSON.parse(JSON.stringify(qJson)), @@ -1523,14 +1534,14 @@ describe('workers/repository/process/lookup/index', () => { it('skips unsupported values', async () => { config.currentValue = 'alpine'; - config.depName = 'node'; + config.packageName = 'node'; config.datasource = DockerDatasource.id; const res = await lookup.lookupUpdates(config); expect(res).toMatchSnapshot({ skipReason: 'invalid-value' }); }); it('skips undefined values', async () => { - config.depName = 'node'; + config.packageName = 'node'; config.datasource = DockerDatasource.id; const res = await lookup.lookupUpdates(config); expect(res).toMatchSnapshot({ skipReason: 'invalid-value' }); @@ -1538,10 +1549,10 @@ describe('workers/repository/process/lookup/index', () => { it('handles digest pin', async () => { config.currentValue = '8.0.0'; - config.depName = 'node'; + config.packageName = 'node'; config.datasource = DockerDatasource.id; config.pinDigests = true; - docker.getReleases.mockResolvedValueOnce({ + getDockerReleases.mockResolvedValueOnce({ releases: [ { version: '8.0.0', @@ -1551,8 +1562,8 @@ describe('workers/repository/process/lookup/index', () => { }, ], }); - docker.getDigest.mockResolvedValueOnce('sha256:abcdef1234567890'); - docker.getDigest.mockResolvedValueOnce('sha256:0123456789abcdef'); + getDockerDigest.mockResolvedValueOnce('sha256:abcdef1234567890'); + getDockerDigest.mockResolvedValueOnce('sha256:0123456789abcdef'); const res = await lookup.lookupUpdates(config); expect(res).toMatchSnapshot({ currentVersion: '8.0.0', @@ -1575,10 +1586,10 @@ describe('workers/repository/process/lookup/index', () => { it('skips uncompatible versions for 8.1.0', async () => { config.currentValue = '8.1.0'; - config.depName = 'node'; + config.packageName = 'node'; config.versioning = dockerVersioningId; config.datasource = DockerDatasource.id; - docker.getReleases.mockResolvedValueOnce({ + getDockerReleases.mockResolvedValueOnce({ releases: [ { version: '8.1.0' }, { version: '8.1.5' }, @@ -1599,10 +1610,10 @@ describe('workers/repository/process/lookup/index', () => { it('skips uncompatible versions for 8.1', async () => { config.currentValue = '8.1'; - config.depName = 'node'; + config.packageName = 'node'; config.versioning = dockerVersioningId; config.datasource = DockerDatasource.id; - docker.getReleases.mockResolvedValueOnce({ + getDockerReleases.mockResolvedValueOnce({ registryUrl: 'https://index.docker.io', releases: [ { version: '8.1.0' }, @@ -1632,10 +1643,10 @@ describe('workers/repository/process/lookup/index', () => { it('skips uncompatible versions for 8', async () => { config.currentValue = '8'; - config.depName = 'node'; + config.packageName = 'node'; config.versioning = dockerVersioningId; config.datasource = DockerDatasource.id; - docker.getReleases.mockResolvedValueOnce({ + getDockerReleases.mockResolvedValueOnce({ releases: [ { version: '8.1.0' }, { version: '8.1.5' }, @@ -1656,10 +1667,10 @@ describe('workers/repository/process/lookup/index', () => { it('handles digest pin for up to date version', async () => { config.currentValue = '8.1.0'; - config.depName = 'node'; + config.packageName = 'node'; config.datasource = DockerDatasource.id; config.pinDigests = true; - docker.getReleases.mockResolvedValueOnce({ + getDockerReleases.mockResolvedValueOnce({ releases: [ { version: '8.0.0', @@ -1669,7 +1680,7 @@ describe('workers/repository/process/lookup/index', () => { }, ], }); - docker.getDigest.mockResolvedValueOnce('sha256:abcdef1234567890'); + getDockerDigest.mockResolvedValueOnce('sha256:abcdef1234567890'); const res = await lookup.lookupUpdates(config); expect(res).toMatchSnapshot({ updates: [ @@ -1685,10 +1696,10 @@ describe('workers/repository/process/lookup/index', () => { it('handles digest pin for non-version', async () => { config.currentValue = 'alpine'; - config.depName = 'node'; + config.packageName = 'node'; config.datasource = DockerDatasource.id; config.pinDigests = true; - docker.getReleases.mockResolvedValueOnce({ + getDockerReleases.mockResolvedValueOnce({ releases: [ { version: '8.0.0', @@ -1701,7 +1712,7 @@ describe('workers/repository/process/lookup/index', () => { }, ], }); - docker.getDigest.mockResolvedValueOnce('sha256:abcdef1234567890'); + getDockerDigest.mockResolvedValueOnce('sha256:abcdef1234567890'); const res = await lookup.lookupUpdates(config); expect(res).toMatchSnapshot({ updates: [ @@ -1717,10 +1728,10 @@ describe('workers/repository/process/lookup/index', () => { it('handles digest lookup failure', async () => { config.currentValue = 'alpine'; - config.depName = 'node'; + config.packageName = 'node'; config.datasource = DockerDatasource.id; config.pinDigests = true; - docker.getReleases.mockResolvedValueOnce({ + getDockerReleases.mockResolvedValueOnce({ releases: [ { version: '8.0.0', @@ -1733,18 +1744,18 @@ describe('workers/repository/process/lookup/index', () => { }, ], }); - docker.getDigest.mockResolvedValueOnce(null); + getDockerDigest.mockResolvedValueOnce(null); const res = await lookup.lookupUpdates(config); expect(res.updates).toHaveLength(0); }); it('handles digest update', async () => { config.currentValue = '8.0.0'; - config.depName = 'node'; + config.packageName = 'node'; config.datasource = DockerDatasource.id; config.currentDigest = 'sha256:zzzzzzzzzzzzzzz'; config.pinDigests = true; - docker.getReleases.mockResolvedValueOnce({ + getDockerReleases.mockResolvedValueOnce({ releases: [ { version: '8.0.0', @@ -1754,8 +1765,8 @@ describe('workers/repository/process/lookup/index', () => { }, ], }); - docker.getDigest.mockResolvedValueOnce('sha256:abcdef1234567890'); - docker.getDigest.mockResolvedValueOnce('sha256:0123456789abcdef'); + getDockerDigest.mockResolvedValueOnce('sha256:abcdef1234567890'); + getDockerDigest.mockResolvedValueOnce('sha256:0123456789abcdef'); const res = await lookup.lookupUpdates(config); expect(res).toMatchSnapshot({ updates: [ @@ -1775,11 +1786,11 @@ describe('workers/repository/process/lookup/index', () => { it('handles digest update for non-version', async () => { config.currentValue = 'alpine'; - config.depName = 'node'; + config.packageName = 'node'; config.datasource = DockerDatasource.id; config.currentDigest = 'sha256:zzzzzzzzzzzzzzz'; config.pinDigests = true; - docker.getReleases.mockResolvedValueOnce({ + getDockerReleases.mockResolvedValueOnce({ releases: [ { version: 'alpine', @@ -1792,7 +1803,7 @@ describe('workers/repository/process/lookup/index', () => { }, ], }); - docker.getDigest.mockResolvedValueOnce('sha256:abcdef1234567890'); + getDockerDigest.mockResolvedValueOnce('sha256:abcdef1234567890'); const res = await lookup.lookupUpdates(config); expect(res).toMatchSnapshot({ updates: [ @@ -1806,7 +1817,7 @@ describe('workers/repository/process/lookup/index', () => { }); it('handles git submodule update', async () => { - config.depName = 'some-path'; + config.packageName = 'some-path'; config.versioning = gitVersioningId; config.datasource = GitRefsDatasource.id; config.currentDigest = 'some-digest'; @@ -1825,7 +1836,7 @@ describe('workers/repository/process/lookup/index', () => { it('handles sourceUrl packageRules with version restrictions', async () => { config.currentValue = '0.9.99'; - config.depName = 'q'; + config.packageName = 'q'; config.datasource = NpmDatasource.id; config.packageRules = [ { @@ -1841,21 +1852,224 @@ describe('workers/repository/process/lookup/index', () => { }); }); - it('handles replacements', async () => { + it('handles replacements - name only without pinDigests enabled', async () => { + config.packageName = 'openjdk'; + config.currentValue = '17.0.0'; + config.datasource = DockerDatasource.id; + config.versioning = dockerVersioningId; + // This config is normally set when packageRules are applied + config.replacementName = 'eclipse-temurin'; + getDockerReleases.mockResolvedValueOnce({ + releases: [ + { + version: '17.0.0', + }, + { + version: '18.0.0', + }, + ], + }); + + expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ + { + updateType: 'replacement', + newName: 'eclipse-temurin', + newValue: '17.0.0', + }, + { + updateType: 'major', + newMajor: 18, + newValue: '18.0.0', + newVersion: '18.0.0', + }, + ]); + }); + + it('handles replacements - name only with pinDigests enabled', async () => { + config.packageName = 'openjdk'; + config.currentValue = '17.0.0'; + config.pinDigests = true; + config.datasource = DockerDatasource.id; + config.versioning = dockerVersioningId; + // This config is normally set when packageRules are applied + config.replacementName = 'eclipse-temurin'; + getDockerReleases.mockResolvedValueOnce({ + releases: [ + { + version: '17.0.0', + }, + { + version: '18.0.0', + }, + ], + }); + getDockerDigest.mockResolvedValueOnce('sha256:abcdef1234567890'); + getDockerDigest.mockResolvedValueOnce('sha256:0123456789abcdef'); + getDockerDigest.mockResolvedValueOnce('sha256:pin0987654321'); + + expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ + { + updateType: 'replacement', + newName: 'eclipse-temurin', + newValue: '17.0.0', + newDigest: 'sha256:abcdef1234567890', + }, + { + updateType: 'major', + newMajor: 18, + newValue: '18.0.0', + newVersion: '18.0.0', + newDigest: 'sha256:0123456789abcdef', + }, + { + isPinDigest: true, + newDigest: 'sha256:pin0987654321', + newValue: '17.0.0', + updateType: 'pinDigest', + }, + ]); + }); + + it('handles replacements - name only no version/tag', async () => { + config.packageName = 'openjdk'; + config.currentValue = undefined; + config.datasource = DockerDatasource.id; + config.versioning = dockerVersioningId; + // This config is normally set when packageRules are applied + config.replacementName = 'eclipse-temurin'; + getDockerDigest.mockResolvedValueOnce('sha256:abcdef1234567890'); + expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ + { + updateType: 'replacement', + newName: 'eclipse-temurin', + newValue: undefined, + }, + ]); + }); + + it('handles replacements - skips if package and replacement names match', async () => { + config.packageName = 'openjdk'; + config.currentValue = undefined; + config.datasource = DockerDatasource.id; + config.replacementName = 'openjdk'; + expect((await lookup.lookupUpdates(config)).updates).toMatchObject([]); + }); + + it('handles replacements - name and version', async () => { config.currentValue = '1.4.1'; - config.depName = 'q'; + config.packageName = 'q'; // This config is normally set when packageRules are applied config.replacementName = 'r'; config.replacementVersion = '2.0.0'; config.datasource = NpmDatasource.id; httpMock.scope('https://registry.npmjs.org').get('/q').reply(200, qJson); - const res = await lookup.lookupUpdates(config); - expect(res).toMatchSnapshot(); + expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ + { + updateType: 'replacement', + newName: 'r', + newValue: '2.0.0', + }, + ]); + }); + + it('handles replacements - can template replacement name without a replacement version', async () => { + config.packageName = 'mirror.some.org/library/openjdk'; + config.currentValue = '17.0.0'; + config.replacementNameTemplate = `{{{replace 'mirror.some.org/' 'new.registry.io/' packageName}}}`; + config.datasource = DockerDatasource.id; + getDockerReleases.mockResolvedValueOnce({ + releases: [ + { + version: '17.0.0', + }, + { + version: '18.0.0', + }, + ], + }); + + expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ + { + updateType: 'replacement', + newName: 'new.registry.io/library/openjdk', + newValue: '17.0.0', + }, + { + updateType: 'major', + newMajor: 18, + newValue: '18.0.0', + newVersion: '18.0.0', + }, + ]); + }); + + it('handles replacements - can template replacement name with a replacement version', async () => { + config.packageName = 'mirror.some.org/library/openjdk'; + config.currentValue = '17.0.0'; + config.replacementNameTemplate = `{{{replace 'mirror.some.org/' 'new.registry.io/' packageName}}}`; + config.replacementVersion = '18.0.0'; + config.datasource = DockerDatasource.id; + getDockerReleases.mockResolvedValueOnce({ + releases: [ + { + version: '17.0.0', + }, + { + version: '18.0.0', + }, + ], + }); + + expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ + { + updateType: 'replacement', + newName: 'new.registry.io/library/openjdk', + newValue: '18.0.0', + }, + { + updateType: 'major', + newMajor: 18, + newValue: '18.0.0', + newVersion: '18.0.0', + }, + ]); + }); + + it('handles replacements - replacementName takes precedence over replacementNameTemplate', async () => { + config.packageName = 'mirror.some.org/library/openjdk'; + config.currentValue = '17.0.0'; + config.replacementNameTemplate = `{{{replace 'mirror.some.org/' 'new.registry.io/' packageName}}}`; + config.replacementName = 'eclipse-temurin'; + config.datasource = DockerDatasource.id; + getDockerReleases.mockResolvedValueOnce({ + releases: [ + { + version: '17.0.0', + }, + { + version: '18.0.0', + }, + ], + }); + + expect((await lookup.lookupUpdates(config)).updates).toMatchObject([ + { + updateType: 'replacement', + newName: 'eclipse-temurin', + newValue: '17.0.0', + }, + { + updateType: 'major', + newMajor: 18, + newValue: '18.0.0', + newVersion: '18.0.0', + }, + ]); }); it('rollback for invalid version to last stable version', async () => { config.currentValue = '2.5.17'; - config.depName = 'vue'; + config.packageName = 'vue'; config.datasource = NpmDatasource.id; config.rollbackPrs = true; config.ignoreUnstable = true; @@ -1874,5 +2088,97 @@ describe('workers/repository/process/lookup/index', () => { }, ]); }); + + describe('handles merge confidence', () => { + const defaultApiBaseUrl = 'https://badges.renovateapi.com/'; + const getMergeConfidenceSpy = jest.spyOn( + McApi, + 'getMergeConfidenceLevel' + ); + const hostRule: HostRule = { + hostType: 'merge-confidence', + token: 'some-token', + }; + + beforeEach(() => { + hostRules.add(hostRule); + initConfig(); + memCache.reset(); + }); + + afterEach(() => { + resetConfig(); + }); + + it('gets a merge confidence level for a given update when corresponding packageRule is in use', async () => { + const datasource = NpmDatasource.id; + const packageName = 'webpack'; + const newVersion = '3.8.1'; + const currentValue = '3.7.0'; + config.packageRules = [{ matchConfidence: ['high'] }]; + config.currentValue = currentValue; + config.packageName = packageName; + config.datasource = datasource; + httpMock + .scope('https://registry.npmjs.org') + .get('/webpack') + .reply(200, webpackJson); + httpMock + .scope(defaultApiBaseUrl) + .get( + `/api/mc/json/${datasource}/${packageName}/${currentValue}/${newVersion}` + ) + .reply(200, { confidence: 'high' }); + + const lookupUpdates = (await lookup.lookupUpdates(config)).updates; + + expect(lookupUpdates).toMatchObject([ + { + mergeConfidenceLevel: `high`, + }, + ]); + }); + + it('does not get a merge confidence level when no packageRule is set', async () => { + config.currentValue = '3.7.0'; + config.packageName = 'webpack'; + config.datasource = NpmDatasource.id; + httpMock + .scope('https://registry.npmjs.org') + .get('/webpack') + .reply(200, webpackJson); + + const lookupUpdates = (await lookup.lookupUpdates(config)).updates; + + expect(getMergeConfidenceSpy).toHaveBeenCalledTimes(0); + expect(lookupUpdates).not.toMatchObject([ + { + mergeConfidenceLevel: expect.anything(), + }, + ]); + }); + + it('does not set merge confidence value when API is not in use', async () => { + const datasource = NpmDatasource.id; + config.packageRules = [{ matchConfidence: ['high'] }]; + config.currentValue = '3.7.0'; + config.packageName = 'webpack'; + config.datasource = datasource; + hostRules.clear(); // reset merge confidence + initConfig(); + httpMock + .scope('https://registry.npmjs.org') + .get('/webpack') + .reply(200, webpackJson); + + const lookupUpdates = (await lookup.lookupUpdates(config)).updates; + + expect(lookupUpdates).not.toMatchObject([ + { + mergeConfidenceLevel: expect.anything(), + }, + ]); + }); + }); }); }); diff --git a/lib/workers/repository/process/lookup/index.ts b/lib/workers/repository/process/lookup/index.ts index 72039cbd938cd9..5b1b0ba7b4d8c5 100644 --- a/lib/workers/repository/process/lookup/index.ts +++ b/lib/workers/repository/process/lookup/index.ts @@ -26,6 +26,11 @@ import { filterInternalChecks } from './filter-checks'; import { generateUpdate } from './generate'; import { getRollbackUpdate } from './rollback'; import type { LookupUpdateConfig, UpdateResult } from './types'; +import { + addReplacementUpdateIfValid, + isReplacementNameRulesConfigured, + isReplacementRulesConfigured, +} from './utils'; export async function lookupUpdates( inconfig: LookupUpdateConfig @@ -35,11 +40,11 @@ export async function lookupUpdates( currentDigest, currentValue, datasource, - depName, digestOneAndOnly, followTag, lockedVersion, packageFile, + packageName, pinDigests, rollbackPrs, isVulnerabilityAlert, @@ -52,7 +57,7 @@ export async function lookupUpdates( warnings: [], } as any; try { - logger.trace({ dependency: depName, currentValue }, 'lookupUpdates'); + logger.trace({ dependency: packageName, currentValue }, 'lookupUpdates'); // Use the datasource's default versioning if none is configured config.versioning ??= getDefaultVersioning(datasource); const versioning = allVersioning.get(config.versioning); @@ -80,16 +85,18 @@ export async function lookupUpdates( if (!dependency) { // If dependency lookup fails then warn and return const warning: ValidationMessage = { - topic: depName, - message: `Failed to look up ${datasource} dependency ${depName}`, + topic: packageName, + message: `Failed to look up ${datasource} package ${packageName}`, }; - logger.debug({ dependency: depName, packageFile }, warning.message); + logger.debug({ dependency: packageName, packageFile }, warning.message); // TODO: return warnings in own field res.warnings.push(warning); return res; } if (dependency.deprecationMessage) { - logger.debug(`Found deprecationMessage for dependency ${depName}`); + logger.debug( + `Found deprecationMessage for ${datasource} package ${packageName}` + ); res.deprecationMessage = dependency.deprecationMessage; } @@ -111,7 +118,7 @@ export async function lookupUpdates( // istanbul ignore if if (allVersions.length === 0) { const message = `Found no results from datasource that look like a version`; - logger.debug({ dependency: depName, result: dependency }, message); + logger.debug({ dependency: packageName, result: dependency }, message); if (!currentDigest) { return res; } @@ -122,8 +129,8 @@ export async function lookupUpdates( const taggedVersion = dependency.tags?.[followTag]; if (!taggedVersion) { res.warnings.push({ - topic: depName, - message: `Can't find version with tag ${followTag} for ${depName}`, + topic: packageName, + message: `Can't find version with tag ${followTag} for ${datasource} package ${packageName}`, }); return res; } @@ -145,28 +152,20 @@ export async function lookupUpdates( // istanbul ignore if if (!rollback) { res.warnings.push({ - topic: depName, + topic: packageName, // TODO: types (#7154) - message: `Can't find version matching ${currentValue!} for ${depName}`, + message: `Can't find version matching ${currentValue!} for ${datasource} package ${packageName}`, }); return res; } res.updates.push(rollback); } let rangeStrategy = getRangeStrategy(config); - if (config.replacementName && config.replacementVersion) { - res.updates.push({ - updateType: 'replacement', - newName: config.replacementName, - newValue: versioning.getNewValue({ - // TODO #7154 - currentValue: currentValue!, - newVersion: config.replacementVersion, - rangeStrategy: rangeStrategy!, - isReplacement: true, - })!, - }); + + if (isReplacementRulesConfigured(config)) { + addReplacementUpdateIfValid(res.updates, config); } + // istanbul ignore next if ( isVulnerabilityAlert && @@ -286,7 +285,7 @@ export async function lookupUpdates( return res; } const newVersion = release.version; - const update = generateUpdate( + const update = await generateUpdate( config, versioning, // TODO #7154 @@ -311,7 +310,7 @@ export async function lookupUpdates( // istanbul ignore if if (rangeStrategy === 'bump') { logger.trace( - { depName, currentValue, lockedVersion, newVersion }, + { packageName, currentValue, lockedVersion, newVersion }, 'Skipping bump because newValue is the same' ); continue; @@ -326,13 +325,19 @@ export async function lookupUpdates( } } else if (currentValue) { logger.debug( - `Dependency ${depName} has unsupported value ${currentValue}` + `Dependency ${packageName} has unsupported/unversioned value ${currentValue} (versioning=${config.versioning})` ); if (!pinDigests && !currentDigest) { res.skipReason = 'invalid-value'; } else { delete res.skipReason; } + } else if (!currentValue && isReplacementNameRulesConfigured(config)) { + logger.debug( + `Handle name-only replacement for ${packageName} without current version` + ); + + addReplacementUpdateIfValid(res.updates, config); } else { res.skipReason = 'invalid-value'; } @@ -387,7 +392,7 @@ export async function lookupUpdates( if (update.newDigest === null) { logger.debug( { - depName, + packageName, currentValue, datasource, newValue: update.newValue, @@ -401,7 +406,7 @@ export async function lookupUpdates( if (currentDigest) { res.warnings.push({ message: `Could not determine new digest for update (datasource: ${datasource})`, - topic: depName, + topic: packageName, }); } } @@ -425,6 +430,8 @@ export async function lookupUpdates( .filter((update) => update.newDigest !== null) .filter( (update) => + (update.newName && update.newName !== packageName) || + update.isReplacement || update.newValue !== currentValue || update.isLockfileUpdate || // TODO #7154 @@ -451,7 +458,7 @@ export async function lookupUpdates( currentDigest, currentValue, datasource, - depName, + packageName, digestOneAndOnly, followTag, lockedVersion, diff --git a/lib/workers/repository/process/lookup/types.ts b/lib/workers/repository/process/lookup/types.ts index 5d0a85f5971ef8..14f1187c629cd7 100644 --- a/lib/workers/repository/process/lookup/types.ts +++ b/lib/workers/repository/process/lookup/types.ts @@ -8,6 +8,7 @@ import type { RangeConfig, } from '../../../../modules/manager/types'; import type { SkipReason } from '../../../../types'; +import type { MergeConfidence } from '../../../../util/merge-confidence/types'; export interface FilterConfig { allowedVersions?: string; @@ -42,9 +43,10 @@ export interface LookupUpdateConfig separateMajorMinor?: boolean; separateMultipleMajor?: boolean; datasource: string; - depName: string; - minimumConfidence?: string; + packageName: string; + minimumConfidence?: MergeConfidence | undefined; replacementName?: string; + replacementNameTemplate?: string; replacementVersion?: string; } diff --git a/lib/workers/repository/process/lookup/utils.ts b/lib/workers/repository/process/lookup/utils.ts new file mode 100644 index 00000000000000..4abf2903681ccf --- /dev/null +++ b/lib/workers/repository/process/lookup/utils.ts @@ -0,0 +1,72 @@ +import is from '@sindresorhus/is'; + +import { getRangeStrategy } from '../../../../modules/manager'; +import type { LookupUpdate } from '../../../../modules/manager/types'; +import * as allVersioning from '../../../../modules/versioning'; +import * as template from '../../../../util/template'; +import type { LookupUpdateConfig } from './types'; + +export function addReplacementUpdateIfValid( + updates: LookupUpdate[], + config: LookupUpdateConfig +): void { + const replacementNewName = determineNewReplacementName(config); + const replacementNewValue = determineNewReplacementValue(config); + + if ( + config.packageName !== replacementNewName || + config.currentValue !== replacementNewValue + ) { + updates.push({ + updateType: 'replacement', + newName: replacementNewName, + newValue: replacementNewValue!, + }); + } +} + +export function isReplacementNameRulesConfigured( + config: LookupUpdateConfig +): boolean { + return ( + is.nonEmptyString(config.replacementName) || + is.nonEmptyString(config.replacementNameTemplate) + ); +} + +export function isReplacementRulesConfigured( + config: LookupUpdateConfig +): boolean { + return ( + isReplacementNameRulesConfigured(config) || + is.nonEmptyString(config.replacementVersion) + ); +} + +export function determineNewReplacementName( + config: LookupUpdateConfig +): string { + return ( + config.replacementName ?? + template.compile(config.replacementNameTemplate!, config, true) + ); +} + +export function determineNewReplacementValue( + config: LookupUpdateConfig +): string | undefined | null { + const versioning = allVersioning.get(config.versioning); + const rangeStrategy = getRangeStrategy(config); + + if (!is.nullOrUndefined(config.replacementVersion)) { + return versioning.getNewValue({ + // TODO #7154 + currentValue: config.currentValue!, + newVersion: config.replacementVersion, + rangeStrategy: rangeStrategy!, + isReplacement: true, + }); + } + + return config.currentValue; +} diff --git a/lib/workers/repository/process/write.spec.ts b/lib/workers/repository/process/write.spec.ts index af3c6bae8b390a..0f96102ee3fdcf 100644 --- a/lib/workers/repository/process/write.spec.ts +++ b/lib/workers/repository/process/write.spec.ts @@ -307,7 +307,7 @@ describe('workers/repository/process/write', () => { ], }, ]; - const repoCacheObj = partial({}); + const repoCacheObj = partial(); repoCache.getCache.mockReturnValueOnce(repoCacheObj); branchWorker.processBranch.mockResolvedValueOnce({ branchExists: true, @@ -377,7 +377,7 @@ describe('workers/repository/process/write', () => { describe('syncBranchState()', () => { it('creates minimal branch state when cache is not populated', () => { - const repoCacheObj = partial({}); + const repoCacheObj = partial(); repoCache.getCache.mockReturnValue(repoCacheObj); scm.getBranchCommit.mockResolvedValueOnce('sha'); scm.getBranchCommit.mockResolvedValueOnce('base_sha'); diff --git a/lib/workers/repository/stats.spec.ts b/lib/workers/repository/stats.spec.ts index 5c83dc53ecbd50..1b3d0cf4f408de 100644 --- a/lib/workers/repository/stats.spec.ts +++ b/lib/workers/repository/stats.spec.ts @@ -1,8 +1,9 @@ import { logger, mocked } from '../../../test/util'; import type { Logger } from '../../logger/types'; import * as _memCache from '../../util/cache/memory'; +import type { LookupStats } from '../../util/cache/memory/types'; import type { RequestStats } from '../../util/http/types'; -import { printRequestStats } from './stats'; +import { printLookupStats, printRequestStats } from './stats'; jest.mock('../../util/cache/memory'); @@ -10,6 +11,44 @@ const memCache = mocked(_memCache); const log = logger.logger as jest.Mocked; describe('workers/repository/stats', () => { + describe('printLookupStats()', () => { + it('runs', () => { + const stats: LookupStats[] = [ + { + datasource: 'npm', + duration: 100, + }, + { + datasource: 'npm', + duration: 200, + }, + { + datasource: 'docker', + duration: 1000, + }, + ]; + memCache.get.mockImplementationOnce(() => stats as any); + expect(printLookupStats()).toBeUndefined(); + expect(log.debug).toHaveBeenCalledTimes(1); + expect(log.debug.mock.calls[0][0]).toMatchInlineSnapshot(` + { + "docker": { + "averageMs": 1000, + "count": 1, + "maximumMs": 1000, + "totalMs": 1000, + }, + "npm": { + "averageMs": 150, + "count": 2, + "maximumMs": 200, + "totalMs": 300, + }, + } + `); + }); + }); + describe('printRequestStats()', () => { it('runs', () => { const getStats: number[] = [30, 100, 10, 20]; diff --git a/lib/workers/repository/stats.ts b/lib/workers/repository/stats.ts index dd95bb0b333993..049a4ce45a136f 100644 --- a/lib/workers/repository/stats.ts +++ b/lib/workers/repository/stats.ts @@ -2,6 +2,7 @@ import URL from 'url'; import { logger } from '../../logger'; import { sortNumeric } from '../../util/array'; import * as memCache from '../../util/cache/memory'; +import type { LookupStats } from '../../util/cache/memory/types'; import type { RequestStats } from '../../util/http/types'; interface CacheStats { @@ -11,6 +12,24 @@ interface CacheStats { maxMs?: number; } +export function printLookupStats(): void { + const lookups = memCache.get('lookup-stats') ?? []; + const datasourceDurations: Record = {}; + for (const lookup of lookups) { + datasourceDurations[lookup.datasource] ??= []; + datasourceDurations[lookup.datasource].push(lookup.duration); + } + const data: Record = {}; + for (const [datasource, durations] of Object.entries(datasourceDurations)) { + const count = durations.length; + const totalMs = durations.reduce((a, c) => a + c, 0); + const averageMs = Math.round(totalMs / count); + const maximumMs = Math.max(...durations); + data[datasource] = { count, averageMs, totalMs, maximumMs }; + } + logger.debug(data, 'Package lookup durations'); +} + export function printRequestStats(): void { const packageCacheGets = ( memCache.get('package-cache-gets') ?? [] diff --git a/lib/workers/repository/update/branch/auto-replace.spec.ts b/lib/workers/repository/update/branch/auto-replace.spec.ts index e5082c25bc8c84..069045985b8723 100644 --- a/lib/workers/repository/update/branch/auto-replace.spec.ts +++ b/lib/workers/repository/update/branch/auto-replace.spec.ts @@ -233,6 +233,24 @@ describe('workers/repository/update/branch/auto-replace', () => { await expect(res).rejects.toThrow(WORKER_FILE_UPDATE_FAILED); }); + it('fails with digest mismatch', async () => { + const dockerfile = codeBlock` + FROM java:11@sha256-1234 as build + `; + upgrade.manager = 'dockerfile'; + upgrade.pinDigests = true; + upgrade.depName = 'java'; + upgrade.currentValue = '11'; + upgrade.currentDigest = 'sha256-1234'; + upgrade.depIndex = 0; + upgrade.newName = 'java'; + upgrade.newValue = '11'; + upgrade.newDigest = 'sha256-5678'; + upgrade.packageFile = 'Dockerfile'; + const res = doAutoReplace(upgrade, dockerfile, reuseExistingBranch); + await expect(res).rejects.toThrow(WORKER_FILE_UPDATE_FAILED); + }); + it('updates with docker replacement', async () => { const dockerfile = 'FROM bitnami/redis:6.0.8'; upgrade.manager = 'dockerfile'; @@ -1044,12 +1062,12 @@ describe('workers/repository/update/branch/auto-replace', () => { FROM ubuntu:18.04 `; upgrade.manager = 'dockerfile'; + upgrade.updateType = 'replacement'; + upgrade.pinDigests = true; upgrade.depName = 'ubuntu'; upgrade.currentValue = '18.04'; upgrade.currentDigest = undefined; upgrade.depIndex = 0; - upgrade.pinDigests = true; - upgrade.updateType = 'replacement'; upgrade.replaceString = 'ubuntu:18.04'; upgrade.newName = 'alpine'; upgrade.newValue = '3.16'; @@ -1068,12 +1086,12 @@ describe('workers/repository/update/branch/auto-replace', () => { FROM ubuntu:18.04@sha256:q1w2e3r4t5z6u7i8o9p0 `; upgrade.manager = 'dockerfile'; + upgrade.updateType = 'replacement'; + upgrade.pinDigests = true; upgrade.depName = 'ubuntu'; upgrade.currentValue = '18.04'; upgrade.currentDigest = 'sha256:q1w2e3r4t5z6u7i8o9p0'; upgrade.depIndex = 0; - upgrade.pinDigests = true; - upgrade.updateType = 'replacement'; upgrade.replaceString = 'ubuntu:18.04@sha256:q1w2e3r4t5z6u7i8o9p0'; upgrade.newName = 'alpine'; upgrade.newValue = '3.16'; @@ -1087,9 +1105,55 @@ describe('workers/repository/update/branch/auto-replace', () => { ); }); + it('autoReplaceGlobalMatch: throws error when globally replacing recurring values across version and digests', async () => { + const dockerfile = codeBlock` + FROM java:6@sha256:q1w2e3r4t5z6u7i8o9p0 + `; + upgrade.manager = 'dockerfile'; + upgrade.depName = 'java'; + upgrade.currentValue = '6'; + upgrade.currentDigest = 'sha256:q1w2e3r4t5z6u7i8o9p0'; + upgrade.depIndex = 0; + upgrade.pinDigests = true; + upgrade.updateType = 'replacement'; + upgrade.replaceString = 'java:6@sha256:q1w2e3r4t5z6u7i8o9p0'; + upgrade.newName = 'eclipse-temurin'; + upgrade.newValue = '11'; + upgrade.newDigest = 'sha256:p0o9i8u7z6t5r4e3w2q1'; + upgrade.packageFile = 'Dockerfile'; + const res = doAutoReplace(upgrade, dockerfile, reuseExistingBranch); + await expect(res).rejects.toThrow(WORKER_FILE_UPDATE_FAILED); + }); + + it('autoReplaceGlobalMatch: updates when replacing first match only of recurring values across version and digests', async () => { + const dockerfile = codeBlock` + FROM java:6@sha256:q1w2e3r4t5z6u7i8o9p0 + `; + upgrade.autoReplaceGlobalMatch = false; + upgrade.manager = 'dockerfile'; + upgrade.depName = 'java'; + upgrade.currentValue = '6'; + upgrade.currentDigest = 'sha256:q1w2e3r4t5z6u7i8o9p0'; + upgrade.depIndex = 0; + upgrade.pinDigests = true; + upgrade.updateType = 'replacement'; + upgrade.replaceString = 'java:6@sha256:q1w2e3r4t5z6u7i8o9p0'; + upgrade.newName = 'eclipse-temurin'; + upgrade.newValue = '11'; + upgrade.newDigest = 'sha256:p0o9i8u7z6t5r4e3w2q1'; + upgrade.packageFile = 'Dockerfile'; + const res = await doAutoReplace(upgrade, dockerfile, reuseExistingBranch); + expect(res).toBe( + codeBlock` + FROM eclipse-temurin:11@sha256:p0o9i8u7z6t5r4e3w2q1 + ` + ); + }); + it('regex: updates with pinDigest enabled but no currentDigest value', async () => { const yml = 'image: "some.url.com/my-repository:1.0"'; upgrade.manager = 'regex'; + upgrade.updateType = 'replacement'; upgrade.pinDigests = true; upgrade.depName = 'some.url.com/my-repository'; upgrade.currentValue = '1.0'; @@ -1111,6 +1175,7 @@ describe('workers/repository/update/branch/auto-replace', () => { const yml = 'image: "some.url.com/my-repository:1.0@sha256:q1w2e3r4t5z6u7i8o9p0"'; upgrade.manager = 'regex'; + upgrade.updateType = 'replacement'; upgrade.pinDigests = true; upgrade.depName = 'some.url.com/my-repository'; upgrade.currentValue = '1.0'; @@ -1131,7 +1196,7 @@ describe('workers/repository/update/branch/auto-replace', () => { ); }); - it('github-actions: update with newValue only', async () => { + it('github-actions: updates with newValue only', async () => { const githubAction = codeBlock` jobs: build: @@ -1140,6 +1205,7 @@ describe('workers/repository/update/branch/auto-replace', () => { - uses: actions/checkout@v1.0.0 `; upgrade.manager = 'github-actions'; + upgrade.updateType = 'replacement'; upgrade.autoReplaceStringTemplate = '{{depName}}@{{#if newDigest}}{{newDigest}}{{#if newValue}} # {{newValue}}{{/if}}{{/if}}{{#unless newDigest}}{{newValue}}{{/unless}}'; upgrade.depName = 'actions/checkout'; @@ -1147,8 +1213,6 @@ describe('workers/repository/update/branch/auto-replace', () => { upgrade.currentDigest = undefined; upgrade.currentDigestShort = undefined; upgrade.depIndex = 0; - upgrade.pinDigests = true; - upgrade.updateType = 'replacement'; upgrade.replaceString = 'actions/checkout@v1.0.0'; upgrade.newValue = 'v2.0.0'; upgrade.newDigest = undefined; @@ -1169,7 +1233,7 @@ describe('workers/repository/update/branch/auto-replace', () => { ); }); - it('github-actions: update with newValue and newDigest', async () => { + it('github-actions: updates with newValue and newDigest', async () => { const githubAction = codeBlock` jobs: build: @@ -1178,6 +1242,7 @@ describe('workers/repository/update/branch/auto-replace', () => { - uses: actions/checkout@v1.0.0 `; upgrade.manager = 'github-actions'; + upgrade.updateType = 'replacement'; upgrade.autoReplaceStringTemplate = '{{depName}}@{{#if newDigest}}{{newDigest}}{{#if newValue}} # {{newValue}}{{/if}}{{/if}}{{#unless newDigest}}{{newValue}}{{/unless}}'; upgrade.depName = 'actions/checkout'; @@ -1185,8 +1250,6 @@ describe('workers/repository/update/branch/auto-replace', () => { upgrade.currentDigest = undefined; upgrade.currentDigestShort = undefined; upgrade.depIndex = 0; - upgrade.pinDigests = true; - upgrade.updateType = 'replacement'; upgrade.replaceString = 'actions/checkout@v1.0.0'; upgrade.newValue = 'v2.0.0'; upgrade.newDigest = '1cf887'; @@ -1216,6 +1279,8 @@ describe('workers/repository/update/branch/auto-replace', () => { - uses: actions/checkout@v1.0.0 `; upgrade.manager = 'github-actions'; + upgrade.updateType = 'replacement'; + upgrade.pinDigests = true; upgrade.autoReplaceStringTemplate = '{{depName}}@{{#if newDigest}}{{newDigest}}{{#if newValue}} # {{newValue}}{{/if}}{{/if}}{{#unless newDigest}}{{newValue}}{{/unless}}'; upgrade.depName = 'actions/checkout'; @@ -1223,8 +1288,6 @@ describe('workers/repository/update/branch/auto-replace', () => { upgrade.currentDigest = undefined; upgrade.currentDigestShort = undefined; upgrade.depIndex = 0; - upgrade.pinDigests = true; - upgrade.updateType = 'replacement'; upgrade.replaceString = 'actions/checkout@v1.0.0'; upgrade.newName = 'some-other-action/checkout'; upgrade.newValue = 'v2.0.0'; @@ -1255,14 +1318,14 @@ describe('workers/repository/update/branch/auto-replace', () => { - uses: actions/checkout@2485f4 # tag=v1.0.0 `; upgrade.manager = 'github-actions'; + upgrade.updateType = 'replacement'; + upgrade.pinDigests = true; upgrade.autoReplaceStringTemplate = '{{depName}}@{{#if newDigest}}{{newDigest}}{{#if newValue}} # {{newValue}}{{/if}}{{/if}}{{#unless newDigest}}{{newValue}}{{/unless}}'; upgrade.depName = 'actions/checkout'; upgrade.currentValue = 'v1.0.0'; upgrade.currentDigestShort = '2485f4'; upgrade.depIndex = 0; - upgrade.pinDigests = true; - upgrade.updateType = 'replacement'; upgrade.replaceString = 'actions/checkout@2485f4 # tag=v1.0.0'; upgrade.newName = 'some-other-action/checkout'; upgrade.newValue = 'v2.0.0'; diff --git a/lib/workers/repository/update/branch/auto-replace.ts b/lib/workers/repository/update/branch/auto-replace.ts index 2843f15c1ddfb5..dd227fc711e582 100644 --- a/lib/workers/repository/update/branch/auto-replace.ts +++ b/lib/workers/repository/update/branch/auto-replace.ts @@ -2,7 +2,7 @@ import is from '@sindresorhus/is'; import { WORKER_FILE_UPDATE_FAILED } from '../../../../constants/error-messages'; import { logger } from '../../../../logger'; -import { get } from '../../../../modules/manager'; +import { extractPackageFile } from '../../../../modules/manager'; import type { PackageDependency } from '../../../../modules/manager/types'; import { writeLocalFile } from '../../../../util/fs'; import { escapeRegExp, regEx } from '../../../../util/regex'; @@ -14,21 +14,13 @@ export async function confirmIfDepUpdated( upgrade: BranchUpgradeConfig, newContent: string ): Promise { - const { - manager, - packageFile, - newValue, - newDigest, - depIndex, - currentDigest, - pinDigests, - } = upgrade; - const extractPackageFile = get(manager, 'extractPackageFile'); + const { manager, packageFile, depIndex } = upgrade; let newUpgrade: PackageDependency; try { - const newExtract = await extractPackageFile!( + const newExtract = await extractPackageFile( + manager, newContent, - packageFile, + packageFile!, upgrade ); // istanbul ignore if @@ -63,12 +55,25 @@ export async function confirmIfDepUpdated( return false; } - if (newValue && newUpgrade.currentValue !== newValue) { + if (upgrade.newName && upgrade.newName !== newUpgrade.depName) { + logger.debug( + { + manager, + packageFile, + currentDepName: upgrade.depName, + newDepName: newUpgrade.depName, + }, + 'depName is not updated' + ); + return false; + } + + if (upgrade.newValue && upgrade.newValue !== newUpgrade.currentValue) { logger.debug( { manager, packageFile, - expectedValue: newValue, + expectedValue: upgrade.newValue, foundValue: newUpgrade.currentValue, }, 'Value is not updated' @@ -76,27 +81,35 @@ export async function confirmIfDepUpdated( return false; } - if (!newDigest) { - return true; - } - if (newUpgrade.currentDigest === newDigest) { - return true; - } - if (!currentDigest) { - if (!pinDigests) { - return true; - } else if (newDigest) { - return true; - } + if ( + upgrade.newDigest && + (upgrade.isPinDigest || upgrade.currentDigest) && + upgrade.newDigest !== newUpgrade.currentDigest + ) { + logger.debug( + { + manager, + packageFile, + expectedValue: upgrade.newDigest, + foundValue: newUpgrade.currentDigest, + }, + 'Digest is not updated' + ); + return false; } - // istanbul ignore next - return false; + return true; } function getDepsSignature(deps: PackageDependency[]): string { // TODO: types (#7154) - return deps.map((dep) => `${dep.depName!}${dep.packageName!}`).join(','); + return deps + .map( + (dep) => + `${(dep.depName ?? dep.packageName)!}${(dep.packageName ?? + dep.depName)!}` + ) + .join(','); } export async function checkBranchDepsMatchBaseDeps( @@ -104,9 +117,13 @@ export async function checkBranchDepsMatchBaseDeps( branchContent: string ): Promise { const { baseDeps, manager, packageFile } = upgrade; - const extractPackageFile = get(manager, 'extractPackageFile'); try { - const res = await extractPackageFile!(branchContent, packageFile, upgrade)!; + const res = await extractPackageFile( + manager, + branchContent, + packageFile!, + upgrade + )!; const branchDeps = res!.deps; return getDepsSignature(baseDeps!) === getDepsSignature(branchDeps); } catch (err) /* istanbul ignore next */ { @@ -157,6 +174,7 @@ export async function doAutoReplace( currentDigest, currentDigestShort, newDigest, + autoReplaceGlobalMatch, autoReplaceStringTemplate, } = upgrade; /* @@ -195,26 +213,28 @@ export async function doAutoReplace( newString = compile(autoReplaceStringTemplate, upgrade, false); } else { newString = replaceString!; + + const autoReplaceRegExpFlag = autoReplaceGlobalMatch ? 'g' : ''; if (currentValue && newValue) { newString = newString.replace( - regEx(escapeRegExp(currentValue), 'g'), + regEx(escapeRegExp(currentValue), autoReplaceRegExpFlag), newValue ); } if (depName && newName) { newString = newString.replace( - regEx(escapeRegExp(depName), 'g'), + regEx(escapeRegExp(depName), autoReplaceRegExpFlag), newName ); } if (currentDigest && newDigest) { newString = newString.replace( - regEx(escapeRegExp(currentDigest), 'g'), + regEx(escapeRegExp(currentDigest), autoReplaceRegExpFlag), newDigest ); } else if (currentDigestShort && newDigest) { newString = newString.replace( - regEx(escapeRegExp(currentDigestShort), 'g'), + regEx(escapeRegExp(currentDigestShort), autoReplaceRegExpFlag), newDigest ); } diff --git a/lib/workers/repository/update/branch/automerge.ts b/lib/workers/repository/update/branch/automerge.ts index 8d1339ad5013b3..8db027b4cc24f1 100644 --- a/lib/workers/repository/update/branch/automerge.ts +++ b/lib/workers/repository/update/branch/automerge.ts @@ -32,6 +32,7 @@ export async function tryBranchAutomerge( } const branchStatus = await resolveBranchStatus( config.branchName!, + !!config.internalChecksAsSuccess, config.ignoreTests ); if (branchStatus === 'green') { diff --git a/lib/workers/repository/update/branch/execute-post-upgrade-commands.spec.ts b/lib/workers/repository/update/branch/execute-post-upgrade-commands.spec.ts index 583a2c4d62cc1e..242f1b37d2af83 100644 --- a/lib/workers/repository/update/branch/execute-post-upgrade-commands.spec.ts +++ b/lib/workers/repository/update/branch/execute-post-upgrade-commands.spec.ts @@ -10,7 +10,7 @@ jest.mock('../../../../util/git'); describe('workers/repository/update/branch/execute-post-upgrade-commands', () => { describe('postUpgradeCommandsExecutor', () => { it('handles an artifact which is a directory', async () => { - const commands: BranchUpgradeConfig[] = [ + const commands = partial([ { manager: 'some-manager', branchName: 'main', @@ -19,7 +19,7 @@ describe('workers/repository/update/branch/execute-post-upgrade-commands', () => commands: ['disallowed_command'], }, }, - ]; + ]); const config: BranchConfig = { manager: 'some-manager', updatedPackageFiles: [], diff --git a/lib/workers/repository/update/branch/index.spec.ts b/lib/workers/repository/update/branch/index.spec.ts index 7fdd1cbc22acda..146312255a2e52 100644 --- a/lib/workers/repository/update/branch/index.spec.ts +++ b/lib/workers/repository/update/branch/index.spec.ts @@ -108,8 +108,11 @@ describe('workers/repository/update/branch/index', () => { branchName: 'renovate/some-branch', errors: [], warnings: [], - upgrades: [partial({ depName: 'some-dep-name' })], - } as BranchConfig; + upgrades: partial([{ depName: 'some-dep-name' }]), + baseBranch: 'base-branch', + manager: 'some-manager', + major: undefined, + } satisfies BranchConfig; schedule.isScheduledNow.mockReturnValue(true); commit.commitFilesToBranch.mockResolvedValue('123test'); @@ -185,12 +188,12 @@ describe('workers/repository/update/branch/index', () => { it('skips branch if not stabilityDays not met', async () => { schedule.isScheduledNow.mockReturnValueOnce(true); config.prCreation = 'not-pending'; - (config.upgrades as Partial[]) = [ + config.upgrades = partial([ { releaseTimestamp: '2099-12-31', stabilityDays: 1, }, - ]; + ]); const res = await branchWorker.processBranch(config); expect(res).toEqual({ branchExists: false, @@ -221,11 +224,11 @@ describe('workers/repository/update/branch/index', () => { it('processes branch if minimumConfidence is met', async () => { schedule.isScheduledNow.mockReturnValueOnce(true); config.prCreation = 'not-pending'; - (config.upgrades as Partial[]) = [ + config.upgrades = partial([ { minimumConfidence: 'high', }, - ]; + ]); mergeConfidence.isActiveConfidenceLevel.mockReturnValue(true); mergeConfidence.satisfiesConfidenceLevel.mockReturnValueOnce(true); const res = await branchWorker.processBranch(config); @@ -370,6 +373,35 @@ describe('workers/repository/update/branch/index', () => { ); }); + it('skips branch if tagretBranch of update PR is changed by user', async () => { + const pr = partial({ + state: 'open', + targetBranch: 'old_base', + }); + const ensureCommentConfig = partial({ + number: pr.number, + topic: 'Edited/Blocked Notification', + }); + schedule.isScheduledNow.mockReturnValueOnce(false); + scm.branchExists.mockResolvedValue(true); + scm.isBranchModified.mockResolvedValueOnce(false); + platform.getBranchPr.mockResolvedValueOnce(pr); + config.baseBranch = 'new_base'; + const res = await branchWorker.processBranch(config); + expect(res).toEqual({ + branchExists: true, + prNo: undefined, + result: 'pr-edited', + }); + expect(logger.debug).toHaveBeenCalledWith( + `PR has been edited, PrNo:${pr.number}` + ); + expect(platform.ensureComment).toHaveBeenCalledTimes(1); + expect(platform.ensureComment).toHaveBeenCalledWith( + expect.objectContaining({ ...ensureCommentConfig }) + ); + }); + it('skips branch if edited PR found without commenting', async () => { const pr = partial({ state: 'open', @@ -557,12 +589,12 @@ describe('workers/repository/update/branch/index', () => { it('returns if branch automerged', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); commit.commitFilesToBranch.mockResolvedValueOnce(null); @@ -575,12 +607,12 @@ describe('workers/repository/update/branch/index', () => { it('returns if branch automerged and no checks', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(false); scm.getBranchCommit.mockResolvedValue('123test'); //TODO: not needed? @@ -596,12 +628,12 @@ describe('workers/repository/update/branch/index', () => { it('returns if branch automerged (dry-run)', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); commit.commitFilesToBranch.mockResolvedValueOnce(null); @@ -616,12 +648,12 @@ describe('workers/repository/update/branch/index', () => { it('returns if branch exists and prCreation set to approval', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); commit.commitFilesToBranch.mockResolvedValueOnce(null); @@ -642,12 +674,12 @@ describe('workers/repository/update/branch/index', () => { expect.assertions(1); getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); commit.commitFilesToBranch.mockResolvedValueOnce(null); @@ -668,12 +700,12 @@ describe('workers/repository/update/branch/index', () => { expect.assertions(1); getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); commit.commitFilesToBranch.mockResolvedValueOnce(null); @@ -694,12 +726,12 @@ describe('workers/repository/update/branch/index', () => { expect.assertions(1); getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); commit.commitFilesToBranch.mockResolvedValueOnce(null); @@ -720,12 +752,12 @@ describe('workers/repository/update/branch/index', () => { expect.assertions(1); getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); commit.commitFilesToBranch.mockResolvedValueOnce(null); @@ -746,12 +778,12 @@ describe('workers/repository/update/branch/index', () => { expect.assertions(3); getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); const inconfig = { ...config, @@ -759,7 +791,7 @@ describe('workers/repository/update/branch/index', () => { prCreation: 'not-pending', commitBody: '[skip-ci]', fetchReleaseNotes: true, - } as BranchConfig; + } satisfies BranchConfig; mockedFunction(needsChangelogs).mockReturnValueOnce(true); scm.getBranchCommit.mockResolvedValue('123test'); //TODO:not needed? expect(await branchWorker.processBranch(inconfig)).toEqual({ @@ -777,18 +809,18 @@ describe('workers/repository/update/branch/index', () => { it('ensures PR and tries automerge', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); automerge.tryBranchAutomerge.mockResolvedValueOnce('failed'); prWorker.ensurePr.mockResolvedValueOnce({ type: 'with-pr', - pr: partial({}), + pr: partial(), }); prAutomerge.checkAutoMerge.mockResolvedValueOnce({ automerged: true }); commit.commitFilesToBranch.mockResolvedValueOnce(null); @@ -801,18 +833,18 @@ describe('workers/repository/update/branch/index', () => { it('ensures PR when impossible to automerge', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); automerge.tryBranchAutomerge.mockResolvedValueOnce('stale'); prWorker.ensurePr.mockResolvedValueOnce({ type: 'with-pr', - pr: partial({}), + pr: partial(), }); prAutomerge.checkAutoMerge.mockResolvedValueOnce({ automerged: false }); commit.commitFilesToBranch.mockResolvedValueOnce(null); @@ -828,7 +860,7 @@ describe('workers/repository/update/branch/index', () => { it('skips when automerge is off schedule', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( - partial({}) + partial() ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce( partial({ @@ -864,18 +896,18 @@ describe('workers/repository/update/branch/index', () => { it('ensures PR and adds lock file error comment if no releaseTimestamp', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ - artifactErrors: [partial({})], - updatedArtifacts: [partial({})], + artifactErrors: [partial()], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); automerge.tryBranchAutomerge.mockResolvedValueOnce('failed'); prWorker.ensurePr.mockResolvedValueOnce({ type: 'with-pr', - pr: partial({}), + pr: partial(), }); prAutomerge.checkAutoMerge.mockResolvedValueOnce({ automerged: true }); commit.commitFilesToBranch.mockResolvedValueOnce(null); @@ -888,18 +920,18 @@ describe('workers/repository/update/branch/index', () => { it('ensures PR and adds lock file error comment if old releaseTimestamp', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ - artifactErrors: [partial({})], - updatedArtifacts: [partial({})], + artifactErrors: [partial()], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); automerge.tryBranchAutomerge.mockResolvedValueOnce('failed'); prWorker.ensurePr.mockResolvedValueOnce({ type: 'with-pr', - pr: partial({}), + pr: partial(), }); prAutomerge.checkAutoMerge.mockResolvedValueOnce({ automerged: true }); config.releaseTimestamp = '2018-04-26T05:15:51.877Z'; @@ -913,18 +945,18 @@ describe('workers/repository/update/branch/index', () => { it('ensures PR and adds lock file error comment if new releaseTimestamp and branch exists', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ - artifactErrors: [partial({})], - updatedArtifacts: [partial({})], + artifactErrors: [partial()], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); automerge.tryBranchAutomerge.mockResolvedValueOnce('failed'); prWorker.ensurePr.mockResolvedValueOnce({ type: 'with-pr', - pr: partial({}), + pr: partial(), }); prAutomerge.checkAutoMerge.mockResolvedValueOnce({ automerged: true }); config.releaseTimestamp = new Date().toISOString(); @@ -938,18 +970,18 @@ describe('workers/repository/update/branch/index', () => { it('throws error if lock file errors and new releaseTimestamp', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ - artifactErrors: [partial({})], - updatedArtifacts: [partial({})], + artifactErrors: [partial()], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(false); automerge.tryBranchAutomerge.mockResolvedValueOnce('failed'); prWorker.ensurePr.mockResolvedValueOnce({ type: 'with-pr', - pr: partial({}), + pr: partial(), }); prAutomerge.checkAutoMerge.mockResolvedValueOnce({ automerged: true }); config.releaseTimestamp = new Date().toISOString(); @@ -961,19 +993,19 @@ describe('workers/repository/update/branch/index', () => { it('ensures PR and adds lock file error comment recreate closed', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ - artifactErrors: [partial({})], - updatedArtifacts: [partial({})], + artifactErrors: [partial()], + updatedArtifacts: [partial()], }); config.recreateClosed = true; scm.branchExists.mockResolvedValue(true); automerge.tryBranchAutomerge.mockResolvedValueOnce('failed'); prWorker.ensurePr.mockResolvedValueOnce({ type: 'with-pr', - pr: partial({}), + pr: partial(), }); prAutomerge.checkAutoMerge.mockResolvedValueOnce({ automerged: true }); commit.commitFilesToBranch.mockResolvedValueOnce(null); @@ -999,12 +1031,12 @@ describe('workers/repository/update/branch/index', () => { it('throws and swallows branch errors', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ - artifactErrors: [partial({})], - updatedArtifacts: [partial({})], + artifactErrors: [partial()], + updatedArtifacts: [partial()], }); scm.getBranchCommit.mockResolvedValue('123test'); //TODO:not needed? const processBranchResult = await branchWorker.processBranch(config); @@ -1020,12 +1052,12 @@ describe('workers/repository/update/branch/index', () => { it('swallows pr errors', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); automerge.tryBranchAutomerge.mockResolvedValueOnce('failed'); @@ -1089,13 +1121,13 @@ describe('workers/repository/update/branch/index', () => { }, }); getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce({ - updatedPackageFiles: [partial({})], - updatedArtifacts: [partial({})], + updatedPackageFiles: [partial()], + updatedArtifacts: [partial()], artifactErrors: [{}], }); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); platform.getBranchPr.mockResolvedValueOnce(pr); @@ -1108,7 +1140,7 @@ describe('workers/repository/update/branch/index', () => { updateType: 'lockFileMaintenance', reuseExistingBranch: false, updatedArtifacts: [{ type: 'deletion', path: 'dummy' }], - } as BranchConfig; + } satisfies BranchConfig; expect(await branchWorker.processBranch(inconfig)).toEqual({ branchExists: true, updatesVerified: true, @@ -1130,7 +1162,7 @@ describe('workers/repository/update/branch/index', () => { ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); platform.getBranchPr.mockResolvedValueOnce( @@ -1147,7 +1179,7 @@ describe('workers/repository/update/branch/index', () => { schedule.isScheduledNow.mockReturnValueOnce(false); prWorker.ensurePr.mockResolvedValueOnce({ type: 'with-pr', - pr: partial({}), + pr: partial(), }); commit.commitFilesToBranch.mockResolvedValueOnce(null); GlobalConfig.set({ ...adminConfig, dryRun: 'full' }); @@ -1171,14 +1203,14 @@ describe('workers/repository/update/branch/index', () => { it('branch pr no schedule', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], artifactErrors: [], updatedArtifacts: [], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); platform.getBranchPr.mockResolvedValueOnce( @@ -1199,7 +1231,7 @@ describe('workers/repository/update/branch/index', () => { updateType: 'lockFileMaintenance', reuseExistingBranch: false, updatedArtifacts: [{ type: 'deletion', path: 'dummy' }], - } as BranchConfig; + } satisfies BranchConfig; expect(await branchWorker.processBranch(inconfig)).toEqual({ branchExists: true, updatesVerified: true, @@ -1212,14 +1244,14 @@ describe('workers/repository/update/branch/index', () => { it('skips branch update if stopUpdatingLabel presents', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], artifactErrors: [], updatedArtifacts: [], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); platform.getBranchPr.mockResolvedValueOnce( @@ -1236,7 +1268,7 @@ describe('workers/repository/update/branch/index', () => { const inconfig = { ...config, updatedArtifacts: [{ type: 'deletion', path: 'dummy' }], - } as BranchConfig; + } satisfies BranchConfig; expect(await branchWorker.processBranch(inconfig)).toEqual({ branchExists: true, prNo: undefined, @@ -1276,14 +1308,14 @@ describe('workers/repository/update/branch/index', () => { it('updates branch if stopUpdatingLabel presents and PR rebase/retry box checked', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], artifactErrors: [], updatedArtifacts: [], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); platform.getBranchPr.mockResolvedValueOnce( @@ -1304,7 +1336,7 @@ describe('workers/repository/update/branch/index', () => { ...config, reuseExistingBranch: false, updatedArtifacts: [{ type: 'deletion', path: 'dummy' }], - } as BranchConfig; + } satisfies BranchConfig; expect(await branchWorker.processBranch(inconfig)).toEqual({ branchExists: true, updatesVerified: true, @@ -1318,14 +1350,14 @@ describe('workers/repository/update/branch/index', () => { it('updates branch if stopUpdatingLabel presents and dependency dashboard box checked', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], artifactErrors: [], updatedArtifacts: [], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); platform.getBranchPr.mockResolvedValueOnce( @@ -1343,7 +1375,7 @@ describe('workers/repository/update/branch/index', () => { ...config, dependencyDashboardChecks: { 'renovate/some-branch': 'true' }, updatedArtifacts: [{ type: 'deletion', path: 'dummy' }], - } as BranchConfig; + } satisfies BranchConfig; expect(await branchWorker.processBranch(inconfig)).toEqual({ branchExists: true, updatesVerified: true, @@ -1421,16 +1453,17 @@ describe('workers/repository/update/branch/index', () => { }, upgrades: [ { - ...getConfig(), depName: 'some-dep-name', postUpgradeTasks: { executionMode: 'update', commands: ['echo {{{versioning}}}', 'disallowed task'], fileFilters: ['modified_file', 'deleted_file'], }, - }, + branchName: 'renovate/some-branch', + manager: 'some-manager', + } satisfies BranchUpgradeConfig, ], - } as BranchConfig; + } satisfies BranchConfig; const result = await branchWorker.processBranch(inconfig); expect(result).toEqual({ branchExists: true, @@ -1597,17 +1630,16 @@ describe('workers/repository/update/branch/index', () => { fileFilters: ['modified_file', 'deleted_file'], }, upgrades: [ - { - ...getConfig(), + partial({ depName: 'some-dep-name', postUpgradeTasks: { executionMode: 'update', commands: ['echo {{{versioning}}}', 'disallowed task'], fileFilters: ['modified_file', 'deleted_file'], }, - } as BranchUpgradeConfig, + }), ], - } as BranchConfig; + } satisfies BranchConfig; const result = await branchWorker.processBranch(inconfig); expect(result).toEqual({ branchExists: true, @@ -1705,9 +1737,8 @@ describe('workers/repository/update/branch/index', () => { 'modified_then_deleted_file', ], }, - upgrades: [ + upgrades: partial([ { - ...getConfig(), depName: 'some-dep-name-1', postUpgradeTasks: { executionMode: 'update', @@ -1719,9 +1750,8 @@ describe('workers/repository/update/branch/index', () => { 'modified_then_deleted_file', ], }, - } as BranchUpgradeConfig, + }, { - ...getConfig(), depName: 'some-dep-name-2', postUpgradeTasks: { executionMode: 'update', @@ -1733,8 +1763,8 @@ describe('workers/repository/update/branch/index', () => { 'modified_then_deleted_file', ], }, - } as BranchUpgradeConfig, - ], + }, + ]), }; const result = await branchWorker.processBranch(inconfig); @@ -1856,9 +1886,8 @@ describe('workers/repository/update/branch/index', () => { 'modified_then_deleted_file', ], }, - upgrades: [ + upgrades: partial([ { - ...getConfig(), depName: 'some-dep-name-1', postUpgradeTasks: { executionMode: 'branch', @@ -1870,9 +1899,8 @@ describe('workers/repository/update/branch/index', () => { 'modified_then_deleted_file', ], }, - } as BranchUpgradeConfig, + }, { - ...getConfig(), depName: 'some-dep-name-2', postUpgradeTasks: { executionMode: 'branch', @@ -1884,8 +1912,8 @@ describe('workers/repository/update/branch/index', () => { 'modified_then_deleted_file', ], }, - } as BranchUpgradeConfig, - ], + }, + ]), }; const result = await branchWorker.processBranch(inconfig); @@ -2020,13 +2048,13 @@ describe('workers/repository/update/branch/index', () => { it('Dependency Dashboard All Pending approval', async () => { jest.spyOn(getUpdated, 'getUpdatedPackageFiles').mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], artifactErrors: [{}], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); platform.getBranchPr.mockResolvedValueOnce( @@ -2057,13 +2085,13 @@ describe('workers/repository/update/branch/index', () => { it('Dependency Dashboard open all rate-limited', async () => { jest.spyOn(getUpdated, 'getUpdatedPackageFiles').mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], artifactErrors: [{}], }) ); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); scm.branchExists.mockResolvedValue(true); platform.getBranchPr.mockResolvedValueOnce( @@ -2094,7 +2122,7 @@ describe('workers/repository/update/branch/index', () => { it('continues branch, skips automerge if there are artifact errors', async () => { jest.spyOn(getUpdated, 'getUpdatedPackageFiles').mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], artifactErrors: [{}], }) ); @@ -2124,7 +2152,7 @@ describe('workers/repository/update/branch/index', () => { scm.getBranchCommit.mockResolvedValueOnce('123test'); npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ artifactErrors: [], - updatedArtifacts: [partial({})], + updatedArtifacts: [partial()], }); platform.getBranchPr.mockResolvedValueOnce( partial({ @@ -2133,13 +2161,13 @@ describe('workers/repository/update/branch/index', () => { ); jest.spyOn(getUpdated, 'getUpdatedPackageFiles').mockResolvedValueOnce( partial({ - updatedPackageFiles: [partial({})], + updatedPackageFiles: [partial()], }) ); const inconfig = { ...config, prCreation: 'not-pending', - } as BranchConfig; + } satisfies BranchConfig; expect(await branchWorker.processBranch(inconfig)).toEqual({ branchExists: true, updatesVerified: true, @@ -2150,5 +2178,27 @@ describe('workers/repository/update/branch/index', () => { expect(automerge.tryBranchAutomerge).not.toHaveBeenCalled(); expect(prWorker.ensurePr).toHaveBeenCalledTimes(1); }); + + it('checks out baseBranch after committing files', async () => { + getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce({ + ...updatedPackageFiles, + }); + npmPostExtract.getAdditionalFiles.mockResolvedValueOnce({ + artifactErrors: [], + updatedArtifacts: [], + }); + config.baseBranch = 'main'; + await branchWorker.processBranch(config); + expect(git.checkoutBranch).toHaveBeenLastCalledWith('main'); + // Check that the last checkoutBranch call is after the only commitFilesToBranch call + const checkoutBranchCalledTimes = git.checkoutBranch.mock.calls.length; + expect( + commit.commitFilesToBranch.mock.invocationCallOrder[0] + ).toBeLessThan( + git.checkoutBranch.mock.invocationCallOrder[ + checkoutBranchCalledTimes - 1 + ] + ); + }); }); }); diff --git a/lib/workers/repository/update/branch/index.ts b/lib/workers/repository/update/branch/index.ts index b3e609ee104860..188e5f31a1a666 100644 --- a/lib/workers/repository/update/branch/index.ts +++ b/lib/workers/repository/update/branch/index.ts @@ -311,13 +311,14 @@ export async function processBranch( const currentVersion = upgrade.currentVersion!; const newVersion = upgrade.newVersion!; if (isActiveConfidenceLevel(minimumConfidence)) { - const confidence = await getMergeConfidenceLevel( - datasource, - depName, - currentVersion, - newVersion, - updateType - ); + const confidence = + (await getMergeConfidenceLevel( + datasource, + depName, + currentVersion, + newVersion, + updateType + )) ?? 'neutral'; if (satisfiesConfidenceLevel(confidence, minimumConfidence)) { config.confidenceStatus = 'green'; } else { @@ -498,6 +499,9 @@ export async function processBranch( } commitSha = await commitFilesToBranch(config); + // Checkout to base branch to ensure that the next branch processing always starts with git being on the baseBranch + // baseBranch is not checked out at the start of processBranch() due to pull/16246 + await checkoutBranch(config.baseBranch); updatesVerified = true; } // istanbul ignore if diff --git a/lib/workers/repository/update/branch/schedule.spec.ts b/lib/workers/repository/update/branch/schedule.spec.ts index 2f9ab17bb2d089..6c395ffc47f9f7 100644 --- a/lib/workers/repository/update/branch/schedule.spec.ts +++ b/lib/workers/repository/update/branch/schedule.spec.ts @@ -264,24 +264,13 @@ describe('workers/repository/update/branch/schedule', () => { }); describe('supports timezone', () => { - const cases: [string, string, string, boolean][] = [ - ['after 4pm', 'Asia/Singapore', '2017-06-30T15:59:00.000+0800', false], - ['after 4pm', 'Asia/Singapore', '2017-06-30T16:01:00.000+0800', true], - [ - 'before 3am on Monday', - 'Asia/Tokyo', - '2017-06-26T02:59:00.000+0900', - true, - ], - [ - 'before 3am on Monday', - 'Asia/Tokyo', - '2017-06-26T03:01:00.000+0900', - false, - ], - ]; - - test.each(cases)('%p, %p, %p', (sched, tz, datetime, expected) => { + test.each` + sched | tz | datetime | expected + ${'after 4pm'} | ${'Asia/Singapore'} | ${'2017-06-30T15:59:00.000+0800'} | ${false} + ${'after 4pm'} | ${'Asia/Singapore'} | ${'2017-06-30T16:01:00.000+0800'} | ${true} + ${'before 3am on Monday'} | ${'Asia/Tokyo'} | ${'2017-06-26T02:59:00.000+0900'} | ${true} + ${'before 3am on Monday'} | ${'Asia/Tokyo'} | ${'2017-06-26T03:01:00.000+0900'} | ${false} + `('$sched, $tz, $datetime', ({ sched, tz, datetime, expected }) => { config.schedule = [sched]; config.timezone = tz; mockDate.set(datetime); diff --git a/lib/workers/repository/update/branch/status-checks.spec.ts b/lib/workers/repository/update/branch/status-checks.spec.ts index bd2ba5bf5e7aec..93a811f14f4639 100644 --- a/lib/workers/repository/update/branch/status-checks.spec.ts +++ b/lib/workers/repository/update/branch/status-checks.spec.ts @@ -97,7 +97,7 @@ describe('workers/repository/update/branch/status-checks', () => { describe('getBranchStatus', () => { it('should return green if ignoreTests=true', async () => { - expect(await resolveBranchStatus('somebranch', true)).toBe('green'); + expect(await resolveBranchStatus('somebranch', true, true)).toBe('green'); }); }); }); diff --git a/lib/workers/repository/update/branch/status-checks.ts b/lib/workers/repository/update/branch/status-checks.ts index 361147de9ab53d..a880fc3a9e6e1e 100644 --- a/lib/workers/repository/update/branch/status-checks.ts +++ b/lib/workers/repository/update/branch/status-checks.ts @@ -2,13 +2,12 @@ import type { RenovateConfig } from '../../../../config/types'; import { logger } from '../../../../logger'; import { platform } from '../../../../modules/platform'; import type { BranchStatus } from '../../../../types'; -import { - MergeConfidence, - isActiveConfidenceLevel, -} from '../../../../util/merge-confidence'; +import { isActiveConfidenceLevel } from '../../../../util/merge-confidence'; +import type { MergeConfidence } from '../../../../util/merge-confidence/types'; export async function resolveBranchStatus( branchName: string, + internalChecksAsSuccess: boolean, ignoreTests = false ): Promise { logger.debug( @@ -20,7 +19,10 @@ export async function resolveBranchStatus( return 'green'; } - const status = await platform.getBranchStatus(branchName); + const status = await platform.getBranchStatus( + branchName, + internalChecksAsSuccess + ); logger.debug(`Branch status ${status}`); return status; @@ -76,7 +78,7 @@ export async function setStability(config: StabilityConfig): Promise { export interface ConfidenceConfig extends RenovateConfig { confidenceStatus?: BranchStatus; - minimumConfidence?: MergeConfidence; + minimumConfidence?: MergeConfidence | undefined; } export async function setConfidence(config: ConfidenceConfig): Promise { diff --git a/lib/workers/repository/update/pr/automerge.spec.ts b/lib/workers/repository/update/pr/automerge.spec.ts index 720c06638a55d2..dfe4913afb4770 100644 --- a/lib/workers/repository/update/pr/automerge.spec.ts +++ b/lib/workers/repository/update/pr/automerge.spec.ts @@ -16,7 +16,7 @@ describe('workers/repository/update/pr/automerge', () => { config = { ...getConfig(), } as BranchConfig; - pr = partial({}); + pr = partial(); }); it('should not automerge if not configured', async () => { diff --git a/lib/workers/repository/update/pr/automerge.ts b/lib/workers/repository/update/pr/automerge.ts index 486867a6308c20..66960c8f8e56af 100644 --- a/lib/workers/repository/update/pr/automerge.ts +++ b/lib/workers/repository/update/pr/automerge.ts @@ -69,6 +69,7 @@ export async function checkAutoMerge( } const branchStatus = await resolveBranchStatus( config.branchName, + !!config.internalChecksAsSuccess, config.ignoreTests ); if (branchStatus !== 'green') { diff --git a/lib/workers/repository/update/pr/body/updates-table.spec.ts b/lib/workers/repository/update/pr/body/updates-table.spec.ts index 36f2154afbbcd8..e321e930eb5f4f 100644 --- a/lib/workers/repository/update/pr/body/updates-table.spec.ts +++ b/lib/workers/repository/update/pr/body/updates-table.spec.ts @@ -1,3 +1,4 @@ +import { partial } from '../../../../../../test/util'; import type { BranchConfig, BranchUpgradeConfig } from '../../../../types'; import { getPrUpdatesTable } from './updates-table'; @@ -15,7 +16,7 @@ describe('workers/repository/update/pr/body/updates-table', () => { }); it('checks results for getPrUpdatesTable', () => { - const upgrade0: BranchUpgradeConfig = { + const upgrade0 = partial({ manager: 'some-manager', branchName: 'some-branch', prBodyDefinitions: { @@ -30,9 +31,9 @@ describe('workers/repository/update/pr/body/updates-table', () => { 'Package file': '{{{packageFile}}}', }, updateType: 'lockFileMaintenance', - }; + }); - const upgrade1: BranchUpgradeConfig = { + const upgrade1 = partial({ manager: 'some-manager', branchName: 'some-branch', prBodyDefinitions: { @@ -57,9 +58,9 @@ describe('workers/repository/update/pr/body/updates-table', () => { newVersion: '1.7.0', displayFrom: '^1.7.0', displayTo: '1.7.0', - }; + }); - const upgrade2: BranchUpgradeConfig = { + const upgrade2 = partial({ manager: 'some-manager', branchName: 'some-branch', prBodyDefinitions: { @@ -85,7 +86,7 @@ describe('workers/repository/update/pr/body/updates-table', () => { newVersion: '6.2.3', displayFrom: '^6.2.3', displayTo: '6.2.3', - }; + }); // TODO #7154 allow or filter undefined const upgrade3 = undefined as never; const configObj: BranchConfig = { diff --git a/lib/workers/repository/update/pr/changelog/__snapshots__/github.spec.ts.snap b/lib/workers/repository/update/pr/changelog/__snapshots__/github.spec.ts.snap index d42032437965a2..bf1018023d13a0 100644 --- a/lib/workers/repository/update/pr/changelog/__snapshots__/github.spec.ts.snap +++ b/lib/workers/repository/update/pr/changelog/__snapshots__/github.spec.ts.snap @@ -6,7 +6,7 @@ exports[`workers/repository/update/pr/changelog/github getChangeLogJSON filters "project": { "apiBaseUrl": "https://api.github.com/", "baseUrl": "https://github.com/", - "depName": "@renovate/no", + "packageName": "@renovate/no", "repository": "chalk/chalk", "sourceDirectory": undefined, "sourceUrl": "https://github.com/chalk/chalk", @@ -65,7 +65,7 @@ exports[`workers/repository/update/pr/changelog/github getChangeLogJSON supports "project": { "apiBaseUrl": "https://github-enterprise.example.com/api/v3/", "baseUrl": "https://github-enterprise.example.com/", - "depName": "renovate", + "packageName": "renovate", "repository": "chalk/chalk", "sourceDirectory": undefined, "sourceUrl": "https://github-enterprise.example.com/chalk/chalk", @@ -124,7 +124,7 @@ exports[`workers/repository/update/pr/changelog/github getChangeLogJSON supports "project": { "apiBaseUrl": "https://api.github.com/", "baseUrl": "https://github.com/", - "depName": "renovate", + "packageName": "renovate", "repository": "chalk/chalk", "sourceDirectory": undefined, "sourceUrl": "https://github.com/chalk/chalk", @@ -183,7 +183,7 @@ exports[`workers/repository/update/pr/changelog/github getChangeLogJSON supports "project": { "apiBaseUrl": "https://api.github.com/", "baseUrl": "https://github.com/", - "depName": "renovate", + "packageName": "renovate", "repository": "chalk/chalk", "sourceDirectory": undefined, "sourceUrl": "https://github.com/chalk/chalk", @@ -242,7 +242,7 @@ exports[`workers/repository/update/pr/changelog/github getChangeLogJSON uses Git "project": { "apiBaseUrl": "https://api.github.com/", "baseUrl": "https://github.com/", - "depName": "renovate", + "packageName": "renovate", "repository": "chalk/chalk", "sourceDirectory": undefined, "sourceUrl": "https://github.com/chalk/chalk", @@ -301,7 +301,7 @@ exports[`workers/repository/update/pr/changelog/github getChangeLogJSON works wi "project": { "apiBaseUrl": "https://api.github.com/", "baseUrl": "https://github.com/", - "depName": "renovate", + "packageName": "renovate", "repository": "chalk/chalk", "sourceDirectory": undefined, "sourceUrl": "https://github.com/chalk/chalk", diff --git a/lib/workers/repository/update/pr/changelog/__snapshots__/gitlab.spec.ts.snap b/lib/workers/repository/update/pr/changelog/__snapshots__/gitlab.spec.ts.snap index 33f53b59be2fcf..0b9fc65d6e3dbc 100644 --- a/lib/workers/repository/update/pr/changelog/__snapshots__/gitlab.spec.ts.snap +++ b/lib/workers/repository/update/pr/changelog/__snapshots__/gitlab.spec.ts.snap @@ -6,7 +6,7 @@ exports[`workers/repository/update/pr/changelog/gitlab getChangeLogJSON handles "project": { "apiBaseUrl": "https://gitlab.com/api/v4/", "baseUrl": "https://gitlab.com/", - "depName": "renovate", + "packageName": "renovate", "repository": "meno/dropzone", "sourceDirectory": undefined, "sourceUrl": "https://gitlab.com/meno/dropzone/", @@ -55,7 +55,7 @@ exports[`workers/repository/update/pr/changelog/gitlab getChangeLogJSON supports "project": { "apiBaseUrl": "https://gitlab-enterprise.example.com/api/v4/", "baseUrl": "https://gitlab-enterprise.example.com/", - "depName": "renovate", + "packageName": "renovate", "repository": "meno/dropzone", "sourceDirectory": undefined, "sourceUrl": "https://gitlab-enterprise.example.com/meno/dropzone/", @@ -104,7 +104,7 @@ exports[`workers/repository/update/pr/changelog/gitlab getChangeLogJSON supports "project": { "apiBaseUrl": "https://git.test.com/api/v4/", "baseUrl": "https://git.test.com/", - "depName": "renovate", + "packageName": "renovate", "repository": "meno/dropzone", "sourceDirectory": undefined, "sourceUrl": "https://git.test.com/meno/dropzone/", @@ -153,7 +153,7 @@ exports[`workers/repository/update/pr/changelog/gitlab getChangeLogJSON uses Git "project": { "apiBaseUrl": "https://gitlab.com/api/v4/", "baseUrl": "https://gitlab.com/", - "depName": "renovate", + "packageName": "renovate", "repository": "meno/dropzone", "sourceDirectory": undefined, "sourceUrl": "https://gitlab.com/meno/dropzone/", @@ -222,7 +222,7 @@ exports[`workers/repository/update/pr/changelog/gitlab getChangeLogJSON uses Git "project": { "apiBaseUrl": "https://gitlab.com/api/v4/", "baseUrl": "https://gitlab.com/", - "depName": "renovate", + "packageName": "renovate", "repository": "meno/dropzone", "sourceDirectory": undefined, "sourceUrl": "https://gitlab.com/meno/dropzone/", @@ -271,7 +271,7 @@ exports[`workers/repository/update/pr/changelog/gitlab getChangeLogJSON works wi "project": { "apiBaseUrl": "https://gitlab.com/api/v4/", "baseUrl": "https://gitlab.com/", - "depName": "renovate", + "packageName": "renovate", "repository": "meno/dropzone", "sourceDirectory": undefined, "sourceUrl": "https://gitlab.com/meno/dropzone/", diff --git a/lib/workers/repository/update/pr/changelog/__snapshots__/index.spec.ts.snap b/lib/workers/repository/update/pr/changelog/__snapshots__/index.spec.ts.snap index febe60c2e4064e..cca6fc27ffabba 100644 --- a/lib/workers/repository/update/pr/changelog/__snapshots__/index.spec.ts.snap +++ b/lib/workers/repository/update/pr/changelog/__snapshots__/index.spec.ts.snap @@ -6,7 +6,7 @@ exports[`workers/repository/update/pr/changelog/index getChangeLogJSON filters u "project": { "apiBaseUrl": "https://api.github.com/", "baseUrl": "https://github.com/", - "depName": "@renovate/no", + "packageName": "@renovate/no", "repository": "chalk/chalk", "sourceDirectory": undefined, "sourceUrl": "https://github.com/chalk/chalk", @@ -65,7 +65,7 @@ exports[`workers/repository/update/pr/changelog/index getChangeLogJSON supports "project": { "apiBaseUrl": "https://github-enterprise.example.com/api/v3/", "baseUrl": "https://github-enterprise.example.com/", - "depName": "renovate", + "packageName": "renovate", "repository": "chalk/chalk", "sourceDirectory": undefined, "sourceUrl": "https://github-enterprise.example.com/chalk/chalk", @@ -124,7 +124,7 @@ exports[`workers/repository/update/pr/changelog/index getChangeLogJSON supports "project": { "apiBaseUrl": "https://api.github.com/", "baseUrl": "https://github.com/", - "depName": "renovate", + "packageName": "renovate", "repository": "chalk/chalk", "sourceDirectory": undefined, "sourceUrl": "https://github.com/chalk/chalk", @@ -183,7 +183,7 @@ exports[`workers/repository/update/pr/changelog/index getChangeLogJSON supports "project": { "apiBaseUrl": "https://github-enterprise.example.com/api/v3/", "baseUrl": "https://github-enterprise.example.com/", - "depName": "renovate", + "packageName": "renovate", "repository": "chalk/chalk", "sourceDirectory": undefined, "sourceUrl": "https://github-enterprise.example.com/chalk/chalk", @@ -242,7 +242,7 @@ exports[`workers/repository/update/pr/changelog/index getChangeLogJSON supports "project": { "apiBaseUrl": "https://api.github.com/", "baseUrl": "https://github.com/", - "depName": "renovate", + "packageName": "renovate", "repository": "chalk/chalk", "sourceDirectory": undefined, "sourceUrl": "https://github.com/chalk/chalk", @@ -301,7 +301,7 @@ exports[`workers/repository/update/pr/changelog/index getChangeLogJSON uses GitH "project": { "apiBaseUrl": "https://api.github.com/", "baseUrl": "https://github.com/", - "depName": "renovate", + "packageName": "renovate", "repository": "chalk/chalk", "sourceDirectory": undefined, "sourceUrl": "https://github.com/chalk/chalk", @@ -365,7 +365,7 @@ exports[`workers/repository/update/pr/changelog/index getChangeLogJSON works wit "project": { "apiBaseUrl": "https://api.github.com/", "baseUrl": "https://github.com/", - "depName": "renovate", + "packageName": "renovate", "repository": "chalk/chalk", "sourceDirectory": undefined, "sourceUrl": "https://github.com/chalk/chalk", diff --git a/lib/workers/repository/update/pr/changelog/github.spec.ts b/lib/workers/repository/update/pr/changelog/github.spec.ts index 7d1e4c746c72e1..8571c684606ae6 100644 --- a/lib/workers/repository/update/pr/changelog/github.spec.ts +++ b/lib/workers/repository/update/pr/changelog/github.spec.ts @@ -10,10 +10,10 @@ import { getChangeLogJSON } from '.'; jest.mock('../../../../../modules/datasource/npm'); -const upgrade: BranchUpgradeConfig = { +const upgrade = partial({ manager: 'some-manager', branchName: '', - depName: 'renovate', + packageName: 'renovate', endpoint: 'https://api.github.com/', versioning: semverVersioning.id, currentVersion: '1.0.0', @@ -31,7 +31,7 @@ const upgrade: BranchUpgradeConfig = { { version: '2.4.2', releaseTimestamp: '2017-12-24T03:20:46.238Z' }, { version: '2.5.2' }, ], -}; +}); describe('workers/repository/update/pr/changelog/github', () => { afterEach(() => { @@ -97,7 +97,7 @@ describe('workers/repository/update/pr/changelog/github', () => { project: { apiBaseUrl: 'https://api.github.com/', baseUrl: 'https://github.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'chalk/chalk', sourceDirectory: undefined, sourceUrl: 'https://github.com/chalk/chalk', @@ -122,7 +122,7 @@ describe('workers/repository/update/pr/changelog/github', () => { project: { apiBaseUrl: 'https://api.github.com/', baseUrl: 'https://github.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'chalk/chalk', sourceDirectory: undefined, sourceUrl: 'https://github.com/chalk/chalk', @@ -141,14 +141,14 @@ describe('workers/repository/update/pr/changelog/github', () => { expect( await getChangeLogJSON({ ...upgrade, - depName: '@renovate/no', + packageName: '@renovate/no', }) ).toMatchSnapshot({ hasReleaseNotes: true, project: { apiBaseUrl: 'https://api.github.com/', baseUrl: 'https://github.com/', - depName: '@renovate/no', + packageName: '@renovate/no', repository: 'chalk/chalk', sourceDirectory: undefined, sourceUrl: 'https://github.com/chalk/chalk', @@ -174,7 +174,7 @@ describe('workers/repository/update/pr/changelog/github', () => { project: { apiBaseUrl: 'https://api.github.com/', baseUrl: 'https://github.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'chalk/chalk', sourceDirectory: undefined, sourceUrl: 'https://github.com/chalk/chalk', @@ -251,7 +251,7 @@ describe('workers/repository/update/pr/changelog/github', () => { project: { apiBaseUrl: 'https://api.github.com/', baseUrl: 'https://github.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'chalk/chalk', sourceDirectory: undefined, sourceUrl: 'https://github.com/chalk/chalk', @@ -284,7 +284,7 @@ describe('workers/repository/update/pr/changelog/github', () => { project: { apiBaseUrl: 'https://api.github.com/', baseUrl: 'https://github.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'sindresorhus/got', sourceDirectory: undefined, sourceUrl: 'https://github.com/sindresorhus/got', @@ -312,7 +312,7 @@ describe('workers/repository/update/pr/changelog/github', () => { project: { apiBaseUrl: 'https://github-enterprise.example.com/api/v3/', baseUrl: 'https://github-enterprise.example.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'chalk/chalk', sourceDirectory: undefined, sourceUrl: 'https://github-enterprise.example.com/chalk/chalk', @@ -348,7 +348,7 @@ describe('workers/repository/update/pr/changelog/github', () => { project: { apiBaseUrl: 'https://github-enterprise.example.com/api/v3/', baseUrl: 'https://github-enterprise.example.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'sindresorhus/got', sourceDirectory: undefined, sourceUrl: 'https://github-enterprise.example.com/sindresorhus/got', @@ -369,10 +369,10 @@ describe('workers/repository/update/pr/changelog/github', () => { ]) ); - const upgradeData: BranchUpgradeConfig = { + const upgradeData = partial({ manager: 'some-manager', branchName: '', - depName: 'correctPrefix/target', + packageName: 'correctPrefix/target', endpoint: 'https://api.github.com/', versioning: 'npm', currentVersion: '1.0.0', @@ -382,7 +382,7 @@ describe('workers/repository/update/pr/changelog/github', () => { { version: '1.0.1', gitRef: '123456' }, { version: '0.1.1', gitRef: 'npm_1.0.0' }, ], - }; + }); expect( await getChangeLogJSON({ ...upgradeData, @@ -395,7 +395,7 @@ describe('workers/repository/update/pr/changelog/github', () => { repository: 'chalk/chalk', sourceUrl: 'https://github.com/chalk/chalk', sourceDirectory: undefined, - depName: 'correctPrefix/target', + packageName: 'correctPrefix/target', }, versions: [ { diff --git a/lib/workers/repository/update/pr/changelog/gitlab.spec.ts b/lib/workers/repository/update/pr/changelog/gitlab.spec.ts index 92108071fb819f..b0de522d1fa035 100644 --- a/lib/workers/repository/update/pr/changelog/gitlab.spec.ts +++ b/lib/workers/repository/update/pr/changelog/gitlab.spec.ts @@ -1,4 +1,5 @@ import * as httpMock from '../../../../../../test/http-mock'; +import { partial } from '../../../../../../test/util'; import * as semverVersioning from '../../../../../modules/versioning/semver'; import * as hostRules from '../../../../../util/host-rules'; import type { BranchUpgradeConfig } from '../../../../types'; @@ -6,11 +7,11 @@ import { getChangeLogJSON } from '.'; jest.mock('../../../../../modules/datasource/npm'); -const upgrade: BranchUpgradeConfig = { +const upgrade = partial({ manager: 'some-manager', branchName: '', endpoint: 'https://gitlab.com/api/v4/ ', - depName: 'renovate', + packageName: 'renovate', versioning: semverVersioning.id, currentVersion: '5.2.0', newVersion: '5.7.0', @@ -26,7 +27,7 @@ const upgrade: BranchUpgradeConfig = { { version: '5.6.0', releaseTimestamp: '2020-02-13T15:37:00.000Z' }, { version: '5.6.1' }, ], -}; +}); const matchHost = 'https://gitlab.com/'; @@ -84,7 +85,7 @@ describe('workers/repository/update/pr/changelog/gitlab', () => { project: { apiBaseUrl: 'https://gitlab.com/api/v4/', baseUrl: 'https://gitlab.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'meno/dropzone', sourceDirectory: undefined, sourceUrl: 'https://gitlab.com/meno/dropzone/', @@ -126,7 +127,7 @@ describe('workers/repository/update/pr/changelog/gitlab', () => { project: { apiBaseUrl: 'https://gitlab.com/api/v4/', baseUrl: 'https://gitlab.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'meno/dropzone', sourceDirectory: undefined, sourceUrl: 'https://gitlab.com/meno/dropzone/', @@ -161,7 +162,7 @@ describe('workers/repository/update/pr/changelog/gitlab', () => { project: { apiBaseUrl: 'https://gitlab.com/api/v4/', baseUrl: 'https://gitlab.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'meno/dropzone', sourceDirectory: undefined, sourceUrl: 'https://gitlab.com/meno/dropzone/', @@ -196,7 +197,7 @@ describe('workers/repository/update/pr/changelog/gitlab', () => { project: { apiBaseUrl: 'https://gitlab.com/api/v4/', baseUrl: 'https://gitlab.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'meno/dropzone', sourceDirectory: undefined, sourceUrl: 'https://gitlab.com/meno/dropzone/', @@ -265,7 +266,7 @@ describe('workers/repository/update/pr/changelog/gitlab', () => { project: { apiBaseUrl: 'https://gitlab-enterprise.example.com/api/v4/', baseUrl: 'https://gitlab-enterprise.example.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'meno/dropzone', sourceDirectory: undefined, sourceUrl: 'https://gitlab-enterprise.example.com/meno/dropzone/', @@ -300,7 +301,7 @@ describe('workers/repository/update/pr/changelog/gitlab', () => { project: { apiBaseUrl: 'https://git.test.com/api/v4/', baseUrl: 'https://git.test.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'meno/dropzone', sourceDirectory: undefined, sourceUrl: 'https://git.test.com/meno/dropzone/', @@ -338,7 +339,7 @@ describe('workers/repository/update/pr/changelog/gitlab', () => { project: { apiBaseUrl: 'https://git.test.com/api/v4/', baseUrl: 'https://git.test.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'replacement/sourceurl', sourceDirectory: undefined, sourceUrl: 'https://git.test.com/replacement/sourceurl/', diff --git a/lib/workers/repository/update/pr/changelog/index.spec.ts b/lib/workers/repository/update/pr/changelog/index.spec.ts index c99c2f0e877a06..9fd8a4f3cdb619 100644 --- a/lib/workers/repository/update/pr/changelog/index.spec.ts +++ b/lib/workers/repository/update/pr/changelog/index.spec.ts @@ -14,9 +14,9 @@ const githubApiHost = 'https://api.github.com'; const githubTagsMock = jest.spyOn(githubGraphql, 'queryTags'); const githubReleasesMock = jest.spyOn(githubGraphql, 'queryReleases'); -const upgrade: BranchConfig = partial({ +const upgrade = partial({ endpoint: 'https://api.github.com/', - depName: 'renovate', + packageName: 'renovate', versioning: semverVersioning.id, currentVersion: '1.0.0', newVersion: '3.0.0', @@ -105,7 +105,7 @@ describe('workers/repository/update/pr/changelog/index', () => { project: { apiBaseUrl: 'https://api.github.com/', baseUrl: 'https://github.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'chalk/chalk', sourceDirectory: undefined, sourceUrl: 'https://github.com/chalk/chalk', @@ -140,7 +140,7 @@ describe('workers/repository/update/pr/changelog/index', () => { project: { apiBaseUrl: 'https://api.github.com/', baseUrl: 'https://github.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'chalk/chalk', sourceDirectory: undefined, sourceUrl: 'https://github.com/chalk/chalk', @@ -163,14 +163,14 @@ describe('workers/repository/update/pr/changelog/index', () => { httpMock.scope(githubApiHost).get(/.*/).reply(200, []).persist(); const res = await getChangeLogJSON({ ...upgrade, - depName: '@renovate/no', + packageName: '@renovate/no', }); expect(res).toMatchSnapshot({ hasReleaseNotes: true, project: { apiBaseUrl: 'https://api.github.com/', baseUrl: 'https://github.com/', - depName: '@renovate/no', + packageName: '@renovate/no', repository: 'chalk/chalk', sourceDirectory: undefined, sourceUrl: 'https://github.com/chalk/chalk', @@ -199,7 +199,7 @@ describe('workers/repository/update/pr/changelog/index', () => { project: { apiBaseUrl: 'https://api.github.com/', baseUrl: 'https://github.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'chalk/chalk', sourceDirectory: undefined, sourceUrl: 'https://github.com/chalk/chalk', @@ -279,7 +279,7 @@ describe('workers/repository/update/pr/changelog/index', () => { project: { apiBaseUrl: 'https://api.github.com/', baseUrl: 'https://github.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'chalk/chalk', sourceDirectory: undefined, sourceUrl: 'https://github.com/chalk/chalk', @@ -319,7 +319,7 @@ describe('workers/repository/update/pr/changelog/index', () => { project: { apiBaseUrl: 'https://github-enterprise.example.com/api/v3/', baseUrl: 'https://github-enterprise.example.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'chalk/chalk', sourceDirectory: undefined, sourceUrl: 'https://github-enterprise.example.com/chalk/chalk', @@ -357,7 +357,7 @@ describe('workers/repository/update/pr/changelog/index', () => { project: { apiBaseUrl: 'https://github-enterprise.example.com/api/v3/', baseUrl: 'https://github-enterprise.example.com/', - depName: 'renovate', + packageName: 'renovate', repository: 'chalk/chalk', sourceDirectory: undefined, sourceUrl: 'https://github-enterprise.example.com/chalk/chalk', 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 11037405065cc1..6baea97bde0ada 100644 --- a/lib/workers/repository/update/pr/changelog/release-notes.spec.ts +++ b/lib/workers/repository/update/pr/changelog/release-notes.spec.ts @@ -97,14 +97,14 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { it('returns input if invalid', async () => { const input = { a: 1 }; expect( - await addReleaseNotes(input as never, {} as BranchUpgradeConfig) + await addReleaseNotes(input as never, partial()) ).toEqual(input); - expect(await addReleaseNotes(null, {} as BranchUpgradeConfig)).toBeNull(); expect( - await addReleaseNotes({ versions: [] }, {} as BranchUpgradeConfig) - ).toStrictEqual({ - versions: [], - }); + await addReleaseNotes(null, partial()) + ).toBeNull(); + expect( + await addReleaseNotes({ versions: [] }, partial()) + ).toStrictEqual({ versions: [] }); }); it('returns ChangeLogResult', async () => { @@ -117,7 +117,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { versions: [{ version: '3.10.0', compare: { url: '' } }], }; expect( - await addReleaseNotes(input as never, {} as BranchUpgradeConfig) + await addReleaseNotes(input as never, partial()) ).toEqual({ a: 1, hasReleaseNotes: false, @@ -151,7 +151,9 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { }), ], } as ChangeLogResult; - expect(await addReleaseNotes(input, {} as BranchUpgradeConfig)).toEqual({ + expect( + await addReleaseNotes(input, partial()) + ).toEqual({ a: 1, hasReleaseNotes: false, project: { @@ -174,8 +176,8 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { describe('getReleaseList()', () => { it('should return empty array if no apiBaseUrl', async () => { const res = await getReleaseList( - partial({}), - partial({}) + partial(), + partial() ); expect(res).toBeEmptyArray(); }); @@ -205,7 +207,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { ...githubProject, repository: 'some/yet-other-repository', }, - partial({}) + partial() ); expect(res).toMatchObject([ { @@ -240,7 +242,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { ...gitlabProject, repository: 'some/yet-other-repository', }, - partial({}) + partial() ); expect(res).toMatchObject([ { @@ -279,7 +281,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { apiBaseUrl: 'https://my.custom.domain/api/v4/', baseUrl: 'https://my.custom.domain/', }, - partial({}) + partial() ); expect(res).toMatchObject([ { @@ -322,13 +324,13 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { ...githubProject, repository: 'some/repository', - depName: 'some', + packageName: 'some', }, partial({ version: '1.0.0', gitRef: '1.0.0', }), - {} as BranchUpgradeConfig + partial() ); expect(res).toBeNull(); }); @@ -357,13 +359,13 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { ...githubProject, repository: 'some/other-repository', - depName: 'other', + packageName: 'other', }, partial({ version: '1.0.1', gitRef: '1.0.1', }), - {} as BranchUpgradeConfig + partial() ); expect(res).toEqual({ body: 'some body [#123](https://github.com/some/other-repository/issues/123), [#124](https://github.com/some/yet-other-repository/issues/124)\n', @@ -399,13 +401,13 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { ...githubProject, repository: 'some/other-repository', - depName: 'other', + packageName: 'other', }, partial({ version: '1.0.1', gitRef: '1.0.1', }), - {} as BranchUpgradeConfig + partial() ); expect(res).toEqual({ body: '', @@ -441,13 +443,13 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { ...githubProject, repository: 'some/other-repository', - depName: 'other', + packageName: 'other', }, partial({ version: '1.0.1', gitRef: '1.0.1', }), - {} as BranchUpgradeConfig + partial() ); expect(res).toEqual({ body: 'some body\n', @@ -483,13 +485,13 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { ...githubProject, repository: 'some/other-repository', - depName: 'other', + packageName: 'other', }, partial({ version: '1.0.1', gitRef: '1.0.1', }), - {} as BranchUpgradeConfig + partial() ); expect(res).toEqual({ body: 'some body\n', @@ -525,13 +527,13 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { ...githubProject, repository: 'some/other-repository', - depName: 'other', + packageName: 'other', }, partial({ version: '1.0.1', gitRef: '1.0.1', }), - {} as BranchUpgradeConfig + partial() ); expect(res).toBeNull(); }); @@ -560,13 +562,13 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { ...githubProject, repository: 'some/other-repository', - depName: 'other', + packageName: 'other', }, partial({ version: '1.0.1', gitRef: '1.0.1', }), - {} as BranchUpgradeConfig + partial() ); expect(res).toEqual({ body: 'some body [#123](https://github.com/some/other-repository/issues/123), [#124](https://github.com/some/yet-other-repository/issues/124)\n', @@ -604,13 +606,13 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { ...githubProject, repository: 'some/other-repository', - depName: 'other', + packageName: 'other', }, partial({ version: '1.0.1', gitRef: '1.0.1', }), - {} as BranchUpgradeConfig + partial() ); expect(res).toEqual({ body: 'some body [#123](https://github.com/some/other-repository/issues/123), [#124](https://github.com/some/yet-other-repository/issues/124)\n', @@ -648,13 +650,13 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { ...githubProject, repository: 'some/other-repository', - depName: 'other', + packageName: 'other', }, partial({ version: '1.0.1', gitRef: '1.0.1', }), - {} as BranchUpgradeConfig + partial() ); expect(res).toEqual({ body: 'some body [#123](https://github.com/some/other-repository/issues/123), [#124](https://github.com/some/yet-other-repository/issues/124)\n', @@ -691,13 +693,13 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { ...githubProject, repository: 'some/other-repository', - depName: 'other', + packageName: 'other', }, partial({ version: '1.0.1', gitRef: '1.0.1', }), - {} as BranchUpgradeConfig + partial() ); expect(res).toEqual({ body: 'some body [#123](https://github.com/some/other-repository/issues/123), [#124](https://github.com/some/yet-other-repository/issues/124)\n', @@ -728,14 +730,14 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { ...gitlabProject, repository: 'some/other-repository', - depName: 'other', + packageName: 'other', apiBaseUrl: 'https://api.gitlab.com/', }, partial({ version: '1.0.1', gitRef: '1.0.1', }), - {} as BranchUpgradeConfig + partial() ); expect(res).toEqual({ body: 'some body #123, [#124](https://gitlab.com/some/yet-other-repository/issues/124)', @@ -765,14 +767,14 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { ...gitlabProject, repository: 'some/other-repository', - depName: 'other', + packageName: 'other', apiBaseUrl: 'https://api.gitlab.com/', }, partial({ version: '1.0.1', gitRef: '1.0.1', }), - {} as BranchUpgradeConfig + partial() ); expect(res).toEqual({ body: 'some body #123, [#124](https://gitlab.com/some/yet-other-repository/issues/124)', @@ -802,14 +804,14 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { ...gitlabProject, repository: 'some/other-repository', - depName: 'other', + packageName: 'other', apiBaseUrl: 'https://api.gitlab.com/', }, partial({ version: '1.0.1', gitRef: '1.0.1', }), - {} as BranchUpgradeConfig + partial() ); expect(res).toEqual({ body: 'some body #123, [#124](https://gitlab.com/some/yet-other-repository/issues/124)', @@ -825,7 +827,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { const res = await getReleaseNotes( partial({ repository: 'some/repository', - depName: 'other', + packageName: 'other', apiBaseUrl: 'https://api.lol.lol/', baseUrl: 'https://lol.lol/', }), @@ -833,17 +835,17 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { version: '1.0.1', gitRef: '1.0.1', }), - partial({}) + partial() ); expect(res).toBeNull(); }); it('handles same version but different repo releases', async () => { - const depName = 'correctTagPrefix/exampleDep'; + const packageName = 'correctTagPrefix/exampleDep'; githubReleasesMock.mockResolvedValueOnce([ { id: 1, - version: `${depName}@1.0.0`, + version: `${packageName}@1.0.0`, releaseTimestamp: '2020-01-01', url: 'correct/url/tag.com', name: 'some/dep', @@ -870,13 +872,13 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { ...githubProject, repository: 'some/other-repository', - depName: 'exampleDep', + packageName: 'exampleDep', }, partial({ version: '1.0.0', gitRef: '1.0.0', }), - {} as BranchUpgradeConfig + partial() ); expect(res).toEqual({ url: 'correct/url/tag.com', @@ -904,13 +906,15 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { ...githubProject, repository: 'some/other-repository', - depName: 'exampleDep', + packageName: 'exampleDep', }, partial({ version: '1.0.0', gitRef: '1.0.0', }), - { extractVersion: 'app-(?[0-9.]*)' } as BranchUpgradeConfig + partial({ + extractVersion: 'app-(?[0-9.]*)', + }) ); expect(res).toEqual({ url: 'correct/url/tag.com', diff --git a/lib/workers/repository/update/pr/changelog/release-notes.ts b/lib/workers/repository/update/pr/changelog/release-notes.ts index 31446797c7c0f7..2f8bff66a658e1 100644 --- a/lib/workers/repository/update/pr/changelog/release-notes.ts +++ b/lib/workers/repository/update/pr/changelog/release-notes.ts @@ -82,7 +82,7 @@ export function massageBody( body = body.replace(regEx(/^<\/a>\n/), ''); body = body.replace( regEx( - `^##? \\[[^\\]]*\\]\\(${baseUrl}[^/]*\\/[^/]*\\/compare\\/.*?\\n`, + `^##? \\[[^\\]]*\\]\\(${baseUrl}[^/]*/[^/]*/compare/.*?\\n`, undefined, false ), @@ -90,7 +90,7 @@ export function massageBody( ); // Clean-up unnecessary commits link body = `\n${body}\n`.replace( - regEx(`\\n${baseUrl}[^/]+\\/[^/]+\\/compare\\/[^\\n]+(\\n|$)`), + regEx(`\\n${baseUrl}[^/]+/[^/]+/compare/[^\\n]+(\\n|$)`), '\n' ); // Reduce headings size @@ -125,15 +125,15 @@ export async function getReleaseNotes( release: ChangeLogRelease, config: BranchUpgradeConfig ): Promise { - const { depName, repository } = project; + const { packageName, repository } = project; const { version, gitRef } = release; // TODO: types (#7154) - logger.trace(`getReleaseNotes(${repository}, ${version}, ${depName!})`); + logger.trace(`getReleaseNotes(${repository}, ${version}, ${packageName!})`); const releases = await getCachedReleaseList(project, release); logger.trace({ releases }, 'Release list from getReleaseList'); let releaseNotes: ChangeLogNotes | null = null; - let matchedRelease = getExactReleaseMatch(depName!, version, releases); + let matchedRelease = getExactReleaseMatch(packageName!, version, releases); if (is.undefined(matchedRelease)) { // no exact match of a release then check other cases matchedRelease = releases.find( @@ -158,11 +158,11 @@ export async function getReleaseNotes( } function getExactReleaseMatch( - depName: string, + packageName: string, version: string, releases: ChangeLogNotes[] ): ChangeLogNotes | undefined { - const exactReleaseReg = regEx(`${depName}[@_-]v?${version}`); + const exactReleaseReg = regEx(`${packageName}[@_-]v?${version}`); const candidateReleases = releases.filter((r) => r.tag?.endsWith(version)); const matchedRelease = candidateReleases.find((r) => exactReleaseReg.test(r.tag!) diff --git a/lib/workers/repository/update/pr/changelog/releases.spec.ts b/lib/workers/repository/update/pr/changelog/releases.spec.ts index 70fbddf173969e..5e4c7958950ab4 100644 --- a/lib/workers/repository/update/pr/changelog/releases.spec.ts +++ b/lib/workers/repository/update/pr/changelog/releases.spec.ts @@ -41,7 +41,7 @@ describe('workers/repository/update/pr/changelog/releases', () => { it('should contain only stable', async () => { const config = partial({ datasource: 'some-datasource', - depName: 'some-depname', + packageName: 'some-depname', versioning: npmVersioning.id, currentVersion: '1.0.0', newVersion: '1.1.0', @@ -54,7 +54,7 @@ describe('workers/repository/update/pr/changelog/releases', () => { it('should contain currentVersion unstable', async () => { const config = partial({ datasource: 'some-datasource', - depName: 'some-depname', + packageName: 'some-depname', versioning: npmVersioning.id, currentVersion: '1.0.1-rc0', newVersion: '1.1.0', @@ -67,7 +67,7 @@ describe('workers/repository/update/pr/changelog/releases', () => { it('should contain newVersion unstable', async () => { const config = partial({ datasource: 'some-datasource', - depName: 'some-depname', + packageName: 'some-depname', versioning: npmVersioning.id, currentVersion: '1.0.1', newVersion: '1.2.0-rc1', @@ -80,7 +80,7 @@ describe('workers/repository/update/pr/changelog/releases', () => { it('should contain both currentVersion newVersion unstable', async () => { const config = partial({ datasource: 'some-datasource', - depName: 'some-depname', + packageName: 'some-depname', versioning: npmVersioning.id, currentVersion: '1.0.1-rc0', newVersion: '1.2.0-rc1', @@ -93,7 +93,7 @@ describe('workers/repository/update/pr/changelog/releases', () => { it('should valueToVersion', async () => { const config = partial({ datasource: 'some-datasource', - depName: 'some-depname', + packageName: 'some-depname', versioning: dockerVersioning.id, currentVersion: '1.0.1-rc0', newVersion: '1.2.0-rc0', diff --git a/lib/workers/repository/update/pr/changelog/source-github.ts b/lib/workers/repository/update/pr/changelog/source-github.ts index a3bcb339086f10..39712f42aabd38 100644 --- a/lib/workers/repository/update/pr/changelog/source-github.ts +++ b/lib/workers/repository/update/pr/changelog/source-github.ts @@ -38,7 +38,7 @@ export async function getChangeLogJSON( const newVersion = config.newVersion!; const sourceUrl = config.sourceUrl!; const sourceDirectory = config.sourceDirectory!; - const depName = config.depName!; + const packageName = config.packageName!; const manager = config.manager; if (sourceUrl === 'https://github.com/DefinitelyTyped/DefinitelyTyped') { logger.trace('No release notes for @types'); @@ -60,19 +60,19 @@ export async function getChangeLogJSON( if (host!.endsWith('.github.com') || host === 'github.com') { if (!GlobalConfig.get('githubTokenWarn')) { logger.debug( - { manager, depName, sourceUrl }, + { manager, packageName, sourceUrl }, 'GitHub token warning has been suppressed. Skipping release notes retrieval' ); return null; } logger.warn( - { manager, depName, sourceUrl }, + { manager, packageName, sourceUrl }, 'No github.com token has been configured. Skipping release notes retrieval' ); return { error: 'MissingGithubToken' }; } logger.debug( - { manager, depName, sourceUrl }, + { manager, packageName, sourceUrl }, 'Repository URL does not match any known github hosts - skipping changelog retrieval' ); return null; @@ -99,7 +99,7 @@ export async function getChangeLogJSON( .sort((a, b) => version.sortVersions(a.version, b.version)); if (validReleases.length < 2) { - logger.debug(`Not enough valid releases for dep ${depName}`); + logger.debug(`Not enough valid releases for dep ${packageName}`); return null; } @@ -109,7 +109,12 @@ export async function getChangeLogJSON( if (!tags) { tags = await getCachedTags(apiBaseUrl, repository); } - const tagName = findTagOfRelease(version, depName, release.version, tags); + const tagName = findTagOfRelease( + version, + packageName, + release.version, + tags + ); if (tagName) { return tagName; } @@ -122,7 +127,7 @@ export async function getChangeLogJSON( const cacheNamespace = 'changelog-github-release'; function getCacheKey(prev: string, next: string): string { - return `${slugifyUrl(sourceUrl)}:${depName}:${prev}:${next}`; + return `${slugifyUrl(sourceUrl)}:${packageName}:${prev}:${next}`; } const changelogReleases: ChangeLogRelease[] = []; @@ -173,7 +178,7 @@ export async function getChangeLogJSON( repository, sourceUrl, sourceDirectory, - depName, + packageName, }, versions: changelogReleases, }; @@ -185,12 +190,12 @@ export async function getChangeLogJSON( function findTagOfRelease( version: allVersioning.VersioningApi, - depName: string, + packageName: string, depNewVersion: string, tags: string[] ): string | undefined { - const regex = regEx(`(?:${depName}|release)[@-]`, undefined, false); - const excactReleaseRegex = regEx(`${depName}[@-_]v?${depNewVersion}`); + const regex = regEx(`(?:${packageName}|release)[@-]`, undefined, false); + const excactReleaseRegex = regEx(`${packageName}[@-_]v?${depNewVersion}`); const exactTagsList = tags.filter((tag) => { return excactReleaseRegex.test(tag); }); diff --git a/lib/workers/repository/update/pr/changelog/source-gitlab.ts b/lib/workers/repository/update/pr/changelog/source-gitlab.ts index 4fa2ebe0adf38a..2b003f51c64a61 100644 --- a/lib/workers/repository/update/pr/changelog/source-gitlab.ts +++ b/lib/workers/repository/update/pr/changelog/source-gitlab.ts @@ -38,7 +38,7 @@ export async function getChangeLogJSON( const currentVersion = config.currentVersion!; const newVersion = config.newVersion!; const sourceUrl = config.sourceUrl!; - const depName = config.depName!; + const packageName = config.packageName!; const sourceDirectory = config.sourceDirectory!; logger.trace('getChangeLogJSON for gitlab'); @@ -81,7 +81,7 @@ export async function getChangeLogJSON( if (!tags) { tags = await getCachedTags(apiBaseUrl, versioning, repository); } - const regex = regEx(`(?:${depName}|release)[@-]`, undefined, false); + const regex = regEx(`(?:${packageName}|release)[@-]`, undefined, false); const tagName = tags .filter((tag) => version.isVersion(tag.replace(regex, ''))) .find((tag) => version.equals(tag.replace(regex, ''), release.version)); @@ -95,7 +95,7 @@ export async function getChangeLogJSON( } function getCacheKey(prev: string, next: string): string { - return `${slugifyUrl(sourceUrl)}:${depName}:${prev}:${next}`; + return `${slugifyUrl(sourceUrl)}:${packageName}:${prev}:${next}`; } const changelogReleases: ChangeLogRelease[] = []; @@ -144,7 +144,7 @@ export async function getChangeLogJSON( type: 'gitlab', repository, sourceUrl, - depName, + packageName, sourceDirectory, }, versions: changelogReleases, diff --git a/lib/workers/repository/update/pr/changelog/types.ts b/lib/workers/repository/update/pr/changelog/types.ts index 025c1a834e5ca3..23c4747a057e13 100644 --- a/lib/workers/repository/update/pr/changelog/types.ts +++ b/lib/workers/repository/update/pr/changelog/types.ts @@ -24,7 +24,7 @@ export interface ChangeLogRelease { } export interface ChangeLogProject { - depName?: string; + packageName?: string; type: 'github' | 'gitlab'; apiBaseUrl?: string; baseUrl: string; diff --git a/lib/workers/repository/update/pr/index.spec.ts b/lib/workers/repository/update/pr/index.spec.ts index 72abd9f414a45e..68c855903caa95 100644 --- a/lib/workers/repository/update/pr/index.spec.ts +++ b/lib/workers/repository/update/pr/index.spec.ts @@ -1,5 +1,12 @@ import { DateTime } from 'luxon'; -import { git, logger, mocked, platform, scm } from '../../../../../test/util'; +import { + git, + logger, + mocked, + partial, + platform, + scm, +} from '../../../../../test/util'; import { GlobalConfig } from '../../../../config/global'; import { PLATFORM_INTEGRATION_UNAUTHORIZED, @@ -107,7 +114,9 @@ describe('workers/repository/update/pr/index', () => { platform.createPr.mockResolvedValueOnce(pr); limits.isLimitReached.mockReturnValueOnce(true); - const res = await ensurePr({ ...config, isVulnerabilityAlert: true }); + const prConfig = { ...config, isVulnerabilityAlert: true }; + delete prConfig.prTitle; // for coverage + const res = await ensurePr(prConfig); expect(res).toEqual({ type: 'with-pr', pr }); expect(platform.createPr).toHaveBeenCalled(); @@ -620,7 +629,7 @@ describe('workers/repository/update/pr/index', () => { date: '', }; - const dummyUpgrade: BranchUpgradeConfig = { + const dummyUpgrade = partial({ branchName: sourceBranch, depType: 'foo', depName: 'bar', @@ -642,7 +651,7 @@ describe('workers/repository/update/pr/index', () => { { ...dummyRelease, version: '4.5.6' }, ], }, - }; + }); it('processes changelogs', async () => { platform.createPr.mockResolvedValueOnce(pr); @@ -695,11 +704,11 @@ describe('workers/repository/update/pr/index', () => { it('removes duplicate changelogs', async () => { platform.createPr.mockResolvedValueOnce(pr); - const upgrade: BranchUpgradeConfig = { + const upgrade = partial({ ...dummyUpgrade, sourceUrl: 'https://github.com/foo/bar', sourceDirectory: '/src', - }; + }); const res = await ensurePr({ ...config, upgrades: [upgrade, upgrade, { ...upgrade, depType: 'test' }], diff --git a/lib/workers/repository/update/pr/index.ts b/lib/workers/repository/update/pr/index.ts index db1e0cbe9277a4..cc308d54ab14ce 100644 --- a/lib/workers/repository/update/pr/index.ts +++ b/lib/workers/repository/update/pr/index.ts @@ -47,11 +47,11 @@ export function getPlatformPrOptions( ); return { - azureAutoApprove: config.azureAutoApprove, - azureWorkItemId: config.azureWorkItemId, - bbUseDefaultReviewers: config.bbUseDefaultReviewers, - gitLabIgnoreApprovals: config.gitLabIgnoreApprovals, - forkModeDisallowMaintainerEdits: config.forkModeDisallowMaintainerEdits, + azureAutoApprove: !!config.azureAutoApprove, + azureWorkItemId: config.azureWorkItemId ?? 0, + bbUseDefaultReviewers: !!config.bbUseDefaultReviewers, + gitLabIgnoreApprovals: !!config.gitLabIgnoreApprovals, + forkModeDisallowMaintainerEdits: !!config.forkModeDisallowMaintainerEdits, usePlatformAutomerge, }; } @@ -102,9 +102,15 @@ export async function ensurePr( const prFingerprint = fingerprint(filteredPrConfig); logger.trace({ config }, 'ensurePr'); // If there is a group, it will use the config of the first upgrade in the array - const { branchName, ignoreTests, prTitle = '', upgrades } = config; + const { + branchName, + ignoreTests, + internalChecksAsSuccess, + prTitle = '', + upgrades, + } = config; const getBranchStatus = memoize(() => - resolveBranchStatus(branchName, ignoreTests) + resolveBranchStatus(branchName, !!internalChecksAsSuccess, ignoreTests) ); const dependencyDashboardCheck = config.dependencyDashboardChecks?.[config.branchName]; @@ -385,7 +391,7 @@ export async function ensurePr( prBody, labels: prepareLabels(config), platformOptions: getPlatformPrOptions(config), - draftPR: config.draftPR, + draftPR: !!config.draftPR, }); incLimitedValue('PullRequests'); diff --git a/lib/workers/repository/updates/branch-name.ts b/lib/workers/repository/updates/branch-name.ts index b88ec208b3d8e5..9805478942316e 100644 --- a/lib/workers/repository/updates/branch-name.ts +++ b/lib/workers/repository/updates/branch-name.ts @@ -48,9 +48,9 @@ function cleanBranchName( export function generateBranchName(update: RenovateConfig): void { // Check whether to use a group name if (update.groupName) { - logger.debug('Using group branchName template'); + logger.trace('Using group branchName template'); // TODO: types (#7154) - logger.debug( + logger.trace( `Dependency ${update.depName!} is part of group ${update.groupName}` ); update.groupSlug = slugify(update.groupSlug ?? update.groupName, { diff --git a/lib/workers/repository/updates/flatten.spec.ts b/lib/workers/repository/updates/flatten.spec.ts index 50f242e71fbded..b0c83caf13de27 100644 --- a/lib/workers/repository/updates/flatten.spec.ts +++ b/lib/workers/repository/updates/flatten.spec.ts @@ -1,3 +1,4 @@ +import is from '@sindresorhus/is'; import { RenovateConfig, getConfig } from '../../../../test/util'; import { flattenUpdates } from './flatten'; @@ -144,6 +145,14 @@ describe('workers/repository/updates/flatten', () => { }; const res = await flattenUpdates(config, packageFiles); expect(res).toHaveLength(14); + expect( + res.every( + (upgrade) => + upgrade.isLockFileMaintenance || + upgrade.isRemediation || + is.number(upgrade.depIndex) + ) + ).toBeTrue(); expect( res.filter((update) => update.sourceRepoSlug)[0].sourceRepoSlug ).toBe('org-repo'); diff --git a/lib/workers/repository/updates/flatten.ts b/lib/workers/repository/updates/flatten.ts index 0bbde1440b48f4..77612b799af668 100644 --- a/lib/workers/repository/updates/flatten.ts +++ b/lib/workers/repository/updates/flatten.ts @@ -91,10 +91,12 @@ export async function flattenUpdates( packageFileConfig.parentDir = ''; packageFileConfig.packageFileDir = ''; } + let depIndex = 0; for (const dep of packageFile.deps) { if (dep.updates.length) { const depConfig = mergeChildConfig(packageFileConfig, dep); delete depConfig.deps; + depConfig.depIndex = depIndex; // used for autoreplace for (const update of dep.updates) { let updateConfig = mergeChildConfig(depConfig, update); delete updateConfig.updates; @@ -128,6 +130,7 @@ export async function flattenUpdates( updates.push(updateConfig); } } + depIndex += 1; } if ( get(manager, 'supportsLockFileMaintenance') && diff --git a/lib/workers/repository/updates/generate.spec.ts b/lib/workers/repository/updates/generate.spec.ts index d5f409246cc65d..040726a9034f8e 100644 --- a/lib/workers/repository/updates/generate.spec.ts +++ b/lib/workers/repository/updates/generate.spec.ts @@ -1,26 +1,39 @@ import { codeBlock } from 'common-tags'; import { getConfig } from '../../../../test/util'; -import type { RenovateConfig, UpdateType } from '../../../config/types'; +import type { UpdateType } from '../../../config/types'; import { NpmDatasource } from '../../../modules/datasource/npm'; import type { BranchUpgradeConfig } from '../../types'; import { generateBranchConfig } from './generate'; -let defaultConfig: RenovateConfig; +const { + commitMessage, + commitMessagePrefix, + commitMessageAction, + commitMessageTopic, + commitMessageExtra, +} = getConfig(); +let requiredDefaultOptions = {}; beforeEach(() => { jest.resetAllMocks(); - defaultConfig = getConfig(); + requiredDefaultOptions = { + commitMessage, + commitMessagePrefix, + commitMessageAction, + commitMessageTopic, + commitMessageExtra, + }; }); describe('workers/repository/updates/generate', () => { describe('generateBranchConfig()', () => { it('does not group single upgrade', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', + branchName: 'some-branch', depName: 'some-dep', groupName: 'some-group', - branchName: 'some-branch', prTitle: 'some-title', releaseTimestamp: '2017-02-07T20:01:41+00:00', foo: 1, @@ -28,7 +41,7 @@ describe('workers/repository/updates/generate', () => { foo: 2, }, }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.foo).toBe(1); expect(res.groupName).toBeUndefined(); @@ -36,14 +49,14 @@ describe('workers/repository/updates/generate', () => { }); it('handles lockFileMaintenance', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', branchName: 'some-branch', prTitle: 'some-title', isLockFileMaintenance: true, }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res).toMatchSnapshot({ branchName: 'some-branch', @@ -60,7 +73,7 @@ describe('workers/repository/updates/generate', () => { }); it('handles lockFileUpdate', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', branchName: 'some-branch', @@ -72,7 +85,7 @@ describe('workers/repository/updates/generate', () => { newValue: '^1.0.0', newVersion: '1.0.1', }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res).toMatchSnapshot({ branchName: 'some-branch', @@ -102,7 +115,7 @@ describe('workers/repository/updates/generate', () => { }); it('does not group same upgrades', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', depName: 'some-dep', @@ -125,7 +138,7 @@ describe('workers/repository/updates/generate', () => { foo: 2, }, }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.foo).toBe(1); expect(res.groupName).toBeUndefined(); @@ -204,7 +217,7 @@ describe('workers/repository/updates/generate', () => { }); it('groups major updates with different versions but same newValue, no recreateClosed', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', depName: 'some-dep', @@ -233,14 +246,14 @@ describe('workers/repository/updates/generate', () => { isMajor: true, newMajor: 5, }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.groupName).toBeDefined(); expect(res.recreateClosed).toBeFalsy(); }); it('groups multiple digest updates immortally', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', depName: 'some-dep', @@ -263,84 +276,89 @@ describe('workers/repository/updates/generate', () => { newDigest: 'sha256:abcdef987654321', isDigest: true, }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.groupName).toBeDefined(); expect(res.recreateClosed).toBeTrue(); }); it('Grouped pin & pinDigest can be recreated', () => { - // TODO #7154 incompatible types - const branch: BranchUpgradeConfig[] = [ + const branch = [ { - ...defaultConfig, + ...requiredDefaultOptions, isPinDigest: true, updateType: 'pinDigest', newValue: 'v2', newDigest: 'dc323e67f16fb5f7663d20ff7941f27f5809e9b6', - } as BranchUpgradeConfig, + }, { - ...defaultConfig, + ...requiredDefaultOptions, updateType: 'pin', isPin: true, newValue: "'2.2.0'", newVersion: '2.2.0', newMajor: 2, - } as BranchUpgradeConfig, - ]; + }, + ] as BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.recreateClosed).toBeTrue(); }); it('Grouped pin can be recreated', () => { - // TODO #7154 incompatible types - const branch: BranchUpgradeConfig[] = [ + const branch = [ { - ...defaultConfig, + ...requiredDefaultOptions, updateType: 'pin', isPin: true, newValue: "'2.2.0'", newVersion: '2.2.0', newMajor: 2, - } as BranchUpgradeConfig, + manager: 'some-manager', + branchName: 'some-branch', + }, { - ...defaultConfig, + ...requiredDefaultOptions, updateType: 'pin', isPin: true, newValue: "'3.2.0'", newVersion: '3.2.0', newMajor: 3, - } as BranchUpgradeConfig, - ]; + manager: 'some-manager', + branchName: 'some-branch', + }, + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.recreateClosed).toBeTrue(); }); it('grouped pinDigest can be recreated', () => { - // TODO #7154 incompatible types - const branch: BranchUpgradeConfig[] = [ + const branch = [ { - ...defaultConfig, + ...requiredDefaultOptions, isPinDigest: true, newDigest: 'abcd', newValue: 'v3', updateType: 'pinDigest', - } as BranchUpgradeConfig, + manager: 'some-manager', + branchName: 'some-branch', + }, { - ...defaultConfig, + ...requiredDefaultOptions, isPinDigest: true, newDigest: 'dcba', newMajor: 2, newValue: 'v2', updateType: 'pinDigest', - } as BranchUpgradeConfig, - ]; + manager: 'some-manager', + branchName: 'some-branch', + }, + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.recreateClosed).toBeTrue(); }); it('groups multiple upgrades different version', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', depName: 'depB', @@ -379,7 +397,7 @@ describe('workers/repository/updates/generate', () => { updateType: 'minor', separateMinorPatch: true, }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res).toMatchObject({ foo: 2, @@ -393,7 +411,7 @@ describe('workers/repository/updates/generate', () => { }); it('groups multiple upgrades different version but same value', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', depName: 'depB', @@ -426,7 +444,7 @@ describe('workers/repository/updates/generate', () => { }, releaseTimestamp: '2017-02-08T20:01:41+00:00', }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.foo).toBe(2); expect(res.singleVersion).toBeUndefined(); @@ -436,7 +454,7 @@ describe('workers/repository/updates/generate', () => { }); it('groups multiple upgrades different value but same version', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', depName: 'depB', @@ -469,7 +487,7 @@ describe('workers/repository/updates/generate', () => { }, releaseTimestamp: '2017-02-08T20:01:41+00:00', }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.foo).toBe(2); expect(res.singleVersion).toBeUndefined(); @@ -479,7 +497,7 @@ describe('workers/repository/updates/generate', () => { }); it('groups multiple digest updates', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', depName: 'foo/bar', @@ -510,7 +528,7 @@ describe('workers/repository/updates/generate', () => { foo: 2, }, }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.foo).toBe(2); expect(res.singleVersion).toBeUndefined(); @@ -519,24 +537,25 @@ describe('workers/repository/updates/generate', () => { }); it('pins digest to table', () => { - // TODO #7154 incompatible types - const branch: BranchUpgradeConfig[] = [ + const branch = [ { - ...defaultConfig, + ...requiredDefaultOptions, depName: 'foo-image', newDigest: 'abcdefg987612345', currentDigest: '', updateType: 'pinDigest', isPinDigest: true, - } as BranchUpgradeConfig, - ]; + manager: 'some-manager', + branchName: 'some-branch', + }, + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.upgrades[0].displayFrom).toBe(''); expect(res.upgrades[0].displayTo).toBe('abcdefg'); }); it('fixes different messages', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', depName: 'depA', @@ -569,17 +588,16 @@ describe('workers/repository/updates/generate', () => { }, releaseTimestamp: '2017-02-08T20:01:41+00:00', }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.foo).toBe(1); expect(res.groupName).toBeUndefined(); }); it('uses semantic commits', () => { - // TODO #7154 incompatible types - const branch: BranchUpgradeConfig[] = [ + const branch = [ { - ...defaultConfig, + ...requiredDefaultOptions, manager: 'some-manager', depName: 'some-dep', semanticCommits: 'enabled', @@ -592,8 +610,9 @@ describe('workers/repository/updates/generate', () => { group: { foo: 2, }, - } as BranchUpgradeConfig, - ]; + branchName: 'some-branch', + }, + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.prTitle).toBe( 'chore(package): update dependency some-dep to v1.2.0' @@ -604,10 +623,9 @@ describe('workers/repository/updates/generate', () => { }); it('scopes monorepo commits', () => { - // TODO #7154 incompatible types - const branch: BranchUpgradeConfig[] = [ + const branch = [ { - ...defaultConfig, + ...requiredDefaultOptions, manager: 'some-manager', depName: 'some-dep', packageFile: 'package.json', @@ -622,8 +640,9 @@ describe('workers/repository/updates/generate', () => { group: { foo: 2, }, - } as BranchUpgradeConfig, - ]; + branchName: 'some-branch', + }, + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.prTitle).toBe('chore(): update dependency some-dep to v1.2.0'); expect(res.commitMessage).toBe( @@ -632,10 +651,9 @@ describe('workers/repository/updates/generate', () => { }); it('scopes monorepo commits with nested package files using parent directory', () => { - // TODO #7154 incompatible types - const branch: BranchUpgradeConfig[] = [ + const branch = [ { - ...defaultConfig, + ...requiredDefaultOptions, commitBodyTable: false, manager: 'some-manager', depName: 'some-dep', @@ -651,8 +669,9 @@ describe('workers/repository/updates/generate', () => { group: { foo: 2, }, - } as BranchUpgradeConfig, - ]; + branchName: 'some-branch', + }, + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.prTitle).toBe( 'chore(bar): update dependency some-dep to v1.2.0' @@ -663,10 +682,9 @@ describe('workers/repository/updates/generate', () => { }); it('scopes monorepo commits with nested package files using base directory', () => { - // TODO #7154 incompatible types - const branch: BranchUpgradeConfig[] = [ + const branch = [ { - ...defaultConfig, + ...requiredDefaultOptions, manager: 'some-manager', depName: 'some-dep', packageFile: 'foo/bar/package.json', @@ -681,8 +699,9 @@ describe('workers/repository/updates/generate', () => { group: { foo: 2, }, - } as BranchUpgradeConfig, - ]; + branchName: 'some-branch', + }, + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.prTitle).toBe( 'chore(foo/bar): update dependency some-dep to v1.2.0' @@ -693,10 +712,9 @@ describe('workers/repository/updates/generate', () => { }); it('use prettyVersion in pr title when there is a v', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { - ...defaultConfig, - manager: 'some-manager', + ...requiredDefaultOptions, depName: 'some-dep', packageFile: 'foo/bar/package.json', packageFileDir: 'foo/bar', @@ -707,8 +725,10 @@ describe('workers/repository/updates/generate', () => { newValue: 'v1.2.0', isSingleVersion: true, newVersion: 'v1.2.0', - } as BranchUpgradeConfig, - ]; + manager: 'some-manager', + branchName: 'some-branch', + }, + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.prTitle).toBe( 'chore(foo/bar): update dependency some-dep v1.2.0' @@ -719,9 +739,9 @@ describe('workers/repository/updates/generate', () => { }); it('use prettyVersion in pr title there is no v', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { - ...defaultConfig, + ...requiredDefaultOptions, manager: 'some-manager', depName: 'some-dep', packageFile: 'foo/bar/package.json', @@ -733,8 +753,9 @@ describe('workers/repository/updates/generate', () => { newValue: '3.2.0', newVersion: '3.2.0', newMajor: 3, - } as BranchUpgradeConfig, - ]; + branchName: 'some-branch', + }, + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.prTitle).toBe( 'chore(foo/bar): update dependency some-dep v3.2.0' @@ -745,9 +766,9 @@ describe('workers/repository/updates/generate', () => { }); it('use newMajor in pr title with v', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { - ...defaultConfig, + ...requiredDefaultOptions, manager: 'some-manager', depName: 'some-dep', packageFile: 'foo/bar/package.json', @@ -759,8 +780,9 @@ describe('workers/repository/updates/generate', () => { newValue: '3.2.0', newVersion: '3.2.0', newMajor: 3, - } as BranchUpgradeConfig, - ]; + branchName: 'some-branch', + }, + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.prTitle).toBe('chore(foo/bar): update dependency some-dep v3'); expect(res.commitMessage).toBe( @@ -769,9 +791,9 @@ describe('workers/repository/updates/generate', () => { }); it('Default commitMessageExtra pr title', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { - ...defaultConfig, + ...requiredDefaultOptions, manager: 'some-manager', depName: 'some-dep', packageFile: 'foo/bar/package.json', @@ -782,8 +804,9 @@ describe('workers/repository/updates/generate', () => { newValue: 'v1.2.0', isSingleVersion: true, newVersion: 'v1.2.0', - } as BranchUpgradeConfig, - ]; + branchName: 'some-branch', + }, + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.prTitle).toBe( 'chore(foo/bar): update dependency some-dep to v1.2.0' @@ -794,41 +817,41 @@ describe('workers/repository/updates/generate', () => { }); it('adds commit message body', () => { - // TODO #7154 incompatible types - const branch: BranchUpgradeConfig[] = [ + const branch = [ { - ...defaultConfig, + ...requiredDefaultOptions, manager: 'some-manager', depName: 'some-dep', commitBody: '[skip-ci]', newValue: '1.2.0', isSingleVersion: true, newVersion: '1.2.0', - } as BranchUpgradeConfig, - ]; + branchName: 'some-branch', + }, + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.prTitle).toBe('Update dependency some-dep to v1.2.0'); expect(res.commitMessage).toBe('Update dependency some-dep to v1.2.0'); }); it('supports manual prTitle', () => { - // TODO #7154 incompatible types - const branch: BranchUpgradeConfig[] = [ + const branch = [ { - ...defaultConfig, + ...requiredDefaultOptions, manager: 'some-manager', depName: 'some-dep', prTitle: 'Upgrade {{depName}}', toLowerCase: true, - } as BranchUpgradeConfig, - ]; + branchName: 'some-branch', + }, + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.prTitle).toBe('upgrade some-dep'); expect(res.commitMessage).toBe('update dependency some-dep to'); }); it('handles @types specially', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', commitBodyTable: true, @@ -865,7 +888,7 @@ describe('workers/repository/updates/generate', () => { newValue: '1.0.0', group: {}, }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.recreateClosed).toBeFalse(); expect(res.groupName).toBeUndefined(); @@ -893,7 +916,7 @@ describe('workers/repository/updates/generate', () => { }); it('handles @types specially (reversed)', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', depName: 'some-dep', @@ -926,7 +949,7 @@ describe('workers/repository/updates/generate', () => { labels: ['a'], group: {}, }, - ]; + ] satisfies BranchUpgradeConfig[]; expect(generateBranchConfig(branch)).toMatchSnapshot({ upgrades: [ { @@ -954,8 +977,7 @@ describe('workers/repository/updates/generate', () => { }); it('handles upgrades', () => { - // TODO #7154 incompatible types - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', depName: 'some-dep', @@ -966,7 +988,7 @@ describe('workers/repository/updates/generate', () => { fileReplacePosition: 5, }, { - ...defaultConfig, + ...requiredDefaultOptions, manager: 'some-manager', depName: 'some-dep', branchName: 'some-branch', @@ -978,7 +1000,7 @@ describe('workers/repository/updates/generate', () => { fileReplacePosition: 1, }, { - ...defaultConfig, + ...requiredDefaultOptions, manager: 'some-manager', depName: 'some-dep', branchName: 'some-branch', @@ -990,7 +1012,7 @@ describe('workers/repository/updates/generate', () => { fileReplacePosition: 2, }, { - ...defaultConfig, + ...requiredDefaultOptions, manager: 'some-manager', depName: 'some-dep', branchName: 'some-branch', @@ -1002,13 +1024,13 @@ describe('workers/repository/updates/generate', () => { updateType: 'patch' as UpdateType, fileReplacePosition: 0, }, - ] as BranchUpgradeConfig[]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.prTitle).toMatchSnapshot('some-title (patch)'); }); it('combines prBodyColumns', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', branchName: 'some-branch', @@ -1019,13 +1041,13 @@ describe('workers/repository/updates/generate', () => { branchName: 'some-branch', prBodyColumns: ['column-c', 'column-b', 'column-a'], }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.prBodyColumns).toEqual(['column-a', 'column-b', 'column-c']); }); it('sorts upgrades, without position first', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', depName: 'some-dep1', @@ -1058,7 +1080,7 @@ describe('workers/repository/updates/generate', () => { newValue: '0.6.0', fileReplacePosition: undefined, }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect( res.upgrades.map((upgrade) => upgrade.fileReplacePosition) @@ -1066,7 +1088,7 @@ describe('workers/repository/updates/generate', () => { }); it('passes through pendingChecks', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', depName: 'some-dep', @@ -1083,14 +1105,14 @@ describe('workers/repository/updates/generate', () => { prTitle: 'some-title', pendingChecks: true, }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.pendingChecks).toBeTrue(); expect(res.upgrades).toHaveLength(2); }); it('filters pendingChecks', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', depName: 'some-dep', @@ -1106,14 +1128,14 @@ describe('workers/repository/updates/generate', () => { branchName: 'some-branch', prTitle: 'some-title', }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.pendingChecks).toBeUndefined(); expect(res.upgrades).toHaveLength(1); }); it('displays pending versions', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', depName: 'some-dep', @@ -1137,7 +1159,7 @@ describe('workers/repository/updates/generate', () => { prTitle: 'Two pending versions', pendingVersions: ['1.1.0', '1.1.1'], }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.upgrades.map((u) => u.displayPending)).toStrictEqual([ '', @@ -1147,7 +1169,7 @@ describe('workers/repository/updates/generate', () => { }); it('merge excludeCommitPaths if appears in upgrade', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', depName: 'some-dep1', @@ -1171,7 +1193,7 @@ describe('workers/repository/updates/generate', () => { newValue: '0.9.0', excludeCommitPaths: ['some/path', 'some/other-manager/path'], }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); const excludeCommitPaths = res.excludeCommitPaths ?? []; expect(excludeCommitPaths.sort()).toStrictEqual( @@ -1180,9 +1202,9 @@ describe('workers/repository/updates/generate', () => { }); it('generates pretty version name properly', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { - ...defaultConfig, + ...requiredDefaultOptions, depName: 'some-dep', isSingleVersion: true, manager: 'some-manager', @@ -1191,8 +1213,9 @@ describe('workers/repository/updates/generate', () => { semanticCommits: 'enabled', semanticCommitScope: 'package', semanticCommitType: 'chore', - } as BranchUpgradeConfig, - ]; + branchName: 'some-branch', + }, + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.prTitle).toBe( 'chore(package): update dependency some-dep to foo-pkg-v3.2.1' @@ -1203,22 +1226,22 @@ describe('workers/repository/updates/generate', () => { }); it('prevents issue with duplicating "v" character', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { manager: 'some-manager', branchName: 'some-branch', commitMessage: 'update to vv1.2.0', }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.prTitle).toBe('update to v1.2.0'); expect(res.commitMessage).toBe('update to v1.2.0'); }); it('apply semanticCommits and commitMessagePrefix together', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { - ...defaultConfig, + ...requiredDefaultOptions, branchName: 'some-branch', commitMessagePrefix: 'PATCH:', depName: 'some-dep', @@ -1226,8 +1249,8 @@ describe('workers/repository/updates/generate', () => { newValue: '1.2.0', semanticCommits: 'enabled', semanticCommitScope: null, - } as BranchUpgradeConfig, - ]; + }, + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.prTitle).toBe('PATCH: Update dependency some-dep to 1.2.0'); expect(res.commitMessage).toBe( @@ -1236,7 +1259,7 @@ describe('workers/repository/updates/generate', () => { }); it('dedupes duplicate table rows', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { commitBodyTable: true, manager: 'some-manager', @@ -1281,7 +1304,7 @@ describe('workers/repository/updates/generate', () => { currentVersion: '5.1.1', newVersion: '5.1.2', }, - ]; + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.commitMessage?.trim()).toBe(codeBlock` | datasource | package | from | to | @@ -1299,17 +1322,17 @@ describe('workers/repository/updates/generate', () => { }); it('using commitMessagePrefix without separator', () => { - const branch: BranchUpgradeConfig[] = [ + const branch = [ { - ...defaultConfig, + ...requiredDefaultOptions, branchName: 'some-branch', commitMessagePrefix: '🆙', depName: 'some-dep', manager: 'some-manager', newValue: '1.2.0', commitMessageAction: 'Update', - } as BranchUpgradeConfig, - ]; + }, + ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); expect(res.prTitle).toBe('🆙 Update dependency some-dep to 1.2.0'); expect(res.commitMessage).toBe('🆙 Update dependency some-dep to 1.2.0'); diff --git a/lib/workers/types.ts b/lib/workers/types.ts index 8236081cb5cd44..7b53bcddb2747c 100644 --- a/lib/workers/types.ts +++ b/lib/workers/types.ts @@ -16,7 +16,7 @@ import type { } from '../modules/manager/types'; import type { PlatformPrOptions } from '../modules/platform/types'; import type { FileChange } from '../util/git/types'; -import type { MergeConfidence } from '../util/merge-confidence'; +import type { MergeConfidence } from '../util/merge-confidence/types'; import type { ChangeLogRelease, ChangeLogResult, @@ -38,6 +38,7 @@ export interface BranchUpgradeConfig currentDigest?: string; currentDigestShort?: string; currentValue?: string; + depIndex?: number; excludeCommitPaths?: string[]; githubName?: string; group?: GroupConfig; @@ -60,7 +61,7 @@ export interface BranchUpgradeConfig releases?: ReleaseWithNotes[]; releaseTimestamp?: string; repoName?: string; - minimumConfidence?: MergeConfidence; + minimumConfidence?: MergeConfidence | undefined; sourceDirectory?: string; updatedPackageFiles?: FileChange[]; diff --git a/package.json b/package.json index 6347a21eb9f8cf..00b5e93628bdd6 100644 --- a/package.json +++ b/package.json @@ -82,6 +82,7 @@ ], "author": "Rhys Arkins ", "contributors": [ + "Adam Setch ", "Alex DelVecchio ", "Andreas Bexelius ", "Ayoub Kaanich ", @@ -127,43 +128,43 @@ }, "homepage": "https://renovatebot.com", "engines": { - "node": "^14.15.0 || >=16.13.0", + "node": ">=18.12.0", "yarn": "^1.17.0" }, "engines-next": { "description": "Versions other than the below are deprecated and a warning will be logged", - "node": ">= 18.12.0" + "node": ">=18.12.0" }, "dependencies": { - "@aws-sdk/client-codecommit": "3.256.0", - "@aws-sdk/client-ec2": "3.256.0", - "@aws-sdk/client-ecr": "3.256.0", - "@aws-sdk/client-iam": "3.256.0", - "@aws-sdk/client-rds": "3.256.0", - "@aws-sdk/client-s3": "3.256.0", + "@aws-sdk/client-codecommit": "3.290.0", + "@aws-sdk/client-ec2": "3.291.0", + "@aws-sdk/client-ecr": "3.290.0", + "@aws-sdk/client-iam": "3.291.0", + "@aws-sdk/client-rds": "3.290.0", + "@aws-sdk/client-s3": "3.290.0", "@breejs/later": "4.1.0", "@cheap-glitch/mi-cron": "1.0.1", "@iarna/toml": "3.0.0", - "@opentelemetry/api": "1.4.0", - "@opentelemetry/context-async-hooks": "1.9.1", - "@opentelemetry/exporter-trace-otlp-http": "0.35.1", - "@opentelemetry/instrumentation": "0.35.1", + "@opentelemetry/api": "1.4.1", + "@opentelemetry/context-async-hooks": "1.10.0", + "@opentelemetry/exporter-trace-otlp-http": "0.36.0", + "@opentelemetry/instrumentation": "0.36.0", "@opentelemetry/instrumentation-bunyan": "0.31.1", - "@opentelemetry/instrumentation-http": "0.35.1", - "@opentelemetry/resources": "1.9.1", - "@opentelemetry/sdk-trace-base": "1.9.1", - "@opentelemetry/sdk-trace-node": "1.9.1", - "@opentelemetry/semantic-conventions": "1.9.1", + "@opentelemetry/instrumentation-http": "0.36.0", + "@opentelemetry/resources": "1.10.0", + "@opentelemetry/sdk-trace-base": "1.10.0", + "@opentelemetry/sdk-trace-node": "1.10.0", + "@opentelemetry/semantic-conventions": "1.10.0", "@qnighy/marshal": "0.1.3", - "@renovatebot/osv-offline": "1.2.1", + "@renovatebot/osv-offline": "1.2.2", "@renovatebot/pep440": "2.1.13", - "@renovatebot/ruby-semver": "2.1.8", + "@renovatebot/ruby-semver": "2.1.9", "@sindresorhus/is": "4.6.0", "@types/ms": "0.7.31", "@types/tmp": "0.2.3", "@yarnpkg/core": "3.4.0", "@yarnpkg/parsers": "2.5.1", - "agentkeepalive": "4.2.1", + "agentkeepalive": "4.3.0", "aggregate-error": "3.1.0", "auth-header": "1.0.0", "aws4": "1.12.0", @@ -195,7 +196,7 @@ "global-agent": "3.0.0", "good-enough-parser": "1.1.22", "got": "11.8.6", - "graph-data-structure": "3.1.1", + "graph-data-structure": "3.2.0", "handlebars": "4.7.7", "hasha": "5.2.2", "hcl2-parser": "1.0.3", @@ -205,15 +206,15 @@ "json-dup-key-validator": "1.0.3", "json-stringify-pretty-compact": "3.0.0", "json5": "2.2.3", - "luxon": "3.2.1", + "luxon": "3.3.0", "markdown-it": "13.0.1", "markdown-table": "2.0.0", "minimatch": "5.1.6", "moo": "0.5.2", "ms": "2.1.3", "nanoid": "3.3.4", - "node-html-parser": "6.1.4", - "openpgp": "5.5.0", + "node-html-parser": "6.1.5", + "openpgp": "5.7.0", "p-all": "3.0.0", "p-map": "4.0.0", "p-queue": "6.6.2", @@ -221,7 +222,7 @@ "parse-link-header": "2.0.0", "prettier": "2.8.4", "quick-lru": "5.1.1", - "redis": "4.6.4", + "redis": "4.6.5", "remark": "13.0.0", "remark-github": "10.1.0", "safe-stable-stringify": "2.4.2", @@ -229,7 +230,7 @@ "semver-stable": "3.0.0", "semver-utils": "1.1.4", "shlex": "2.1.2", - "simple-git": "3.16.1", + "simple-git": "3.17.0", "slugify": "1.6.5", "source-map-support": "0.5.21", "traverse": "0.6.7", @@ -239,15 +240,15 @@ "validate-npm-package-name": "5.0.0", "vuln-vects": "1.1.0", "xmldoc": "1.2.0", - "zod": "3.20.6" + "zod": "3.21.4" }, "optionalDependencies": { "re2": "1.18.0" }, "devDependencies": { - "@jest/globals": "29.4.3", - "@jest/reporters": "29.4.3", - "@jest/test-result": "29.4.3", + "@jest/globals": "29.5.0", + "@jest/reporters": "29.5.0", + "@jest/test-result": "29.5.0", "@ls-lint/ls-lint": "1.11.2", "@openpgp/web-stream-tools": "0.0.13", "@renovate/eslint-plugin": "file:./tools/eslint", @@ -262,7 +263,7 @@ "@types/common-tags": "1.8.1", "@types/conventional-commits-detector": "1.0.0", "@types/diff": "5.0.2", - "@types/eslint": "8.21.1", + "@types/eslint": "8.21.2", "@types/fs-extra": "11.0.1", "@types/git-url-parse": "9.0.1", "@types/github-url-from-git": "1.5.1", @@ -278,7 +279,7 @@ "@types/marshal": "0.5.1", "@types/moo": "0.5.5", "@types/nock": "10.0.3", - "@types/node": "16.18.12", + "@types/node": "18.15.3", "@types/parse-link-header": "2.0.1", "@types/semver": "7.3.13", "@types/semver-stable": "3.0.0", @@ -288,18 +289,18 @@ "@types/url-join": "4.0.1", "@types/validate-npm-package-name": "4.0.0", "@types/xmldoc": "1.1.6", - "@typescript-eslint/eslint-plugin": "5.52.0", - "@typescript-eslint/parser": "5.52.0", - "aws-sdk-client-mock": "2.0.1", + "@typescript-eslint/eslint-plugin": "5.55.0", + "@typescript-eslint/parser": "5.55.0", + "aws-sdk-client-mock": "2.1.1", "callsite": "1.0.0", "common-tags": "1.8.2", "conventional-changelog-conventionalcommits": "5.0.0", "cross-env": "7.0.3", "diff": "5.1.0", "emojibase-data": "7.0.1", - "eslint": "8.34.0", - "eslint-config-prettier": "8.6.0", - "eslint-formatter-gha": "1.4.1", + "eslint": "8.36.0", + "eslint-config-prettier": "8.7.0", + "eslint-formatter-gha": "1.4.2", "eslint-import-resolver-typescript": "3.5.3", "eslint-plugin-import": "2.27.5", "eslint-plugin-jest": "27.2.1", @@ -310,25 +311,25 @@ "glob": "8.1.0", "graphql": "16.6.0", "husky": "8.0.3", - "jest": "29.4.3", - "jest-extended": "3.2.3", + "jest": "29.5.0", + "jest-extended": "3.2.4", "jest-junit": "15.0.0", - "jest-mock-extended": "3.0.1", - "lint-staged": "13.1.2", + "jest-mock-extended": "3.0.3", + "lint-staged": "13.2.0", "markdownlint-cli2": "0.6.0", "memfs": "3.4.13", "mock-fs": "5.2.0", "mockdate": "3.0.5", "nock": "13.3.0", "npm-run-all": "4.1.5", - "rimraf": "4.1.2", - "semantic-release": "20.1.0", + "rimraf": "4.4.0", + "semantic-release": "20.1.1", "shelljs": "0.8.5", "strip-ansi": "6.0.1", "tmp-promise": "3.0.3", "ts-jest": "29.0.5", "ts-node": "10.9.1", - "type-fest": "3.5.7", + "type-fest": "3.6.1", "typescript": "4.9.5", "unified": "9.2.2" }, diff --git a/test/util.ts b/test/util.ts index df65067d0b4128..369a08f4ec1fbe 100644 --- a/test/util.ts +++ b/test/util.ts @@ -35,9 +35,10 @@ export function mockedFunction any>( * Simply wrapper to create partial mocks. * @param obj Object to cast to final type */ +export function partial(): T; export function partial(obj: Partial): T; export function partial(obj: Partial[]): T[]; -export function partial(obj: unknown): unknown { +export function partial(obj: unknown = {}): unknown { return obj; } diff --git a/tools/docs/datasources.ts b/tools/docs/datasources.ts index 9d069ff49f79ce..aaec81fa262914 100644 --- a/tools/docs/datasources.ts +++ b/tools/docs/datasources.ts @@ -1,6 +1,7 @@ import { codeBlock } from 'common-tags'; import { getDatasources } from '../../lib/modules/datasource'; import { readFile, updateFile } from '../utils'; +import { OpenItems, generateFeatureAndBugMarkdown } from './github-query-items'; import { formatDescription, formatUrls, @@ -9,7 +10,10 @@ import { replaceContent, } from './utils'; -export async function generateDatasources(dist: string): Promise { +export async function generateDatasources( + dist: string, + datasourceIssuesMap: OpenItems +): Promise { const dsList = getDatasources(); let datasourceContent = '\nSupported values for `datasource` are:\n\n'; @@ -56,6 +60,8 @@ export async function generateDatasources(dist: string): Promise { '\n```\n'; } + md += generateFeatureAndBugMarkdown(datasourceIssuesMap, datasource); + await updateFile(`${dist}/modules/datasource/${datasource}/index.md`, md); } diff --git a/tools/docs/github-query-items.ts b/tools/docs/github-query-items.ts index f9668ce59bbe18..c03461c5f979a9 100644 --- a/tools/docs/github-query-items.ts +++ b/tools/docs/github-query-items.ts @@ -1,4 +1,21 @@ -export type GithubApiQueryResponse = { +import { DateTime } from 'luxon'; +import { logger } from '../../lib/logger'; +import * as hostRules from '../../lib/util/host-rules'; +import { GithubHttp } from '../../lib/util/http/github'; +import { getQueryString } from '../../lib/util/url'; + +const gitHubApiUrl = 'https://api.github.com/search/issues?'; +const githubApi = new GithubHttp(); + +if (process.env.GITHUB_TOKEN) { + logger.debug('Using GITHUB_TOKEN from env'); + hostRules.add({ + matchHost: 'api.github.com', + token: process.env.GITHUB_TOKEN, + }); +} + +type GithubApiQueryResponse = { total_count: number; incomplete_results: boolean; items: ItemsEntity[]; @@ -14,3 +31,124 @@ export type ItemsEntity = { export type LabelsEntity = { name: string; }; + +export interface RenovateOpenItems { + managers: OpenItems; + platforms: OpenItems; + datasources: OpenItems; +} + +export type OpenItems = Record; + +export interface Items { + bugs: ItemsEntity[]; + features: ItemsEntity[]; +} + +export async function getOpenGitHubItems(): Promise { + const q = `repo:renovatebot/renovate type:issue is:open -label:priority-5-triage`; + const per_page = 100; + try { + const query = getQueryString({ q, per_page }); + const res = await githubApi.getJson( + gitHubApiUrl + query, + { + paginationField: 'items', + paginate: true, + } + ); + const rawItems = res.body?.items ?? []; + + const renovateOpenItems: RenovateOpenItems = { + managers: extractIssues(rawItems, 'manager:'), + platforms: extractIssues(rawItems, 'platform:'), + datasources: extractIssues(rawItems, 'datasource:'), + }; + + return renovateOpenItems; + } catch (err) { + logger.error({ err }, 'Error getting query results'); + throw err; + } +} + +function extractIssues(items: ItemsEntity[], labelPrefix: string): OpenItems { + const issuesMap: OpenItems = {}; + + for (const item of items) { + const type = item.labels + .find((l) => l.name.startsWith('type:')) + ?.name.split(':')[1]; + if (!type) { + continue; + } + const label = item.labels + .find((l) => l.name.startsWith(labelPrefix)) + ?.name.split(':')[1]; + if (!label) { + continue; + } + if (!issuesMap[label]) { + issuesMap[label] = { bugs: [], features: [] }; + } + switch (type) { + case 'bug': + issuesMap[label]?.bugs.push(item); + break; + case 'feature': + issuesMap[label]?.features.push(item); + break; + default: + break; + } + } + + return issuesMap; +} + +function stringifyIssues(items: ItemsEntity[] | undefined): string { + if (!items) { + return ''; + } + let list = ''; + for (const item of items) { + list += ` - ${item.title} [#${item.number}](${item.html_url})\n`; + } + return list; +} + +export function generateFeatureAndBugMarkdown( + issuesMap: OpenItems, + key: string +): string { + let md = '\n\n'; + + const featureList = stringifyIssues(issuesMap[key]?.features); + const bugList = stringifyIssues(issuesMap[key]?.bugs); + + if (featureList || bugList) { + md += '## Open items\n\n'; + } + + if (featureList || bugList) { + const now = DateTime.utc().toFormat('MMMM dd, yyyy'); + const lists = `list of ${featureList ? 'features' : ''}${ + featureList && bugList ? ' and ' : '' + }${bugList ? 'bugs' : ''}`; + md += `The below ${lists} were current when this page was generated on ${now}.\n\n`; + } + + if (featureList) { + md += '### Feature requests\n\n'; + md += featureList; + md += '\n'; + } + + if (bugList) { + md += '### Bug reports\n\n'; + md += bugList; + md += '\n'; + } + + return md; +} diff --git a/tools/docs/manager.ts b/tools/docs/manager.ts index a111f87e3bca18..dddd4511f925ff 100644 --- a/tools/docs/manager.ts +++ b/tools/docs/manager.ts @@ -1,29 +1,9 @@ -import { DateTime } from 'luxon'; import type { RenovateConfig } from '../../lib/config/types'; -import { logger } from '../../lib/logger'; import { getManagers } from '../../lib/modules/manager'; -import * as hostRules from '../../lib/util/host-rules'; -import { GithubHttp } from '../../lib/util/http/github'; -import { getQueryString } from '../../lib/util/url'; import { readFile, updateFile } from '../utils'; -import type { GithubApiQueryResponse, ItemsEntity } from './github-query-items'; +import { OpenItems, generateFeatureAndBugMarkdown } from './github-query-items'; import { getDisplayName, getNameWithUrl, replaceContent } from './utils'; -const gitHubApiUrl = 'https://api.github.com/search/issues?'; - -if (process.env.GITHUB_TOKEN) { - logger.debug('Using GITHUB_TOKEN from env'); - hostRules.add({ - matchHost: 'api.github.com', - token: process.env.GITHUB_TOKEN, - }); -} - -interface ManagerIssues { - bugs: ItemsEntity[]; - features: ItemsEntity[]; -} - function getTitle(manager: string, displayName: string): string { if (manager === 'regex') { return `Custom Manager Support using Regex`; @@ -35,84 +15,12 @@ function getManagerLink(manager: string): string { return `[\`${manager}\`](${manager}/)`; } -function stringifyIssues(items: ItemsEntity[]): [string, number] { - if (!items) { - return ['', 0]; - } - let list = ''; - for (const item of items) { - list += ` - ${item.title} [#${item.number}](${item.html_url})\n`; - } - return [list, items.length]; -} - -function extractIssues( - managerIssuesMap: Record, - items: ItemsEntity[] -): void { - if (!items || !managerIssuesMap) { - return; - } - for (const item of items) { - const type = item.labels - .find((l) => l.name.startsWith('type:')) - ?.name.split(':')[1]; - if (!type) { - continue; - } - const manager = item.labels - .find((l) => l.name.startsWith('manager:')) - ?.name.split(':')[1]; - if (!manager) { - continue; - } - if (!managerIssuesMap[manager]) { - managerIssuesMap[manager] = { bugs: [], features: [] }; - } - switch (type) { - case 'bug': - managerIssuesMap[manager].bugs.push(item); - break; - case 'feature': - managerIssuesMap[manager].features.push(item); - break; - default: - break; - } - } -} - -export async function getManagersGitHubIssues(): Promise< - Record -> { - const q = `repo:renovatebot/renovate type:issue is:open -label:priority-5-triage`; - const per_page = 100; - const managerIssuesMap: Record = {}; - const githubApi = new GithubHttp('manager-issues'); - try { - const query = getQueryString({ q, per_page }); - const res = await githubApi.getJson( - gitHubApiUrl + query, - { - paginationField: 'items', - paginate: true, - } - ); - const items = res.body?.items ?? []; - extractIssues( - managerIssuesMap, - items.sort((a, b) => a.number - b.number) - ); - } catch (err) { - logger.error({ err }, 'Error getting query results'); - throw err; - } - return managerIssuesMap; -} - -export async function generateManagers(dist: string): Promise { +export async function generateManagers( + dist: string, + managerIssuesMap: OpenItems +): Promise { const managers = getManagers(); - const managerIssuesMap = await getManagersGitHubIssues(); + const allLanguages: Record = {}; for (const [manager, definition] of managers) { const language = definition.language ?? 'other'; @@ -173,30 +81,9 @@ sidebar_label: ${displayName} if (manager !== 'regex') { md += '\n## Additional Information\n\n'; } - md += managerReadmeContent + '\n\n'; - - const [featureList] = stringifyIssues(managerIssuesMap[manager]?.features); - if (featureList) { - md += '## Open feature requests\n\n'; - md += featureList; - md += '\n'; - } + md += managerReadmeContent; - const [bugList] = stringifyIssues(managerIssuesMap[manager]?.bugs); - if (bugList) { - md += '## Open bug reports\n\n'; - md += bugList; - md += '\n'; - } - - if (featureList || bugList) { - const now = DateTime.utc().toFormat('MMMM dd, yyyy'); - const lists = `list of ${featureList ? 'features' : ''}${ - featureList && bugList ? ' and ' : '' - }${bugList ? 'bugs' : ''}`; - md += '\n\n'; - md += `The above ${lists} were current when this page was generated on ${now}.\n`; - } + md += generateFeatureAndBugMarkdown(managerIssuesMap, manager); await updateFile(`${dist}/modules/manager/${manager}/index.md`, md); } diff --git a/tools/docs/platforms.ts b/tools/docs/platforms.ts index e6ac36e1d4d62f..aa83fa273b6bbe 100644 --- a/tools/docs/platforms.ts +++ b/tools/docs/platforms.ts @@ -1,13 +1,20 @@ import { getPlatformList } from '../../lib/modules/platform'; import { readFile, updateFile } from '../utils'; +import { OpenItems, generateFeatureAndBugMarkdown } from './github-query-items'; import { getModuleLink, replaceContent } from './utils'; -export async function generatePlatforms(dist: string): Promise { +export async function generatePlatforms( + dist: string, + platformIssuesMap: OpenItems +): Promise { let platformContent = 'Supported values for `platform` are: '; const platforms = getPlatformList(); for (const platform of platforms) { - const readme = await readFile(`lib/modules/platform/${platform}/index.md`); - await updateFile(`${dist}/modules/platform/${platform}/index.md`, readme); + let md = await readFile(`lib/modules/platform/${platform}/index.md`); + + md += generateFeatureAndBugMarkdown(platformIssuesMap, platform); + + await updateFile(`${dist}/modules/platform/${platform}/index.md`, md); } platformContent += platforms @@ -16,8 +23,7 @@ export async function generatePlatforms(dist: string): Promise { platformContent += '.\n'; - const indexFileName = `docs/usage/modules/platform/index.md`; - let indexContent = await readFile(indexFileName); + let indexContent = await readFile(`docs/usage/modules/platform/index.md`); indexContent = replaceContent(indexContent, platformContent); await updateFile(`${dist}/modules/platform/index.md`, indexContent); } diff --git a/tools/generate-docs.ts b/tools/generate-docs.ts index d4434bf67d2933..f19869daf342b2 100644 --- a/tools/generate-docs.ts +++ b/tools/generate-docs.ts @@ -3,6 +3,7 @@ import shell from 'shelljs'; import { getProblems, logger } from '../lib/logger'; import { generateConfig } from './docs/config'; import { generateDatasources } from './docs/datasources'; +import { getOpenGitHubItems } from './docs/github-query-items'; import { generateManagers } from './docs/manager'; import { generateManagerAsdfSupportedPlugins } from './docs/manager-asdf-supported-plugins'; import { generatePlatforms } from './docs/platforms'; @@ -36,8 +37,11 @@ process.on('unhandledRejection', (err) => { return; } + logger.info('* fetching open GitHub issues'); + const openItems = await getOpenGitHubItems(); + logger.info('* platforms'); - await generatePlatforms(dist); + await generatePlatforms(dist, openItems.platforms); // versionings logger.info('* versionings'); @@ -45,11 +49,11 @@ process.on('unhandledRejection', (err) => { // datasources logger.info('* datasources'); - await generateDatasources(dist); + await generateDatasources(dist, openItems.datasources); // managers logger.info('* managers'); - await generateManagers(dist); + await generateManagers(dist, openItems.managers); // managers/asdf supported plugins logger.info('* managers/asdf/supported-plugins'); diff --git a/tsconfig.json b/tsconfig.json index eae7305558df3b..adfe40a1bf5565 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,7 @@ "strictNullChecks": true, "outDir": "./dist", /* https://github.com/microsoft/TypeScript/wiki/Node-Target-Mapping */ - "target": "es2020", + "target": "es2022", "module": "commonjs", "sourceMap": true, "allowSyntheticDefaultImports": true, @@ -16,7 +16,7 @@ "experimentalDecorators": true, "useUnknownInCatchVariables": false /* we aren't prepared for enabling this by default since ts 4.4*/, "isolatedModules": true /* required for esbuild */, - "lib": ["es2020"], + "lib": ["es2022"], "types": ["node", "jest-extended", "expect-more-jest"], "allowJs": true, "checkJs": true, diff --git a/yarn.lock b/yarn.lock index b7d2be403b33ac..676cfe2fb3be89 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11,13 +11,13 @@ uuid "^8.3.2" "@actions/http-client@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-2.0.1.tgz#873f4ca98fe32f6839462a6f046332677322f99c" - integrity sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-2.1.0.tgz#b6d8c3934727d6a50d10d19f00a711a964599a9f" + integrity sha512-BonhODnXr3amchh4qkmjPMUO8mFi/zLaaCeCAJZqch8iQqyDnVIkySjB38VHAC8IJ+bnlgfOqlhpyCUZHlQsqw== dependencies: tunnel "^0.0.6" -"@ampproject/remapping@^2.1.0": +"@ampproject/remapping@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== @@ -109,12 +109,12 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" -"@aws-sdk/abort-controller@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.254.0.tgz#62dfcbb2e58831b3fb26833227806ee06698f3f6" - integrity sha512-ZBJFCCU7mIXGLk5GFXrSReyUR/kOBju0kzd7nVAAQQlfkmHZEuFhKFFMXkfJZG0SC0ezCbmR/EzIqJ2mTI+pRA== +"@aws-sdk/abort-controller@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.290.0.tgz#c8279257e4be8cd84144e1a16dca52f3371d31cc" + integrity sha512-Q4AqucQnhcsauH6tDf1bSRuOW/Ejwjs1qHPLlvknwX1IoxZettP3lXz9LLd8KZnEMFQLHPmBTbFIW+Ivpzl+vw== dependencies: - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" "@aws-sdk/chunked-blob-reader-native@3.208.0": @@ -132,593 +132,584 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/client-codecommit@3.256.0": - version "3.256.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-codecommit/-/client-codecommit-3.256.0.tgz#bc57f4394ac975d338336e5697573ddcbe86216f" - integrity sha512-ENtJGttlcF+G90gaL8YxkAPpZJUbateBDxbjq4liTFcj2yg8AIZhkkXKplVIDyoi9ff02wxwb9CsHYfa+gOOfw== +"@aws-sdk/client-codecommit@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-codecommit/-/client-codecommit-3.290.0.tgz#5a87dc72b7c262db132f057907c959683cd5cac4" + integrity sha512-FRsCC5yAtXofxrJUtuKR67Ozd7yHTTKy47eaCCBotuQ3eIA5ATuArPFRFpySMQGRmC0/kOjY/WL3ZChKHZFgKA== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.256.0" - "@aws-sdk/config-resolver" "3.254.0" - "@aws-sdk/credential-provider-node" "3.256.0" - "@aws-sdk/fetch-http-handler" "3.254.0" - "@aws-sdk/hash-node" "3.254.0" - "@aws-sdk/invalid-dependency" "3.254.0" - "@aws-sdk/middleware-content-length" "3.254.0" - "@aws-sdk/middleware-endpoint" "3.254.0" - "@aws-sdk/middleware-host-header" "3.254.0" - "@aws-sdk/middleware-logger" "3.254.0" - "@aws-sdk/middleware-recursion-detection" "3.254.0" - "@aws-sdk/middleware-retry" "3.254.0" - "@aws-sdk/middleware-serde" "3.254.0" - "@aws-sdk/middleware-signing" "3.254.0" - "@aws-sdk/middleware-stack" "3.254.0" - "@aws-sdk/middleware-user-agent" "3.254.0" - "@aws-sdk/node-config-provider" "3.254.0" - "@aws-sdk/node-http-handler" "3.254.0" - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/smithy-client" "3.254.0" - "@aws-sdk/types" "3.254.0" - "@aws-sdk/url-parser" "3.254.0" + "@aws-sdk/client-sts" "3.290.0" + "@aws-sdk/config-resolver" "3.290.0" + "@aws-sdk/credential-provider-node" "3.290.0" + "@aws-sdk/fetch-http-handler" "3.290.0" + "@aws-sdk/hash-node" "3.290.0" + "@aws-sdk/invalid-dependency" "3.290.0" + "@aws-sdk/middleware-content-length" "3.290.0" + "@aws-sdk/middleware-endpoint" "3.290.0" + "@aws-sdk/middleware-host-header" "3.290.0" + "@aws-sdk/middleware-logger" "3.290.0" + "@aws-sdk/middleware-recursion-detection" "3.290.0" + "@aws-sdk/middleware-retry" "3.290.0" + "@aws-sdk/middleware-serde" "3.290.0" + "@aws-sdk/middleware-signing" "3.290.0" + "@aws-sdk/middleware-stack" "3.290.0" + "@aws-sdk/middleware-user-agent" "3.290.0" + "@aws-sdk/node-config-provider" "3.290.0" + "@aws-sdk/node-http-handler" "3.290.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/smithy-client" "3.290.0" + "@aws-sdk/types" "3.290.0" + "@aws-sdk/url-parser" "3.290.0" "@aws-sdk/util-base64" "3.208.0" "@aws-sdk/util-body-length-browser" "3.188.0" "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.254.0" - "@aws-sdk/util-defaults-mode-node" "3.254.0" - "@aws-sdk/util-endpoints" "3.254.0" - "@aws-sdk/util-retry" "3.254.0" - "@aws-sdk/util-user-agent-browser" "3.254.0" - "@aws-sdk/util-user-agent-node" "3.254.0" - "@aws-sdk/util-utf8-browser" "3.188.0" - "@aws-sdk/util-utf8-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.290.0" + "@aws-sdk/util-defaults-mode-node" "3.290.0" + "@aws-sdk/util-endpoints" "3.290.0" + "@aws-sdk/util-retry" "3.290.0" + "@aws-sdk/util-user-agent-browser" "3.290.0" + "@aws-sdk/util-user-agent-node" "3.290.0" + "@aws-sdk/util-utf8" "3.254.0" tslib "^2.3.1" uuid "^8.3.2" -"@aws-sdk/client-ec2@3.256.0": - version "3.256.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-ec2/-/client-ec2-3.256.0.tgz#397b58e9eff7bfdbb61848f5fc1d6326d84c9970" - integrity sha512-XRwxeYVQtXe121VYkCyNEQ2e4lgQNcf64qHK03pynHhCP0QSGfAVIpTjGWflA0AbeabgWKztrRWZM/bqlo2jvA== +"@aws-sdk/client-ec2@3.291.0": + version "3.291.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-ec2/-/client-ec2-3.291.0.tgz#1bedbf384a8eb76a2ed2b9fa56047dd8c0079bff" + integrity sha512-nVw92++iwDB5RzBe7hCK+HiY/4hHFBd/tXBJlSg7rD6TGHyskv3Qn+n2ikpxPVSRYJgnZr/g9JYYQzm3r6RFxQ== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.256.0" - "@aws-sdk/config-resolver" "3.254.0" - "@aws-sdk/credential-provider-node" "3.256.0" - "@aws-sdk/fetch-http-handler" "3.254.0" - "@aws-sdk/hash-node" "3.254.0" - "@aws-sdk/invalid-dependency" "3.254.0" - "@aws-sdk/middleware-content-length" "3.254.0" - "@aws-sdk/middleware-endpoint" "3.254.0" - "@aws-sdk/middleware-host-header" "3.254.0" - "@aws-sdk/middleware-logger" "3.254.0" - "@aws-sdk/middleware-recursion-detection" "3.254.0" - "@aws-sdk/middleware-retry" "3.254.0" - "@aws-sdk/middleware-sdk-ec2" "3.254.0" - "@aws-sdk/middleware-serde" "3.254.0" - "@aws-sdk/middleware-signing" "3.254.0" - "@aws-sdk/middleware-stack" "3.254.0" - "@aws-sdk/middleware-user-agent" "3.254.0" - "@aws-sdk/node-config-provider" "3.254.0" - "@aws-sdk/node-http-handler" "3.254.0" - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/smithy-client" "3.254.0" - "@aws-sdk/types" "3.254.0" - "@aws-sdk/url-parser" "3.254.0" + "@aws-sdk/client-sts" "3.290.0" + "@aws-sdk/config-resolver" "3.290.0" + "@aws-sdk/credential-provider-node" "3.290.0" + "@aws-sdk/fetch-http-handler" "3.290.0" + "@aws-sdk/hash-node" "3.290.0" + "@aws-sdk/invalid-dependency" "3.290.0" + "@aws-sdk/middleware-content-length" "3.290.0" + "@aws-sdk/middleware-endpoint" "3.290.0" + "@aws-sdk/middleware-host-header" "3.290.0" + "@aws-sdk/middleware-logger" "3.290.0" + "@aws-sdk/middleware-recursion-detection" "3.290.0" + "@aws-sdk/middleware-retry" "3.290.0" + "@aws-sdk/middleware-sdk-ec2" "3.291.0" + "@aws-sdk/middleware-serde" "3.290.0" + "@aws-sdk/middleware-signing" "3.290.0" + "@aws-sdk/middleware-stack" "3.290.0" + "@aws-sdk/middleware-user-agent" "3.290.0" + "@aws-sdk/node-config-provider" "3.290.0" + "@aws-sdk/node-http-handler" "3.290.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/smithy-client" "3.290.0" + "@aws-sdk/types" "3.290.0" + "@aws-sdk/url-parser" "3.290.0" "@aws-sdk/util-base64" "3.208.0" "@aws-sdk/util-body-length-browser" "3.188.0" "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.254.0" - "@aws-sdk/util-defaults-mode-node" "3.254.0" - "@aws-sdk/util-endpoints" "3.254.0" - "@aws-sdk/util-retry" "3.254.0" - "@aws-sdk/util-user-agent-browser" "3.254.0" - "@aws-sdk/util-user-agent-node" "3.254.0" - "@aws-sdk/util-utf8-browser" "3.188.0" - "@aws-sdk/util-utf8-node" "3.208.0" - "@aws-sdk/util-waiter" "3.254.0" - fast-xml-parser "4.0.11" + "@aws-sdk/util-defaults-mode-browser" "3.290.0" + "@aws-sdk/util-defaults-mode-node" "3.290.0" + "@aws-sdk/util-endpoints" "3.290.0" + "@aws-sdk/util-retry" "3.290.0" + "@aws-sdk/util-user-agent-browser" "3.290.0" + "@aws-sdk/util-user-agent-node" "3.290.0" + "@aws-sdk/util-utf8" "3.254.0" + "@aws-sdk/util-waiter" "3.290.0" + fast-xml-parser "4.1.2" tslib "^2.3.1" uuid "^8.3.2" -"@aws-sdk/client-ecr@3.256.0": - version "3.256.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-ecr/-/client-ecr-3.256.0.tgz#f1ab2f83254e954ac250ac3216bb1c0fafbf0ae6" - integrity sha512-12LIhUGfD+9M+oL5RSdq3ZCuHw8qI4Z66VNidQP0f0ATr52d80c2qARPvo7Bh6QR0GRBeiDygm8BIuJE/v2QhQ== +"@aws-sdk/client-ecr@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-ecr/-/client-ecr-3.290.0.tgz#7998247388e93305ef7d91e6cb1e2411d3e729a8" + integrity sha512-GQXKV0QGi2KbhrxU9soXBMqfTmjMdsog2/yf19u7LXKR91Xhq5KNyz6WlavZy+lE5nPa1yartczB+2pZMildhQ== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.256.0" - "@aws-sdk/config-resolver" "3.254.0" - "@aws-sdk/credential-provider-node" "3.256.0" - "@aws-sdk/fetch-http-handler" "3.254.0" - "@aws-sdk/hash-node" "3.254.0" - "@aws-sdk/invalid-dependency" "3.254.0" - "@aws-sdk/middleware-content-length" "3.254.0" - "@aws-sdk/middleware-endpoint" "3.254.0" - "@aws-sdk/middleware-host-header" "3.254.0" - "@aws-sdk/middleware-logger" "3.254.0" - "@aws-sdk/middleware-recursion-detection" "3.254.0" - "@aws-sdk/middleware-retry" "3.254.0" - "@aws-sdk/middleware-serde" "3.254.0" - "@aws-sdk/middleware-signing" "3.254.0" - "@aws-sdk/middleware-stack" "3.254.0" - "@aws-sdk/middleware-user-agent" "3.254.0" - "@aws-sdk/node-config-provider" "3.254.0" - "@aws-sdk/node-http-handler" "3.254.0" - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/smithy-client" "3.254.0" - "@aws-sdk/types" "3.254.0" - "@aws-sdk/url-parser" "3.254.0" + "@aws-sdk/client-sts" "3.290.0" + "@aws-sdk/config-resolver" "3.290.0" + "@aws-sdk/credential-provider-node" "3.290.0" + "@aws-sdk/fetch-http-handler" "3.290.0" + "@aws-sdk/hash-node" "3.290.0" + "@aws-sdk/invalid-dependency" "3.290.0" + "@aws-sdk/middleware-content-length" "3.290.0" + "@aws-sdk/middleware-endpoint" "3.290.0" + "@aws-sdk/middleware-host-header" "3.290.0" + "@aws-sdk/middleware-logger" "3.290.0" + "@aws-sdk/middleware-recursion-detection" "3.290.0" + "@aws-sdk/middleware-retry" "3.290.0" + "@aws-sdk/middleware-serde" "3.290.0" + "@aws-sdk/middleware-signing" "3.290.0" + "@aws-sdk/middleware-stack" "3.290.0" + "@aws-sdk/middleware-user-agent" "3.290.0" + "@aws-sdk/node-config-provider" "3.290.0" + "@aws-sdk/node-http-handler" "3.290.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/smithy-client" "3.290.0" + "@aws-sdk/types" "3.290.0" + "@aws-sdk/url-parser" "3.290.0" "@aws-sdk/util-base64" "3.208.0" "@aws-sdk/util-body-length-browser" "3.188.0" "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.254.0" - "@aws-sdk/util-defaults-mode-node" "3.254.0" - "@aws-sdk/util-endpoints" "3.254.0" - "@aws-sdk/util-retry" "3.254.0" - "@aws-sdk/util-user-agent-browser" "3.254.0" - "@aws-sdk/util-user-agent-node" "3.254.0" - "@aws-sdk/util-utf8-browser" "3.188.0" - "@aws-sdk/util-utf8-node" "3.208.0" - "@aws-sdk/util-waiter" "3.254.0" + "@aws-sdk/util-defaults-mode-browser" "3.290.0" + "@aws-sdk/util-defaults-mode-node" "3.290.0" + "@aws-sdk/util-endpoints" "3.290.0" + "@aws-sdk/util-retry" "3.290.0" + "@aws-sdk/util-user-agent-browser" "3.290.0" + "@aws-sdk/util-user-agent-node" "3.290.0" + "@aws-sdk/util-utf8" "3.254.0" + "@aws-sdk/util-waiter" "3.290.0" tslib "^2.3.1" -"@aws-sdk/client-iam@3.256.0": - version "3.256.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-iam/-/client-iam-3.256.0.tgz#d7cb5fed443d273a4003f2f13d03af4a0ee639eb" - integrity sha512-9NMLpF15O+k8EA96Yon6cIik+3IqZ0LQEDVp8ad/bP3kWAgExCiu7nI50a/55RZ3rA7+wn1ZcGnHA0W3unbKng== +"@aws-sdk/client-iam@3.291.0": + version "3.291.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-iam/-/client-iam-3.291.0.tgz#e3673e2ff9a3ef114bfd561cb3b07b842d590276" + integrity sha512-NbQbigFSQLzdx/8vz0FqMh7QVPH4UnzrGTxHKJxgRlasjPVs6hq2jrBr/ym3vtsYUHEEazbdRzTkXaj/uwOyeA== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.256.0" - "@aws-sdk/config-resolver" "3.254.0" - "@aws-sdk/credential-provider-node" "3.256.0" - "@aws-sdk/fetch-http-handler" "3.254.0" - "@aws-sdk/hash-node" "3.254.0" - "@aws-sdk/invalid-dependency" "3.254.0" - "@aws-sdk/middleware-content-length" "3.254.0" - "@aws-sdk/middleware-endpoint" "3.254.0" - "@aws-sdk/middleware-host-header" "3.254.0" - "@aws-sdk/middleware-logger" "3.254.0" - "@aws-sdk/middleware-recursion-detection" "3.254.0" - "@aws-sdk/middleware-retry" "3.254.0" - "@aws-sdk/middleware-serde" "3.254.0" - "@aws-sdk/middleware-signing" "3.254.0" - "@aws-sdk/middleware-stack" "3.254.0" - "@aws-sdk/middleware-user-agent" "3.254.0" - "@aws-sdk/node-config-provider" "3.254.0" - "@aws-sdk/node-http-handler" "3.254.0" - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/smithy-client" "3.254.0" - "@aws-sdk/types" "3.254.0" - "@aws-sdk/url-parser" "3.254.0" + "@aws-sdk/client-sts" "3.290.0" + "@aws-sdk/config-resolver" "3.290.0" + "@aws-sdk/credential-provider-node" "3.290.0" + "@aws-sdk/fetch-http-handler" "3.290.0" + "@aws-sdk/hash-node" "3.290.0" + "@aws-sdk/invalid-dependency" "3.290.0" + "@aws-sdk/middleware-content-length" "3.290.0" + "@aws-sdk/middleware-endpoint" "3.290.0" + "@aws-sdk/middleware-host-header" "3.290.0" + "@aws-sdk/middleware-logger" "3.290.0" + "@aws-sdk/middleware-recursion-detection" "3.290.0" + "@aws-sdk/middleware-retry" "3.290.0" + "@aws-sdk/middleware-serde" "3.290.0" + "@aws-sdk/middleware-signing" "3.290.0" + "@aws-sdk/middleware-stack" "3.290.0" + "@aws-sdk/middleware-user-agent" "3.290.0" + "@aws-sdk/node-config-provider" "3.290.0" + "@aws-sdk/node-http-handler" "3.290.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/smithy-client" "3.290.0" + "@aws-sdk/types" "3.290.0" + "@aws-sdk/url-parser" "3.290.0" "@aws-sdk/util-base64" "3.208.0" "@aws-sdk/util-body-length-browser" "3.188.0" "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.254.0" - "@aws-sdk/util-defaults-mode-node" "3.254.0" - "@aws-sdk/util-endpoints" "3.254.0" - "@aws-sdk/util-retry" "3.254.0" - "@aws-sdk/util-user-agent-browser" "3.254.0" - "@aws-sdk/util-user-agent-node" "3.254.0" - "@aws-sdk/util-utf8-browser" "3.188.0" - "@aws-sdk/util-utf8-node" "3.208.0" - "@aws-sdk/util-waiter" "3.254.0" - fast-xml-parser "4.0.11" + "@aws-sdk/util-defaults-mode-browser" "3.290.0" + "@aws-sdk/util-defaults-mode-node" "3.290.0" + "@aws-sdk/util-endpoints" "3.290.0" + "@aws-sdk/util-retry" "3.290.0" + "@aws-sdk/util-user-agent-browser" "3.290.0" + "@aws-sdk/util-user-agent-node" "3.290.0" + "@aws-sdk/util-utf8" "3.254.0" + "@aws-sdk/util-waiter" "3.290.0" + fast-xml-parser "4.1.2" tslib "^2.3.1" -"@aws-sdk/client-rds@3.256.0": - version "3.256.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-rds/-/client-rds-3.256.0.tgz#d9ce54f62c122a88459f76f4cf1f55b55103a648" - integrity sha512-+ODx1AMHnshteDGzJHlggyLsuN/ZkyqhvCj/gb1a2HQ84bo3juL/90NgCAleqkTzKVEpWJZnCtLwySkymbFBqQ== +"@aws-sdk/client-rds@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-rds/-/client-rds-3.290.0.tgz#9d10c160a366c3e7e762dbd6df3184df89525d72" + integrity sha512-oysKCy3e5b/U4EdohVRbgUEYeHjQggg/KjSauSnuGAHohs5Dz07FxgltkhzpVJEDmaQvjIzrrm+chI4LIgZCGQ== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.256.0" - "@aws-sdk/config-resolver" "3.254.0" - "@aws-sdk/credential-provider-node" "3.256.0" - "@aws-sdk/fetch-http-handler" "3.254.0" - "@aws-sdk/hash-node" "3.254.0" - "@aws-sdk/invalid-dependency" "3.254.0" - "@aws-sdk/middleware-content-length" "3.254.0" - "@aws-sdk/middleware-endpoint" "3.254.0" - "@aws-sdk/middleware-host-header" "3.254.0" - "@aws-sdk/middleware-logger" "3.254.0" - "@aws-sdk/middleware-recursion-detection" "3.254.0" - "@aws-sdk/middleware-retry" "3.254.0" - "@aws-sdk/middleware-sdk-rds" "3.254.0" - "@aws-sdk/middleware-serde" "3.254.0" - "@aws-sdk/middleware-signing" "3.254.0" - "@aws-sdk/middleware-stack" "3.254.0" - "@aws-sdk/middleware-user-agent" "3.254.0" - "@aws-sdk/node-config-provider" "3.254.0" - "@aws-sdk/node-http-handler" "3.254.0" - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/smithy-client" "3.254.0" - "@aws-sdk/types" "3.254.0" - "@aws-sdk/url-parser" "3.254.0" + "@aws-sdk/client-sts" "3.290.0" + "@aws-sdk/config-resolver" "3.290.0" + "@aws-sdk/credential-provider-node" "3.290.0" + "@aws-sdk/fetch-http-handler" "3.290.0" + "@aws-sdk/hash-node" "3.290.0" + "@aws-sdk/invalid-dependency" "3.290.0" + "@aws-sdk/middleware-content-length" "3.290.0" + "@aws-sdk/middleware-endpoint" "3.290.0" + "@aws-sdk/middleware-host-header" "3.290.0" + "@aws-sdk/middleware-logger" "3.290.0" + "@aws-sdk/middleware-recursion-detection" "3.290.0" + "@aws-sdk/middleware-retry" "3.290.0" + "@aws-sdk/middleware-sdk-rds" "3.290.0" + "@aws-sdk/middleware-serde" "3.290.0" + "@aws-sdk/middleware-signing" "3.290.0" + "@aws-sdk/middleware-stack" "3.290.0" + "@aws-sdk/middleware-user-agent" "3.290.0" + "@aws-sdk/node-config-provider" "3.290.0" + "@aws-sdk/node-http-handler" "3.290.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/smithy-client" "3.290.0" + "@aws-sdk/types" "3.290.0" + "@aws-sdk/url-parser" "3.290.0" "@aws-sdk/util-base64" "3.208.0" "@aws-sdk/util-body-length-browser" "3.188.0" "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.254.0" - "@aws-sdk/util-defaults-mode-node" "3.254.0" - "@aws-sdk/util-endpoints" "3.254.0" - "@aws-sdk/util-retry" "3.254.0" - "@aws-sdk/util-user-agent-browser" "3.254.0" - "@aws-sdk/util-user-agent-node" "3.254.0" - "@aws-sdk/util-utf8-browser" "3.188.0" - "@aws-sdk/util-utf8-node" "3.208.0" - "@aws-sdk/util-waiter" "3.254.0" - fast-xml-parser "4.0.11" + "@aws-sdk/util-defaults-mode-browser" "3.290.0" + "@aws-sdk/util-defaults-mode-node" "3.290.0" + "@aws-sdk/util-endpoints" "3.290.0" + "@aws-sdk/util-retry" "3.290.0" + "@aws-sdk/util-user-agent-browser" "3.290.0" + "@aws-sdk/util-user-agent-node" "3.290.0" + "@aws-sdk/util-utf8" "3.254.0" + "@aws-sdk/util-waiter" "3.290.0" + fast-xml-parser "4.1.2" tslib "^2.3.1" -"@aws-sdk/client-s3@3.256.0": - version "3.256.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.256.0.tgz#9a9aa77f13a54f6e1da67d4cba3d0e2552e59c82" - integrity sha512-9SpZGe+PVLvIbn6VFthjl9OxIqYJCiesUDwcMYz2CdF1mVVKnyyrW52zooH6wz1u7tbJCwr5Vdjn9IhJpu6PcQ== +"@aws-sdk/client-s3@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.290.0.tgz#c887859ae8b275b3e6cef0f1263ef833268e38c8" + integrity sha512-3QVUyE5rvvM1Td9/5DS9iEZMXQsbqOuV1CMskDgD1/6Iav3OeGsBzDswifova5Tn6gRtDRxmNOZG1UH//7QZMw== dependencies: "@aws-crypto/sha1-browser" "3.0.0" "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.256.0" - "@aws-sdk/config-resolver" "3.254.0" - "@aws-sdk/credential-provider-node" "3.256.0" - "@aws-sdk/eventstream-serde-browser" "3.254.0" - "@aws-sdk/eventstream-serde-config-resolver" "3.254.0" - "@aws-sdk/eventstream-serde-node" "3.254.0" - "@aws-sdk/fetch-http-handler" "3.254.0" - "@aws-sdk/hash-blob-browser" "3.254.0" - "@aws-sdk/hash-node" "3.254.0" - "@aws-sdk/hash-stream-node" "3.254.0" - "@aws-sdk/invalid-dependency" "3.254.0" - "@aws-sdk/md5-js" "3.254.0" - "@aws-sdk/middleware-bucket-endpoint" "3.254.0" - "@aws-sdk/middleware-content-length" "3.254.0" - "@aws-sdk/middleware-endpoint" "3.254.0" - "@aws-sdk/middleware-expect-continue" "3.254.0" - "@aws-sdk/middleware-flexible-checksums" "3.254.0" - "@aws-sdk/middleware-host-header" "3.254.0" - "@aws-sdk/middleware-location-constraint" "3.254.0" - "@aws-sdk/middleware-logger" "3.254.0" - "@aws-sdk/middleware-recursion-detection" "3.254.0" - "@aws-sdk/middleware-retry" "3.254.0" - "@aws-sdk/middleware-sdk-s3" "3.254.0" - "@aws-sdk/middleware-serde" "3.254.0" - "@aws-sdk/middleware-signing" "3.254.0" - "@aws-sdk/middleware-ssec" "3.254.0" - "@aws-sdk/middleware-stack" "3.254.0" - "@aws-sdk/middleware-user-agent" "3.254.0" - "@aws-sdk/node-config-provider" "3.254.0" - "@aws-sdk/node-http-handler" "3.254.0" - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/signature-v4-multi-region" "3.254.0" - "@aws-sdk/smithy-client" "3.254.0" - "@aws-sdk/types" "3.254.0" - "@aws-sdk/url-parser" "3.254.0" + "@aws-sdk/client-sts" "3.290.0" + "@aws-sdk/config-resolver" "3.290.0" + "@aws-sdk/credential-provider-node" "3.290.0" + "@aws-sdk/eventstream-serde-browser" "3.290.0" + "@aws-sdk/eventstream-serde-config-resolver" "3.290.0" + "@aws-sdk/eventstream-serde-node" "3.290.0" + "@aws-sdk/fetch-http-handler" "3.290.0" + "@aws-sdk/hash-blob-browser" "3.290.0" + "@aws-sdk/hash-node" "3.290.0" + "@aws-sdk/hash-stream-node" "3.290.0" + "@aws-sdk/invalid-dependency" "3.290.0" + "@aws-sdk/md5-js" "3.290.0" + "@aws-sdk/middleware-bucket-endpoint" "3.290.0" + "@aws-sdk/middleware-content-length" "3.290.0" + "@aws-sdk/middleware-endpoint" "3.290.0" + "@aws-sdk/middleware-expect-continue" "3.290.0" + "@aws-sdk/middleware-flexible-checksums" "3.290.0" + "@aws-sdk/middleware-host-header" "3.290.0" + "@aws-sdk/middleware-location-constraint" "3.290.0" + "@aws-sdk/middleware-logger" "3.290.0" + "@aws-sdk/middleware-recursion-detection" "3.290.0" + "@aws-sdk/middleware-retry" "3.290.0" + "@aws-sdk/middleware-sdk-s3" "3.290.0" + "@aws-sdk/middleware-serde" "3.290.0" + "@aws-sdk/middleware-signing" "3.290.0" + "@aws-sdk/middleware-ssec" "3.290.0" + "@aws-sdk/middleware-stack" "3.290.0" + "@aws-sdk/middleware-user-agent" "3.290.0" + "@aws-sdk/node-config-provider" "3.290.0" + "@aws-sdk/node-http-handler" "3.290.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/signature-v4-multi-region" "3.290.0" + "@aws-sdk/smithy-client" "3.290.0" + "@aws-sdk/types" "3.290.0" + "@aws-sdk/url-parser" "3.290.0" "@aws-sdk/util-base64" "3.208.0" "@aws-sdk/util-body-length-browser" "3.188.0" "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.254.0" - "@aws-sdk/util-defaults-mode-node" "3.254.0" - "@aws-sdk/util-endpoints" "3.254.0" - "@aws-sdk/util-retry" "3.254.0" - "@aws-sdk/util-stream-browser" "3.254.0" - "@aws-sdk/util-stream-node" "3.254.0" - "@aws-sdk/util-user-agent-browser" "3.254.0" - "@aws-sdk/util-user-agent-node" "3.254.0" - "@aws-sdk/util-utf8-browser" "3.188.0" - "@aws-sdk/util-utf8-node" "3.208.0" - "@aws-sdk/util-waiter" "3.254.0" + "@aws-sdk/util-defaults-mode-browser" "3.290.0" + "@aws-sdk/util-defaults-mode-node" "3.290.0" + "@aws-sdk/util-endpoints" "3.290.0" + "@aws-sdk/util-retry" "3.290.0" + "@aws-sdk/util-stream-browser" "3.290.0" + "@aws-sdk/util-stream-node" "3.290.0" + "@aws-sdk/util-user-agent-browser" "3.290.0" + "@aws-sdk/util-user-agent-node" "3.290.0" + "@aws-sdk/util-utf8" "3.254.0" + "@aws-sdk/util-waiter" "3.290.0" "@aws-sdk/xml-builder" "3.201.0" - fast-xml-parser "4.0.11" + fast-xml-parser "4.1.2" tslib "^2.3.1" -"@aws-sdk/client-sso-oidc@3.256.0": - version "3.256.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.256.0.tgz#c71f29df3fb1cd152208575bd7f3ee102211bebf" - integrity sha512-HR57pMdL5zGpxHnKYx1HjgnbVYlhTDZwyBS7k9JfiEDwPnGH8y169aNgVs+iaX0rIRlv6AyVstjqjZXGxODS4w== +"@aws-sdk/client-sso-oidc@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.290.0.tgz#99e8fb91d30cea91f11f193c5953c395b42af4eb" + integrity sha512-/+OSYCjyf2TjA57beWLBjG05yPwWlpqK4gO3GwpVqfygaRh6g5jS0CBVQs+z+xc7gmI0weC/nhc+BXR9qcJJAA== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/config-resolver" "3.254.0" - "@aws-sdk/fetch-http-handler" "3.254.0" - "@aws-sdk/hash-node" "3.254.0" - "@aws-sdk/invalid-dependency" "3.254.0" - "@aws-sdk/middleware-content-length" "3.254.0" - "@aws-sdk/middleware-endpoint" "3.254.0" - "@aws-sdk/middleware-host-header" "3.254.0" - "@aws-sdk/middleware-logger" "3.254.0" - "@aws-sdk/middleware-recursion-detection" "3.254.0" - "@aws-sdk/middleware-retry" "3.254.0" - "@aws-sdk/middleware-serde" "3.254.0" - "@aws-sdk/middleware-stack" "3.254.0" - "@aws-sdk/middleware-user-agent" "3.254.0" - "@aws-sdk/node-config-provider" "3.254.0" - "@aws-sdk/node-http-handler" "3.254.0" - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/smithy-client" "3.254.0" - "@aws-sdk/types" "3.254.0" - "@aws-sdk/url-parser" "3.254.0" + "@aws-sdk/config-resolver" "3.290.0" + "@aws-sdk/fetch-http-handler" "3.290.0" + "@aws-sdk/hash-node" "3.290.0" + "@aws-sdk/invalid-dependency" "3.290.0" + "@aws-sdk/middleware-content-length" "3.290.0" + "@aws-sdk/middleware-endpoint" "3.290.0" + "@aws-sdk/middleware-host-header" "3.290.0" + "@aws-sdk/middleware-logger" "3.290.0" + "@aws-sdk/middleware-recursion-detection" "3.290.0" + "@aws-sdk/middleware-retry" "3.290.0" + "@aws-sdk/middleware-serde" "3.290.0" + "@aws-sdk/middleware-stack" "3.290.0" + "@aws-sdk/middleware-user-agent" "3.290.0" + "@aws-sdk/node-config-provider" "3.290.0" + "@aws-sdk/node-http-handler" "3.290.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/smithy-client" "3.290.0" + "@aws-sdk/types" "3.290.0" + "@aws-sdk/url-parser" "3.290.0" "@aws-sdk/util-base64" "3.208.0" "@aws-sdk/util-body-length-browser" "3.188.0" "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.254.0" - "@aws-sdk/util-defaults-mode-node" "3.254.0" - "@aws-sdk/util-endpoints" "3.254.0" - "@aws-sdk/util-retry" "3.254.0" - "@aws-sdk/util-user-agent-browser" "3.254.0" - "@aws-sdk/util-user-agent-node" "3.254.0" - "@aws-sdk/util-utf8-browser" "3.188.0" - "@aws-sdk/util-utf8-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.290.0" + "@aws-sdk/util-defaults-mode-node" "3.290.0" + "@aws-sdk/util-endpoints" "3.290.0" + "@aws-sdk/util-retry" "3.290.0" + "@aws-sdk/util-user-agent-browser" "3.290.0" + "@aws-sdk/util-user-agent-node" "3.290.0" + "@aws-sdk/util-utf8" "3.254.0" tslib "^2.3.1" -"@aws-sdk/client-sso@3.256.0": - version "3.256.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.256.0.tgz#8dfd3e69e0eae9937f1b7cee0d95dca7995ad867" - integrity sha512-e+BNJ95IqUU1nmmX51T3ehy8yqHDN8J4DH6FReK1vrFIMEra/wERGJBcm+pdojyllQ20FQRBvGtOzN/WspH74w== +"@aws-sdk/client-sso@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.290.0.tgz#59e4b1cb9644fd98cf0d428dd34b23bb91ca4037" + integrity sha512-FUFAbptuJSRKnzBgFJqXxusSG7PzECSqX0FnMh2vxCVu2PifaAE4stiMW8Myj8ABQAbfIrAWM+17upcrfmudoA== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/config-resolver" "3.254.0" - "@aws-sdk/fetch-http-handler" "3.254.0" - "@aws-sdk/hash-node" "3.254.0" - "@aws-sdk/invalid-dependency" "3.254.0" - "@aws-sdk/middleware-content-length" "3.254.0" - "@aws-sdk/middleware-endpoint" "3.254.0" - "@aws-sdk/middleware-host-header" "3.254.0" - "@aws-sdk/middleware-logger" "3.254.0" - "@aws-sdk/middleware-recursion-detection" "3.254.0" - "@aws-sdk/middleware-retry" "3.254.0" - "@aws-sdk/middleware-serde" "3.254.0" - "@aws-sdk/middleware-stack" "3.254.0" - "@aws-sdk/middleware-user-agent" "3.254.0" - "@aws-sdk/node-config-provider" "3.254.0" - "@aws-sdk/node-http-handler" "3.254.0" - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/smithy-client" "3.254.0" - "@aws-sdk/types" "3.254.0" - "@aws-sdk/url-parser" "3.254.0" + "@aws-sdk/config-resolver" "3.290.0" + "@aws-sdk/fetch-http-handler" "3.290.0" + "@aws-sdk/hash-node" "3.290.0" + "@aws-sdk/invalid-dependency" "3.290.0" + "@aws-sdk/middleware-content-length" "3.290.0" + "@aws-sdk/middleware-endpoint" "3.290.0" + "@aws-sdk/middleware-host-header" "3.290.0" + "@aws-sdk/middleware-logger" "3.290.0" + "@aws-sdk/middleware-recursion-detection" "3.290.0" + "@aws-sdk/middleware-retry" "3.290.0" + "@aws-sdk/middleware-serde" "3.290.0" + "@aws-sdk/middleware-stack" "3.290.0" + "@aws-sdk/middleware-user-agent" "3.290.0" + "@aws-sdk/node-config-provider" "3.290.0" + "@aws-sdk/node-http-handler" "3.290.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/smithy-client" "3.290.0" + "@aws-sdk/types" "3.290.0" + "@aws-sdk/url-parser" "3.290.0" "@aws-sdk/util-base64" "3.208.0" "@aws-sdk/util-body-length-browser" "3.188.0" "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.254.0" - "@aws-sdk/util-defaults-mode-node" "3.254.0" - "@aws-sdk/util-endpoints" "3.254.0" - "@aws-sdk/util-retry" "3.254.0" - "@aws-sdk/util-user-agent-browser" "3.254.0" - "@aws-sdk/util-user-agent-node" "3.254.0" - "@aws-sdk/util-utf8-browser" "3.188.0" - "@aws-sdk/util-utf8-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.290.0" + "@aws-sdk/util-defaults-mode-node" "3.290.0" + "@aws-sdk/util-endpoints" "3.290.0" + "@aws-sdk/util-retry" "3.290.0" + "@aws-sdk/util-user-agent-browser" "3.290.0" + "@aws-sdk/util-user-agent-node" "3.290.0" + "@aws-sdk/util-utf8" "3.254.0" tslib "^2.3.1" -"@aws-sdk/client-sts@3.256.0": - version "3.256.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.256.0.tgz#c71610393736b63c58c4cdc1caec302508fe8fc8" - integrity sha512-6jqaM7/Lw41kuEz8CqLU+fOLDF8C6W+jG30zBQrAC+iYSTB0w9uGOzVxsan1Nesg1FpoBqnWcF7xWi6Ox+OeDg== +"@aws-sdk/client-sts@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.290.0.tgz#ed5f88379e2c3740b095d8e3a9ce13b806a244f7" + integrity sha512-E2X/7tZLziKLgi/owYoUL5gcorGJrbM2tANJdJmaqVUPhPvoY4wU8P91pGPKon9nQj0RQexre5ClZawYD6lTzA== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/config-resolver" "3.254.0" - "@aws-sdk/credential-provider-node" "3.256.0" - "@aws-sdk/fetch-http-handler" "3.254.0" - "@aws-sdk/hash-node" "3.254.0" - "@aws-sdk/invalid-dependency" "3.254.0" - "@aws-sdk/middleware-content-length" "3.254.0" - "@aws-sdk/middleware-endpoint" "3.254.0" - "@aws-sdk/middleware-host-header" "3.254.0" - "@aws-sdk/middleware-logger" "3.254.0" - "@aws-sdk/middleware-recursion-detection" "3.254.0" - "@aws-sdk/middleware-retry" "3.254.0" - "@aws-sdk/middleware-sdk-sts" "3.254.0" - "@aws-sdk/middleware-serde" "3.254.0" - "@aws-sdk/middleware-signing" "3.254.0" - "@aws-sdk/middleware-stack" "3.254.0" - "@aws-sdk/middleware-user-agent" "3.254.0" - "@aws-sdk/node-config-provider" "3.254.0" - "@aws-sdk/node-http-handler" "3.254.0" - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/smithy-client" "3.254.0" - "@aws-sdk/types" "3.254.0" - "@aws-sdk/url-parser" "3.254.0" + "@aws-sdk/config-resolver" "3.290.0" + "@aws-sdk/credential-provider-node" "3.290.0" + "@aws-sdk/fetch-http-handler" "3.290.0" + "@aws-sdk/hash-node" "3.290.0" + "@aws-sdk/invalid-dependency" "3.290.0" + "@aws-sdk/middleware-content-length" "3.290.0" + "@aws-sdk/middleware-endpoint" "3.290.0" + "@aws-sdk/middleware-host-header" "3.290.0" + "@aws-sdk/middleware-logger" "3.290.0" + "@aws-sdk/middleware-recursion-detection" "3.290.0" + "@aws-sdk/middleware-retry" "3.290.0" + "@aws-sdk/middleware-sdk-sts" "3.290.0" + "@aws-sdk/middleware-serde" "3.290.0" + "@aws-sdk/middleware-signing" "3.290.0" + "@aws-sdk/middleware-stack" "3.290.0" + "@aws-sdk/middleware-user-agent" "3.290.0" + "@aws-sdk/node-config-provider" "3.290.0" + "@aws-sdk/node-http-handler" "3.290.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/smithy-client" "3.290.0" + "@aws-sdk/types" "3.290.0" + "@aws-sdk/url-parser" "3.290.0" "@aws-sdk/util-base64" "3.208.0" "@aws-sdk/util-body-length-browser" "3.188.0" "@aws-sdk/util-body-length-node" "3.208.0" - "@aws-sdk/util-defaults-mode-browser" "3.254.0" - "@aws-sdk/util-defaults-mode-node" "3.254.0" - "@aws-sdk/util-endpoints" "3.254.0" - "@aws-sdk/util-retry" "3.254.0" - "@aws-sdk/util-user-agent-browser" "3.254.0" - "@aws-sdk/util-user-agent-node" "3.254.0" - "@aws-sdk/util-utf8-browser" "3.188.0" - "@aws-sdk/util-utf8-node" "3.208.0" - fast-xml-parser "4.0.11" + "@aws-sdk/util-defaults-mode-browser" "3.290.0" + "@aws-sdk/util-defaults-mode-node" "3.290.0" + "@aws-sdk/util-endpoints" "3.290.0" + "@aws-sdk/util-retry" "3.290.0" + "@aws-sdk/util-user-agent-browser" "3.290.0" + "@aws-sdk/util-user-agent-node" "3.290.0" + "@aws-sdk/util-utf8" "3.254.0" + fast-xml-parser "4.1.2" tslib "^2.3.1" -"@aws-sdk/config-resolver@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.254.0.tgz#82504a1886f90fc1374b77d65187058a04430204" - integrity sha512-+t5mi/SrZdAbSgg/5b/q3zVZsNQSyty2XX+znaRvBdANtIWIBdFLEMQp/L5NA+PSiW6VUXu9eXcsj0kJlAhTgQ== +"@aws-sdk/config-resolver@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.290.0.tgz#400155b7d5e0a0215889f58e601ec334615585e1" + integrity sha512-Ovskri6IR4iBK0+3ttgjPSgOUEC+fd5tqRN5JlPCCZ9VwqwF/z26yYC4fAPaMUAJwPVRFeYYzQoszXGoxPyG7g== dependencies: - "@aws-sdk/signature-v4" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/signature-v4" "3.290.0" + "@aws-sdk/types" "3.290.0" "@aws-sdk/util-config-provider" "3.208.0" - "@aws-sdk/util-middleware" "3.254.0" + "@aws-sdk/util-middleware" "3.290.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-env@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.254.0.tgz#8ad17baa3108ed25509db1b994a3a51cb17ff427" - integrity sha512-2CDwb7L1XGTY7Y8N3EsE1xqas0zNvrs4aOEv5XZNrKqE+9bvs8CiUwV4SB6VwSD+EPcOSm3QYEURUmj5EyLEZQ== +"@aws-sdk/credential-provider-env@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.290.0.tgz#da262156d7679f33c0edd75578221b64f3314266" + integrity sha512-gWsllElBm4DWZcc42Zb6sxaw77KBf6cY9iEezbVzVbJioqR9hIr1Pq3Nx30z1Q+1KiHSnt/Wl9cYYHOoNw2DnQ== dependencies: - "@aws-sdk/property-provider" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/property-provider" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-imds@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.254.0.tgz#876282edc865747b574a537d59c4cf47cf4b37d3" - integrity sha512-sM3N7FLz+svRGjTgwAybKBmu5tVfCJmd5HPEfKR0jfBWB1uq0u0J+65JiO/wfqn/ix+3ZyFfacSJDFjnSPu/KA== +"@aws-sdk/credential-provider-imds@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.290.0.tgz#3cf65860defad4cd9af266c1a96193a6dce94075" + integrity sha512-PkYEs7zzUVWnhkR9TlU1ORDcCnkD7qoqR1loXXSZc+EIOX9M7f+sXGLtCXVl9wV1Ekx3a5Tjud+aQcOJjjFePA== dependencies: - "@aws-sdk/node-config-provider" "3.254.0" - "@aws-sdk/property-provider" "3.254.0" - "@aws-sdk/types" "3.254.0" - "@aws-sdk/url-parser" "3.254.0" + "@aws-sdk/node-config-provider" "3.290.0" + "@aws-sdk/property-provider" "3.290.0" + "@aws-sdk/types" "3.290.0" + "@aws-sdk/url-parser" "3.290.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-ini@3.256.0": - version "3.256.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.256.0.tgz#6fc7905cedbdb33df40bdbfc7bbfe0a0a5200e4a" - integrity sha512-tZacj/dVnu2GuNSVpYaO6JHrpaWqz9wvOkf/lYxh1Ga993uhF6SWLfENM29gF/EjvV0Nn0beHfyz5Em7dFbw8g== - dependencies: - "@aws-sdk/credential-provider-env" "3.254.0" - "@aws-sdk/credential-provider-imds" "3.254.0" - "@aws-sdk/credential-provider-process" "3.254.0" - "@aws-sdk/credential-provider-sso" "3.256.0" - "@aws-sdk/credential-provider-web-identity" "3.254.0" - "@aws-sdk/property-provider" "3.254.0" - "@aws-sdk/shared-ini-file-loader" "3.254.0" - "@aws-sdk/types" "3.254.0" +"@aws-sdk/credential-provider-ini@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.290.0.tgz#7062a952d57310c721fb09d1468333777f63e375" + integrity sha512-n3OGvkvNgMS6Kb2fuFrmNeCI8CP7DGOsEvcfYPMiXsQWx9hHAh/XIv7ksD3TL5Mn8Dr0NHmB6uY5WgUZDatqfw== + dependencies: + "@aws-sdk/credential-provider-env" "3.290.0" + "@aws-sdk/credential-provider-imds" "3.290.0" + "@aws-sdk/credential-provider-process" "3.290.0" + "@aws-sdk/credential-provider-sso" "3.290.0" + "@aws-sdk/credential-provider-web-identity" "3.290.0" + "@aws-sdk/property-provider" "3.290.0" + "@aws-sdk/shared-ini-file-loader" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-node@3.256.0": - version "3.256.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.256.0.tgz#ab9954548416130152d8496a3b6494d78dc555e6" - integrity sha512-A/C8379FjeDYzfG+KQOyMgUnH/Fr7MFoeyhH9pECp5KWzts6H4IIQ1XUN7H/dmeqGfFxU7E7Hya2k1BX4qrKwQ== - dependencies: - "@aws-sdk/credential-provider-env" "3.254.0" - "@aws-sdk/credential-provider-imds" "3.254.0" - "@aws-sdk/credential-provider-ini" "3.256.0" - "@aws-sdk/credential-provider-process" "3.254.0" - "@aws-sdk/credential-provider-sso" "3.256.0" - "@aws-sdk/credential-provider-web-identity" "3.254.0" - "@aws-sdk/property-provider" "3.254.0" - "@aws-sdk/shared-ini-file-loader" "3.254.0" - "@aws-sdk/types" "3.254.0" +"@aws-sdk/credential-provider-node@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.290.0.tgz#d9444ae189d545b8cac8a52f578e79b2687a2b38" + integrity sha512-snLmeD7yAYq1x7lngCTM1VGmHYCZ4iUW5JRG9XPr7Npl7VWVdnNqaf5XBYEANgaFoWxjN3dNyDPg05+5Ew6QCA== + dependencies: + "@aws-sdk/credential-provider-env" "3.290.0" + "@aws-sdk/credential-provider-imds" "3.290.0" + "@aws-sdk/credential-provider-ini" "3.290.0" + "@aws-sdk/credential-provider-process" "3.290.0" + "@aws-sdk/credential-provider-sso" "3.290.0" + "@aws-sdk/credential-provider-web-identity" "3.290.0" + "@aws-sdk/property-provider" "3.290.0" + "@aws-sdk/shared-ini-file-loader" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-process@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.254.0.tgz#31e6c0c709d47b9a87397698ab942a820dfa5f38" - integrity sha512-vNm1AHMu5Lg1kOMk4ucWgaNO4zNAD7aeRssdBMnC7WqRT2xB8CUEWi+zJGNjbxzEeTLXQZuMa1VeRT3nPjYrzg== +"@aws-sdk/credential-provider-process@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.290.0.tgz#aaae9f198810c2b4f586689fb359a2382723d737" + integrity sha512-PNnWDYSaE8dMepH59cyrXs45Ucdmzdnyuhcn/fVwQ0Nc7FzESxw1G7SgJZhYF4tMRDiepu6lbFEN0QXsTIM8Iw== dependencies: - "@aws-sdk/property-provider" "3.254.0" - "@aws-sdk/shared-ini-file-loader" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/property-provider" "3.290.0" + "@aws-sdk/shared-ini-file-loader" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-sso@3.256.0": - version "3.256.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.256.0.tgz#5aa418c87ec6018ed768fe02bab42a1b5d6a3420" - integrity sha512-5WV62oxuM1LM9udmouxkGbnkN7sKqF4drYBBt2DetQzq4NStaOtZgcY0fxcX/HFv0Q2wjSWCBtDQ31Jo1CJRew== +"@aws-sdk/credential-provider-sso@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.290.0.tgz#02d5bdf54f6611169a07656b58a026927f9c33a7" + integrity sha512-tX5Ez3EiMrXDx6Vsn2gMq7ga3y4iyPneenCNToRUlmZrhF61DhMfA22gRwdwuP8hlFKXY4LRg51pBfJeq0ga8w== dependencies: - "@aws-sdk/client-sso" "3.256.0" - "@aws-sdk/property-provider" "3.254.0" - "@aws-sdk/shared-ini-file-loader" "3.254.0" - "@aws-sdk/token-providers" "3.256.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/client-sso" "3.290.0" + "@aws-sdk/property-provider" "3.290.0" + "@aws-sdk/shared-ini-file-loader" "3.290.0" + "@aws-sdk/token-providers" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-web-identity@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.254.0.tgz#17ef2052180c929f1f3807704522bd1931b7c2ab" - integrity sha512-R/5qjAoCHEe7xmY5j0vges4xKpFpTgrwzdST822JVNWUobZmiDUqnn+1Xw4Qmomst625NOpgzsV4JuHsA4a8Ig== +"@aws-sdk/credential-provider-web-identity@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.290.0.tgz#4aecad2bcc4e4dbc56ad52872b332ec3ce10ae22" + integrity sha512-Apv6AnYtb5LTUreDVsqlXFNgiU0TQAZ8sfPg23pGrBGZvZU3KfDhF9n5j0i9Uca44O+/vB7UvbbvNAZS200vsQ== dependencies: - "@aws-sdk/property-provider" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/property-provider" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/eventstream-codec@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-codec/-/eventstream-codec-3.254.0.tgz#cbeaa2a4104cc4fe29b576e1d08359d1296f50cb" - integrity sha512-Xy1mCNB//HGXFs5jeFbhmIPiqLqNOZ2E8aiOwVx1iD/9Y/mRprkegFM+BzPiVuzRErrgZmjFlf0B00QsJvpoJg== +"@aws-sdk/eventstream-codec@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-codec/-/eventstream-codec-3.290.0.tgz#fb8f337da457a17ba89fafc5850de89199ccb84f" + integrity sha512-rUIEOTJhB/Up7FSUkrjmIExdJcmDP9Y1uMtnuhFcLhVXlELZ+tB0AfYCcbUBt8ZeMvrULlb+OkxWwHPyh8qkAA== dependencies: "@aws-crypto/crc32" "3.0.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" "@aws-sdk/util-hex-encoding" "3.201.0" tslib "^2.3.1" -"@aws-sdk/eventstream-serde-browser@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.254.0.tgz#66692a152638ba22c947363d953e73885b3cf5bd" - integrity sha512-wETH2hJEO7fmleHWzF+kPkwKOiF4IE6DcCiTsnNa8JonSTkV/Y2uDkmYScXIsoQ2p6j3oPIrhg8oPcLENYFT1w== +"@aws-sdk/eventstream-serde-browser@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.290.0.tgz#126636883c0ba8a8dacfb2aa424df6926b67e5ad" + integrity sha512-6XOtQh8Zj8AoEiF7oA+4iN4KsrtFFggkKzY+5g+NMNE9Z0vyQlc1Vo7MngicmxlX1l35KUW9Xe1DfAvCVzNUBQ== dependencies: - "@aws-sdk/eventstream-serde-universal" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/eventstream-serde-universal" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/eventstream-serde-config-resolver@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.254.0.tgz#d7a909c7947d6ba7b3d9d3bf9aea0342e4f61511" - integrity sha512-2+i3h2WxUpYS++dWbZd439QNT7uoiS4mQAYmZQm/6lY8QdooWMiJ4zqqwTJ97l8f1JQPjtO3GkKh0y0jlgYo8w== +"@aws-sdk/eventstream-serde-config-resolver@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.290.0.tgz#b9a89d405338fed549a51e26d6debfa374a06d85" + integrity sha512-nmHvgc21x79Q7ATMU2d3POKOjfs5zA2s407JAek6JAK4dpq+XO8B7sX9HcHlZc8+81z4LkWfdfsOC7fcgUaTPA== dependencies: - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/eventstream-serde-node@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.254.0.tgz#1dd4c0118dfb3e99854572e6d8c790e3629ca848" - integrity sha512-ipfDXmDn+xygYoipg6C2kDFsQCg+WwHebKPgQR1WyhuW3c3b+QJxlnyV8RuBbJl8VSfs9uxaLuijZRE4kx6l8w== +"@aws-sdk/eventstream-serde-node@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.290.0.tgz#f20457ba5faecb89226c88f3888164bc6d86ca18" + integrity sha512-iD7tkWSf5I9ah6S5iL/Tc93fAC0QYZqyhKd2qKaNjF0o8draNjXWX2Bq16YrWH1H3eJBAAYAQZI7ldEP+mwccw== dependencies: - "@aws-sdk/eventstream-serde-universal" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/eventstream-serde-universal" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/eventstream-serde-universal@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.254.0.tgz#3025908512e2f12ef616a0d4c62d73d556daf6bf" - integrity sha512-PXOb8iKCWuoXqzaYEddknVOxoqZt55bPNNIpAf2fTX3HTcRSH7YDHnTbGEYuoHtJaLRdSqnG76Rt912YD0B19w== +"@aws-sdk/eventstream-serde-universal@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.290.0.tgz#8f3040ced8d5425f3624eefdac40f7cf6617015a" + integrity sha512-5Rz1Z+Oj9WR/NpazjgQBSapPCGUX63PHXprdv9FPeZdwkRH/ZBF1Bs4lOqixiZOcz9YX8UFtBBgrKCYH9JjtnQ== dependencies: - "@aws-sdk/eventstream-codec" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/eventstream-codec" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/fetch-http-handler@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.254.0.tgz#cdc646f48bbfe35ea87ebcc2b5b050e17bbda7a8" - integrity sha512-/bbtNHe5JHFdKnCVr3Zx55sqs4c0F+7f1CC5cvTgH3O46wgIRM/6/rvE0YieXmfm3ho/GOhxBUzy59A0haKQGg== +"@aws-sdk/fetch-http-handler@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.290.0.tgz#53265b0f463f7e4c0266c1c7ad1233d0df88f5b4" + integrity sha512-hehbIxcqyJeiUBTbbP3C4tmY2p9UIh7bnLTKhocqaUcdEXQwlIRiQlnnA+TrQ5Uyoe+W3fAmv25tq08rB9ddhw== dependencies: - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/querystring-builder" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/querystring-builder" "3.290.0" + "@aws-sdk/types" "3.290.0" "@aws-sdk/util-base64" "3.208.0" tslib "^2.3.1" -"@aws-sdk/hash-blob-browser@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.254.0.tgz#8862a849418b7d91ffa2b53fac9aa104cc572d44" - integrity sha512-FUqO4meoGnzzuSnhSsIp3pzlpoAD7cpm8PErKZDKU8izrEOHR+rDmVgx3xKLU1+53QmF72JSS7xCFpjStX+AAg== +"@aws-sdk/hash-blob-browser@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.290.0.tgz#20a7db4810201dccaa9aeac4391f3b4320df381d" + integrity sha512-unKp9whdBAomUEHTfAYd/qloNNQG60eEw13RHysWdrN44Megaqu8y4HHRQEkfNxqXss5ERHpMja8uBj9gE7kEA== dependencies: "@aws-sdk/chunked-blob-reader" "3.188.0" "@aws-sdk/chunked-blob-reader-native" "3.208.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/hash-node@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.254.0.tgz#b69c9dba780ce86cf24effb3c8416eb16586a502" - integrity sha512-7FoB6BVbO+Z/NEOHeOAoUTyj8q+Pcdn4QpKvA4epRDrzMNcXy7MUNzzt148nkDssES09rgsN+KM8Zo2qgRYngg== +"@aws-sdk/hash-node@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.290.0.tgz#bce2a6d79c13a07db7240b3df4f5daebb419a78f" + integrity sha512-ayqJBOPoMa3H3eUhZHPu9ikNjoydu3nxj+R6tp8nMrKfFYDUu0XCdkpB0Wk/EBpMyWA2ZeyyfgXEUtQkqkAWBA== dependencies: - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" "@aws-sdk/util-buffer-from" "3.208.0" "@aws-sdk/util-utf8" "3.254.0" tslib "^2.3.1" -"@aws-sdk/hash-stream-node@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-stream-node/-/hash-stream-node-3.254.0.tgz#70b8dcd70c4ae229cfdcc7a408b73c5aaee80a80" - integrity sha512-xGuKFRm1XkZg8bn3aYxkBDqTEIwtKkL0p2zk3KEN22b7qGIZ9+CGIN+wKGXiGsur+YsPE9CR1YOlvkCz5GqkNQ== +"@aws-sdk/hash-stream-node@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-stream-node/-/hash-stream-node-3.290.0.tgz#78bb68726f52848c3facf8b9ccabc4362daa202b" + integrity sha512-6IjHrcD9qi3QIPNT8yGWNiMGdqvPru9lJX5tDSuZSe8cNOIRKFRSLkpQIRPdQLBQLbyJSX0MkwZ+apo6K7H09g== dependencies: - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" "@aws-sdk/util-utf8" "3.254.0" tslib "^2.3.1" -"@aws-sdk/invalid-dependency@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.254.0.tgz#a2df8be8257a2edda41301600a73520f7539540d" - integrity sha512-ueV0tXyGndCTZXnEv+AMeTfu+IqV2QzmGMXcakiwxDjg48H9X/bLnj+C96Sexond8jD8K0ub9HWhkBrvvAXlPA== +"@aws-sdk/invalid-dependency@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.290.0.tgz#2952ce8322be4cce75d8f82756f70e9b7f409b3d" + integrity sha512-plJpEJ+PPTrpaMfg5KKsAfdXUi6iUZTc/PgP0/CPqCe3kuiWb1xb2GeTxOL5InzfBffVdHWeTanYu9+V0MIxVw== dependencies: - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" "@aws-sdk/is-array-buffer@3.201.0": @@ -728,341 +719,340 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/md5-js@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/md5-js/-/md5-js-3.254.0.tgz#53c6633ec2353cd0f55aae28acaa6a62b5d890e8" - integrity sha512-J7PTkuX+E37ed4npAV41B6HDEyqM6f8xmorOPPP9Zu3uoR1FDeymK+U0jqOa8HCWxdOle8h1i3ZfghY1D8bozQ== +"@aws-sdk/md5-js@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/md5-js/-/md5-js-3.290.0.tgz#c9cb2898139bd4ef98947666ee0bb534ab2db699" + integrity sha512-5JQfZObsehgX0S81j3nxS/X0wiXESisETQVG75HAUHfDiScojClfjc2WuOXCwChy3S6VZgjLpEbqEQ3CaFQKWg== dependencies: - "@aws-sdk/types" "3.254.0" - "@aws-sdk/util-utf8-browser" "3.188.0" - "@aws-sdk/util-utf8-node" "3.208.0" + "@aws-sdk/types" "3.290.0" + "@aws-sdk/util-utf8" "3.254.0" tslib "^2.3.1" -"@aws-sdk/middleware-bucket-endpoint@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.254.0.tgz#bfaf8e8261b518e86a5e7dabfd5939feffc4471a" - integrity sha512-S4rXBv6F9NQaGamuLqqwB38d9ahsaQeQk+tno/WarY2quh7HouS49yhApDmCEj3z7mrl3eFsf3ahAueLy9fGjw== +"@aws-sdk/middleware-bucket-endpoint@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.290.0.tgz#fe9dd4d6eeef9f0e674689aec6689cdd34f6288d" + integrity sha512-jFHcAdIXfyqcHFzldqDDEZ2qPi9GNsWMDCiKqMumOqWJvwzCzkzsNa0A+6nUnOd/eDLDslvbktrD296Qy8oLKA== dependencies: - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/types" "3.290.0" "@aws-sdk/util-arn-parser" "3.208.0" "@aws-sdk/util-config-provider" "3.208.0" tslib "^2.3.1" -"@aws-sdk/middleware-content-length@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.254.0.tgz#ecf39dac8b056fb6c32860d65080b9b71d02a72c" - integrity sha512-IT7nDZA6WsaZSNp9M79xfkk/us4kGV4SIZ2R9gHT9MFqdmpmbr3EGhFLKXUHcAZfCcOdw+JNV/wHJiiN1JD/hg== +"@aws-sdk/middleware-content-length@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.290.0.tgz#f304325c741e91303f2380c9c5e4000cdb9c3d11" + integrity sha512-9I+vnGSe/S0U98ZRCbOAdQngYfO7kYvXb5gjjX08XUQDfbB+ooIM1VdKngHhzUCTAs48z/43PzpBCjGJvGjB9w== dependencies: - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/middleware-endpoint@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.254.0.tgz#9af598ce63a87eed13f84d1a9bfff4da9dd25790" - integrity sha512-9fkDtSJdhEr91tWp4zLyKhHDGVyvUA0gDK+6wGYyorKCae2qX2TL+Fl6vsqY4PxrdTpXRBJDlJnEly9i48YKxg== - dependencies: - "@aws-sdk/middleware-serde" "3.254.0" - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/signature-v4" "3.254.0" - "@aws-sdk/types" "3.254.0" - "@aws-sdk/url-parser" "3.254.0" +"@aws-sdk/middleware-endpoint@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.290.0.tgz#f1ccfd7dbb1675f749e827512715d3f33a2b7802" + integrity sha512-A7wIujIHHoQaQaqjlRynqoZ3S4S8ExYDReXUBwf4Dzx0wZ5A50owLMY9MKFyd9uukirZs8mDnPPYZuwUI4wR7w== + dependencies: + "@aws-sdk/middleware-serde" "3.290.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/signature-v4" "3.290.0" + "@aws-sdk/types" "3.290.0" + "@aws-sdk/url-parser" "3.290.0" "@aws-sdk/util-config-provider" "3.208.0" - "@aws-sdk/util-middleware" "3.254.0" + "@aws-sdk/util-middleware" "3.290.0" tslib "^2.3.1" -"@aws-sdk/middleware-expect-continue@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.254.0.tgz#0e36d66aa48639400824198d450175847af4d766" - integrity sha512-8vl1mEYG9eK8IxoVixrOZYNVxRMxebK/ROzWgzcyUNmVnxEYQpRnnkpAU4C6Z7AAx5nxqxMaM8Gg/Lu9wxMM/g== +"@aws-sdk/middleware-expect-continue@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.290.0.tgz#84e36331599220328605b7f76bc977c589aa6677" + integrity sha512-MFRedBoLksB1kPJ/ffL1JD9D07Q7jQKEcEuxyGxj25eDiLbA4lxKuJIZI3Sj8P5XO0Lx6pguoxisnhLhp9EWtQ== dependencies: - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/middleware-flexible-checksums@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.254.0.tgz#50a1745c9a8811c373b4c69523533358701d3593" - integrity sha512-ubm+e035DW45+aYtIq1j8QXCyw7shor62L6XJM3SPI33JMDJWVoofFG5q2mUm1D1syeo8WZuf8VJORujBQCJEA== +"@aws-sdk/middleware-flexible-checksums@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.290.0.tgz#ceb25cafd23860cf59e04ed31cd76a7ccd3095b7" + integrity sha512-E621IkVQ4SMQMnkWeawlF0GqaZEHq0KvzAlprlCufktYD7OVxd1jQc0Epa7Pd3/b+rogSNiAdEihZbp7sfQsZg== dependencies: "@aws-crypto/crc32" "3.0.0" "@aws-crypto/crc32c" "3.0.0" "@aws-sdk/is-array-buffer" "3.201.0" - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/types" "3.290.0" "@aws-sdk/util-utf8" "3.254.0" tslib "^2.3.1" -"@aws-sdk/middleware-host-header@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.254.0.tgz#6cdf432132e546f248f626dc6d955285abee6595" - integrity sha512-JG+OoyCMivnqTYiPZxRF+sgYEyQG68+PMl2843owvSxQQ25nH2Ih6DzLqH10c/uAN0PsiA8s/FfJBzhw9Xf0KA== +"@aws-sdk/middleware-host-header@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.290.0.tgz#82ad8185f00fb1c9583408d7d03c8140873345fd" + integrity sha512-j1ss8pjSJyG0aB+X0VPYgTfoieB8m5c+PrWw85JRM/qgbQeurkyD3d/F00V1hkZI42gygOaPlmYMik3kQnmITw== dependencies: - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/middleware-location-constraint@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.254.0.tgz#400d402cca11ef62099fdb37428f644dfb9ce447" - integrity sha512-FkCQAyGd0J1SRT5lUVrxRG6dReu/2dbF57jxMUyEpT1gTHXc/cxR4A1xk2Z4ihqUviXFwjJQALkfOZbMwglxEg== +"@aws-sdk/middleware-location-constraint@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.290.0.tgz#4546380e2cb7ffc20463265737a79368884e82d8" + integrity sha512-9DjPlNCPChmXP37vYonsAhBKPLk3HPQPK/aBTGkIwGhL1LE811Vzm1PoVCwN12zaB8JCt01yEVmStH9SWHEOIQ== dependencies: - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/middleware-logger@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.254.0.tgz#d5ece30ef193da78c71c9abe38ae30b6511000c0" - integrity sha512-h3jEw58VUJkfqrwWMmp3Qc8293RFo4LMqxNAVsVwYEG6xb/RQ+JamsOx+t6aDsoOdKqhYngWwDGtgUZQ5wQQvg== +"@aws-sdk/middleware-logger@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.290.0.tgz#a12945c7c125764d930f69c56d6dee70263325a4" + integrity sha512-wJOK31t/Y/Km6B5ULF/k2RmQB/6MXSN/hMuCiYsLMapFT+86mBlY8cXytYXtLS8afRKpuNy29EY+O6ovfjz6Ig== dependencies: - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/middleware-recursion-detection@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.254.0.tgz#605ab3ff47c8ac1fca2d092d570151d7afbe8ae8" - integrity sha512-/4tTvAXmIIMCs3giPIXN9aVJUGMoBMWw+9WS22u7nYNzwTe/k30DhS91uvwj7TLOOpFN0IBNXPCJ+T1OZn+ZXQ== +"@aws-sdk/middleware-recursion-detection@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.290.0.tgz#76474668ccbe2fbc17535c948430ccec8aaf083d" + integrity sha512-m8Y7SE3NfVTyGubiRhueyHF7uqC5dCbD1bSLgVjvrSjO2yEL0Dv9QR1ad7a+p5ilS+Fq3RnOu1VeujfTHy0qRQ== dependencies: - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/middleware-retry@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.254.0.tgz#0af8f8c06e42879cbc1f23e6d2166d61953c0f2d" - integrity sha512-nHgris8NmtLzsH5iUA8geW6RAT1VRymjlieKFmM3CAYt2h2X8AtAiL/Wod+Pj3+jjRGk9YeGzOOGbzODHiRxnA== - dependencies: - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/service-error-classification" "3.254.0" - "@aws-sdk/types" "3.254.0" - "@aws-sdk/util-middleware" "3.254.0" - "@aws-sdk/util-retry" "3.254.0" +"@aws-sdk/middleware-retry@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.290.0.tgz#aa644026ecf1c718eeed5f2d6c3acc79844a503d" + integrity sha512-mvXvYd/3L/f5ZcnFI1Q2hwk0OtzKMmkDfWW1BcoVzK0XHf2aeehbs7xgI92ICEi/5Ali0IG5krv5LqfgO154Sw== + dependencies: + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/service-error-classification" "3.290.0" + "@aws-sdk/types" "3.290.0" + "@aws-sdk/util-middleware" "3.290.0" + "@aws-sdk/util-retry" "3.290.0" tslib "^2.3.1" uuid "^8.3.2" -"@aws-sdk/middleware-sdk-ec2@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.254.0.tgz#04d94315a442c0841eed4af9d686f75a33c22893" - integrity sha512-AVgywJVeC4B8dsR61KA7+yU3HF6huVJtPbwB45gGzFrAC/VqcYJ9W67hTZFWXz0vqTgGv5JhFBZelHSsHIjwKg== - dependencies: - "@aws-sdk/middleware-endpoint" "3.254.0" - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/signature-v4" "3.254.0" - "@aws-sdk/types" "3.254.0" - "@aws-sdk/util-format-url" "3.254.0" +"@aws-sdk/middleware-sdk-ec2@3.291.0": + version "3.291.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-ec2/-/middleware-sdk-ec2-3.291.0.tgz#f5b88149d0680a84b2a35f8fb36fbd8337f32195" + integrity sha512-pWNJFp0hnXsAx0DIZ5Eti93SoVKHLteKQUyRSWWhw+Ebq4frqBL3JM2J6cxl2awXVVuIXQAWdmdGX3rcT3PlVw== + dependencies: + "@aws-sdk/middleware-endpoint" "3.290.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/signature-v4" "3.290.0" + "@aws-sdk/types" "3.290.0" + "@aws-sdk/util-format-url" "3.290.0" tslib "^2.3.1" -"@aws-sdk/middleware-sdk-rds@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-rds/-/middleware-sdk-rds-3.254.0.tgz#561085eae276745c00e99dcbbd215e8eb4da51c4" - integrity sha512-+J2w5RgaiPkwATfBG5CPfAn83GQ83BV13SMzyDOiZNYCxvGb7B12w1xTIZDXzu3JHhen5chb39t3kkjPbMemBg== - dependencies: - "@aws-sdk/middleware-endpoint" "3.254.0" - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/signature-v4" "3.254.0" - "@aws-sdk/types" "3.254.0" - "@aws-sdk/util-format-url" "3.254.0" +"@aws-sdk/middleware-sdk-rds@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-rds/-/middleware-sdk-rds-3.290.0.tgz#06776c640d872c5702edd615dc54b47e2a2a092a" + integrity sha512-2y89X3sDG1rd9rORvJn3gbw/D/JrUq04R4ibXcL1IOawmXxmJaxe0cqQrU9Aecsoae42W7wvWIvDHwS+ufmwsQ== + dependencies: + "@aws-sdk/middleware-endpoint" "3.290.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/signature-v4" "3.290.0" + "@aws-sdk/types" "3.290.0" + "@aws-sdk/util-format-url" "3.290.0" tslib "^2.3.1" -"@aws-sdk/middleware-sdk-s3@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.254.0.tgz#df086d595457180013dad3a7bd1ca4c7b70f1c99" - integrity sha512-BanSacykPn5Gr1ygaQ8ts6tE7vxcdh9wLGAuYJD+WNkyQdMjgWQiPkDWuDp9+K+xf0Wx39/ITj9xjdDH6+QNIw== +"@aws-sdk/middleware-sdk-s3@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.290.0.tgz#c6e61e3f1b88d928b45f8a3f75e63d5a4cf852d2" + integrity sha512-6sks5cu5b2LVHFp2RviPZRsVrgeDyRfVExx9D9E18VCad+eejnXsFwx6yvoYFSV8J7mc2E1mCTSSSwKsaC+KBg== dependencies: - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/types" "3.290.0" "@aws-sdk/util-arn-parser" "3.208.0" tslib "^2.3.1" -"@aws-sdk/middleware-sdk-sts@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.254.0.tgz#5382f65872fe9917ac817273ae6e1ffa6cbcdffa" - integrity sha512-Y074nmTp07thuOI6GePv8IKdL/OvkO1tn2l7QvnwQa3Sy/HyNai1V3MVtq4hRi1dgDjheKPVHPE+TnOmF3w5uA== - dependencies: - "@aws-sdk/middleware-signing" "3.254.0" - "@aws-sdk/property-provider" "3.254.0" - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/signature-v4" "3.254.0" - "@aws-sdk/types" "3.254.0" +"@aws-sdk/middleware-sdk-sts@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.290.0.tgz#850d03682dc9b7f37e958090b84b2311477811fb" + integrity sha512-NaYnDhFtmz/e9jNBNeY10A4AldCvjF46ZfeIWoBUsk/4qDlSP9kaCjTufEjNf/zMTtYzGiP/FUtLS7T6tfXdoQ== + dependencies: + "@aws-sdk/middleware-signing" "3.290.0" + "@aws-sdk/property-provider" "3.290.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/signature-v4" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/middleware-serde@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.254.0.tgz#57b6579d6d5b6dcd260c088bec8f4cacb6adf5f0" - integrity sha512-YuItb2nlKADTBItcn68eA8amX4quuR1+0GyFRkwssKS/iTjbIk+3gJ2s1zxkUhlyozH3U38Jvvqd+W9+gNpYIg== +"@aws-sdk/middleware-serde@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.290.0.tgz#4f7e616dfeb2820c5eb90a5ff770914d0f03e6e3" + integrity sha512-lZCKlfJzosi3cVx02RKRTVvbAijHTfd16EiSyKRsQOF2rCu7Qt4LzygIlqUonCeHG6eSqOMMf7LAJ22IHafBbw== dependencies: - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/middleware-signing@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.254.0.tgz#d08cf8c163a90d76a5139c23eecfffb475b6494f" - integrity sha512-HMVGf+yANjlKCUMFZJU2PNzbI9hbCgL+IX/Y4DGuQW9cp7EgZOxQre1LBKpcCqqPVQ4toIdfNH/K8uM2fpO6dg== - dependencies: - "@aws-sdk/property-provider" "3.254.0" - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/signature-v4" "3.254.0" - "@aws-sdk/types" "3.254.0" - "@aws-sdk/util-middleware" "3.254.0" +"@aws-sdk/middleware-signing@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.290.0.tgz#e7e43e4a1697f135c544c75c5d07a4fcdf42b062" + integrity sha512-mEJZQrbXkOTI+BdFlpAd1CleVJL8B7qayANMNj9nrZqvZ7HzVDLEkNaJqFz9JFizYTfZC2ZjtATPrSiYDvFEfg== + dependencies: + "@aws-sdk/property-provider" "3.290.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/signature-v4" "3.290.0" + "@aws-sdk/types" "3.290.0" + "@aws-sdk/util-middleware" "3.290.0" tslib "^2.3.1" -"@aws-sdk/middleware-ssec@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.254.0.tgz#b2eb62170336215de314ae1ea9ca6f67564d5359" - integrity sha512-7y9KRvvwhoPhbYJePFfBRxSQukgpO5fcZ6KJHWSyCNZEkAIIB2h9rjZGhZGppKaCTrO/yQCDVpLgdXEQepme1w== +"@aws-sdk/middleware-ssec@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.290.0.tgz#be0283275bb12e9f71bd34145ddc1103b601304f" + integrity sha512-HRDYawju2mWMF0RObsskEZu9eaDlABVZn9y4quutVYY0EUOWBTvfXmNBiX0YSn7sfFEElFIVqdzsbCCmxoXXBg== dependencies: - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/middleware-stack@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.254.0.tgz#1ec3b7ce4a9e62c630119cb3d4ec47df8cf2c185" - integrity sha512-yPWRnjeLC0lPAEQbiqbC3+hnqXZ+uCSoSevGndU5KWMMiXLxKZn7Y0B3kG8NAnNNuPid+wYFWWU9rKiBRvWR/w== +"@aws-sdk/middleware-stack@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.290.0.tgz#a6b5cecdaa0d75f54d958f15d5f6a71143cc5c6c" + integrity sha512-25iC/7oAokRfxixGkDjBSIAkNwtx2kcO+xMoDczFus9UrlOr2pBY0IXbPn6bB56q2zwsBTHcmMTn0H7FJSIQmw== dependencies: tslib "^2.3.1" -"@aws-sdk/middleware-user-agent@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.254.0.tgz#b0b54aae78044db72605bfb3cda7099c840f600f" - integrity sha512-hp5UYRg3ysZXMFMv34nYexyom6Z3pdx+OmisJz4w3AMigT8y57Ps30Vg+1QYaGlQkI4vfvcmdZX2Q+kp+mb9gQ== +"@aws-sdk/middleware-user-agent@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.290.0.tgz#bd30eabe626f4a9b282eff075b71de017c48b7ef" + integrity sha512-ZR49PPra3LtqZBmXAtV8YrUSrkVG0hPBICE8cma/wMwbKGHa0G+Xu4pOZP0oQXs5XeGu1cs/Nx3AOJ2fgaMjhQ== dependencies: - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/node-config-provider@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.254.0.tgz#0919e198e28144a85f97928ceccaf509db796a5b" - integrity sha512-3Bp3Gp2NOY9gab738xf07TysO5iB0Ib9qRNGDlxX8SX8fZDRnxrF2cn+Tjte42wrO54orwhSyuTaIlAqKeii8Q== +"@aws-sdk/node-config-provider@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.290.0.tgz#0cce75d9692640bd45e5cb37b2db34a84625ca63" + integrity sha512-dQLnyCy5iT7Q5Ot2JOciNH9WkaixWwmEnvW6nBa6febzAYZVy78sfJOOP1EZ7ClG1aIhrsAN7/7wPebpn/Peiw== dependencies: - "@aws-sdk/property-provider" "3.254.0" - "@aws-sdk/shared-ini-file-loader" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/property-provider" "3.290.0" + "@aws-sdk/shared-ini-file-loader" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/node-http-handler@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.254.0.tgz#5007434b0ed387f110639cf74f7cbb6abebd6e68" - integrity sha512-DX2WJ3pub+3FF9GpoF5doERCn06MxS/UmmbKnIIokWQHjPZVomNh/1P3Cf9Jn9jeIPgh4UOg0uPD8cUm/cwHQw== +"@aws-sdk/node-http-handler@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.290.0.tgz#90cd7a44fda8506eaa5a62d00e88efd6b09900df" + integrity sha512-HfzuzdpAJpO/ob9DQ3aEB/WmPCS5vZOic9T4TtSCmRd5e3+xdMtK/MQUizp8XkbUGBat7jPmcV13Gy4YmwfAuw== dependencies: - "@aws-sdk/abort-controller" "3.254.0" - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/querystring-builder" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/abort-controller" "3.290.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/querystring-builder" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/property-provider@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.254.0.tgz#4c815471e0aade6644b2923bb3c1a26c1e2cb1e8" - integrity sha512-BLZF/LDFjAgv2ZY0vhThU58k++Aw+SK7qNU7XT0D84q5iWlYRKptQEvSSvIkBSI/rZoppOFhK7W80I8kNNbh+Q== +"@aws-sdk/property-provider@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.290.0.tgz#b6edda6c713e8e7ef53691bdc42a0785c37ad93e" + integrity sha512-2Zrh6/KecmiZ/cKVaeDtHRAfyOnAEfwJsgxfFugs3RxjJtYr0AbYJTF+mYp3f8Xc7DCjdxR055axo9TCTBSrwg== dependencies: - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/protocol-http@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.254.0.tgz#b1ea17a599e50f30a3fc252de7aa4ced1f99acdd" - integrity sha512-4o/I/qhMUTp70njwWe3ttyRJSAKegnr8l3oVWAf1/q1ZHpcxbRRZEDvrkx4KSunFeXTTGHcff1oyLSRG/cKMsQ== +"@aws-sdk/protocol-http@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.290.0.tgz#50c2a9edaede4178b01805fd5c45d4437a52b869" + integrity sha512-3VHbfmo7vaA/0ugJedjwyK85MT+OKQanz7ktUnAONH5KdG2/gPpa9ZSTyfK9kCVFin93YzC3pznZgr6oNYgGgg== dependencies: - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/querystring-builder@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.254.0.tgz#e542ca41e9b24828a92087d24e1f37aec1c3c4b3" - integrity sha512-Er+pOGTrPxelrzggibduO+eB1ClaU2BhjA8gd0nORS3kqktQggG3tKmRSIilegi9WOa3awCk6CnnuAf0pBrbUA== +"@aws-sdk/querystring-builder@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.290.0.tgz#a126788e8f934f9550d9ad79f0da92d597087ada" + integrity sha512-7q8x8ux1RCUxUolqxsXfSbCObyMzvSwfJb9GgZ8rDi2U61l8W760a9ejHzizfQJvdldRSwFqmynkRAqYbvKixg== dependencies: - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" "@aws-sdk/util-uri-escape" "3.201.0" tslib "^2.3.1" -"@aws-sdk/querystring-parser@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.254.0.tgz#ebca5a4e78bb5ad4e2e6a44447083d09212cf450" - integrity sha512-WwRD99dwGo2aIrRjLHUAXaWCZ+3fj88IhIwciWTqrHBS3TQWXllOOQmYo7f+aMBB4Q1K6KdKITNi8L7aUuDv2g== +"@aws-sdk/querystring-parser@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.290.0.tgz#d089c8c83cb19b07557d1f09e36dc5ec37ff8c0d" + integrity sha512-8QPDihJKSFYFphxUl5+FfXMQowhAoHuDeoqd1ce3byL0bm7k8emcGfiYD6QGxuDlpno+F4O1/Mz+e+cwNCdPVA== dependencies: - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/service-error-classification@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.254.0.tgz#1cf2a2e79fd73d48e751207e25527988dd6716d1" - integrity sha512-8GHqMJBBF9yoMBG/Nf9PusUSMFjG8ygps/cSJPlgcG2vbFn8BCdBZVc4ptXqICZUnBB/6lrxy8nCmNUaru48jg== +"@aws-sdk/service-error-classification@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.290.0.tgz#4e9cc43da87b4a87dbad781f303dd92d7deed320" + integrity sha512-QP+QgL5Gm6RKl4KGwTRyG1kw0SxBbcmp/a/yhywVHmRI0/+4VsL+cooTqtjFr3xVmKoCX+/JZZ8P96VGFvRSZA== -"@aws-sdk/shared-ini-file-loader@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.254.0.tgz#1d26b8d98541755dc6a4b8027110fea2b86b6257" - integrity sha512-UH4YTXuG+q004vA+jNrVhrD5XQCIAgpL/eriObJnQpKUVef1mkkEDHZs8+8+ZPsk4p/iBrIJ3lXNf7iDA/BFzw== +"@aws-sdk/shared-ini-file-loader@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.290.0.tgz#e7a76ad15560faabd0603adf752f8732da73a00b" + integrity sha512-kvLW5rwr4lwHdwkYnoHYpFVfWwZYwQO44eRnkrDnyvvhZTcCH3rBLApu6uvomnL+Ep4bEJ1anDKt3WywlGg5Qw== dependencies: - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/signature-v4-multi-region@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.254.0.tgz#8f1e0e8cff9fb47dcade7dfcc5af88aa8c1590e8" - integrity sha512-pm1UlY98DnqtYJvG2NLOQfMHAvoJRE3gmH0i4U0qyZ1UFYsgLpWaxdRAr9fGI1icxqmArYKkXR9NlzmJYASotw== +"@aws-sdk/signature-v4-multi-region@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.290.0.tgz#89fa6c6216916d28a27fb056ea39316fb603c4a9" + integrity sha512-kkFExt8MlQWnYytDuqUNLJvGhiE/stHMK8U0s1AjG+xy+wi3Atq9q3mGXbdsWatDhpuzaMhwBSttrvKOfWLnmw== dependencies: - "@aws-sdk/protocol-http" "3.254.0" - "@aws-sdk/signature-v4" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/protocol-http" "3.290.0" + "@aws-sdk/signature-v4" "3.290.0" + "@aws-sdk/types" "3.290.0" "@aws-sdk/util-arn-parser" "3.208.0" tslib "^2.3.1" -"@aws-sdk/signature-v4@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.254.0.tgz#a68a1f420c98cbfe1d5f15227172d26bb7980338" - integrity sha512-9FoEnipA9hAgEp6oqIT3+hobF+JgIXIn5QV8kAB7QGxEDqs/pdpEbGc9qbxi0ghdjvqzOSDir9gNI3w0cL8Aug== +"@aws-sdk/signature-v4@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.290.0.tgz#9b73d9de8328d6401e5399cd6021bb5addee3031" + integrity sha512-SUMflc8b8PC0ITV3AdYBSlTcn4oFjumBAPNNXBLKIpifQ1l7ZufFIulDPlqeouXTDwsuCVINAwE0DbItDe/7Qw== dependencies: "@aws-sdk/is-array-buffer" "3.201.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" "@aws-sdk/util-hex-encoding" "3.201.0" - "@aws-sdk/util-middleware" "3.254.0" + "@aws-sdk/util-middleware" "3.290.0" "@aws-sdk/util-uri-escape" "3.201.0" "@aws-sdk/util-utf8" "3.254.0" tslib "^2.3.1" -"@aws-sdk/smithy-client@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.254.0.tgz#053bb490fe6db91ce90471e285e37c8adb77440c" - integrity sha512-SI0jz9JfWi1IaakDX/26xliKTIMJpzwwDoyQPEfZ/L0KKdpr2gNhljA3sR2pZ2EM1oqOaXpMHAunSzv7EBpBWg== +"@aws-sdk/smithy-client@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.290.0.tgz#0c05c305dc276b6c5bc9a9e35c2b07b447f62fb1" + integrity sha512-MDa+BJqM1FP2HYugVAscufoLJuapEdUTZPoyERVGfUEznKfKH33QXRoeqW1wzUNyhcxFONHLnXp1aYFBtnLx7g== dependencies: - "@aws-sdk/middleware-stack" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/middleware-stack" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/token-providers@3.256.0": - version "3.256.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.256.0.tgz#a07ddab7649ff70ccb5dc419d0d457553531dc56" - integrity sha512-R8FnhJShIJsvmDzTG2y8WrJYijY7cmK2G4VqqhOx34jCuDFM1/Ml8BzN/o2RvHzJH/7qCqfUMTsJEpt+KOuMPA== +"@aws-sdk/token-providers@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.290.0.tgz#1728b78987b8c5feb2b05440a415e793d89222b9" + integrity sha512-fc5y8WH7RVwoaUaEdK3cRanxgHShZKAPZ0rCtHjoLURF8IjZIrn3AaZqV8YTgAAmIKNVC+argpj1G+suqXEB/Q== dependencies: - "@aws-sdk/client-sso-oidc" "3.256.0" - "@aws-sdk/property-provider" "3.254.0" - "@aws-sdk/shared-ini-file-loader" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/client-sso-oidc" "3.290.0" + "@aws-sdk/property-provider" "3.290.0" + "@aws-sdk/shared-ini-file-loader" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/types@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.254.0.tgz#760b4a876efa2edcec191dd8b18b989fa717a42e" - integrity sha512-xDEDk6ZAGFO0URPgB6R2mvQANYlojHLjLC9zzOzl07F+uqYS30yZDIg4UFcqPt/x48v7mxlKZpbaZgYI2ZLgGA== +"@aws-sdk/types@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.290.0.tgz#06a14cf61c2e93d8d789665d2034260229a4de8f" + integrity sha512-uQLD9tLv8Q87CwrSB/taUoQ8wkGeFb1Gygc+kt5oClfMFP9HYzu944kW/1R7/J5LtBLT1QFYccd4gz6eOUNlsw== dependencies: tslib "^2.3.1" "@aws-sdk/types@^3.222.0": - version "3.271.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.271.0.tgz#151086e6a3d2cf01fe627f150e3056bffecf76c7" - integrity sha512-w4oNKEaBul7eh2IM97c89xaH9Ti8+e+u/Rc1ZkgNtpnfOpDUU2t3ugJ91ihGH+xtASQCWJTopTDfX5CuKsQQtQ== + version "3.292.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.292.0.tgz#54aa7347123116ac368f08df5e02954207328c63" + integrity sha512-1teYAY2M73UXZxMAxqZxVS2qwXjQh0OWtt7qyLfha0TtIk/fZ1hRwFgxbDCHUFcdNBSOSbKH/ESor90KROXLCQ== dependencies: tslib "^2.3.1" -"@aws-sdk/url-parser@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.254.0.tgz#4b1fd769a4c546bd6571181feac2be1e8feaacab" - integrity sha512-Za0JGUa9p5GQ8t2tVtKaRSjLUxrmEdnBlUiZ2zKm86wFxgQnjbMwzD3mvyJ5OaVsXScU5vzc3CXHIXSvS7h7Ng== +"@aws-sdk/url-parser@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.290.0.tgz#de41d3e0f8178a01b3424c8163b6868d4210a2aa" + integrity sha512-19EAlyH4LyNMbAROE6KSuhFKhOwl67kciDavPjS8gFiHr6slon3oqXfz10+uzKf/pJKuY6qOpkUb9h7LnF4bFQ== dependencies: - "@aws-sdk/querystring-parser" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/querystring-parser" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" "@aws-sdk/util-arn-parser@3.208.0": @@ -1109,43 +1099,43 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/util-defaults-mode-browser@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.254.0.tgz#6baa31a48521f2758f919130e0bd5180b179c7ad" - integrity sha512-vj/s+BuqNKTHN9bsZ/HY7vpBWbo3F+4c3/ZoKSZa5Jc7jAuGCbx3zWwHdJFDgvbqLvsTBw80Q9d/CDy9pKj/tQ== +"@aws-sdk/util-defaults-mode-browser@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.290.0.tgz#2abe74057eaf49c14c9557b2181c806a1d91bfd1" + integrity sha512-8Mt6/OA465uw1wSA/LCCd+6IjeIUTAbg2GiqfSBCBMNJNuqPwPXuWVjg6kBd1eEChyEtAuoLTygMefaBywg4HQ== dependencies: - "@aws-sdk/property-provider" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/property-provider" "3.290.0" + "@aws-sdk/types" "3.290.0" bowser "^2.11.0" tslib "^2.3.1" -"@aws-sdk/util-defaults-mode-node@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.254.0.tgz#e92b3196ddc93fe5851b584aa5ac7fb22215d0ba" - integrity sha512-gvD2+Uf60c2BgUYv2d6R4dSpO/CbvybqblgF8lKZCsHkDWzfEdPv9nlJgUWM1cuMKQ0hBZ3cL3ilOwVKRVPyiQ== - dependencies: - "@aws-sdk/config-resolver" "3.254.0" - "@aws-sdk/credential-provider-imds" "3.254.0" - "@aws-sdk/node-config-provider" "3.254.0" - "@aws-sdk/property-provider" "3.254.0" - "@aws-sdk/types" "3.254.0" +"@aws-sdk/util-defaults-mode-node@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.290.0.tgz#0efff7937241f89dd70f1acf6f7697181352400f" + integrity sha512-9c0jS7w1aZxfKkFXlTjp80QaKYKnutMmlsfP+/YXN9+s3yvwFcnsENMTNg5YVvkZa9e+Rhw/ySxVKTEJ7n/SOA== + dependencies: + "@aws-sdk/config-resolver" "3.290.0" + "@aws-sdk/credential-provider-imds" "3.290.0" + "@aws-sdk/node-config-provider" "3.290.0" + "@aws-sdk/property-provider" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/util-endpoints@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.254.0.tgz#b21eed05e60210ac533ed96784d039015295895d" - integrity sha512-BzBIOnhVrs4RFTpGZErZfAV1VhqWglxn047VYijmCQe8Aejq4mJAaepSwHYar++XC0+pduD5YO8IidW8z/1vQQ== +"@aws-sdk/util-endpoints@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.290.0.tgz#ab2c56b2814614c40c045ea2b4098ab03af24c6a" + integrity sha512-nDdSyWdxYEPE84qABQKasIFhm6oWjhiyM92g8zsHTqzrn67a4caA72FTL6cztgJOEd5GWvHn6r1BnRVhkG68Qw== dependencies: - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" -"@aws-sdk/util-format-url@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-format-url/-/util-format-url-3.254.0.tgz#c50d4d5d33a652535b67da6a7c27e20a128dbc51" - integrity sha512-WOAF5KMhmMnk93AoryvXHYlvO4V8kjBEY9YfZ+ppQZp/K1ITwbm2xz2PQ/mWNywSDV0H6yX6f+a9v/gx3CcLEw== +"@aws-sdk/util-format-url@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-format-url/-/util-format-url-3.290.0.tgz#af9372b91576998d1e93af23caa45177490c0ad2" + integrity sha512-MHeiyc8HIYvjeom0DF0OimBQ8oYvIqsG1wyfwDoFFA5A3gM6r8cl3VUg+t/KOXL+A85Ax4iALuG2ViT6zteKhg== dependencies: - "@aws-sdk/querystring-builder" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/querystring-builder" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" "@aws-sdk/util-hex-encoding@3.201.0": @@ -1156,46 +1146,46 @@ tslib "^2.3.1" "@aws-sdk/util-locate-window@^3.0.0": - version "3.208.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz#0f598fc238a1256e4bcb64d01459f03a922dd4c3" - integrity sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg== + version "3.292.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.292.0.tgz#cba0911be4fdf1db31a0b379cc6229a5a0ba1ae0" + integrity sha512-6xnFJXZI9pKw5lQCDvuWA5PnOaUtNRKWwdxvGkkLx5orboFaoVMS6zowjSQxwVNRjW82u6dYNkhmj9mZ8VSjWg== dependencies: tslib "^2.3.1" -"@aws-sdk/util-middleware@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.254.0.tgz#17e8c578c3905753aeb44289885d48fc6e16c864" - integrity sha512-gn7vInNTRBo2QatOB+uU99JwV53wf/zlTUnUK0qOuebtSDLMdiO+msiMi2ctz9vMIrtc2XMXNQro1aE0aUPy4w== +"@aws-sdk/util-middleware@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.290.0.tgz#3353405daddd38ec98242abee0fc946c76976df1" + integrity sha512-lXGM9YSqwZgCeEPltc++jiGyZ/FLuh62IjrWSIVSL/FvkL6D8KSKNBd7Ab/KDDu5jt4iP5UZ4k3SGVk6monUZg== dependencies: tslib "^2.3.1" -"@aws-sdk/util-retry@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-retry/-/util-retry-3.254.0.tgz#c4cdf051439b4c12d1865dd2944b9eeb1d489bcc" - integrity sha512-IVA4wAOJpVssEIbJmeq1fdDYvrkOqYFK9Pz4tERmMz33003fyY92dU468Lulw8MnsSALYiwWUoWSFg9L5RCTug== +"@aws-sdk/util-retry@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-retry/-/util-retry-3.290.0.tgz#ea521ae287b34fdd943f4e2d87d69a9aa7006fc7" + integrity sha512-UjyUEguu2upaBvDJkeSUQPE4ryBTA7JhPyl6M7XA6rFSRtU5+1NI8KknSNw46buviNit0Yu0E6TzxNQyS70hKA== dependencies: - "@aws-sdk/service-error-classification" "3.254.0" + "@aws-sdk/service-error-classification" "3.290.0" tslib "^2.3.1" -"@aws-sdk/util-stream-browser@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-browser/-/util-stream-browser-3.254.0.tgz#27c67e9c2d5948d4903c9fc6eee2bea7aa6b99bf" - integrity sha512-ayfjKdKpd6x0M0tkdipKfIWvoR7/tKLca/mFv2KX896jTSRBKZ6rtArvU7OGmm4oC0CCBlMfwjpjiBOZJHKUyA== +"@aws-sdk/util-stream-browser@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-browser/-/util-stream-browser-3.290.0.tgz#33b7098055285dd04a24b4b02429f794dd543989" + integrity sha512-mDfGVSZbostSM+kQPEeiDB57mt2oMywtuOtLmv8+iXRZmCBwaHrHZLWguEV+hy/DSKD0e9yAzPja6PbI0/maNA== dependencies: - "@aws-sdk/fetch-http-handler" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/fetch-http-handler" "3.290.0" + "@aws-sdk/types" "3.290.0" "@aws-sdk/util-base64" "3.208.0" "@aws-sdk/util-hex-encoding" "3.201.0" - "@aws-sdk/util-utf8-browser" "3.188.0" + "@aws-sdk/util-utf8" "3.254.0" tslib "^2.3.1" -"@aws-sdk/util-stream-node@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-node/-/util-stream-node-3.254.0.tgz#d0756a366dd2df4d9880e0118f0792ee51ba7ae9" - integrity sha512-Kfa2yKEQyoI66mHvRbU2qdFlvyet4awwgT9ygZ93U/MoxHQMDyJQXdbI6sodG5Lxo76ejyh+pR7zzGa6GgWixA== +"@aws-sdk/util-stream-node@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-node/-/util-stream-node-3.290.0.tgz#c122a5339aa294ca3b40c91d2fb6dde1504ee95c" + integrity sha512-LUrJAt5knKvkJa3ZjOvAFf5bDKqT3DXM8l+KIYSwj9WM7a4rX+gAACILWQZLNvlzQAy+KEjPfhT7p0LZf6Os2w== dependencies: - "@aws-sdk/node-http-handler" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/node-http-handler" "3.290.0" + "@aws-sdk/types" "3.290.0" "@aws-sdk/util-buffer-from" "3.208.0" tslib "^2.3.1" @@ -1206,29 +1196,22 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/util-user-agent-browser@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.254.0.tgz#a1e7783d4210eb6f4cfda3e6c9403e4a565f8244" - integrity sha512-2HvwH8l7ln4qTDsU3rgH9NvSSo5qhX+2Lenb6XvNnIMkL4r/tPhNIaGKtoQRfpzLH378Mm9XEQnJM5UXFRWuTA== +"@aws-sdk/util-user-agent-browser@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.290.0.tgz#e0b7585808fd5bd9be20057b41d3a4c2a4dd8f75" + integrity sha512-I+B5ooKRYQ9jHcdg7TOf20LlTfcBUlCJQ2AAqI1ukmJqal22OD1CtC1E+/XbplpU5mxRs4s2UQbxNaPA0yIrBA== dependencies: - "@aws-sdk/types" "3.254.0" + "@aws-sdk/types" "3.290.0" bowser "^2.11.0" tslib "^2.3.1" -"@aws-sdk/util-user-agent-node@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.254.0.tgz#044de697c3e7d151ecb80ccef529fec345e4c440" - integrity sha512-6nc9bmRP+2JqbBJ5oRZZRU8l35X3VcWF5j8XvmamWjIABsanc6Gv6NV4qAa3imPjIyWNiShZn/YkTBYs1exsdg== - dependencies: - "@aws-sdk/node-config-provider" "3.254.0" - "@aws-sdk/types" "3.254.0" - tslib "^2.3.1" - -"@aws-sdk/util-utf8-browser@3.188.0": - version "3.188.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz#484762bd600401350e148277731d6744a4a92225" - integrity sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q== +"@aws-sdk/util-user-agent-node@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.290.0.tgz#94dec6201da61f6b56cbb40b2768fa95addd91a3" + integrity sha512-7juKgEMqpa0il6jZmiBKGDJslM4UIKX1bvhlqkSvvPfV3zFdfi0V2xavh68GfelWduBBkYLGRjsLunqzw64f8A== dependencies: + "@aws-sdk/node-config-provider" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" "@aws-sdk/util-utf8-browser@^3.0.0": @@ -1238,14 +1221,6 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/util-utf8-node@3.208.0": - version "3.208.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz#eba17de0f92f87b98481c2e2d0ceaa05c7994d67" - integrity sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ== - dependencies: - "@aws-sdk/util-buffer-from" "3.208.0" - tslib "^2.3.1" - "@aws-sdk/util-utf8@3.254.0": version "3.254.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz#909af9c6549833a9a9bf77004b7484bfc96b2c35" @@ -1254,13 +1229,13 @@ "@aws-sdk/util-buffer-from" "3.208.0" tslib "^2.3.1" -"@aws-sdk/util-waiter@3.254.0": - version "3.254.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.254.0.tgz#b506286e9df90dcc02aaf99c958f57f99435a316" - integrity sha512-A9w23+tat+xkYdV1GprATue3JD8TzcdRxXsNOh4n33L3Xd6l3blXxPJjgi1wAVAeXy7Q8Lku7rsAc+YgKZ059w== +"@aws-sdk/util-waiter@3.290.0": + version "3.290.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.290.0.tgz#48ed39903578ac186f99c7875243090a0ed86300" + integrity sha512-8dD1CN5uKAXvRybwk+U6XHPirmVFkHyqu/n20tKB7M/cSoSEM/S5WmaaAqyW3Y0Kv+RIRGcQJb4goYqm7pfZkA== dependencies: - "@aws-sdk/abort-controller" "3.254.0" - "@aws-sdk/types" "3.254.0" + "@aws-sdk/abort-controller" "3.290.0" + "@aws-sdk/types" "3.290.0" tslib "^2.3.1" "@aws-sdk/xml-builder@3.201.0": @@ -1278,38 +1253,39 @@ "@babel/highlight" "^7.18.6" "@babel/compat-data@^7.20.5": - version "7.20.14" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.14.tgz#4106fc8b755f3e3ee0a0a7c27dde5de1d2b2baf8" - integrity sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" + integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== "@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" - integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.3.tgz#cf1c877284a469da5d1ce1d1e53665253fae712e" + integrity sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw== dependencies: - "@ampproject/remapping" "^2.1.0" + "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" + "@babel/generator" "^7.21.3" "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helpers" "^7.20.7" - "@babel/parser" "^7.20.7" + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.3" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.12" - "@babel/types" "^7.20.7" + "@babel/traverse" "^7.21.3" + "@babel/types" "^7.21.3" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@^7.20.7", "@babel/generator@^7.7.2": - version "7.20.14" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce" - integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== +"@babel/generator@^7.21.3", "@babel/generator@^7.7.2": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.3.tgz#232359d0874b392df04045d72ce2fd9bb5045fce" + integrity sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA== dependencies: - "@babel/types" "^7.20.7" + "@babel/types" "^7.21.3" "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" "@babel/helper-compilation-targets@^7.20.7": @@ -1328,13 +1304,13 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== -"@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== +"@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" @@ -1350,10 +1326,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" - integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== +"@babel/helper-module-transforms@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" @@ -1361,8 +1337,8 @@ "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.10" - "@babel/types" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0": version "7.20.2" @@ -1394,18 +1370,18 @@ integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== "@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== -"@babel/helpers@^7.20.7": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.13.tgz#e3cb731fb70dc5337134cadc24cbbad31cc87ad2" - integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg== +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== dependencies: "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.13" - "@babel/types" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" "@babel/highlight@^7.18.6": version "7.18.6" @@ -1416,10 +1392,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.13", "@babel/parser@^7.20.7": - version "7.20.15" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" - integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.3.tgz#1d285d67a19162ff9daa358d4cb41d50c06220b3" + integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -1520,14 +1496,14 @@ "@babel/helper-plugin-utils" "^7.19.0" "@babel/runtime-corejs3@^7.14.9": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.13.tgz#ad012857db412ab0b5ccf184b67be2cfcc2a1dcf" - integrity sha512-p39/6rmY9uvlzRiLZBIB3G9/EBr66LBMcYm7fIDeSBNdRjF2AGD3rFZucUyAgGHC2N+7DdLvVi33uTjSE44FIw== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz#6e4939d9d9789ff63e2dc58e88f13a3913a24eba" + integrity sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw== dependencies: core-js-pure "^3.25.1" regenerator-runtime "^0.13.11" -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": +"@babel/template@^7.20.7", "@babel/template@^7.3.3": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== @@ -1536,26 +1512,26 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.7.2": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" - integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== +"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.3", "@babel/traverse@^7.7.2": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.3.tgz#4747c5e7903d224be71f90788b06798331896f67" + integrity sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" + "@babel/generator" "^7.21.3" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" + "@babel/helper-function-name" "^7.21.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.13" - "@babel/types" "^7.20.7" + "@babel/parser" "^7.21.3" + "@babel/types" "^7.21.3" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" - integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== +"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.3", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.3.tgz#4865a5357ce40f64e3400b0f3b737dc6d4f64d05" + integrity sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg== dependencies: "@babel/helper-string-parser" "^7.19.4" "@babel/helper-validator-identifier" "^7.19.1" @@ -1598,14 +1574,26 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@eslint/eslintrc@^1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" - integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== +"@eslint-community/eslint-utils@^4.2.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz#a556790523a351b4e47e9d385f47265eaaf9780a" + integrity sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.4.0.tgz#3e61c564fcd6b921cb789838631c5ee44df09403" + integrity sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ== + +"@eslint/eslintrc@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.1.tgz#7888fe7ec8f21bc26d646dbd2c11cd776e21192d" + integrity sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.4.0" + espree "^9.5.0" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -1613,6 +1601,11 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/js@8.36.0": + version "8.36.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.36.0.tgz#9837f768c03a1e4a30bd304a64fb8844f0e72efe" + integrity sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg== + "@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" @@ -1668,61 +1661,61 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.4.3.tgz#1f25a99f7f860e4c46423b5b1038262466fadde1" - integrity sha512-W/o/34+wQuXlgqlPYTansOSiBnuxrTv61dEVkA6HNmpcgHLUjfaUbdqt6oVvOzaawwo9IdW9QOtMgQ1ScSZC4A== +"@jest/console@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" + integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== dependencies: - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^29.4.3" - jest-util "^29.4.3" + jest-message-util "^29.5.0" + jest-util "^29.5.0" slash "^3.0.0" -"@jest/core@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.4.3.tgz#829dd65bffdb490de5b0f69e97de8e3b5eadd94b" - integrity sha512-56QvBq60fS4SPZCuM7T+7scNrkGIe7Mr6PVIXUpu48ouvRaWOFqRPV91eifvFM0ay2HmfswXiGf97NGUN5KofQ== - dependencies: - "@jest/console" "^29.4.3" - "@jest/reporters" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/transform" "^29.4.3" - "@jest/types" "^29.4.3" +"@jest/core@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" + integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/reporters" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^29.4.3" - jest-config "^29.4.3" - jest-haste-map "^29.4.3" - jest-message-util "^29.4.3" + jest-changed-files "^29.5.0" + jest-config "^29.5.0" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" jest-regex-util "^29.4.3" - jest-resolve "^29.4.3" - jest-resolve-dependencies "^29.4.3" - jest-runner "^29.4.3" - jest-runtime "^29.4.3" - jest-snapshot "^29.4.3" - jest-util "^29.4.3" - jest-validate "^29.4.3" - jest-watcher "^29.4.3" + jest-resolve "^29.5.0" + jest-resolve-dependencies "^29.5.0" + jest-runner "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + jest-watcher "^29.5.0" micromatch "^4.0.4" - pretty-format "^29.4.3" + pretty-format "^29.5.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.4.3.tgz#9fe2f3169c3b33815dc4bd3960a064a83eba6548" - integrity sha512-dq5S6408IxIa+lr54zeqce+QgI+CJT4nmmA+1yzFgtcsGK8c/EyiUb9XQOgz3BMKrRDfKseeOaxj2eO8LlD3lA== +"@jest/environment@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" + integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== dependencies: - "@jest/fake-timers" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" - jest-mock "^29.4.3" + jest-mock "^29.5.0" "@jest/expect-utils@29.4.1": version "29.4.1" @@ -1731,53 +1724,53 @@ dependencies: jest-get-type "^29.2.0" -"@jest/expect-utils@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.4.3.tgz#95ce4df62952f071bcd618225ac7c47eaa81431e" - integrity sha512-/6JWbkxHOP8EoS8jeeTd9dTfc9Uawi+43oLKHfp6zzux3U2hqOOVnV3ai4RpDYHOccL6g+5nrxpoc8DmJxtXVQ== +"@jest/expect-utils@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" + integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== dependencies: jest-get-type "^29.4.3" -"@jest/expect@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.4.3.tgz#d31a28492e45a6bcd0f204a81f783fe717045c6e" - integrity sha512-iktRU/YsxEtumI9zsPctYUk7ptpC+AVLLk1Ax3AsA4g1C+8OOnKDkIQBDHtD5hA/+VtgMd5AWI5gNlcAlt2vxQ== +"@jest/expect@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" + integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== dependencies: - expect "^29.4.3" - jest-snapshot "^29.4.3" + expect "^29.5.0" + jest-snapshot "^29.5.0" -"@jest/fake-timers@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.4.3.tgz#31e982638c60fa657d310d4b9d24e023064027b0" - integrity sha512-4Hote2MGcCTWSD2gwl0dwbCpBRHhE6olYEuTj8FMowdg3oQWNKr2YuxenPQYZ7+PfqPY1k98wKDU4Z+Hvd4Tiw== +"@jest/fake-timers@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" + integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== dependencies: - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.4.3" - jest-mock "^29.4.3" - jest-util "^29.4.3" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-util "^29.5.0" -"@jest/globals@29.4.3", "@jest/globals@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.4.3.tgz#63a2c4200d11bc6d46f12bbe25b07f771fce9279" - integrity sha512-8BQ/5EzfOLG7AaMcDh7yFCbfRLtsc+09E1RQmRBI4D6QQk4m6NSK/MXo+3bJrBN0yU8A2/VIcqhvsOLFmziioA== +"@jest/globals@29.5.0", "@jest/globals@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" + integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== dependencies: - "@jest/environment" "^29.4.3" - "@jest/expect" "^29.4.3" - "@jest/types" "^29.4.3" - jest-mock "^29.4.3" + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/types" "^29.5.0" + jest-mock "^29.5.0" -"@jest/reporters@29.4.3", "@jest/reporters@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.4.3.tgz#0a68a0c0f20554760cc2e5443177a0018969e353" - integrity sha512-sr2I7BmOjJhyqj9ANC6CTLsL4emMoka7HkQpcoMRlhCbQJjz2zsRzw0BDPiPyEFDXAbxKgGFYuQZiSJ1Y6YoTg== +"@jest/reporters@29.5.0", "@jest/reporters@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" + integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/transform" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/console" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@jridgewell/trace-mapping" "^0.3.15" "@types/node" "*" chalk "^4.0.0" @@ -1790,21 +1783,14 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.4.3" - jest-util "^29.4.3" - jest-worker "^29.4.3" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + jest-worker "^29.5.0" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" v8-to-istanbul "^9.0.1" -"@jest/schemas@^29.4.2": - version "29.4.2" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.2.tgz#cf7cfe97c5649f518452b176c47ed07486270fc1" - integrity sha512-ZrGzGfh31NtdVH8tn0mgJw4khQuNHiKqdzJAFbCaERbyCP9tHlxWuL/mnMu8P7e/+k4puWjI1NOzi/sFsjce/g== - dependencies: - "@sinclair/typebox" "^0.25.16" - "@jest/schemas@^29.4.3": version "29.4.3" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" @@ -1821,63 +1807,51 @@ callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@29.4.3", "@jest/test-result@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.4.3.tgz#e13d973d16c8c7cc0c597082d5f3b9e7f796ccb8" - integrity sha512-Oi4u9NfBolMq9MASPwuWTlC5WvmNRwI4S8YrQg5R5Gi47DYlBe3sh7ILTqi/LGrK1XUE4XY9KZcQJTH1WJCLLA== +"@jest/test-result@29.5.0", "@jest/test-result@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" + integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== dependencies: - "@jest/console" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/console" "^29.5.0" + "@jest/types" "^29.5.0" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.4.3.tgz#0862e876a22993385a0f3e7ea1cc126f208a2898" - integrity sha512-yi/t2nES4GB4G0mjLc0RInCq/cNr9dNwJxcGg8sslajua5Kb4kmozAc+qPLzplhBgfw1vLItbjyHzUN92UXicw== +"@jest/test-sequencer@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" + integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== dependencies: - "@jest/test-result" "^29.4.3" + "@jest/test-result" "^29.5.0" graceful-fs "^4.2.9" - jest-haste-map "^29.4.3" + jest-haste-map "^29.5.0" slash "^3.0.0" -"@jest/transform@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.4.3.tgz#f7d17eac9cb5bb2e1222ea199c7c7e0835e0c037" - integrity sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg== +"@jest/transform@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" + integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" "@jridgewell/trace-mapping" "^0.3.15" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^29.4.3" + jest-haste-map "^29.5.0" jest-regex-util "^29.4.3" - jest-util "^29.4.3" + jest-util "^29.5.0" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/types@^29.4.2": - version "29.4.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.2.tgz#8f724a414b1246b2bfd56ca5225d9e1f39540d82" - integrity sha512-CKlngyGP0fwlgC1BRUtPZSiWLBhyS9dKwKmyGxk8Z6M82LBEGB2aLQSg+U1MyLsU+M7UjnlLllBM2BLWKVm/Uw== - dependencies: - "@jest/schemas" "^29.4.2" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jest/types@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.3.tgz#9069145f4ef09adf10cec1b2901b2d390031431f" - integrity sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA== +"@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== dependencies: "@jest/schemas" "^29.4.3" "@types/istanbul-lib-coverage" "^2.0.0" @@ -1926,7 +1900,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== @@ -2262,33 +2236,33 @@ resolved "https://registry.yarnpkg.com/@openpgp/web-stream-tools/-/web-stream-tools-0.0.13.tgz#f0be50120c152efb11b65df29ab482dc192dbbd7" integrity sha512-VQ0O0lUcD9ilLcMLQMJMgPhp8fDgMd4copd+UhSBGjud0vbI1ONQ3ffAhixEMml/AApLJtqCpd7PJcccPliFSA== -"@opentelemetry/api@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.4.0.tgz#2c91791a9ba6ca0a0f4aaac5e45d58df13639ac8" - integrity sha512-IgMK9i3sFGNUqPMbjABm0G26g0QCKCUBfglhQ7rQq6WcxbKfEHRcmwsoER4hZcuYqJgkYn2OeuoJIv7Jsftp7g== +"@opentelemetry/api@1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.4.1.tgz#ff22eb2e5d476fbc2450a196e40dd243cc20c28f" + integrity sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA== -"@opentelemetry/context-async-hooks@1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.9.1.tgz#2a4809a4d0acccc53dd477d2e79fde76abce6c59" - integrity sha512-HmycxnnIm00gdmxfD5OkDotL15bGqazLYqQJdcv1uNt22OSc5F/a3Paz3yznmf+/gWdPG8nlq/zd9H0mNXJnGg== +"@opentelemetry/context-async-hooks@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.10.0.tgz#6e96e056806b739c315fe8dd0f7b2417070ab244" + integrity sha512-mNITMJZUkbCV2sLnI4vwW6N0r8MUwzYs2rMShEH2ZECHhyYhRINrzf73hDc3YKsvscSTv46F5g1NA2r15FA/hQ== -"@opentelemetry/core@1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.9.1.tgz#e343337e1a7bf30e9a6aef3ef659b9b76379762a" - integrity sha512-6/qon6tw2I8ZaJnHAQUUn4BqhTbTNRS0WP8/bA0ynaX+Uzp/DDbd0NS0Cq6TMlh8+mrlsyqDE7mO50nmv2Yvlg== +"@opentelemetry/core@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.10.0.tgz#12626d19287030a16ec1101f8efcacb5198a89bb" + integrity sha512-H5/mfU3TsEBe/cnnLu3VCkzjqyRARmhxQGsT64KwafxjzkDh+c2Bk4n140Cg/xhgrjK2sFsxbJj6d0xZlVo/OQ== dependencies: - "@opentelemetry/semantic-conventions" "1.9.1" + "@opentelemetry/semantic-conventions" "1.10.0" -"@opentelemetry/exporter-trace-otlp-http@0.35.1": - version "0.35.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.35.1.tgz#9bf988f91fb145b29a051bce8ff5ef85029ca575" - integrity sha512-EJgAsrvscKsqb/GzF1zS74vM+Z/aQRhrFE7hs/1GK1M9bLixaVyMGwg2pxz1wdYdjxS1mqpHMhXU+VvMvFCw1w== +"@opentelemetry/exporter-trace-otlp-http@0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.36.0.tgz#9bea6e6db840f23a4ce96ad47fe1129fb625c9d1" + integrity sha512-BrM2Fkgxuc7mZExPCfdeD2WqGOGAGAyHZIXyp1mIfesFp58TaHo7EI8fYFOkY+OS2mLkKrGx5M7vzJO8bLP/cg== dependencies: - "@opentelemetry/core" "1.9.1" - "@opentelemetry/otlp-exporter-base" "0.35.1" - "@opentelemetry/otlp-transformer" "0.35.1" - "@opentelemetry/resources" "1.9.1" - "@opentelemetry/sdk-trace-base" "1.9.1" + "@opentelemetry/core" "1.10.0" + "@opentelemetry/otlp-exporter-base" "0.36.0" + "@opentelemetry/otlp-transformer" "0.36.0" + "@opentelemetry/resources" "1.10.0" + "@opentelemetry/sdk-trace-base" "1.10.0" "@opentelemetry/instrumentation-bunyan@0.31.1": version "0.31.1" @@ -2298,17 +2272,26 @@ "@opentelemetry/instrumentation" "^0.35.1" "@types/bunyan" "1.8.7" -"@opentelemetry/instrumentation-http@0.35.1": - version "0.35.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-http/-/instrumentation-http-0.35.1.tgz#8a62e5ed737b51596a6799ecf4d70fe6ef1c26c4" - integrity sha512-tH92LznX5pcxpuTSb6A662IdldlMk8QTtneDN66h4nIT9ch98Gtu68GSSKjMoTR25GzH3opvPC9mX2xJamxMJw== +"@opentelemetry/instrumentation-http@0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-http/-/instrumentation-http-0.36.0.tgz#37103d8bbb3aa02b88973258495d7ea8c6948e2c" + integrity sha512-e7aEx/wwQzdfLShkhr4zvop00cIG4a0gfAnyI7Btt7otrTq+FqDEEh54CSdc1bIP0i1KgPnWypaMrnx6gVJ1Pw== dependencies: - "@opentelemetry/core" "1.9.1" - "@opentelemetry/instrumentation" "0.35.1" - "@opentelemetry/semantic-conventions" "1.9.1" + "@opentelemetry/core" "1.10.0" + "@opentelemetry/instrumentation" "0.36.0" + "@opentelemetry/semantic-conventions" "1.10.0" semver "^7.3.5" -"@opentelemetry/instrumentation@0.35.1", "@opentelemetry/instrumentation@^0.35.1": +"@opentelemetry/instrumentation@0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.36.0.tgz#164cf6df250d77a5e293e2402719a38149592cc9" + integrity sha512-KQA0zqbUfX8xv6ucqEHxj5bq1H15vijmk1mii8Pz9LKRWa8P8CXSDrMUKRoOQXWO2UILPUyAn5htoTHnE9/HPg== + dependencies: + require-in-the-middle "^6.0.0" + semver "^7.3.2" + shimmer "^1.2.1" + +"@opentelemetry/instrumentation@^0.35.1": version "0.35.1" resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.35.1.tgz#065bdbc4771137347e648eb4c6c6de6e9e97e4d1" integrity sha512-EZsvXqxenbRTSNsft6LDcrT4pjAiyZOx3rkDNeqKpwZZe6GmZtsXaZZKuDkJtz9fTjOGjDHjZj9/h80Ya9iIJw== @@ -2317,79 +2300,79 @@ semver "^7.3.2" shimmer "^1.2.1" -"@opentelemetry/otlp-exporter-base@0.35.1": - version "0.35.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.35.1.tgz#535166608d5d36e6c959b2857d01245ee3a916b1" - integrity sha512-Sc0buJIs8CfUeQCL/12vDDjBREgsqHdjboBa/kPQDgMf008OBJSM02Ijj6T1TH+QVHl/VHBBEVJF+FTf0EH9Vg== +"@opentelemetry/otlp-exporter-base@0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.36.0.tgz#c46ecd84ed6efd959f2d7b2ae6bf3441914dabb7" + integrity sha512-ImlnEd0LUpB5/eKCtvYG4HPvKqxxR+t6QBb0DBTaXRAXJaY+3p5w1Jw1lH/bdDtYp1HY6E4NiBfb4GI9qJNznA== dependencies: - "@opentelemetry/core" "1.9.1" + "@opentelemetry/core" "1.10.0" -"@opentelemetry/otlp-transformer@0.35.1": - version "0.35.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.35.1.tgz#d4333b71324b83dbb1b0b3a4cfd769b3e214c6f9" - integrity sha512-c0HXcJ49MKoWSaA49J8PXlVx48CeEFpL0odP6KBkVT+Bw6kAe8JlI3mIezyN05VCDJGtS2I5E6WEsE+DJL1t9A== +"@opentelemetry/otlp-transformer@0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/otlp-transformer/-/otlp-transformer-0.36.0.tgz#18c17f7842b2df37989b1f65a2fb4bf87fb9fba6" + integrity sha512-abZV+g6SeX2C6RvJTaTa42Ldj52Y1Ho7J2F2deaVPT7goZ3IQ2LrvXRIiG/Trp4iTuQcryVl6tH6RDZk51PQBw== dependencies: - "@opentelemetry/core" "1.9.1" - "@opentelemetry/resources" "1.9.1" - "@opentelemetry/sdk-metrics" "1.9.1" - "@opentelemetry/sdk-trace-base" "1.9.1" + "@opentelemetry/core" "1.10.0" + "@opentelemetry/resources" "1.10.0" + "@opentelemetry/sdk-metrics" "1.10.0" + "@opentelemetry/sdk-trace-base" "1.10.0" -"@opentelemetry/propagator-b3@1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-b3/-/propagator-b3-1.9.1.tgz#40a538e91b6e96c07663a6622a102cd6d8c7963a" - integrity sha512-V+/ufHnZSr0YlbNhPg4PIQAZOhP61fVwL0JZJ6qnl9i0jgaZBSAtV99ZvHMxMy0Z1tf+oGj1Hk+S6jRRXL+j1Q== +"@opentelemetry/propagator-b3@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-b3/-/propagator-b3-1.10.0.tgz#bc98f20548634220ed29f0f3083347e0feb57a90" + integrity sha512-FPj9US9RXW+B/sN2Jf7gpEvJ8RAtO+6iM2fYfg4EtdridyFXXYaLC73EsIvOr7CveU7P3yG+jlhZweoPhIapfw== dependencies: - "@opentelemetry/core" "1.9.1" + "@opentelemetry/core" "1.10.0" -"@opentelemetry/propagator-jaeger@1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.9.1.tgz#bb86a81b22c3d1a89dd5952d4a97441de41b6791" - integrity sha512-xjG5HnOgu/1f9+GphWr8lqxaU51iFL9HgFdnSQBSFqhM2OeMuzpFt6jmkpZJBAK3oqQ9BG52fHfCdYlw3GOkVQ== +"@opentelemetry/propagator-jaeger@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.10.0.tgz#15bf1c4f20e751b85f5321bb33ae2fd4a738bd75" + integrity sha512-bA6+RiEKmONAcN4GR79gvnqn005/td+8e6GsNbJZOP3pHekQHNfekuXAiN5mrQlF+1IVbS0x/UylC9g871z8VA== dependencies: - "@opentelemetry/core" "1.9.1" + "@opentelemetry/core" "1.10.0" -"@opentelemetry/resources@1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.9.1.tgz#5ad3d80ba968a3a0e56498ce4bc82a6a01f2682f" - integrity sha512-VqBGbnAfubI+l+yrtYxeLyOoL358JK57btPMJDd3TCOV3mV5TNBmzvOfmesM4NeTyXuGJByd3XvOHvFezLn3rQ== +"@opentelemetry/resources@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.10.0.tgz#79e8388899a79e13a830b3bd776cc8489a107b9b" + integrity sha512-bh4auHOdS0/cwSgviCPbkItLwLZRWCZKp/ns2soVwlWQMJH36FIHbcYJf7G9+Rthlc6u163VhUefho+eDrPVeA== dependencies: - "@opentelemetry/core" "1.9.1" - "@opentelemetry/semantic-conventions" "1.9.1" + "@opentelemetry/core" "1.10.0" + "@opentelemetry/semantic-conventions" "1.10.0" -"@opentelemetry/sdk-metrics@1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.9.1.tgz#babc162a81df9884c16b1e67c2dd26ab478f3080" - integrity sha512-AyhKDcA8NuV7o1+9KvzRMxNbATJ8AcrutKilJ6hWSo9R5utnzxgffV4y+Hp4mJn84iXxkv+CBb99GOJ2A5OMzA== +"@opentelemetry/sdk-metrics@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.10.0.tgz#627f164036ad053551b3e75447adf9a902b066aa" + integrity sha512-vOB3khvj894ppOwafNqKNavpChZYR2S2IZyy8PmL0DwNgFPGYwkWxZkv7YJduBNzcCd+Ao+ug93jdSFFhnpIhQ== dependencies: - "@opentelemetry/core" "1.9.1" - "@opentelemetry/resources" "1.9.1" + "@opentelemetry/core" "1.10.0" + "@opentelemetry/resources" "1.10.0" lodash.merge "4.6.2" -"@opentelemetry/sdk-trace-base@1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.9.1.tgz#c349491b432a7e0ae7316f0b48b2d454d79d2b84" - integrity sha512-Y9gC5M1efhDLYHeeo2MWcDDMmR40z6QpqcWnPCm4Dmh+RHAMf4dnEBBntIe1dDpor686kyU6JV1D29ih1lZpsQ== - dependencies: - "@opentelemetry/core" "1.9.1" - "@opentelemetry/resources" "1.9.1" - "@opentelemetry/semantic-conventions" "1.9.1" - -"@opentelemetry/sdk-trace-node@1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.9.1.tgz#1fb067b30997145cb40d81b3859192cfc3e0e950" - integrity sha512-wwwCM2G/A0LY3oPLDyO31uRnm9EMNkhhjSxL9cmkK2kM+F915em8K0pXkPWFNGWu0OHkGALWYwH6Oz0P5nVcHA== - dependencies: - "@opentelemetry/context-async-hooks" "1.9.1" - "@opentelemetry/core" "1.9.1" - "@opentelemetry/propagator-b3" "1.9.1" - "@opentelemetry/propagator-jaeger" "1.9.1" - "@opentelemetry/sdk-trace-base" "1.9.1" +"@opentelemetry/sdk-trace-base@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.10.0.tgz#abbffa0ae39234f4c441357edc3f4da45dc73ef5" + integrity sha512-X4rRShtVQ893LCU4GNKS1TKFua9nSjVmo0VJvigfSFSOmyyOLfiyTWmVL9MKV7Ws0HqLOIWJixJY0x28fw3Tzg== + dependencies: + "@opentelemetry/core" "1.10.0" + "@opentelemetry/resources" "1.10.0" + "@opentelemetry/semantic-conventions" "1.10.0" + +"@opentelemetry/sdk-trace-node@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.10.0.tgz#08dd12780f92c1d68fd22c32aba815d85090197d" + integrity sha512-1mNZgGexVQ09xEuo/bJM3eUPEZSbsNGqMTKPKJtEa4oiB2EYFnUWz+s5bk3ohOzl2kKnZCbiIBIwbqHBX6ggyg== + dependencies: + "@opentelemetry/context-async-hooks" "1.10.0" + "@opentelemetry/core" "1.10.0" + "@opentelemetry/propagator-b3" "1.10.0" + "@opentelemetry/propagator-jaeger" "1.10.0" + "@opentelemetry/sdk-trace-base" "1.10.0" semver "^7.3.5" -"@opentelemetry/semantic-conventions@1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.9.1.tgz#ad3367684a57879392513479e0a436cb2ac46dad" - integrity sha512-oPQdbFDmZvjXk5ZDoBGXG8B4tSB/qW5vQunJWQMFUBp7Xe8O1ByPANueJ+Jzg58esEBegyyxZ7LRmfJr7kFcFg== +"@opentelemetry/semantic-conventions@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.10.0.tgz#2addef53b595c687c133922ecad0e850b9287fc9" + integrity sha512-Mzo5IyrI59YuYWeNoOZRXfUCc3upjmxCmczSm+pUgWprvSNfdOX70SVde84UxmuzU7MF1MEkPXKXTYG3ymRw2w== "@pkgr/utils@^2.3.1": version "2.3.1" @@ -2403,6 +2386,11 @@ tiny-glob "^0.2.9" tslib "^2.4.0" +"@pnpm/config.env-replace@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.0.0.tgz#c76fa65847c9554e88d910f264c2ba9a1575e833" + integrity sha512-ZVPVDi1E8oeXlYqkGRtX0CkzLTwE2zt62bjWaWKaAvI8NZqHzlMvGeSNDpW+JB3+aKanYb4UETJOF1/CxGPemA== + "@pnpm/constants@6.1.0": version "6.1.0" resolved "https://registry.yarnpkg.com/@pnpm/constants/-/constants-6.1.0.tgz#2db43ae0e029095df7959bc640081beae38a631b" @@ -2429,11 +2417,12 @@ dependencies: graceful-fs "4.2.10" -"@pnpm/npm-conf@^1.0.4": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-1.0.5.tgz#3475541fb71d7b6ce68acaaa3392eae9fedf3276" - integrity sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A== +"@pnpm/npm-conf@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.1.0.tgz#1bbecd961a1ea447f209556728e2dcadddb0bca6" + integrity sha512-Oe6ntvgsMTE3hDIqy6sajqHF+MnzJrOF06qC2QSiUEybLL7cp6tjoKUa32gpd9+KPVl4QyMs3E3nsXrx/Vdnlw== dependencies: + "@pnpm/config.env-replace" "^1.0.0" "@pnpm/network.ca-file" "^1.0.1" config-chain "^1.1.11" @@ -2496,10 +2485,10 @@ resolved "https://registry.yarnpkg.com/@redis/bloom/-/bloom-1.2.0.tgz#d3fd6d3c0af3ef92f26767b56414a370c7b63b71" integrity sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg== -"@redis/client@1.5.5": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@redis/client/-/client-1.5.5.tgz#330aa9c2dafe1e2a2aa603619e58095fe33c3a1e" - integrity sha512-fuMnpDYSjT5JXR9rrCW1YWA4L8N/9/uS4ImT3ZEC/hcaQRI1D/9FvwjriRj1UvepIgzZXthFVKMNRzP/LNL7BQ== +"@redis/client@1.5.6": + version "1.5.6" + resolved "https://registry.yarnpkg.com/@redis/client/-/client-1.5.6.tgz#869cc65718d7d5493ef655a71dc40f3bc64a1b28" + integrity sha512-dFD1S6je+A47Lj22jN/upVU2fj4huR7S9APd7/ziUXsIXDL+11GPYti4Suv5y8FuXaN+0ZG4JF+y1houEJ7ToA== dependencies: cluster-key-slot "1.1.2" generic-pool "3.9.0" @@ -2515,10 +2504,10 @@ resolved "https://registry.yarnpkg.com/@redis/json/-/json-1.0.4.tgz#f372b5f93324e6ffb7f16aadcbcb4e5c3d39bda1" integrity sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw== -"@redis/search@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@redis/search/-/search-1.1.1.tgz#f547b76b74f267831d3b368e3d7bba3a6a9e32bd" - integrity sha512-pqCXTc5e7wJJgUuJiC3hBgfoFRoPxYzwn0BEfKgejTM7M/9zP3IpUcqcjgfp8hF+LoV8rHZzcNTz7V+pEIY7LQ== +"@redis/search@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redis/search/-/search-1.1.2.tgz#6a8f66ba90812d39c2457420f859ce8fbd8f3838" + integrity sha512-/cMfstG/fOh/SsE+4/BQGeuH/JJloeWuH+qJzM8dbxuWvdWibWAOAHHCZTMPhV3xIlH4/cUEIA8OV5QnYpaVoA== "@redis/time-series@1.0.4": version "1.0.4" @@ -2535,27 +2524,27 @@ dependencies: "@seald-io/nedb" "^4.0.1" -"@renovatebot/osv-offline@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@renovatebot/osv-offline/-/osv-offline-1.2.1.tgz#660be0bb36e75115be01e35e88c5434232037486" - integrity sha512-qIaG49oXvH9qsafa+0Gn2xdDAqj66GeKIIY7Zt1qydBhpMpiWWF53EKn2Q2b3zXAs8ldVjUtf5Rd8dLyklYSkg== +"@renovatebot/osv-offline@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@renovatebot/osv-offline/-/osv-offline-1.2.2.tgz#7efd34c3f0801a49b3b729280a405a5037570a47" + integrity sha512-LBgZcsH1c9ux+ZbPIm5lOWfmiCXLtmaodWgVUbSlVWe564kMNnDyrOpi2ovFSLKfOlWHMQoixX3qUk0L1oczjA== dependencies: "@octokit/rest" "^19.0.7" "@renovatebot/osv-offline-db" "1.3.2" adm-zip "~0.5.10" fs-extra "^11.1.0" got "^11.8.6" - luxon "^3.2.1" + luxon "^3.3.0" "@renovatebot/pep440@2.1.13": version "2.1.13" resolved "https://registry.yarnpkg.com/@renovatebot/pep440/-/pep440-2.1.13.tgz#d630989b6abf9dd001edc526cf3e821450e6e45d" integrity sha512-PFnG9X7on77Gp9FPdossWfvDL6QTg1MafZP3hdKafo3n6SP89wiyZmjFVaQwlRlE5cEmZQwh11dE8Oos9H2paw== -"@renovatebot/ruby-semver@2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@renovatebot/ruby-semver/-/ruby-semver-2.1.8.tgz#8dd7cf4452c9660a7b8ac07852c53708040c1af0" - integrity sha512-yyCLzrwpKLoFZMwt1Dl52699k/FB68qszrKYWY0HOWc+R3h2SmVkeXZIOChJep3bAEB2UHV42I3u6g1lI1NbGA== +"@renovatebot/ruby-semver@2.1.9": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@renovatebot/ruby-semver/-/ruby-semver-2.1.9.tgz#6edb8232a50d833157b17c8914468d3e301163dd" + integrity sha512-44udvdctC5SCjlPYIcyf7vDARlXE3tVRTfZ6/OHcSNBt5WCfMljP5T7QLekCslHZjXgPoep33TURuOfeLrV3Ag== dependencies: tslib "^2.5.0" @@ -2661,9 +2650,9 @@ read-pkg-up "^7.0.0" "@sinclair/typebox@^0.25.16": - version "0.25.21" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.21.tgz#763b05a4b472c93a8db29b2c3e359d55b29ce272" - integrity sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g== + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== "@sindresorhus/is@4.6.0", "@sindresorhus/is@^4.0.0": version "4.6.0" @@ -2900,15 +2889,15 @@ resolved "https://registry.yarnpkg.com/@types/diff/-/diff-5.0.2.tgz#dd565e0086ccf8bc6522c6ebafd8a3125c91c12b" integrity sha512-uw8eYMIReOwstQ0QKF0sICefSy8cNO/v7gOTiIy9SbwuHyEecJUm7qlgueOO5S1udZ5I/irVydHVwMchgzbKTg== -"@types/emscripten@^1.38.0": +"@types/emscripten@^1.39.6": version "1.39.6" resolved "https://registry.yarnpkg.com/@types/emscripten/-/emscripten-1.39.6.tgz#698b90fe60d44acf93c31064218fbea93fbfd85a" integrity sha512-H90aoynNhhkQP6DRweEjJp5vfUVdIj7tdPLsu7pq89vODD/lcugKfZOsfgwpvM6XUewEp2N5dCg1Uf3Qe55Dcg== -"@types/eslint@8.21.1": - version "8.21.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.21.1.tgz#110b441a210d53ab47795124dbc3e9bb993d1e7c" - integrity sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ== +"@types/eslint@8.21.2": + version "8.21.2" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.21.2.tgz#2b61b43a8b0e66006856a2a4c8e51f6f773ead27" + integrity sha512-EMpxUyystd3uZVByZap1DACsMXvb82ypQnGn89e1Y0a+LYu3JJscUd/gqhRsVFDkaD2MIiWo0MT8EfXr3DGRKw== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -2937,9 +2926,9 @@ integrity sha512-B/SvVZMrLRUI9mOoguNNz58gV8A5PDtcGIaUe5PYmzAUTsIJ+ZAn/ujwBIuGIU3mRHY5SfV9dyWfnhOWtOVh6A== "@types/glob@*": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.0.1.tgz#6e3041640148b7764adf21ce5c7138ad454725b0" - integrity sha512-8bVUjXZvJacUFkJXHdyZ9iH1Eaj5V7I8c4NdH5sQJsdXkqT4CA5Dhb4yb4VE/3asyx4L9ayZr1NIhTsWHczmMw== + version "8.1.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" + integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== dependencies: "@types/minimatch" "^5.1.2" "@types/node" "*" @@ -3098,15 +3087,10 @@ dependencies: "@types/node" "*" -"@types/node@*": - version "18.13.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.13.0.tgz#0400d1e6ce87e9d3032c19eb6c58205b0d3f7850" - integrity sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg== - -"@types/node@16.18.12": - version "16.18.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.12.tgz#e3bfea80e31523fde4292a6118f19ffa24fd6f65" - integrity sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw== +"@types/node@*", "@types/node@18.15.3": + version "18.15.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.3.tgz#f0b991c32cfc6a4e7f3399d6cb4b8cf9a0315014" + integrity sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw== "@types/node@^13.7.0": version "13.13.52" @@ -3234,95 +3218,95 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz#5fb0d43574c2411f16ea80f5fc335b8eaa7b28a8" - integrity sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg== +"@typescript-eslint/eslint-plugin@5.55.0": + version "5.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.55.0.tgz#bc2400c3a23305e8c9a9c04aa40933868aaaeb47" + integrity sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg== dependencies: - "@typescript-eslint/scope-manager" "5.52.0" - "@typescript-eslint/type-utils" "5.52.0" - "@typescript-eslint/utils" "5.52.0" + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.55.0" + "@typescript-eslint/type-utils" "5.55.0" + "@typescript-eslint/utils" "5.55.0" debug "^4.3.4" grapheme-splitter "^1.0.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" - regexpp "^3.2.0" semver "^7.3.7" tsutils "^3.21.0" "@typescript-eslint/experimental-utils@^5.3.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.52.0.tgz#cc79b91ea62f43bb5e9bec2d94a7df513220e9df" - integrity sha512-kd8CRr04mNE3hw4et6+0T0NI5vli2H6dJCGzjX1r12s/FXUehLVadmvo2Nl3DN80YqAh1cVC6zYZAkpmGiVJ5g== + version "5.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.55.0.tgz#ea2dd8737834af3a36b6a7be5bee57f57160c942" + integrity sha512-3ZqXIZhdGyGQAIIGATeMtg7prA6VlyxGtcy5hYIR/3qUqp3t18pWWUYhL9mpsDm7y8F9mr3ISMt83TiqCt7OPQ== dependencies: - "@typescript-eslint/utils" "5.52.0" + "@typescript-eslint/utils" "5.55.0" -"@typescript-eslint/parser@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.52.0.tgz#73c136df6c0133f1d7870de7131ccf356f5be5a4" - integrity sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA== +"@typescript-eslint/parser@5.55.0": + version "5.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.55.0.tgz#8c96a0b6529708ace1dcfa60f5e6aec0f5ed2262" + integrity sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw== dependencies: - "@typescript-eslint/scope-manager" "5.52.0" - "@typescript-eslint/types" "5.52.0" - "@typescript-eslint/typescript-estree" "5.52.0" + "@typescript-eslint/scope-manager" "5.55.0" + "@typescript-eslint/types" "5.55.0" + "@typescript-eslint/typescript-estree" "5.55.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz#a993d89a0556ea16811db48eabd7c5b72dcb83d1" - integrity sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw== +"@typescript-eslint/scope-manager@5.55.0": + version "5.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz#e863bab4d4183ddce79967fe10ceb6c829791210" + integrity sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw== dependencies: - "@typescript-eslint/types" "5.52.0" - "@typescript-eslint/visitor-keys" "5.52.0" + "@typescript-eslint/types" "5.55.0" + "@typescript-eslint/visitor-keys" "5.55.0" -"@typescript-eslint/type-utils@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz#9fd28cd02e6f21f5109e35496df41893f33167aa" - integrity sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw== +"@typescript-eslint/type-utils@5.55.0": + version "5.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.55.0.tgz#74bf0233523f874738677bb73cb58094210e01e9" + integrity sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA== dependencies: - "@typescript-eslint/typescript-estree" "5.52.0" - "@typescript-eslint/utils" "5.52.0" + "@typescript-eslint/typescript-estree" "5.55.0" + "@typescript-eslint/utils" "5.55.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.52.0.tgz#19e9abc6afb5bd37a1a9bea877a1a836c0b3241b" - integrity sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ== +"@typescript-eslint/types@5.55.0": + version "5.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.55.0.tgz#9830f8d3bcbecf59d12f821e5bc6960baaed41fd" + integrity sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug== -"@typescript-eslint/typescript-estree@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz#6408cb3c2ccc01c03c278cb201cf07e73347dfca" - integrity sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ== +"@typescript-eslint/typescript-estree@5.55.0": + version "5.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz#8db7c8e47ecc03d49b05362b8db6f1345ee7b575" + integrity sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ== dependencies: - "@typescript-eslint/types" "5.52.0" - "@typescript-eslint/visitor-keys" "5.52.0" + "@typescript-eslint/types" "5.55.0" + "@typescript-eslint/visitor-keys" "5.55.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.52.0", "@typescript-eslint/utils@^5.10.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.52.0.tgz#b260bb5a8f6b00a0ed51db66bdba4ed5e4845a72" - integrity sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA== +"@typescript-eslint/utils@5.55.0", "@typescript-eslint/utils@^5.10.0": + version "5.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.55.0.tgz#34e97322e7ae5b901e7a870aabb01dad90023341" + integrity sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw== dependencies: + "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.52.0" - "@typescript-eslint/types" "5.52.0" - "@typescript-eslint/typescript-estree" "5.52.0" + "@typescript-eslint/scope-manager" "5.55.0" + "@typescript-eslint/types" "5.55.0" + "@typescript-eslint/typescript-estree" "5.55.0" eslint-scope "^5.1.1" - eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz#e38c971259f44f80cfe49d97dbffa38e3e75030f" - integrity sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA== +"@typescript-eslint/visitor-keys@5.55.0": + version "5.55.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz#01ad414fca8367706d76cdb94adf788dc5b664a2" + integrity sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw== dependencies: - "@typescript-eslint/types" "5.52.0" + "@typescript-eslint/types" "5.55.0" eslint-visitor-keys "^3.3.0" "@yarnpkg/core@3.4.0": @@ -3363,12 +3347,12 @@ tslib "^1.13.0" tunnel "^0.0.6" -"@yarnpkg/fslib@^2.10.1", "@yarnpkg/fslib@^2.5.0", "@yarnpkg/fslib@^2.9.0": - version "2.10.1" - resolved "https://registry.yarnpkg.com/@yarnpkg/fslib/-/fslib-2.10.1.tgz#3ed7e450f1316e535740653c2e8eff2d851c45cb" - integrity sha512-pVMLtOYu87N5y5G2lyPNYTY2JbTco99v7nGFI34Blx01Ct9LmoKVOc91vnLOYIMMljKr1c8xs1O2UamRdMG5Pg== +"@yarnpkg/fslib@^2.10.1", "@yarnpkg/fslib@^2.10.2", "@yarnpkg/fslib@^2.5.0", "@yarnpkg/fslib@^2.9.0": + version "2.10.2" + resolved "https://registry.yarnpkg.com/@yarnpkg/fslib/-/fslib-2.10.2.tgz#16e419a1412084f152e8eec16183a7f80bc73684" + integrity sha512-6WfQrPEV8QVpDPw5kd5s5jsb3QLqwVFSGZy3rEjl3p2FZ3OtIfYcLbFirOxXj2jXiKQDe7XbYsw1WjSf8K94gw== dependencies: - "@yarnpkg/libzip" "^2.2.4" + "@yarnpkg/libzip" "^2.3.0" tslib "^1.13.0" "@yarnpkg/json-proxy@^2.1.1": @@ -3379,12 +3363,12 @@ "@yarnpkg/fslib" "^2.5.0" tslib "^1.13.0" -"@yarnpkg/libzip@^2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@yarnpkg/libzip/-/libzip-2.2.4.tgz#438744efe3b7ae0514f5db1ead130c1df1e685f6" - integrity sha512-QP0vUP+w0d7Jlo7jqTnlRChSnIB/dOF7nJFLD/gsPvFIHsVWLQQuAiolOcXQUD2hezLD1mQd2qb0yOKqPYRcfQ== +"@yarnpkg/libzip@^2.2.4", "@yarnpkg/libzip@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/libzip/-/libzip-2.3.0.tgz#fe1e762e47669f6e2c960fc118436608d834e3be" + integrity sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg== dependencies: - "@types/emscripten" "^1.38.0" + "@types/emscripten" "^1.39.6" tslib "^1.13.0" "@yarnpkg/parsers@2.5.1", "@yarnpkg/parsers@^2.5.1": @@ -3396,12 +3380,12 @@ tslib "^1.13.0" "@yarnpkg/pnp@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/pnp/-/pnp-3.3.0.tgz#78be9a718ec58472154da602133826813b8be34c" - integrity sha512-ZiNfQIodOEatHODe33KNfWph9Db6aPPDMGrrRaAksrKoQhTN6B22CLK2wVPRKYfRiS5UvMd4SMYEUpdXMAAnmg== + version "3.3.1" + resolved "https://registry.yarnpkg.com/@yarnpkg/pnp/-/pnp-3.3.1.tgz#8ce0777f2950cbadc9978ba3bd3407b4b9c2a640" + integrity sha512-iA2IKk2hOQqEBBHBZ3j004mCfzsPGx5PNjgGn8kb6/VMXokX4mhZzPNI/q7ipI0+UaIMeDXvIzwdGL2GSmgsTA== dependencies: "@types/node" "^13.7.0" - "@yarnpkg/fslib" "^2.10.1" + "@yarnpkg/fslib" "^2.10.2" "@yarnpkg/shell@^3.2.5": version "3.2.5" @@ -3458,13 +3442,13 @@ agent-base@6, agent-base@^6.0.2: dependencies: debug "4" -agentkeepalive@4.2.1, agentkeepalive@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" - integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== +agentkeepalive@4.3.0, agentkeepalive@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" + integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== dependencies: debug "^4.1.0" - depd "^1.1.2" + depd "^2.0.0" humanize-ms "^1.2.1" aggregate-error@3.1.0, aggregate-error@^3.0.0: @@ -3599,6 +3583,14 @@ argv-formatter@~1.0.0: resolved "https://registry.yarnpkg.com/argv-formatter/-/argv-formatter-1.0.0.tgz#a0ca0cbc29a5b73e836eebe1cbf6c5e0e4eb82f9" integrity sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw== +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" @@ -3675,10 +3667,10 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -aws-sdk-client-mock@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/aws-sdk-client-mock/-/aws-sdk-client-mock-2.0.1.tgz#c37ec569fa88688d8d88d7a7f028af26d6d2086e" - integrity sha512-Ib/AnI8ZdoIxOBbKSs28TUwJb7FI/AYVYn48PcXx6guk5fBs4GZJJEc+Ci9aImRtVmgO6jHN/6Etz17fr6j3qw== +aws-sdk-client-mock@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/aws-sdk-client-mock/-/aws-sdk-client-mock-2.1.1.tgz#52e5e580fd5654492f9b477153928e373034798e" + integrity sha512-UuxXmICU4nmXTRm2BzLZdXmnyI+5NEBb5McRDkObasXVxXChvLm0Ci/PGENh4sCD+Es64SJiz70mtY48JROk0A== dependencies: "@types/sinon" "^10.0.10" sinon "^14.0.2" @@ -3697,15 +3689,15 @@ azure-devops-node-api@12.0.0: tunnel "0.0.6" typed-rest-client "^1.8.4" -babel-jest@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.4.3.tgz#478b84d430972b277ad67dd631be94abea676792" - integrity sha512-o45Wyn32svZE+LnMVWv/Z4x0SwtLbh4FyGcYtR20kIWd+rdrDZ9Fzq8Ml3MYLD+mZvEdzCjZsCnYZ2jpJyQ+Nw== +babel-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" + integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== dependencies: - "@jest/transform" "^29.4.3" + "@jest/transform" "^29.5.0" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.4.3" + babel-preset-jest "^29.5.0" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -3721,10 +3713,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.3.tgz#ad1dfb5d31940957e00410ef7d9b2aa94b216101" - integrity sha512-mB6q2q3oahKphy5V7CpnNqZOCkxxZ9aokf1eh82Dy3jQmg4xvM1tGrh5y6BQUJh4a3Pj9+eLfwvAZ7VNKg7H8Q== +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -3749,12 +3741,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.4.3.tgz#bb926b66ae253b69c6e3ef87511b8bb5c53c5b52" - integrity sha512-gWx6COtSuma6n9bw+8/F+2PCXrIgxV/D1TJFnp6OyBK2cxPWg0K9p/sriNYeifKjpUkMViWQ09DSWtzJQRETsw== +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== dependencies: - babel-plugin-jest-hoist "^29.4.3" + babel-plugin-jest-hoist "^29.5.0" babel-preset-current-node-syntax "^1.0.0" backslash@^0.2.0: @@ -3991,9 +3983,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001449: - version "1.0.30001452" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001452.tgz#dff7b8bb834b3a91808f0a9ff0453abb1fbba02a" - integrity sha512-Lkp0vFjMkBB3GTpLR8zk4NwW5EdRdnitwYJHDOOKIU85x4ckYCPQ+9WlVvSVClHxVReefkUMtWZH2l9KGlD51w== + version "1.0.30001468" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001468.tgz#0101837c6a4e38e6331104c33dcfb3bdf367a4b7" + integrity sha512-zgAo8D5kbOyUcRAgSmgyuvBkjrGk5CGYG5TYgFdpQv+ywcyEpo1LOWoG8YmoflGnh+V+UsNuKYedsoYs0hzV5A== cardinal@^2.1.1: version "2.1.1" @@ -4011,6 +4003,11 @@ chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@5.2.0, chalk@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" + integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== + chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -4028,11 +4025,6 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" - integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== - changelog-filename-regex@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/changelog-filename-regex/-/changelog-filename-regex-2.0.1.tgz#88944bd89a076fc572c0ab6b4a4f2bc2572ac02d" @@ -4243,11 +4235,6 @@ commander@10.0.0, commander@^10.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.0.tgz#71797971162cd3cf65f0b9d24eb28f8d303acdf1" integrity sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA== -commander@^9.4.1: - version "9.5.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" - integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== - common-ancestor-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" @@ -4357,9 +4344,9 @@ convert-source-map@^2.0.0: integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== core-js-pure@^3.25.1: - version "3.28.0" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.28.0.tgz#4ef2888475b6c856ef6f5aeef8b4f618b76ad048" - integrity sha512-DSOVleA9/v3LNj/vFxAPfUHttKTzrB2RXhAPvR5TPXn4vrra3Z2ssytvRyt8eruJwAfwAiFADEbrjcRdcvPLQQ== + version "3.29.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.29.1.tgz#1be6ca2b8772f6b4df7fc4621743286e676c6162" + integrity sha512-4En6zYVi0i0XlXHVz/bi6l1XDjCqkKRq765NXuX+SnaIatlE96Odt5lMLjdxUiNI1v9OXI5DSLWYPlmTfkTktg== core-util-is@~1.0.0: version "1.0.3" @@ -4367,9 +4354,9 @@ core-util-is@~1.0.0: integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.0.0.tgz#e9feae014eab580f858f8a0288f38997a7bebe97" - integrity sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ== + version "8.1.3" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" + integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== dependencies: import-fresh "^3.2.1" js-yaml "^4.1.0" @@ -4505,11 +4492,16 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@4.3.0, deepmerge@^4.2.2: +deepmerge@4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + defaults@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" @@ -4559,10 +4551,10 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +depd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" @@ -4597,11 +4589,6 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" -diff-sequences@^29.4.2: - version "29.4.2" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.2.tgz#711fe6bd8a5869fe2539cee4a5152425ff671fda" - integrity sha512-R6P0Y6PrsH3n4hUXxL3nns0rbRk6Q33js3ygJBeEpbzLzgcNuJ61+u0RXasFpTKISw99TxUzFnumSnRLsjhLaw== - diff-sequences@^29.4.3: version "29.4.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" @@ -4705,9 +4692,9 @@ editorconfig@1.0.2: semver "^7.3.8" electron-to-chromium@^1.4.284: - version "1.4.295" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.295.tgz#911d5df67542bf7554336142eb302c5ec90bba66" - integrity sha512-lEO94zqf1bDA3aepxwnWoHUjA8sZ+2owgcSZjYQy0+uOSEclJX0VieZC+r+wLpSxUHRd6gG32znTWmr+5iGzFw== + version "1.4.333" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.333.tgz#ebb21f860f8a29923717b06ec0cb54e77ed34c04" + integrity sha512-YyE8+GKyGtPEP1/kpvqsdhD6rA/TP1DUFDN4uiU/YI52NzDxmwHkEb3qjId8hLBa5siJvG0sfC3O66501jMruQ== email-addresses@5.0.0: version "5.0.0" @@ -4814,17 +4801,17 @@ error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.21.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" - integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== + version "1.21.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== dependencies: + array-buffer-byte-length "^1.0.0" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function-bind "^1.1.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.0" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" @@ -4832,8 +4819,8 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: has-property-descriptors "^1.0.0" has-proto "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.4" - is-array-buffer "^3.0.1" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" @@ -4841,11 +4828,12 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: is-string "^1.0.7" is-typed-array "^1.1.10" is-weakref "^1.0.2" - object-inspect "^1.12.2" + object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" regexp.prototype.flags "^1.4.3" safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" string.prototype.trimend "^1.0.6" string.prototype.trimstart "^1.0.6" typed-array-length "^1.0.4" @@ -4907,15 +4895,15 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-prettier@8.6.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz#dec1d29ab728f4fa63061774e1672ac4e363d207" - integrity sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA== +eslint-config-prettier@8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.7.0.tgz#f1cc58a8afebc50980bd53475451df146c13182d" + integrity sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA== -eslint-formatter-gha@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/eslint-formatter-gha/-/eslint-formatter-gha-1.4.1.tgz#e787a68171c5486fb7e8b514224a722a5f59a8ec" - integrity sha512-c2L/p4Xtnzlb3ascN4vERcXTMNPePedxZNRZcKG19DDpViBIG1WLMyMIeC2FSW7yGLBANZNb9N66sV2PDCdIqQ== +eslint-formatter-gha@1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/eslint-formatter-gha/-/eslint-formatter-gha-1.4.2.tgz#95330dbf026a34faf877a5893c210d5e19b40e6c" + integrity sha512-V+i+jdUOAkkCWK0gESohLjYk/fJpgMgE0L6QPGd8b5jtBQlG+MT/zb7yy2/HlqccIkRBYq/brT2rLW2K8H9kqA== dependencies: "@actions/core" "^1.2.6" eslint-formatter-json "^8.0.0" @@ -5025,29 +5013,20 @@ eslint-scope@^7.1.1: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - eslint-visitor-keys@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@8.34.0: - version "8.34.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.34.0.tgz#fe0ab0ef478104c1f9ebc5537e303d25a8fb22d6" - integrity sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg== +eslint@8.36.0: + version "8.36.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.36.0.tgz#1bd72202200a5492f91803b113fb8a83b11285cf" + integrity sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw== dependencies: - "@eslint/eslintrc" "^1.4.1" + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.1" + "@eslint/js" "8.36.0" "@humanwhocodes/config-array" "^0.11.8" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -5058,10 +5037,9 @@ eslint@8.34.0: doctrine "^3.0.0" escape-string-regexp "^4.0.0" eslint-scope "^7.1.1" - eslint-utils "^3.0.0" eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.0" + espree "^9.5.0" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" @@ -5082,15 +5060,14 @@ eslint@8.34.0: minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.1" - regexpp "^3.2.0" strip-ansi "^6.0.1" strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^9.4.0: - version "9.4.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" - integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== +espree@^9.5.0: + version "9.5.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.0.tgz#3646d4e3f58907464edba852fa047e6a27bdf113" + integrity sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw== dependencies: acorn "^8.8.0" acorn-jsx "^5.3.2" @@ -5101,10 +5078,10 @@ esprima@^4.0.0, esprima@~4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" @@ -5165,6 +5142,21 @@ execa@^6.1.0: signal-exit "^3.0.7" strip-final-newline "^3.0.0" +execa@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" + integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -5184,16 +5176,16 @@ expect-more@1.3.0: resolved "https://registry.yarnpkg.com/expect-more/-/expect-more-1.3.0.tgz#fcc6e7477e36d91194d550684bf733a88228aaff" integrity sha512-HnXT5nJb9V3DMnr5RgA1TiKbu5kRaJ0GD1JkuhZvnr1Qe3HJq+ESnrcl/jmVUZ8Ycnl3Sp0OTYUhmO36d2+zow== -expect@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.4.3.tgz#5e47757316df744fe3b8926c3ae8a3ebdafff7fe" - integrity sha512-uC05+Q7eXECFpgDrHdXA4k2rpMyStAYPItEDLyQDo5Ta7fVkJnNA/4zh/OIVkVVNZ1oOK1PipQoyNjuZ6sz6Dg== +expect@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" + integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== dependencies: - "@jest/expect-utils" "^29.4.3" + "@jest/expect-utils" "^29.5.0" jest-get-type "^29.4.3" - jest-matcher-utils "^29.4.3" - jest-message-util "^29.4.3" - jest-util "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" extend@^3.0.0: version "3.0.2" @@ -5237,10 +5229,10 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -fast-xml-parser@4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz#42332a9aca544520631c8919e6ea871c0185a985" - integrity sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA== +fast-xml-parser@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.1.2.tgz#5a98c18238d28a57bbdfa9fe4cda01211fff8f4a" + integrity sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg== dependencies: strnum "^1.0.5" @@ -5593,6 +5585,16 @@ glob@^7.0.0, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^9.2.0: + version "9.3.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.0.tgz#be6e50d172d025c3fcf87903ae25b36b787c0bb0" + integrity sha512-EAZejC7JvnQINayvB/7BJbpZpNOJ8Lrw2OZNEvQxe0vaLn1SuwMcfV7/MNaX8L/T0wmptBFI4YMtDvSBxYDc7w== + dependencies: + fs.realpath "^1.0.0" + minimatch "^7.4.1" + minipass "^4.2.4" + path-scurry "^1.6.1" + global-agent@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" @@ -5691,15 +5693,20 @@ got@11.8.6, got@^11.7.0, got@^11.8.6: p-cancelable "^2.0.0" responselike "^2.0.0" -graceful-fs@4.2.10, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@4.2.10: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graph-data-structure@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/graph-data-structure/-/graph-data-structure-3.1.1.tgz#9c45dbd61ff22f2cbf1790c888d6fdff85c5c1c8" - integrity sha512-8hN+cbuxQPX16u6XsNHD365ywgsizdb3/4EQgCADNb/XUpqIWSNfZ2oCuEs59kn0XezVaxz/LK7oJ+kOE7wmMQ== +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graph-data-structure@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/graph-data-structure/-/graph-data-structure-3.2.0.tgz#db7886a69a2073c76291eef75c973d532eea3b48" + integrity sha512-GtMD5xvFX947d04IzH0dIPnncglFVQKZpLqLb0jy7OM+dMcm4gY9QNAUfHJryNc0Gd0cSvlMfwulUQ/CPyGczg== grapheme-splitter@^1.0.4: version "1.0.4" @@ -5873,6 +5880,11 @@ human-signals@^3.0.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -5991,7 +6003,7 @@ install-artifact-from-github@^1.3.1: resolved "https://registry.yarnpkg.com/install-artifact-from-github/-/install-artifact-from-github-1.3.2.tgz#1a16d9508e40330523a3017ae0d4713ccc64de82" integrity sha512-yCFcLvqk0yQdxx0uJz4t9Z3adDMLAYrcGYv546uRXCSvxE+GqNYhhz/KmrGcUKGI/gVLR9n/e/zM9jX/+ASMJQ== -internal-slot@^1.0.4: +internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== @@ -6044,13 +6056,13 @@ is-arguments@^1.0.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-array-buffer@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" - integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.0" is-typed-array "^1.1.10" is-arrayish@^0.2.1: @@ -6376,104 +6388,95 @@ java-properties@^1.0.2: resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211" integrity sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ== -jest-changed-files@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.4.3.tgz#7961fe32536b9b6d5c28dfa0abcfab31abcf50a7" - integrity sha512-Vn5cLuWuwmi2GNNbokPOEcvrXGSGrqVnPEZV7rC6P7ck07Dyw9RFnvWglnupSh+hGys0ajGtw/bc2ZgweljQoQ== +jest-changed-files@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" + integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== dependencies: execa "^5.0.0" p-limit "^3.1.0" -jest-circus@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.4.3.tgz#fff7be1cf5f06224dd36a857d52a9efeb005ba04" - integrity sha512-Vw/bVvcexmdJ7MLmgdT3ZjkJ3LKu8IlpefYokxiqoZy6OCQ2VAm6Vk3t/qHiAGUXbdbJKJWnc8gH3ypTbB/OBw== +jest-circus@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" + integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== dependencies: - "@jest/environment" "^29.4.3" - "@jest/expect" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" is-generator-fn "^2.0.0" - jest-each "^29.4.3" - jest-matcher-utils "^29.4.3" - jest-message-util "^29.4.3" - jest-runtime "^29.4.3" - jest-snapshot "^29.4.3" - jest-util "^29.4.3" + jest-each "^29.5.0" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" p-limit "^3.1.0" - pretty-format "^29.4.3" + pretty-format "^29.5.0" + pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.4.3.tgz#fe31fdd0c90c765f392b8b7c97e4845071cd2163" - integrity sha512-PiiAPuFNfWWolCE6t3ZrDXQc6OsAuM3/tVW0u27UWc1KE+n/HSn5dSE6B2juqN7WP+PP0jAcnKtGmI4u8GMYCg== +jest-cli@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" + integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== dependencies: - "@jest/core" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/core" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^29.4.3" - jest-util "^29.4.3" - jest-validate "^29.4.3" + jest-config "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" prompts "^2.0.1" yargs "^17.3.1" -jest-config@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.4.3.tgz#fca9cdfe6298ae6d04beef1624064d455347c978" - integrity sha512-eCIpqhGnIjdUCXGtLhz4gdDoxKSWXKjzNcc5r+0S1GKOp2fwOipx5mRcwa9GB/ArsxJ1jlj2lmlD9bZAsBxaWQ== +jest-config@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" + integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.4.3" - "@jest/types" "^29.4.3" - babel-jest "^29.4.3" + "@jest/test-sequencer" "^29.5.0" + "@jest/types" "^29.5.0" + babel-jest "^29.5.0" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^29.4.3" - jest-environment-node "^29.4.3" + jest-circus "^29.5.0" + jest-environment-node "^29.5.0" jest-get-type "^29.4.3" jest-regex-util "^29.4.3" - jest-resolve "^29.4.3" - jest-runner "^29.4.3" - jest-util "^29.4.3" - jest-validate "^29.4.3" + jest-resolve "^29.5.0" + jest-runner "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^29.4.3" + pretty-format "^29.5.0" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^29.0.0, jest-diff@^29.4.1: - version "29.4.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.4.2.tgz#b88502d5dc02d97f6512d73c37da8b36f49b4871" - integrity sha512-EK8DSajVtnjx9sa1BkjZq3mqChm2Cd8rIzdXkQMA8e0wuXq53ypz6s5o5V8HRZkoEt2ywJ3eeNWFKWeYr8HK4g== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.4.2" - jest-get-type "^29.4.2" - pretty-format "^29.4.2" - -jest-diff@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.4.3.tgz#42f4eb34d0bf8c0fb08b0501069b87e8e84df347" - integrity sha512-YB+ocenx7FZ3T5O9lMVMeLYV4265socJKtkwgk/6YUz/VsEzYDkiMuMhWzZmxm3wDRQvayJu/PjkjjSkjoHsCA== +jest-diff@^29.0.0, jest-diff@^29.4.1, jest-diff@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" + integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== dependencies: chalk "^4.0.0" diff-sequences "^29.4.3" jest-get-type "^29.4.3" - pretty-format "^29.4.3" + pretty-format "^29.5.0" jest-docblock@^29.4.3: version "29.4.3" @@ -6482,61 +6485,56 @@ jest-docblock@^29.4.3: dependencies: detect-newline "^3.0.0" -jest-each@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.4.3.tgz#a434c199a2f6151c5e3dc80b2d54586bdaa72819" - integrity sha512-1ElHNAnKcbJb/b+L+7j0/w7bDvljw4gTv1wL9fYOczeJrbTbkMGQ5iQPFJ3eFQH19VPTx1IyfePdqSpePKss7Q== +jest-each@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" + integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== dependencies: - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" chalk "^4.0.0" jest-get-type "^29.4.3" - jest-util "^29.4.3" - pretty-format "^29.4.3" + jest-util "^29.5.0" + pretty-format "^29.5.0" -jest-environment-node@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.4.3.tgz#579c4132af478befc1889ddc43c2413a9cdbe014" - integrity sha512-gAiEnSKF104fsGDXNkwk49jD/0N0Bqu2K9+aMQXA6avzsA9H3Fiv1PW2D+gzbOSR705bWd2wJZRFEFpV0tXISg== +jest-environment-node@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" + integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== dependencies: - "@jest/environment" "^29.4.3" - "@jest/fake-timers" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" - jest-mock "^29.4.3" - jest-util "^29.4.3" + jest-mock "^29.5.0" + jest-util "^29.5.0" -jest-extended@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/jest-extended/-/jest-extended-3.2.3.tgz#286c19b4622e2ab828e1bb28d3b2d4a1ed64f8b9" - integrity sha512-YcdjfFv3+N2AiWq4aG6gT/r1mfLtDKnbXs0hKXNlL/hf37TKQJTlh2zNwuMUYnvwKRRMtO/X9CfZU1EmOgUREA== +jest-extended@3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/jest-extended/-/jest-extended-3.2.4.tgz#4ee93c9e495f983ceb911170613ce305f3533b94" + integrity sha512-lSEYhSmvXZG/7YXI7KO3LpiUiQ90gi5giwCJNDMMsX5a+/NZhdbQF2G4ALOBN+KcXVT3H6FPVPohAuMXooaLTQ== dependencies: jest-diff "^29.0.0" jest-get-type "^29.0.0" -jest-get-type@^29.0.0, jest-get-type@^29.2.0, jest-get-type@^29.4.2: - version "29.4.2" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.2.tgz#7cb63f154bca8d8f57364d01614477d466fa43fe" - integrity sha512-vERN30V5i2N6lqlFu4ljdTqQAgrkTFMC9xaIIfOPYBw04pufjXRty5RuXBiB1d72tGbURa/UgoiHB90ruOSivg== - -jest-get-type@^29.4.3: +jest-get-type@^29.0.0, jest-get-type@^29.2.0, jest-get-type@^29.4.3: version "29.4.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== -jest-haste-map@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.4.3.tgz#085a44283269e7ace0645c63a57af0d2af6942e2" - integrity sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ== +jest-haste-map@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" + integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== dependencies: - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" jest-regex-util "^29.4.3" - jest-util "^29.4.3" - jest-worker "^29.4.3" + jest-util "^29.5.0" + jest-worker "^29.5.0" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: @@ -6552,13 +6550,13 @@ jest-junit@15.0.0: uuid "^8.3.2" xml "^1.0.1" -jest-leak-detector@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.4.3.tgz#2b35191d6b35aa0256e63a9b79b0f949249cf23a" - integrity sha512-9yw4VC1v2NspMMeV3daQ1yXPNxMgCzwq9BocCwYrRgXe4uaEJPAN0ZK37nFBhcy3cUwEVstFecFLaTHpF7NiGA== +jest-leak-detector@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" + integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== dependencies: jest-get-type "^29.4.3" - pretty-format "^29.4.3" + pretty-format "^29.5.0" jest-matcher-utils@29.4.1: version "29.4.1" @@ -6570,46 +6568,46 @@ jest-matcher-utils@29.4.1: jest-get-type "^29.2.0" pretty-format "^29.4.1" -jest-matcher-utils@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.4.3.tgz#ea68ebc0568aebea4c4213b99f169ff786df96a0" - integrity sha512-TTciiXEONycZ03h6R6pYiZlSkvYgT0l8aa49z/DLSGYjex4orMUcafuLXYyyEDWB1RKglq00jzwY00Ei7yFNVg== +jest-matcher-utils@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" + integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== dependencies: chalk "^4.0.0" - jest-diff "^29.4.3" + jest-diff "^29.5.0" jest-get-type "^29.4.3" - pretty-format "^29.4.3" + pretty-format "^29.5.0" -jest-message-util@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.4.3.tgz#65b5280c0fdc9419503b49d4f48d4999d481cb5b" - integrity sha512-1Y8Zd4ZCN7o/QnWdMmT76If8LuDv23Z1DRovBj/vcSFNlGCJGoO8D1nJDw1AdyAGUk0myDLFGN5RbNeJyCRGCw== +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.4.3" + pretty-format "^29.5.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock-extended@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/jest-mock-extended/-/jest-mock-extended-3.0.1.tgz#5f109d5e1da62851ffc9126a01e83cd6470b810b" - integrity sha512-RF4Ow8pXvbRuEcCTj56oYHmig5311BSFvbEGxPNYL51wGKGu93MvVQgx0UpFmjqyBXIcElkZo2Rke88kR1iSKQ== +jest-mock-extended@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/jest-mock-extended/-/jest-mock-extended-3.0.3.tgz#570e33b099f8da87487acb4cd7d820712dcc3b52" + integrity sha512-yqpzvwFr2JWFArj4sPco4hPSanYH3erFgdkv7ahP8EMiAbVH+Rgjc8/cpAHJVG7+sZnQgl0AuTkxofD7eLJN+g== dependencies: ts-essentials "^7.0.3" -jest-mock@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.4.3.tgz#23d84a20a74cdfff0510fdbeefb841ed57b0fe7e" - integrity sha512-LjFgMg+xed9BdkPMyIJh+r3KeHt1klXPJYBULXVVAkbTaaKjPX1o1uVCAZADMEp/kOxGTwy/Ot8XbvgItOrHEg== +jest-mock@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" + integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== dependencies: - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" "@types/node" "*" - jest-util "^29.4.3" + jest-util "^29.5.0" jest-pnp-resolver@^1.2.2: version "1.2.3" @@ -6621,88 +6619,88 @@ jest-regex-util@^29.4.3: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== -jest-resolve-dependencies@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.3.tgz#9ad7f23839a6d88cef91416bda9393a6e9fd1da5" - integrity sha512-uvKMZAQ3nmXLH7O8WAOhS5l0iWyT3WmnJBdmIHiV5tBbdaDZ1wqtNX04FONGoaFvSOSHBJxnwAVnSn1WHdGVaw== +jest-resolve-dependencies@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" + integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== dependencies: jest-regex-util "^29.4.3" - jest-snapshot "^29.4.3" + jest-snapshot "^29.5.0" -jest-resolve@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.4.3.tgz#3c5b5c984fa8a763edf9b3639700e1c7900538e2" - integrity sha512-GPokE1tzguRyT7dkxBim4wSx6E45S3bOQ7ZdKEG+Qj0Oac9+6AwJPCk0TZh5Vu0xzeX4afpb+eDmgbmZFFwpOw== +jest-resolve@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" + integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^29.4.3" + jest-haste-map "^29.5.0" jest-pnp-resolver "^1.2.2" - jest-util "^29.4.3" - jest-validate "^29.4.3" + jest-util "^29.5.0" + jest-validate "^29.5.0" resolve "^1.20.0" resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.4.3.tgz#68dc82c68645eda12bea42b5beece6527d7c1e5e" - integrity sha512-GWPTEiGmtHZv1KKeWlTX9SIFuK19uLXlRQU43ceOQ2hIfA5yPEJC7AMkvFKpdCHx6pNEdOD+2+8zbniEi3v3gA== - dependencies: - "@jest/console" "^29.4.3" - "@jest/environment" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/transform" "^29.4.3" - "@jest/types" "^29.4.3" +jest-runner@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" + integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/environment" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" emittery "^0.13.1" graceful-fs "^4.2.9" jest-docblock "^29.4.3" - jest-environment-node "^29.4.3" - jest-haste-map "^29.4.3" - jest-leak-detector "^29.4.3" - jest-message-util "^29.4.3" - jest-resolve "^29.4.3" - jest-runtime "^29.4.3" - jest-util "^29.4.3" - jest-watcher "^29.4.3" - jest-worker "^29.4.3" + jest-environment-node "^29.5.0" + jest-haste-map "^29.5.0" + jest-leak-detector "^29.5.0" + jest-message-util "^29.5.0" + jest-resolve "^29.5.0" + jest-runtime "^29.5.0" + jest-util "^29.5.0" + jest-watcher "^29.5.0" + jest-worker "^29.5.0" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.4.3.tgz#f25db9874dcf35a3ab27fdaabca426666cc745bf" - integrity sha512-F5bHvxSH+LvLV24vVB3L8K467dt3y3dio6V3W89dUz9nzvTpqd/HcT9zfYKL2aZPvD63vQFgLvaUX/UpUhrP6Q== +jest-runtime@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" + integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== dependencies: - "@jest/environment" "^29.4.3" - "@jest/fake-timers" "^29.4.3" - "@jest/globals" "^29.4.3" + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/globals" "^29.5.0" "@jest/source-map" "^29.4.3" - "@jest/test-result" "^29.4.3" - "@jest/transform" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^29.4.3" - jest-message-util "^29.4.3" - jest-mock "^29.4.3" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" jest-regex-util "^29.4.3" - jest-resolve "^29.4.3" - jest-snapshot "^29.4.3" - jest-util "^29.4.3" + jest-resolve "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.4.3.tgz#183d309371450d9c4a3de7567ed2151eb0e91145" - integrity sha512-NGlsqL0jLPDW91dz304QTM/SNO99lpcSYYAjNiX0Ou+sSGgkanKBcSjCfp/pqmiiO1nQaOyLp6XQddAzRcx3Xw== +jest-snapshot@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" + integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" @@ -6710,94 +6708,81 @@ jest-snapshot@^29.4.3: "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.4.3" - "@jest/transform" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/expect-utils" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^29.4.3" + expect "^29.5.0" graceful-fs "^4.2.9" - jest-diff "^29.4.3" + jest-diff "^29.5.0" jest-get-type "^29.4.3" - jest-haste-map "^29.4.3" - jest-matcher-utils "^29.4.3" - jest-message-util "^29.4.3" - jest-util "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" natural-compare "^1.4.0" - pretty-format "^29.4.3" + pretty-format "^29.5.0" semver "^7.3.5" -jest-util@^29.0.0: - version "29.4.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.2.tgz#3db8580b295df453a97de4a1b42dd2578dabd2c2" - integrity sha512-wKnm6XpJgzMUSRFB7YF48CuwdzuDIHenVuoIb1PLuJ6F+uErZsuDkU+EiExkChf6473XcawBrSfDSnXl+/YG4g== - dependencies: - "@jest/types" "^29.4.2" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-util@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.3.tgz#851a148e23fc2b633c55f6dad2e45d7f4579f496" - integrity sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q== +jest-util@^29.0.0, jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== dependencies: - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.4.3.tgz#a13849dec4f9e95446a7080ad5758f58fa88642f" - integrity sha512-J3u5v7aPQoXPzaar6GndAVhdQcZr/3osWSgTeKg5v574I9ybX/dTyH0AJFb5XgXIB7faVhf+rS7t4p3lL9qFaw== +jest-validate@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" + integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== dependencies: - "@jest/types" "^29.4.3" + "@jest/types" "^29.5.0" camelcase "^6.2.0" chalk "^4.0.0" jest-get-type "^29.4.3" leven "^3.1.0" - pretty-format "^29.4.3" + pretty-format "^29.5.0" -jest-watcher@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.4.3.tgz#e503baa774f0c2f8f3c8db98a22ebf885f19c384" - integrity sha512-zwlXH3DN3iksoIZNk73etl1HzKyi5FuQdYLnkQKm5BW4n8HpoG59xSwpVdFrnh60iRRaRBGw0gcymIxjJENPcA== +jest-watcher@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" + integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== dependencies: - "@jest/test-result" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.13.1" - jest-util "^29.4.3" + jest-util "^29.5.0" string-length "^4.0.1" -jest-worker@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.4.3.tgz#9a4023e1ea1d306034237c7133d7da4240e8934e" - integrity sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA== +jest-worker@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" + integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== dependencies: "@types/node" "*" - jest-util "^29.4.3" + jest-util "^29.5.0" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.4.3.tgz#1b8be541666c6feb99990fd98adac4737e6e6386" - integrity sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA== +jest@29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" + integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== dependencies: - "@jest/core" "^29.4.3" - "@jest/types" "^29.4.3" + "@jest/core" "^29.5.0" + "@jest/types" "^29.5.0" import-local "^3.0.2" - jest-cli "^29.4.3" + jest-cli "^29.5.0" js-sdsl@^4.1.4: version "4.3.0" @@ -6892,7 +6877,7 @@ json5@2.2.3, json5@^2.2.1, json5@^2.2.2, json5@^2.2.3: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -json5@^1.0.1: +json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== @@ -7083,10 +7068,10 @@ lie@3.1.1: dependencies: immediate "~3.0.5" -lilconfig@2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" - integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== +lilconfig@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lines-and-columns@^1.1.6: version "1.2.4" @@ -7100,29 +7085,29 @@ linkify-it@^4.0.1: dependencies: uc.micro "^1.0.1" -lint-staged@13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.1.2.tgz#443636a0cfd834d5518d57d228130dc04c83d6fb" - integrity sha512-K9b4FPbWkpnupvK3WXZLbgu9pchUJ6N7TtVZjbaPsoizkqFUDkUReUL25xdrCljJs7uLUF3tZ7nVPeo/6lp+6w== +lint-staged@13.2.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.2.0.tgz#b7abaf79c91cd36d824f17b23a4ce5209206126a" + integrity sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw== dependencies: + chalk "5.2.0" cli-truncate "^3.1.0" - colorette "^2.0.19" - commander "^9.4.1" + commander "^10.0.0" debug "^4.3.4" - execa "^6.1.0" - lilconfig "2.0.6" - listr2 "^5.0.5" + execa "^7.0.0" + lilconfig "2.1.0" + listr2 "^5.0.7" micromatch "^4.0.5" normalize-path "^3.0.0" - object-inspect "^1.12.2" + object-inspect "^1.12.3" pidtree "^0.6.0" string-argv "^0.3.1" - yaml "^2.1.3" + yaml "^2.2.1" -listr2@^5.0.5: - version "5.0.7" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.7.tgz#de69ccc4caf6bea7da03c74f7a2ffecf3904bd53" - integrity sha512-MD+qXHPmtivrHIDRwPYdfNkrzqDiuaKU/rfBcec3WMyMF3xylQj3jMq344OtvQxz7zaCFViRAeqlr2AFhPvXHw== +listr2@^5.0.7: + version "5.0.8" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.8.tgz#a9379ffeb4bd83a68931a65fb223a11510d6ba23" + integrity sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA== dependencies: cli-truncate "^2.1.0" colorette "^2.0.19" @@ -7268,15 +7253,15 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: - version "7.14.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.1.tgz#8da8d2f5f59827edb388e63e459ac23d6d408fea" - integrity sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA== +lru-cache@^7.14.1, lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -luxon@3.2.1, luxon@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.2.1.tgz#14f1af209188ad61212578ea7e3d518d18cee45f" - integrity sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg== +luxon@3.3.0, luxon@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.3.0.tgz#d73ab5b5d2b49a461c47cedbc7e73309b4805b48" + integrity sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg== make-dir@^3.0.0: version "3.1.0" @@ -7570,6 +7555,13 @@ minimatch@6.1.6: dependencies: brace-expansion "^2.0.1" +minimatch@^7.4.1: + version "7.4.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-7.4.2.tgz#157e847d79ca671054253b840656720cb733f10f" + integrity sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -7638,10 +7630,10 @@ minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: dependencies: yallist "^4.0.0" -minipass@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.3.tgz#00bfbaf1e16e35e804f4aa31a7c1f6b8d9f0ee72" - integrity sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw== +minipass@^4.0.0, minipass@^4.0.2, minipass@^4.2.4: + version "4.2.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.5.tgz#9e0e5256f1e3513f8c34691dd68549e85b2c8ceb" + integrity sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q== minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" @@ -7822,10 +7814,10 @@ node-gyp@^9.0.0, node-gyp@^9.1.0, node-gyp@^9.3.0: tar "^6.1.2" which "^2.0.2" -node-html-parser@6.1.4: - version "6.1.4" - resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-6.1.4.tgz#763cd362497e427d51fc73dda3dcd8ac52ba85a3" - integrity sha512-3muP9Uy/Pz7bQa9TNYVQzWJhNZMqyCx7xJle8kz2/y1UgzAUyXXShc1IcPaJy6u07CE3K5rQcRwlvHzmlySRjg== +node-html-parser@6.1.5: + version "6.1.5" + resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-6.1.5.tgz#c819dceb13a10a7642ff92f94f870b4f77968097" + integrity sha512-fAaM511feX++/Chnhe475a0NHD8M7AxDInsqQpz6x63GRF7xYNdS8Vo5dKsIVPgsOvG7eioRRTZQnWBrhDHBSg== dependencies: css-select "^5.1.0" he "1.2.0" @@ -8114,7 +8106,7 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" -object-inspect@^1.12.2, object-inspect@^1.9.0: +object-inspect@^1.12.3, object-inspect@^1.9.0: version "1.12.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== @@ -8172,9 +8164,9 @@ onetime@^6.0.0: mimic-fn "^4.0.0" open@^8.4.0: - version "8.4.1" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.1.tgz#2ab3754c07f5d1f99a7a8d6a82737c95e3101cff" - integrity sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg== + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: define-lazy-prop "^2.0.0" is-docker "^2.1.1" @@ -8185,10 +8177,10 @@ opener@^1.5.2: resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== -openpgp@5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-5.5.0.tgz#235ae5a49d5fda5cfd1d82c4c42cd91433478c14" - integrity sha512-SpwcJnxrK9Y0HRM6KxSFqkAEOSWEabCH/c8dII/+y2e5f6KvuDG5ZE7JXaPBaVJNE4VUZZeTphxXDoZD0KOHrw== +openpgp@5.7.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-5.7.0.tgz#fe0a346f26171ffb726636ae7ccb24a504281dbc" + integrity sha512-wchYJQfFbSaocUvUIYqNrWD+lRSmFSG1d3Ak2CHeXFocDSEsf7Uc1zUzHjSdlZPTvGeeXPQ+MJrwVtalL4QCBg== dependencies: asn1.js "^5.0.0" @@ -8483,6 +8475,14 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.6.1.tgz#dab45f7bb1d3f45a0e271ab258999f4ab7e23132" + integrity sha512-OW+5s+7cw6253Q4E+8qQ/u1fVvcJQCJo/VFD8pje+dbJCF1n5ZRMV2AEHbGp+5Q7jxQIYJxkHopnj6nzdGeZLA== + dependencies: + lru-cache "^7.14.1" + minipass "^4.0.2" + path-to-regexp@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" @@ -8580,19 +8580,10 @@ pretty-bytes@^5.1.0: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -pretty-format@^29.4.1, pretty-format@^29.4.2: - version "29.4.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.2.tgz#64bf5ccc0d718c03027d94ac957bdd32b3fb2401" - integrity sha512-qKlHR8yFVCbcEWba0H0TOC8dnLlO4vPlyEjRPw31FZ2Rupy9nLa8ZLbYny8gWEl8CkEhJqAE6IzdNELTBVcBEg== - dependencies: - "@jest/schemas" "^29.4.2" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -pretty-format@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.3.tgz#25500ada21a53c9e8423205cf0337056b201244c" - integrity sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA== +pretty-format@^29.4.1, pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== dependencies: "@jest/schemas" "^29.4.3" ansi-styles "^5.0.0" @@ -8696,6 +8687,11 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +pure-rand@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.1.tgz#31207dddd15d43f299fdcdb2f572df65030c19af" + integrity sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg== + q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -8707,9 +8703,9 @@ qrcode-terminal@^0.12.0: integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== qs@^6.9.1: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + version "6.11.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.1.tgz#6c29dff97f0c0060765911ba65cbc9764186109f" + integrity sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ== dependencies: side-channel "^1.0.4" @@ -8838,18 +8834,18 @@ read@1, read@^1.0.7, read@~1.0.7: mute-stream "~0.0.4" readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -8891,16 +8887,16 @@ redeyed@~2.1.0: dependencies: esprima "~4.0.0" -redis@4.6.4: - version "4.6.4" - resolved "https://registry.yarnpkg.com/redis/-/redis-4.6.4.tgz#fe84169de000b247009c70c2740f22d1f85bc2de" - integrity sha512-wi2tgDdQ+Q8q+PR5FLRx4QvDiWaA+PoJbrzsyFqlClN5R4LplHqN3scs/aGjE//mbz++W19SgxiEnQ27jnCRaA== +redis@4.6.5: + version "4.6.5" + resolved "https://registry.yarnpkg.com/redis/-/redis-4.6.5.tgz#f32fbde44429e96f562bb0c9b1db0143ab8cfa4f" + integrity sha512-O0OWA36gDQbswOdUuAhRL6mTZpHFN525HlgZgDaVNgCJIAZR3ya06NTESb0R+TUZ+BFaDpz6NnnVvoMx9meUFg== dependencies: "@redis/bloom" "1.2.0" - "@redis/client" "1.5.5" + "@redis/client" "1.5.6" "@redis/graph" "1.1.0" "@redis/json" "1.0.4" - "@redis/search" "1.1.1" + "@redis/search" "1.1.2" "@redis/time-series" "1.0.4" regenerator-runtime@^0.13.11: @@ -8922,17 +8918,12 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - registry-auth-token@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.1.tgz#5e6cd106e6c251135a046650c58476fc03e92833" - integrity sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA== + version "5.0.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" + integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== dependencies: - "@pnpm/npm-conf" "^1.0.4" + "@pnpm/npm-conf" "^2.1.0" remark-github@10.1.0: version "10.1.0" @@ -8985,6 +8976,15 @@ require-in-the-middle@^5.0.3: module-details-from-path "^1.0.3" resolve "^1.22.1" +require-in-the-middle@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-6.0.0.tgz#01cc6416286fb5e672d0fe031d996f8bc202509d" + integrity sha512-+dtWQ7l2lqQDxheaG3jjyN1QI37gEwvzACSgjYi4/C2y+ZTUMeRW8BIOm+9NBKvwaMBUSZfPXVOt1skB0vBkRw== + dependencies: + debug "^4.1.1" + module-details-from-path "^1.0.3" + resolve "^1.22.1" + resolve-alpn@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" @@ -9008,9 +9008,9 @@ resolve-from@^5.0.0: integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve.exports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.0.tgz#c1a0028c2d166ec2fbf7d0644584927e76e7400e" - integrity sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.1.tgz#cee884cd4e3f355660e501fa3276b27d7ffe5a20" + integrity sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw== resolve@^1.1.6, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.1: version "1.22.1" @@ -9056,10 +9056,12 @@ rfdc@^1.3.0: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.1.2.tgz#20dfbc98083bdfaa28b01183162885ef213dbf7c" - integrity sha512-BlIbgFryTbw3Dz6hyoWFhKk+unCcHMSkZGrTFVAx2WmttdBSonsdtRlwiuTbDqTKr+UlXIUqJVS4QT5tUzGENQ== +rimraf@4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.4.0.tgz#c7a9f45bb2ec058d2e60ef9aca5167974313d605" + integrity sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ== + dependencies: + glob "^9.2.0" rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" @@ -9140,10 +9142,10 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -semantic-release@20.1.0: - version "20.1.0" - resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-20.1.0.tgz#07d493fe5431ad326018069e86cc50ba6927b65c" - integrity sha512-+9+n6RIr0Fz0F53cXrjpawxWlUg3O7/qr1jF9lrE+/v6WqwBrSWnavVHTPaf2WLerET2EngoqI0M4pahkKl6XQ== +semantic-release@20.1.1: + version "20.1.1" + resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-20.1.1.tgz#8693ea760a778de31f846d55d44709a9f129ca5e" + integrity sha512-jXDr8y7ozo42N4+G9m/P5Qyx5oQO4aOS66a+Up8XECzEOFIpEoo3ngnr4R5lSix/sVJW69/fgNkOUZhsGFiQ5g== dependencies: "@semantic-release/commit-analyzer" "^9.0.2" "@semantic-release/error" "^3.0.0" @@ -9154,7 +9156,7 @@ semantic-release@20.1.0: cosmiconfig "^8.0.0" debug "^4.0.0" env-ci "^8.0.0" - execa "^6.1.0" + execa "^7.0.0" figures "^5.0.0" find-versions "^5.1.0" get-stream "^6.0.0" @@ -9303,10 +9305,10 @@ signale@^1.2.1: figures "^2.0.0" pkg-conf "^2.1.0" -simple-git@3.16.1: - version "3.16.1" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.16.1.tgz#b67f18cbd3c68bbc4b9177ed49256afe51f12d47" - integrity sha512-xzRxMKiy1zEYeHGXgAzvuXffDS0xgsq07Oi4LWEEcVH29vLpcZ2tyQRWyK0NLLlCVaKysZeem5tC1qHEOxsKwA== +simple-git@3.17.0: + version "3.17.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.17.0.tgz#1a961fa43f697b4e2391cf34c8a0554ef84fed8e" + integrity sha512-JozI/s8jr3nvLd9yn2jzPVHnhVzt7t7QWfcIoDcqRIGN+f1IINGv52xoZti2kkYfoRhhRvzMSNPfogHMp97rlw== dependencies: "@kwsites/file-exists" "^1.1.1" "@kwsites/promise-deferred" "^1.1.1" @@ -9426,9 +9428,9 @@ spawn-error-forwarder@~1.0.0: integrity sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g== spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -9447,9 +9449,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" - integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== + version "3.0.13" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" + integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== split2@^3.0.0: version "3.2.2" @@ -9572,6 +9574,15 @@ string.prototype.padend@^3.0.0: define-properties "^1.1.4" es-abstract "^1.20.4" +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + string.prototype.trimend@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" @@ -9911,12 +9922,12 @@ ts-node@10.9.1: yn "3.1.1" tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" + json5 "^1.0.2" minimist "^1.2.6" strip-bom "^3.0.0" @@ -9959,10 +9970,10 @@ type-detect@4.0.8, type-detect@^4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@3.5.7: - version "3.5.7" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.5.7.tgz#1ee9efc9a172f4002c40b896689928a7bba537f2" - integrity sha512-6J4bYzb4sdkcLBty4XW7F18VPI66M4boXNE+CY40532oq2OJe6AVMB5NmjOp6skt/jw5mRjz/hLRpuglz0U+FA== +type-fest@3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.6.1.tgz#cf8025edeebfd6cf48de73573a5e1423350b9993" + integrity sha512-htXWckxlT6U4+ilVgweNliPqlsVSSucbxVexRYllyMVJDtf5rTjv6kF/s+qAd4QSL1BZcnJPEJavYBPQiWuZDA== type-fest@^0.13.1: version "0.13.1" @@ -10430,7 +10441,7 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yaml@2.2.1, yaml@^2.1.3: +yaml@2.2.1, yaml@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4" integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== @@ -10454,9 +10465,9 @@ yargs-parser@^21.0.1, yargs-parser@^21.1.1: integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^17.3.1, yargs@^17.5.1: - version "17.6.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" - integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== + version "17.7.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== dependencies: cliui "^8.0.1" escalade "^3.1.1" @@ -10489,10 +10500,10 @@ yocto-queue@^1.0.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== -zod@3.20.6: - version "3.20.6" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.20.6.tgz#2f2f08ff81291d47d99e86140fedb4e0db08361a" - integrity sha512-oyu0m54SGCtzh6EClBVqDDlAYRz4jrVtKwQ7ZnsEmMI9HnzuZFj8QFwAY1M5uniIYACdGvv0PBWPF2kO0aNofA== +zod@3.21.4: + version "3.21.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" + integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== zwitch@^1.0.0: version "1.0.5"