diff --git a/.github/workflows/basic-validation.yml b/.github/workflows/basic-validation.yml index 37fa323e6..e93e58009 100644 --- a/.github/workflows/basic-validation.yml +++ b/.github/workflows/basic-validation.yml @@ -16,4 +16,4 @@ jobs: name: Basic validation uses: actions/reusable-workflows/.github/workflows/basic-validation.yml@main with: - node-version: '20.x' + node-version: '24.x' diff --git a/.github/workflows/check-dist.yml b/.github/workflows/check-dist.yml index 509ea6cc7..90ef986ad 100644 --- a/.github/workflows/check-dist.yml +++ b/.github/workflows/check-dist.yml @@ -16,4 +16,4 @@ jobs: name: Check dist/ uses: actions/reusable-workflows/.github/workflows/check-dist.yml@main with: - node-version: '20.x' + node-version: '24.x' diff --git a/.github/workflows/e2e-cache-dependency-path.yml b/.github/workflows/e2e-cache-dependency-path.yml index f276ef312..6d926299b 100644 --- a/.github/workflows/e2e-cache-dependency-path.yml +++ b/.github/workflows/e2e-cache-dependency-path.yml @@ -24,13 +24,13 @@ jobs: os: [macos-latest, windows-latest, ubuntu-latest] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Run setup-java with the cache for gradle uses: ./ id: setup-java with: distribution: 'adopt' - java-version: '11' + java-version: '17' cache: gradle cache-dependency-path: __tests__/cache/gradle1/*.gradle* - name: Create files to cache @@ -51,7 +51,7 @@ jobs: needs: gradle1-save steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Run setup-java with the cache for gradle uses: ./ id: setup-java @@ -76,7 +76,7 @@ jobs: needs: gradle1-save steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Run setup-java with the cache for gradle uses: ./ id: setup-java diff --git a/.github/workflows/e2e-cache.yml b/.github/workflows/e2e-cache.yml index bc685ec01..9f6835d78 100644 --- a/.github/workflows/e2e-cache.yml +++ b/.github/workflows/e2e-cache.yml @@ -21,16 +21,16 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-13, windows-latest, ubuntu-latest] + os: [macos-15-intel, windows-latest, ubuntu-latest] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Run setup-java with the cache for gradle uses: ./ id: setup-java with: distribution: 'adopt' - java-version: '11' + java-version: '17' cache: gradle - name: Create files to cache # Need to avoid using Gradle daemon to stabilize the save process on Windows @@ -46,11 +46,11 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-13, windows-latest, ubuntu-latest] + os: [macos-15-intel, windows-latest, ubuntu-latest] needs: gradle-save steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Run setup-java with the cache for gradle uses: ./ id: setup-java @@ -70,10 +70,10 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-13, windows-latest, ubuntu-latest] + os: [macos-15-intel, windows-latest, ubuntu-latest] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Run setup-java with the cache for maven uses: ./ id: setup-java @@ -93,11 +93,11 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-13, windows-latest, ubuntu-latest] + os: [macos-15-intel, windows-latest, ubuntu-latest] needs: maven-save steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Run setup-java with the cache for maven uses: ./ id: setup-java @@ -121,10 +121,10 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-13, windows-latest, ubuntu-22.04] + os: [macos-15-intel, windows-latest, ubuntu-22.04] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Run setup-java with the cache for sbt uses: ./ id: setup-java @@ -133,7 +133,7 @@ jobs: java-version: '11' cache: sbt - name: Setup SBT - if: matrix.os == 'macos-13' + if: matrix.os == 'macos-15-intel' run: | echo ""Installing SBT..."" brew install sbt @@ -141,7 +141,7 @@ jobs: run: sbt update - name: Check files to cache on macos-latest - if: matrix.os == 'macos-13' + if: matrix.os == 'macos-15-intel' run: | if [ ! -d ~/Library/Caches/Coursier ]; then echo "::error::The ~/Library/Caches/Coursier directory does not exist unexpectedly" @@ -170,11 +170,11 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-13, windows-latest, ubuntu-22.04] + os: [macos-15-intel, windows-latest, ubuntu-22.04] needs: sbt-save steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Run setup-java with the cache for sbt uses: ./ id: setup-java @@ -184,7 +184,7 @@ jobs: cache: sbt - name: Confirm that ~/Library/Caches/Coursier directory has been made - if: matrix.os == 'macos-13' + if: matrix.os == 'macos-15-intel' run: | if [ ! -d ~/Library/Caches/Coursier ]; then echo "::error::The ~/Library/Caches/Coursier directory does not exist unexpectedly" diff --git a/.github/workflows/e2e-local-file.yml b/.github/workflows/e2e-local-file.yml index 9757621ed..45d7912d3 100644 --- a/.github/workflows/e2e-local-file.yml +++ b/.github/workflows/e2e-local-file.yml @@ -21,7 +21,7 @@ jobs: os: [macos-latest, windows-latest, ubuntu-latest] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Download Adopt OpenJDK file run: | if ($IsLinux) { @@ -58,7 +58,7 @@ jobs: os: [macos-latest, windows-latest, ubuntu-latest] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Download Zulu OpenJDK file run: | if ($IsLinux) { @@ -95,7 +95,7 @@ jobs: os: [macos-latest, windows-latest, ubuntu-latest] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Download Eclipse Temurin file run: | if ($IsLinux) { diff --git a/.github/workflows/e2e-publishing.yml b/.github/workflows/e2e-publishing.yml index dd7bd4351..d3163a92f 100644 --- a/.github/workflows/e2e-publishing.yml +++ b/.github/workflows/e2e-publishing.yml @@ -25,7 +25,7 @@ jobs: os: [macos-latest, windows-latest, ubuntu-latest] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: setup-java uses: ./ id: setup-java @@ -60,7 +60,7 @@ jobs: os: [macos-latest, windows-latest, ubuntu-latest] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Create fake settings.xml run: | $xmlDirectory = Join-Path $HOME ".m2" @@ -96,7 +96,7 @@ jobs: os: [macos-latest, windows-latest, ubuntu-latest] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Create fake settings.xml run: | $xmlDirectory = Join-Path $HOME ".m2" @@ -133,7 +133,7 @@ jobs: os: [macos-latest, windows-latest, ubuntu-latest] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: setup-java uses: ./ id: setup-java diff --git a/.github/workflows/e2e-versions.yml b/.github/workflows/e2e-versions.yml index d0476606c..e17294939 100644 --- a/.github/workflows/e2e-versions.yml +++ b/.github/workflows/e2e-versions.yml @@ -20,7 +20,7 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-13, windows-latest, ubuntu-latest] + os: [macos-15-intel, windows-latest, ubuntu-latest] distribution: [ 'temurin', 'adopt', @@ -39,10 +39,19 @@ jobs: - distribution: microsoft version: 8 - distribution: dragonwell - os: macos-13 + os: macos-15-intel include: + - distribution: microsoft + os: windows-latest + version: 25 + - distribution: microsoft + os: ubuntu-latest + version: 25 + - distribution: microsoft + os: macos-latest + version: 25 - distribution: oracle - os: macos-13 + os: macos-15-intel version: 17 - distribution: oracle os: windows-latest @@ -64,7 +73,7 @@ jobs: version: '24-ea' steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: setup-java uses: ./ id: setup-java @@ -114,7 +123,7 @@ jobs: version: '17.0.7' steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: setup-java uses: ./ id: setup-java @@ -149,7 +158,7 @@ jobs: os: macos-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: setup-java uses: ./ id: setup-java @@ -185,7 +194,7 @@ jobs: os: macos-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: setup-java uses: ./ id: setup-java @@ -220,11 +229,11 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-13, windows-latest, ubuntu-latest] + os: [macos-15-intel, windows-latest, ubuntu-latest] version: ['17-ea', '15.0.0-ea.14'] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: setup-java uses: ./ id: setup-java @@ -246,7 +255,7 @@ jobs: version: ['17-ea'] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: setup-java uses: ./ id: setup-java @@ -268,7 +277,7 @@ jobs: version: ['17-ea', '21-ea'] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: setup-java uses: ./ id: setup-java @@ -286,7 +295,7 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-13, windows-latest, ubuntu-latest] + os: [macos-15-intel, windows-latest, ubuntu-latest] distribution: ['temurin', 'zulu', 'liberica', 'semeru', 'sapmachine', 'jetbrains'] java-package: ['jre'] @@ -355,7 +364,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: setup-java uses: ./ id: setup-java @@ -383,7 +392,7 @@ jobs: version: ['11'] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: setup-java uses: ./ id: setup-java @@ -406,7 +415,7 @@ jobs: java-version-file: ['.java-version', '.tool-versions'] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Create .java-version file shell: bash run: echo "17" > .java-version @@ -435,7 +444,7 @@ jobs: java-version-file: ['.java-version', '.tool-versions'] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Create .java-version file shell: bash run: echo "11" > .java-version @@ -463,7 +472,7 @@ jobs: java-version-file: ['.java-version', '.tool-versions'] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Create .java-version file shell: bash run: echo "17.0.10" > .java-version @@ -481,23 +490,26 @@ jobs: shell: bash setup-java-version-from-file-major-minor-patch-with-dist: - name: ${{ matrix.distribution }} version from file 'openjdk64-17.0.10' - ${{ matrix.os }} + name: ${{ matrix.distribution }} version from file '${{ matrix.java-version-file }}' - ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [macos-latest, windows-latest, ubuntu-latest] distribution: ['adopt', 'zulu', 'liberica'] - java-version-file: ['.java-version', '.tool-versions'] + java-version-file: ['.java-version', '.tool-versions', '.sdkmanrc'] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Create .java-version file shell: bash run: echo "openjdk64-17.0.10" > .java-version - name: Create .tool-versions file shell: bash run: echo "java openjdk64-17.0.10" > .tool-versions + - name: Create .sdkmanrc file + shell: bash + run: echo "java=17.0.10-tem" > .sdkmanrc - name: setup-java uses: ./ id: setup-java diff --git a/.github/workflows/publish-immutable-actions.yml b/.github/workflows/publish-immutable-actions.yml index 7c2583479..ba3ffdee3 100644 --- a/.github/workflows/publish-immutable-actions.yml +++ b/.github/workflows/publish-immutable-actions.yml @@ -2,7 +2,8 @@ name: 'Publish Immutable Action Version' on: release: - types: [published] + types: [released] + workflow_dispatch: jobs: publish: @@ -14,7 +15,7 @@ jobs: steps: - name: Checking out - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Publish id: publish uses: actions/publish-immutable-action@v0.0.4 diff --git a/.github/workflows/release-new-action-version.yml b/.github/workflows/release-new-action-version.yml index e58e9063f..25192b640 100644 --- a/.github/workflows/release-new-action-version.yml +++ b/.github/workflows/release-new-action-version.yml @@ -23,7 +23,7 @@ jobs: steps: - name: Update the ${{ env.TAG_NAME }} tag id: update-major-tag - uses: actions/publish-action@v0.3.0 + uses: actions/publish-action@v0.4.0 with: source-tag: ${{ env.TAG_NAME }} slack-webhook: ${{ secrets.SLACK_WEBHOOK }} diff --git a/.licenses/npm/@types/node.dep.yml b/.licenses/npm/@types/node.dep.yml index 06fb919df..86544f488 100644 --- a/.licenses/npm/@types/node.dep.yml +++ b/.licenses/npm/@types/node.dep.yml @@ -1,6 +1,6 @@ --- name: "@types/node" -version: 20.11.24 +version: 24.1.0 type: npm summary: TypeScript definitions for node homepage: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node diff --git a/.licenses/npm/brace-expansion.dep.yml b/.licenses/npm/brace-expansion.dep.yml index 8fa6cfb31..95ca8eb1f 100644 --- a/.licenses/npm/brace-expansion.dep.yml +++ b/.licenses/npm/brace-expansion.dep.yml @@ -1,6 +1,6 @@ --- name: brace-expansion -version: 1.1.11 +version: 1.1.12 type: npm summary: Brace expansion as known from sh/bash homepage: https://github.com/juliangruber/brace-expansion diff --git a/.licenses/npm/call-bind-apply-helpers.dep.yml b/.licenses/npm/call-bind-apply-helpers.dep.yml new file mode 100644 index 000000000..bfd264f37 --- /dev/null +++ b/.licenses/npm/call-bind-apply-helpers.dep.yml @@ -0,0 +1,32 @@ +--- +name: call-bind-apply-helpers +version: 1.0.2 +type: npm +summary: Helper functions around Function call/apply/bind, for use in `call-bind` +homepage: https://github.com/ljharb/call-bind-apply-helpers#readme +license: mit +licenses: +- sources: LICENSE + text: | + MIT License + + Copyright (c) 2024 Jordan Harband + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +notices: [] diff --git a/.licenses/npm/dunder-proto.dep.yml b/.licenses/npm/dunder-proto.dep.yml new file mode 100644 index 000000000..39542bfdc --- /dev/null +++ b/.licenses/npm/dunder-proto.dep.yml @@ -0,0 +1,32 @@ +--- +name: dunder-proto +version: 1.0.1 +type: npm +summary: If available, the `Object.prototype.__proto__` accessor and mutator, call-bound +homepage: https://github.com/es-shims/dunder-proto#readme +license: mit +licenses: +- sources: LICENSE + text: | + MIT License + + Copyright (c) 2024 ECMAScript Shims + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +notices: [] diff --git a/.licenses/npm/es-define-property.dep.yml b/.licenses/npm/es-define-property.dep.yml new file mode 100644 index 000000000..7f1903728 --- /dev/null +++ b/.licenses/npm/es-define-property.dep.yml @@ -0,0 +1,32 @@ +--- +name: es-define-property +version: 1.0.1 +type: npm +summary: "`Object.defineProperty`, but not IE 8's broken one." +homepage: https://github.com/ljharb/es-define-property#readme +license: mit +licenses: +- sources: LICENSE + text: | + MIT License + + Copyright (c) 2024 Jordan Harband + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +notices: [] diff --git a/.licenses/npm/es-errors.dep.yml b/.licenses/npm/es-errors.dep.yml new file mode 100644 index 000000000..a5827aac9 --- /dev/null +++ b/.licenses/npm/es-errors.dep.yml @@ -0,0 +1,32 @@ +--- +name: es-errors +version: 1.3.0 +type: npm +summary: A simple cache for a few of the JS Error constructors. +homepage: https://github.com/ljharb/es-errors#readme +license: mit +licenses: +- sources: LICENSE + text: | + MIT License + + Copyright (c) 2024 Jordan Harband + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +notices: [] diff --git a/.licenses/npm/es-object-atoms.dep.yml b/.licenses/npm/es-object-atoms.dep.yml new file mode 100644 index 000000000..dc42eaae7 --- /dev/null +++ b/.licenses/npm/es-object-atoms.dep.yml @@ -0,0 +1,32 @@ +--- +name: es-object-atoms +version: 1.1.1 +type: npm +summary: 'ES Object-related atoms: Object, ToObject, RequireObjectCoercible' +homepage: https://github.com/ljharb/es-object-atoms#readme +license: mit +licenses: +- sources: LICENSE + text: | + MIT License + + Copyright (c) 2024 Jordan Harband + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +notices: [] diff --git a/.licenses/npm/es-set-tostringtag.dep.yml b/.licenses/npm/es-set-tostringtag.dep.yml new file mode 100644 index 000000000..f4b673e27 --- /dev/null +++ b/.licenses/npm/es-set-tostringtag.dep.yml @@ -0,0 +1,32 @@ +--- +name: es-set-tostringtag +version: 2.1.0 +type: npm +summary: A helper to optimistically set Symbol.toStringTag, when possible. +homepage: https://github.com/es-shims/es-set-tostringtag#readme +license: mit +licenses: +- sources: LICENSE + text: | + MIT License + + Copyright (c) 2022 ECMAScript Shims + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +notices: [] diff --git a/.licenses/npm/form-data-2.5.1.dep.yml b/.licenses/npm/form-data-2.5.5.dep.yml similarity index 95% rename from .licenses/npm/form-data-2.5.1.dep.yml rename to .licenses/npm/form-data-2.5.5.dep.yml index 000f2223a..a60d6b967 100644 --- a/.licenses/npm/form-data-2.5.1.dep.yml +++ b/.licenses/npm/form-data-2.5.5.dep.yml @@ -1,10 +1,10 @@ --- name: form-data -version: 2.5.1 +version: 2.5.5 type: npm summary: A library to create readable "multipart/form-data" streams. Can be used to submit forms and file uploads to other web applications. -homepage: https://github.com/form-data/form-data#readme +homepage: license: mit licenses: - sources: License diff --git a/.licenses/npm/form-data-4.0.0.dep.yml b/.licenses/npm/form-data-4.0.4.dep.yml similarity index 94% rename from .licenses/npm/form-data-4.0.0.dep.yml rename to .licenses/npm/form-data-4.0.4.dep.yml index ced7212cc..5b3b5c1fc 100644 --- a/.licenses/npm/form-data-4.0.0.dep.yml +++ b/.licenses/npm/form-data-4.0.4.dep.yml @@ -1,10 +1,10 @@ --- name: form-data -version: 4.0.0 +version: 4.0.4 type: npm summary: A library to create readable "multipart/form-data" streams. Can be used to submit forms and file uploads to other web applications. -homepage: https://github.com/form-data/form-data#readme +homepage: license: mit licenses: - sources: License @@ -28,6 +28,6 @@ licenses: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- sources: Readme.md +- sources: README.md text: Form-Data is released under the [MIT](License) license. notices: [] diff --git a/.licenses/npm/function-bind.dep.yml b/.licenses/npm/function-bind.dep.yml new file mode 100644 index 000000000..3ae18f3ec --- /dev/null +++ b/.licenses/npm/function-bind.dep.yml @@ -0,0 +1,32 @@ +--- +name: function-bind +version: 1.1.2 +type: npm +summary: Implementation of Function.prototype.bind +homepage: https://github.com/Raynos/function-bind +license: mit +licenses: +- sources: LICENSE + text: |+ + Copyright (c) 2013 Raynos. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +notices: [] +... diff --git a/.licenses/npm/get-intrinsic.dep.yml b/.licenses/npm/get-intrinsic.dep.yml new file mode 100644 index 000000000..c94509f44 --- /dev/null +++ b/.licenses/npm/get-intrinsic.dep.yml @@ -0,0 +1,33 @@ +--- +name: get-intrinsic +version: 1.3.0 +type: npm +summary: Get and robustly cache all JS language-level intrinsics at first require + time +homepage: https://github.com/ljharb/get-intrinsic#readme +license: mit +licenses: +- sources: LICENSE + text: | + MIT License + + Copyright (c) 2020 Jordan Harband + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +notices: [] diff --git a/.licenses/npm/get-proto.dep.yml b/.licenses/npm/get-proto.dep.yml new file mode 100644 index 000000000..1176a9536 --- /dev/null +++ b/.licenses/npm/get-proto.dep.yml @@ -0,0 +1,32 @@ +--- +name: get-proto +version: 1.0.1 +type: npm +summary: Robustly get the [[Prototype]] of an object +homepage: https://github.com/ljharb/get-proto#readme +license: mit +licenses: +- sources: LICENSE + text: | + MIT License + + Copyright (c) 2025 Jordan Harband + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +notices: [] diff --git a/.licenses/npm/gopd.dep.yml b/.licenses/npm/gopd.dep.yml new file mode 100644 index 000000000..d3d28af9b --- /dev/null +++ b/.licenses/npm/gopd.dep.yml @@ -0,0 +1,32 @@ +--- +name: gopd +version: 1.2.0 +type: npm +summary: "`Object.getOwnPropertyDescriptor`, but accounts for IE's broken implementation." +homepage: https://github.com/ljharb/gopd#readme +license: mit +licenses: +- sources: LICENSE + text: | + MIT License + + Copyright (c) 2022 Jordan Harband + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +notices: [] diff --git a/.licenses/npm/has-symbols.dep.yml b/.licenses/npm/has-symbols.dep.yml new file mode 100644 index 000000000..38b50f044 --- /dev/null +++ b/.licenses/npm/has-symbols.dep.yml @@ -0,0 +1,32 @@ +--- +name: has-symbols +version: 1.1.0 +type: npm +summary: Determine if the JS environment has Symbol support. Supports spec, or shams. +homepage: https://github.com/ljharb/has-symbols#readme +license: mit +licenses: +- sources: LICENSE + text: | + MIT License + + Copyright (c) 2016 Jordan Harband + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +notices: [] diff --git a/.licenses/npm/has-tostringtag.dep.yml b/.licenses/npm/has-tostringtag.dep.yml new file mode 100644 index 000000000..efa5c5c1b --- /dev/null +++ b/.licenses/npm/has-tostringtag.dep.yml @@ -0,0 +1,33 @@ +--- +name: has-tostringtag +version: 1.0.2 +type: npm +summary: Determine if the JS environment has `Symbol.toStringTag` support. Supports + spec, or shams. +homepage: https://github.com/inspect-js/has-tostringtag#readme +license: mit +licenses: +- sources: LICENSE + text: | + MIT License + + Copyright (c) 2021 Inspect JS + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +notices: [] diff --git a/.licenses/npm/hasown.dep.yml b/.licenses/npm/hasown.dep.yml new file mode 100644 index 000000000..992639195 --- /dev/null +++ b/.licenses/npm/hasown.dep.yml @@ -0,0 +1,32 @@ +--- +name: hasown +version: 2.0.2 +type: npm +summary: A robust, ES3 compatible, "has own property" predicate. +homepage: https://github.com/inspect-js/hasOwn#readme +license: mit +licenses: +- sources: LICENSE + text: | + MIT License + + Copyright (c) Jordan Harband and contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +notices: [] diff --git a/.licenses/npm/math-intrinsics.dep.yml b/.licenses/npm/math-intrinsics.dep.yml new file mode 100644 index 000000000..2f29af6f9 --- /dev/null +++ b/.licenses/npm/math-intrinsics.dep.yml @@ -0,0 +1,32 @@ +--- +name: math-intrinsics +version: 1.1.0 +type: npm +summary: ES Math-related intrinsics and helpers, robustly cached. +homepage: https://github.com/es-shims/math-intrinsics#readme +license: mit +licenses: +- sources: LICENSE + text: | + MIT License + + Copyright (c) 2024 ECMAScript Shims + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +notices: [] diff --git a/.licenses/npm/safe-buffer.dep.yml b/.licenses/npm/safe-buffer.dep.yml new file mode 100644 index 000000000..a6499e34d --- /dev/null +++ b/.licenses/npm/safe-buffer.dep.yml @@ -0,0 +1,34 @@ +--- +name: safe-buffer +version: 5.2.1 +type: npm +summary: Safer Node.js Buffer API +homepage: https://github.com/feross/safe-buffer +license: mit +licenses: +- sources: LICENSE + text: | + The MIT License (MIT) + + Copyright (c) Feross Aboukhadijeh + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +- sources: README.md + text: MIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org) +notices: [] diff --git a/.licenses/npm/undici-types.dep.yml b/.licenses/npm/undici-types.dep.yml index a65b8affc..370219bfa 100644 --- a/.licenses/npm/undici-types.dep.yml +++ b/.licenses/npm/undici-types.dep.yml @@ -1,15 +1,17 @@ --- name: undici-types -version: 5.26.5 +version: 7.8.0 type: npm summary: A stand-alone types package for Undici homepage: https://undici.nodejs.org license: mit licenses: -- sources: Auto-generated MIT license text +- sources: LICENSE text: | MIT License + Copyright (c) Matteo Collina and Undici contributors + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights diff --git a/.licenses/npm/undici.dep.yml b/.licenses/npm/undici.dep.yml index 961089c65..fadecf4a7 100644 --- a/.licenses/npm/undici.dep.yml +++ b/.licenses/npm/undici.dep.yml @@ -1,6 +1,6 @@ --- name: undici -version: 5.28.5 +version: 5.29.0 type: npm summary: An HTTP/1.1 client, written from scratch for Node.js homepage: https://undici.nodejs.org diff --git a/README.md b/README.md index 844fa9933..7addc9a46 100644 --- a/README.md +++ b/README.md @@ -18,11 +18,20 @@ The `setup-java` action provides the following functionality for GitHub Actions This action allows you to work with Java and Scala projects. +## Breaking changes in V5 + +- Upgraded action from node20 to node24 + > Make sure your runner is on version v2.327.1 or later to ensure compatibility with this release [Release Notes](https://github.com/actions/runner/releases/tag/v2.327.1) + +For more details, see the full release notes on the [releases page](https://github.com/actions/setup-java/releases/tag/v5.0.0) + ## V2 vs V1 - V2 supports custom distributions and provides support for Azul Zulu OpenJDK, Eclipse Temurin and AdoptOpenJDK out of the box. V1 supports only Azul Zulu OpenJDK. - V2 requires you to specify distribution along with the version. V1 defaults to Azul Zulu OpenJDK, only version input is required. Follow [the migration guide](docs/switching-to-v2.md) to switch from V1 to V2. +For information about the latest releases, recent updates, and newly supported distributions, please refer to the `setup-java` [Releases](https://github.com/actions/setup-java/releases). + ## Usage - `java-version`: The Java version that is going to be set up. Takes a whole or [semver](#supported-version-syntax) Java version. If not specified, the action will expect `java-version-file` input to be specified. @@ -69,8 +78,8 @@ This action allows you to work with Java and Scala projects. #### Eclipse Temurin ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '21' @@ -80,8 +89,8 @@ steps: #### Azul Zulu OpenJDK ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'zulu' # See 'Supported distributions' for available options java-version: '21' @@ -136,8 +145,8 @@ The cache input is optional, and caching is turned off by default. #### Caching gradle dependencies ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'temurin' java-version: '21' @@ -151,8 +160,8 @@ steps: #### Caching maven dependencies ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'temurin' java-version: '21' @@ -165,8 +174,8 @@ steps: #### Caching sbt dependencies ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'temurin' java-version: '21' @@ -185,8 +194,8 @@ Usually, cache gets downloaded in multiple segments of fixed sizes. Sometimes, a env: SEGMENT_DOWNLOAD_TIMEOUT_MINS: '5' steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'temurin' java-version: '21' @@ -205,8 +214,8 @@ For Java distributions that are not cached on Hosted images, `check-latest` alwa ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'temurin' java-version: '21' @@ -224,9 +233,9 @@ jobs: java: [ '8', '11', '17', '21' ] name: Java ${{ matrix.Java }} sample steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup java - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: '' java-version: ${{ matrix.java }} @@ -235,11 +244,11 @@ jobs: ### Install multiple JDKs -All versions are added to the PATH. The last version will be used and available globally. Other Java versions can be accessed through env variables with such specification as 'JAVA_HOME_{{ MAJOR_VERSION }}_{{ ARCHITECTURE }}'. +All configured Java versions are added to the PATH. The last one added to the PATH (i.e., the last JDK set up by this action) will be used as the default and available globally. Other Java versions can be accessed through environment variables such as 'JAVA_HOME_{{ MAJOR_VERSION }}_{{ ARCHITECTURE }}'. To use a specific Java version, set the JAVA_HOME environment variable accordingly and prepend its bin directory to the PATH to ensure it takes priority during execution. ```yaml steps: - - uses: actions/setup-java@v4 + - uses: actions/setup-java@v5 with: distribution: '' java-version: | diff --git a/__tests__/data/jetbrains.json b/__tests__/data/jetbrains.json index bf59d620b..535bb5cba 100644 --- a/__tests__/data/jetbrains.json +++ b/__tests__/data/jetbrains.json @@ -1,1454 +1,1454 @@ [ - { - "tag_name": "jbr-release-21.0.3b465.3", - "semver": "21.0.3", - "build": 465.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.3-linux-x64-b465.3.tar.gz" - }, - { - "tag_name": "jbr-release-21.0.3b458.1", - "semver": "21.0.3", - "build": 458.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.3-linux-x64-b458.1.tar.gz" - }, - { - "tag_name": "jbr-release-21.0.3b453.2", - "semver": "21.0.3", - "build": 453.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.3-linux-x64-b453.2.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.11b1207.24", - "semver": "17.0.11", - "build": 1207.24, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.11-linux-x64-b1207.24.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.11b1207.23", - "semver": "17.0.11", - "build": 1207.23, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.11-linux-x64-b1207.23.tar.gz" - }, - { - "tag_name": "jbr-release-21.0.3b446.1", - "semver": "21.0.3", - "build": 446.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.3-linux-x64-b446.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1207.14", - "semver": "17.0.10", - "build": 1207.14, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1207.14.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b829.27", - "semver": "17.0.10", - "build": 829.27, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b829.27.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1087.23", - "semver": "17.0.10", - "build": 1087.23, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1087.23.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1207.12", - "semver": "17.0.10", - "build": 1207.12, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1207.12.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1087.21", - "semver": "17.0.10", - "build": 1087.21, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1087.21.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1207.6", - "semver": "17.0.10", - "build": 1207.6, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1207.6.tar.gz" - }, - { - "tag_name": "jbr-release-21.0.2b375.1", - "semver": "21.0.2", - "build": 375.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.2-linux-x64-b375.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1207.1", - "semver": "17.0.10", - "build": 1207.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1207.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1186.1", - "semver": "17.0.10", - "build": 1186.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1186.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1171.14", - "semver": "17.0.10", - "build": 1171.14, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1171.14.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b829.26", - "semver": "17.0.10", - "build": 829.26, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b829.26.tar.gz" - }, - { - "tag_name": "jbr-release-21.0.2b346.3", - "semver": "21.0.2", - "build": 346.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.2-linux-x64-b346.3.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1000.48", - "semver": "17.0.10", - "build": 1000.48, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1000.48.tar.gz" - }, - { - "tag_name": "jbr-release-21.0.2b341.4", - "semver": "21.0.2", - "build": 341.4, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.2-linux-x64-b341.4.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1087.17", - "semver": "17.0.10", - "build": 1087.17, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1087.17.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.9b1166.2", - "semver": "17.0.9", - "build": 1166.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1166.2.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.9b1162.7", - "semver": "17.0.9", - "build": 1162.7, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1162.7.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.9b1087.11", - "semver": "17.0.9", - "build": 1087.11, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1087.11.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.9b1087.9", - "semver": "17.0.9", - "build": 1087.9, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1087.9.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.9b1087.7", - "semver": "17.0.9", - "build": 1087.7, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1087.7.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.9b1000.47", - "semver": "17.0.9", - "build": 1000.47, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1000.47.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.9b1000.46", - "semver": "17.0.9", - "build": 1000.46, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1000.46.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.9b1087.3", - "semver": "17.0.9", - "build": 1087.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1087.3.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.8.1b1080.1", - "semver": "17.0.8.1", - "build": 1080.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1080.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.8.1b1072.1", - "semver": "17.0.8.1", - "build": 1072.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1072.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.8.1b1070.2", - "semver": "17.0.8.1", - "build": 1070.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1070.2.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.8.1b1063.1", - "semver": "17.0.8.1", - "build": 1063.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1063.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.8.1b1000.32", - "semver": "17.0.8.1", - "build": 1000.32, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1000.32.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.8.1b1059.3", - "semver": "17.0.8.1", - "build": 1059.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1059.3.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.8b1000.22", - "semver": "17.0.8", - "build": 1000.22, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8-linux-x64-b1000.22.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.8b1000.8", - "semver": "17.0.8", - "build": 1000.8, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8-linux-x64-b1000.8.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b1000.6", - "semver": "17.0.7", - "build": 1000.6, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b1000.6.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b1000.5", - "semver": "17.0.7", - "build": 1000.5, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b1000.5.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b1000.2", - "semver": "17.0.7", - "build": 1000.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b1000.2.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b985.2", - "semver": "17.0.7", - "build": 985.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b985.2.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b979.4", - "semver": "17.0.7", - "build": 979.4, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b979.4.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b829.16", - "semver": "17.0.7", - "build": 829.16, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b829.16.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b966.2", - "semver": "17.0.7", - "build": 966.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b966.2.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b964.1", - "semver": "17.0.7", - "build": 964.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b964.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b829.14", - "semver": "17.0.7", - "build": 829.14, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b829.14.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b953.1", - "semver": "17.0.7", - "build": 953.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b953.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b829.9", - "semver": "17.0.6", - "build": 829.9, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b829.9.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b469.82", - "semver": "17.0.6", - "build": 469.82, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b469.82.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b829.5", - "semver": "17.0.6", - "build": 829.5, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b829.5.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b653.34", - "semver": "17.0.6", - "build": 653.34, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b653.34.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b829.4", - "semver": "17.0.6", - "build": 829.4, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b829.4.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b829.1", - "semver": "17.0.6", - "build": 829.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b829.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b653.32", - "semver": "17.0.6", - "build": 653.32, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b653.32.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b802.4", - "semver": "17.0.6", - "build": 802.4, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b802.4.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b802.1", - "semver": "17.0.6", - "build": 802.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b802.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b785.1", - "semver": "17.0.6", - "build": 785.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b785.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b779.1", - "semver": "17.0.6", - "build": 779.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b779.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.5b762.1", - "semver": "17.0.5", - "build": 762.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b762.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.5b653.25", - "semver": "17.0.5", - "build": 653.25, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b653.25.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.5b759.1", - "semver": "17.0.5", - "build": 759.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b759.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.5b653.23", - "semver": "17.0.5", - "build": 653.23, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b653.23.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.5b653.14", - "semver": "17.0.5", - "build": 653.14, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b653.14.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.5b469.71", - "semver": "17.0.5", - "build": 469.71, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b469.71.tar.gz" - }, - { - "tag_name": "jbr11_0_16b2043.64", - "semver": "11.0.16", - "build": 2043.64, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_nomod-11_0_16-linux-x64-b2043.64.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.5b653.6", - "semver": "17.0.5", - "build": 653.6, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b653.6.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.5b469.67", - "semver": "17.0.5", - "build": 469.67, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b469.67.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.4.1b653.1", - "semver": "17.0.4.1", - "build": 653.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b653.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.4.1b646.8", - "semver": "17.0.4.1", - "build": 646.8, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b646.8.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.4.1b629.2", - "semver": "17.0.4.1", - "build": 629.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b629.2.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.4.1b617.2", - "semver": "17.0.4.1", - "build": 617.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b617.2.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.4.1b469.62", - "semver": "17.0.4.1", - "build": 469.62, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b469.62.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.4.1b597.1", - "semver": "17.0.4.1", - "build": 597.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b597.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.4b469.53", - "semver": "17.0.4", - "build": 469.53, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4-linux-x64-b469.53.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.4b469.44", - "semver": "17.0.4", - "build": 469.44, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4-linux-x64-b469.44.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.3b469.37", - "semver": "17.0.3", - "build": 469.37, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.37.tar.gz" - }, - { - "tag_name": "jbr17.0.3b469.32", - "semver": "17.0.3", - "build": 469.32, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.32.tar.gz" - }, - { - "tag_name": "jbr17.0.3b469.30", - "semver": "17.0.3", - "build": 469.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.3.tar.gz" - }, - { - "tag_name": "jbr17.0.3b469.19", - "semver": "17.0.3", - "build": 469.19, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.19.tar.gz" - }, - { - "tag_name": "jbr17.0.3b498.3", - "semver": "17.0.3", - "build": 498.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b498.3.tar.gz" - }, - { - "tag_name": "jbr17.0.3b469.16", - "semver": "17.0.3", - "build": 469.16, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.16.tar.gz" - }, - { - "tag_name": "jbr17.0.3b469.12", - "semver": "17.0.3", - "build": 469.12, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.12.tar.gz" - }, - { - "tag_name": "jbr17.0.3b469.3", - "semver": "17.0.3", - "build": 469.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.3.tar.gz" - }, - { - "tag_name": "jbr17.0.3b463.3", - "semver": "17.0.3", - "build": 463.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b463.3.tar.gz" - }, - { - "tag_name": "jbr17.0.3b423.10", - "semver": "17.0.3", - "build": 423.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b423.1.tar.gz" - }, - { - "tag_name": "jbr11_0_15b2043.56", - "semver": "11.0.15", - "build": 2043.56, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_nomod-11_0_15-linux-x64-b2043.56.tar.gz" - }, - { - "tag_name": "jbr11_0_14_1b2043.45", - "semver": "11.0.14.1", - "build": 2043.45, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_nomod-11_0_14_1-linux-x64-b2043.45.tar.gz" - }, - { - "tag_name": "jbr17.0.2b396.4", - "semver": "17.0.2", - "build": 396.4, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.2-linux-x64-b396.4.tar.gz" - }, - { - "tag_name": "jbr11_0_14_1b2043.25", - "semver": "11.0.14.1", - "build": 2043.25, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.25.tar.gz" - }, - { - "tag_name": "jbr11_0_14_1b2043.22", - "semver": "11.0.14.1", - "build": 2043.22, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.22.tar.gz" - }, - { - "tag_name": "jbr11_0_14_1b2043.17", - "semver": "11.0.14.1", - "build": 2043.17, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.17.tar.gz" - }, - { - "tag_name": "jbr11_0_14_1b2043.14", - "semver": "11.0.14.1", - "build": 2043.14, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.14.tar.gz" - }, - { - "tag_name": "jbr11_0_14_1b2043.11", - "semver": "11.0.14.1", - "build": 2043.11, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.11.tar.gz" - }, - { - "tag_name": "jbr11_0_14b2043.2", - "semver": "11.0.14", - "build": 2043.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14-linux-x64-b2043.2.tar.gz" - }, - { - "tag_name": "jbr11_0_14_1b1751.46", - "semver": "11.0.14.1", - "build": 1751.46, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b1751.46.tar.gz" - }, - { - "tag_name": "jbr11_0_14b1993.2", - "semver": "11.0.14", - "build": 1993.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14-linux-x64-b1993.2.tar.gz" - }, - { - "tag_name": "jbr17_0_2b315.1", - "semver": "17.0.2", - "build": 315.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17_0_2-linux-x64-b315.1.tar.gz" - }, - { - "tag_name": "jbr11_0_14b1982.1", - "semver": "11.0.14", - "build": 1982.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14-linux-x64-b1982.1.tar.gz" - }, - { - "tag_name": "jbr11_0_13b1890.3", - "semver": "11.0.13", - "build": 1890.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1890.3.tar.gz" - }, - { - "tag_name": "jbr11_0_13b1751.25", - "semver": "11.0.13", - "build": 1751.25, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.25.tar.gz" - }, - { - "tag_name": "jbr11_0_13b1751.24", - "semver": "11.0.13", - "build": 1751.24, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.24.tar.gz" - }, - { - "tag_name": "jbr11_0_13b1751.21", - "semver": "11.0.13", - "build": 1751.21, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.21.tar.gz" - }, - { - "tag_name": "jbr17_0_1b164.8", - "semver": "17.0.1", - "build": 164.8, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17_0_1-linux-x64-b164.8.tar.gz" - }, - { - "tag_name": "jbr11_0_13b1751.19", - "semver": "11.0.13", - "build": 1751.19, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.19.tar.gz" - }, - { - "tag_name": "jb11_0_13-b1504.49", - "semver": "11.0.13", - "build": 1504.49, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1504.49.tar.gz" - }, - { - "tag_name": "jbr17_0_1b164.4", - "semver": "17.0.1", - "build": 164.4, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17_0_1-linux-x64-b164.4.tar.gz" - }, - { - "tag_name": "jbr11_0_13b1751.16", - "semver": "11.0.13", - "build": 1751.16, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.16.tar.gz" - }, - { - "tag_name": "jbr11_0_12b1751.11", - "semver": "11.0.12", - "build": 1751.11, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1751.11.tar.gz" - }, - { - "tag_name": "jbr11_0_12b1729.1", - "semver": "11.0.12", - "build": 1729.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1729.1.tar.gz" - }, - { - "tag_name": "jbr11_0_12b1715.4", - "semver": "11.0.12", - "build": 1715.4, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1715.4.tar.gz" - }, - { - "tag_name": "jbr11_0_12b1692.9", - "semver": "11.0.12", - "build": 1692.9, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1692.9.tar.gz" - }, - { - "tag_name": "jb11_0_12-b1504.37", - "semver": "11.0.12", - "build": 1504.37, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1504.37.tar.gz" - }, - { - "tag_name": "jbr11_0_12b1665.1", - "semver": "11.0.12", - "build": 1665.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1665.1.tar.gz" - }, - { - "tag_name": "jb11_0_12-b1504.28", - "semver": "11.0.12", - "build": 1504.28, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1504.28.tar.gz" - }, - { - "tag_name": "jb11_0_12-b1504.27", - "semver": "11.0.12", - "build": 1504.27, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1504.27.tar.gz" - }, - { - "tag_name": "jb11_0_11-b1504.16", - "semver": "11.0.11", - "build": 1504.16, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1504.16.tar.gz" - }, - { - "tag_name": "jb11_0_11-b1504.13", - "semver": "11.0.11", - "build": 1504.13, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1504.13.tar.gz" - }, - { - "tag_name": "jb11_0_11-b1504.12", - "semver": "11.0.11", - "build": 1504.12, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1504.12.tar.gz" - }, - { - "tag_name": "jb11_0_11-b1542.1", - "semver": "11.0.11", - "build": 1542.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1542.1.tar.gz" - }, - { - "tag_name": "jb11_0_11-b1504.8", - "semver": "11.0.11", - "build": 1504.8, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1504.8.tar.gz" - }, - { - "tag_name": "11_0_11b1536.2", - "semver": "11.0.11", - "build": 1536.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1536.2.tar.gz" - }, - { - "tag_name": "jbr-release-21.0.3b465.3", - "semver": "21.0.3", - "build": 465.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.3-linux-x64-b465.3.tar.gz" - }, - { - "tag_name": "jbr-release-21.0.3b458.1", - "semver": "21.0.3", - "build": 458.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.3-linux-x64-b458.1.tar.gz" - }, - { - "tag_name": "jbr-release-21.0.3b453.2", - "semver": "21.0.3", - "build": 453.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.3-linux-x64-b453.2.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.11b1207.24", - "semver": "17.0.11", - "build": 1207.24, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.11-linux-x64-b1207.24.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.11b1207.23", - "semver": "17.0.11", - "build": 1207.23, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.11-linux-x64-b1207.23.tar.gz" - }, - { - "tag_name": "jbr-release-21.0.3b446.1", - "semver": "21.0.3", - "build": 446.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.3-linux-x64-b446.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1207.14", - "semver": "17.0.10", - "build": 1207.14, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1207.14.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b829.27", - "semver": "17.0.10", - "build": 829.27, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b829.27.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1087.23", - "semver": "17.0.10", - "build": 1087.23, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1087.23.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1207.12", - "semver": "17.0.10", - "build": 1207.12, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1207.12.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1087.21", - "semver": "17.0.10", - "build": 1087.21, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1087.21.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1207.6", - "semver": "17.0.10", - "build": 1207.6, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1207.6.tar.gz" - }, - { - "tag_name": "jbr-release-21.0.2b375.1", - "semver": "21.0.2", - "build": 375.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.2-linux-x64-b375.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1207.1", - "semver": "17.0.10", - "build": 1207.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1207.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1186.1", - "semver": "17.0.10", - "build": 1186.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1186.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1171.14", - "semver": "17.0.10", - "build": 1171.14, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1171.14.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b829.26", - "semver": "17.0.10", - "build": 829.26, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b829.26.tar.gz" - }, - { - "tag_name": "jbr-release-21.0.2b346.3", - "semver": "21.0.2", - "build": 346.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.2-linux-x64-b346.3.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1000.48", - "semver": "17.0.10", - "build": 1000.48, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1000.48.tar.gz" - }, - { - "tag_name": "jbr-release-21.0.2b341.4", - "semver": "21.0.2", - "build": 341.4, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.2-linux-x64-b341.4.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.10b1087.17", - "semver": "17.0.10", - "build": 1087.17, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1087.17.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.9b1166.2", - "semver": "17.0.9", - "build": 1166.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1166.2.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.9b1162.7", - "semver": "17.0.9", - "build": 1162.7, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1162.7.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.9b1087.11", - "semver": "17.0.9", - "build": 1087.11, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1087.11.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.9b1087.9", - "semver": "17.0.9", - "build": 1087.9, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1087.9.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.9b1087.7", - "semver": "17.0.9", - "build": 1087.7, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1087.7.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.9b1000.47", - "semver": "17.0.9", - "build": 1000.47, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1000.47.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.9b1000.46", - "semver": "17.0.9", - "build": 1000.46, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1000.46.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.9b1087.3", - "semver": "17.0.9", - "build": 1087.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1087.3.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.8.1b1080.1", - "semver": "17.0.8.1", - "build": 1080.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1080.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.8.1b1072.1", - "semver": "17.0.8.1", - "build": 1072.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1072.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.8.1b1070.2", - "semver": "17.0.8.1", - "build": 1070.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1070.2.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.8.1b1063.1", - "semver": "17.0.8.1", - "build": 1063.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1063.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.8.1b1000.32", - "semver": "17.0.8.1", - "build": 1000.32, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1000.32.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.8.1b1059.3", - "semver": "17.0.8.1", - "build": 1059.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1059.3.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.8b1000.22", - "semver": "17.0.8", - "build": 1000.22, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8-linux-x64-b1000.22.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.8b1000.8", - "semver": "17.0.8", - "build": 1000.8, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8-linux-x64-b1000.8.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b1000.6", - "semver": "17.0.7", - "build": 1000.6, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b1000.6.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b1000.5", - "semver": "17.0.7", - "build": 1000.5, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b1000.5.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b1000.2", - "semver": "17.0.7", - "build": 1000.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b1000.2.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b985.2", - "semver": "17.0.7", - "build": 985.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b985.2.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b979.4", - "semver": "17.0.7", - "build": 979.4, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b979.4.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b829.16", - "semver": "17.0.7", - "build": 829.16, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b829.16.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b966.2", - "semver": "17.0.7", - "build": 966.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b966.2.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b964.1", - "semver": "17.0.7", - "build": 964.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b964.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b829.14", - "semver": "17.0.7", - "build": 829.14, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b829.14.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.7b953.1", - "semver": "17.0.7", - "build": 953.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b953.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b829.9", - "semver": "17.0.6", - "build": 829.9, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b829.9.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b469.82", - "semver": "17.0.6", - "build": 469.82, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b469.82.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b829.5", - "semver": "17.0.6", - "build": 829.5, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b829.5.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b653.34", - "semver": "17.0.6", - "build": 653.34, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b653.34.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b829.4", - "semver": "17.0.6", - "build": 829.4, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b829.4.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b829.1", - "semver": "17.0.6", - "build": 829.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b829.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b653.32", - "semver": "17.0.6", - "build": 653.32, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b653.32.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b802.4", - "semver": "17.0.6", - "build": 802.4, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b802.4.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b802.1", - "semver": "17.0.6", - "build": 802.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b802.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b785.1", - "semver": "17.0.6", - "build": 785.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b785.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.6b779.1", - "semver": "17.0.6", - "build": 779.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b779.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.5b762.1", - "semver": "17.0.5", - "build": 762.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b762.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.5b653.25", - "semver": "17.0.5", - "build": 653.25, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b653.25.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.5b759.1", - "semver": "17.0.5", - "build": 759.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b759.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.5b653.23", - "semver": "17.0.5", - "build": 653.23, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b653.23.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.5b653.14", - "semver": "17.0.5", - "build": 653.14, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b653.14.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.5b469.71", - "semver": "17.0.5", - "build": 469.71, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b469.71.tar.gz" - }, - { - "tag_name": "jbr11_0_16b2043.64", - "semver": "11.0.16", - "build": 2043.64, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_nomod-11_0_16-linux-x64-b2043.64.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.5b653.6", - "semver": "17.0.5", - "build": 653.6, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b653.6.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.5b469.67", - "semver": "17.0.5", - "build": 469.67, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b469.67.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.4.1b653.1", - "semver": "17.0.4.1", - "build": 653.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b653.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.4.1b646.8", - "semver": "17.0.4.1", - "build": 646.8, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b646.8.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.4.1b629.2", - "semver": "17.0.4.1", - "build": 629.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b629.2.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.4.1b617.2", - "semver": "17.0.4.1", - "build": 617.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b617.2.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.4.1b469.62", - "semver": "17.0.4.1", - "build": 469.62, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b469.62.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.4.1b597.1", - "semver": "17.0.4.1", - "build": 597.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b597.1.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.4b469.53", - "semver": "17.0.4", - "build": 469.53, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4-linux-x64-b469.53.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.4b469.44", - "semver": "17.0.4", - "build": 469.44, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4-linux-x64-b469.44.tar.gz" - }, - { - "tag_name": "jbr-release-17.0.3b469.37", - "semver": "17.0.3", - "build": 469.37, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.37.tar.gz" - }, - { - "tag_name": "jbr17.0.3b469.32", - "semver": "17.0.3", - "build": 469.32, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.32.tar.gz" - }, - { - "tag_name": "jbr17.0.3b469.30", - "semver": "17.0.3", - "build": 469.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.3.tar.gz" - }, - { - "tag_name": "jbr17.0.3b469.19", - "semver": "17.0.3", - "build": 469.19, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.19.tar.gz" - }, - { - "tag_name": "jbr17.0.3b498.3", - "semver": "17.0.3", - "build": 498.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b498.3.tar.gz" - }, - { - "tag_name": "jbr17.0.3b469.16", - "semver": "17.0.3", - "build": 469.16, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.16.tar.gz" - }, - { - "tag_name": "jbr17.0.3b469.12", - "semver": "17.0.3", - "build": 469.12, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.12.tar.gz" - }, - { - "tag_name": "jbr17.0.3b469.3", - "semver": "17.0.3", - "build": 469.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.3.tar.gz" - }, - { - "tag_name": "jbr17.0.3b463.3", - "semver": "17.0.3", - "build": 463.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b463.3.tar.gz" - }, - { - "tag_name": "jbr17.0.3b423.10", - "semver": "17.0.3", - "build": 423.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b423.1.tar.gz" - }, - { - "tag_name": "jbr11_0_15b2043.56", - "semver": "11.0.15", - "build": 2043.56, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_nomod-11_0_15-linux-x64-b2043.56.tar.gz" - }, - { - "tag_name": "jbr11_0_14_1b2043.45", - "semver": "11.0.14.1", - "build": 2043.45, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_nomod-11_0_14_1-linux-x64-b2043.45.tar.gz" - }, - { - "tag_name": "jbr17.0.2b396.4", - "semver": "17.0.2", - "build": 396.4, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.2-linux-x64-b396.4.tar.gz" - }, - { - "tag_name": "jbr11_0_14_1b2043.25", - "semver": "11.0.14.1", - "build": 2043.25, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.25.tar.gz" - }, - { - "tag_name": "jbr11_0_14_1b2043.22", - "semver": "11.0.14.1", - "build": 2043.22, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.22.tar.gz" - }, - { - "tag_name": "jbr11_0_14_1b2043.17", - "semver": "11.0.14.1", - "build": 2043.17, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.17.tar.gz" - }, - { - "tag_name": "jbr11_0_14_1b2043.14", - "semver": "11.0.14.1", - "build": 2043.14, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.14.tar.gz" - }, - { - "tag_name": "jbr11_0_14_1b2043.11", - "semver": "11.0.14.1", - "build": 2043.11, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.11.tar.gz" - }, - { - "tag_name": "jbr11_0_14b2043.2", - "semver": "11.0.14", - "build": 2043.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14-linux-x64-b2043.2.tar.gz" - }, - { - "tag_name": "jbr11_0_14_1b1751.46", - "semver": "11.0.14.1", - "build": 1751.46, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b1751.46.tar.gz" - }, - { - "tag_name": "jbr11_0_14b1993.2", - "semver": "11.0.14", - "build": 1993.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14-linux-x64-b1993.2.tar.gz" - }, - { - "tag_name": "jbr17_0_2b315.1", - "semver": "17.0.2", - "build": 315.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17_0_2-linux-x64-b315.1.tar.gz" - }, - { - "tag_name": "jbr11_0_14b1982.1", - "semver": "11.0.14", - "build": 1982.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14-linux-x64-b1982.1.tar.gz" - }, - { - "tag_name": "jbr11_0_13b1890.3", - "semver": "11.0.13", - "build": 1890.3, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1890.3.tar.gz" - }, - { - "tag_name": "jbr11_0_13b1751.25", - "semver": "11.0.13", - "build": 1751.25, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.25.tar.gz" - }, - { - "tag_name": "jbr11_0_13b1751.24", - "semver": "11.0.13", - "build": 1751.24, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.24.tar.gz" - }, - { - "tag_name": "jbr11_0_13b1751.21", - "semver": "11.0.13", - "build": 1751.21, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.21.tar.gz" - }, - { - "tag_name": "jbr17_0_1b164.8", - "semver": "17.0.1", - "build": 164.8, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17_0_1-linux-x64-b164.8.tar.gz" - }, - { - "tag_name": "jbr11_0_13b1751.19", - "semver": "11.0.13", - "build": 1751.19, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.19.tar.gz" - }, - { - "tag_name": "jb11_0_13-b1504.49", - "semver": "11.0.13", - "build": 1504.49, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1504.49.tar.gz" - }, - { - "tag_name": "jbr17_0_1b164.4", - "semver": "17.0.1", - "build": 164.4, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17_0_1-linux-x64-b164.4.tar.gz" - }, - { - "tag_name": "jbr11_0_13b1751.16", - "semver": "11.0.13", - "build": 1751.16, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.16.tar.gz" - }, - { - "tag_name": "jbr11_0_12b1751.11", - "semver": "11.0.12", - "build": 1751.11, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1751.11.tar.gz" - }, - { - "tag_name": "jbr11_0_12b1729.1", - "semver": "11.0.12", - "build": 1729.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1729.1.tar.gz" - }, - { - "tag_name": "jbr11_0_12b1715.4", - "semver": "11.0.12", - "build": 1715.4, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1715.4.tar.gz" - }, - { - "tag_name": "jbr11_0_12b1692.9", - "semver": "11.0.12", - "build": 1692.9, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1692.9.tar.gz" - }, - { - "tag_name": "jb11_0_12-b1504.37", - "semver": "11.0.12", - "build": 1504.37, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1504.37.tar.gz" - }, - { - "tag_name": "jbr11_0_12b1665.1", - "semver": "11.0.12", - "build": 1665.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1665.1.tar.gz" - }, - { - "tag_name": "jb11_0_12-b1504.28", - "semver": "11.0.12", - "build": 1504.28, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1504.28.tar.gz" - }, - { - "tag_name": "jb11_0_12-b1504.27", - "semver": "11.0.12", - "build": 1504.27, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1504.27.tar.gz" - }, - { - "tag_name": "jb11_0_11-b1504.16", - "semver": "11.0.11", - "build": 1504.16, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1504.16.tar.gz" - }, - { - "tag_name": "jb11_0_11-b1504.13", - "semver": "11.0.11", - "build": 1504.13, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1504.13.tar.gz" - }, - { - "tag_name": "jb11_0_11-b1504.12", - "semver": "11.0.11", - "build": 1504.12, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1504.12.tar.gz" - }, - { - "tag_name": "jb11_0_11-b1542.1", - "semver": "11.0.11", - "build": 1542.1, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1542.1.tar.gz" - }, - { - "tag_name": "jb11_0_11-b1504.8", - "semver": "11.0.11", - "build": 1504.8, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1504.8.tar.gz" - }, - { - "tag_name": "11_0_11b1536.2", - "semver": "11.0.11", - "build": 1536.2, - "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1536.2.tar.gz" - } - ] \ No newline at end of file + { + "tag_name": "jbr-release-21.0.3b465.3", + "semver": "21.0.3", + "build": "465.3", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.3-linux-x64-b465.3.tar.gz" + }, + { + "tag_name": "jbr-release-21.0.3b458.1", + "semver": "21.0.3", + "build": "458.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.3-linux-x64-b458.1.tar.gz" + }, + { + "tag_name": "jbr-release-21.0.3b453.2", + "semver": "21.0.3", + "build": "453.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.3-linux-x64-b453.2.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.11b1207.24", + "semver": "17.0.11", + "build": "1207.24", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.11-linux-x64-b1207.24.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.11b1207.23", + "semver": "17.0.11", + "build": "1207.23", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.11-linux-x64-b1207.23.tar.gz" + }, + { + "tag_name": "jbr-release-21.0.3b446.1", + "semver": "21.0.3", + "build": "446.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.3-linux-x64-b446.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1207.14", + "semver": "17.0.10", + "build": "1207.14", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1207.14.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b829.27", + "semver": "17.0.10", + "build": "829.27", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b829.27.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1087.23", + "semver": "17.0.10", + "build": "1087.23", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1087.23.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1207.12", + "semver": "17.0.10", + "build": "1207.12", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1207.12.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1087.21", + "semver": "17.0.10", + "build": "1087.21", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1087.21.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1207.6", + "semver": "17.0.10", + "build": "1207.6", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1207.6.tar.gz" + }, + { + "tag_name": "jbr-release-21.0.2b375.1", + "semver": "21.0.2", + "build": "375.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.2-linux-x64-b375.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1207.1", + "semver": "17.0.10", + "build": "1207.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1207.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1186.1", + "semver": "17.0.10", + "build": "1186.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1186.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1171.14", + "semver": "17.0.10", + "build": "1171.14", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1171.14.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b829.26", + "semver": "17.0.10", + "build": "829.26", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b829.26.tar.gz" + }, + { + "tag_name": "jbr-release-21.0.2b346.3", + "semver": "21.0.2", + "build": "346.3", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.2-linux-x64-b346.3.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1000.48", + "semver": "17.0.10", + "build": "1000.48", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1000.48.tar.gz" + }, + { + "tag_name": "jbr-release-21.0.2b341.4", + "semver": "21.0.2", + "build": "341.4", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.2-linux-x64-b341.4.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1087.17", + "semver": "17.0.10", + "build": "1087.17", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1087.17.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.9b1166.2", + "semver": "17.0.9", + "build": "1166.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1166.2.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.9b1162.7", + "semver": "17.0.9", + "build": "1162.7", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1162.7.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.9b1087.11", + "semver": "17.0.9", + "build": "1087.11", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1087.11.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.9b1087.9", + "semver": "17.0.9", + "build": "1087.9", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1087.9.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.9b1087.7", + "semver": "17.0.9", + "build": "1087.7", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1087.7.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.9b1000.47", + "semver": "17.0.9", + "build": "1000.47", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1000.47.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.9b1000.46", + "semver": "17.0.9", + "build": "1000.46", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1000.46.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.9b1087.3", + "semver": "17.0.9", + "build": "1087.3", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1087.3.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.8.1b1080.1", + "semver": "17.0.8.1", + "build": "1080.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1080.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.8.1b1072.1", + "semver": "17.0.8.1", + "build": "1072.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1072.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.8.1b1070.2", + "semver": "17.0.8.1", + "build": "1070.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1070.2.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.8.1b1063.1", + "semver": "17.0.8.1", + "build": "1063.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1063.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.8.1b1000.32", + "semver": "17.0.8.1", + "build": "1000.32", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1000.32.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.8.1b1059.3", + "semver": "17.0.8.1", + "build": "1059.3", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1059.3.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.8b1000.22", + "semver": "17.0.8", + "build": "1000.22", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8-linux-x64-b1000.22.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.8b1000.8", + "semver": "17.0.8", + "build": "1000.8", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8-linux-x64-b1000.8.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b1000.6", + "semver": "17.0.7", + "build": "1000.6", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b1000.6.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b1000.5", + "semver": "17.0.7", + "build": "1000.5", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b1000.5.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b1000.2", + "semver": "17.0.7", + "build": "1000.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b1000.2.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b985.2", + "semver": "17.0.7", + "build": "985.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b985.2.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b979.4", + "semver": "17.0.7", + "build": "979.4", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b979.4.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b829.16", + "semver": "17.0.7", + "build": "829.16", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b829.16.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b966.2", + "semver": "17.0.7", + "build": "966.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b966.2.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b964.1", + "semver": "17.0.7", + "build": "964.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b964.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b829.14", + "semver": "17.0.7", + "build": "829.14", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b829.14.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b953.1", + "semver": "17.0.7", + "build": "953.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b953.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b829.9", + "semver": "17.0.6", + "build": "829.9", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b829.9.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b469.82", + "semver": "17.0.6", + "build": "469.82", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b469.82.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b829.5", + "semver": "17.0.6", + "build": "829.5", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b829.5.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b653.34", + "semver": "17.0.6", + "build": "653.34", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b653.34.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b829.4", + "semver": "17.0.6", + "build": "829.4", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b829.4.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b829.1", + "semver": "17.0.6", + "build": "829.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b829.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b653.32", + "semver": "17.0.6", + "build": "653.32", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b653.32.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b802.4", + "semver": "17.0.6", + "build": "802.4", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b802.4.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b802.1", + "semver": "17.0.6", + "build": "802.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b802.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b785.1", + "semver": "17.0.6", + "build": "785.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b785.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b779.1", + "semver": "17.0.6", + "build": "779.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b779.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.5b762.1", + "semver": "17.0.5", + "build": "762.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b762.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.5b653.25", + "semver": "17.0.5", + "build": "653.25", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b653.25.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.5b759.1", + "semver": "17.0.5", + "build": "759.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b759.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.5b653.23", + "semver": "17.0.5", + "build": "653.23", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b653.23.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.5b653.14", + "semver": "17.0.5", + "build": "653.14", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b653.14.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.5b469.71", + "semver": "17.0.5", + "build": "469.71", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b469.71.tar.gz" + }, + { + "tag_name": "jbr11_0_16b2043.64", + "semver": "11.0.16", + "build": "2043.64", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_nomod-11_0_16-linux-x64-b2043.64.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.5b653.6", + "semver": "17.0.5", + "build": "653.6", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b653.6.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.5b469.67", + "semver": "17.0.5", + "build": "469.67", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b469.67.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.4.1b653.1", + "semver": "17.0.4.1", + "build": "653.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b653.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.4.1b646.8", + "semver": "17.0.4.1", + "build": "646.8", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b646.8.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.4.1b629.2", + "semver": "17.0.4.1", + "build": "629.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b629.2.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.4.1b617.2", + "semver": "17.0.4.1", + "build": "617.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b617.2.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.4.1b469.62", + "semver": "17.0.4.1", + "build": "469.62", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b469.62.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.4.1b597.1", + "semver": "17.0.4.1", + "build": "597.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b597.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.4b469.53", + "semver": "17.0.4", + "build": "469.53", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4-linux-x64-b469.53.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.4b469.44", + "semver": "17.0.4", + "build": "469.44", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4-linux-x64-b469.44.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.3b469.37", + "semver": "17.0.3", + "build": "469.37", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.37.tar.gz" + }, + { + "tag_name": "jbr17.0.3b469.32", + "semver": "17.0.3", + "build": "469.32", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.32.tar.gz" + }, + { + "tag_name": "jbr17.0.3b469.30", + "semver": "17.0.3", + "build": "469.30", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.30.tar.gz" + }, + { + "tag_name": "jbr17.0.3b469.19", + "semver": "17.0.3", + "build": "469.19", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.19.tar.gz" + }, + { + "tag_name": "jbr17.0.3b498.3", + "semver": "17.0.3", + "build": "498.3", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b498.3.tar.gz" + }, + { + "tag_name": "jbr17.0.3b469.16", + "semver": "17.0.3", + "build": "469.16", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.16.tar.gz" + }, + { + "tag_name": "jbr17.0.3b469.12", + "semver": "17.0.3", + "build": "469.12", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.12.tar.gz" + }, + { + "tag_name": "jbr17.0.3b469.3", + "semver": "17.0.3", + "build": "469.3", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.3.tar.gz" + }, + { + "tag_name": "jbr17.0.3b463.3", + "semver": "17.0.3", + "build": "463.3", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b463.3.tar.gz" + }, + { + "tag_name": "jbr17.0.3b423.10", + "semver": "17.0.3", + "build": "423.10", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b423.10.tar.gz" + }, + { + "tag_name": "jbr11_0_15b2043.56", + "semver": "11.0.15", + "build": "2043.56", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_nomod-11_0_15-linux-x64-b2043.56.tar.gz" + }, + { + "tag_name": "jbr11_0_14_1b2043.45", + "semver": "11.0.14.1", + "build": "2043.45", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_nomod-11_0_14_1-linux-x64-b2043.45.tar.gz" + }, + { + "tag_name": "jbr17.0.2b396.4", + "semver": "17.0.2", + "build": "396.4", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.2-linux-x64-b396.4.tar.gz" + }, + { + "tag_name": "jbr11_0_14_1b2043.25", + "semver": "11.0.14.1", + "build": "2043.25", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.25.tar.gz" + }, + { + "tag_name": "jbr11_0_14_1b2043.22", + "semver": "11.0.14.1", + "build": "2043.22", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.22.tar.gz" + }, + { + "tag_name": "jbr11_0_14_1b2043.17", + "semver": "11.0.14.1", + "build": "2043.17", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.17.tar.gz" + }, + { + "tag_name": "jbr11_0_14_1b2043.14", + "semver": "11.0.14.1", + "build": "2043.14", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.14.tar.gz" + }, + { + "tag_name": "jbr11_0_14_1b2043.11", + "semver": "11.0.14.1", + "build": "2043.11", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.11.tar.gz" + }, + { + "tag_name": "jbr11_0_14b2043.2", + "semver": "11.0.14", + "build": "2043.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14-linux-x64-b2043.2.tar.gz" + }, + { + "tag_name": "jbr11_0_14_1b1751.46", + "semver": "11.0.14.1", + "build": "1751.46", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b1751.46.tar.gz" + }, + { + "tag_name": "jbr11_0_14b1993.2", + "semver": "11.0.14", + "build": "1993.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14-linux-x64-b1993.2.tar.gz" + }, + { + "tag_name": "jbr17_0_2b315.1", + "semver": "17.0.2", + "build": "315.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17_0_2-linux-x64-b315.1.tar.gz" + }, + { + "tag_name": "jbr11_0_14b1982.1", + "semver": "11.0.14", + "build": "1982.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14-linux-x64-b1982.1.tar.gz" + }, + { + "tag_name": "jbr11_0_13b1890.3", + "semver": "11.0.13", + "build": "1890.3", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1890.3.tar.gz" + }, + { + "tag_name": "jbr11_0_13b1751.25", + "semver": "11.0.13", + "build": "1751.25", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.25.tar.gz" + }, + { + "tag_name": "jbr11_0_13b1751.24", + "semver": "11.0.13", + "build": "1751.24", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.24.tar.gz" + }, + { + "tag_name": "jbr11_0_13b1751.21", + "semver": "11.0.13", + "build": "1751.21", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.21.tar.gz" + }, + { + "tag_name": "jbr17_0_1b164.8", + "semver": "17.0.1", + "build": "164.8", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17_0_1-linux-x64-b164.8.tar.gz" + }, + { + "tag_name": "jbr11_0_13b1751.19", + "semver": "11.0.13", + "build": "1751.19", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.19.tar.gz" + }, + { + "tag_name": "jb11_0_13-b1504.49", + "semver": "11.0.13", + "build": "1504.49", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1504.49.tar.gz" + }, + { + "tag_name": "jbr17_0_1b164.4", + "semver": "17.0.1", + "build": "164.4", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17_0_1-linux-x64-b164.4.tar.gz" + }, + { + "tag_name": "jbr11_0_13b1751.16", + "semver": "11.0.13", + "build": "1751.16", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.16.tar.gz" + }, + { + "tag_name": "jbr11_0_12b1751.11", + "semver": "11.0.12", + "build": "1751.11", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1751.11.tar.gz" + }, + { + "tag_name": "jbr11_0_12b1729.1", + "semver": "11.0.12", + "build": "1729.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1729.1.tar.gz" + }, + { + "tag_name": "jbr11_0_12b1715.4", + "semver": "11.0.12", + "build": "1715.4", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1715.4.tar.gz" + }, + { + "tag_name": "jbr11_0_12b1692.9", + "semver": "11.0.12", + "build": "1692.9", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1692.9.tar.gz" + }, + { + "tag_name": "jb11_0_12-b1504.37", + "semver": "11.0.12", + "build": "1504.37", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1504.37.tar.gz" + }, + { + "tag_name": "jbr11_0_12b1665.1", + "semver": "11.0.12", + "build": "1665.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1665.1.tar.gz" + }, + { + "tag_name": "jb11_0_12-b1504.28", + "semver": "11.0.12", + "build": "1504.28", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1504.28.tar.gz" + }, + { + "tag_name": "jb11_0_12-b1504.27", + "semver": "11.0.12", + "build": "1504.27", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1504.27.tar.gz" + }, + { + "tag_name": "jb11_0_11-b1504.16", + "semver": "11.0.11", + "build": "1504.16", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1504.16.tar.gz" + }, + { + "tag_name": "jb11_0_11-b1504.13", + "semver": "11.0.11", + "build": "1504.13", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1504.13.tar.gz" + }, + { + "tag_name": "jb11_0_11-b1504.12", + "semver": "11.0.11", + "build": "1504.12", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1504.12.tar.gz" + }, + { + "tag_name": "jb11_0_11-b1542.1", + "semver": "11.0.11", + "build": "1542.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1542.1.tar.gz" + }, + { + "tag_name": "jb11_0_11-b1504.8", + "semver": "11.0.11", + "build": "1504.8", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1504.8.tar.gz" + }, + { + "tag_name": "11_0_11b1536.2", + "semver": "11.0.11", + "build": "1536.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1536.2.tar.gz" + }, + { + "tag_name": "jbr-release-21.0.3b465.3", + "semver": "21.0.3", + "build": "465.3", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.3-linux-x64-b465.3.tar.gz" + }, + { + "tag_name": "jbr-release-21.0.3b458.1", + "semver": "21.0.3", + "build": "458.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.3-linux-x64-b458.1.tar.gz" + }, + { + "tag_name": "jbr-release-21.0.3b453.2", + "semver": "21.0.3", + "build": "453.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.3-linux-x64-b453.2.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.11b1207.24", + "semver": "17.0.11", + "build": "1207.24", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.11-linux-x64-b1207.24.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.11b1207.23", + "semver": "17.0.11", + "build": "1207.23", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.11-linux-x64-b1207.23.tar.gz" + }, + { + "tag_name": "jbr-release-21.0.3b446.1", + "semver": "21.0.3", + "build": "446.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.3-linux-x64-b446.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1207.14", + "semver": "17.0.10", + "build": "1207.14", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1207.14.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b829.27", + "semver": "17.0.10", + "build": "829.27", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b829.27.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1087.23", + "semver": "17.0.10", + "build": "1087.23", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1087.23.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1207.12", + "semver": "17.0.10", + "build": "1207.12", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1207.12.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1087.21", + "semver": "17.0.10", + "build": "1087.21", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1087.21.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1207.6", + "semver": "17.0.10", + "build": "1207.6", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1207.6.tar.gz" + }, + { + "tag_name": "jbr-release-21.0.2b375.1", + "semver": "21.0.2", + "build": "375.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.2-linux-x64-b375.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1207.1", + "semver": "17.0.10", + "build": "1207.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1207.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1186.1", + "semver": "17.0.10", + "build": "1186.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1186.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1171.14", + "semver": "17.0.10", + "build": "1171.14", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1171.14.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b829.26", + "semver": "17.0.10", + "build": "829.26", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b829.26.tar.gz" + }, + { + "tag_name": "jbr-release-21.0.2b346.3", + "semver": "21.0.2", + "build": "346.3", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.2-linux-x64-b346.3.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1000.48", + "semver": "17.0.10", + "build": "1000.48", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1000.48.tar.gz" + }, + { + "tag_name": "jbr-release-21.0.2b341.4", + "semver": "21.0.2", + "build": "341.4", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-21.0.2-linux-x64-b341.4.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.10b1087.17", + "semver": "17.0.10", + "build": "1087.17", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.10-linux-x64-b1087.17.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.9b1166.2", + "semver": "17.0.9", + "build": "1166.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1166.2.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.9b1162.7", + "semver": "17.0.9", + "build": "1162.7", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1162.7.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.9b1087.11", + "semver": "17.0.9", + "build": "1087.11", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1087.11.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.9b1087.9", + "semver": "17.0.9", + "build": "1087.9", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1087.9.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.9b1087.7", + "semver": "17.0.9", + "build": "1087.7", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1087.7.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.9b1000.47", + "semver": "17.0.9", + "build": "1000.47", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1000.47.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.9b1000.46", + "semver": "17.0.9", + "build": "1000.46", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1000.46.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.9b1087.3", + "semver": "17.0.9", + "build": "1087.3", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.9-linux-x64-b1087.3.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.8.1b1080.1", + "semver": "17.0.8.1", + "build": "1080.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1080.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.8.1b1072.1", + "semver": "17.0.8.1", + "build": "1072.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1072.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.8.1b1070.2", + "semver": "17.0.8.1", + "build": "1070.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1070.2.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.8.1b1063.1", + "semver": "17.0.8.1", + "build": "1063.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1063.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.8.1b1000.32", + "semver": "17.0.8.1", + "build": "1000.32", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1000.32.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.8.1b1059.3", + "semver": "17.0.8.1", + "build": "1059.3", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8.1-linux-x64-b1059.3.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.8b1000.22", + "semver": "17.0.8", + "build": "1000.22", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8-linux-x64-b1000.22.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.8b1000.8", + "semver": "17.0.8", + "build": "1000.8", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.8-linux-x64-b1000.8.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b1000.6", + "semver": "17.0.7", + "build": "1000.6", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b1000.6.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b1000.5", + "semver": "17.0.7", + "build": "1000.5", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b1000.5.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b1000.2", + "semver": "17.0.7", + "build": "1000.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b1000.2.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b985.2", + "semver": "17.0.7", + "build": "985.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b985.2.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b979.4", + "semver": "17.0.7", + "build": "979.4", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b979.4.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b829.16", + "semver": "17.0.7", + "build": "829.16", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b829.16.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b966.2", + "semver": "17.0.7", + "build": "966.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b966.2.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b964.1", + "semver": "17.0.7", + "build": "964.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b964.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b829.14", + "semver": "17.0.7", + "build": "829.14", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b829.14.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.7b953.1", + "semver": "17.0.7", + "build": "953.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.7-linux-x64-b953.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b829.9", + "semver": "17.0.6", + "build": "829.9", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b829.9.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b469.82", + "semver": "17.0.6", + "build": "469.82", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b469.82.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b829.5", + "semver": "17.0.6", + "build": "829.5", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b829.5.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b653.34", + "semver": "17.0.6", + "build": "653.34", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b653.34.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b829.4", + "semver": "17.0.6", + "build": "829.4", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b829.4.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b829.1", + "semver": "17.0.6", + "build": "829.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b829.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b653.32", + "semver": "17.0.6", + "build": "653.32", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b653.32.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b802.4", + "semver": "17.0.6", + "build": "802.4", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b802.4.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b802.1", + "semver": "17.0.6", + "build": "802.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b802.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b785.1", + "semver": "17.0.6", + "build": "785.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b785.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.6b779.1", + "semver": "17.0.6", + "build": "779.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.6-linux-x64-b779.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.5b762.1", + "semver": "17.0.5", + "build": "762.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b762.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.5b653.25", + "semver": "17.0.5", + "build": "653.25", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b653.25.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.5b759.1", + "semver": "17.0.5", + "build": "759.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b759.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.5b653.23", + "semver": "17.0.5", + "build": "653.23", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b653.23.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.5b653.14", + "semver": "17.0.5", + "build": "653.14", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b653.14.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.5b469.71", + "semver": "17.0.5", + "build": "469.71", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b469.71.tar.gz" + }, + { + "tag_name": "jbr11_0_16b2043.64", + "semver": "11.0.16", + "build": "2043.64", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_nomod-11_0_16-linux-x64-b2043.64.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.5b653.6", + "semver": "17.0.5", + "build": "653.6", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b653.6.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.5b469.67", + "semver": "17.0.5", + "build": "469.67", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.5-linux-x64-b469.67.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.4.1b653.1", + "semver": "17.0.4.1", + "build": "653.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b653.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.4.1b646.8", + "semver": "17.0.4.1", + "build": "646.8", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b646.8.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.4.1b629.2", + "semver": "17.0.4.1", + "build": "629.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b629.2.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.4.1b617.2", + "semver": "17.0.4.1", + "build": "617.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b617.2.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.4.1b469.62", + "semver": "17.0.4.1", + "build": "469.62", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b469.62.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.4.1b597.1", + "semver": "17.0.4.1", + "build": "597.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4.1-linux-x64-b597.1.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.4b469.53", + "semver": "17.0.4", + "build": "469.53", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4-linux-x64-b469.53.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.4b469.44", + "semver": "17.0.4", + "build": "469.44", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.4-linux-x64-b469.44.tar.gz" + }, + { + "tag_name": "jbr-release-17.0.3b469.37", + "semver": "17.0.3", + "build": "469.37", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.37.tar.gz" + }, + { + "tag_name": "jbr17.0.3b469.32", + "semver": "17.0.3", + "build": "469.32", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.32.tar.gz" + }, + { + "tag_name": "jbr17.0.3b469.30", + "semver": "17.0.3", + "build": "469.30", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.30.tar.gz" + }, + { + "tag_name": "jbr17.0.3b469.19", + "semver": "17.0.3", + "build": "469.19", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.19.tar.gz" + }, + { + "tag_name": "jbr17.0.3b498.3", + "semver": "17.0.3", + "build": "498.3", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b498.3.tar.gz" + }, + { + "tag_name": "jbr17.0.3b469.16", + "semver": "17.0.3", + "build": "469.16", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.16.tar.gz" + }, + { + "tag_name": "jbr17.0.3b469.12", + "semver": "17.0.3", + "build": "469.12", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.12.tar.gz" + }, + { + "tag_name": "jbr17.0.3b469.3", + "semver": "17.0.3", + "build": "469.3", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b469.3.tar.gz" + }, + { + "tag_name": "jbr17.0.3b463.3", + "semver": "17.0.3", + "build": "463.3", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b463.3.tar.gz" + }, + { + "tag_name": "jbr17.0.3b423.10", + "semver": "17.0.3", + "build": "423.10", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.3-linux-x64-b423.10.tar.gz" + }, + { + "tag_name": "jbr11_0_15b2043.56", + "semver": "11.0.15", + "build": "2043.56", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_nomod-11_0_15-linux-x64-b2043.56.tar.gz" + }, + { + "tag_name": "jbr11_0_14_1b2043.45", + "semver": "11.0.14.1", + "build": "2043.45", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk_nomod-11_0_14_1-linux-x64-b2043.45.tar.gz" + }, + { + "tag_name": "jbr17.0.2b396.4", + "semver": "17.0.2", + "build": "396.4", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17.0.2-linux-x64-b396.4.tar.gz" + }, + { + "tag_name": "jbr11_0_14_1b2043.25", + "semver": "11.0.14.1", + "build": "2043.25", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.25.tar.gz" + }, + { + "tag_name": "jbr11_0_14_1b2043.22", + "semver": "11.0.14.1", + "build": "2043.22", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.22.tar.gz" + }, + { + "tag_name": "jbr11_0_14_1b2043.17", + "semver": "11.0.14.1", + "build": "2043.17", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.17.tar.gz" + }, + { + "tag_name": "jbr11_0_14_1b2043.14", + "semver": "11.0.14.1", + "build": "2043.14", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.14.tar.gz" + }, + { + "tag_name": "jbr11_0_14_1b2043.11", + "semver": "11.0.14.1", + "build": "2043.11", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b2043.11.tar.gz" + }, + { + "tag_name": "jbr11_0_14b2043.2", + "semver": "11.0.14", + "build": "2043.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14-linux-x64-b2043.2.tar.gz" + }, + { + "tag_name": "jbr11_0_14_1b1751.46", + "semver": "11.0.14.1", + "build": "1751.46", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14_1-linux-x64-b1751.46.tar.gz" + }, + { + "tag_name": "jbr11_0_14b1993.2", + "semver": "11.0.14", + "build": "1993.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14-linux-x64-b1993.2.tar.gz" + }, + { + "tag_name": "jbr17_0_2b315.1", + "semver": "17.0.2", + "build": "315.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17_0_2-linux-x64-b315.1.tar.gz" + }, + { + "tag_name": "jbr11_0_14b1982.1", + "semver": "11.0.14", + "build": "1982.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_14-linux-x64-b1982.1.tar.gz" + }, + { + "tag_name": "jbr11_0_13b1890.3", + "semver": "11.0.13", + "build": "1890.3", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1890.3.tar.gz" + }, + { + "tag_name": "jbr11_0_13b1751.25", + "semver": "11.0.13", + "build": "1751.25", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.25.tar.gz" + }, + { + "tag_name": "jbr11_0_13b1751.24", + "semver": "11.0.13", + "build": "1751.24", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.24.tar.gz" + }, + { + "tag_name": "jbr11_0_13b1751.21", + "semver": "11.0.13", + "build": "1751.21", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.21.tar.gz" + }, + { + "tag_name": "jbr17_0_1b164.8", + "semver": "17.0.1", + "build": "164.8", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17_0_1-linux-x64-b164.8.tar.gz" + }, + { + "tag_name": "jbr11_0_13b1751.19", + "semver": "11.0.13", + "build": "1751.19", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.19.tar.gz" + }, + { + "tag_name": "jb11_0_13-b1504.49", + "semver": "11.0.13", + "build": "1504.49", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1504.49.tar.gz" + }, + { + "tag_name": "jbr17_0_1b164.4", + "semver": "17.0.1", + "build": "164.4", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-17_0_1-linux-x64-b164.4.tar.gz" + }, + { + "tag_name": "jbr11_0_13b1751.16", + "semver": "11.0.13", + "build": "1751.16", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_13-linux-x64-b1751.16.tar.gz" + }, + { + "tag_name": "jbr11_0_12b1751.11", + "semver": "11.0.12", + "build": "1751.11", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1751.11.tar.gz" + }, + { + "tag_name": "jbr11_0_12b1729.1", + "semver": "11.0.12", + "build": "1729.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1729.1.tar.gz" + }, + { + "tag_name": "jbr11_0_12b1715.4", + "semver": "11.0.12", + "build": "1715.4", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1715.4.tar.gz" + }, + { + "tag_name": "jbr11_0_12b1692.9", + "semver": "11.0.12", + "build": "1692.9", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1692.9.tar.gz" + }, + { + "tag_name": "jb11_0_12-b1504.37", + "semver": "11.0.12", + "build": "1504.37", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1504.37.tar.gz" + }, + { + "tag_name": "jbr11_0_12b1665.1", + "semver": "11.0.12", + "build": "1665.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1665.1.tar.gz" + }, + { + "tag_name": "jb11_0_12-b1504.28", + "semver": "11.0.12", + "build": "1504.28", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1504.28.tar.gz" + }, + { + "tag_name": "jb11_0_12-b1504.27", + "semver": "11.0.12", + "build": "1504.27", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_12-linux-x64-b1504.27.tar.gz" + }, + { + "tag_name": "jb11_0_11-b1504.16", + "semver": "11.0.11", + "build": "1504.16", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1504.16.tar.gz" + }, + { + "tag_name": "jb11_0_11-b1504.13", + "semver": "11.0.11", + "build": "1504.13", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1504.13.tar.gz" + }, + { + "tag_name": "jb11_0_11-b1504.12", + "semver": "11.0.11", + "build": "1504.12", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1504.12.tar.gz" + }, + { + "tag_name": "jb11_0_11-b1542.1", + "semver": "11.0.11", + "build": "1542.1", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1542.1.tar.gz" + }, + { + "tag_name": "jb11_0_11-b1504.8", + "semver": "11.0.11", + "build": "1504.8", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1504.8.tar.gz" + }, + { + "tag_name": "11_0_11b1536.2", + "semver": "11.0.11", + "build": "1536.2", + "url": "https://cache-redirector.jetbrains.com/intellij-jbr/jbrsdk-11_0_11-linux-x64-b1536.2.tar.gz" + } +] \ No newline at end of file diff --git a/__tests__/data/microsoft.json b/__tests__/data/microsoft.json index 18e67d9d3..b2f0e68a1 100644 --- a/__tests__/data/microsoft.json +++ b/__tests__/data/microsoft.json @@ -1,4 +1,47 @@ [ + { + "version": "25.0.0", + "stable": true, + "release_url": "https://aka.ms/download-jdk", + "files": [ + { + "filename": "microsoft-jdk-25.0.0-macos-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-macos-x64.tar.gz" + }, + { + "filename": "microsoft-jdk-25.0.0-linux-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-linux-x64.tar.gz" + }, + { + "filename": "microsoft-jdk-25.0.0-windows-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-windows-x64.zip" + }, + { + "filename": "microsoft-jdk-25.0.0-macos-aarch64.tar.gz", + "arch": "aarch64", + "platform": "darwin", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-macos-aarch64.tar.gz" + }, + { + "filename": "microsoft-jdk-25.0.0-linux-aarch64.tar.gz", + "arch": "aarch64", + "platform": "linux", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-linux-aarch64.tar.gz" + }, + { + "filename": "microsoft-jdk-25.0.0-windows-aarch64.zip", + "arch": "aarch64", + "platform": "win32", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-windows-aarch64.zip" + } + ] + }, { "version": "21.0.0", "stable": true, diff --git a/__tests__/data/sdkman-java-versions.csv b/__tests__/data/sdkman-java-versions.csv new file mode 100644 index 000000000..5c75a44c9 --- /dev/null +++ b/__tests__/data/sdkman-java-versions.csv @@ -0,0 +1,135 @@ +6.0.119-zulu, 6.0.119 +7.0.352-zulu, 7.0.352 +8.0.282-trava, 8.0.282 +8.0.432-albba, 8.0.432 +8.0.432-amzn, 8.0.432 +8.0.432-kona, 8.0.432 +8.0.432-librca, 8.0.432 +8.0.432-sem, 8.0.432 +8.0.432-tem, 8.0.432 +8.0.432-zulu, 8.0.432 +8.0.432.fx-librca, 8.0.432 +8.0.432.fx-zulu, 8.0.432 +8.0.442-amzn, 8.0.442 +8.0.442-librca, 8.0.442 +8.0.442-tem, 8.0.442 +8.0.442-zulu, 8.0.442 +8.0.442.fx-librca, 8.0.442 +8.0.442.fx-zulu, 8.0.442 +11.0.14.1-jbr, 11.0.14 +11.0.15-trava, 11.0.15 +11.0.25-albba, 11.0.25 +11.0.25-amzn, 11.0.25 +11.0.25-kona, 11.0.25 +11.0.25-librca, 11.0.25 +11.0.25-ms, 11.0.25 +11.0.25-sapmchn, 11.0.25 +11.0.25-sem, 11.0.25 +11.0.25-tem, 11.0.25 +11.0.25-zulu, 11.0.25 +11.0.25.fx-librca, 11.0.25 +11.0.25.fx-zulu, 11.0.25 +11.0.26-amzn, 11.0.26 +11.0.26-librca, 11.0.26 +11.0.26-ms, 11.0.26 +11.0.26-sapmchn, 11.0.26 +11.0.26-zulu, 11.0.26 +11.0.26.fx-librca, 11.0.26 +11.0.26.fx-zulu, 11.0.26 +17.0.12-graal, 17.0.12 +17.0.12-jbr, 17.0.12 +17.0.12-oracle, 17.0.12 +17.0.13-albba, 17.0.13 +17.0.13-amzn, 17.0.13 +17.0.13-kona, 17.0.13 +17.0.13-librca, 17.0.13 +17.0.13-ms, 17.0.13 +17.0.13-sapmchn, 17.0.13 +17.0.13-sem, 17.0.13 +17.0.13-tem, 17.0.13 +17.0.13-zulu, 17.0.13 +17.0.13.crac-librca, 17.0.13 +17.0.13.crac-zulu, 17.0.13 +17.0.13.fx-librca, 17.0.13 +17.0.13.fx-zulu, 17.0.13 +17.0.14-amzn, 17.0.14 +17.0.14-librca, 17.0.14 +17.0.14-ms, 17.0.14 +17.0.14-sapmchn, 17.0.14 +17.0.14-zulu, 17.0.14 +17.0.14.fx-librca, 17.0.14 +17.0.14.fx-zulu, 17.0.14 +17.0.9-graalce, 17.0.9 +21.0.2-graalce, 21.0.2 +21.0.2-open, 21.0.2 +21.0.5-amzn, 21.0.5 +21.0.5-graal, 21.0.5 +21.0.5-jbr, 21.0.5 +21.0.5-kona, 21.0.5 +21.0.5-librca, 21.0.5 +21.0.5-ms, 21.0.5 +21.0.5-oracle, 21.0.5 +21.0.5-sapmchn, 21.0.5 +21.0.5-sem, 21.0.5 +21.0.5-tem, 21.0.5 +21.0.5-zulu, 21.0.5 +21.0.5.crac-librca, 21.0.5 +21.0.5.crac-zulu, 21.0.5 +21.0.5.fx-librca, 21.0.5 +21.0.5.fx-zulu, 21.0.5 +21.0.6-amzn, 21.0.6 +21.0.6-graal, 21.0.6 +21.0.6-librca, 21.0.6 +21.0.6-ms, 21.0.6 +21.0.6-oracle, 21.0.6 +21.0.6-sapmchn, 21.0.6 +21.0.6-tem, 21.0.6 +21.0.6-zulu, 21.0.6 +21.0.6.fx-librca, 21.0.6 +21.0.6.fx-zulu, 21.0.6 +22.0.2-oracle, 22.0.2 +22.1.0.1.r11-gln, 22.1.0 +22.1.0.1.r17-gln, 22.1.0 +22.3.5.r11-nik, 22.3.5 +22.3.5.r17-mandrel, 22.3.5 +22.3.5.r17-nik, 22.3.5 +23-open, 23 +23.0.1-amzn, 23.0.1 +23.0.1-graal, 23.0.1 +23.0.1-graalce, 23.0.1 +23.0.1-librca, 23.0.1 +23.0.1-open, 23.0.1 +23.0.1-oracle, 23.0.1 +23.0.1-sapmchn, 23.0.1 +23.0.1-tem, 23.0.1 +23.0.1-zulu, 23.0.1 +23.0.1.crac-zulu, 23.0.1 +23.0.1.fx-librca, 23.0.1 +23.0.1.fx-zulu, 23.0.1 +23.0.2-amzn, 23.0.2 +23.0.2-graal, 23.0.2 +23.0.2-graalce, 23.0.2 +23.0.2-librca, 23.0.2 +23.0.2-oracle, 23.0.2 +23.0.2-sapmchn, 23.0.2 +23.0.2-tem, 23.0.2 +23.0.2-zulu, 23.0.2 +23.0.2.fx-librca, 23.0.2 +23.0.2.fx-zulu, 23.0.2 +23.0.6.fx-nik, 23.0.6 +23.0.6.r17-mandrel, 23.0.6 +23.0.6.r17-nik, 23.0.6 +23.1.5.fx-nik, 23.1.5 +23.1.5.r21-mandrel, 23.1.5 +23.1.5.r21-nik, 23.1.5 +24.0.2.r22-mandrel, 24.0.2 +24.ea.27-graal, 24.0.0 +24.ea.28-graal, 24.0.0 +24.ea.31-open, 24.0.0 +24.ea.32-open, 24.0.0 +24.1.1.r23-mandrel, 24.1.1 +24.1.1.r23-nik, 24.1.1 +25.ea.4-graal, 25.0.0 +25.ea.5-graal, 25.0.0 +25.ea.5-open, 25.0.0 +25.ea.6-open, 25.0.0 \ No newline at end of file diff --git a/__tests__/distributors/adopt-installer.test.ts b/__tests__/distributors/adopt-installer.test.ts index 8a112243f..0b35c3d3e 100644 --- a/__tests__/distributors/adopt-installer.test.ts +++ b/__tests__/distributors/adopt-installer.test.ts @@ -191,7 +191,9 @@ describe('getAvailableVersions', () => { ])( 'defaults to os.arch(): %s mapped to distro arch: %s', async (osArch: string, distroArch: string) => { - jest.spyOn(os, 'arch').mockReturnValue(osArch); + jest + .spyOn(os, 'arch') + .mockReturnValue(osArch as ReturnType); const installerOptions: JavaInstallerOptions = { version: '17', diff --git a/__tests__/distributors/base-installer.test.ts b/__tests__/distributors/base-installer.test.ts index b2c610260..08a95828c 100644 --- a/__tests__/distributors/base-installer.test.ts +++ b/__tests__/distributors/base-installer.test.ts @@ -287,7 +287,7 @@ describe('setupJava', () => { spyCoreSetOutput = jest.spyOn(core, 'setOutput'); spyCoreSetOutput.mockImplementation(() => undefined); - jest.spyOn(os, 'arch').mockReturnValue('x86'); + jest.spyOn(os, 'arch').mockReturnValue('x86' as ReturnType); }); afterEach(() => { diff --git a/__tests__/distributors/corretto-installer.test.ts b/__tests__/distributors/corretto-installer.test.ts index a8ffef229..1da5e393e 100644 --- a/__tests__/distributors/corretto-installer.test.ts +++ b/__tests__/distributors/corretto-installer.test.ts @@ -150,9 +150,8 @@ describe('getAvailableVersions', () => { }); mockPlatform(distribution, platform); - const availableVersion = await distribution['findPackageForDownload']( - version - ); + const availableVersion = + await distribution['findPackageForDownload'](version); expect(availableVersion).not.toBeNull(); expect(availableVersion.url).toBe(expectedLink); }); @@ -203,29 +202,27 @@ describe('getAvailableVersions', () => { }); it.each([ - ['arm64', 'aarch64'], - ['amd64', 'x64'] + ['amd64', 'x64'], + ['arm64', 'aarch64'] ])( 'defaults to os.arch(): %s mapped to distro arch: %s', async (osArch: string, distroArch: string) => { - jest.spyOn(os, 'arch').mockReturnValue(osArch); + jest + .spyOn(os, 'arch') + .mockReturnValue(osArch as ReturnType); - const version = '17'; - const installerOptions: JavaInstallerOptions = { - version, + const distribution = new CorrettoDistribution({ + version: '17', architecture: '', // to get default value packageType: 'jdk', checkLatest: false - }; - - const distribution = new CorrettoDistribution(installerOptions); + }); mockPlatform(distribution, 'macos'); const expectedLink = `https://corretto.aws/downloads/resources/17.0.2.8.1/amazon-corretto-17.0.2.8.1-macosx-${distroArch}.tar.gz`; - const availableVersion = await distribution['findPackageForDownload']( - version - ); + const availableVersion = + await distribution['findPackageForDownload']('17'); expect(availableVersion).not.toBeNull(); expect(availableVersion.url).toBe(expectedLink); } diff --git a/__tests__/distributors/dragonwell-installer.test.ts b/__tests__/distributors/dragonwell-installer.test.ts index 4a680d8f3..627a96ab3 100644 --- a/__tests__/distributors/dragonwell-installer.test.ts +++ b/__tests__/distributors/dragonwell-installer.test.ts @@ -206,9 +206,8 @@ describe('getAvailableVersions', () => { }); mockPlatform(distribution, platform); - const availableVersion = await distribution['findPackageForDownload']( - jdkVersion - ); + const availableVersion = + await distribution['findPackageForDownload'](jdkVersion); expect(availableVersion).not.toBeNull(); expect(availableVersion.url).toBe(expectedLink); } diff --git a/__tests__/distributors/graalvm-installer.test.ts b/__tests__/distributors/graalvm-installer.test.ts index ae2db43cb..d2dda9f6d 100644 --- a/__tests__/distributors/graalvm-installer.test.ts +++ b/__tests__/distributors/graalvm-installer.test.ts @@ -1,152 +1,924 @@ -import {GraalVMDistribution} from '../../src/distributions/graalvm/installer'; -import os from 'os'; import * as core from '@actions/core'; -import {getDownloadArchiveExtension} from '../../src/util'; -import {HttpClient} from '@actions/http-client'; +import * as tc from '@actions/tool-cache'; +import * as http from '@actions/http-client'; +import fs from 'fs'; +import path from 'path'; +import {GraalVMDistribution} from '../../src/distributions/graalvm/installer'; +import {JavaInstallerOptions} from '../../src/distributions/base-models'; +import * as util from '../../src/util'; + +jest.mock('@actions/core'); +jest.mock('@actions/tool-cache'); +jest.mock('@actions/http-client'); + +jest.mock('../../src/util', () => ({ + ...jest.requireActual('../../src/util'), + extractJdkFile: jest.fn(), + getDownloadArchiveExtension: jest.fn(), + renameWinArchive: jest.fn(), + getGitHubHttpHeaders: jest.fn().mockReturnValue({Accept: 'application/json'}) +})); + +jest.mock('fs', () => ({ + ...jest.requireActual('fs'), + readdirSync: jest.fn(), + existsSync: jest.fn() +})); + +beforeAll(() => { + process.env.NODE_ENV = 'test'; + + if (!jest.isMockFunction(http.HttpClient)) { + throw new Error('HTTP client must be mocked in tests!'); + } -describe('findPackageForDownload', () => { + if (!jest.isMockFunction(tc.downloadTool)) { + throw new Error('Tool cache downloadTool must be mocked in tests!'); + } + + console.log('✅ All external dependencies are properly mocked'); +}); + +describe('GraalVMDistribution', () => { let distribution: GraalVMDistribution; - let spyDebug: jest.SpyInstance; - let spyHttpClient: jest.SpyInstance; + let mockHttpClient: jest.Mocked; + + const defaultOptions: JavaInstallerOptions = { + version: '17', + architecture: 'x64', + packageType: 'jdk', + checkLatest: false + }; beforeEach(() => { - distribution = new GraalVMDistribution({ - version: '', - architecture: 'x64', - packageType: 'jdk', - checkLatest: false - }); + jest.clearAllMocks(); + + distribution = new GraalVMDistribution(defaultOptions); + + mockHttpClient = new http.HttpClient() as jest.Mocked; + (distribution as any).http = mockHttpClient; - spyDebug = jest.spyOn(core, 'debug'); - spyDebug.mockImplementation(() => {}); + (util.getDownloadArchiveExtension as jest.Mock).mockReturnValue('tar.gz'); }); - it.each([ - [ - '21', - '21', - 'https://download.oracle.com/graalvm/21/latest/graalvm-jdk-21_{{OS_TYPE}}-x64_bin.{{ARCHIVE_TYPE}}' - ], - [ - '21.0.4', - '21.0.4', - 'https://download.oracle.com/graalvm/21/archive/graalvm-jdk-21.0.4_{{OS_TYPE}}-x64_bin.{{ARCHIVE_TYPE}}' - ], - [ - '17', - '17', - 'https://download.oracle.com/graalvm/17/latest/graalvm-jdk-17_{{OS_TYPE}}-x64_bin.{{ARCHIVE_TYPE}}' - ], - [ - '17.0.12', - '17.0.12', - 'https://download.oracle.com/graalvm/17/archive/graalvm-jdk-17.0.12_{{OS_TYPE}}-x64_bin.{{ARCHIVE_TYPE}}' - ] - ])('version is %s -> %s', async (input, expectedVersion, expectedUrl) => { - /* Needed only for this particular test because /latest/ urls tend to change */ - spyHttpClient = jest.spyOn(HttpClient.prototype, 'head'); - spyHttpClient.mockReturnValue( - Promise.resolve({ - message: { - statusCode: 200 - } - }) - ); + afterAll(() => { + expect(jest.isMockFunction(http.HttpClient)).toBe(true); - const result = await distribution['findPackageForDownload'](input); + expect(jest.isMockFunction(tc.downloadTool)).toBe(true); + expect(jest.isMockFunction(tc.cacheDir)).toBe(true); jest.restoreAllMocks(); + jest.clearAllMocks(); + }); + + describe('getPlatform', () => { + it('should map darwin to macos', () => { + const result = distribution.getPlatform('darwin'); + expect(result).toBe('macos'); + }); + + it('should map win32 to windows', () => { + const result = distribution.getPlatform('win32'); + expect(result).toBe('windows'); + }); + + it('should map linux to linux', () => { + const result = distribution.getPlatform('linux'); + expect(result).toBe('linux'); + }); + + it('should throw error for unsupported platform', () => { + expect(() => distribution.getPlatform('aix' as NodeJS.Platform)).toThrow( + "Platform 'aix' is not supported. Supported platforms: 'linux', 'macos', 'windows'" + ); + }); + }); + + describe('downloadTool', () => { + const javaRelease = { + version: '17.0.5', + url: 'https://example.com/graalvm.tar.gz' + }; + + beforeEach(() => { + (tc.downloadTool as jest.Mock).mockResolvedValue('/tmp/archive.tar.gz'); + (tc.cacheDir as jest.Mock).mockResolvedValue('/cached/java/path'); + + (util.extractJdkFile as jest.Mock).mockResolvedValue('/tmp/extracted'); + + // Mock renameWinArchive - it returns the same path (no renaming) + (util.renameWinArchive as jest.Mock).mockImplementation((p: string) => p); + + (util.getDownloadArchiveExtension as jest.Mock).mockReturnValue('tar.gz'); + + // Mock fs.existsSync to return true for extracted path + (fs.existsSync as jest.Mock).mockReturnValue(true); + + (fs.readdirSync as jest.Mock).mockReturnValue(['graalvm-jdk-17.0.5']); + + jest + .spyOn(distribution as any, 'getToolcacheVersionName') + .mockImplementation(version => version); + }); + + it('should download, extract and cache the tool successfully', async () => { + const result = await (distribution as any).downloadTool(javaRelease); + + // Verify the download was initiated + expect(tc.downloadTool).toHaveBeenCalledWith(javaRelease.url); + + // The implementation uses the original path for extraction + expect(util.extractJdkFile).toHaveBeenCalledWith( + '/tmp/archive.tar.gz', // Original path + 'tar.gz' + ); + + // Verify path existence check + expect(fs.existsSync).toHaveBeenCalledWith('/tmp/extracted'); + + // Verify directory reading + expect(fs.readdirSync).toHaveBeenCalledWith('/tmp/extracted'); + + // Verify caching with correct parameters + expect(tc.cacheDir).toHaveBeenCalledWith( + path.join('/tmp/extracted', 'graalvm-jdk-17.0.5'), + 'Java_GraalVM_jdk', + '17.0.5', + 'x64' + ); + + // Verify the result + expect(result).toEqual({ + version: '17.0.5', + path: '/cached/java/path' + }); + + // Verify logging + expect(core.info).toHaveBeenCalledWith( + 'Downloading Java 17.0.5 (GraalVM) from https://example.com/graalvm.tar.gz ...' + ); + expect(core.info).toHaveBeenCalledWith('Extracting Java archive...'); + }); + + it('should throw error when extracted path does not exist', async () => { + (fs.existsSync as jest.Mock).mockReturnValue(false); + + await expect( + (distribution as any).downloadTool(javaRelease) + ).rejects.toThrow( + 'Extraction failed: path /tmp/extracted does not exist' + ); + + expect(core.error).toHaveBeenCalledWith( + expect.stringContaining('Failed to download and extract GraalVM:') + ); + }); + + it('should throw error when extracted directory is empty', async () => { + (fs.existsSync as jest.Mock).mockReturnValue(true); + (fs.readdirSync as jest.Mock).mockReturnValue([]); + + await expect( + (distribution as any).downloadTool(javaRelease) + ).rejects.toThrow( + 'Extraction failed: no files found in extracted directory' + ); + + expect(core.error).toHaveBeenCalledWith( + expect.stringContaining('Failed to download and extract GraalVM:') + ); + }); + + it('should handle download errors', async () => { + const downloadError = new Error('Network error during download'); + (tc.downloadTool as jest.Mock).mockRejectedValue(downloadError); + + await expect( + (distribution as any).downloadTool(javaRelease) + ).rejects.toThrow('Network error during download'); + + expect(core.error).toHaveBeenCalledWith( + 'Failed to download and extract GraalVM: Error: Network error during download' + ); + }); + + it('should handle extraction errors', async () => { + const extractError = new Error('Failed to extract archive'); + (util.extractJdkFile as jest.Mock).mockRejectedValue(extractError); + + await expect( + (distribution as any).downloadTool(javaRelease) + ).rejects.toThrow('Failed to extract archive'); + + expect(core.error).toHaveBeenCalledWith( + 'Failed to download and extract GraalVM: Error: Failed to extract archive' + ); + }); + + it('should handle different archive extensions', async () => { + // Test with a .zip file + (util.getDownloadArchiveExtension as jest.Mock).mockReturnValue('zip'); + (tc.downloadTool as jest.Mock).mockResolvedValue('/tmp/archive.zip'); + + const zipRelease = { + version: '17.0.5', + url: 'https://example.com/graalvm.zip' + }; + + const result = await (distribution as any).downloadTool(zipRelease); + + expect(util.extractJdkFile).toHaveBeenCalledWith( + '/tmp/archive.zip', + 'zip' + ); + + expect(result).toEqual({ + version: '17.0.5', + path: '/cached/java/path' + }); + }); + }); + + describe('findPackageForDownload', () => { + beforeEach(() => { + jest.spyOn(distribution, 'getPlatform').mockReturnValue('linux'); + }); + + describe('input validation', () => { + it('should throw error for null version range', async () => { + await expect( + (distribution as any).findPackageForDownload(null) + ).rejects.toThrow('Version range is required and must be a string'); + }); + + it('should throw error for undefined version range', async () => { + await expect( + (distribution as any).findPackageForDownload(undefined) + ).rejects.toThrow('Version range is required and must be a string'); + }); + + it('should throw error for empty string version range', async () => { + await expect( + (distribution as any).findPackageForDownload('') + ).rejects.toThrow('Version range is required and must be a string'); + }); + + it('should throw error for non-string version range', async () => { + await expect( + (distribution as any).findPackageForDownload(123) + ).rejects.toThrow('Version range is required and must be a string'); + }); + + it('should throw error for invalid version format', async () => { + await expect( + (distribution as any).findPackageForDownload('abc') + ).rejects.toThrow('Invalid version format: abc'); + }); + }); + + describe('stable builds', () => { + it('should construct correct URL for specific version', async () => { + const mockResponse = { + message: {statusCode: 200} + } as http.HttpClientResponse; + mockHttpClient.head.mockResolvedValue(mockResponse); + + const result = await (distribution as any).findPackageForDownload( + '17.0.5' + ); + + expect(result).toEqual({ + url: 'https://download.oracle.com/graalvm/17/archive/graalvm-jdk-17.0.5_linux-x64_bin.tar.gz', + version: '17.0.5' + }); + expect(mockHttpClient.head).toHaveBeenCalledWith(result.url); + }); + + it('should construct correct URL for major version (latest)', async () => { + const mockResponse = { + message: {statusCode: 200} + } as http.HttpClientResponse; + mockHttpClient.head.mockResolvedValue(mockResponse); + + const result = await (distribution as any).findPackageForDownload('21'); + + expect(result).toEqual({ + url: 'https://download.oracle.com/graalvm/21/latest/graalvm-jdk-21_linux-x64_bin.tar.gz', + version: '21' + }); + }); + + it('should throw error for unsupported architecture', async () => { + distribution = new GraalVMDistribution({ + ...defaultOptions, + architecture: 'x86' + }); + (distribution as any).http = mockHttpClient; + + await expect( + (distribution as any).findPackageForDownload('17') + ).rejects.toThrow( + 'Unsupported architecture: x86. Supported architectures are: x64, aarch64' + ); + }); + + it('should throw error for JDK versions less than 17', async () => { + await expect( + (distribution as any).findPackageForDownload('11') + ).rejects.toThrow( + 'GraalVM is only supported for JDK 17 and later. Requested version: 11' + ); + }); + + it('should throw error for non-jdk package types', async () => { + distribution = new GraalVMDistribution({ + ...defaultOptions, + packageType: 'jre' + }); + (distribution as any).http = mockHttpClient; + + await expect( + (distribution as any).findPackageForDownload('17') + ).rejects.toThrow('GraalVM provides only the `jdk` package type'); + }); + + it('should throw error when file not found (404)', async () => { + const mockResponse = { + message: {statusCode: 404} + } as http.HttpClientResponse; + mockHttpClient.head.mockResolvedValue(mockResponse); + + await expect( + (distribution as any).findPackageForDownload('17.0.99') + ).rejects.toThrow( + 'Could not find GraalVM for SemVer 17.0.99. Please check if this version is available at https://download.oracle.com/graalvm' + ); + }); + + it('should throw error for unauthorized access (401)', async () => { + const mockResponse = { + message: {statusCode: 401} + } as http.HttpClientResponse; + mockHttpClient.head.mockResolvedValue(mockResponse); + + await expect( + (distribution as any).findPackageForDownload('17') + ).rejects.toThrow( + 'Access denied when downloading GraalVM. Status code: 401. Please check your credentials or permissions.' + ); + }); + + it('should throw error for forbidden access (403)', async () => { + const mockResponse = { + message: {statusCode: 403} + } as http.HttpClientResponse; + mockHttpClient.head.mockResolvedValue(mockResponse); + + await expect( + (distribution as any).findPackageForDownload('17') + ).rejects.toThrow( + 'Access denied when downloading GraalVM. Status code: 403. Please check your credentials or permissions.' + ); + }); + + it('should throw error for other HTTP errors with status message', async () => { + const mockResponse = { + message: { + statusCode: 500, + statusMessage: 'Internal Server Error' + } + } as http.HttpClientResponse; + mockHttpClient.head.mockResolvedValue(mockResponse); - expect(result.version).toBe(expectedVersion); - const osType = distribution.getPlatform(); - const archiveType = getDownloadArchiveExtension(); - const url = expectedUrl - .replace('{{OS_TYPE}}', osType) - .replace('{{ARCHIVE_TYPE}}', archiveType); - expect(result.url).toBe(url); + await expect( + (distribution as any).findPackageForDownload('17') + ).rejects.toThrow( + 'HTTP request for GraalVM failed with status code: 500 (Internal Server Error)' + ); + }); + + it('should throw error for other HTTP errors without status message', async () => { + const mockResponse = { + message: {statusCode: 500} + } as http.HttpClientResponse; + mockHttpClient.head.mockResolvedValue(mockResponse); + + await expect( + (distribution as any).findPackageForDownload('17') + ).rejects.toThrow( + 'HTTP request for GraalVM failed with status code: 500 (Unknown error)' + ); + }); + }); + + describe('EA builds', () => { + beforeEach(() => { + distribution = new GraalVMDistribution(defaultOptions); + (distribution as any).http = mockHttpClient; + (distribution as any).stable = false; + }); + + it('should delegate to findEABuildDownloadUrl for unstable versions', async () => { + const currentPlatform = + process.platform === 'win32' ? 'windows' : process.platform; + + const mockEAVersions = [ + { + version: '23-ea-20240716', + latest: true, + download_base_url: 'https://example.com/download/', + files: [ + { + arch: 'x64', + platform: currentPlatform, + filename: 'graalvm-jdk-23_linux-x64_bin.tar.gz' + }, + { + arch: 'aarch64', + platform: currentPlatform, + filename: 'graalvm-jdk-23_linux-aarch64_bin.tar.gz' + } + ] + } + ]; + + mockHttpClient.getJson.mockResolvedValue({ + result: mockEAVersions, + statusCode: 200, + headers: {} + }); + + jest + .spyOn(distribution as any, 'distributionArchitecture') + .mockReturnValue('x64'); + + const result = await (distribution as any).findPackageForDownload('23'); + + expect(result).toEqual({ + url: 'https://example.com/download/graalvm-jdk-23_linux-x64_bin.tar.gz', + version: '23-ea-20240716' + }); + + expect(mockHttpClient.getJson).toHaveBeenCalledWith( + 'https://api.github.com/repos/graalvm/oracle-graalvm-ea-builds/contents/versions/23-ea.json?ref=main', + {Accept: 'application/json'} + ); + }); + + it('should throw error when no latest EA version found', async () => { + const currentPlatform = + process.platform === 'win32' ? 'windows' : process.platform; + + const mockEAVersions = [ + { + version: '23-ea-20240716', + latest: false, + download_base_url: 'https://example.com/download/', + files: [ + { + arch: 'x64', + platform: currentPlatform, + filename: 'graalvm-jdk-23_linux-x64_bin.tar.gz' + } + ] + } + ]; + + mockHttpClient.getJson.mockResolvedValue({ + result: mockEAVersions, + statusCode: 200, + headers: {} + }); + + jest + .spyOn(distribution as any, 'distributionArchitecture') + .mockReturnValue('x64'); + + await expect( + (distribution as any).findPackageForDownload('23') + ).rejects.toThrow("Unable to find latest version for '23-ea'"); + + // Verify error logging + expect(core.error).toHaveBeenCalledWith( + 'Available versions: 23-ea-20240716' + ); + }); + + it('should throw error when no matching file for architecture in EA build', async () => { + const currentPlatform = + process.platform === 'win32' ? 'windows' : process.platform; + + const mockEAVersions = [ + { + version: '23-ea-20240716', + latest: true, + download_base_url: 'https://example.com/download/', + files: [ + { + arch: 'arm64', + platform: currentPlatform, + filename: 'graalvm-jdk-23_linux-arm64_bin.tar.gz' + } + ] + } + ]; + + mockHttpClient.getJson.mockResolvedValue({ + result: mockEAVersions, + statusCode: 200, + headers: {} + }); + + jest + .spyOn(distribution as any, 'distributionArchitecture') + .mockReturnValue('x64'); + + await expect( + (distribution as any).findPackageForDownload('23') + ).rejects.toThrow( + `Unable to find file for architecture 'x64' and platform '${currentPlatform}'` + ); + + // Verify error logging + expect(core.error).toHaveBeenCalledWith( + expect.stringContaining('Available files for architecture x64:') + ); + }); + + it('should throw error when no matching platform in EA build', async () => { + const mockEAVersions = [ + { + version: '23-ea-20240716', + latest: true, + download_base_url: 'https://example.com/download/', + files: [ + { + arch: 'x64', + platform: 'different-platform', + filename: 'graalvm-jdk-23_different-x64_bin.tar.gz' + } + ] + } + ]; + + mockHttpClient.getJson.mockResolvedValue({ + result: mockEAVersions, + statusCode: 200, + headers: {} + }); + + jest + .spyOn(distribution as any, 'distributionArchitecture') + .mockReturnValue('x64'); + + const currentPlatform = + process.platform === 'win32' ? 'windows' : process.platform; + + await expect( + (distribution as any).findPackageForDownload('23') + ).rejects.toThrow( + `Unable to find file for architecture 'x64' and platform '${currentPlatform}'` + ); + }); + + it('should throw error when filename does not start with graalvm-jdk-', async () => { + const currentPlatform = + process.platform === 'win32' ? 'windows' : process.platform; + + const mockEAVersions = [ + { + version: '23-ea-20240716', + latest: true, + download_base_url: 'https://example.com/download/', + files: [ + { + arch: 'x64', + platform: currentPlatform, + filename: 'wrong-prefix-23_linux-x64_bin.tar.gz' + } + ] + } + ]; + + mockHttpClient.getJson.mockResolvedValue({ + result: mockEAVersions, + statusCode: 200, + headers: {} + }); + + jest + .spyOn(distribution as any, 'distributionArchitecture') + .mockReturnValue('x64'); + + await expect( + (distribution as any).findPackageForDownload('23') + ).rejects.toThrow( + "Invalid filename format: wrong-prefix-23_linux-x64_bin.tar.gz. Expected to start with 'graalvm-jdk-'" + ); + }); + + it('should throw error when EA version JSON is not found', async () => { + mockHttpClient.getJson.mockResolvedValue({ + result: null, + statusCode: 404, + headers: {} + }); + + await expect( + (distribution as any).findPackageForDownload('23') + ).rejects.toThrow( + "No GraalVM EA build found for version '23-ea'. Please check if the version is correct." + ); + }); + }); }); - it.each([ - [ - '24-ea', - /^https:\/\/github\.com\/graalvm\/oracle-graalvm-ea-builds\/releases\/download\/jdk-24\.0\.0-ea\./ - ] - ])('version is %s -> %s', async (version, expectedUrlPrefix) => { - /* Needed only for this particular test because /latest/ urls tend to change */ - spyHttpClient = jest.spyOn(HttpClient.prototype, 'head'); - spyHttpClient.mockReturnValue( - Promise.resolve({ - message: { - statusCode: 200 + describe('findEABuildDownloadUrl', () => { + const currentPlatform = + process.platform === 'win32' ? 'windows' : process.platform; + + const mockEAVersions = [ + { + version: '23-ea-20240716', + latest: true, + download_base_url: 'https://example.com/download/', + files: [ + { + arch: 'x64', + platform: currentPlatform, + filename: 'graalvm-jdk-23_linux-x64_bin.tar.gz' + }, + { + arch: 'aarch64', + platform: currentPlatform, + filename: 'graalvm-jdk-23_linux-aarch64_bin.tar.gz' + } + ] + }, + { + version: '23-ea-20240709', + latest: false, + download_base_url: 'https://example.com/old/', + files: [ + { + arch: 'x64', + platform: currentPlatform, + filename: 'graalvm-jdk-23_linux-x64_bin.tar.gz' + } + ] + } + ]; + + let fetchEASpy: jest.SpyInstance; + + beforeEach(() => { + fetchEASpy = jest.spyOn(distribution as any, 'fetchEAJson'); + jest + .spyOn(distribution as any, 'distributionArchitecture') + .mockReturnValue('x64'); + }); + + it('should find latest version and return correct URL', async () => { + fetchEASpy.mockResolvedValue(mockEAVersions); + + const result = await (distribution as any).findEABuildDownloadUrl( + '23-ea' + ); + + expect(fetchEASpy).toHaveBeenCalledWith('23-ea'); + expect(result).toEqual({ + url: 'https://example.com/download/graalvm-jdk-23_linux-x64_bin.tar.gz', + version: '23-ea-20240716' + }); + + // Verify debug logging + expect(core.debug).toHaveBeenCalledWith('Searching for EA build: 23-ea'); + expect(core.debug).toHaveBeenCalledWith('Found 2 EA versions'); + expect(core.debug).toHaveBeenCalledWith( + 'Latest version found: 23-ea-20240716' + ); + expect(core.debug).toHaveBeenCalledWith( + 'Download URL: https://example.com/download/graalvm-jdk-23_linux-x64_bin.tar.gz' + ); + }); + + it('should throw error when no latest version found', async () => { + const noLatestVersions = mockEAVersions.map(v => ({...v, latest: false})); + fetchEASpy.mockResolvedValue(noLatestVersions); + + await expect( + (distribution as any).findEABuildDownloadUrl('23-ea') + ).rejects.toThrow("Unable to find latest version for '23-ea'"); + + expect(core.error).toHaveBeenCalledWith( + 'Available versions: 23-ea-20240716, 23-ea-20240709' + ); + }); + + it('should throw error when no matching file for architecture', async () => { + const wrongArchVersions = [ + { + version: '23-ea-20240716', + latest: true, + download_base_url: 'https://example.com/download/', + files: [ + { + arch: 'arm', + platform: currentPlatform, + filename: 'graalvm-jdk-23_linux-arm_bin.tar.gz' + } + ] } - }) - ); + ]; + fetchEASpy.mockResolvedValue(wrongArchVersions); - const eaDistro = new GraalVMDistribution({ - version, - architecture: '', // to get default value - packageType: 'jdk', - checkLatest: false + await expect( + (distribution as any).findEABuildDownloadUrl('23-ea') + ).rejects.toThrow( + `Unable to find file for architecture 'x64' and platform '${currentPlatform}'` + ); + + expect(core.error).toHaveBeenCalledWith( + expect.stringContaining('Available files for architecture x64:') + ); }); - const versionWithoutEA = version.split('-')[0]; - const result = await eaDistro['findPackageForDownload'](versionWithoutEA); + it('should throw error when filename does not start with graalvm-jdk-', async () => { + const badFilenameVersions = [ + { + version: '23-ea-20240716', + latest: true, + download_base_url: 'https://example.com/download/', + files: [ + { + arch: 'x64', + platform: currentPlatform, + filename: 'wrong-name.tar.gz' + } + ] + } + ]; + fetchEASpy.mockResolvedValue(badFilenameVersions); - jest.restoreAllMocks(); + await expect( + (distribution as any).findEABuildDownloadUrl('23-ea') + ).rejects.toThrow( + "Invalid filename format: wrong-name.tar.gz. Expected to start with 'graalvm-jdk-'" + ); + }); + + it('should work with aarch64 architecture', async () => { + jest + .spyOn(distribution as any, 'distributionArchitecture') + .mockReturnValue('aarch64'); + + fetchEASpy.mockResolvedValue(mockEAVersions); + + const result = await (distribution as any).findEABuildDownloadUrl( + '23-ea' + ); - expect(result.url).toEqual(expect.stringMatching(expectedUrlPrefix)); + expect(result).toEqual({ + url: 'https://example.com/download/graalvm-jdk-23_linux-aarch64_bin.tar.gz', + version: '23-ea-20240716' + }); + }); + + it('should throw error when platform does not match', async () => { + const wrongPlatformVersions = [ + { + version: '23-ea-20240716', + latest: true, + download_base_url: 'https://example.com/download/', + files: [ + { + arch: 'x64', + platform: 'different-platform', + filename: 'graalvm-jdk-23_different-x64_bin.tar.gz' + } + ] + } + ]; + fetchEASpy.mockResolvedValue(wrongPlatformVersions); + + await expect( + (distribution as any).findEABuildDownloadUrl('23-ea') + ).rejects.toThrow( + `Unable to find file for architecture 'x64' and platform '${currentPlatform}'` + ); + }); }); - it.each([ - ['amd64', 'x64'], - ['arm64', 'aarch64'] - ])( - 'defaults to os.arch(): %s mapped to distro arch: %s', - async (osArch: string, distroArch: string) => { - jest.spyOn(os, 'arch').mockReturnValue(osArch); - jest.spyOn(os, 'platform').mockReturnValue('linux'); - - const version = '21'; - const distro = new GraalVMDistribution({ - version, - architecture: '', // to get default value - packageType: 'jdk', - checkLatest: false - }); - - const osType = distribution.getPlatform(); - if (osType === 'windows' && distroArch == 'aarch64') { - return; // skip, aarch64 is not available for Windows + describe('fetchEAJson', () => { + it('should fetch and return EA version data', async () => { + const mockData = [{version: '23-ea', files: []}]; + mockHttpClient.getJson.mockResolvedValue({ + result: mockData, + statusCode: 200, + headers: {} + }); + + const result = await (distribution as any).fetchEAJson('23-ea'); + + expect(mockHttpClient.getJson).toHaveBeenCalledWith( + 'https://api.github.com/repos/graalvm/oracle-graalvm-ea-builds/contents/versions/23-ea.json?ref=main', + {Accept: 'application/json'} + ); + expect(result).toEqual(mockData); + expect(core.debug).toHaveBeenCalled(); + }); + + it('should throw error when no data returned', async () => { + mockHttpClient.getJson.mockResolvedValue({ + result: null, + statusCode: 200, + headers: {} + }); + + await expect((distribution as any).fetchEAJson('23-ea')).rejects.toThrow( + "No GraalVM EA build found for version '23-ea'. Please check if the version is correct." + ); + }); + + it('should handle 404 errors with specific message', async () => { + const error404 = new Error('Not Found: 404'); + mockHttpClient.getJson.mockRejectedValue(error404); + + await expect((distribution as any).fetchEAJson('23-ea')).rejects.toThrow( + "GraalVM EA version '23-ea' not found. Please verify the version exists in the EA builds repository." + ); + }); + + it('should handle generic HTTP errors with context', async () => { + const networkError = new Error('Network timeout'); + mockHttpClient.getJson.mockRejectedValue(networkError); + + await expect((distribution as any).fetchEAJson('23-ea')).rejects.toThrow( + "Failed to fetch GraalVM EA version information for '23-ea': Network timeout" + ); + }); + + it('should handle non-Error exceptions', async () => { + mockHttpClient.getJson.mockRejectedValue('String error'); + + await expect((distribution as any).fetchEAJson('23-ea')).rejects.toThrow( + "Failed to fetch GraalVM EA version information for '23-ea'" + ); + }); + }); + + describe('Integration tests', () => { + it('should handle different architectures correctly', async () => { + const architectures = ['x64', 'aarch64']; + + for (const arch of architectures) { + distribution = new GraalVMDistribution({ + ...defaultOptions, + architecture: arch + }); + (distribution as any).http = mockHttpClient; + + const mockResponse = { + message: {statusCode: 200} + } as http.HttpClientResponse; + mockHttpClient.head.mockResolvedValue(mockResponse); + + const result = await (distribution as any).findPackageForDownload('17'); + expect(result.url).toContain(arch); } - const archiveType = getDownloadArchiveExtension(); - const result = await distro['findPackageForDownload'](version); - const expectedUrl = `https://download.oracle.com/graalvm/21/latest/graalvm-jdk-21_${osType}-${distroArch}_bin.${archiveType}`; - - expect(result.url).toBe(expectedUrl); - } - ); - - it('should throw an error', async () => { - await expect(distribution['findPackageForDownload']('8')).rejects.toThrow( - /GraalVM is only supported for JDK 17 and later/ - ); - await expect(distribution['findPackageForDownload']('11')).rejects.toThrow( - /GraalVM is only supported for JDK 17 and later/ - ); - await expect(distribution['findPackageForDownload']('18')).rejects.toThrow( - /Could not find GraalVM for SemVer */ - ); - - const unavailableEADistro = new GraalVMDistribution({ - version: '17-ea', - architecture: '', // to get default value - packageType: 'jdk', - checkLatest: false - }); - await expect( - unavailableEADistro['findPackageForDownload']('17') - ).rejects.toThrow( - /No GraalVM EA build found\. Are you sure java-version: '17-ea' is correct\?/ - ); + }); + + it('should handle different platforms correctly', async () => { + const platforms = [ + {process: 'darwin', expected: 'macos'}, + {process: 'win32', expected: 'windows'}, + {process: 'linux', expected: 'linux'} + ]; + + const originalPlatform = process.platform; + + for (const {process: proc, expected} of platforms) { + Object.defineProperty(process, 'platform', { + value: proc, + configurable: true + }); + + distribution = new GraalVMDistribution(defaultOptions); + (distribution as any).http = mockHttpClient; + + const mockResponse = { + message: {statusCode: 200} + } as http.HttpClientResponse; + mockHttpClient.head.mockResolvedValue(mockResponse); + + const result = await (distribution as any).findPackageForDownload('17'); + expect(result.url).toContain(expected); + } + + Object.defineProperty(process, 'platform', { + value: originalPlatform, + configurable: true + }); + }); }); }); diff --git a/__tests__/distributors/jetbrains-installer.test.ts b/__tests__/distributors/jetbrains-installer.test.ts index 02316e44d..44d8ef896 100644 --- a/__tests__/distributors/jetbrains-installer.test.ts +++ b/__tests__/distributors/jetbrains-installer.test.ts @@ -41,9 +41,7 @@ describe('getAvailableVersions', () => { expect(availableVersions).not.toBeNull(); const length = - os.platform() === 'win32' - ? manifestData.length - 1 - : manifestData.length + 1; + os.platform() === 'win32' ? manifestData.length : manifestData.length + 2; expect(availableVersions.length).toBe(length); }, 10_000); }); @@ -78,9 +76,8 @@ describe('findPackageForDownload', () => { checkLatest: false }); distribution['getAvailableVersions'] = async () => manifestData as any; - const resolvedVersion = await distribution['findPackageForDownload']( - input - ); + const resolvedVersion = + await distribution['findPackageForDownload'](input); const url = resolvedVersion.url; const options = {method: 'HEAD'}; diff --git a/__tests__/distributors/liberica-installer.test.ts b/__tests__/distributors/liberica-installer.test.ts index 33a51017d..5e664d5f3 100644 --- a/__tests__/distributors/liberica-installer.test.ts +++ b/__tests__/distributors/liberica-installer.test.ts @@ -105,9 +105,11 @@ describe('getAvailableVersions', () => { ])( 'defaults to os.arch(): %s mapped to distro arch: %s', async (osArch: string, distroArch: DistroArch) => { - jest.spyOn(os, 'arch').mockReturnValue(osArch); + jest + .spyOn(os, 'arch') + .mockReturnValue(osArch as ReturnType); - const distribution = new LibericaDistributions({ + const distributions = new LibericaDistributions({ version: '17', architecture: '', // to get default value packageType: 'jdk', @@ -117,11 +119,11 @@ describe('getAvailableVersions', () => { const additionalParams = '&installation-type=archive&fields=downloadUrl%2Cversion%2CfeatureVersion%2CinterimVersion%2C' + 'updateVersion%2CbuildVersion'; - distribution['getPlatformOption'] = () => 'macos'; + distributions['getPlatformOption'] = () => 'macos'; const buildUrl = `https://api.bell-sw.com/v1/liberica/releases?os=macos&bundle-type=jdk&bitness=${distroArch.bitness}&arch=${distroArch.arch}&build-type=all${additionalParams}`; - await distribution['getAvailableVersions'](); + await distributions['getAvailableVersions'](); expect(spyHttpClient.mock.calls).toHaveLength(1); expect(spyHttpClient.mock.calls[0][0]).toBe(buildUrl); diff --git a/__tests__/distributors/liberica-linux-installer.test.ts b/__tests__/distributors/liberica-linux-installer.test.ts index 8e6a665e0..58c4e4781 100644 --- a/__tests__/distributors/liberica-linux-installer.test.ts +++ b/__tests__/distributors/liberica-linux-installer.test.ts @@ -105,7 +105,9 @@ describe('getAvailableVersions', () => { ])( 'defaults to os.arch(): %s mapped to distro arch: %s', async (osArch: string, distroArch: DistroArch) => { - jest.spyOn(os, 'arch').mockReturnValue(osArch); + jest + .spyOn(os, 'arch') + .mockReturnValue(osArch as ReturnType); const distribution = new LibericaDistributions({ version: '17', diff --git a/__tests__/distributors/liberica-windows-installer.test.ts b/__tests__/distributors/liberica-windows-installer.test.ts index 1ccc57ede..22d287410 100644 --- a/__tests__/distributors/liberica-windows-installer.test.ts +++ b/__tests__/distributors/liberica-windows-installer.test.ts @@ -105,7 +105,9 @@ describe('getAvailableVersions', () => { ])( 'defaults to os.arch(): %s mapped to distro arch: %s', async (osArch: string, distroArch: DistroArch) => { - jest.spyOn(os, 'arch').mockReturnValue(osArch); + jest + .spyOn(os, 'arch') + .mockReturnValue(osArch as ReturnType); const distribution = new LibericaDistributions({ version: '17', diff --git a/__tests__/distributors/microsoft-installer.test.ts b/__tests__/distributors/microsoft-installer.test.ts index 00c4b6c6e..16c436370 100644 --- a/__tests__/distributors/microsoft-installer.test.ts +++ b/__tests__/distributors/microsoft-installer.test.ts @@ -29,6 +29,11 @@ describe('findPackageForDownload', () => { }); it.each([ + [ + '25.x', + '25.0.0', + 'https://aka.ms/download-jdk/microsoft-jdk-25.0.0-{{OS_TYPE}}-x64.{{ARCHIVE_TYPE}}' + ], [ '21.x', '21.0.0', @@ -95,7 +100,9 @@ describe('findPackageForDownload', () => { ])( 'defaults to os.arch(): %s mapped to distro arch: %s', async (osArch: string, distroArch: string) => { - jest.spyOn(os, 'arch').mockReturnValue(osArch); + jest + .spyOn(os, 'arch') + .mockReturnValue(osArch as ReturnType); jest.spyOn(os, 'platform').mockReturnValue('darwin'); const version = '17'; @@ -119,7 +126,9 @@ describe('findPackageForDownload', () => { ])( 'defaults to os.arch(): %s mapped to distro arch: %s', async (osArch: string, distroArch: string) => { - jest.spyOn(os, 'arch').mockReturnValue(osArch); + jest + .spyOn(os, 'arch') + .mockReturnValue(osArch as ReturnType); jest.spyOn(os, 'platform').mockReturnValue('linux'); const version = '17'; @@ -143,7 +152,9 @@ describe('findPackageForDownload', () => { ])( 'defaults to os.arch(): %s mapped to distro arch: %s', async (osArch: string, distroArch: string) => { - jest.spyOn(os, 'arch').mockReturnValue(osArch); + jest + .spyOn(os, 'arch') + .mockReturnValue(osArch as ReturnType); jest.spyOn(os, 'platform').mockReturnValue('win32'); const version = '17'; diff --git a/__tests__/distributors/oracle-installer.test.ts b/__tests__/distributors/oracle-installer.test.ts index de391a542..226eca905 100644 --- a/__tests__/distributors/oracle-installer.test.ts +++ b/__tests__/distributors/oracle-installer.test.ts @@ -95,7 +95,9 @@ describe('findPackageForDownload', () => { ])( 'defaults to os.arch(): %s mapped to distro arch: %s', async (osArch: string, distroArch: string) => { - jest.spyOn(os, 'arch').mockReturnValue(osArch); + jest + .spyOn(os, 'arch') + .mockReturnValue(osArch as ReturnType); jest.spyOn(os, 'platform').mockReturnValue('linux'); const version = '18'; diff --git a/__tests__/distributors/sapmachine-installer.test.ts b/__tests__/distributors/sapmachine-installer.test.ts index 4eec570a8..5073cd9fe 100644 --- a/__tests__/distributors/sapmachine-installer.test.ts +++ b/__tests__/distributors/sapmachine-installer.test.ts @@ -61,9 +61,8 @@ describe('getAvailableVersions', () => { mockPlatform(distribution, 'linux'); - const availableVersion = await distribution['findPackageForDownload']( - version - ); + const availableVersion = + await distribution['findPackageForDownload'](version); expect(availableVersion).not.toBeNull(); expect(availableVersion.url).toBe( 'https://github.com/SAP/SapMachine/releases/download/sapmachine-17.0.10/sapmachine-jdk-17.0.10_linux-x64_bin.tar.gz' @@ -230,9 +229,8 @@ describe('getAvailableVersions', () => { }); mockPlatform(distribution, platform); - const availableVersion = await distribution['findPackageForDownload']( - normalizedVersion - ); + const availableVersion = + await distribution['findPackageForDownload'](normalizedVersion); expect(availableVersion).not.toBeNull(); expect(availableVersion.url).toBe(expectedLink); } diff --git a/__tests__/distributors/temurin-installer.test.ts b/__tests__/distributors/temurin-installer.test.ts index b8c9e7fde..f540901eb 100644 --- a/__tests__/distributors/temurin-installer.test.ts +++ b/__tests__/distributors/temurin-installer.test.ts @@ -147,7 +147,9 @@ describe('getAvailableVersions', () => { ])( 'defaults to os.arch(): %s mapped to distro arch: %s', async (osArch: string, distroArch: string) => { - jest.spyOn(os, 'arch').mockReturnValue(distroArch); + jest + .spyOn(os, 'arch') + .mockReturnValue(osArch as ReturnType); const installerOptions: JavaInstallerOptions = { version: '17', diff --git a/__tests__/distributors/zulu-installer.test.ts b/__tests__/distributors/zulu-installer.test.ts index f8b8a72cb..100429b30 100644 --- a/__tests__/distributors/zulu-installer.test.ts +++ b/__tests__/distributors/zulu-installer.test.ts @@ -1,5 +1,4 @@ import {HttpClient} from '@actions/http-client'; -import * as semver from 'semver'; import {ZuluDistribution} from '../../src/distributions/zulu/installer'; import {IZuluVersions} from '../../src/distributions/zulu/models'; import * as utils from '../../src/util'; @@ -126,7 +125,9 @@ describe('getAvailableVersions', () => { ])( 'defaults to os.arch(): %s mapped to distro arch: %s', async (osArch: string, distroArch: DistroArch) => { - jest.spyOn(os, 'arch').mockReturnValue(osArch); + jest + .spyOn(os, 'arch') + .mockReturnValue(osArch as ReturnType); const distribution = new ZuluDistribution({ version: '17', diff --git a/__tests__/distributors/zulu-linux-installer.test.ts b/__tests__/distributors/zulu-linux-installer.test.ts index 60f36ee59..a25344cbd 100644 --- a/__tests__/distributors/zulu-linux-installer.test.ts +++ b/__tests__/distributors/zulu-linux-installer.test.ts @@ -126,7 +126,9 @@ describe('getAvailableVersions', () => { ])( 'defaults to os.arch(): %s mapped to distro arch: %s', async (osArch: string, distroArch: DistroArch) => { - jest.spyOn(os, 'arch').mockReturnValue(osArch); + jest + .spyOn(os, 'arch') + .mockReturnValue(osArch as ReturnType); const distribution = new ZuluDistribution({ version: '17', @@ -135,7 +137,9 @@ describe('getAvailableVersions', () => { checkLatest: false }); distribution['getPlatformOption'] = () => 'linux'; - const buildUrl = `https://api.azul.com/zulu/download/community/v1.0/bundles/?os=linux&ext=zip&bundle_type=jdk&javafx=false&arch=${distroArch.arch}&hw_bitness=${distroArch.bitness}&release_status=ga`; + // Override extension for linux default arch case to match util behavior + spyUtilGetDownloadArchiveExtension.mockReturnValue('tar.gz'); + const buildUrl = `https://api.azul.com/zulu/download/community/v1.0/bundles/?os=linux&ext=tar.gz&bundle_type=jdk&javafx=false&arch=${distroArch.arch}&hw_bitness=${distroArch.bitness}&release_status=ga`; await distribution['getAvailableVersions'](); diff --git a/__tests__/distributors/zulu-windows-installer.test.ts b/__tests__/distributors/zulu-windows-installer.test.ts index dcac5aa0d..a3511ac90 100644 --- a/__tests__/distributors/zulu-windows-installer.test.ts +++ b/__tests__/distributors/zulu-windows-installer.test.ts @@ -126,7 +126,9 @@ describe('getAvailableVersions', () => { ])( 'defaults to os.arch(): %s mapped to distro arch: %s', async (osArch: string, distroArch: DistroArch) => { - jest.spyOn(os, 'arch').mockReturnValue(osArch); + jest + .spyOn(os, 'arch') + .mockReturnValue(osArch as ReturnType); const distribution = new ZuluDistribution({ version: '17', diff --git a/__tests__/util.test.ts b/__tests__/util.test.ts index 9c943c2fa..85b76069e 100644 --- a/__tests__/util.test.ts +++ b/__tests__/util.test.ts @@ -1,7 +1,10 @@ import * as cache from '@actions/cache'; import * as core from '@actions/core'; +import * as fs from 'fs'; +import * as path from 'path'; import { convertVersionToSemver, + getVersionFromFileContent, isVersionSatisfies, isCacheFeatureAvailable, isGhes @@ -82,6 +85,43 @@ describe('convertVersionToSemver', () => { }); }); +describe('getVersionFromFileContent', () => { + describe('.sdkmanrc', () => { + it.each([ + ['java=11.0.20.1-tem', '11.0.20'], + ['java = 11.0.20.1-tem', '11.0.20'], + ['java=11.0.20.1-tem # a comment in sdkmanrc', '11.0.20'], + ['java=11.0.20.1-tem\n#java=21.0.20.1-tem\n', '11.0.20'], // choose first match + ['java=11.0.20.1-tem\njava=21.0.20.1-tem\n', '11.0.20'], // choose first match + ['#java=11.0.20.1-tem\njava=21.0.20.1-tem\n', '21.0.20'] // first one is 'commented' in .sdkmanrc + ])('parsing %s should return %s', (content: string, expected: string) => { + const actual = getVersionFromFileContent(content, 'openjdk', '.sdkmanrc'); + expect(actual).toBe(expected); + }); + + describe('known versions', () => { + const csv = fs.readFileSync( + path.join(__dirname, 'data/sdkman-java-versions.csv'), + 'utf8' + ); + const versions = csv.split('\n').map(r => r.split(', ')); + + it.each(versions)( + 'parsing %s should return %s', + (sdkmanJavaVersion: string, expected: string) => { + const asContent = `java=${sdkmanJavaVersion}`; + const actual = getVersionFromFileContent( + asContent, + 'openjdk', + '.sdkmanrc' + ); + expect(actual).toBe(expected); + } + ); + }); + }); +}); + describe('isGhes', () => { const pristineEnv = process.env; diff --git a/action.yml b/action.yml index 0969d5d42..21a4269d7 100644 --- a/action.yml +++ b/action.yml @@ -81,6 +81,6 @@ outputs: cache-hit: description: 'A boolean value to indicate an exact match was found for the primary key' runs: - using: 'node20' + using: 'node24' main: 'dist/setup/index.js' post: 'dist/cleanup/index.js' diff --git a/dist/cleanup/index.js b/dist/cleanup/index.js index b8d03ca1f..9affdd456 100644 --- a/dist/cleanup/index.js +++ b/dist/cleanup/index.js @@ -18700,6 +18700,9 @@ exports.userAgentPolicy = userAgentPolicy; /***/ 6279: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +"use strict"; + + var CombinedStream = __nccwpck_require__(5443); var util = __nccwpck_require__(3837); var path = __nccwpck_require__(1017); @@ -18708,23 +18711,20 @@ var https = __nccwpck_require__(5687); var parseUrl = (__nccwpck_require__(7310).parse); var fs = __nccwpck_require__(7147); var Stream = (__nccwpck_require__(2781).Stream); +var crypto = __nccwpck_require__(6113); var mime = __nccwpck_require__(3583); var asynckit = __nccwpck_require__(4812); +var setToStringTag = __nccwpck_require__(1770); +var hasOwn = __nccwpck_require__(2157); var populate = __nccwpck_require__(3971); -// Public API -module.exports = FormData; - -// make it a Stream -util.inherits(FormData, CombinedStream); - /** * Create readable "multipart/form-data" streams. * Can be used to submit forms * and file uploads to other web applications. * * @constructor - * @param {Object} options - Properties to be added/overriden for FormData and CombinedStream + * @param {object} options - Properties to be added/overriden for FormData and CombinedStream */ function FormData(options) { if (!(this instanceof FormData)) { @@ -18737,35 +18737,39 @@ function FormData(options) { CombinedStream.call(this); - options = options || {}; - for (var option in options) { + options = options || {}; // eslint-disable-line no-param-reassign + for (var option in options) { // eslint-disable-line no-restricted-syntax this[option] = options[option]; } } +// make it a Stream +util.inherits(FormData, CombinedStream); + FormData.LINE_BREAK = '\r\n'; FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream'; -FormData.prototype.append = function(field, value, options) { - - options = options || {}; +FormData.prototype.append = function (field, value, options) { + options = options || {}; // eslint-disable-line no-param-reassign // allow filename as single option - if (typeof options == 'string') { - options = {filename: options}; + if (typeof options === 'string') { + options = { filename: options }; // eslint-disable-line no-param-reassign } var append = CombinedStream.prototype.append.bind(this); // all that streamy business can't handle numbers - if (typeof value == 'number') { - value = '' + value; + if (typeof value === 'number' || value == null) { + value = String(value); // eslint-disable-line no-param-reassign } // https://github.com/felixge/node-form-data/issues/38 - if (util.isArray(value)) { - // Please convert your array into string - // the way web server expects it + if (Array.isArray(value)) { + /* + * Please convert your array into string + * the way web server expects it + */ this._error(new Error('Arrays are not supported.')); return; } @@ -18781,15 +18785,17 @@ FormData.prototype.append = function(field, value, options) { this._trackLength(header, value, options); }; -FormData.prototype._trackLength = function(header, value, options) { +FormData.prototype._trackLength = function (header, value, options) { var valueLength = 0; - // used w/ getLengthSync(), when length is known. - // e.g. for streaming directly from a remote server, - // w/ a known file a size, and not wanting to wait for - // incoming file to finish to get its size. + /* + * used w/ getLengthSync(), when length is known. + * e.g. for streaming directly from a remote server, + * w/ a known file a size, and not wanting to wait for + * incoming file to finish to get its size. + */ if (options.knownLength != null) { - valueLength += +options.knownLength; + valueLength += Number(options.knownLength); } else if (Buffer.isBuffer(value)) { valueLength = value.length; } else if (typeof value === 'string') { @@ -18799,12 +18805,10 @@ FormData.prototype._trackLength = function(header, value, options) { this._valueLength += valueLength; // @check why add CRLF? does this account for custom/multiple CRLFs? - this._overheadLength += - Buffer.byteLength(header) + - FormData.LINE_BREAK.length; + this._overheadLength += Buffer.byteLength(header) + FormData.LINE_BREAK.length; // empty or either doesn't have path or not an http response or not a stream - if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) && !(value instanceof Stream))) { + if (!value || (!value.path && !(value.readable && hasOwn(value, 'httpVersion')) && !(value instanceof Stream))) { return; } @@ -18814,10 +18818,8 @@ FormData.prototype._trackLength = function(header, value, options) { } }; -FormData.prototype._lengthRetriever = function(value, callback) { - - if (value.hasOwnProperty('fd')) { - +FormData.prototype._lengthRetriever = function (value, callback) { + if (hasOwn(value, 'fd')) { // take read range into a account // `end` = Infinity –> read file till the end // @@ -18826,54 +18828,52 @@ FormData.prototype._lengthRetriever = function(value, callback) { // Fix it when node fixes it. // https://github.com/joyent/node/issues/7819 if (value.end != undefined && value.end != Infinity && value.start != undefined) { - // when end specified // no need to calculate range // inclusive, starts with 0 - callback(null, value.end + 1 - (value.start ? value.start : 0)); + callback(null, value.end + 1 - (value.start ? value.start : 0)); // eslint-disable-line callback-return - // not that fast snoopy + // not that fast snoopy } else { // still need to fetch file size from fs - fs.stat(value.path, function(err, stat) { - - var fileSize; - + fs.stat(value.path, function (err, stat) { if (err) { callback(err); return; } // update final size based on the range options - fileSize = stat.size - (value.start ? value.start : 0); + var fileSize = stat.size - (value.start ? value.start : 0); callback(null, fileSize); }); } - // or http response - } else if (value.hasOwnProperty('httpVersion')) { - callback(null, +value.headers['content-length']); + // or http response + } else if (hasOwn(value, 'httpVersion')) { + callback(null, Number(value.headers['content-length'])); // eslint-disable-line callback-return - // or request stream http://github.com/mikeal/request - } else if (value.hasOwnProperty('httpModule')) { + // or request stream http://github.com/mikeal/request + } else if (hasOwn(value, 'httpModule')) { // wait till response come back - value.on('response', function(response) { + value.on('response', function (response) { value.pause(); - callback(null, +response.headers['content-length']); + callback(null, Number(response.headers['content-length'])); }); value.resume(); - // something else + // something else } else { - callback('Unknown stream'); + callback('Unknown stream'); // eslint-disable-line callback-return } }; -FormData.prototype._multiPartHeader = function(field, value, options) { - // custom header specified (as string)? - // it becomes responsible for boundary - // (e.g. to handle extra CRLFs on .NET servers) - if (typeof options.header == 'string') { +FormData.prototype._multiPartHeader = function (field, value, options) { + /* + * custom header specified (as string)? + * it becomes responsible for boundary + * (e.g. to handle extra CRLFs on .NET servers) + */ + if (typeof options.header === 'string') { return options.header; } @@ -18881,7 +18881,7 @@ FormData.prototype._multiPartHeader = function(field, value, options) { var contentType = this._getContentType(value, options); var contents = ''; - var headers = { + var headers = { // add custom disposition as third element or keep it two elements if not 'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []), // if no content type. allow it to be empty array @@ -18889,77 +18889,74 @@ FormData.prototype._multiPartHeader = function(field, value, options) { }; // allow custom headers. - if (typeof options.header == 'object') { + if (typeof options.header === 'object') { populate(headers, options.header); } var header; - for (var prop in headers) { - if (!headers.hasOwnProperty(prop)) continue; - header = headers[prop]; + for (var prop in headers) { // eslint-disable-line no-restricted-syntax + if (hasOwn(headers, prop)) { + header = headers[prop]; - // skip nullish headers. - if (header == null) { - continue; - } + // skip nullish headers. + if (header == null) { + continue; // eslint-disable-line no-restricted-syntax, no-continue + } - // convert all headers to arrays. - if (!Array.isArray(header)) { - header = [header]; - } + // convert all headers to arrays. + if (!Array.isArray(header)) { + header = [header]; + } - // add non-empty headers. - if (header.length) { - contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK; + // add non-empty headers. + if (header.length) { + contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK; + } } } return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK; }; -FormData.prototype._getContentDisposition = function(value, options) { - - var filename - , contentDisposition - ; +FormData.prototype._getContentDisposition = function (value, options) { // eslint-disable-line consistent-return + var filename; if (typeof options.filepath === 'string') { // custom filepath for relative paths filename = path.normalize(options.filepath).replace(/\\/g, '/'); - } else if (options.filename || value.name || value.path) { - // custom filename take precedence - // formidable and the browser add a name property - // fs- and request- streams have path property - filename = path.basename(options.filename || value.name || value.path); - } else if (value.readable && value.hasOwnProperty('httpVersion')) { + } else if (options.filename || (value && (value.name || value.path))) { + /* + * custom filename take precedence + * formidable and the browser add a name property + * fs- and request- streams have path property + */ + filename = path.basename(options.filename || (value && (value.name || value.path))); + } else if (value && value.readable && hasOwn(value, 'httpVersion')) { // or try http response filename = path.basename(value.client._httpMessage.path || ''); } if (filename) { - contentDisposition = 'filename="' + filename + '"'; + return 'filename="' + filename + '"'; } - - return contentDisposition; }; -FormData.prototype._getContentType = function(value, options) { - +FormData.prototype._getContentType = function (value, options) { // use custom content-type above all var contentType = options.contentType; // or try `name` from formidable, browser - if (!contentType && value.name) { + if (!contentType && value && value.name) { contentType = mime.lookup(value.name); } // or try `path` from fs-, request- streams - if (!contentType && value.path) { + if (!contentType && value && value.path) { contentType = mime.lookup(value.path); } // or if it's http-reponse - if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) { + if (!contentType && value && value.readable && hasOwn(value, 'httpVersion')) { contentType = value.headers['content-type']; } @@ -18969,18 +18966,18 @@ FormData.prototype._getContentType = function(value, options) { } // fallback to the default content type if `value` is not simple value - if (!contentType && typeof value == 'object') { + if (!contentType && value && typeof value === 'object') { contentType = FormData.DEFAULT_CONTENT_TYPE; } return contentType; }; -FormData.prototype._multiPartFooter = function() { - return function(next) { +FormData.prototype._multiPartFooter = function () { + return function (next) { var footer = FormData.LINE_BREAK; - var lastPart = (this._streams.length === 0); + var lastPart = this._streams.length === 0; if (lastPart) { footer += this._lastBoundary(); } @@ -18989,18 +18986,18 @@ FormData.prototype._multiPartFooter = function() { }.bind(this); }; -FormData.prototype._lastBoundary = function() { +FormData.prototype._lastBoundary = function () { return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK; }; -FormData.prototype.getHeaders = function(userHeaders) { +FormData.prototype.getHeaders = function (userHeaders) { var header; var formHeaders = { 'content-type': 'multipart/form-data; boundary=' + this.getBoundary() }; - for (header in userHeaders) { - if (userHeaders.hasOwnProperty(header)) { + for (header in userHeaders) { // eslint-disable-line no-restricted-syntax + if (hasOwn(userHeaders, header)) { formHeaders[header.toLowerCase()] = userHeaders[header]; } } @@ -19008,11 +19005,14 @@ FormData.prototype.getHeaders = function(userHeaders) { return formHeaders; }; -FormData.prototype.setBoundary = function(boundary) { +FormData.prototype.setBoundary = function (boundary) { + if (typeof boundary !== 'string') { + throw new TypeError('FormData boundary must be a string'); + } this._boundary = boundary; }; -FormData.prototype.getBoundary = function() { +FormData.prototype.getBoundary = function () { if (!this._boundary) { this._generateBoundary(); } @@ -19020,60 +19020,55 @@ FormData.prototype.getBoundary = function() { return this._boundary; }; -FormData.prototype.getBuffer = function() { - var dataBuffer = new Buffer.alloc( 0 ); +FormData.prototype.getBuffer = function () { + var dataBuffer = new Buffer.alloc(0); // eslint-disable-line new-cap var boundary = this.getBoundary(); // Create the form content. Add Line breaks to the end of data. for (var i = 0, len = this._streams.length; i < len; i++) { if (typeof this._streams[i] !== 'function') { - // Add content to the buffer. - if(Buffer.isBuffer(this._streams[i])) { - dataBuffer = Buffer.concat( [dataBuffer, this._streams[i]]); - }else { - dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(this._streams[i])]); + if (Buffer.isBuffer(this._streams[i])) { + dataBuffer = Buffer.concat([dataBuffer, this._streams[i]]); + } else { + dataBuffer = Buffer.concat([dataBuffer, Buffer.from(this._streams[i])]); } // Add break after content. - if (typeof this._streams[i] !== 'string' || this._streams[i].substring( 2, boundary.length + 2 ) !== boundary) { - dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(FormData.LINE_BREAK)] ); + if (typeof this._streams[i] !== 'string' || this._streams[i].substring(2, boundary.length + 2) !== boundary) { + dataBuffer = Buffer.concat([dataBuffer, Buffer.from(FormData.LINE_BREAK)]); } } } // Add the footer and return the Buffer object. - return Buffer.concat( [dataBuffer, Buffer.from(this._lastBoundary())] ); + return Buffer.concat([dataBuffer, Buffer.from(this._lastBoundary())]); }; -FormData.prototype._generateBoundary = function() { +FormData.prototype._generateBoundary = function () { // This generates a 50 character boundary similar to those used by Firefox. - // They are optimized for boyer-moore parsing. - var boundary = '--------------------------'; - for (var i = 0; i < 24; i++) { - boundary += Math.floor(Math.random() * 10).toString(16); - } - this._boundary = boundary; + // They are optimized for boyer-moore parsing. + this._boundary = '--------------------------' + crypto.randomBytes(12).toString('hex'); }; // Note: getLengthSync DOESN'T calculate streams length -// As workaround one can calculate file size manually -// and add it as knownLength option -FormData.prototype.getLengthSync = function() { +// As workaround one can calculate file size manually and add it as knownLength option +FormData.prototype.getLengthSync = function () { var knownLength = this._overheadLength + this._valueLength; - // Don't get confused, there are 3 "internal" streams for each keyval pair - // so it basically checks if there is any value added to the form + // Don't get confused, there are 3 "internal" streams for each keyval pair so it basically checks if there is any value added to the form if (this._streams.length) { knownLength += this._lastBoundary().length; } // https://github.com/form-data/form-data/issues/40 if (!this.hasKnownLength()) { - // Some async length retrievers are present - // therefore synchronous length calculation is false. - // Please use getLength(callback) to get proper length + /* + * Some async length retrievers are present + * therefore synchronous length calculation is false. + * Please use getLength(callback) to get proper length + */ this._error(new Error('Cannot calculate proper length in synchronous way.')); } @@ -19083,7 +19078,7 @@ FormData.prototype.getLengthSync = function() { // Public API to check if length of added values is known // https://github.com/form-data/form-data/issues/196 // https://github.com/form-data/form-data/issues/262 -FormData.prototype.hasKnownLength = function() { +FormData.prototype.hasKnownLength = function () { var hasKnownLength = true; if (this._valuesToMeasure.length) { @@ -19093,7 +19088,7 @@ FormData.prototype.hasKnownLength = function() { return hasKnownLength; }; -FormData.prototype.getLength = function(cb) { +FormData.prototype.getLength = function (cb) { var knownLength = this._overheadLength + this._valueLength; if (this._streams.length) { @@ -19105,13 +19100,13 @@ FormData.prototype.getLength = function(cb) { return; } - asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) { + asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function (err, values) { if (err) { cb(err); return; } - values.forEach(function(length) { + values.forEach(function (length) { knownLength += length; }); @@ -19119,31 +19114,26 @@ FormData.prototype.getLength = function(cb) { }); }; -FormData.prototype.submit = function(params, cb) { - var request - , options - , defaults = {method: 'post'} - ; - - // parse provided url if it's string - // or treat it as options object - if (typeof params == 'string') { +FormData.prototype.submit = function (params, cb) { + var request; + var options; + var defaults = { method: 'post' }; - params = parseUrl(params); + // parse provided url if it's string or treat it as options object + if (typeof params === 'string') { + params = parseUrl(params); // eslint-disable-line no-param-reassign + /* eslint sort-keys: 0 */ options = populate({ port: params.port, path: params.pathname, host: params.hostname, protocol: params.protocol }, defaults); - - // use custom params - } else { - + } else { // use custom params options = populate(params, defaults); // if no port provided use default one if (!options.port) { - options.port = options.protocol == 'https:' ? 443 : 80; + options.port = options.protocol === 'https:' ? 443 : 80; } } @@ -19151,14 +19141,14 @@ FormData.prototype.submit = function(params, cb) { options.headers = this.getHeaders(params.headers); // https if specified, fallback to http in any other case - if (options.protocol == 'https:') { + if (options.protocol === 'https:') { request = https.request(options); } else { request = http.request(options); } // get content length and fire away - this.getLength(function(err, length) { + this.getLength(function (err, length) { if (err && err !== 'Unknown stream') { this._error(err); return; @@ -19177,7 +19167,7 @@ FormData.prototype.submit = function(params, cb) { request.removeListener('error', callback); request.removeListener('response', onResponse); - return cb.call(this, error, responce); + return cb.call(this, error, responce); // eslint-disable-line no-invalid-this }; onResponse = callback.bind(this, null); @@ -19190,7 +19180,7 @@ FormData.prototype.submit = function(params, cb) { return request; }; -FormData.prototype._error = function(err) { +FormData.prototype._error = function (err) { if (!this.error) { this.error = err; this.pause(); @@ -19201,6 +19191,10 @@ FormData.prototype._error = function(err) { FormData.prototype.toString = function () { return '[object FormData]'; }; +setToStringTag(FormData, 'FormData'); + +// Public API +module.exports = FormData; /***/ }), @@ -19208,12 +19202,13 @@ FormData.prototype.toString = function () { /***/ 3971: /***/ ((module) => { -// populates missing values -module.exports = function(dst, src) { +"use strict"; - Object.keys(src).forEach(function(prop) - { - dst[prop] = dst[prop] || src[prop]; + +// populates missing values +module.exports = function (dst, src) { + Object.keys(src).forEach(function (prop) { + dst[prop] = dst[prop] || src[prop]; // eslint-disable-line no-param-reassign }); return dst; @@ -55370,7 +55365,7 @@ function expand(str, isTop) { var isOptions = m.body.indexOf(',') >= 0; if (!isSequence && !isOptions) { // {a},b} - if (m.post.match(/,.*\}/)) { + if (m.post.match(/,(?!,).*\}/)) { str = m.pre + '{' + m.body + escClose + m.post; return expand(str); } @@ -55462,6 +55457,83 @@ function expand(str, isTop) { +/***/ }), + +/***/ 9227: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var bind = __nccwpck_require__(8334); + +var $apply = __nccwpck_require__(4177); +var $call = __nccwpck_require__(2808); +var $reflectApply = __nccwpck_require__(8309); + +/** @type {import('./actualApply')} */ +module.exports = $reflectApply || bind.call($call, $apply); + + +/***/ }), + +/***/ 4177: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./functionApply')} */ +module.exports = Function.prototype.apply; + + +/***/ }), + +/***/ 2808: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./functionCall')} */ +module.exports = Function.prototype.call; + + +/***/ }), + +/***/ 6815: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var bind = __nccwpck_require__(8334); +var $TypeError = __nccwpck_require__(6361); + +var $call = __nccwpck_require__(2808); +var $actualApply = __nccwpck_require__(9227); + +/** @type {(args: [Function, thisArg?: unknown, ...args: unknown[]]) => Function} TODO FIXME, find a way to use import('.') */ +module.exports = function callBindBasic(args) { + if (args.length < 1 || typeof args[0] !== 'function') { + throw new $TypeError('a function is required'); + } + return $actualApply(bind, $call, args); +}; + + +/***/ }), + +/***/ 8309: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./reflectApply')} */ +module.exports = typeof Reflect !== 'undefined' && Reflect && Reflect.apply; + + /***/ }), /***/ 5443: @@ -55811,6 +55883,1004 @@ DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() { }; +/***/ }), + +/***/ 2693: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var callBind = __nccwpck_require__(6815); +var gOPD = __nccwpck_require__(8501); + +var hasProtoAccessor; +try { + // eslint-disable-next-line no-extra-parens, no-proto + hasProtoAccessor = /** @type {{ __proto__?: typeof Array.prototype }} */ ([]).__proto__ === Array.prototype; +} catch (e) { + if (!e || typeof e !== 'object' || !('code' in e) || e.code !== 'ERR_PROTO_ACCESS') { + throw e; + } +} + +// eslint-disable-next-line no-extra-parens +var desc = !!hasProtoAccessor && gOPD && gOPD(Object.prototype, /** @type {keyof typeof Object.prototype} */ ('__proto__')); + +var $Object = Object; +var $getPrototypeOf = $Object.getPrototypeOf; + +/** @type {import('./get')} */ +module.exports = desc && typeof desc.get === 'function' + ? callBind([desc.get]) + : typeof $getPrototypeOf === 'function' + ? /** @type {import('./get')} */ function getDunder(value) { + // eslint-disable-next-line eqeqeq + return $getPrototypeOf(value == null ? value : $Object(value)); + } + : false; + + +/***/ }), + +/***/ 6123: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('.')} */ +var $defineProperty = Object.defineProperty || false; +if ($defineProperty) { + try { + $defineProperty({}, 'a', { value: 1 }); + } catch (e) { + // IE 8 has a broken defineProperty + $defineProperty = false; + } +} + +module.exports = $defineProperty; + + +/***/ }), + +/***/ 1933: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./eval')} */ +module.exports = EvalError; + + +/***/ }), + +/***/ 8015: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('.')} */ +module.exports = Error; + + +/***/ }), + +/***/ 4415: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./range')} */ +module.exports = RangeError; + + +/***/ }), + +/***/ 9246: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./ref')} */ +module.exports = ReferenceError; + + +/***/ }), + +/***/ 5474: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./syntax')} */ +module.exports = SyntaxError; + + +/***/ }), + +/***/ 6361: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./type')} */ +module.exports = TypeError; + + +/***/ }), + +/***/ 5065: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./uri')} */ +module.exports = URIError; + + +/***/ }), + +/***/ 8308: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('.')} */ +module.exports = Object; + + +/***/ }), + +/***/ 1770: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var GetIntrinsic = __nccwpck_require__(4538); + +var $defineProperty = GetIntrinsic('%Object.defineProperty%', true); + +var hasToStringTag = __nccwpck_require__(9038)(); +var hasOwn = __nccwpck_require__(2157); +var $TypeError = __nccwpck_require__(6361); + +var toStringTag = hasToStringTag ? Symbol.toStringTag : null; + +/** @type {import('.')} */ +module.exports = function setToStringTag(object, value) { + var overrideIfSet = arguments.length > 2 && !!arguments[2] && arguments[2].force; + var nonConfigurable = arguments.length > 2 && !!arguments[2] && arguments[2].nonConfigurable; + if ( + (typeof overrideIfSet !== 'undefined' && typeof overrideIfSet !== 'boolean') + || (typeof nonConfigurable !== 'undefined' && typeof nonConfigurable !== 'boolean') + ) { + throw new $TypeError('if provided, the `overrideIfSet` and `nonConfigurable` options must be booleans'); + } + if (toStringTag && (overrideIfSet || !hasOwn(object, toStringTag))) { + if ($defineProperty) { + $defineProperty(object, toStringTag, { + configurable: !nonConfigurable, + enumerable: false, + value: value, + writable: false + }); + } else { + object[toStringTag] = value; // eslint-disable-line no-param-reassign + } + } +}; + + +/***/ }), + +/***/ 9320: +/***/ ((module) => { + +"use strict"; + + +/* eslint no-invalid-this: 1 */ + +var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; +var toStr = Object.prototype.toString; +var max = Math.max; +var funcType = '[object Function]'; + +var concatty = function concatty(a, b) { + var arr = []; + + for (var i = 0; i < a.length; i += 1) { + arr[i] = a[i]; + } + for (var j = 0; j < b.length; j += 1) { + arr[j + a.length] = b[j]; + } + + return arr; +}; + +var slicy = function slicy(arrLike, offset) { + var arr = []; + for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) { + arr[j] = arrLike[i]; + } + return arr; +}; + +var joiny = function (arr, joiner) { + var str = ''; + for (var i = 0; i < arr.length; i += 1) { + str += arr[i]; + if (i + 1 < arr.length) { + str += joiner; + } + } + return str; +}; + +module.exports = function bind(that) { + var target = this; + if (typeof target !== 'function' || toStr.apply(target) !== funcType) { + throw new TypeError(ERROR_MESSAGE + target); + } + var args = slicy(arguments, 1); + + var bound; + var binder = function () { + if (this instanceof bound) { + var result = target.apply( + this, + concatty(args, arguments) + ); + if (Object(result) === result) { + return result; + } + return this; + } + return target.apply( + that, + concatty(args, arguments) + ); + + }; + + var boundLength = max(0, target.length - args.length); + var boundArgs = []; + for (var i = 0; i < boundLength; i++) { + boundArgs[i] = '$' + i; + } + + bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder); + + if (target.prototype) { + var Empty = function Empty() {}; + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + Empty.prototype = null; + } + + return bound; +}; + + +/***/ }), + +/***/ 8334: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var implementation = __nccwpck_require__(9320); + +module.exports = Function.prototype.bind || implementation; + + +/***/ }), + +/***/ 4538: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var undefined; + +var $Object = __nccwpck_require__(8308); + +var $Error = __nccwpck_require__(8015); +var $EvalError = __nccwpck_require__(1933); +var $RangeError = __nccwpck_require__(4415); +var $ReferenceError = __nccwpck_require__(9246); +var $SyntaxError = __nccwpck_require__(5474); +var $TypeError = __nccwpck_require__(6361); +var $URIError = __nccwpck_require__(5065); + +var abs = __nccwpck_require__(9775); +var floor = __nccwpck_require__(924); +var max = __nccwpck_require__(2419); +var min = __nccwpck_require__(3373); +var pow = __nccwpck_require__(8029); +var round = __nccwpck_require__(9396); +var sign = __nccwpck_require__(9091); + +var $Function = Function; + +// eslint-disable-next-line consistent-return +var getEvalledConstructor = function (expressionSyntax) { + try { + return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')(); + } catch (e) {} +}; + +var $gOPD = __nccwpck_require__(8501); +var $defineProperty = __nccwpck_require__(6123); + +var throwTypeError = function () { + throw new $TypeError(); +}; +var ThrowTypeError = $gOPD + ? (function () { + try { + // eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties + arguments.callee; // IE 8 does not throw here + return throwTypeError; + } catch (calleeThrows) { + try { + // IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '') + return $gOPD(arguments, 'callee').get; + } catch (gOPDthrows) { + return throwTypeError; + } + } + }()) + : throwTypeError; + +var hasSymbols = __nccwpck_require__(587)(); + +var getProto = __nccwpck_require__(3592); +var $ObjectGPO = __nccwpck_require__(5045); +var $ReflectGPO = __nccwpck_require__(8859); + +var $apply = __nccwpck_require__(4177); +var $call = __nccwpck_require__(2808); + +var needsEval = {}; + +var TypedArray = typeof Uint8Array === 'undefined' || !getProto ? undefined : getProto(Uint8Array); + +var INTRINSICS = { + __proto__: null, + '%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError, + '%Array%': Array, + '%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer, + '%ArrayIteratorPrototype%': hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined, + '%AsyncFromSyncIteratorPrototype%': undefined, + '%AsyncFunction%': needsEval, + '%AsyncGenerator%': needsEval, + '%AsyncGeneratorFunction%': needsEval, + '%AsyncIteratorPrototype%': needsEval, + '%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics, + '%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt, + '%BigInt64Array%': typeof BigInt64Array === 'undefined' ? undefined : BigInt64Array, + '%BigUint64Array%': typeof BigUint64Array === 'undefined' ? undefined : BigUint64Array, + '%Boolean%': Boolean, + '%DataView%': typeof DataView === 'undefined' ? undefined : DataView, + '%Date%': Date, + '%decodeURI%': decodeURI, + '%decodeURIComponent%': decodeURIComponent, + '%encodeURI%': encodeURI, + '%encodeURIComponent%': encodeURIComponent, + '%Error%': $Error, + '%eval%': eval, // eslint-disable-line no-eval + '%EvalError%': $EvalError, + '%Float16Array%': typeof Float16Array === 'undefined' ? undefined : Float16Array, + '%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array, + '%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array, + '%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry, + '%Function%': $Function, + '%GeneratorFunction%': needsEval, + '%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array, + '%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array, + '%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array, + '%isFinite%': isFinite, + '%isNaN%': isNaN, + '%IteratorPrototype%': hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined, + '%JSON%': typeof JSON === 'object' ? JSON : undefined, + '%Map%': typeof Map === 'undefined' ? undefined : Map, + '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Map()[Symbol.iterator]()), + '%Math%': Math, + '%Number%': Number, + '%Object%': $Object, + '%Object.getOwnPropertyDescriptor%': $gOPD, + '%parseFloat%': parseFloat, + '%parseInt%': parseInt, + '%Promise%': typeof Promise === 'undefined' ? undefined : Promise, + '%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy, + '%RangeError%': $RangeError, + '%ReferenceError%': $ReferenceError, + '%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect, + '%RegExp%': RegExp, + '%Set%': typeof Set === 'undefined' ? undefined : Set, + '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Set()[Symbol.iterator]()), + '%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer, + '%String%': String, + '%StringIteratorPrototype%': hasSymbols && getProto ? getProto(''[Symbol.iterator]()) : undefined, + '%Symbol%': hasSymbols ? Symbol : undefined, + '%SyntaxError%': $SyntaxError, + '%ThrowTypeError%': ThrowTypeError, + '%TypedArray%': TypedArray, + '%TypeError%': $TypeError, + '%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array, + '%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray, + '%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array, + '%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array, + '%URIError%': $URIError, + '%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap, + '%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef, + '%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet, + + '%Function.prototype.call%': $call, + '%Function.prototype.apply%': $apply, + '%Object.defineProperty%': $defineProperty, + '%Object.getPrototypeOf%': $ObjectGPO, + '%Math.abs%': abs, + '%Math.floor%': floor, + '%Math.max%': max, + '%Math.min%': min, + '%Math.pow%': pow, + '%Math.round%': round, + '%Math.sign%': sign, + '%Reflect.getPrototypeOf%': $ReflectGPO +}; + +if (getProto) { + try { + null.error; // eslint-disable-line no-unused-expressions + } catch (e) { + // https://github.com/tc39/proposal-shadowrealm/pull/384#issuecomment-1364264229 + var errorProto = getProto(getProto(e)); + INTRINSICS['%Error.prototype%'] = errorProto; + } +} + +var doEval = function doEval(name) { + var value; + if (name === '%AsyncFunction%') { + value = getEvalledConstructor('async function () {}'); + } else if (name === '%GeneratorFunction%') { + value = getEvalledConstructor('function* () {}'); + } else if (name === '%AsyncGeneratorFunction%') { + value = getEvalledConstructor('async function* () {}'); + } else if (name === '%AsyncGenerator%') { + var fn = doEval('%AsyncGeneratorFunction%'); + if (fn) { + value = fn.prototype; + } + } else if (name === '%AsyncIteratorPrototype%') { + var gen = doEval('%AsyncGenerator%'); + if (gen && getProto) { + value = getProto(gen.prototype); + } + } + + INTRINSICS[name] = value; + + return value; +}; + +var LEGACY_ALIASES = { + __proto__: null, + '%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'], + '%ArrayPrototype%': ['Array', 'prototype'], + '%ArrayProto_entries%': ['Array', 'prototype', 'entries'], + '%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'], + '%ArrayProto_keys%': ['Array', 'prototype', 'keys'], + '%ArrayProto_values%': ['Array', 'prototype', 'values'], + '%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'], + '%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'], + '%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'], + '%BooleanPrototype%': ['Boolean', 'prototype'], + '%DataViewPrototype%': ['DataView', 'prototype'], + '%DatePrototype%': ['Date', 'prototype'], + '%ErrorPrototype%': ['Error', 'prototype'], + '%EvalErrorPrototype%': ['EvalError', 'prototype'], + '%Float32ArrayPrototype%': ['Float32Array', 'prototype'], + '%Float64ArrayPrototype%': ['Float64Array', 'prototype'], + '%FunctionPrototype%': ['Function', 'prototype'], + '%Generator%': ['GeneratorFunction', 'prototype'], + '%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'], + '%Int8ArrayPrototype%': ['Int8Array', 'prototype'], + '%Int16ArrayPrototype%': ['Int16Array', 'prototype'], + '%Int32ArrayPrototype%': ['Int32Array', 'prototype'], + '%JSONParse%': ['JSON', 'parse'], + '%JSONStringify%': ['JSON', 'stringify'], + '%MapPrototype%': ['Map', 'prototype'], + '%NumberPrototype%': ['Number', 'prototype'], + '%ObjectPrototype%': ['Object', 'prototype'], + '%ObjProto_toString%': ['Object', 'prototype', 'toString'], + '%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'], + '%PromisePrototype%': ['Promise', 'prototype'], + '%PromiseProto_then%': ['Promise', 'prototype', 'then'], + '%Promise_all%': ['Promise', 'all'], + '%Promise_reject%': ['Promise', 'reject'], + '%Promise_resolve%': ['Promise', 'resolve'], + '%RangeErrorPrototype%': ['RangeError', 'prototype'], + '%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'], + '%RegExpPrototype%': ['RegExp', 'prototype'], + '%SetPrototype%': ['Set', 'prototype'], + '%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'], + '%StringPrototype%': ['String', 'prototype'], + '%SymbolPrototype%': ['Symbol', 'prototype'], + '%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'], + '%TypedArrayPrototype%': ['TypedArray', 'prototype'], + '%TypeErrorPrototype%': ['TypeError', 'prototype'], + '%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'], + '%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'], + '%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'], + '%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'], + '%URIErrorPrototype%': ['URIError', 'prototype'], + '%WeakMapPrototype%': ['WeakMap', 'prototype'], + '%WeakSetPrototype%': ['WeakSet', 'prototype'] +}; + +var bind = __nccwpck_require__(8334); +var hasOwn = __nccwpck_require__(2157); +var $concat = bind.call($call, Array.prototype.concat); +var $spliceApply = bind.call($apply, Array.prototype.splice); +var $replace = bind.call($call, String.prototype.replace); +var $strSlice = bind.call($call, String.prototype.slice); +var $exec = bind.call($call, RegExp.prototype.exec); + +/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */ +var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g; +var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */ +var stringToPath = function stringToPath(string) { + var first = $strSlice(string, 0, 1); + var last = $strSlice(string, -1); + if (first === '%' && last !== '%') { + throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`'); + } else if (last === '%' && first !== '%') { + throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`'); + } + var result = []; + $replace(string, rePropName, function (match, number, quote, subString) { + result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match; + }); + return result; +}; +/* end adaptation */ + +var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) { + var intrinsicName = name; + var alias; + if (hasOwn(LEGACY_ALIASES, intrinsicName)) { + alias = LEGACY_ALIASES[intrinsicName]; + intrinsicName = '%' + alias[0] + '%'; + } + + if (hasOwn(INTRINSICS, intrinsicName)) { + var value = INTRINSICS[intrinsicName]; + if (value === needsEval) { + value = doEval(intrinsicName); + } + if (typeof value === 'undefined' && !allowMissing) { + throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!'); + } + + return { + alias: alias, + name: intrinsicName, + value: value + }; + } + + throw new $SyntaxError('intrinsic ' + name + ' does not exist!'); +}; + +module.exports = function GetIntrinsic(name, allowMissing) { + if (typeof name !== 'string' || name.length === 0) { + throw new $TypeError('intrinsic name must be a non-empty string'); + } + if (arguments.length > 1 && typeof allowMissing !== 'boolean') { + throw new $TypeError('"allowMissing" argument must be a boolean'); + } + + if ($exec(/^%?[^%]*%?$/, name) === null) { + throw new $SyntaxError('`%` may not be present anywhere but at the beginning and end of the intrinsic name'); + } + var parts = stringToPath(name); + var intrinsicBaseName = parts.length > 0 ? parts[0] : ''; + + var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing); + var intrinsicRealName = intrinsic.name; + var value = intrinsic.value; + var skipFurtherCaching = false; + + var alias = intrinsic.alias; + if (alias) { + intrinsicBaseName = alias[0]; + $spliceApply(parts, $concat([0, 1], alias)); + } + + for (var i = 1, isOwn = true; i < parts.length; i += 1) { + var part = parts[i]; + var first = $strSlice(part, 0, 1); + var last = $strSlice(part, -1); + if ( + ( + (first === '"' || first === "'" || first === '`') + || (last === '"' || last === "'" || last === '`') + ) + && first !== last + ) { + throw new $SyntaxError('property names with quotes must have matching quotes'); + } + if (part === 'constructor' || !isOwn) { + skipFurtherCaching = true; + } + + intrinsicBaseName += '.' + part; + intrinsicRealName = '%' + intrinsicBaseName + '%'; + + if (hasOwn(INTRINSICS, intrinsicRealName)) { + value = INTRINSICS[intrinsicRealName]; + } else if (value != null) { + if (!(part in value)) { + if (!allowMissing) { + throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.'); + } + return void undefined; + } + if ($gOPD && (i + 1) >= parts.length) { + var desc = $gOPD(value, part); + isOwn = !!desc; + + // By convention, when a data property is converted to an accessor + // property to emulate a data property that does not suffer from + // the override mistake, that accessor's getter is marked with + // an `originalValue` property. Here, when we detect this, we + // uphold the illusion by pretending to see that original data + // property, i.e., returning the value rather than the getter + // itself. + if (isOwn && 'get' in desc && !('originalValue' in desc.get)) { + value = desc.get; + } else { + value = value[part]; + } + } else { + isOwn = hasOwn(value, part); + value = value[part]; + } + + if (isOwn && !skipFurtherCaching) { + INTRINSICS[intrinsicRealName] = value; + } + } + } + return value; +}; + + +/***/ }), + +/***/ 5045: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var $Object = __nccwpck_require__(8308); + +/** @type {import('./Object.getPrototypeOf')} */ +module.exports = $Object.getPrototypeOf || null; + + +/***/ }), + +/***/ 8859: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./Reflect.getPrototypeOf')} */ +module.exports = (typeof Reflect !== 'undefined' && Reflect.getPrototypeOf) || null; + + +/***/ }), + +/***/ 3592: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var reflectGetProto = __nccwpck_require__(8859); +var originalGetProto = __nccwpck_require__(5045); + +var getDunderProto = __nccwpck_require__(2693); + +/** @type {import('.')} */ +module.exports = reflectGetProto + ? function getProto(O) { + // @ts-expect-error TS can't narrow inside a closure, for some reason + return reflectGetProto(O); + } + : originalGetProto + ? function getProto(O) { + if (!O || (typeof O !== 'object' && typeof O !== 'function')) { + throw new TypeError('getProto: not an object'); + } + // @ts-expect-error TS can't narrow inside a closure, for some reason + return originalGetProto(O); + } + : getDunderProto + ? function getProto(O) { + // @ts-expect-error TS can't narrow inside a closure, for some reason + return getDunderProto(O); + } + : null; + + +/***/ }), + +/***/ 7087: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./gOPD')} */ +module.exports = Object.getOwnPropertyDescriptor; + + +/***/ }), + +/***/ 8501: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +/** @type {import('.')} */ +var $gOPD = __nccwpck_require__(7087); + +if ($gOPD) { + try { + $gOPD([], 'length'); + } catch (e) { + // IE 8 has a broken gOPD + $gOPD = null; + } +} + +module.exports = $gOPD; + + +/***/ }), + +/***/ 587: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var origSymbol = typeof Symbol !== 'undefined' && Symbol; +var hasSymbolSham = __nccwpck_require__(7747); + +/** @type {import('.')} */ +module.exports = function hasNativeSymbols() { + if (typeof origSymbol !== 'function') { return false; } + if (typeof Symbol !== 'function') { return false; } + if (typeof origSymbol('foo') !== 'symbol') { return false; } + if (typeof Symbol('bar') !== 'symbol') { return false; } + + return hasSymbolSham(); +}; + + +/***/ }), + +/***/ 7747: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./shams')} */ +/* eslint complexity: [2, 18], max-statements: [2, 33] */ +module.exports = function hasSymbols() { + if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; } + if (typeof Symbol.iterator === 'symbol') { return true; } + + /** @type {{ [k in symbol]?: unknown }} */ + var obj = {}; + var sym = Symbol('test'); + var symObj = Object(sym); + if (typeof sym === 'string') { return false; } + + if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; } + if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; } + + // temp disabled per https://github.com/ljharb/object.assign/issues/17 + // if (sym instanceof Symbol) { return false; } + // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4 + // if (!(symObj instanceof Symbol)) { return false; } + + // if (typeof Symbol.prototype.toString !== 'function') { return false; } + // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; } + + var symVal = 42; + obj[sym] = symVal; + for (var _ in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop + if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; } + + if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; } + + var syms = Object.getOwnPropertySymbols(obj); + if (syms.length !== 1 || syms[0] !== sym) { return false; } + + if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; } + + if (typeof Object.getOwnPropertyDescriptor === 'function') { + // eslint-disable-next-line no-extra-parens + var descriptor = /** @type {PropertyDescriptor} */ (Object.getOwnPropertyDescriptor(obj, sym)); + if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; } + } + + return true; +}; + + +/***/ }), + +/***/ 9038: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var hasSymbols = __nccwpck_require__(7747); + +/** @type {import('.')} */ +module.exports = function hasToStringTagShams() { + return hasSymbols() && !!Symbol.toStringTag; +}; + + +/***/ }), + +/***/ 2157: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var call = Function.prototype.call; +var $hasOwn = Object.prototype.hasOwnProperty; +var bind = __nccwpck_require__(8334); + +/** @type {import('.')} */ +module.exports = bind.call(call, $hasOwn); + + +/***/ }), + +/***/ 9775: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./abs')} */ +module.exports = Math.abs; + + +/***/ }), + +/***/ 924: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./floor')} */ +module.exports = Math.floor; + + +/***/ }), + +/***/ 7661: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./isNaN')} */ +module.exports = Number.isNaN || function isNaN(a) { + return a !== a; +}; + + +/***/ }), + +/***/ 2419: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./max')} */ +module.exports = Math.max; + + +/***/ }), + +/***/ 3373: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./min')} */ +module.exports = Math.min; + + +/***/ }), + +/***/ 8029: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./pow')} */ +module.exports = Math.pow; + + +/***/ }), + +/***/ 9396: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./round')} */ +module.exports = Math.round; + + +/***/ }), + +/***/ 9091: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var $isNaN = __nccwpck_require__(7661); + +/** @type {import('./sign')} */ +module.exports = function sign(number) { + if ($isNaN(number) || number === 0) { + return number; + } + return number < 0 ? -1 : +1; +}; + + /***/ }), /***/ 7426: @@ -71116,7 +72186,7 @@ module.exports = { const { parseSetCookie } = __nccwpck_require__(4408) -const { stringify, getHeadersList } = __nccwpck_require__(3121) +const { stringify } = __nccwpck_require__(3121) const { webidl } = __nccwpck_require__(1744) const { Headers } = __nccwpck_require__(554) @@ -71192,14 +72262,13 @@ function getSetCookies (headers) { webidl.brandCheck(headers, Headers, { strict: false }) - const cookies = getHeadersList(headers).cookies + const cookies = headers.getSetCookie() if (!cookies) { return [] } - // In older versions of undici, cookies is a list of name:value. - return cookies.map((pair) => parseSetCookie(Array.isArray(pair) ? pair[1] : pair)) + return cookies.map((pair) => parseSetCookie(pair)) } /** @@ -71627,14 +72696,15 @@ module.exports = { /***/ }), /***/ 3121: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ ((module) => { "use strict"; -const assert = __nccwpck_require__(9491) -const { kHeadersList } = __nccwpck_require__(2785) - +/** + * @param {string} value + * @returns {boolean} + */ function isCTLExcludingHtab (value) { if (value.length === 0) { return false @@ -71895,31 +72965,13 @@ function stringify (cookie) { return out.join('; ') } -let kHeadersListNode - -function getHeadersList (headers) { - if (headers[kHeadersList]) { - return headers[kHeadersList] - } - - if (!kHeadersListNode) { - kHeadersListNode = Object.getOwnPropertySymbols(headers).find( - (symbol) => symbol.description === 'headers list' - ) - - assert(kHeadersListNode, 'Headers cannot be parsed') - } - - const headersList = headers[kHeadersListNode] - assert(headersList) - - return headersList -} - module.exports = { isCTLExcludingHtab, - stringify, - getHeadersList + validateCookieName, + validateCookiePath, + validateCookieValue, + toIMFDate, + stringify } @@ -75923,6 +76975,7 @@ const { isValidHeaderName, isValidHeaderValue } = __nccwpck_require__(2538) +const util = __nccwpck_require__(3837) const { webidl } = __nccwpck_require__(1744) const assert = __nccwpck_require__(9491) @@ -76476,6 +77529,9 @@ Object.defineProperties(Headers.prototype, { [Symbol.toStringTag]: { value: 'Headers', configurable: true + }, + [util.inspect.custom]: { + enumerable: false } }) @@ -85652,6 +86708,20 @@ class Pool extends PoolBase { ? { ...options.interceptors } : undefined this[kFactory] = factory + + this.on('connectionError', (origin, targets, error) => { + // If a connection error occurs, we remove the client from the pool, + // and emit a connectionError event. They will not be re-used. + // Fixes https://github.com/nodejs/undici/issues/3895 + for (const target of targets) { + // Do not use kRemoveClient here, as it will close the client, + // but the client cannot be closed in this state. + const idx = this[kClients].indexOf(target) + if (idx !== -1) { + this[kClients].splice(idx, 1) + } + } + }) } [kGetDispatcher] () { @@ -93634,19 +94704,22 @@ function getVersionFromFileContent(content, distributionName, versionFile) { const versionFileName = getFileName(versionFile); if (versionFileName == '.tool-versions') { javaVersionRegExp = - /^(java\s+)(?:\S*-)?v?(?(\d+)(\.\d+)?(\.\d+)?(\+\d+)?(-ea(\.\d+)?)?)$/m; + /^java\s+(?:\S*-)?(?\d+(?:\.\d+)*([+_.-](?:openj9[-._]?\d[\w.-]*|java\d+|jre[-_\w]*|OpenJDK\d+[\w_.-]*|[a-z0-9]+))*)/im; + } + else if (versionFileName == '.sdkmanrc') { + javaVersionRegExp = /^java\s*=\s*(?[^-]+)/m; } else { javaVersionRegExp = /(?(?<=(^|\s|-))(\d+\S*))(\s|$)/; } - const fileContent = ((_b = (_a = content.match(javaVersionRegExp)) === null || _a === void 0 ? void 0 : _a.groups) === null || _b === void 0 ? void 0 : _b.version) + const capturedVersion = ((_b = (_a = content.match(javaVersionRegExp)) === null || _a === void 0 ? void 0 : _a.groups) === null || _b === void 0 ? void 0 : _b.version) ? (_d = (_c = content.match(javaVersionRegExp)) === null || _c === void 0 ? void 0 : _c.groups) === null || _d === void 0 ? void 0 : _d.version : ''; - if (!fileContent) { + core.debug(`Parsed version '${capturedVersion}' from file '${versionFileName}'`); + if (!capturedVersion) { return null; } - core.debug(`Version from file '${fileContent}'`); - const tentativeVersion = avoidOldNotation(fileContent); + const tentativeVersion = avoidOldNotation(capturedVersion); const rawVersion = tentativeVersion.split('-')[0]; let version = semver.validRange(rawVersion) ? tentativeVersion @@ -93677,8 +94750,8 @@ function convertVersionToSemver(version) { } exports.convertVersionToSemver = convertVersionToSemver; function getGitHubHttpHeaders() { - const token = core.getInput('token'); - const auth = !token ? undefined : `token ${token}`; + const resolvedToken = core.getInput('token') || process.env.GITHUB_TOKEN; + const auth = !resolvedToken ? undefined : `token ${resolvedToken}`; const headers = { accept: 'application/vnd.github.VERSION.raw' }; diff --git a/dist/setup/index.js b/dist/setup/index.js index 08107f095..b06945800 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -18700,6 +18700,9 @@ exports.userAgentPolicy = userAgentPolicy; /***/ 46279: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +"use strict"; + + var CombinedStream = __nccwpck_require__(85443); var util = __nccwpck_require__(73837); var path = __nccwpck_require__(71017); @@ -18708,23 +18711,20 @@ var https = __nccwpck_require__(95687); var parseUrl = (__nccwpck_require__(57310).parse); var fs = __nccwpck_require__(57147); var Stream = (__nccwpck_require__(12781).Stream); +var crypto = __nccwpck_require__(6113); var mime = __nccwpck_require__(43583); var asynckit = __nccwpck_require__(14812); +var setToStringTag = __nccwpck_require__(11770); +var hasOwn = __nccwpck_require__(62157); var populate = __nccwpck_require__(63971); -// Public API -module.exports = FormData; - -// make it a Stream -util.inherits(FormData, CombinedStream); - /** * Create readable "multipart/form-data" streams. * Can be used to submit forms * and file uploads to other web applications. * * @constructor - * @param {Object} options - Properties to be added/overriden for FormData and CombinedStream + * @param {object} options - Properties to be added/overriden for FormData and CombinedStream */ function FormData(options) { if (!(this instanceof FormData)) { @@ -18737,35 +18737,39 @@ function FormData(options) { CombinedStream.call(this); - options = options || {}; - for (var option in options) { + options = options || {}; // eslint-disable-line no-param-reassign + for (var option in options) { // eslint-disable-line no-restricted-syntax this[option] = options[option]; } } +// make it a Stream +util.inherits(FormData, CombinedStream); + FormData.LINE_BREAK = '\r\n'; FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream'; -FormData.prototype.append = function(field, value, options) { - - options = options || {}; +FormData.prototype.append = function (field, value, options) { + options = options || {}; // eslint-disable-line no-param-reassign // allow filename as single option - if (typeof options == 'string') { - options = {filename: options}; + if (typeof options === 'string') { + options = { filename: options }; // eslint-disable-line no-param-reassign } var append = CombinedStream.prototype.append.bind(this); // all that streamy business can't handle numbers - if (typeof value == 'number') { - value = '' + value; + if (typeof value === 'number' || value == null) { + value = String(value); // eslint-disable-line no-param-reassign } // https://github.com/felixge/node-form-data/issues/38 - if (util.isArray(value)) { - // Please convert your array into string - // the way web server expects it + if (Array.isArray(value)) { + /* + * Please convert your array into string + * the way web server expects it + */ this._error(new Error('Arrays are not supported.')); return; } @@ -18781,15 +18785,17 @@ FormData.prototype.append = function(field, value, options) { this._trackLength(header, value, options); }; -FormData.prototype._trackLength = function(header, value, options) { +FormData.prototype._trackLength = function (header, value, options) { var valueLength = 0; - // used w/ getLengthSync(), when length is known. - // e.g. for streaming directly from a remote server, - // w/ a known file a size, and not wanting to wait for - // incoming file to finish to get its size. + /* + * used w/ getLengthSync(), when length is known. + * e.g. for streaming directly from a remote server, + * w/ a known file a size, and not wanting to wait for + * incoming file to finish to get its size. + */ if (options.knownLength != null) { - valueLength += +options.knownLength; + valueLength += Number(options.knownLength); } else if (Buffer.isBuffer(value)) { valueLength = value.length; } else if (typeof value === 'string') { @@ -18799,12 +18805,10 @@ FormData.prototype._trackLength = function(header, value, options) { this._valueLength += valueLength; // @check why add CRLF? does this account for custom/multiple CRLFs? - this._overheadLength += - Buffer.byteLength(header) + - FormData.LINE_BREAK.length; + this._overheadLength += Buffer.byteLength(header) + FormData.LINE_BREAK.length; // empty or either doesn't have path or not an http response or not a stream - if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) && !(value instanceof Stream))) { + if (!value || (!value.path && !(value.readable && hasOwn(value, 'httpVersion')) && !(value instanceof Stream))) { return; } @@ -18814,10 +18818,8 @@ FormData.prototype._trackLength = function(header, value, options) { } }; -FormData.prototype._lengthRetriever = function(value, callback) { - - if (value.hasOwnProperty('fd')) { - +FormData.prototype._lengthRetriever = function (value, callback) { + if (hasOwn(value, 'fd')) { // take read range into a account // `end` = Infinity –> read file till the end // @@ -18826,54 +18828,52 @@ FormData.prototype._lengthRetriever = function(value, callback) { // Fix it when node fixes it. // https://github.com/joyent/node/issues/7819 if (value.end != undefined && value.end != Infinity && value.start != undefined) { - // when end specified // no need to calculate range // inclusive, starts with 0 - callback(null, value.end + 1 - (value.start ? value.start : 0)); + callback(null, value.end + 1 - (value.start ? value.start : 0)); // eslint-disable-line callback-return - // not that fast snoopy + // not that fast snoopy } else { // still need to fetch file size from fs - fs.stat(value.path, function(err, stat) { - - var fileSize; - + fs.stat(value.path, function (err, stat) { if (err) { callback(err); return; } // update final size based on the range options - fileSize = stat.size - (value.start ? value.start : 0); + var fileSize = stat.size - (value.start ? value.start : 0); callback(null, fileSize); }); } - // or http response - } else if (value.hasOwnProperty('httpVersion')) { - callback(null, +value.headers['content-length']); + // or http response + } else if (hasOwn(value, 'httpVersion')) { + callback(null, Number(value.headers['content-length'])); // eslint-disable-line callback-return - // or request stream http://github.com/mikeal/request - } else if (value.hasOwnProperty('httpModule')) { + // or request stream http://github.com/mikeal/request + } else if (hasOwn(value, 'httpModule')) { // wait till response come back - value.on('response', function(response) { + value.on('response', function (response) { value.pause(); - callback(null, +response.headers['content-length']); + callback(null, Number(response.headers['content-length'])); }); value.resume(); - // something else + // something else } else { - callback('Unknown stream'); + callback('Unknown stream'); // eslint-disable-line callback-return } }; -FormData.prototype._multiPartHeader = function(field, value, options) { - // custom header specified (as string)? - // it becomes responsible for boundary - // (e.g. to handle extra CRLFs on .NET servers) - if (typeof options.header == 'string') { +FormData.prototype._multiPartHeader = function (field, value, options) { + /* + * custom header specified (as string)? + * it becomes responsible for boundary + * (e.g. to handle extra CRLFs on .NET servers) + */ + if (typeof options.header === 'string') { return options.header; } @@ -18881,7 +18881,7 @@ FormData.prototype._multiPartHeader = function(field, value, options) { var contentType = this._getContentType(value, options); var contents = ''; - var headers = { + var headers = { // add custom disposition as third element or keep it two elements if not 'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []), // if no content type. allow it to be empty array @@ -18889,77 +18889,74 @@ FormData.prototype._multiPartHeader = function(field, value, options) { }; // allow custom headers. - if (typeof options.header == 'object') { + if (typeof options.header === 'object') { populate(headers, options.header); } var header; - for (var prop in headers) { - if (!headers.hasOwnProperty(prop)) continue; - header = headers[prop]; + for (var prop in headers) { // eslint-disable-line no-restricted-syntax + if (hasOwn(headers, prop)) { + header = headers[prop]; - // skip nullish headers. - if (header == null) { - continue; - } + // skip nullish headers. + if (header == null) { + continue; // eslint-disable-line no-restricted-syntax, no-continue + } - // convert all headers to arrays. - if (!Array.isArray(header)) { - header = [header]; - } + // convert all headers to arrays. + if (!Array.isArray(header)) { + header = [header]; + } - // add non-empty headers. - if (header.length) { - contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK; + // add non-empty headers. + if (header.length) { + contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK; + } } } return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK; }; -FormData.prototype._getContentDisposition = function(value, options) { - - var filename - , contentDisposition - ; +FormData.prototype._getContentDisposition = function (value, options) { // eslint-disable-line consistent-return + var filename; if (typeof options.filepath === 'string') { // custom filepath for relative paths filename = path.normalize(options.filepath).replace(/\\/g, '/'); - } else if (options.filename || value.name || value.path) { - // custom filename take precedence - // formidable and the browser add a name property - // fs- and request- streams have path property - filename = path.basename(options.filename || value.name || value.path); - } else if (value.readable && value.hasOwnProperty('httpVersion')) { + } else if (options.filename || (value && (value.name || value.path))) { + /* + * custom filename take precedence + * formidable and the browser add a name property + * fs- and request- streams have path property + */ + filename = path.basename(options.filename || (value && (value.name || value.path))); + } else if (value && value.readable && hasOwn(value, 'httpVersion')) { // or try http response filename = path.basename(value.client._httpMessage.path || ''); } if (filename) { - contentDisposition = 'filename="' + filename + '"'; + return 'filename="' + filename + '"'; } - - return contentDisposition; }; -FormData.prototype._getContentType = function(value, options) { - +FormData.prototype._getContentType = function (value, options) { // use custom content-type above all var contentType = options.contentType; // or try `name` from formidable, browser - if (!contentType && value.name) { + if (!contentType && value && value.name) { contentType = mime.lookup(value.name); } // or try `path` from fs-, request- streams - if (!contentType && value.path) { + if (!contentType && value && value.path) { contentType = mime.lookup(value.path); } // or if it's http-reponse - if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) { + if (!contentType && value && value.readable && hasOwn(value, 'httpVersion')) { contentType = value.headers['content-type']; } @@ -18969,18 +18966,18 @@ FormData.prototype._getContentType = function(value, options) { } // fallback to the default content type if `value` is not simple value - if (!contentType && typeof value == 'object') { + if (!contentType && value && typeof value === 'object') { contentType = FormData.DEFAULT_CONTENT_TYPE; } return contentType; }; -FormData.prototype._multiPartFooter = function() { - return function(next) { +FormData.prototype._multiPartFooter = function () { + return function (next) { var footer = FormData.LINE_BREAK; - var lastPart = (this._streams.length === 0); + var lastPart = this._streams.length === 0; if (lastPart) { footer += this._lastBoundary(); } @@ -18989,18 +18986,18 @@ FormData.prototype._multiPartFooter = function() { }.bind(this); }; -FormData.prototype._lastBoundary = function() { +FormData.prototype._lastBoundary = function () { return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK; }; -FormData.prototype.getHeaders = function(userHeaders) { +FormData.prototype.getHeaders = function (userHeaders) { var header; var formHeaders = { 'content-type': 'multipart/form-data; boundary=' + this.getBoundary() }; - for (header in userHeaders) { - if (userHeaders.hasOwnProperty(header)) { + for (header in userHeaders) { // eslint-disable-line no-restricted-syntax + if (hasOwn(userHeaders, header)) { formHeaders[header.toLowerCase()] = userHeaders[header]; } } @@ -19008,11 +19005,14 @@ FormData.prototype.getHeaders = function(userHeaders) { return formHeaders; }; -FormData.prototype.setBoundary = function(boundary) { +FormData.prototype.setBoundary = function (boundary) { + if (typeof boundary !== 'string') { + throw new TypeError('FormData boundary must be a string'); + } this._boundary = boundary; }; -FormData.prototype.getBoundary = function() { +FormData.prototype.getBoundary = function () { if (!this._boundary) { this._generateBoundary(); } @@ -19020,60 +19020,55 @@ FormData.prototype.getBoundary = function() { return this._boundary; }; -FormData.prototype.getBuffer = function() { - var dataBuffer = new Buffer.alloc( 0 ); +FormData.prototype.getBuffer = function () { + var dataBuffer = new Buffer.alloc(0); // eslint-disable-line new-cap var boundary = this.getBoundary(); // Create the form content. Add Line breaks to the end of data. for (var i = 0, len = this._streams.length; i < len; i++) { if (typeof this._streams[i] !== 'function') { - // Add content to the buffer. - if(Buffer.isBuffer(this._streams[i])) { - dataBuffer = Buffer.concat( [dataBuffer, this._streams[i]]); - }else { - dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(this._streams[i])]); + if (Buffer.isBuffer(this._streams[i])) { + dataBuffer = Buffer.concat([dataBuffer, this._streams[i]]); + } else { + dataBuffer = Buffer.concat([dataBuffer, Buffer.from(this._streams[i])]); } // Add break after content. - if (typeof this._streams[i] !== 'string' || this._streams[i].substring( 2, boundary.length + 2 ) !== boundary) { - dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(FormData.LINE_BREAK)] ); + if (typeof this._streams[i] !== 'string' || this._streams[i].substring(2, boundary.length + 2) !== boundary) { + dataBuffer = Buffer.concat([dataBuffer, Buffer.from(FormData.LINE_BREAK)]); } } } // Add the footer and return the Buffer object. - return Buffer.concat( [dataBuffer, Buffer.from(this._lastBoundary())] ); + return Buffer.concat([dataBuffer, Buffer.from(this._lastBoundary())]); }; -FormData.prototype._generateBoundary = function() { +FormData.prototype._generateBoundary = function () { // This generates a 50 character boundary similar to those used by Firefox. - // They are optimized for boyer-moore parsing. - var boundary = '--------------------------'; - for (var i = 0; i < 24; i++) { - boundary += Math.floor(Math.random() * 10).toString(16); - } - this._boundary = boundary; + // They are optimized for boyer-moore parsing. + this._boundary = '--------------------------' + crypto.randomBytes(12).toString('hex'); }; // Note: getLengthSync DOESN'T calculate streams length -// As workaround one can calculate file size manually -// and add it as knownLength option -FormData.prototype.getLengthSync = function() { +// As workaround one can calculate file size manually and add it as knownLength option +FormData.prototype.getLengthSync = function () { var knownLength = this._overheadLength + this._valueLength; - // Don't get confused, there are 3 "internal" streams for each keyval pair - // so it basically checks if there is any value added to the form + // Don't get confused, there are 3 "internal" streams for each keyval pair so it basically checks if there is any value added to the form if (this._streams.length) { knownLength += this._lastBoundary().length; } // https://github.com/form-data/form-data/issues/40 if (!this.hasKnownLength()) { - // Some async length retrievers are present - // therefore synchronous length calculation is false. - // Please use getLength(callback) to get proper length + /* + * Some async length retrievers are present + * therefore synchronous length calculation is false. + * Please use getLength(callback) to get proper length + */ this._error(new Error('Cannot calculate proper length in synchronous way.')); } @@ -19083,7 +19078,7 @@ FormData.prototype.getLengthSync = function() { // Public API to check if length of added values is known // https://github.com/form-data/form-data/issues/196 // https://github.com/form-data/form-data/issues/262 -FormData.prototype.hasKnownLength = function() { +FormData.prototype.hasKnownLength = function () { var hasKnownLength = true; if (this._valuesToMeasure.length) { @@ -19093,7 +19088,7 @@ FormData.prototype.hasKnownLength = function() { return hasKnownLength; }; -FormData.prototype.getLength = function(cb) { +FormData.prototype.getLength = function (cb) { var knownLength = this._overheadLength + this._valueLength; if (this._streams.length) { @@ -19105,13 +19100,13 @@ FormData.prototype.getLength = function(cb) { return; } - asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) { + asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function (err, values) { if (err) { cb(err); return; } - values.forEach(function(length) { + values.forEach(function (length) { knownLength += length; }); @@ -19119,31 +19114,26 @@ FormData.prototype.getLength = function(cb) { }); }; -FormData.prototype.submit = function(params, cb) { - var request - , options - , defaults = {method: 'post'} - ; - - // parse provided url if it's string - // or treat it as options object - if (typeof params == 'string') { +FormData.prototype.submit = function (params, cb) { + var request; + var options; + var defaults = { method: 'post' }; - params = parseUrl(params); + // parse provided url if it's string or treat it as options object + if (typeof params === 'string') { + params = parseUrl(params); // eslint-disable-line no-param-reassign + /* eslint sort-keys: 0 */ options = populate({ port: params.port, path: params.pathname, host: params.hostname, protocol: params.protocol }, defaults); - - // use custom params - } else { - + } else { // use custom params options = populate(params, defaults); // if no port provided use default one if (!options.port) { - options.port = options.protocol == 'https:' ? 443 : 80; + options.port = options.protocol === 'https:' ? 443 : 80; } } @@ -19151,14 +19141,14 @@ FormData.prototype.submit = function(params, cb) { options.headers = this.getHeaders(params.headers); // https if specified, fallback to http in any other case - if (options.protocol == 'https:') { + if (options.protocol === 'https:') { request = https.request(options); } else { request = http.request(options); } // get content length and fire away - this.getLength(function(err, length) { + this.getLength(function (err, length) { if (err && err !== 'Unknown stream') { this._error(err); return; @@ -19177,7 +19167,7 @@ FormData.prototype.submit = function(params, cb) { request.removeListener('error', callback); request.removeListener('response', onResponse); - return cb.call(this, error, responce); + return cb.call(this, error, responce); // eslint-disable-line no-invalid-this }; onResponse = callback.bind(this, null); @@ -19190,7 +19180,7 @@ FormData.prototype.submit = function(params, cb) { return request; }; -FormData.prototype._error = function(err) { +FormData.prototype._error = function (err) { if (!this.error) { this.error = err; this.pause(); @@ -19201,6 +19191,10 @@ FormData.prototype._error = function(err) { FormData.prototype.toString = function () { return '[object FormData]'; }; +setToStringTag(FormData, 'FormData'); + +// Public API +module.exports = FormData; /***/ }), @@ -19208,12 +19202,13 @@ FormData.prototype.toString = function () { /***/ 63971: /***/ ((module) => { -// populates missing values -module.exports = function(dst, src) { +"use strict"; - Object.keys(src).forEach(function(prop) - { - dst[prop] = dst[prop] || src[prop]; + +// populates missing values +module.exports = function (dst, src) { + Object.keys(src).forEach(function (prop) { + dst[prop] = dst[prop] || src[prop]; // eslint-disable-line no-param-reassign }); return dst; @@ -80224,7 +80219,7 @@ function expand(str, isTop) { var isOptions = m.body.indexOf(',') >= 0; if (!isSequence && !isOptions) { // {a},b} - if (m.post.match(/,.*\}/)) { + if (m.post.match(/,(?!,).*\}/)) { str = m.pre + '{' + m.body + escClose + m.post; return expand(str); } @@ -80316,6 +80311,83 @@ function expand(str, isTop) { +/***/ }), + +/***/ 19227: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var bind = __nccwpck_require__(88334); + +var $apply = __nccwpck_require__(54177); +var $call = __nccwpck_require__(2808); +var $reflectApply = __nccwpck_require__(48309); + +/** @type {import('./actualApply')} */ +module.exports = $reflectApply || bind.call($call, $apply); + + +/***/ }), + +/***/ 54177: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./functionApply')} */ +module.exports = Function.prototype.apply; + + +/***/ }), + +/***/ 2808: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./functionCall')} */ +module.exports = Function.prototype.call; + + +/***/ }), + +/***/ 86815: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var bind = __nccwpck_require__(88334); +var $TypeError = __nccwpck_require__(6361); + +var $call = __nccwpck_require__(2808); +var $actualApply = __nccwpck_require__(19227); + +/** @type {(args: [Function, thisArg?: unknown, ...args: unknown[]]) => Function} TODO FIXME, find a way to use import('.') */ +module.exports = function callBindBasic(args) { + if (args.length < 1 || typeof args[0] !== 'function') { + throw new $TypeError('a function is required'); + } + return $actualApply(bind, $call, args); +}; + + +/***/ }), + +/***/ 48309: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./reflectApply')} */ +module.exports = typeof Reflect !== 'undefined' && Reflect && Reflect.apply; + + /***/ }), /***/ 85443: @@ -80665,6 +80737,1004 @@ DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() { }; +/***/ }), + +/***/ 62693: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var callBind = __nccwpck_require__(86815); +var gOPD = __nccwpck_require__(18501); + +var hasProtoAccessor; +try { + // eslint-disable-next-line no-extra-parens, no-proto + hasProtoAccessor = /** @type {{ __proto__?: typeof Array.prototype }} */ ([]).__proto__ === Array.prototype; +} catch (e) { + if (!e || typeof e !== 'object' || !('code' in e) || e.code !== 'ERR_PROTO_ACCESS') { + throw e; + } +} + +// eslint-disable-next-line no-extra-parens +var desc = !!hasProtoAccessor && gOPD && gOPD(Object.prototype, /** @type {keyof typeof Object.prototype} */ ('__proto__')); + +var $Object = Object; +var $getPrototypeOf = $Object.getPrototypeOf; + +/** @type {import('./get')} */ +module.exports = desc && typeof desc.get === 'function' + ? callBind([desc.get]) + : typeof $getPrototypeOf === 'function' + ? /** @type {import('./get')} */ function getDunder(value) { + // eslint-disable-next-line eqeqeq + return $getPrototypeOf(value == null ? value : $Object(value)); + } + : false; + + +/***/ }), + +/***/ 6123: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('.')} */ +var $defineProperty = Object.defineProperty || false; +if ($defineProperty) { + try { + $defineProperty({}, 'a', { value: 1 }); + } catch (e) { + // IE 8 has a broken defineProperty + $defineProperty = false; + } +} + +module.exports = $defineProperty; + + +/***/ }), + +/***/ 91933: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./eval')} */ +module.exports = EvalError; + + +/***/ }), + +/***/ 28015: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('.')} */ +module.exports = Error; + + +/***/ }), + +/***/ 54415: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./range')} */ +module.exports = RangeError; + + +/***/ }), + +/***/ 49246: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./ref')} */ +module.exports = ReferenceError; + + +/***/ }), + +/***/ 75474: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./syntax')} */ +module.exports = SyntaxError; + + +/***/ }), + +/***/ 6361: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./type')} */ +module.exports = TypeError; + + +/***/ }), + +/***/ 5065: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./uri')} */ +module.exports = URIError; + + +/***/ }), + +/***/ 78308: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('.')} */ +module.exports = Object; + + +/***/ }), + +/***/ 11770: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var GetIntrinsic = __nccwpck_require__(74538); + +var $defineProperty = GetIntrinsic('%Object.defineProperty%', true); + +var hasToStringTag = __nccwpck_require__(99038)(); +var hasOwn = __nccwpck_require__(62157); +var $TypeError = __nccwpck_require__(6361); + +var toStringTag = hasToStringTag ? Symbol.toStringTag : null; + +/** @type {import('.')} */ +module.exports = function setToStringTag(object, value) { + var overrideIfSet = arguments.length > 2 && !!arguments[2] && arguments[2].force; + var nonConfigurable = arguments.length > 2 && !!arguments[2] && arguments[2].nonConfigurable; + if ( + (typeof overrideIfSet !== 'undefined' && typeof overrideIfSet !== 'boolean') + || (typeof nonConfigurable !== 'undefined' && typeof nonConfigurable !== 'boolean') + ) { + throw new $TypeError('if provided, the `overrideIfSet` and `nonConfigurable` options must be booleans'); + } + if (toStringTag && (overrideIfSet || !hasOwn(object, toStringTag))) { + if ($defineProperty) { + $defineProperty(object, toStringTag, { + configurable: !nonConfigurable, + enumerable: false, + value: value, + writable: false + }); + } else { + object[toStringTag] = value; // eslint-disable-line no-param-reassign + } + } +}; + + +/***/ }), + +/***/ 19320: +/***/ ((module) => { + +"use strict"; + + +/* eslint no-invalid-this: 1 */ + +var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; +var toStr = Object.prototype.toString; +var max = Math.max; +var funcType = '[object Function]'; + +var concatty = function concatty(a, b) { + var arr = []; + + for (var i = 0; i < a.length; i += 1) { + arr[i] = a[i]; + } + for (var j = 0; j < b.length; j += 1) { + arr[j + a.length] = b[j]; + } + + return arr; +}; + +var slicy = function slicy(arrLike, offset) { + var arr = []; + for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) { + arr[j] = arrLike[i]; + } + return arr; +}; + +var joiny = function (arr, joiner) { + var str = ''; + for (var i = 0; i < arr.length; i += 1) { + str += arr[i]; + if (i + 1 < arr.length) { + str += joiner; + } + } + return str; +}; + +module.exports = function bind(that) { + var target = this; + if (typeof target !== 'function' || toStr.apply(target) !== funcType) { + throw new TypeError(ERROR_MESSAGE + target); + } + var args = slicy(arguments, 1); + + var bound; + var binder = function () { + if (this instanceof bound) { + var result = target.apply( + this, + concatty(args, arguments) + ); + if (Object(result) === result) { + return result; + } + return this; + } + return target.apply( + that, + concatty(args, arguments) + ); + + }; + + var boundLength = max(0, target.length - args.length); + var boundArgs = []; + for (var i = 0; i < boundLength; i++) { + boundArgs[i] = '$' + i; + } + + bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder); + + if (target.prototype) { + var Empty = function Empty() {}; + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + Empty.prototype = null; + } + + return bound; +}; + + +/***/ }), + +/***/ 88334: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var implementation = __nccwpck_require__(19320); + +module.exports = Function.prototype.bind || implementation; + + +/***/ }), + +/***/ 74538: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var undefined; + +var $Object = __nccwpck_require__(78308); + +var $Error = __nccwpck_require__(28015); +var $EvalError = __nccwpck_require__(91933); +var $RangeError = __nccwpck_require__(54415); +var $ReferenceError = __nccwpck_require__(49246); +var $SyntaxError = __nccwpck_require__(75474); +var $TypeError = __nccwpck_require__(6361); +var $URIError = __nccwpck_require__(5065); + +var abs = __nccwpck_require__(19775); +var floor = __nccwpck_require__(60924); +var max = __nccwpck_require__(52419); +var min = __nccwpck_require__(73373); +var pow = __nccwpck_require__(78029); +var round = __nccwpck_require__(59396); +var sign = __nccwpck_require__(39091); + +var $Function = Function; + +// eslint-disable-next-line consistent-return +var getEvalledConstructor = function (expressionSyntax) { + try { + return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')(); + } catch (e) {} +}; + +var $gOPD = __nccwpck_require__(18501); +var $defineProperty = __nccwpck_require__(6123); + +var throwTypeError = function () { + throw new $TypeError(); +}; +var ThrowTypeError = $gOPD + ? (function () { + try { + // eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties + arguments.callee; // IE 8 does not throw here + return throwTypeError; + } catch (calleeThrows) { + try { + // IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '') + return $gOPD(arguments, 'callee').get; + } catch (gOPDthrows) { + return throwTypeError; + } + } + }()) + : throwTypeError; + +var hasSymbols = __nccwpck_require__(40587)(); + +var getProto = __nccwpck_require__(13592); +var $ObjectGPO = __nccwpck_require__(5045); +var $ReflectGPO = __nccwpck_require__(78859); + +var $apply = __nccwpck_require__(54177); +var $call = __nccwpck_require__(2808); + +var needsEval = {}; + +var TypedArray = typeof Uint8Array === 'undefined' || !getProto ? undefined : getProto(Uint8Array); + +var INTRINSICS = { + __proto__: null, + '%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError, + '%Array%': Array, + '%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer, + '%ArrayIteratorPrototype%': hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined, + '%AsyncFromSyncIteratorPrototype%': undefined, + '%AsyncFunction%': needsEval, + '%AsyncGenerator%': needsEval, + '%AsyncGeneratorFunction%': needsEval, + '%AsyncIteratorPrototype%': needsEval, + '%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics, + '%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt, + '%BigInt64Array%': typeof BigInt64Array === 'undefined' ? undefined : BigInt64Array, + '%BigUint64Array%': typeof BigUint64Array === 'undefined' ? undefined : BigUint64Array, + '%Boolean%': Boolean, + '%DataView%': typeof DataView === 'undefined' ? undefined : DataView, + '%Date%': Date, + '%decodeURI%': decodeURI, + '%decodeURIComponent%': decodeURIComponent, + '%encodeURI%': encodeURI, + '%encodeURIComponent%': encodeURIComponent, + '%Error%': $Error, + '%eval%': eval, // eslint-disable-line no-eval + '%EvalError%': $EvalError, + '%Float16Array%': typeof Float16Array === 'undefined' ? undefined : Float16Array, + '%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array, + '%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array, + '%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry, + '%Function%': $Function, + '%GeneratorFunction%': needsEval, + '%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array, + '%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array, + '%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array, + '%isFinite%': isFinite, + '%isNaN%': isNaN, + '%IteratorPrototype%': hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined, + '%JSON%': typeof JSON === 'object' ? JSON : undefined, + '%Map%': typeof Map === 'undefined' ? undefined : Map, + '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Map()[Symbol.iterator]()), + '%Math%': Math, + '%Number%': Number, + '%Object%': $Object, + '%Object.getOwnPropertyDescriptor%': $gOPD, + '%parseFloat%': parseFloat, + '%parseInt%': parseInt, + '%Promise%': typeof Promise === 'undefined' ? undefined : Promise, + '%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy, + '%RangeError%': $RangeError, + '%ReferenceError%': $ReferenceError, + '%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect, + '%RegExp%': RegExp, + '%Set%': typeof Set === 'undefined' ? undefined : Set, + '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Set()[Symbol.iterator]()), + '%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer, + '%String%': String, + '%StringIteratorPrototype%': hasSymbols && getProto ? getProto(''[Symbol.iterator]()) : undefined, + '%Symbol%': hasSymbols ? Symbol : undefined, + '%SyntaxError%': $SyntaxError, + '%ThrowTypeError%': ThrowTypeError, + '%TypedArray%': TypedArray, + '%TypeError%': $TypeError, + '%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array, + '%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray, + '%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array, + '%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array, + '%URIError%': $URIError, + '%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap, + '%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef, + '%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet, + + '%Function.prototype.call%': $call, + '%Function.prototype.apply%': $apply, + '%Object.defineProperty%': $defineProperty, + '%Object.getPrototypeOf%': $ObjectGPO, + '%Math.abs%': abs, + '%Math.floor%': floor, + '%Math.max%': max, + '%Math.min%': min, + '%Math.pow%': pow, + '%Math.round%': round, + '%Math.sign%': sign, + '%Reflect.getPrototypeOf%': $ReflectGPO +}; + +if (getProto) { + try { + null.error; // eslint-disable-line no-unused-expressions + } catch (e) { + // https://github.com/tc39/proposal-shadowrealm/pull/384#issuecomment-1364264229 + var errorProto = getProto(getProto(e)); + INTRINSICS['%Error.prototype%'] = errorProto; + } +} + +var doEval = function doEval(name) { + var value; + if (name === '%AsyncFunction%') { + value = getEvalledConstructor('async function () {}'); + } else if (name === '%GeneratorFunction%') { + value = getEvalledConstructor('function* () {}'); + } else if (name === '%AsyncGeneratorFunction%') { + value = getEvalledConstructor('async function* () {}'); + } else if (name === '%AsyncGenerator%') { + var fn = doEval('%AsyncGeneratorFunction%'); + if (fn) { + value = fn.prototype; + } + } else if (name === '%AsyncIteratorPrototype%') { + var gen = doEval('%AsyncGenerator%'); + if (gen && getProto) { + value = getProto(gen.prototype); + } + } + + INTRINSICS[name] = value; + + return value; +}; + +var LEGACY_ALIASES = { + __proto__: null, + '%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'], + '%ArrayPrototype%': ['Array', 'prototype'], + '%ArrayProto_entries%': ['Array', 'prototype', 'entries'], + '%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'], + '%ArrayProto_keys%': ['Array', 'prototype', 'keys'], + '%ArrayProto_values%': ['Array', 'prototype', 'values'], + '%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'], + '%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'], + '%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'], + '%BooleanPrototype%': ['Boolean', 'prototype'], + '%DataViewPrototype%': ['DataView', 'prototype'], + '%DatePrototype%': ['Date', 'prototype'], + '%ErrorPrototype%': ['Error', 'prototype'], + '%EvalErrorPrototype%': ['EvalError', 'prototype'], + '%Float32ArrayPrototype%': ['Float32Array', 'prototype'], + '%Float64ArrayPrototype%': ['Float64Array', 'prototype'], + '%FunctionPrototype%': ['Function', 'prototype'], + '%Generator%': ['GeneratorFunction', 'prototype'], + '%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'], + '%Int8ArrayPrototype%': ['Int8Array', 'prototype'], + '%Int16ArrayPrototype%': ['Int16Array', 'prototype'], + '%Int32ArrayPrototype%': ['Int32Array', 'prototype'], + '%JSONParse%': ['JSON', 'parse'], + '%JSONStringify%': ['JSON', 'stringify'], + '%MapPrototype%': ['Map', 'prototype'], + '%NumberPrototype%': ['Number', 'prototype'], + '%ObjectPrototype%': ['Object', 'prototype'], + '%ObjProto_toString%': ['Object', 'prototype', 'toString'], + '%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'], + '%PromisePrototype%': ['Promise', 'prototype'], + '%PromiseProto_then%': ['Promise', 'prototype', 'then'], + '%Promise_all%': ['Promise', 'all'], + '%Promise_reject%': ['Promise', 'reject'], + '%Promise_resolve%': ['Promise', 'resolve'], + '%RangeErrorPrototype%': ['RangeError', 'prototype'], + '%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'], + '%RegExpPrototype%': ['RegExp', 'prototype'], + '%SetPrototype%': ['Set', 'prototype'], + '%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'], + '%StringPrototype%': ['String', 'prototype'], + '%SymbolPrototype%': ['Symbol', 'prototype'], + '%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'], + '%TypedArrayPrototype%': ['TypedArray', 'prototype'], + '%TypeErrorPrototype%': ['TypeError', 'prototype'], + '%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'], + '%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'], + '%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'], + '%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'], + '%URIErrorPrototype%': ['URIError', 'prototype'], + '%WeakMapPrototype%': ['WeakMap', 'prototype'], + '%WeakSetPrototype%': ['WeakSet', 'prototype'] +}; + +var bind = __nccwpck_require__(88334); +var hasOwn = __nccwpck_require__(62157); +var $concat = bind.call($call, Array.prototype.concat); +var $spliceApply = bind.call($apply, Array.prototype.splice); +var $replace = bind.call($call, String.prototype.replace); +var $strSlice = bind.call($call, String.prototype.slice); +var $exec = bind.call($call, RegExp.prototype.exec); + +/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */ +var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g; +var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */ +var stringToPath = function stringToPath(string) { + var first = $strSlice(string, 0, 1); + var last = $strSlice(string, -1); + if (first === '%' && last !== '%') { + throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`'); + } else if (last === '%' && first !== '%') { + throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`'); + } + var result = []; + $replace(string, rePropName, function (match, number, quote, subString) { + result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match; + }); + return result; +}; +/* end adaptation */ + +var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) { + var intrinsicName = name; + var alias; + if (hasOwn(LEGACY_ALIASES, intrinsicName)) { + alias = LEGACY_ALIASES[intrinsicName]; + intrinsicName = '%' + alias[0] + '%'; + } + + if (hasOwn(INTRINSICS, intrinsicName)) { + var value = INTRINSICS[intrinsicName]; + if (value === needsEval) { + value = doEval(intrinsicName); + } + if (typeof value === 'undefined' && !allowMissing) { + throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!'); + } + + return { + alias: alias, + name: intrinsicName, + value: value + }; + } + + throw new $SyntaxError('intrinsic ' + name + ' does not exist!'); +}; + +module.exports = function GetIntrinsic(name, allowMissing) { + if (typeof name !== 'string' || name.length === 0) { + throw new $TypeError('intrinsic name must be a non-empty string'); + } + if (arguments.length > 1 && typeof allowMissing !== 'boolean') { + throw new $TypeError('"allowMissing" argument must be a boolean'); + } + + if ($exec(/^%?[^%]*%?$/, name) === null) { + throw new $SyntaxError('`%` may not be present anywhere but at the beginning and end of the intrinsic name'); + } + var parts = stringToPath(name); + var intrinsicBaseName = parts.length > 0 ? parts[0] : ''; + + var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing); + var intrinsicRealName = intrinsic.name; + var value = intrinsic.value; + var skipFurtherCaching = false; + + var alias = intrinsic.alias; + if (alias) { + intrinsicBaseName = alias[0]; + $spliceApply(parts, $concat([0, 1], alias)); + } + + for (var i = 1, isOwn = true; i < parts.length; i += 1) { + var part = parts[i]; + var first = $strSlice(part, 0, 1); + var last = $strSlice(part, -1); + if ( + ( + (first === '"' || first === "'" || first === '`') + || (last === '"' || last === "'" || last === '`') + ) + && first !== last + ) { + throw new $SyntaxError('property names with quotes must have matching quotes'); + } + if (part === 'constructor' || !isOwn) { + skipFurtherCaching = true; + } + + intrinsicBaseName += '.' + part; + intrinsicRealName = '%' + intrinsicBaseName + '%'; + + if (hasOwn(INTRINSICS, intrinsicRealName)) { + value = INTRINSICS[intrinsicRealName]; + } else if (value != null) { + if (!(part in value)) { + if (!allowMissing) { + throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.'); + } + return void undefined; + } + if ($gOPD && (i + 1) >= parts.length) { + var desc = $gOPD(value, part); + isOwn = !!desc; + + // By convention, when a data property is converted to an accessor + // property to emulate a data property that does not suffer from + // the override mistake, that accessor's getter is marked with + // an `originalValue` property. Here, when we detect this, we + // uphold the illusion by pretending to see that original data + // property, i.e., returning the value rather than the getter + // itself. + if (isOwn && 'get' in desc && !('originalValue' in desc.get)) { + value = desc.get; + } else { + value = value[part]; + } + } else { + isOwn = hasOwn(value, part); + value = value[part]; + } + + if (isOwn && !skipFurtherCaching) { + INTRINSICS[intrinsicRealName] = value; + } + } + } + return value; +}; + + +/***/ }), + +/***/ 5045: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var $Object = __nccwpck_require__(78308); + +/** @type {import('./Object.getPrototypeOf')} */ +module.exports = $Object.getPrototypeOf || null; + + +/***/ }), + +/***/ 78859: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./Reflect.getPrototypeOf')} */ +module.exports = (typeof Reflect !== 'undefined' && Reflect.getPrototypeOf) || null; + + +/***/ }), + +/***/ 13592: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var reflectGetProto = __nccwpck_require__(78859); +var originalGetProto = __nccwpck_require__(5045); + +var getDunderProto = __nccwpck_require__(62693); + +/** @type {import('.')} */ +module.exports = reflectGetProto + ? function getProto(O) { + // @ts-expect-error TS can't narrow inside a closure, for some reason + return reflectGetProto(O); + } + : originalGetProto + ? function getProto(O) { + if (!O || (typeof O !== 'object' && typeof O !== 'function')) { + throw new TypeError('getProto: not an object'); + } + // @ts-expect-error TS can't narrow inside a closure, for some reason + return originalGetProto(O); + } + : getDunderProto + ? function getProto(O) { + // @ts-expect-error TS can't narrow inside a closure, for some reason + return getDunderProto(O); + } + : null; + + +/***/ }), + +/***/ 57087: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./gOPD')} */ +module.exports = Object.getOwnPropertyDescriptor; + + +/***/ }), + +/***/ 18501: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +/** @type {import('.')} */ +var $gOPD = __nccwpck_require__(57087); + +if ($gOPD) { + try { + $gOPD([], 'length'); + } catch (e) { + // IE 8 has a broken gOPD + $gOPD = null; + } +} + +module.exports = $gOPD; + + +/***/ }), + +/***/ 40587: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var origSymbol = typeof Symbol !== 'undefined' && Symbol; +var hasSymbolSham = __nccwpck_require__(57747); + +/** @type {import('.')} */ +module.exports = function hasNativeSymbols() { + if (typeof origSymbol !== 'function') { return false; } + if (typeof Symbol !== 'function') { return false; } + if (typeof origSymbol('foo') !== 'symbol') { return false; } + if (typeof Symbol('bar') !== 'symbol') { return false; } + + return hasSymbolSham(); +}; + + +/***/ }), + +/***/ 57747: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./shams')} */ +/* eslint complexity: [2, 18], max-statements: [2, 33] */ +module.exports = function hasSymbols() { + if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; } + if (typeof Symbol.iterator === 'symbol') { return true; } + + /** @type {{ [k in symbol]?: unknown }} */ + var obj = {}; + var sym = Symbol('test'); + var symObj = Object(sym); + if (typeof sym === 'string') { return false; } + + if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; } + if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; } + + // temp disabled per https://github.com/ljharb/object.assign/issues/17 + // if (sym instanceof Symbol) { return false; } + // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4 + // if (!(symObj instanceof Symbol)) { return false; } + + // if (typeof Symbol.prototype.toString !== 'function') { return false; } + // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; } + + var symVal = 42; + obj[sym] = symVal; + for (var _ in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop + if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; } + + if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; } + + var syms = Object.getOwnPropertySymbols(obj); + if (syms.length !== 1 || syms[0] !== sym) { return false; } + + if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; } + + if (typeof Object.getOwnPropertyDescriptor === 'function') { + // eslint-disable-next-line no-extra-parens + var descriptor = /** @type {PropertyDescriptor} */ (Object.getOwnPropertyDescriptor(obj, sym)); + if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; } + } + + return true; +}; + + +/***/ }), + +/***/ 99038: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var hasSymbols = __nccwpck_require__(57747); + +/** @type {import('.')} */ +module.exports = function hasToStringTagShams() { + return hasSymbols() && !!Symbol.toStringTag; +}; + + +/***/ }), + +/***/ 62157: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var call = Function.prototype.call; +var $hasOwn = Object.prototype.hasOwnProperty; +var bind = __nccwpck_require__(88334); + +/** @type {import('.')} */ +module.exports = bind.call(call, $hasOwn); + + +/***/ }), + +/***/ 19775: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./abs')} */ +module.exports = Math.abs; + + +/***/ }), + +/***/ 60924: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./floor')} */ +module.exports = Math.floor; + + +/***/ }), + +/***/ 57661: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./isNaN')} */ +module.exports = Number.isNaN || function isNaN(a) { + return a !== a; +}; + + +/***/ }), + +/***/ 52419: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./max')} */ +module.exports = Math.max; + + +/***/ }), + +/***/ 73373: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./min')} */ +module.exports = Math.min; + + +/***/ }), + +/***/ 78029: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./pow')} */ +module.exports = Math.pow; + + +/***/ }), + +/***/ 59396: +/***/ ((module) => { + +"use strict"; + + +/** @type {import('./round')} */ +module.exports = Math.round; + + +/***/ }), + +/***/ 39091: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var $isNaN = __nccwpck_require__(57661); + +/** @type {import('./sign')} */ +module.exports = function sign(number) { + if ($isNaN(number) || number === 0) { + return number; + } + return number < 0 ? -1 : +1; +}; + + /***/ }), /***/ 47426: @@ -95970,7 +97040,7 @@ module.exports = { const { parseSetCookie } = __nccwpck_require__(24408) -const { stringify, getHeadersList } = __nccwpck_require__(43121) +const { stringify } = __nccwpck_require__(43121) const { webidl } = __nccwpck_require__(21744) const { Headers } = __nccwpck_require__(10554) @@ -96046,14 +97116,13 @@ function getSetCookies (headers) { webidl.brandCheck(headers, Headers, { strict: false }) - const cookies = getHeadersList(headers).cookies + const cookies = headers.getSetCookie() if (!cookies) { return [] } - // In older versions of undici, cookies is a list of name:value. - return cookies.map((pair) => parseSetCookie(Array.isArray(pair) ? pair[1] : pair)) + return cookies.map((pair) => parseSetCookie(pair)) } /** @@ -96481,14 +97550,15 @@ module.exports = { /***/ }), /***/ 43121: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ ((module) => { "use strict"; -const assert = __nccwpck_require__(39491) -const { kHeadersList } = __nccwpck_require__(72785) - +/** + * @param {string} value + * @returns {boolean} + */ function isCTLExcludingHtab (value) { if (value.length === 0) { return false @@ -96749,31 +97819,13 @@ function stringify (cookie) { return out.join('; ') } -let kHeadersListNode - -function getHeadersList (headers) { - if (headers[kHeadersList]) { - return headers[kHeadersList] - } - - if (!kHeadersListNode) { - kHeadersListNode = Object.getOwnPropertySymbols(headers).find( - (symbol) => symbol.description === 'headers list' - ) - - assert(kHeadersListNode, 'Headers cannot be parsed') - } - - const headersList = headers[kHeadersListNode] - assert(headersList) - - return headersList -} - module.exports = { isCTLExcludingHtab, - stringify, - getHeadersList + validateCookieName, + validateCookiePath, + validateCookieValue, + toIMFDate, + stringify } @@ -100777,6 +101829,7 @@ const { isValidHeaderName, isValidHeaderValue } = __nccwpck_require__(52538) +const util = __nccwpck_require__(73837) const { webidl } = __nccwpck_require__(21744) const assert = __nccwpck_require__(39491) @@ -101330,6 +102383,9 @@ Object.defineProperties(Headers.prototype, { [Symbol.toStringTag]: { value: 'Headers', configurable: true + }, + [util.inspect.custom]: { + enumerable: false } }) @@ -110506,6 +111562,20 @@ class Pool extends PoolBase { ? { ...options.interceptors } : undefined this[kFactory] = factory + + this.on('connectionError', (origin, targets, error) => { + // If a connection error occurs, we remove the client from the pool, + // and emit a connectionError event. They will not be re-used. + // Fixes https://github.com/nodejs/undici/issues/3895 + for (const target of targets) { + // Do not use kRemoveClient here, as it will close the client, + // but the client cannot be closed in this state. + const idx = this[kClients].indexOf(target) + if (idx !== -1) { + this[kClients].splice(idx, 1) + } + } + }) } [kGetDispatcher] () { @@ -128786,6 +129856,7 @@ class JavaBase { this.checkLatest = installerOptions.checkLatest; } setupJava() { + var _a, _b; return __awaiter(this, void 0, void 0, function* () { let foundJava = this.findInToolcache(); if (foundJava && !this.checkLatest) { @@ -128793,17 +129864,106 @@ class JavaBase { } else { core.info('Trying to resolve the latest version from remote'); - const javaRelease = yield this.findPackageForDownload(this.version); - core.info(`Resolved latest version as ${javaRelease.version}`); - if ((foundJava === null || foundJava === void 0 ? void 0 : foundJava.version) === javaRelease.version) { - core.info(`Resolved Java ${foundJava.version} from tool-cache`); - } - else { - core.info('Trying to download...'); - foundJava = yield this.downloadTool(javaRelease); - core.info(`Java ${foundJava.version} was downloaded`); + const MAX_RETRIES = 4; + const RETRY_DELAY_MS = 2000; + const retryableCodes = [ + 'ETIMEDOUT', + 'ECONNRESET', + 'ENOTFOUND', + 'ECONNREFUSED' + ]; + let retries = MAX_RETRIES; + while (retries > 0) { + try { + // Clear console timers before each attempt to prevent conflicts + if (retries < MAX_RETRIES && core.isDebug()) { + const consoleAny = console; + (_b = (_a = consoleAny._times) === null || _a === void 0 ? void 0 : _a.clear) === null || _b === void 0 ? void 0 : _b.call(_a); + } + const javaRelease = yield this.findPackageForDownload(this.version); + core.info(`Resolved latest version as ${javaRelease.version}`); + if ((foundJava === null || foundJava === void 0 ? void 0 : foundJava.version) === javaRelease.version) { + core.info(`Resolved Java ${foundJava.version} from tool-cache`); + } + else { + core.info('Trying to download...'); + foundJava = yield this.downloadTool(javaRelease); + core.info(`Java ${foundJava.version} was downloaded`); + } + break; + } + catch (error) { + retries--; + // Check if error is retryable (including aggregate errors) + const isRetryable = (error instanceof tc.HTTPError && + error.httpStatusCode && + [429, 502, 503, 504].includes(error.httpStatusCode)) || + retryableCodes.includes(error === null || error === void 0 ? void 0 : error.code) || + ((error === null || error === void 0 ? void 0 : error.errors) && + Array.isArray(error.errors) && + error.errors.some((err) => retryableCodes.includes(err === null || err === void 0 ? void 0 : err.code))); + if (retries > 0 && isRetryable) { + core.debug(`Attempt failed due to network or timeout issues, initiating retry... (${retries} attempts left)`); + yield new Promise(r => setTimeout(r, RETRY_DELAY_MS)); + continue; + } + if (error instanceof tc.HTTPError) { + if (error.httpStatusCode === 403) { + core.error('HTTP 403: Permission denied or access restricted.'); + } + else if (error.httpStatusCode === 429) { + core.warning('HTTP 429: Rate limit exceeded. Please retry later.'); + } + else { + core.error(`HTTP ${error.httpStatusCode}: ${error.message}`); + } + } + else if (error && error.errors && Array.isArray(error.errors)) { + core.error(`Java setup failed due to network or configuration error(s)`); + if (error instanceof Error && error.stack) { + core.debug(error.stack); + } + for (const err of error.errors) { + const endpoint = (err === null || err === void 0 ? void 0 : err.address) || (err === null || err === void 0 ? void 0 : err.hostname) || ''; + const port = (err === null || err === void 0 ? void 0 : err.port) ? `:${err.port}` : ''; + const message = (err === null || err === void 0 ? void 0 : err.message) || 'Aggregate error'; + const endpointInfo = !message.includes(endpoint) + ? ` ${endpoint}${port}` + : ''; + const localInfo = err.localAddress && err.localPort + ? ` - Local (${err.localAddress}:${err.localPort})` + : ''; + const logMessage = `${message}${endpointInfo}${localInfo}`; + core.error(logMessage); + core.debug(`${err.stack || err.message}`); + Object.entries(err).forEach(([key, value]) => { + core.debug(`"${key}": ${JSON.stringify(value)}`); + }); + } + } + else { + const message = error instanceof Error ? error.message : JSON.stringify(error); + core.error(`Java setup process failed due to: ${message}`); + if (typeof (error === null || error === void 0 ? void 0 : error.code) === 'string') { + core.debug(error.stack); + } + const errorDetails = Object.assign({ name: error.name, message: error.message }, Object.getOwnPropertyNames(error) + .filter(prop => !['name', 'message', 'stack'].includes(prop)) + .reduce((acc, prop) => { + acc[prop] = error[prop]; + return acc; + }, {})); + Object.entries(errorDetails).forEach(([key, value]) => { + core.debug(`"${key}": ${JSON.stringify(value)}`); + }); + } + throw error; + } } } + if (!foundJava) { + throw new Error('Failed to resolve Java version'); + } // JDK folder may contain postfix "Contents/Home" on macOS const macOSPostfixPath = path_1.default.join(foundJava.path, constants_1.MACOS_JAVA_CONTENT_POSTFIX); if (process.platform === 'darwin' && fs.existsSync(macOSPostfixPath)) { @@ -129212,234 +130372,64 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DragonwellDistribution = void 0; -const core = __importStar(__nccwpck_require__(42186)); -const tc = __importStar(__nccwpck_require__(27784)); -const semver_1 = __importDefault(__nccwpck_require__(11383)); -const fs_1 = __importDefault(__nccwpck_require__(57147)); -const path_1 = __importDefault(__nccwpck_require__(71017)); -const base_installer_1 = __nccwpck_require__(59741); -const util_1 = __nccwpck_require__(92629); -class DragonwellDistribution extends base_installer_1.JavaBase { - constructor(installerOptions) { - super('Dragonwell', installerOptions); - } - findPackageForDownload(version) { - return __awaiter(this, void 0, void 0, function* () { - if (!this.stable) { - throw new Error('Early access versions are not supported by Dragonwell'); - } - if (this.packageType !== 'jdk') { - throw new Error('Dragonwell provides only the `jdk` package type'); - } - const availableVersions = yield this.getAvailableVersions(); - const matchedVersions = availableVersions - .filter(item => { - return (0, util_1.isVersionSatisfies)(version, item.jdk_version); - }) - .map(item => { - return { - version: item.jdk_version, - url: item.download_link - }; - }); - if (!matchedVersions.length) { - throw new Error(`Couldn't find any satisfied version for the specified java-version: "${version}" and architecture: "${this.architecture}".`); - } - const resolvedVersion = matchedVersions[0]; - return resolvedVersion; - }); - } - getAvailableVersions() { - return __awaiter(this, void 0, void 0, function* () { - const platform = this.getPlatformOption(); - const arch = this.distributionArchitecture(); - let fetchedDragonwellJson = yield this.fetchJsonFromPrimaryUrl(); - if (!fetchedDragonwellJson) { - fetchedDragonwellJson = yield this.fetchJsonFromBackupUrl(); - } - if (!fetchedDragonwellJson) { - throw new Error(`Couldn't fetch Dragonwell versions information from both primary and backup urls`); - } - core.debug('Successfully fetched information about available Dragonwell versions'); - const availableVersions = this.parseVersions(platform, arch, fetchedDragonwellJson); - if (core.isDebug()) { - core.startGroup('Print information about available versions'); - core.debug(availableVersions.map(item => item.jdk_version).join(', ')); - core.endGroup(); - } - return availableVersions; - }); - } - downloadTool(javaRelease) { - return __awaiter(this, void 0, void 0, function* () { - core.info(`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`); - let javaArchivePath = yield tc.downloadTool(javaRelease.url); - core.info(`Extracting Java archive...`); - const extension = (0, util_1.getDownloadArchiveExtension)(); - if (process.platform === 'win32') { - javaArchivePath = (0, util_1.renameWinArchive)(javaArchivePath); - } - const extractedJavaPath = yield (0, util_1.extractJdkFile)(javaArchivePath, extension); - const archiveName = fs_1.default.readdirSync(extractedJavaPath)[0]; - const archivePath = path_1.default.join(extractedJavaPath, archiveName); - const version = this.getToolcacheVersionName(javaRelease.version); - const javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, version, this.architecture); - return { version: javaRelease.version, path: javaPath }; - }); - } - parseVersions(platform, arch, dragonwellVersions) { - var _a; - const eligibleVersions = []; - for (const majorVersion in dragonwellVersions) { - const majorVersionMap = dragonwellVersions[majorVersion]; - for (let jdkVersion in majorVersionMap) { - const jdkVersionMap = majorVersionMap[jdkVersion]; - if (!(platform in jdkVersionMap)) { - continue; - } - const platformMap = jdkVersionMap[platform]; - if (!(arch in platformMap)) { - continue; - } - const archMap = platformMap[arch]; - if (jdkVersion === 'latest') { - continue; - } - // Some version of Dragonwell JDK are numerated with help of non-semver notation (more then 3 digits). - // Common practice is to transform excess digits to the so-called semver build part, which is prefixed with the plus sign, to be able to operate with them using semver tools. - const jdkVersionNums = jdkVersion - .replace('+', '.') - .split('.'); - jdkVersion = (0, util_1.convertVersionToSemver)(`${jdkVersionNums.slice(0, 3).join('.')}.${jdkVersionNums[jdkVersionNums.length - 1]}`); - for (const edition in archMap) { - eligibleVersions.push({ - os: platform, - architecture: arch, - jdk_version: jdkVersion, - checksum: (_a = archMap[edition].sha256) !== null && _a !== void 0 ? _a : '', - download_link: archMap[edition].download_url, - edition: edition, - image_type: 'jdk' - }); - break; // Get the first available link to the JDK. In most cases it should point to the Extended version of JDK, in rare cases like with v17 it points to the Standard version (the only available). - } - } - } - const sortedVersions = this.sortParsedVersions(eligibleVersions); - return sortedVersions; - } - // Sorts versions in descending order as by default data in JSON isn't sorted - sortParsedVersions(eligibleVersions) { - const sortedVersions = eligibleVersions.sort((versionObj1, versionObj2) => { - const version1 = versionObj1.jdk_version; - const version2 = versionObj2.jdk_version; - return semver_1.default.compareBuild(version1, version2); - }); - return sortedVersions.reverse(); - } - getPlatformOption() { - switch (process.platform) { - case 'win32': - return 'windows'; - default: - return process.platform; - } - } - fetchJsonFromPrimaryUrl() { - return __awaiter(this, void 0, void 0, function* () { - const primaryUrl = 'https://dragonwell-jdk.io/map_with_checksum.json'; - try { - core.debug(`Trying to fetch available Dragonwell versions info from the primary url: ${primaryUrl}`); - const fetchedDragonwellJson = (yield this.http.getJson(primaryUrl)).result; - return fetchedDragonwellJson; - } - catch (err) { - core.debug(`Fetching Dragonwell versions info from the primary link: ${primaryUrl} ended up with the error: ${err.message}`); - return null; - } - }); - } - fetchJsonFromBackupUrl() { - return __awaiter(this, void 0, void 0, function* () { - const owner = 'dragonwell-releng'; - const repository = 'dragonwell-setup-java'; - const branch = 'main'; - const filePath = 'releases.json'; - const backupUrl = `https://api.github.com/repos/${owner}/${repository}/contents/${filePath}?ref=${branch}`; - const headers = (0, util_1.getGitHubHttpHeaders)(); - try { - core.debug(`Trying to fetch available Dragonwell versions info from the backup url: ${backupUrl}`); - const fetchedDragonwellJson = (yield this.http.getJson(backupUrl, headers)).result; - return fetchedDragonwellJson; - } - catch (err) { - core.debug(`Fetching Dragonwell versions info from the backup url: ${backupUrl} ended up with the error: ${err.message}`); - return null; - } - }); - } -} -exports.DragonwellDistribution = DragonwellDistribution; - - -/***/ }), - -/***/ 55644: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.GraalVMDistribution = void 0; +exports.DragonwellDistribution = void 0; const core = __importStar(__nccwpck_require__(42186)); const tc = __importStar(__nccwpck_require__(27784)); +const semver_1 = __importDefault(__nccwpck_require__(11383)); const fs_1 = __importDefault(__nccwpck_require__(57147)); const path_1 = __importDefault(__nccwpck_require__(71017)); const base_installer_1 = __nccwpck_require__(59741); const util_1 = __nccwpck_require__(92629); -const http_client_1 = __nccwpck_require__(96255); -const GRAALVM_DL_BASE = 'https://download.oracle.com/graalvm'; -const IS_WINDOWS = process.platform === 'win32'; -const GRAALVM_PLATFORM = IS_WINDOWS ? 'windows' : process.platform; -class GraalVMDistribution extends base_installer_1.JavaBase { +class DragonwellDistribution extends base_installer_1.JavaBase { constructor(installerOptions) { - super('GraalVM', installerOptions); + super('Dragonwell', installerOptions); + } + findPackageForDownload(version) { + return __awaiter(this, void 0, void 0, function* () { + if (!this.stable) { + throw new Error('Early access versions are not supported by Dragonwell'); + } + if (this.packageType !== 'jdk') { + throw new Error('Dragonwell provides only the `jdk` package type'); + } + const availableVersions = yield this.getAvailableVersions(); + const matchedVersions = availableVersions + .filter(item => { + return (0, util_1.isVersionSatisfies)(version, item.jdk_version); + }) + .map(item => { + return { + version: item.jdk_version, + url: item.download_link + }; + }); + if (!matchedVersions.length) { + throw new Error(`Couldn't find any satisfied version for the specified java-version: "${version}" and architecture: "${this.architecture}".`); + } + const resolvedVersion = matchedVersions[0]; + return resolvedVersion; + }); + } + getAvailableVersions() { + return __awaiter(this, void 0, void 0, function* () { + const platform = this.getPlatformOption(); + const arch = this.distributionArchitecture(); + let fetchedDragonwellJson = yield this.fetchJsonFromPrimaryUrl(); + if (!fetchedDragonwellJson) { + fetchedDragonwellJson = yield this.fetchJsonFromBackupUrl(); + } + if (!fetchedDragonwellJson) { + throw new Error(`Couldn't fetch Dragonwell versions information from both primary and backup urls`); + } + core.debug('Successfully fetched information about available Dragonwell versions'); + const availableVersions = this.parseVersions(platform, arch, fetchedDragonwellJson); + if (core.isDebug()) { + core.startGroup('Print information about available versions'); + core.debug(availableVersions.map(item => item.jdk_version).join(', ')); + core.endGroup(); + } + return availableVersions; + }); } downloadTool(javaRelease) { return __awaiter(this, void 0, void 0, function* () { @@ -129458,11 +130448,200 @@ class GraalVMDistribution extends base_installer_1.JavaBase { return { version: javaRelease.version, path: javaPath }; }); } + parseVersions(platform, arch, dragonwellVersions) { + var _a; + const eligibleVersions = []; + for (const majorVersion in dragonwellVersions) { + const majorVersionMap = dragonwellVersions[majorVersion]; + for (let jdkVersion in majorVersionMap) { + const jdkVersionMap = majorVersionMap[jdkVersion]; + if (!(platform in jdkVersionMap)) { + continue; + } + const platformMap = jdkVersionMap[platform]; + if (!(arch in platformMap)) { + continue; + } + const archMap = platformMap[arch]; + if (jdkVersion === 'latest') { + continue; + } + // Some version of Dragonwell JDK are numerated with help of non-semver notation (more then 3 digits). + // Common practice is to transform excess digits to the so-called semver build part, which is prefixed with the plus sign, to be able to operate with them using semver tools. + const jdkVersionNums = jdkVersion + .replace('+', '.') + .split('.'); + jdkVersion = (0, util_1.convertVersionToSemver)(`${jdkVersionNums.slice(0, 3).join('.')}.${jdkVersionNums[jdkVersionNums.length - 1]}`); + for (const edition in archMap) { + eligibleVersions.push({ + os: platform, + architecture: arch, + jdk_version: jdkVersion, + checksum: (_a = archMap[edition].sha256) !== null && _a !== void 0 ? _a : '', + download_link: archMap[edition].download_url, + edition: edition, + image_type: 'jdk' + }); + break; // Get the first available link to the JDK. In most cases it should point to the Extended version of JDK, in rare cases like with v17 it points to the Standard version (the only available). + } + } + } + const sortedVersions = this.sortParsedVersions(eligibleVersions); + return sortedVersions; + } + // Sorts versions in descending order as by default data in JSON isn't sorted + sortParsedVersions(eligibleVersions) { + const sortedVersions = eligibleVersions.sort((versionObj1, versionObj2) => { + const version1 = versionObj1.jdk_version; + const version2 = versionObj2.jdk_version; + return semver_1.default.compareBuild(version1, version2); + }); + return sortedVersions.reverse(); + } + getPlatformOption() { + switch (process.platform) { + case 'win32': + return 'windows'; + default: + return process.platform; + } + } + fetchJsonFromPrimaryUrl() { + return __awaiter(this, void 0, void 0, function* () { + const primaryUrl = 'https://dragonwell-jdk.io/map_with_checksum.json'; + try { + core.debug(`Trying to fetch available Dragonwell versions info from the primary url: ${primaryUrl}`); + const fetchedDragonwellJson = (yield this.http.getJson(primaryUrl)).result; + return fetchedDragonwellJson; + } + catch (err) { + core.debug(`Fetching Dragonwell versions info from the primary link: ${primaryUrl} ended up with the error: ${err.message}`); + return null; + } + }); + } + fetchJsonFromBackupUrl() { + return __awaiter(this, void 0, void 0, function* () { + const owner = 'dragonwell-releng'; + const repository = 'dragonwell-setup-java'; + const branch = 'main'; + const filePath = 'releases.json'; + const backupUrl = `https://api.github.com/repos/${owner}/${repository}/contents/${filePath}?ref=${branch}`; + const headers = (0, util_1.getGitHubHttpHeaders)(); + try { + core.debug(`Trying to fetch available Dragonwell versions info from the backup url: ${backupUrl}`); + const fetchedDragonwellJson = (yield this.http.getJson(backupUrl, headers)).result; + return fetchedDragonwellJson; + } + catch (err) { + core.debug(`Fetching Dragonwell versions info from the backup url: ${backupUrl} ended up with the error: ${err.message}`); + return null; + } + }); + } +} +exports.DragonwellDistribution = DragonwellDistribution; + + +/***/ }), + +/***/ 55644: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GraalVMDistribution = void 0; +const core = __importStar(__nccwpck_require__(42186)); +const tc = __importStar(__nccwpck_require__(27784)); +const fs_1 = __importDefault(__nccwpck_require__(57147)); +const path_1 = __importDefault(__nccwpck_require__(71017)); +const base_installer_1 = __nccwpck_require__(59741); +const http_client_1 = __nccwpck_require__(96255); +const util_1 = __nccwpck_require__(92629); +const GRAALVM_DL_BASE = 'https://download.oracle.com/graalvm'; +const IS_WINDOWS = process.platform === 'win32'; +const GRAALVM_PLATFORM = IS_WINDOWS ? 'windows' : process.platform; +const GRAALVM_MIN_VERSION = 17; +const SUPPORTED_ARCHITECTURES = ['x64', 'aarch64']; +class GraalVMDistribution extends base_installer_1.JavaBase { + constructor(installerOptions) { + super('GraalVM', installerOptions); + } + downloadTool(javaRelease) { + return __awaiter(this, void 0, void 0, function* () { + try { + core.info(`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`); + let javaArchivePath = yield tc.downloadTool(javaRelease.url); + core.info(`Extracting Java archive...`); + const extension = (0, util_1.getDownloadArchiveExtension)(); + if (IS_WINDOWS) { + javaArchivePath = (0, util_1.renameWinArchive)(javaArchivePath); + } + const extractedJavaPath = yield (0, util_1.extractJdkFile)(javaArchivePath, extension); + // Add validation for extracted path + if (!fs_1.default.existsSync(extractedJavaPath)) { + throw new Error(`Extraction failed: path ${extractedJavaPath} does not exist`); + } + const dirContents = fs_1.default.readdirSync(extractedJavaPath); + if (dirContents.length === 0) { + throw new Error('Extraction failed: no files found in extracted directory'); + } + const archivePath = path_1.default.join(extractedJavaPath, dirContents[0]); + const version = this.getToolcacheVersionName(javaRelease.version); + const javaPath = yield tc.cacheDir(archivePath, this.toolcacheFolderName, version, this.architecture); + return { version: javaRelease.version, path: javaPath }; + } + catch (error) { + core.error(`Failed to download and extract GraalVM: ${error}`); + throw error; + } + }); + } findPackageForDownload(range) { return __awaiter(this, void 0, void 0, function* () { + // Add input validation + if (!range || typeof range !== 'string') { + throw new Error('Version range is required and must be a string'); + } const arch = this.distributionArchitecture(); - if (arch !== 'x64' && arch !== 'aarch64') { - throw new Error(`Unsupported architecture: ${this.architecture}`); + if (!SUPPORTED_ARCHITECTURES.includes(arch)) { + throw new Error(`Unsupported architecture: ${this.architecture}. Supported architectures are: ${SUPPORTED_ARCHITECTURES.join(', ')}`); } if (!this.stable) { return this.findEABuildDownloadUrl(`${range}-ea`); @@ -129472,81 +130651,104 @@ class GraalVMDistribution extends base_installer_1.JavaBase { } const platform = this.getPlatform(); const extension = (0, util_1.getDownloadArchiveExtension)(); - let major; - let fileUrl; - if (range.includes('.')) { - major = range.split('.')[0]; - fileUrl = `${GRAALVM_DL_BASE}/${major}/archive/graalvm-jdk-${range}_${platform}-${arch}_bin.${extension}`; + const major = range.includes('.') ? range.split('.')[0] : range; + const majorVersion = parseInt(major); + if (isNaN(majorVersion)) { + throw new Error(`Invalid version format: ${range}`); } - else { - major = range; - fileUrl = `${GRAALVM_DL_BASE}/${range}/latest/graalvm-jdk-${range}_${platform}-${arch}_bin.${extension}`; - } - if (parseInt(major) < 17) { - throw new Error('GraalVM is only supported for JDK 17 and later'); + if (majorVersion < GRAALVM_MIN_VERSION) { + throw new Error(`GraalVM is only supported for JDK ${GRAALVM_MIN_VERSION} and later. Requested version: ${major}`); } + const fileUrl = this.constructFileUrl(range, major, platform, arch, extension); const response = yield this.http.head(fileUrl); - if (response.message.statusCode === http_client_1.HttpCodes.NotFound) { - throw new Error(`Could not find GraalVM for SemVer ${range}`); - } - if (response.message.statusCode !== http_client_1.HttpCodes.OK) { - throw new Error(`Http request for GraalVM failed with status code: ${response.message.statusCode}`); - } + this.handleHttpResponse(response, range); return { url: fileUrl, version: range }; }); } + constructFileUrl(range, major, platform, arch, extension) { + return range.includes('.') + ? `${GRAALVM_DL_BASE}/${major}/archive/graalvm-jdk-${range}_${platform}-${arch}_bin.${extension}` + : `${GRAALVM_DL_BASE}/${range}/latest/graalvm-jdk-${range}_${platform}-${arch}_bin.${extension}`; + } + handleHttpResponse(response, range) { + const statusCode = response.message.statusCode; + if (statusCode === http_client_1.HttpCodes.NotFound) { + throw new Error(`Could not find GraalVM for SemVer ${range}. Please check if this version is available at ${GRAALVM_DL_BASE}`); + } + if (statusCode === http_client_1.HttpCodes.Unauthorized || + statusCode === http_client_1.HttpCodes.Forbidden) { + throw new Error(`Access denied when downloading GraalVM. Status code: ${statusCode}. Please check your credentials or permissions.`); + } + if (statusCode !== http_client_1.HttpCodes.OK) { + throw new Error(`HTTP request for GraalVM failed with status code: ${statusCode} (${response.message.statusMessage || 'Unknown error'})`); + } + } findEABuildDownloadUrl(javaEaVersion) { return __awaiter(this, void 0, void 0, function* () { + core.debug(`Searching for EA build: ${javaEaVersion}`); const versions = yield this.fetchEAJson(javaEaVersion); + core.debug(`Found ${versions.length} EA versions`); const latestVersion = versions.find(v => v.latest); if (!latestVersion) { + core.error(`Available versions: ${versions.map(v => v.version).join(', ')}`); throw new Error(`Unable to find latest version for '${javaEaVersion}'`); } + core.debug(`Latest version found: ${latestVersion.version}`); const arch = this.distributionArchitecture(); const file = latestVersion.files.find(f => f.arch === arch && f.platform === GRAALVM_PLATFORM); - if (!file || !file.filename.startsWith('graalvm-jdk-')) { - throw new Error(`Unable to find file metadata for '${javaEaVersion}'`); + if (!file) { + core.error(`Available files for architecture ${arch}: ${JSON.stringify(latestVersion.files)}`); + throw new Error(`Unable to find file for architecture '${arch}' and platform '${GRAALVM_PLATFORM}'`); } + if (!file.filename.startsWith('graalvm-jdk-')) { + throw new Error(`Invalid filename format: ${file.filename}. Expected to start with 'graalvm-jdk-'`); + } + const downloadUrl = `${latestVersion.download_base_url}${file.filename}`; + core.debug(`Download URL: ${downloadUrl}`); return { - url: `${latestVersion.download_base_url}${file.filename}`, + url: downloadUrl, version: latestVersion.version }; }); } fetchEAJson(javaEaVersion) { + var _a; return __awaiter(this, void 0, void 0, function* () { - const owner = 'graalvm'; - const repository = 'oracle-graalvm-ea-builds'; - const branch = 'main'; - const filePath = `versions/${javaEaVersion}.json`; - const url = `https://api.github.com/repos/${owner}/${repository}/contents/${filePath}?ref=${branch}`; + const url = `https://api.github.com/repos/graalvm/oracle-graalvm-ea-builds/contents/versions/${javaEaVersion}.json?ref=main`; const headers = (0, util_1.getGitHubHttpHeaders)(); core.debug(`Trying to fetch available version info for GraalVM EA builds from '${url}'`); - let fetchedJson; try { - fetchedJson = (yield this.http.getJson(url, headers)) - .result; - } - catch (err) { - throw Error(`Fetching version info for GraalVM EA builds from '${url}' failed with the error: ${err.message}`); + const response = yield this.http.getJson(url, headers); + if (!response.result) { + throw new Error(`No GraalVM EA build found for version '${javaEaVersion}'. Please check if the version is correct.`); + } + return response.result; } - if (fetchedJson === null) { - throw Error(`No GraalVM EA build found. Are you sure java-version: '${javaEaVersion}' is correct?`); + catch (error) { + if (error instanceof Error) { + // Check if it's a 404 error (file not found) + if ((_a = error.message) === null || _a === void 0 ? void 0 : _a.includes('404')) { + throw new Error(`GraalVM EA version '${javaEaVersion}' not found. Please verify the version exists in the EA builds repository.`); + } + // Re-throw with more context + throw new Error(`Failed to fetch GraalVM EA version information for '${javaEaVersion}': ${error.message}`); + } + // If it's not an Error instance, throw a generic error + throw new Error(`Failed to fetch GraalVM EA version information for '${javaEaVersion}'`); } - return fetchedJson; }); } getPlatform(platform = process.platform) { - switch (platform) { - case 'darwin': - return 'macos'; - case 'win32': - return 'windows'; - case 'linux': - return 'linux'; - default: - throw new Error(`Platform '${platform}' is not supported. Supported platforms: 'linux', 'macos', 'windows'`); + const platformMap = { + darwin: 'macos', + win32: 'windows', + linux: 'linux' + }; + const result = platformMap[platform]; + if (!result) { + throw new Error(`Platform '${platform}' is not supported. Supported platforms: 'linux', 'macos', 'windows'`); } + return result; } } exports.GraalVMDistribution = GraalVMDistribution; @@ -129672,7 +130874,12 @@ class JetBrainsDistribution extends base_installer_1.JavaBase { // url is identical except page_index so print it once for debug core.debug(`Gathering available versions from '${rawUrl}'`); } - const paginationPage = (yield this.http.getJson(rawUrl, requestHeaders)).result; + const paginationPageResult = (yield this.http.getJson(rawUrl, requestHeaders)).result; + if (!paginationPageResult || paginationPageResult.length === 0) { + // break infinity loop because we have reached end of pagination + break; + } + const paginationPage = paginationPageResult.filter(version => this.stable ? !version.prerelease : version.prerelease); if (!paginationPage || paginationPage.length === 0) { // break infinity loop because we have reached end of pagination break; @@ -129680,9 +130887,11 @@ class JetBrainsDistribution extends base_installer_1.JavaBase { rawVersions.push(...paginationPage); page_index++; } - // Add versions not available from the API but are downloadable - const hidden = ['11_0_10b1145.115', '11_0_11b1341.60']; - rawVersions.push(...hidden.map(tag => ({ tag_name: tag, name: tag }))); + if (this.stable) { + // Add versions not available from the API but are downloadable + const hidden = ['11_0_10b1145.115', '11_0_11b1341.60']; + rawVersions.push(...hidden.map(tag => ({ tag_name: tag, name: tag, prerelease: false }))); + } const versions0 = rawVersions.map((v) => __awaiter(this, void 0, void 0, function* () { var _a; // Release tags look like one of these: @@ -129701,7 +130910,7 @@ class JetBrainsDistribution extends base_installer_1.JavaBase { .replace('-', ''); const vsplit = vstring.split('b'); let semver = vsplit[0]; - const build = +vsplit[1]; + const build = vsplit[1]; // Normalize semver if (!semver.includes('.') && !semver.includes('_')) semver = `${semver}.0.0`; @@ -130185,7 +131394,7 @@ class MicrosoftDistributions extends base_installer_1.JavaBase { } } catch (err) { - core.debug(`Http request for microsoft-openjdk-versions.json failed with status code: ${response === null || response === void 0 ? void 0 : response.statusCode}`); + core.debug(`Http request for microsoft-openjdk-versions.json failed with status code: ${response === null || response === void 0 ? void 0 : response.statusCode}. Error: ${err}`); return null; } if (response.result) { @@ -130420,9 +131629,9 @@ class SapMachineDistribution extends base_installer_1.JavaBase { return __awaiter(this, void 0, void 0, function* () { const platform = this.getPlatformOption(); const arch = this.distributionArchitecture(); - let fetchedReleasesJson = yield this.fetchReleasesFromUrl('https://sap.github.io/SapMachine/assets/data/sapmachine-releases-all.json'); + let fetchedReleasesJson = yield this.fetchReleasesFromUrl('https://sapmachine.io/assets/data/sapmachine-releases-all.json'); if (!fetchedReleasesJson) { - fetchedReleasesJson = yield this.fetchReleasesFromUrl('https://api.github.com/repos/SAP/SapMachine/contents/assets/data/sapmachine-releases-all.json?ref=gh-pages', (0, util_1.getGitHubHttpHeaders)()); + fetchedReleasesJson = yield this.fetchReleasesFromUrl('https://sap.github.io/SapMachine/assets/data/sapmachine-releases-all.json'); } if (!fetchedReleasesJson) { throw new Error(`Couldn't fetch SapMachine versions information from both primary and backup urls`); @@ -131639,19 +132848,22 @@ function getVersionFromFileContent(content, distributionName, versionFile) { const versionFileName = getFileName(versionFile); if (versionFileName == '.tool-versions') { javaVersionRegExp = - /^(java\s+)(?:\S*-)?v?(?(\d+)(\.\d+)?(\.\d+)?(\+\d+)?(-ea(\.\d+)?)?)$/m; + /^java\s+(?:\S*-)?(?\d+(?:\.\d+)*([+_.-](?:openj9[-._]?\d[\w.-]*|java\d+|jre[-_\w]*|OpenJDK\d+[\w_.-]*|[a-z0-9]+))*)/im; + } + else if (versionFileName == '.sdkmanrc') { + javaVersionRegExp = /^java\s*=\s*(?[^-]+)/m; } else { javaVersionRegExp = /(?(?<=(^|\s|-))(\d+\S*))(\s|$)/; } - const fileContent = ((_b = (_a = content.match(javaVersionRegExp)) === null || _a === void 0 ? void 0 : _a.groups) === null || _b === void 0 ? void 0 : _b.version) + const capturedVersion = ((_b = (_a = content.match(javaVersionRegExp)) === null || _a === void 0 ? void 0 : _a.groups) === null || _b === void 0 ? void 0 : _b.version) ? (_d = (_c = content.match(javaVersionRegExp)) === null || _c === void 0 ? void 0 : _c.groups) === null || _d === void 0 ? void 0 : _d.version : ''; - if (!fileContent) { + core.debug(`Parsed version '${capturedVersion}' from file '${versionFileName}'`); + if (!capturedVersion) { return null; } - core.debug(`Version from file '${fileContent}'`); - const tentativeVersion = avoidOldNotation(fileContent); + const tentativeVersion = avoidOldNotation(capturedVersion); const rawVersion = tentativeVersion.split('-')[0]; let version = semver.validRange(rawVersion) ? tentativeVersion @@ -131682,8 +132894,8 @@ function convertVersionToSemver(version) { } exports.convertVersionToSemver = convertVersionToSemver; function getGitHubHttpHeaders() { - const token = core.getInput('token'); - const auth = !token ? undefined : `token ${token}`; + const resolvedToken = core.getInput('token') || process.env.GITHUB_TOKEN; + const auth = !resolvedToken ? undefined : `token ${resolvedToken}`; const headers = { accept: 'application/vnd.github.VERSION.raw' }; diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index 4ba80b033..a82e422a6 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -31,8 +31,8 @@ Inputs `java-version` and `distribution` are mandatory and needs to be provided. ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'temurin' java-version: '21' @@ -44,8 +44,8 @@ steps: ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'adopt-hotspot' java-version: '11' @@ -56,8 +56,8 @@ steps: ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'zulu' java-version: '21' @@ -69,8 +69,8 @@ steps: ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'liberica' java-version: '21' @@ -82,8 +82,8 @@ steps: ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'microsoft' java-version: '21' @@ -97,7 +97,7 @@ steps: To get a higher rate limit, you can [generate a personal access token on github.com](https://github.com/settings/tokens/new) and pass it as the `token` input for the action: ```yaml -uses: actions/setup-java@v4 +uses: actions/setup-java@v5 with: token: ${{ secrets.GH_DOTCOM_TOKEN }} distribution: 'microsoft' @@ -111,8 +111,8 @@ If the runner is not able to access github.com, any Java versions requested duri ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'corretto' java-version: '21' @@ -124,8 +124,8 @@ steps: ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'oracle' java-version: '21' @@ -137,8 +137,8 @@ steps: ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'dragonwell' java-version: '8' @@ -149,8 +149,8 @@ steps: **NOTE:** An OpenJDK release maintained and supported by SAP ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'sapmachine' java-version: '21' @@ -162,8 +162,8 @@ steps: ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'graalvm' java-version: '21' @@ -181,8 +181,8 @@ For example, `11.0.24` is not available but `11.0.16` is. ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'jetbrains' java-version: '11' @@ -194,8 +194,8 @@ GitHub token to the action to increase the rate limit. Set the `GITHUB_TOKEN` en ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'jetbrains' java-version: '17' @@ -219,8 +219,8 @@ The available package types are: ## Installing custom Java package type ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: '' java-version: '11' @@ -232,8 +232,8 @@ steps: ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: '' java-version: '11' @@ -249,7 +249,7 @@ steps: - run: | download_url="https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.10%2B9/OpenJDK11U-jdk_x64_linux_hotspot_11.0.10_9.tar.gz" wget -O $RUNNER_TEMP/java_package.tar.gz $download_url -- uses: actions/setup-java@v4 +- uses: actions/setup-java@v5 with: distribution: 'jdkfile' jdkFile: ${{ runner.temp }}/java_package.tar.gz @@ -275,7 +275,7 @@ If your use-case requires a custom distribution (in the example, alpine-linux is latest_semver_version=$(curl -sL $latest_jdk_json_url | jq -r 'version.semver') echo "java_version=$latest_semver_version" >> "$GITHUB_OUTPUT" - - uses: actions/setup-java@v4 + - uses: actions/setup-java@v5 with: distribution: 'jdkfile' jdkFile: ${{ runner.temp }}/java_package.tar.gz @@ -296,9 +296,9 @@ jobs: java: [ '8', '11' ] name: Java ${{ matrix.Java }} (${{ matrix.distribution }}) sample steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup java - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: ${{ matrix.distribution }} java-version: ${{ matrix.java }} @@ -316,9 +316,9 @@ jobs: os: [ 'ubuntu-latest', 'macos-latest', 'windows-latest' ] name: Java ${{ matrix.Java }} (${{ matrix.os }}) sample steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup java - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' java-version: ${{ matrix.java }} @@ -333,9 +333,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up JDK 11 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: '' java-version: '11' @@ -349,7 +349,7 @@ jobs: GITHUB_TOKEN: ${{ github.token }} # GITHUB_TOKEN is the default env for the password - name: Set up Apache Maven Central - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: # running setup-java again overwrites the settings.xml distribution: 'temurin' java-version: '11' @@ -446,9 +446,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up JDK 11 for Shared Runner - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: '' java-version: '11' @@ -472,10 +472,10 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up JDK 11 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: '' java-version: '11' @@ -509,14 +509,14 @@ Subsequent calls to `setup-java` with distinct distribution and version paramete ```yaml steps: -- uses: actions/setup-java@v4 +- uses: actions/setup-java@v5 with: distribution: '' java-version: | 8 11 -- uses: actions/setup-java@v4 +- uses: actions/setup-java@v5 with: distribution: '' java-version: '15' @@ -528,7 +528,7 @@ The result is a Toolchain with entries for JDKs 8, 11 and 15. You can even combi - run: | download_url="https://example.com/java/jdk/6u45-b06/jdk-6u45-linux-x64.tar.gz" wget -O $RUNNER_TEMP/java_package.tar.gz $download_url -- uses: actions/setup-java@v4 +- uses: actions/setup-java@v5 with: distribution: 'jdkfile' jdkFile: ${{ runner.temp }}/java_package.tar.gz @@ -545,7 +545,7 @@ Each JDK provider will receive a default `vendor` using the `distribution` input - run: | download_url="https://example.com/java/jdk/6u45-b06/jdk-6u45-linux-x64.tar.gz" wget -O $RUNNER_TEMP/java_package.tar.gz $download_url -- uses: actions/setup-java@v4 +- uses: actions/setup-java@v5 with: distribution: 'jdkfile' jdkFile: ${{ runner.temp }}/java_package.tar.gz @@ -560,7 +560,7 @@ In case you install multiple versions of Java at once with multi-line `java-vers ```yaml steps: -- uses: actions/setup-java@v4 +- uses: actions/setup-java@v5 with: distribution: '' java-version: | @@ -574,8 +574,8 @@ Each JDK provider will receive a default `id` based on the combination of `distr ```yaml steps: -- uses: actions/checkout@v4 -- uses: actions/setup-java@v4 +- uses: actions/checkout@v5 +- uses: actions/setup-java@v5 with: distribution: 'temurin' java-version: '11' @@ -587,7 +587,7 @@ In case you install multiple versions of Java at once you can use the same synta ```yaml steps: -- uses: actions/setup-java@v4 +- uses: actions/setup-java@v5 with: distribution: '' java-version: | @@ -601,18 +601,37 @@ steps: ## Java version file If the `java-version-file` input is specified, the action will extract the version from the file and install it. - Supported files are .java-version and .tool-versions. - In .java-version file, only the version should be specified (e.g., 17.0.7). - In .tool-versions file, java version should be preceded by the java keyword (e.g., java 17.0.7). - The `.java-version` file recognizes all variants of the version description according to [jenv](https://github.com/jenv/jenv). Similarly, the `.tool-versions` file supports version specifications in accordance with [asdf](https://github.com/asdf-vm/asdf) standards, adhering to Semantic Versioning ([semver](https://semver.org/)). - - If both java-version and java-version-file inputs are provided, the java-version input will be used. + Supported files are `.java-version`, `.tool-versions` and `.sdkmanrc`. + * In `.java-version` file, only the version should be specified (e.g., 17.0.7). The `.java-version` file recognizes all variants of the version description according to [jenv](https://github.com/jenv/jenv). + * In `.tool-versions` file, java version should be preceded by the java keyword (e.g., java 17.0.7). The `.tool-versions` file supports version specifications in accordance with [asdf](https://github.com/asdf-vm/asdf) standards, adhering to Semantic Versioning ([semver](https://semver.org/)). + * In `.sdkmanrc` file, java version should be preceded by the `java=` prefix (e.g., java=17.0.7-tem) and include the distribution. The `.sdkmanrc` file supports version specifications in accordance with [file format](https://sdkman.io/usage#env-command), see [Sdkman! documentation](https://sdkman.io/jdks) for more information. + + + If both `java-version` and `java-version-file` **inputs** are provided, the `java-version` input will be used. + +**Example step using `Sdkman!`**: +```yml + - name: Setup java + uses: actions/setup-java@v5 + with: + java-version-file: '.sdkmanrc' + distribution: 'temurin' +``` -Valid entry options: +**Example `.sdkmanrc`**: +``` +java=17.0.7-tem +``` + +Valid entry options (does not apply to `.sdkmanrc`): ``` major versions: 8, 11, 16, 17, 21 more specific versions: 8.0.282+8, 8.0.232, 11.0, 11.0.4, 17.0 early access (EA) versions: 15-ea, 15.0.0-ea versions with specified distribution: openjdk64-11.0.2 +LTS versions : temurin-21.0.5+11.0.LTS ``` If the file contains multiple versions, only the first one will be recognized. + +***NOTE***: +For the tool-version file, ensure that you use standard semantic versioning (semver) formats, as non-standard formats (such as jetbrains-21b212.1) may not be parsed correctly. Additionally, for complex version strings containing multiple version-like segments (for example, java semeru-openj9-11.0.15+10_openj9-0.32.0), the extraction logic may incorrectly capture the last segment (0.32.0) instead of the main version (11.0.15+10). diff --git a/docs/contributors.md b/docs/contributors.md index 7196d482e..0d49925a0 100644 --- a/docs/contributors.md +++ b/docs/contributors.md @@ -68,7 +68,7 @@ Pull requests are the easiest way to contribute changes to git repos at GitHub. Adding or changing tests is an integral part of making a change to the code. Unit tests are in the `__tests__` folder, and end-to-end tests are in the `workflows` folder, particularly take a look at the files with `e2e` prefix, for instance, [e2e-cache.yml](https://github.com/actions/setup-java/blob/main/.github/workflows/e2e-cache.yml). -- The contributor can add various types of tests (like unit tests or end-to-end tests), which, in his opinion, will be necessary and sufficient for testing new or changed functionality +- The contributor can add various types of tests (like unit tests or end-to-end tests), which, in their opinion, will be necessary and sufficient for testing new or changed functionality - Tests should cover a successful execution, as well as some edge cases and possible errors - As already mentioned, pull requests without tests will be considered more carefully by maintainers. If you are sure that in this situation the tests are not needed or cannot be implemented with a commensurate effort - please add this clarification message to your pull request @@ -76,7 +76,7 @@ Unit tests are in the `__tests__` folder, and end-to-end tests are in the `workf - CI will start automatically with some checks. Wait until the end of the execution and make sure that all checks passed successfully. If some checks fail, you can open them one by one, try to find the reason for failing and make changes to your code to resolve the problem - Maintainers will review your pull request -- If a maintainer requests changes, first of all, try to think about his request critically and only after that implement and request another review +- If a maintainer requests changes, first of all, try to think about their request critically and only after that implement and request another review - If your PR gets accepted, it will soon be merged into the main branch. But your contribution will take effect only after the release of a new version of the action and updating the major tag > Sometimes maintainers reject pull requests and that's ok! Usually, along with rejection, we supply the reason for it. Nonetheless, we still really appreciate you taking the time to do it, and we don't take that lightly :heart: diff --git a/package-lock.json b/package-lock.json index eaea09f1c..6fa75e48a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "setup-java", - "version": "4.0.0", + "version": "5.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "setup-java", - "version": "4.0.0", + "version": "5.0.0", "license": "MIT", "dependencies": { "@actions/cache": "^4.0.3", @@ -21,20 +21,23 @@ }, "devDependencies": { "@types/jest": "^29.5.14", - "@types/node": "^20.11.24", + "@types/node": "^24.1.0", "@types/semver": "^7.5.8", - "@typescript-eslint/eslint-plugin": "^5.54.0", - "@typescript-eslint/parser": "^5.54.0", + "@typescript-eslint/eslint-plugin": "^8.35.1", + "@typescript-eslint/parser": "^8.35.1", "@vercel/ncc": "^0.38.1", "eslint": "^8.57.0", "eslint-config-prettier": "^8.6.0", - "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jest": "^29.0.1", "eslint-plugin-node": "^11.1.0", "jest": "^29.7.0", "jest-circus": "^29.7.0", - "prettier": "^2.8.4", + "prettier": "^3.6.2", "ts-jest": "^29.3.0", "typescript": "^5.3.3" + }, + "engines": { + "node": ">=24.0.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -206,12 +209,14 @@ } }, "node_modules/@azure/core-http/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -361,6 +366,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", "dev": true, + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", @@ -835,16 +841,19 @@ "dev": true }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } @@ -1638,18 +1647,13 @@ "pretty-format": "^29.0.0" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, "node_modules/@types/node": { - "version": "20.11.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", - "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz", + "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==", + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~7.8.0" } }, "node_modules/@types/node-fetch": { @@ -1662,12 +1666,14 @@ } }, "node_modules/@types/node-fetch/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -1710,117 +1716,154 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.43.0.tgz", + "integrity": "sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.43.0", + "@typescript-eslint/type-utils": "8.43.0", + "@typescript-eslint/utils": "8.43.0", + "@typescript-eslint/visitor-keys": "8.43.0", "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@typescript-eslint/parser": "^8.43.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "engines": { + "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.43.0.tgz", + "integrity": "sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/scope-manager": "8.43.0", + "@typescript-eslint/types": "8.43.0", + "@typescript-eslint/typescript-estree": "8.43.0", + "@typescript-eslint/visitor-keys": "8.43.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.43.0.tgz", + "integrity": "sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==", + "dev": true, + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.43.0", + "@typescript-eslint/types": "^8.43.0", + "debug": "^4.3.4" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.43.0.tgz", + "integrity": "sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "@typescript-eslint/types": "8.43.0", + "@typescript-eslint/visitor-keys": "8.43.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.43.0.tgz", + "integrity": "sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.43.0.tgz", + "integrity": "sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", + "@typescript-eslint/types": "8.43.0", + "@typescript-eslint/typescript-estree": "8.43.0", + "@typescript-eslint/utils": "8.43.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.43.0.tgz", + "integrity": "sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1828,75 +1871,109 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.43.0.tgz", + "integrity": "sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", + "@typescript-eslint/project-service": "8.43.0", + "@typescript-eslint/tsconfig-utils": "8.43.0", + "@typescript-eslint/types": "8.43.0", + "@typescript-eslint/visitor-keys": "8.43.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.43.0.tgz", + "integrity": "sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.43.0", + "@typescript-eslint/types": "8.43.0", + "@typescript-eslint/typescript-estree": "8.43.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.43.0.tgz", + "integrity": "sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "8.43.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -1928,6 +2005,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2030,15 +2108,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -2173,9 +2242,9 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2212,6 +2281,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001541", "electron-to-chromium": "^1.4.535", @@ -2252,6 +2322,18 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2514,18 +2596,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -2538,6 +2608,19 @@ "node": ">=6.0.0" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", @@ -2587,6 +2670,47 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -2613,6 +2737,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -2695,19 +2820,19 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "27.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", - "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", + "version": "29.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.0.1.tgz", + "integrity": "sha512-EE44T0OSMCeXhDrrdsbKAhprobKkPtJTbQz5yEktysNpHeDZTAL1SfDTNKmcFfJkY6yrQLtTKZALrD3j/Gpmiw==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "^5.10.0" + "@typescript-eslint/utils": "^8.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^20.12.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", - "eslint": "^7.0.0 || ^8.0.0", + "@typescript-eslint/eslint-plugin": "^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "jest": "*" }, "peerDependenciesMeta": { @@ -2748,19 +2873,6 @@ "semver": "bin/semver.js" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", @@ -2893,15 +3005,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -2982,16 +3085,16 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -3062,11 +3165,10 @@ } }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -3133,13 +3235,16 @@ "dev": true }, "node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", + "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35", + "safe-buffer": "^5.2.1" }, "engines": { "node": ">= 0.12" @@ -3169,7 +3274,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3192,6 +3296,29 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -3201,6 +3328,18 @@ "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -3260,24 +3399,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { @@ -3301,11 +3431,35 @@ "node": ">=8" } }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -3580,6 +3734,7 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, + "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -4309,6 +4464,14 @@ "tmpl": "1.0.5" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4389,12 +4552,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -4609,15 +4766,6 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -4719,15 +4867,16 @@ } }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, + "license": "MIT", "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -4956,6 +5105,25 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/sax": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", @@ -5191,6 +5359,18 @@ "node": ">=8.0" } }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-jest": { "version": "29.3.0", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.3.0.tgz", @@ -5259,27 +5439,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/tunnel": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", @@ -5326,6 +5485,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -5335,10 +5495,9 @@ } }, "node_modules/undici": { - "version": "5.28.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.5.tgz", - "integrity": "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==", - "license": "MIT", + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -5347,9 +5506,10 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "license": "MIT" }, "node_modules/update-browserslist-db": { "version": "1.0.13", diff --git a/package.json b/package.json index db57615e5..21a307695 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,12 @@ { "name": "setup-java", - "version": "4.0.0", + "version": "5.0.0", "private": true, "description": "setup java action", "main": "dist/setup/index.js", + "engines": { + "node": ">=24.0.0" + }, "scripts": { "build": "ncc build -o dist/setup src/setup-java.ts && ncc build -o dist/cleanup src/cleanup-java.ts", "format": "prettier --no-error-on-unmatched-pattern --config ./.prettierrc.js --write \"**/*.{ts,yml,yaml}\"", @@ -38,18 +41,18 @@ }, "devDependencies": { "@types/jest": "^29.5.14", - "@types/node": "^20.11.24", + "@types/node": "^24.1.0", "@types/semver": "^7.5.8", - "@typescript-eslint/eslint-plugin": "^5.54.0", - "@typescript-eslint/parser": "^5.54.0", + "@typescript-eslint/eslint-plugin": "^8.35.1", + "@typescript-eslint/parser": "^8.35.1", "@vercel/ncc": "^0.38.1", "eslint": "^8.57.0", "eslint-config-prettier": "^8.6.0", - "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-jest": "^29.0.1", "eslint-plugin-node": "^11.1.0", "jest": "^29.7.0", "jest-circus": "^29.7.0", - "prettier": "^2.8.4", + "prettier": "^3.6.2", "ts-jest": "^29.3.0", "typescript": "^5.3.3" }, @@ -57,4 +60,4 @@ "url": "https://github.com/actions/setup-java/issues" }, "homepage": "https://github.com/actions/setup-java#readme" -} +} \ No newline at end of file diff --git a/src/distributions/base-installer.ts b/src/distributions/base-installer.ts index 258ac9f4c..03b4759d3 100644 --- a/src/distributions/base-installer.ts +++ b/src/distributions/base-installer.ts @@ -51,17 +51,115 @@ export abstract class JavaBase { core.info(`Resolved Java ${foundJava.version} from tool-cache`); } else { core.info('Trying to resolve the latest version from remote'); - const javaRelease = await this.findPackageForDownload(this.version); - core.info(`Resolved latest version as ${javaRelease.version}`); - if (foundJava?.version === javaRelease.version) { - core.info(`Resolved Java ${foundJava.version} from tool-cache`); - } else { - core.info('Trying to download...'); - foundJava = await this.downloadTool(javaRelease); - core.info(`Java ${foundJava.version} was downloaded`); + const MAX_RETRIES = 4; + const RETRY_DELAY_MS = 2000; + const retryableCodes = [ + 'ETIMEDOUT', + 'ECONNRESET', + 'ENOTFOUND', + 'ECONNREFUSED' + ]; + let retries = MAX_RETRIES; + while (retries > 0) { + try { + // Clear console timers before each attempt to prevent conflicts + if (retries < MAX_RETRIES && core.isDebug()) { + const consoleAny = console as any; + consoleAny._times?.clear?.(); + } + const javaRelease = await this.findPackageForDownload(this.version); + core.info(`Resolved latest version as ${javaRelease.version}`); + if (foundJava?.version === javaRelease.version) { + core.info(`Resolved Java ${foundJava.version} from tool-cache`); + } else { + core.info('Trying to download...'); + foundJava = await this.downloadTool(javaRelease); + core.info(`Java ${foundJava.version} was downloaded`); + } + break; + } catch (error: any) { + retries--; + // Check if error is retryable (including aggregate errors) + const isRetryable = + (error instanceof tc.HTTPError && + error.httpStatusCode && + [429, 502, 503, 504].includes(error.httpStatusCode)) || + retryableCodes.includes(error?.code) || + (error?.errors && + Array.isArray(error.errors) && + error.errors.some((err: any) => + retryableCodes.includes(err?.code) + )); + if (retries > 0 && isRetryable) { + core.debug( + `Attempt failed due to network or timeout issues, initiating retry... (${retries} attempts left)` + ); + await new Promise(r => setTimeout(r, RETRY_DELAY_MS)); + continue; + } + if (error instanceof tc.HTTPError) { + if (error.httpStatusCode === 403) { + core.error('HTTP 403: Permission denied or access restricted.'); + } else if (error.httpStatusCode === 429) { + core.warning( + 'HTTP 429: Rate limit exceeded. Please retry later.' + ); + } else { + core.error(`HTTP ${error.httpStatusCode}: ${error.message}`); + } + } else if (error && error.errors && Array.isArray(error.errors)) { + core.error( + `Java setup failed due to network or configuration error(s)` + ); + if (error instanceof Error && error.stack) { + core.debug(error.stack); + } + for (const err of error.errors) { + const endpoint = err?.address || err?.hostname || ''; + const port = err?.port ? `:${err.port}` : ''; + const message = err?.message || 'Aggregate error'; + const endpointInfo = !message.includes(endpoint) + ? ` ${endpoint}${port}` + : ''; + const localInfo = + err.localAddress && err.localPort + ? ` - Local (${err.localAddress}:${err.localPort})` + : ''; + const logMessage = `${message}${endpointInfo}${localInfo}`; + core.error(logMessage); + core.debug(`${err.stack || err.message}`); + Object.entries(err).forEach(([key, value]) => { + core.debug(`"${key}": ${JSON.stringify(value)}`); + }); + } + } else { + const message = + error instanceof Error ? error.message : JSON.stringify(error); + core.error(`Java setup process failed due to: ${message}`); + if (typeof error?.code === 'string') { + core.debug(error.stack); + } + const errorDetails = { + name: error.name, + message: error.message, + ...Object.getOwnPropertyNames(error) + .filter(prop => !['name', 'message', 'stack'].includes(prop)) + .reduce<{[key: string]: any}>((acc, prop) => { + acc[prop] = error[prop]; + return acc; + }, {}) + }; + Object.entries(errorDetails).forEach(([key, value]) => { + core.debug(`"${key}": ${JSON.stringify(value)}`); + }); + } + throw error; + } } } - + if (!foundJava) { + throw new Error('Failed to resolve Java version'); + } // JDK folder may contain postfix "Contents/Home" on macOS const macOSPostfixPath = path.join( foundJava.path, diff --git a/src/distributions/graalvm/installer.ts b/src/distributions/graalvm/installer.ts index be14cee99..6df960c73 100644 --- a/src/distributions/graalvm/installer.ts +++ b/src/distributions/graalvm/installer.ts @@ -1,10 +1,10 @@ import * as core from '@actions/core'; import * as tc from '@actions/tool-cache'; - import fs from 'fs'; import path from 'path'; - import {JavaBase} from '../base-installer'; +import {HttpCodes} from '@actions/http-client'; +import {GraalVMEAVersion} from './models'; import { JavaDownloadRelease, JavaInstallerOptions, @@ -16,12 +16,14 @@ import { getGitHubHttpHeaders, renameWinArchive } from '../../util'; -import {HttpCodes} from '@actions/http-client'; -import {GraalVMEAVersion} from './models'; const GRAALVM_DL_BASE = 'https://download.oracle.com/graalvm'; const IS_WINDOWS = process.platform === 'win32'; const GRAALVM_PLATFORM = IS_WINDOWS ? 'windows' : process.platform; +const GRAALVM_MIN_VERSION = 17; +const SUPPORTED_ARCHITECTURES = ['x64', 'aarch64'] as const; +type SupportedArchitecture = (typeof SUPPORTED_ARCHITECTURES)[number]; +type OsVersions = 'linux' | 'macos' | 'windows'; export class GraalVMDistribution extends JavaBase { constructor(installerOptions: JavaInstallerOptions) { @@ -31,38 +33,67 @@ export class GraalVMDistribution extends JavaBase { protected async downloadTool( javaRelease: JavaDownloadRelease ): Promise { - core.info( - `Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...` - ); - let javaArchivePath = await tc.downloadTool(javaRelease.url); + try { + core.info( + `Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...` + ); + let javaArchivePath = await tc.downloadTool(javaRelease.url); - core.info(`Extracting Java archive...`); - const extension = getDownloadArchiveExtension(); - if (process.platform === 'win32') { - javaArchivePath = renameWinArchive(javaArchivePath); - } - const extractedJavaPath = await extractJdkFile(javaArchivePath, extension); + core.info(`Extracting Java archive...`); + const extension = getDownloadArchiveExtension(); + if (IS_WINDOWS) { + javaArchivePath = renameWinArchive(javaArchivePath); + } - const archiveName = fs.readdirSync(extractedJavaPath)[0]; - const archivePath = path.join(extractedJavaPath, archiveName); - const version = this.getToolcacheVersionName(javaRelease.version); + const extractedJavaPath = await extractJdkFile( + javaArchivePath, + extension + ); - const javaPath = await tc.cacheDir( - archivePath, - this.toolcacheFolderName, - version, - this.architecture - ); + // Add validation for extracted path + if (!fs.existsSync(extractedJavaPath)) { + throw new Error( + `Extraction failed: path ${extractedJavaPath} does not exist` + ); + } + + const dirContents = fs.readdirSync(extractedJavaPath); + if (dirContents.length === 0) { + throw new Error( + 'Extraction failed: no files found in extracted directory' + ); + } + + const archivePath = path.join(extractedJavaPath, dirContents[0]); + const version = this.getToolcacheVersionName(javaRelease.version); - return {version: javaRelease.version, path: javaPath}; + const javaPath = await tc.cacheDir( + archivePath, + this.toolcacheFolderName, + version, + this.architecture + ); + + return {version: javaRelease.version, path: javaPath}; + } catch (error) { + core.error(`Failed to download and extract GraalVM: ${error}`); + throw error; + } } protected async findPackageForDownload( range: string ): Promise { + // Add input validation + if (!range || typeof range !== 'string') { + throw new Error('Version range is required and must be a string'); + } + const arch = this.distributionArchitecture(); - if (arch !== 'x64' && arch !== 'aarch64') { - throw new Error(`Unsupported architecture: ${this.architecture}`); + if (!SUPPORTED_ARCHITECTURES.includes(arch as SupportedArchitecture)) { + throw new Error( + `Unsupported architecture: ${this.architecture}. Supported architectures are: ${SUPPORTED_ARCHITECTURES.join(', ')}` + ); } if (!this.stable) { @@ -75,52 +106,113 @@ export class GraalVMDistribution extends JavaBase { const platform = this.getPlatform(); const extension = getDownloadArchiveExtension(); - let major; - let fileUrl; - if (range.includes('.')) { - major = range.split('.')[0]; - fileUrl = `${GRAALVM_DL_BASE}/${major}/archive/graalvm-jdk-${range}_${platform}-${arch}_bin.${extension}`; - } else { - major = range; - fileUrl = `${GRAALVM_DL_BASE}/${range}/latest/graalvm-jdk-${range}_${platform}-${arch}_bin.${extension}`; + const major = range.includes('.') ? range.split('.')[0] : range; + const majorVersion = parseInt(major); + + if (isNaN(majorVersion)) { + throw new Error(`Invalid version format: ${range}`); } - if (parseInt(major) < 17) { - throw new Error('GraalVM is only supported for JDK 17 and later'); + if (majorVersion < GRAALVM_MIN_VERSION) { + throw new Error( + `GraalVM is only supported for JDK ${GRAALVM_MIN_VERSION} and later. Requested version: ${major}` + ); } + const fileUrl = this.constructFileUrl( + range, + major, + platform, + arch, + extension + ); + const response = await this.http.head(fileUrl); + this.handleHttpResponse(response, range); + + return {url: fileUrl, version: range}; + } - if (response.message.statusCode === HttpCodes.NotFound) { - throw new Error(`Could not find GraalVM for SemVer ${range}`); + private constructFileUrl( + range: string, + major: string, + platform: string, + arch: string, + extension: string + ): string { + return range.includes('.') + ? `${GRAALVM_DL_BASE}/${major}/archive/graalvm-jdk-${range}_${platform}-${arch}_bin.${extension}` + : `${GRAALVM_DL_BASE}/${range}/latest/graalvm-jdk-${range}_${platform}-${arch}_bin.${extension}`; + } + + private handleHttpResponse(response: any, range: string): void { + const statusCode = response.message.statusCode; + + if (statusCode === HttpCodes.NotFound) { + throw new Error( + `Could not find GraalVM for SemVer ${range}. Please check if this version is available at ${GRAALVM_DL_BASE}` + ); } - if (response.message.statusCode !== HttpCodes.OK) { + if ( + statusCode === HttpCodes.Unauthorized || + statusCode === HttpCodes.Forbidden + ) { throw new Error( - `Http request for GraalVM failed with status code: ${response.message.statusCode}` + `Access denied when downloading GraalVM. Status code: ${statusCode}. Please check your credentials or permissions.` ); } - return {url: fileUrl, version: range}; + if (statusCode !== HttpCodes.OK) { + throw new Error( + `HTTP request for GraalVM failed with status code: ${statusCode} (${response.message.statusMessage || 'Unknown error'})` + ); + } } private async findEABuildDownloadUrl( javaEaVersion: string ): Promise { + core.debug(`Searching for EA build: ${javaEaVersion}`); + const versions = await this.fetchEAJson(javaEaVersion); + core.debug(`Found ${versions.length} EA versions`); + const latestVersion = versions.find(v => v.latest); if (!latestVersion) { + core.error( + `Available versions: ${versions.map(v => v.version).join(', ')}` + ); throw new Error(`Unable to find latest version for '${javaEaVersion}'`); } + + core.debug(`Latest version found: ${latestVersion.version}`); + const arch = this.distributionArchitecture(); const file = latestVersion.files.find( f => f.arch === arch && f.platform === GRAALVM_PLATFORM ); - if (!file || !file.filename.startsWith('graalvm-jdk-')) { - throw new Error(`Unable to find file metadata for '${javaEaVersion}'`); + + if (!file) { + core.error( + `Available files for architecture ${arch}: ${JSON.stringify(latestVersion.files)}` + ); + throw new Error( + `Unable to find file for architecture '${arch}' and platform '${GRAALVM_PLATFORM}'` + ); } + + if (!file.filename.startsWith('graalvm-jdk-')) { + throw new Error( + `Invalid filename format: ${file.filename}. Expected to start with 'graalvm-jdk-'` + ); + } + + const downloadUrl = `${latestVersion.download_base_url}${file.filename}`; + core.debug(`Download URL: ${downloadUrl}`); + return { - url: `${latestVersion.download_base_url}${file.filename}`, + url: downloadUrl, version: latestVersion.version }; } @@ -128,49 +220,59 @@ export class GraalVMDistribution extends JavaBase { private async fetchEAJson( javaEaVersion: string ): Promise { - const owner = 'graalvm'; - const repository = 'oracle-graalvm-ea-builds'; - const branch = 'main'; - const filePath = `versions/${javaEaVersion}.json`; - - const url = `https://api.github.com/repos/${owner}/${repository}/contents/${filePath}?ref=${branch}`; - + const url = `https://api.github.com/repos/graalvm/oracle-graalvm-ea-builds/contents/versions/${javaEaVersion}.json?ref=main`; const headers = getGitHubHttpHeaders(); core.debug( `Trying to fetch available version info for GraalVM EA builds from '${url}'` ); - let fetchedJson; + try { - fetchedJson = (await this.http.getJson(url, headers)) - .result; - } catch (err) { - throw Error( - `Fetching version info for GraalVM EA builds from '${url}' failed with the error: ${ - (err as Error).message - }` + const response = await this.http.getJson( + url, + headers ); - } - if (fetchedJson === null) { - throw Error( - `No GraalVM EA build found. Are you sure java-version: '${javaEaVersion}' is correct?` + + if (!response.result) { + throw new Error( + `No GraalVM EA build found for version '${javaEaVersion}'. Please check if the version is correct.` + ); + } + + return response.result; + } catch (error) { + if (error instanceof Error) { + // Check if it's a 404 error (file not found) + if (error.message?.includes('404')) { + throw new Error( + `GraalVM EA version '${javaEaVersion}' not found. Please verify the version exists in the EA builds repository.` + ); + } + // Re-throw with more context + throw new Error( + `Failed to fetch GraalVM EA version information for '${javaEaVersion}': ${error.message}` + ); + } + // If it's not an Error instance, throw a generic error + throw new Error( + `Failed to fetch GraalVM EA version information for '${javaEaVersion}'` ); } - return fetchedJson; } public getPlatform(platform: NodeJS.Platform = process.platform): OsVersions { - switch (platform) { - case 'darwin': - return 'macos'; - case 'win32': - return 'windows'; - case 'linux': - return 'linux'; - default: - throw new Error( - `Platform '${platform}' is not supported. Supported platforms: 'linux', 'macos', 'windows'` - ); + const platformMap: Record = { + darwin: 'macos', + win32: 'windows', + linux: 'linux' + }; + + const result = platformMap[platform]; + if (!result) { + throw new Error( + `Platform '${platform}' is not supported. Supported platforms: 'linux', 'macos', 'windows'` + ); } + return result; } } diff --git a/src/distributions/jetbrains/installer.ts b/src/distributions/jetbrains/installer.ts index ed0b49fe0..b9e9b30bb 100644 --- a/src/distributions/jetbrains/installer.ts +++ b/src/distributions/jetbrains/installer.ts @@ -113,9 +113,18 @@ export class JetBrainsDistribution extends JavaBase { core.debug(`Gathering available versions from '${rawUrl}'`); } - const paginationPage = ( + const paginationPageResult = ( await this.http.getJson(rawUrl, requestHeaders) ).result; + if (!paginationPageResult || paginationPageResult.length === 0) { + // break infinity loop because we have reached end of pagination + break; + } + + const paginationPage: IJetBrainsRawVersion[] = + paginationPageResult.filter(version => + this.stable ? !version.prerelease : version.prerelease + ); if (!paginationPage || paginationPage.length === 0) { // break infinity loop because we have reached end of pagination break; @@ -125,9 +134,13 @@ export class JetBrainsDistribution extends JavaBase { page_index++; } - // Add versions not available from the API but are downloadable - const hidden = ['11_0_10b1145.115', '11_0_11b1341.60']; - rawVersions.push(...hidden.map(tag => ({tag_name: tag, name: tag}))); + if (this.stable) { + // Add versions not available from the API but are downloadable + const hidden = ['11_0_10b1145.115', '11_0_11b1341.60']; + rawVersions.push( + ...hidden.map(tag => ({tag_name: tag, name: tag, prerelease: false})) + ); + } const versions0 = rawVersions.map(async v => { // Release tags look like one of these: @@ -148,7 +161,7 @@ export class JetBrainsDistribution extends JavaBase { const vsplit = vstring.split('b'); let semver = vsplit[0]; - const build = +vsplit[1]; + const build = vsplit[1]; // Normalize semver if (!semver.includes('.') && !semver.includes('_')) diff --git a/src/distributions/jetbrains/models.ts b/src/distributions/jetbrains/models.ts index 7daaea06f..bad2ec68b 100644 --- a/src/distributions/jetbrains/models.ts +++ b/src/distributions/jetbrains/models.ts @@ -3,11 +3,12 @@ export interface IJetBrainsRawVersion { tag_name: string; name: string; + prerelease: boolean; } export interface IJetBrainsVersion { tag_name: string; semver: string; - build: number; + build: string; url: string; } diff --git a/src/distributions/microsoft/installer.ts b/src/distributions/microsoft/installer.ts index 63c5b0d24..0d80c3f98 100644 --- a/src/distributions/microsoft/installer.ts +++ b/src/distributions/microsoft/installer.ts @@ -116,7 +116,7 @@ export class MicrosoftDistributions extends JavaBase { } } catch (err) { core.debug( - `Http request for microsoft-openjdk-versions.json failed with status code: ${response?.statusCode}` + `Http request for microsoft-openjdk-versions.json failed with status code: ${response?.statusCode}. Error: ${err}` ); return null; } diff --git a/src/distributions/microsoft/microsoft-openjdk-versions.json b/src/distributions/microsoft/microsoft-openjdk-versions.json index 4fd1e974f..5c11c026b 100644 --- a/src/distributions/microsoft/microsoft-openjdk-versions.json +++ b/src/distributions/microsoft/microsoft-openjdk-versions.json @@ -1,90 +1,133 @@ [ { - "version": "21.0.2", - "stable": true, - "release_url": "https://aka.ms/download-jdk", - "files": [ - { - "filename": "microsoft-jdk-21.0.2-macos-x64.tar.gz", - "arch": "x64", - "platform": "darwin", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.2-macos-x64.tar.gz" - }, - { - "filename": "microsoft-jdk-21.0.2-linux-x64.tar.gz", - "arch": "x64", - "platform": "linux", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.2-linux-x64.tar.gz" - }, - { - "filename": "microsoft-jdk-21.0.2-windows-x64.zip", - "arch": "x64", - "platform": "win32", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.2-windows-x64.zip" - }, - { - "filename": "microsoft-jdk-21.0.2-macos-aarch64.tar.gz", - "arch": "aarch64", - "platform": "darwin", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.2-macos-aarch64.tar.gz" - }, - { - "filename": "microsoft-jdk-21.0.2-linux-aarch64.tar.gz", - "arch": "aarch64", - "platform": "linux", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.2-linux-aarch64.tar.gz" - }, - { - "filename": "microsoft-jdk-21.0.2-windows-aarch64.zip", - "arch": "aarch64", - "platform": "win32", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.2-windows-aarch64.zip" - } - ] -}, + "version": "25.0.0", + "stable": true, + "release_url": "https://aka.ms/download-jdk", + "files": [ + { + "filename": "microsoft-jdk-25.0.0-macos-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-macos-x64.tar.gz" + }, + { + "filename": "microsoft-jdk-25.0.0-linux-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-linux-x64.tar.gz" + }, + { + "filename": "microsoft-jdk-25.0.0-windows-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-windows-x64.zip" + }, + { + "filename": "microsoft-jdk-25.0.0-macos-aarch64.tar.gz", + "arch": "aarch64", + "platform": "darwin", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-macos-aarch64.tar.gz" + }, + { + "filename": "microsoft-jdk-25.0.0-linux-aarch64.tar.gz", + "arch": "aarch64", + "platform": "linux", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-linux-aarch64.tar.gz" + }, + { + "filename": "microsoft-jdk-25.0.0-windows-aarch64.zip", + "arch": "aarch64", + "platform": "win32", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-25.0.0-windows-aarch64.zip" + } + ] + }, + { + "version": "21.0.2", + "stable": true, + "release_url": "https://aka.ms/download-jdk", + "files": [ + { + "filename": "microsoft-jdk-21.0.2-macos-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.2-macos-x64.tar.gz" + }, + { + "filename": "microsoft-jdk-21.0.2-linux-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.2-linux-x64.tar.gz" + }, + { + "filename": "microsoft-jdk-21.0.2-windows-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.2-windows-x64.zip" + }, + { + "filename": "microsoft-jdk-21.0.2-macos-aarch64.tar.gz", + "arch": "aarch64", + "platform": "darwin", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.2-macos-aarch64.tar.gz" + }, + { + "filename": "microsoft-jdk-21.0.2-linux-aarch64.tar.gz", + "arch": "aarch64", + "platform": "linux", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.2-linux-aarch64.tar.gz" + }, + { + "filename": "microsoft-jdk-21.0.2-windows-aarch64.zip", + "arch": "aarch64", + "platform": "win32", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.2-windows-aarch64.zip" + } + ] + }, { - "version": "21.0.1", - "stable": true, - "release_url": "https://aka.ms/download-jdk", - "files": [ - { - "filename": "microsoft-jdk-21.0.1-macos-x64.tar.gz", - "arch": "x64", - "platform": "darwin", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.1-macos-x64.tar.gz" - }, - { - "filename": "microsoft-jdk-21.0.1-linux-x64.tar.gz", - "arch": "x64", - "platform": "linux", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.1-linux-x64.tar.gz" - }, - { - "filename": "microsoft-jdk-21.0.1-windows-x64.zip", - "arch": "x64", - "platform": "win32", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.1-windows-x64.zip" - }, - { - "filename": "microsoft-jdk-21.0.1-macos-aarch64.tar.gz", - "arch": "aarch64", - "platform": "darwin", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.1-macos-aarch64.tar.gz" - }, - { - "filename": "microsoft-jdk-21.0.1-linux-aarch64.tar.gz", - "arch": "aarch64", - "platform": "linux", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.1-linux-aarch64.tar.gz" - }, - { - "filename": "microsoft-jdk-21.0.1-windows-aarch64.zip", - "arch": "aarch64", - "platform": "win32", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.1-windows-aarch64.zip" - } - ] -}, + "version": "21.0.1", + "stable": true, + "release_url": "https://aka.ms/download-jdk", + "files": [ + { + "filename": "microsoft-jdk-21.0.1-macos-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.1-macos-x64.tar.gz" + }, + { + "filename": "microsoft-jdk-21.0.1-linux-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.1-linux-x64.tar.gz" + }, + { + "filename": "microsoft-jdk-21.0.1-windows-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.1-windows-x64.zip" + }, + { + "filename": "microsoft-jdk-21.0.1-macos-aarch64.tar.gz", + "arch": "aarch64", + "platform": "darwin", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.1-macos-aarch64.tar.gz" + }, + { + "filename": "microsoft-jdk-21.0.1-linux-aarch64.tar.gz", + "arch": "aarch64", + "platform": "linux", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.1-linux-aarch64.tar.gz" + }, + { + "filename": "microsoft-jdk-21.0.1-windows-aarch64.zip", + "arch": "aarch64", + "platform": "win32", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-21.0.1-windows-aarch64.zip" + } + ] + }, { "version": "21.0.0", "stable": true, @@ -176,42 +219,42 @@ "stable": true, "release_url": "https://aka.ms/download-jdk", "files": [ - { - "filename": "microsoft-jdk-17.0.9-macos-x64.tar.gz", - "arch": "x64", - "platform": "darwin", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-17.0.9-macos-x64.tar.gz" - }, - { - "filename": "microsoft-jdk-17.0.9-linux-x64.tar.gz", - "arch": "x64", - "platform": "linux", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-17.0.9-linux-x64.tar.gz" - }, - { - "filename": "microsoft-jdk-17.0.9-windows-x64.zip", - "arch": "x64", - "platform": "win32", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-17.0.9-windows-x64.zip" - }, - { - "filename": "microsoft-jdk-17.0.9-macos-aarch64.tar.gz", - "arch": "aarch64", - "platform": "darwin", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-17.0.9-macos-aarch64.tar.gz" - }, - { - "filename": "microsoft-jdk-17.0.9-linux-aarch64.tar.gz", - "arch": "aarch64", - "platform": "linux", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-17.0.9-linux-aarch64.tar.gz" - }, - { - "filename": "microsoft-jdk-17.0.9-windows-aarch64.zip", - "arch": "aarch64", - "platform": "win32", - "download_url": "https://aka.ms/download-jdk/microsoft-jdk-17.0.9-windows-aarch64.zip" - } + { + "filename": "microsoft-jdk-17.0.9-macos-x64.tar.gz", + "arch": "x64", + "platform": "darwin", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-17.0.9-macos-x64.tar.gz" + }, + { + "filename": "microsoft-jdk-17.0.9-linux-x64.tar.gz", + "arch": "x64", + "platform": "linux", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-17.0.9-linux-x64.tar.gz" + }, + { + "filename": "microsoft-jdk-17.0.9-windows-x64.zip", + "arch": "x64", + "platform": "win32", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-17.0.9-windows-x64.zip" + }, + { + "filename": "microsoft-jdk-17.0.9-macos-aarch64.tar.gz", + "arch": "aarch64", + "platform": "darwin", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-17.0.9-macos-aarch64.tar.gz" + }, + { + "filename": "microsoft-jdk-17.0.9-linux-aarch64.tar.gz", + "arch": "aarch64", + "platform": "linux", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-17.0.9-linux-aarch64.tar.gz" + }, + { + "filename": "microsoft-jdk-17.0.9-windows-aarch64.zip", + "arch": "aarch64", + "platform": "win32", + "download_url": "https://aka.ms/download-jdk/microsoft-jdk-17.0.9-windows-aarch64.zip" + } ] }, { @@ -835,4 +878,4 @@ } ] } -] +] \ No newline at end of file diff --git a/src/distributions/sapmachine/installer.ts b/src/distributions/sapmachine/installer.ts index dfe32e161..ab67dec34 100644 --- a/src/distributions/sapmachine/installer.ts +++ b/src/distributions/sapmachine/installer.ts @@ -8,7 +8,6 @@ import { convertVersionToSemver, extractJdkFile, getDownloadArchiveExtension, - getGitHubHttpHeaders, isVersionSatisfies, renameWinArchive } from '../../util'; @@ -64,13 +63,12 @@ export class SapMachineDistribution extends JavaBase { const arch = this.distributionArchitecture(); let fetchedReleasesJson = await this.fetchReleasesFromUrl( - 'https://sap.github.io/SapMachine/assets/data/sapmachine-releases-all.json' + 'https://sapmachine.io/assets/data/sapmachine-releases-all.json' ); if (!fetchedReleasesJson) { fetchedReleasesJson = await this.fetchReleasesFromUrl( - 'https://api.github.com/repos/SAP/SapMachine/contents/assets/data/sapmachine-releases-all.json?ref=gh-pages', - getGitHubHttpHeaders() + 'https://sap.github.io/SapMachine/assets/data/sapmachine-releases-all.json' ); } diff --git a/src/toolchains.ts b/src/toolchains.ts index cbb667eb7..77cae83f7 100644 --- a/src/toolchains.ts +++ b/src/toolchains.ts @@ -59,9 +59,8 @@ export async function createToolchainsSettings({ // when an alternate m2 location is specified use only that location (no .m2 directory) // otherwise use the home/.m2/ path await io.mkdirP(settingsDirectory); - const originalToolchains = await readExistingToolchainsFile( - settingsDirectory - ); + const originalToolchains = + await readExistingToolchainsFile(settingsDirectory); const updatedToolchains = generateToolchainDefinition( originalToolchains, jdkInfo.version, diff --git a/src/util.ts b/src/util.ts index af75aaac1..0325f7f42 100644 --- a/src/util.ts +++ b/src/util.ts @@ -133,21 +133,25 @@ export function getVersionFromFileContent( const versionFileName = getFileName(versionFile); if (versionFileName == '.tool-versions') { javaVersionRegExp = - /^(java\s+)(?:\S*-)?v?(?(\d+)(\.\d+)?(\.\d+)?(\+\d+)?(-ea(\.\d+)?)?)$/m; + /^java\s+(?:\S*-)?(?\d+(?:\.\d+)*([+_.-](?:openj9[-._]?\d[\w.-]*|java\d+|jre[-_\w]*|OpenJDK\d+[\w_.-]*|[a-z0-9]+))*)/im; + } else if (versionFileName == '.sdkmanrc') { + javaVersionRegExp = /^java\s*=\s*(?[^-]+)/m; } else { javaVersionRegExp = /(?(?<=(^|\s|-))(\d+\S*))(\s|$)/; } - const fileContent = content.match(javaVersionRegExp)?.groups?.version + const capturedVersion = content.match(javaVersionRegExp)?.groups?.version ? (content.match(javaVersionRegExp)?.groups?.version as string) : ''; - if (!fileContent) { + + core.debug( + `Parsed version '${capturedVersion}' from file '${versionFileName}'` + ); + if (!capturedVersion) { return null; } - core.debug(`Version from file '${fileContent}'`); - - const tentativeVersion = avoidOldNotation(fileContent); + const tentativeVersion = avoidOldNotation(capturedVersion); const rawVersion = tentativeVersion.split('-')[0]; let version = semver.validRange(rawVersion) @@ -184,8 +188,8 @@ export function convertVersionToSemver(version: number[] | string) { } export function getGitHubHttpHeaders(): OutgoingHttpHeaders { - const token = core.getInput('token'); - const auth = !token ? undefined : `token ${token}`; + const resolvedToken = core.getInput('token') || process.env.GITHUB_TOKEN; + const auth = !resolvedToken ? undefined : `token ${resolvedToken}`; const headers: OutgoingHttpHeaders = { accept: 'application/vnd.github.VERSION.raw'