Compare commits

..
Author SHA1 Message Date
Kevin Stillhammer 6120bf3e89 Inline the check-dist workflow to test 2025-03-18 15:05:38 +01:00
54 changed files with 5993 additions and 43487 deletions
-9
View File
@@ -1,9 +0,0 @@
self-hosted-runner:
# Custom labels of self-hosted or large GitHub hosted runners
# so that actionlint knows that they are not a typo
labels:
- selfhosted-ubuntu-arm64
# Configuration variables in array of strings defined in your repository or
# organization. `null` means disabling configuration variables check.
# Empty array means no configuration variable is allowed.
config-variables: null
+4 -4
View File
@@ -4,13 +4,13 @@
"owner": "python", "owner": "python",
"pattern": [ "pattern": [
{ {
"regexp": "^\\s*File\\s\\\"(.*)\\\",\\sline\\s(\\d+),\\sin\\s(.*)$",
"file": 1, "file": 1,
"line": 2, "line": 2
"regexp": "^\\s*File\\s\\\"(.*)\\\",\\sline\\s(\\d+),\\sin\\s(.*)$"
}, },
{ {
"message": 2, "regexp": "^\\s*raise\\s(.*)\\(\\'(.*)\\'\\)$",
"regexp": "^\\s*raise\\s(.*)\\(\\'(.*)\\'\\)$" "message": 2
} }
] ]
} }
+1 -1
View File
@@ -19,7 +19,7 @@ categories:
labels: labels:
- "maintenance" - "maintenance"
- "ci" - "ci"
- "update-known-versions" - "update-known-checksums"
- title: "📚 Documentation" - title: "📚 Documentation"
labels: labels:
- "documentation" - "documentation"
@@ -1,35 +0,0 @@
import * as fs from "node:fs";
import * as yaml from "js-yaml";
interface WorkflowJob {
needs?: string[];
[key: string]: unknown;
}
interface Workflow {
jobs: Record<string, WorkflowJob>;
[key: string]: unknown;
}
const workflow = yaml.load(
fs.readFileSync("../workflows/test.yml", "utf8"),
) as Workflow;
const jobs = Object.keys(workflow.jobs);
const allTestsPassed = workflow.jobs["all-tests-passed"];
const needs: string[] = allTestsPassed.needs || [];
const expectedNeeds = jobs.filter((j) => j !== "all-tests-passed");
const missing = expectedNeeds.filter((j) => !needs.includes(j));
if (missing.length > 0) {
console.error(
`Missing jobs in all-tests-passed needs: ${missing.join(", ")}`,
);
console.info(
"Please add the missing jobs to the needs section of all-tests-passed in test.yml.",
);
process.exit(1);
}
console.log(
"All jobs in test.yml are in the needs section of all-tests-passed.",
);
+1 -1
View File
@@ -39,7 +39,7 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v5 uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL
+1 -4
View File
@@ -11,10 +11,7 @@ on:
jobs: jobs:
update_release_draft: update_release_draft:
name: ✏️ Draft release name: ✏️ Draft release
runs-on: ubuntu-24.04-arm runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: read
steps: steps:
- name: 🚀 Run Release Drafter - name: 🚀 Run Release Drafter
uses: release-drafter/release-drafter@v6.1.0 uses: release-drafter/release-drafter@v6.1.0
+46
View File
@@ -0,0 +1,46 @@
name: "test-cache-windows"
on:
workflow_dispatch:
pull_request:
branches:
- main
push:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
test-setup-cache:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}
- run: uv sync
working-directory: __tests__\fixtures\uv-project
test-restore-cache:
runs-on: windows-latest
needs: test-setup-cache
steps:
- uses: actions/checkout@v4
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}
- name: Cache was hit
run: |
if ($env:CACHE_HIT -ne "true") {
exit 1
}
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
- run: uv sync
working-directory: __tests__\fixtures\uv-project
+232
View File
@@ -0,0 +1,232 @@
name: "test-cache"
on:
workflow_dispatch:
pull_request:
branches:
- main
push:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
test-setup-cache:
runs-on: ${{ matrix.os }}
strategy:
matrix:
enable-cache: [ "true", "false", "auto" ]
os: ["ubuntu-latest", "selfhosted-ubuntu-arm64"]
steps:
- uses: actions/checkout@v4
- name: Setup with cache
uses: ./
with:
enable-cache: ${{ matrix.enable-cache }}
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-${{ matrix.os }}-${{ matrix.enable-cache }}
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-restore-cache:
runs-on: ${{ matrix.os }}
strategy:
matrix:
enable-cache: [ "true", "false", "auto" ]
os: [ "ubuntu-latest", "selfhosted-ubuntu-arm64" ]
needs: test-setup-cache
steps:
- uses: actions/checkout@v4
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: ${{ matrix.enable-cache }}
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-${{ matrix.os }}-${{ matrix.enable-cache }}
- name: Cache was hit
if: ${{ matrix.enable-cache == 'true' || (matrix.enable-cache == 'auto' && matrix.os == 'ubuntu-latest') }}
run: |
if [ "$CACHE_HIT" != "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
- name: Cache was not hit
if: ${{ matrix.enable-cache == 'false' || (matrix.enable-cache == 'auto' && matrix.os == 'selfhosted-ubuntu-arm64') }}
run: |
if [ "$CACHE_HIT" == "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-setup-cache-requirements-txt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-requirements-txt
- run: |
uv venv
uv pip install -r requirements.txt
working-directory: __tests__/fixtures/requirements-txt-project
test-restore-cache-requirements-txt:
runs-on: ubuntu-latest
needs: test-setup-cache
steps:
- uses: actions/checkout@v4
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-requirements-txt
- name: Cache was hit
run: |
if [ "$CACHE_HIT" != "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
- run: |
uv venv
uv pip install -r requirements.txt
working-directory: __tests__/fixtures/requirements-txt-project
test-setup-cache-dependency-glob:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-dependency-glob: |
__tests__/fixtures/uv-project/uv.lock
**/pyproject.toml
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-dependency-glob
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-restore-cache-dependency-glob:
runs-on: ubuntu-latest
needs: test-setup-cache-dependency-glob
steps:
- uses: actions/checkout@v4
- name: Change pyproject.toml
run: |
echo '[tool.uv]' >> __tests__/fixtures/uv-project/pyproject.toml
echo 'dev-dependencies = []' >> __tests__/fixtures/uv-project/pyproject.toml
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: true
cache-dependency-glob: |
__tests__/fixtures/uv-project/uv.lock
**/pyproject.toml
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-dependency-glob
ignore-nothing-to-cache: true
- name: Cache was not hit
run: |
if [ "$CACHE_HIT" == "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
test-setup-cache-local:
runs-on: selfhosted-ubuntu-arm64
steps:
- uses: actions/checkout@v4
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-local
cache-local-path: /tmp/uv-cache
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-restore-cache-local:
runs-on: selfhosted-ubuntu-arm64
needs: test-setup-cache-local
steps:
- uses: actions/checkout@v4
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-local
cache-local-path: /tmp/uv-cache
- name: Cache was hit
run: |
if [ "$CACHE_HIT" != "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-tilde-expansion-cache-local-path:
runs-on: selfhosted-ubuntu-arm64
steps:
- uses: actions/checkout@v4
- name: Create cache directory
run: mkdir -p ~/uv-cache
shell: bash
- name: Setup with cache
uses: ./
with:
cache-local-path: ~/uv-cache/cache-local-path
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-tilde-expansion-cache-dependency-glob:
runs-on: selfhosted-ubuntu-arm64
steps:
- uses: actions/checkout@v4
- name: Create cache directory
run: mkdir -p ~/uv-cache
shell: bash
- name: Create cache dependency glob file
run: touch ~/uv-cache.glob
shell: bash
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-local-path: ~/uv-cache/cache-dependency-glob
cache-dependency-glob: "~/uv-cache.glob"
- run: uv sync
working-directory: __tests__/fixtures/uv-project
cleanup-tilde-expansion-tests:
needs:
- test-tilde-expansion-cache-local-path
- test-tilde-expansion-cache-dependency-glob
runs-on: selfhosted-ubuntu-arm64
steps:
- name: Remove cache directory
run: rm -rf ~/uv-cache
shell: bash
- name: Remove cache dependency glob file
run: rm -f ~/uv-cache.glob
shell: bash
test-no-python-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Fake pyproject.toml at root
run: cp __tests__/fixtures/old-python-constraint-project/pyproject.toml pyproject.toml
- name: Setup with cache
uses: ./
with:
enable-cache: true
- run: uv sync
working-directory: __tests__/fixtures/old-python-constraint-project
+30
View File
@@ -0,0 +1,30 @@
name: "test-windows"
on:
workflow_dispatch:
pull_request:
branches:
- main
push:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
test-default-version:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Should not be on path
run: |
if (!(Get-Command -Name "uv" -ErrorAction SilentlyContinue)) {
exit 0
} else {
exit 1
}
- name: Setup uv
uses: ./
- run: uv sync
working-directory: __tests__\fixtures\uv-project
+45 -503
View File
@@ -12,14 +12,11 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true cancel-in-progress: true
permissions:
contents: read
jobs: jobs:
lint: lint:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v4
- name: Actionlint - name: Actionlint
uses: eifinger/actionlint-action@23c85443d840cd73bbecb9cddfc933cc21649a38 # v1.9.1 uses: eifinger/actionlint-action@23c85443d840cd73bbecb9cddfc933cc21649a38 # v1.9.1
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
@@ -29,218 +26,121 @@ jobs:
npm install npm install
- run: | - run: |
npm run all npm run all
- name: Check all jobs are in all-tests-passed.needs
run: |
tsc check-all-tests-passed-needs.ts
node check-all-tests-passed-needs.js
working-directory: .github/scripts
- name: Make sure no changes from linters are detected - name: Make sure no changes from linters are detected
run: | run: |
git diff --exit-code || (echo "::error::Please run 'npm run all' to fix the issues" && exit 1) git diff --exit-code || (echo "::error::Please run 'npm run all' to fix the issues" && exit 1)
test-default-version: test-default-version:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
matrix: matrix:
os: [ubuntu-latest, macos-latest, macos-14, windows-latest] os: [ubuntu-latest, macos-latest, macos-14]
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v4
- name: Install latest version - name: Install latest version
id: setup-uv
uses: ./ uses: ./
- run: uv sync - run: uv sync
working-directory: __tests__/fixtures/uv-project working-directory: __tests__/fixtures/uv-project
shell: bash
- name: Check uv-path is set
run: ${{ steps.setup-uv.outputs.uv-path }} --version
- name: Check uvx-path is set
run: ${{ steps.setup-uv.outputs.uvx-path }} --version
test-specific-version: test-specific-version:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
uv-version: ["0.3.0", "0.3.2", "0.3", "0.3.x", ">=0.3.0"] uv-version: ["0.3.0", "0.3.2", "0.3", "0.3.x", ">=0.3.0"]
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v4
- name: Install version ${{ matrix.uv-version }} - name: Install version ${{ matrix.uv-version }}
uses: ./ uses: ./
with: with:
version: ${{ matrix.uv-version }} version: ${{ matrix.uv-version }}
- run: uv sync - run: uv sync
working-directory: __tests__/fixtures/uv-project working-directory: __tests__/fixtures/uv-project
test-semver-range: test-semver-range:
strategy: runs-on: ubuntu-latest
matrix:
os: [ ubuntu-latest, selfhosted-ubuntu-arm64 ]
runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v4
- name: Install version 0.3 - name: Install version 0.3
id: setup-uv id: setup-uv
uses: ./ uses: ./
with: with:
version: "0.3" version: "0.3"
- name: Correct version gets installed - name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.3.5" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
- name: Output has correct version
run: | run: |
if [ "$UV_VERSION" != "0.3.5" ]; then if [ "$UV_VERSION" != "0.3.5" ]; then
exit 1 exit 1
fi fi
env: env:
UV_VERSION: ${{ steps.setup-uv.outputs.uv-version }} UV_VERSION: ${{ steps.setup-uv.outputs.uv-version }}
test-pep440-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Install version 0.4.30
id: setup-uv
uses: ./
with:
version: ">=0.4.25,<0.5"
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.4.30" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
test-pyproject-file-version: test-pyproject-file-version:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v4
- name: Install version 0.5.14 - name: Install version 0.5.14
id: setup-uv id: setup-uv
uses: ./ uses: ./
with: with:
working-directory: "__tests__/fixtures/pyproject-toml-project" pyproject-file: "__tests__/fixtures/pyproject-toml-project/pyproject.toml"
- name: Correct version gets installed - name: Correct version gets installed
run: | run: |
if [ "$(uv --version)" != "uv 0.5.14" ]; then if [ "$UV_VERSION" != "0.5.14" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1 exit 1
fi fi
env:
test-malformed-pyproject-file-fallback: UV_VERSION: ${{ steps.setup-uv.outputs.uv-version }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Install using malformed pyproject.toml
id: setup-uv
uses: ./
with:
working-directory: "__tests__/fixtures/malformed-pyproject-toml-project"
- run: uv --help
test-uv-file-version: test-uv-file-version:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v4
- name: Install version 0.5.15 - name: Install version 0.5.15
id: setup-uv id: setup-uv
uses: ./ uses: ./
with: with:
working-directory: "__tests__/fixtures/uv-toml-project" pyproject-file: "__tests__/fixtures/uv-toml-project/pyproject.toml"
uv-file: "__tests__/fixtures/uv-toml-project/uv.toml"
- name: Correct version gets installed - name: Correct version gets installed
run: | run: |
if [ "$(uv --version)" != "uv 0.5.15" ]; then if [ "$UV_VERSION" != "0.5.15" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1 exit 1
fi fi
env:
test-version-file-version: UV_VERSION: ${{ steps.setup-uv.outputs.uv-version }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Install from requirements file
id: setup-uv
uses: ./
with:
version-file: "__tests__/fixtures/uv-in-requirements-txt-project/requirements.txt"
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.6.17" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
test-version-file-hash-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Install from requirements file
id: setup-uv
uses: ./
with:
version-file: "__tests__/fixtures/uv-in-requirements-hash-txt-project/requirements.txt"
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.8.3" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
test-tool-versions-file-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Install from .tools-versions file
id: setup-uv
uses: ./
with:
version-file: "__tests__/fixtures/.tool-versions"
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.5.15" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
test-checksum: test-checksum:
runs-on: ${{ matrix.inputs.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
matrix: matrix:
inputs: os: [ubuntu-latest, macos-latest]
- os: ubuntu-latest checksum:
["4d9279ad5ca596b1e2d703901d508430eb07564dc4d8837de9e2fca9c90f8ecd"]
exclude:
- os: macos-latest
checksum: "4d9279ad5ca596b1e2d703901d508430eb07564dc4d8837de9e2fca9c90f8ecd" checksum: "4d9279ad5ca596b1e2d703901d508430eb07564dc4d8837de9e2fca9c90f8ecd"
include:
- os: macos-latest - os: macos-latest
checksum: "a70cbfbf3bb5c08b2f84963b4f12c94e08fbb2468ba418a3bfe1066fbe9e7218" checksum: "a70cbfbf3bb5c08b2f84963b4f12c94e08fbb2468ba418a3bfe1066fbe9e7218"
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v4
- name: Checksum matches expected - name: Checksum matches expected
uses: ./ uses: ./
with: with:
version: "0.3.2" version: "0.3.2"
checksum: ${{ matrix.inputs.checksum }} checksum: ${{ matrix.checksum }}
- run: uv sync - run: uv sync
working-directory: __tests__/fixtures/uv-project working-directory: __tests__/fixtures/uv-project
test-with-explicit-token: test-with-explicit-token:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v4
- name: Install default version - name: Install default version
uses: ./ uses: ./
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
- run: uv sync - run: uv sync
working-directory: __tests__/fixtures/uv-project working-directory: __tests__/fixtures/uv-project
test-uvx: test-uvx:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v4
- name: Install default version - name: Install default version
uses: ./ uses: ./
- run: uvx ruff --version - run: uvx ruff --version
test-tool-install: test-tool-install:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
@@ -253,16 +153,15 @@ jobs:
windows-latest, windows-latest,
] ]
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v4
- name: Install default version - name: Install default version
uses: ./ uses: ./
- run: uv tool install ruff - run: uv tool install ruff
- run: ruff --version - run: ruff --version
test-tilde-expansion-tool-dirs: test-tilde-expansion-tool-dirs:
runs-on: selfhosted-ubuntu-arm64 runs-on: selfhosted-ubuntu-arm64
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v4
- name: Setup with cache - name: Setup with cache
uses: ./ uses: ./
with: with:
@@ -278,14 +177,13 @@ jobs:
echo "UV_TOOL_DIR does not contain /home/ubuntu/tool-dir: $UV_TOOL_DIR" echo "UV_TOOL_DIR does not contain /home/ubuntu/tool-dir: $UV_TOOL_DIR"
exit 1 exit 1
fi fi
test-python-version: test-python-version:
runs-on: ${{ matrix.os }} runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
os: [ubuntu-latest, macos-latest, windows-latest] os: [ubuntu-latest, macos-latest, windows-latest]
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v4
- name: Install latest version - name: Install latest version
uses: ./ uses: ./
with: with:
@@ -297,23 +195,8 @@ jobs:
exit 1 exit 1
fi fi
shell: bash shell: bash
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-activate-environment:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ ubuntu-latest, macos-latest, windows-latest ]
steps:
- uses: actions/checkout@v5
- name: Install latest version
uses: ./
with:
python-version: 3.13.1t
activate-environment: true
- name: Verify packages can be installed - name: Verify packages can be installed
run: uv pip install pip run: uv pip install --python=3.13.1t pip
shell: bash shell: bash
- name: Verify python version is correct - name: Verify python version is correct
run: | run: |
@@ -322,364 +205,23 @@ jobs:
exit 1 exit 1
fi fi
shell: bash shell: bash
test-malformed-pyproject-file-fallback:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install using malformed pyproject.toml
id: setup-uv
uses: ./
with:
pyproject-file: "__tests__/fixtures/malformed-pyproject-toml-project/pyproject.toml"
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-musl: test-musl:
runs-on: ubuntu-latest runs-on: ubuntu-latest
container: alpine container: alpine
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v4
- name: Install latest version - name: Install latest version
uses: ./ uses: ./
- run: uv sync - run: uv sync
working-directory: __tests__/fixtures/uv-project working-directory: __tests__/fixtures/uv-project
test-setup-cache:
runs-on: ${{ matrix.os }}
strategy:
matrix:
enable-cache: [ "true", "false", "auto" ]
os: [ "ubuntu-latest", "selfhosted-ubuntu-arm64", "windows-latest" ]
steps:
- uses: actions/checkout@v5
- name: Setup with cache
uses: ./
with:
enable-cache: ${{ matrix.enable-cache }}
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-${{ matrix.os }}-${{ matrix.enable-cache }}
- run: uv sync
working-directory: __tests__/fixtures/uv-project
shell: bash
test-restore-cache:
runs-on: ${{ matrix.os }}
strategy:
matrix:
enable-cache: [ "true", "false", "auto" ]
os: [ "ubuntu-latest", "selfhosted-ubuntu-arm64", "windows-latest" ]
needs: test-setup-cache
steps:
- uses: actions/checkout@v5
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: ${{ matrix.enable-cache }}
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-${{ matrix.os }}-${{ matrix.enable-cache }}
- name: Cache was hit
if: ${{ matrix.enable-cache == 'true' || (matrix.enable-cache == 'auto' && matrix.os == 'ubuntu-latest') }}
run: |
if [ "$CACHE_HIT" != "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
shell: bash
- name: Cache was not hit
if: ${{ matrix.enable-cache == 'false' || (matrix.enable-cache == 'auto' && matrix.os == 'selfhosted-ubuntu-arm64') }}
run: |
if [ "$CACHE_HIT" == "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
shell: bash
- run: uv sync
working-directory: __tests__/fixtures/uv-project
shell: bash
test-setup-cache-requirements-txt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-requirements-txt
- run: |
uv venv
uv pip install -r requirements.txt
working-directory: __tests__/fixtures/requirements-txt-project
test-restore-cache-requirements-txt:
runs-on: ubuntu-latest
needs: test-setup-cache
steps:
- uses: actions/checkout@v5
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-requirements-txt
- name: Cache was hit
run: |
if [ "$CACHE_HIT" != "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
- run: |
uv venv
uv pip install -r requirements.txt
working-directory: __tests__/fixtures/requirements-txt-project
test-setup-cache-dependency-glob:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-dependency-glob: |
__tests__/fixtures/uv-project/uv.lock
**/pyproject.toml
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-dependency-glob
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-restore-cache-dependency-glob:
runs-on: ubuntu-latest
needs: test-setup-cache-dependency-glob
steps:
- uses: actions/checkout@v5
- name: Change pyproject.toml
run: |
echo '[tool.uv]' >> __tests__/fixtures/uv-project/pyproject.toml
echo 'dev-dependencies = []' >> __tests__/fixtures/uv-project/pyproject.toml
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: true
cache-dependency-glob: |
__tests__/fixtures/uv-project/uv.lock
**/pyproject.toml
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-dependency-glob
ignore-nothing-to-cache: true
- name: Cache was not hit
run: |
if [ "$CACHE_HIT" == "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
test-cache-local:
strategy:
matrix:
inputs:
- os: ubuntu-latest
expected-cache-dir: "/home/runner/work/_temp/setup-uv-cache"
- os: windows-latest
expected-cache-dir: "D:\\a\\_temp\\setup-uv-cache"
- os: selfhosted-ubuntu-arm64
expected-cache-dir: "/home/ubuntu/.cache/uv"
runs-on: ${{ matrix.inputs.os }}
steps:
- uses: actions/checkout@v5
- name: Setup with cache
uses: ./
with:
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-cache-local
- run: |
if [ "$UV_CACHE_DIR" != "${{ matrix.inputs.expected-cache-dir }}" ]; then
echo "UV_CACHE_DIR is not set to the expected value: $UV_CACHE_DIR"
exit 1
fi
shell: bash
test-setup-cache-local:
runs-on: selfhosted-ubuntu-arm64
steps:
- uses: actions/checkout@v5
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-local
cache-local-path: /tmp/uv-cache
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-restore-cache-local:
runs-on: selfhosted-ubuntu-arm64
needs: test-setup-cache-local
steps:
- uses: actions/checkout@v5
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-local
cache-local-path: /tmp/uv-cache
- name: Cache was hit
run: |
if [ "$CACHE_HIT" != "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-tilde-expansion-cache-local-path:
runs-on: selfhosted-ubuntu-arm64
steps:
- uses: actions/checkout@v5
- name: Create cache directory
run: mkdir -p ~/uv-cache
shell: bash
- name: Setup with cache
uses: ./
with:
cache-local-path: ~/uv-cache/cache-local-path
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-tilde-expansion-cache-dependency-glob:
runs-on: selfhosted-ubuntu-arm64
steps:
- uses: actions/checkout@v5
- name: Create cache directory
run: mkdir -p ~/uv-cache
shell: bash
- name: Create cache dependency glob file
run: touch ~/uv-cache.glob
shell: bash
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-local-path: ~/uv-cache/cache-dependency-glob
cache-dependency-glob: "~/uv-cache.glob"
- run: uv sync
working-directory: __tests__/fixtures/uv-project
cleanup-tilde-expansion-tests:
needs:
- test-tilde-expansion-cache-local-path
- test-tilde-expansion-cache-dependency-glob
if: always()
runs-on: selfhosted-ubuntu-arm64
steps:
- name: Remove cache directory
run: rm -rf ~/uv-cache
shell: bash
- name: Remove cache dependency glob file
run: rm -f ~/uv-cache.glob
shell: bash
test-no-python-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Fake pyproject.toml at root
run: cp __tests__/fixtures/old-python-constraint-project/pyproject.toml pyproject.toml
- name: Setup with cache
uses: ./
with:
enable-cache: true
- run: uv sync
working-directory: __tests__/fixtures/old-python-constraint-project
test-custom-manifest-file:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Install from custom manifest file
uses: ./
with:
manifest-file: "https://raw.githubusercontent.com/astral-sh/setup-uv/${{ github.ref }}/__tests__/download/custom-manifest.json"
- run: uv sync
working-directory: __tests__/fixtures/uv-project
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.7.12-alpha.1" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
test-absolute-path:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Create requirements.txt
run: echo "uv==0.6.17" > /tmp/setup-uv-requirements.txt
- name: Install from requirements file
id: setup-uv
uses: ./
with:
version-file: "/tmp/setup-uv-requirements.txt"
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.6.17" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
test-relative-path:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: mkdir
run: mkdir -p /tmp/setup-uv-test-relative-path
- name: Create requirements.txt
run: echo "uv==0.6.17" > /tmp/setup-uv-test-relative-path/setup-uv-requirements.txt
- name: Install from requirements file
id: setup-uv
uses: ./
with:
version-file: "./setup-uv-requirements.txt"
working-directory: "/tmp/setup-uv-test-relative-path"
cache-dependency-glob: "./setup-uv-requirements.txt"
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.6.17" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
all-tests-passed:
runs-on: ubuntu-latest
needs:
- lint
- test-default-version
- test-specific-version
- test-semver-range
- test-pep440-version
- test-pyproject-file-version
- test-malformed-pyproject-file-fallback
- test-uv-file-version
- test-version-file-version
- test-version-file-hash-version
- test-tool-versions-file-version
- test-checksum
- test-with-explicit-token
- test-uvx
- test-tool-install
- test-tilde-expansion-tool-dirs
- test-python-version
- test-activate-environment
- test-musl
- test-cache-local
- test-setup-cache
- test-restore-cache
- test-setup-cache-requirements-txt
- test-restore-cache-requirements-txt
- test-setup-cache-dependency-glob
- test-restore-cache-dependency-glob
- test-setup-cache-local
- test-restore-cache-local
- test-tilde-expansion-cache-local-path
- test-tilde-expansion-cache-dependency-glob
- cleanup-tilde-expansion-tests
- test-no-python-version
- test-custom-manifest-file
- test-absolute-path
- test-relative-path
if: always()
steps:
- name: All tests passed
run: |
echo "All jobs passed: ${{ !contains(needs.*.result, 'failure') }}"
# shellcheck disable=SC2242
exit ${{ contains(needs.*.result, 'failure') && 1 || 0 }}
@@ -0,0 +1,34 @@
name: "Update known checksums"
on:
workflow_dispatch:
schedule:
- cron: "0 4 * * *" # Run every day at 4am UTC
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "20"
- name: Update known checksums
id: update-known-checksums
run:
node dist/update-known-checksums/index.js
src/download/checksum/known-checksums.ts ${{ secrets.GITHUB_TOKEN }}
- run: npm install && npm run all
- name: Create Pull Request
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
with:
commit-message: "chore: update known checksums"
title:
"chore: update known checksums for ${{
steps.update-known-checksums.outputs.latest-version }}"
body:
"chore: update known checksums for ${{
steps.update-known-checksums.outputs.latest-version }}"
base: main
labels: "automated-pr,update-known-checksums"
branch: update-known-checksums-pr
delete-branch: true
@@ -1,39 +0,0 @@
name: "Update known versions"
on:
workflow_dispatch:
schedule:
- cron: "0 4 * * *" # Run every day at 4am UTC
jobs:
build:
runs-on: ubuntu-24.04-arm
permissions:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v4
with:
node-version: "20"
- name: Update known versions
id: update-known-versions
run:
node dist/update-known-versions/index.js
src/download/checksum/known-checksums.ts
version-manifest.json
${{ secrets.GITHUB_TOKEN }}
- run: npm install && npm run all
- name: Create Pull Request
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
with:
commit-message: "chore: update known versions"
title:
"chore: update known versions for ${{
steps.update-known-versions.outputs.latest-version }}"
body:
"chore: update known versions for ${{
steps.update-known-versions.outputs.latest-version }}"
base: main
labels: "automated-pr,update-known-versions"
branch: update-known-versions-pr
delete-branch: true
@@ -11,11 +11,9 @@ on:
jobs: jobs:
update_major_minor_tags: update_major_minor_tags:
name: Make sure major and minor tags are up to date on a patch release name: Make sure major and minor tags are up to date on a patch release
runs-on: ubuntu-24.04-arm runs-on: ubuntu-latest
permissions:
contents: write
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v4
- name: Update Major Minor Tags - name: Update Major Minor Tags
run: | run: |
set -x set -x
-3
View File
@@ -1,3 +0,0 @@
{
"recommendations": ["biomejs.biome"]
}
-16
View File
@@ -1,16 +0,0 @@
{
"editor.codeActionsOnSave": {
"source.action.useSortedAttributes.biome": "explicit",
"source.action.useSortedKeys.biome": "explicit",
"source.fixAll.biome": "explicit"
},
"editor.defaultFormatter": "biomejs.biome",
"editor.formatOnSave": true,
"explorer.excludeGitIgnore": false,
"search.defaultViewMode": "list",
"search.exclude": {
"**/node_modules": true
},
"typescript.enablePromptUseWorkspaceTsdk": true,
"typescript.tsdk": "node_modules/typescript/lib"
}
+47 -175
View File
@@ -14,11 +14,9 @@ Set up your GitHub Actions workflow with a specific version of [uv](https://docs
- [Install a required-version or latest (default)](#install-a-required-version-or-latest-default) - [Install a required-version or latest (default)](#install-a-required-version-or-latest-default)
- [Install the latest version](#install-the-latest-version) - [Install the latest version](#install-the-latest-version)
- [Install a specific version](#install-a-specific-version) - [Install a specific version](#install-a-specific-version)
- [Install a version by supplying a semver range or pep440 specifier](#install-a-version-by-supplying-a-semver-range-or-pep440-specifier) - [Install a version by supplying a semver range](#install-a-version-by-supplying-a-semver-range)
- [Install a version defined in a requirements or config file](#install-a-version-defined-in-a-requirements-or-config-file) - [Install a required-version](#install-a-required-version)
- [Python version](#python-version) - [Python version](#python-version)
- [Activate environment](#activate-environment)
- [Working directory](#working-directory)
- [Validate checksum](#validate-checksum) - [Validate checksum](#validate-checksum)
- [Enable Caching](#enable-caching) - [Enable Caching](#enable-caching)
- [Cache dependency glob](#cache-dependency-glob) - [Cache dependency glob](#cache-dependency-glob)
@@ -29,8 +27,6 @@ Set up your GitHub Actions workflow with a specific version of [uv](https://docs
- [UV_TOOL_DIR](#uv_tool_dir) - [UV_TOOL_DIR](#uv_tool_dir)
- [UV_TOOL_BIN_DIR](#uv_tool_bin_dir) - [UV_TOOL_BIN_DIR](#uv_tool_bin_dir)
- [Tilde Expansion](#tilde-expansion) - [Tilde Expansion](#tilde-expansion)
- [Manifest file](#manifest-file)
- [Add problem matchers](#add-problem-matchers)
- [How it works](#how-it-works) - [How it works](#how-it-works)
- [FAQ](#faq) - [FAQ](#faq)
@@ -40,7 +36,7 @@ Set up your GitHub Actions workflow with a specific version of [uv](https://docs
```yaml ```yaml
- name: Install the latest version of uv - name: Install the latest version of uv
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
``` ```
If you do not specify a version, this action will look for a [required-version](https://docs.astral.sh/uv/reference/settings/#required-version) If you do not specify a version, this action will look for a [required-version](https://docs.astral.sh/uv/reference/settings/#required-version)
@@ -53,7 +49,7 @@ For an example workflow, see
```yaml ```yaml
- name: Install the latest version of uv - name: Install the latest version of uv
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
version: "latest" version: "latest"
``` ```
@@ -62,62 +58,62 @@ For an example workflow, see
```yaml ```yaml
- name: Install a specific version of uv - name: Install a specific version of uv
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
version: "0.4.4" version: "0.4.4"
``` ```
### Install a version by supplying a semver range or pep440 specifier ### Install a version by supplying a semver range
You can specify a [semver range](https://github.com/npm/node-semver?tab=readme-ov-file#ranges) You can specify a [semver range](https://github.com/npm/node-semver?tab=readme-ov-file#ranges)
or [pep440 specifier](https://peps.python.org/pep-0440/#version-specifiers)
to install the latest version that satisfies the range. to install the latest version that satisfies the range.
```yaml ```yaml
- name: Install a semver range of uv - name: Install a semver range of uv
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
version: ">=0.4.0" version: ">=0.4.0"
``` ```
```yaml ```yaml
- name: Pinning a minor version of uv - name: Pinning a minor version of uv
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
version: "0.4.x" version: "0.4.x"
``` ```
### Install a required-version
You can specify a [required-version](https://docs.astral.sh/uv/reference/settings/#required-version)
in either a `uv.toml` or `pyproject.toml` file:
```yaml ```yaml
- name: Install a pep440-specifier-satisfying version of uv - name: Install required-version defined in uv.toml
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
version: ">=0.4.25,<0.5" uv-file: "path/to/uv.toml"
``` ```
### Install a version defined in a requirements or config file
You can use the `version-file` input to specify a file that contains the version of uv to install.
This can either be a `pyproject.toml` or `uv.toml` file which defines a `required-version` or
uv defined as a dependency in `pyproject.toml` or `requirements.txt`.
[asdf](https://asdf-vm.com/) `.tool-versions` is also supported, but without the `ref` syntax.
```yaml ```yaml
- name: Install uv based on the version defined in pyproject.toml - name: Install required-version defined in pyproject.toml
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
version-file: "pyproject.toml" pyproject-file: "path/to/pyproject.toml"
``` ```
### Python version ### Python version
You can use the input `python-version` to set the environment variable `UV_PYTHON` for the rest of your workflow You can use the input `python-version` to
- set the environment variable `UV_PYTHON` for the rest of your workflow
- create a new virtual environment with the specified python version
- activate the virtual environment for the rest of your workflow
This will override any python version specifications in `pyproject.toml` and `.python-version` This will override any python version specifications in `pyproject.toml` and `.python-version`
```yaml ```yaml
- name: Install the latest version of uv and set the python version to 3.13t - name: Install the latest version of uv and set the python version to 3.13t
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
python-version: 3.13t python-version: 3.13t
- run: uv pip install --python=3.13t pip - run: uv pip install --python=3.13t pip
@@ -135,51 +131,13 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Install the latest version of uv and set the python version - name: Install the latest version of uv and set the python version
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
python-version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
- name: Test with python ${{ matrix.python-version }} - name: Test with python ${{ matrix.python-version }}
run: uv run --frozen pytest run: uv run --frozen pytest
``` ```
### Activate environment
You can set `activate-environment` to `true` to automatically activate a venv.
This allows directly using it in later steps:
```yaml
- name: Install the latest version of uv and activate the environment
uses: astral-sh/setup-uv@v6
with:
activate-environment: true
- run: uv pip install pip
```
> [!WARNING]
>
> Activating the environment adds your dependencies to the `PATH`, which could break some workflows.
> For example, if you have a dependency which requires uv, e.g., `hatch`, activating the
> environment will shadow the `uv` binary installed by this action and may result in a different uv
> version being used.
>
> We do not recommend using this setting for most use-cases. Instead, use `uv run` to execute
> commands in the environment.
### Working directory
You can set the working directory with the `working-directory` input.
This controls where we look for `pyproject.toml`, `uv.toml` and `.python-version` files
which are used to determine the version of uv and python to install.
It also controls where [the venv gets created](#activate-environment).
```yaml
- name: Install uv based on the config files in the working-directory
uses: astral-sh/setup-uv@v6
with:
working-directory: my/subproject/dir
```
### Validate checksum ### Validate checksum
You can specify a checksum to validate the downloaded executable. Checksums up to the default version You can specify a checksum to validate the downloaded executable. Checksums up to the default version
@@ -188,7 +146,7 @@ are automatically verified by this action. The sha256 hashes can be found on the
```yaml ```yaml
- name: Install a specific version and validate the checksum - name: Install a specific version and validate the checksum
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
version: "0.3.1" version: "0.3.1"
checksum: "e11b01402ab645392c7ad6044db63d37e4fd1e745e015306993b07695ea5f9f8" checksum: "e11b01402ab645392c7ad6044db63d37e4fd1e745e015306993b07695ea5f9f8"
@@ -196,10 +154,6 @@ are automatically verified by this action. The sha256 hashes can be found on the
### Enable caching ### Enable caching
> [!NOTE]
> The cache is pruned before it is uploaded to the GitHub Actions cache. This can lead to
> a small or empty cache. See [Disable cache pruning](#disable-cache-pruning) for more details.
If you enable caching, the [uv cache](https://docs.astral.sh/uv/concepts/cache/) will be uploaded to If you enable caching, the [uv cache](https://docs.astral.sh/uv/concepts/cache/) will be uploaded to
the GitHub Actions cache. This can speed up runs that reuse the cache by several minutes. the GitHub Actions cache. This can speed up runs that reuse the cache by several minutes.
Caching is enabled by default on GitHub-hosted runners. Caching is enabled by default on GitHub-hosted runners.
@@ -214,7 +168,7 @@ You can optionally define a custom cache key suffix.
```yaml ```yaml
- name: Enable caching and define a custom cache key suffix - name: Enable caching and define a custom cache key suffix
id: setup-uv id: setup-uv
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
enable-cache: true enable-cache: true
cache-suffix: "optional-suffix" cache-suffix: "optional-suffix"
@@ -237,22 +191,16 @@ changes. If you use relative paths, they are relative to the repository root.
> [!NOTE] > [!NOTE]
> >
> You can look up supported patterns [here](https://github.com/actions/toolkit/tree/main/packages/glob#patterns)
>
> The default is > The default is
> ```yaml > ```yaml
> cache-dependency-glob: | > cache-dependency-glob: |
> **/*requirements*.txt > **/requirements*.txt
> **/*requirements*.in
> **/*constraints*.txt
> **/*constraints*.in
> **/pyproject.toml
> **/uv.lock > **/uv.lock
> ``` > ```
```yaml ```yaml
- name: Define a cache dependency glob - name: Define a cache dependency glob
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
enable-cache: true enable-cache: true
cache-dependency-glob: "**/pyproject.toml" cache-dependency-glob: "**/pyproject.toml"
@@ -260,7 +208,7 @@ changes. If you use relative paths, they are relative to the repository root.
```yaml ```yaml
- name: Define a list of cache dependency globs - name: Define a list of cache dependency globs
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
enable-cache: true enable-cache: true
cache-dependency-glob: | cache-dependency-glob: |
@@ -270,7 +218,7 @@ changes. If you use relative paths, they are relative to the repository root.
```yaml ```yaml
- name: Define an absolute cache dependency glob - name: Define an absolute cache dependency glob
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
enable-cache: true enable-cache: true
cache-dependency-glob: "/tmp/my-folder/requirements*.txt" cache-dependency-glob: "/tmp/my-folder/requirements*.txt"
@@ -278,7 +226,7 @@ changes. If you use relative paths, they are relative to the repository root.
```yaml ```yaml
- name: Never invalidate the cache - name: Never invalidate the cache
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
enable-cache: true enable-cache: true
cache-dependency-glob: "" cache-dependency-glob: ""
@@ -293,7 +241,7 @@ It defaults to `setup-uv-cache` in the `TMP` dir, `D:\a\_temp\uv-tool-dir` on Wi
```yaml ```yaml
- name: Define a custom uv cache path - name: Define a custom uv cache path
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
cache-local-path: "/path/to/cache" cache-local-path: "/path/to/cache"
``` ```
@@ -312,7 +260,7 @@ input.
```yaml ```yaml
- name: Don't prune the cache before saving it - name: Don't prune the cache before saving it
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
enable-cache: true enable-cache: true
prune-cache: false prune-cache: false
@@ -325,7 +273,7 @@ If you want to ignore this, set the `ignore-nothing-to-cache` input to `true`.
```yaml ```yaml
- name: Ignore nothing to cache - name: Ignore nothing to cache
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
enable-cache: true enable-cache: true
ignore-nothing-to-cache: true ignore-nothing-to-cache: true
@@ -340,7 +288,7 @@ If you want to ignore this, set the `ignore-empty-workdir` input to `true`.
```yaml ```yaml
- name: Ignore empty workdir - name: Ignore empty workdir
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
ignore-empty-workdir: true ignore-empty-workdir: true
``` ```
@@ -357,7 +305,7 @@ are not sufficient, you can provide a custom GitHub token with the necessary per
```yaml ```yaml
- name: Install the latest version of uv with a custom GitHub token - name: Install the latest version of uv with a custom GitHub token
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
github-token: ${{ secrets.CUSTOM_GITHUB_TOKEN }} github-token: ${{ secrets.CUSTOM_GITHUB_TOKEN }}
``` ```
@@ -375,7 +323,7 @@ input:
```yaml ```yaml
- name: Install the latest version of uv with a custom tool dir - name: Install the latest version of uv with a custom tool dir
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
tool-dir: "/path/to/tool/dir" tool-dir: "/path/to/tool/dir"
``` ```
@@ -394,7 +342,7 @@ If you want to change this behaviour (especially on self-hosted runners) you can
```yaml ```yaml
- name: Install the latest version of uv with a custom tool bin dir - name: Install the latest version of uv with a custom tool bin dir
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
tool-bin-dir: "/path/to/tool-bin/dir" tool-bin-dir: "/path/to/tool-bin/dir"
``` ```
@@ -403,7 +351,6 @@ If you want to change this behaviour (especially on self-hosted runners) you can
This action supports expanding the `~` character to the user's home directory for the following inputs: This action supports expanding the `~` character to the user's home directory for the following inputs:
- `version-file`
- `cache-local-path` - `cache-local-path`
- `tool-dir` - `tool-dir`
- `tool-bin-dir` - `tool-bin-dir`
@@ -411,7 +358,7 @@ This action supports expanding the `~` character to the user's home directory fo
```yaml ```yaml
- name: Expand the tilde character - name: Expand the tilde character
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
cache-local-path: "~/path/to/cache" cache-local-path: "~/path/to/cache"
tool-dir: "~/path/to/tool/dir" tool-dir: "~/path/to/tool/dir"
@@ -419,59 +366,6 @@ This action supports expanding the `~` character to the user's home directory fo
cache-dependency-glob: "~/my-cache-buster" cache-dependency-glob: "~/my-cache-buster"
``` ```
### Manifest file
The `manifest-file` input allows you to specify a JSON manifest that lists available uv versions,
architectures, and their download URLs. By default, this action uses the manifest file contained
in this repository, which is automatically updated with each release of uv.
The manifest file contains an array of objects, each describing a version,
architecture, platform, and the corresponding download URL. For example:
```json
[
{
"version": "0.7.13",
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
"arch": "aarch64",
"platform": "apple-darwin",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.7.13/uv-aarch64-apple-darwin.tar.gz"
},
...
]
```
You can supply a custom manifest file URL to define additional versions,
architectures, or different download URLs.
This is useful if you maintain your own uv builds or want to override the default sources.
```yaml
- name: Use a custom manifest file
uses: astral-sh/setup-uv@v6
with:
manifest-file: "https://example.com/my-custom-manifest.json"
```
> [!NOTE]
> When you use a custom manifest file and do not set the `version` input, its default value is `latest`.
> This means the action will install the latest version available in the custom manifest file.
> This is different from the default behavior of installing the latest version from the official uv releases.
### Add problem matchers
This action automatically adds
[problem matchers](https://github.com/actions/toolkit/blob/main/docs/problem-matchers.md)
for python errors.
You can disable this by setting the `add-problem-matchers` input to `false`.
```yaml
- name: Install the latest version of uv without problem matchers
uses: astral-sh/setup-uv@v6
with:
add-problem-matchers: false
```
## How it works ## How it works
This action downloads uv from the uv repo's official This action downloads uv from the uv repo's official
@@ -479,7 +373,7 @@ This action downloads uv from the uv repo's official
[GitHub Actions Toolkit](https://github.com/actions/toolkit) to cache it as a tool to speed up [GitHub Actions Toolkit](https://github.com/actions/toolkit) to cache it as a tool to speed up
consecutive runs on self-hosted runners. consecutive runs on self-hosted runners.
The installed version of uv is then added to the runner PATH, enabling later steps to invoke it The installed version of uv is then added to the runner PATH, enabling subsequent steps to invoke it
by name (`uv`). by name (`uv`).
## FAQ ## FAQ
@@ -497,7 +391,7 @@ For example:
- name: Checkout the repository - name: Checkout the repository
uses: actions/checkout@main uses: actions/checkout@main
- name: Install the latest version of uv - name: Install the latest version of uv
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
enable-cache: true enable-cache: true
- name: Test - name: Test
@@ -509,7 +403,7 @@ To install a specific version of Python, use
```yaml ```yaml
- name: Install the latest version of uv - name: Install the latest version of uv
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
with: with:
enable-cache: true enable-cache: true
- name: Install Python 3.12 - name: Install Python 3.12
@@ -528,7 +422,7 @@ output:
uses: actions/checkout@main uses: actions/checkout@main
- name: Install the default version of uv - name: Install the default version of uv
id: setup-uv id: setup-uv
uses: astral-sh/setup-uv@v6 uses: astral-sh/setup-uv@v5
- name: Print the installed version - name: Print the installed version
run: echo "Installed uv version is ${{ steps.setup-uv.outputs.uv-version }}" run: echo "Installed uv version is ${{ steps.setup-uv.outputs.uv-version }}"
``` ```
@@ -554,11 +448,11 @@ because they try to upload with the same cache key.
You might see errors like You might see errors like
`Failed to save: Failed to CreateCacheEntry: Received non-retryable error: Failed request: (409) Conflict: cache entry with the same key, version, and scope already exists` `Failed to save: Failed to CreateCacheEntry: Received non-retryable error: Failed request: (409) Conflict: cache entry with the same key, version, and scope already exists`
### Why do I see warnings like `No GitHub Actions cache found for key` ### Why do I see warnings like `Cache not found for keys`
When a workflow runs for the first time on a branch and has a new cache key, because the When a workflow runs for the first time on a branch and has a new cache key, because the
[cache-dependency-glob](#cache-dependency-glob) found changed files (changed dependencies), [cache-dependency-glob](#cache-dependency-glob) found changed files (changed dependencies),
the cache will not be found and the warning `No GitHub Actions cache found for key` will be printed. the cache will not be found and the warning `Cache not found for keys` will be printed.
While this might be irritating at first, it is expected behaviour and the cache will be created While this might be irritating at first, it is expected behaviour and the cache will be created
and reused in later workflows. and reused in later workflows.
@@ -574,28 +468,6 @@ Some workflows need uv but do not need to access the repository content.
But **if** you need to access the repository content, you have run `actions/checkout` before running `setup-uv`. But **if** you need to access the repository content, you have run `actions/checkout` before running `setup-uv`.
Running `actions/checkout` after `setup-uv` **is not supported**. Running `actions/checkout` after `setup-uv` **is not supported**.
### Does `setup-uv` also install my project or its dependencies automatically?
No, `setup-uv` alone wont install any libraries from your `pyproject.toml` or `requirements.txt`, it only sets up `uv`.
You should run `uv sync` or `uv pip install .` separately, or use `uv run ...` to ensure necessary dependencies are installed.
### Why is a changed cache not detected and not the full cache uploaded?
When `setup-uv` starts it has to know whether it is better to download an existing cache
or start fresh and download every dependency again.
It does this by using a combination of hashes calculated on the contents of e.g. `uv.lock`.
By calculating these hashes and combining them in a key `setup-uv` can check
if an uploaded cache exists for this key.
If yes (e.g. contents of `uv.lock` did not change since last run) the dependencies in the cache
are up to date and the cache will be downloaded and used.
Details on determining which files will lead to different caches can be read under
[cache-dependency-glob](#cache-dependency-glob)
Some dependencies will never be uploaded to the cache and will be downloaded again on each run
as described in [disable-cache-pruning](#disable-cache-pruning)
## Acknowledgements ## Acknowledgements
`setup-uv` was initially written and published by [Kevin Stillhammer](https://github.com/eifinger) `setup-uv` was initially written and published by [Kevin Stillhammer](https://github.com/eifinger)
+3 -3
View File
@@ -1,4 +1,4 @@
import { expect, it, test } from "@jest/globals"; import { expect, test, it } from "@jest/globals";
import { import {
isknownVersion, isknownVersion,
validateChecksum, validateChecksum,
@@ -22,12 +22,12 @@ type KnownVersionFixture = { version: string; known: boolean };
it.each<KnownVersionFixture>([ it.each<KnownVersionFixture>([
{ {
known: true,
version: "0.3.0", version: "0.3.0",
known: true,
}, },
{ {
known: false,
version: "0.0.15", version: "0.0.15",
known: false,
}, },
])( ])(
"isknownVersion should return $known for version $version", "isknownVersion should return $known for version $version",
-9
View File
@@ -1,9 +0,0 @@
[
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://release.pyx.dev/0.7.12-alpha.1/uv-x86_64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.7.12-alpha.1"
}
]
-1
View File
@@ -1 +0,0 @@
uv 0.5.15
@@ -1 +0,0 @@
print("Hello world")
@@ -1,33 +0,0 @@
# This file was autogenerated by uv via the following command:
# uv pip compile --generate-hashes - -o ex-requirements.txt
click==8.2.1 \
--hash=sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202 \
--hash=sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b
# via uvicorn
h11==0.16.0 \
--hash=sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1 \
--hash=sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86
# via uvicorn
uv==0.8.3 \
--hash=sha256:1121ad1c9389b865d029385031d3fd7d90d343c92a2149a4d4aa20bf469cb27f \
--hash=sha256:17bcdb0615e37cc5f985f7d7546f755ac6343c1dc8bbe876c892437f14f8f904 \
--hash=sha256:2ccaae4c749126c99f6404d67a0ae1eae29cbafb05603d09094a775061fdf4e5 \
--hash=sha256:2e311c029bff2ca07c6ddf877ccc5935cabb78e09b94b53a849542665b6a6fa1 \
--hash=sha256:391c97577048a40fd8c85b370055df6420f26e81df7fa906f0e0ce1aa2af3527 \
--hash=sha256:3f904f574dc2d7aa1d96ddf2483480ecd121dc9d060108cadd8bff100b754b64 \
--hash=sha256:526f2c3bd6f311ce31f6f7b6b7d818b191f41e76bed3aaab671b716220c02d8f \
--hash=sha256:5313ee776ad65731ffa8ac585246f987d3a2bf72e6153c12add1fff22ad6e500 \
--hash=sha256:5843cc43bafad05cc710d8e31bd347ee37202462a63d32c30746e9df48cfbda2 \
--hash=sha256:76de331a07e5ae9b6490e70a9439a072b91b3167a5684510af10c2752c4ece9a \
--hash=sha256:8486f7576d15cc73509f93f47b3190f44701ea36839906369301b58c8604d5db \
--hash=sha256:8b16f1bddfdf8f7470924ab34a7b55e4c372d5340c7c1e47e7fc84a743dc541f \
--hash=sha256:966ec7d7f57521fef0fee685d71e183c9cafb358ddcfe27519dfeaf40550f247 \
--hash=sha256:989898caeb6e972979543b57547d1c28ab8af81ff8fc15921fd354c17d432749 \
--hash=sha256:9ce7981f4fbeecf93dc5cf0a5a7915e84956fd99ad3ac977c048fe0cfdb1a17e \
--hash=sha256:ad13453ab0a1dfa64a221aac8f52199efdcaa52c97134fffd7bcebed794a6f4b \
--hash=sha256:ae7efe91dcfc24126fa91e0fb69a1daf6c0e494a781ba192bb0cc62d7ab623ee \
--hash=sha256:daa6e0d657a94f20e962d4a03d833ef7af5c8e51b7c8a2d92ba6cf64a4c07ac1 \
--hash=sha256:f1eb7c896fc0d80ed534748aaf46697b6ebc8ce401f1c51666ce0b9923c3db9a
uvicorn==0.35.0 \
--hash=sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a \
--hash=sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01
@@ -1 +0,0 @@
print("Hello world")
@@ -1,2 +0,0 @@
uvicorn==0.35.0
uv==0.6.17
@@ -1,9 +0,0 @@
import { expect, test } from "@jest/globals";
import { getUvVersionFromFile } from "../../src/version/resolve";
test("ignores dependencies starting with uv", async () => {
const parsedVersion = getUvVersionFromFile(
"__tests__/fixtures/uv-in-requirements-txt-project/requirements.txt",
);
expect(parsedVersion).toBe("0.6.17");
});
@@ -1,9 +0,0 @@
import { expect, test } from "@jest/globals";
import { getUvVersionFromFile } from "../../src/version/resolve";
test("ignores dependencies starting with uv", async () => {
const parsedVersion = getUvVersionFromFile(
"__tests__/fixtures/uv-in-requirements-hash-txt-project/requirements.txt",
);
expect(parsedVersion).toBe("0.8.3");
});
@@ -1,115 +0,0 @@
jest.mock("node:fs");
jest.mock("@actions/core", () => ({
warning: jest.fn(),
}));
import fs from "node:fs";
import * as core from "@actions/core";
import { beforeEach, describe, expect, it, jest } from "@jest/globals";
import { getUvVersionFromToolVersions } from "../../src/version/tool-versions-file";
const mockedFs = fs as jest.Mocked<typeof fs>;
const mockedCore = core as jest.Mocked<typeof core>;
describe("getUvVersionFromToolVersions", () => {
beforeEach(() => {
jest.clearAllMocks();
});
it("should return undefined for non-.tool-versions files", () => {
const result = getUvVersionFromToolVersions("package.json");
expect(result).toBeUndefined();
expect(mockedFs.readFileSync).not.toHaveBeenCalled();
});
it("should return version for valid uv entry", () => {
const fileContent = "python 3.11.0\nuv 0.1.0\nnodejs 18.0.0";
mockedFs.readFileSync.mockReturnValue(fileContent);
const result = getUvVersionFromToolVersions(".tool-versions");
expect(result).toBe("0.1.0");
expect(mockedFs.readFileSync).toHaveBeenCalledWith(
".tool-versions",
"utf8",
);
});
it("should return version for uv entry with v prefix", () => {
const fileContent = "uv v0.2.0";
mockedFs.readFileSync.mockReturnValue(fileContent);
const result = getUvVersionFromToolVersions(".tool-versions");
expect(result).toBe("0.2.0");
});
it("should handle whitespace around uv entry", () => {
const fileContent = " uv 0.3.0 ";
mockedFs.readFileSync.mockReturnValue(fileContent);
const result = getUvVersionFromToolVersions(".tool-versions");
expect(result).toBe("0.3.0");
});
it("should skip commented lines", () => {
const fileContent = "# uv 0.1.0\npython 3.11.0\nuv 0.2.0";
mockedFs.readFileSync.mockReturnValue(fileContent);
const result = getUvVersionFromToolVersions(".tool-versions");
expect(result).toBe("0.2.0");
});
it("should return first matching uv version", () => {
const fileContent = "uv 0.1.0\npython 3.11.0\nuv 0.2.0";
mockedFs.readFileSync.mockReturnValue(fileContent);
const result = getUvVersionFromToolVersions(".tool-versions");
expect(result).toBe("0.1.0");
});
it("should return undefined when no uv entry found", () => {
const fileContent = "python 3.11.0\nnodejs 18.0.0";
mockedFs.readFileSync.mockReturnValue(fileContent);
const result = getUvVersionFromToolVersions(".tool-versions");
expect(result).toBeUndefined();
});
it("should return undefined for empty file", () => {
mockedFs.readFileSync.mockReturnValue("");
const result = getUvVersionFromToolVersions(".tool-versions");
expect(result).toBeUndefined();
});
it("should warn and return undefined for ref syntax", () => {
const fileContent = "uv ref:main";
mockedFs.readFileSync.mockReturnValue(fileContent);
const result = getUvVersionFromToolVersions(".tool-versions");
expect(result).toBeUndefined();
expect(mockedCore.warning).toHaveBeenCalledWith(
"The ref syntax of .tool-versions is not supported. Please use a released version instead.",
);
});
it("should handle file path with .tool-versions extension", () => {
const fileContent = "uv 0.1.0";
mockedFs.readFileSync.mockReturnValue(fileContent);
const result = getUvVersionFromToolVersions("path/to/.tool-versions");
expect(result).toBe("0.1.0");
expect(mockedFs.readFileSync).toHaveBeenCalledWith(
"path/to/.tool-versions",
"utf8",
);
});
});
+6 -27
View File
@@ -6,25 +6,18 @@ inputs:
version: version:
description: "The version of uv to install e.g., `0.5.0` Defaults to the version in pyproject.toml or 'latest'." description: "The version of uv to install e.g., `0.5.0` Defaults to the version in pyproject.toml or 'latest'."
default: "" default: ""
version-file: pyproject-file:
description: "Path to a file containing the version of uv to install. Defaults to searching for uv.toml and if not found pyproject.toml." description: "Path to a pyproject.toml"
default: ""
uv-file:
description: "Path to a uv.toml"
default: "" default: ""
python-version: python-version:
description: "The version of Python to set UV_PYTHON to" description: "The version of Python to set UV_PYTHON to"
required: false required: false
activate-environment:
description: "Use uv venv to activate a venv ready to be used by later steps. "
default: "false"
working-directory:
description: "The directory to execute all commands in and look for files such as pyproject.toml"
default: ${{ github.workspace }}
checksum: checksum:
description: "The checksum of the uv version to install" description: "The checksum of the uv version to install"
required: false required: false
server-url:
description: "(Deprecated) The server url to use when downloading uv"
required: false
default: "https://github.com"
github-token: github-token:
description: description:
"Used to increase the rate limit when retrieving versions and downloading uv." "Used to increase the rate limit when retrieving versions and downloading uv."
@@ -38,12 +31,8 @@ inputs:
"Glob pattern to match files relative to the repository root to control "Glob pattern to match files relative to the repository root to control
the cache." the cache."
default: | default: |
**/*requirements*.txt
**/*requirements*.in
**/*constraints*.txt
**/*constraints*.in
**/pyproject.toml
**/uv.lock **/uv.lock
**/requirements*.txt
cache-suffix: cache-suffix:
description: "Suffix for the cache key" description: "Suffix for the cache key"
required: false required: false
@@ -65,19 +54,9 @@ inputs:
tool-bin-dir: tool-bin-dir:
description: "Custom path to set UV_TOOL_BIN_DIR to." description: "Custom path to set UV_TOOL_BIN_DIR to."
required: false required: false
manifest-file:
description: "URL to the manifest file containing available versions and download URLs."
required: false
add-problem-matchers:
description: "Add problem matchers."
default: "true"
outputs: outputs:
uv-version: uv-version:
description: "The installed uv version. Useful when using latest." description: "The installed uv version. Useful when using latest."
uv-path:
description: "The path to the installed uv binary."
uvx-path:
description: "The path to the installed uvx binary."
cache-hit: cache-hit:
description: "A boolean value to indicate a cache entry was found" description: "A boolean value to indicate a cache entry was found"
runs: runs:
+13 -26
View File
@@ -1,34 +1,20 @@
{ {
"$schema": "https://biomejs.dev/schemas/2.1.4/schema.json", "$schema": "https://biomejs.dev/schemas/1.9.2/schema.json",
"assist": { "vcs": {
"actions": { "enabled": true,
"source": { "clientKind": "git",
"organizeImports": "on", "useIgnoreFile": false
"useSortedAttributes": "on",
"useSortedKeys": "on"
}
}
}, },
"files": { "files": {
"ignoreUnknown": false, "ignoreUnknown": false,
"includes": [ "ignore": ["dist", "lib", "node_modules"]
"**",
"!**/dist",
"!**/lib",
"!**/node_modules",
"!**/package*.json",
"!**/known-checksums.*"
]
}, },
"formatter": { "formatter": {
"enabled": true, "enabled": true,
"indentStyle": "space" "indentStyle": "space"
}, },
"javascript": { "organizeImports": {
"formatter": { "enabled": true
"quoteStyle": "double",
"trailingCommas": "all"
}
}, },
"linter": { "linter": {
"enabled": true, "enabled": true,
@@ -36,9 +22,10 @@
"recommended": true "recommended": true
} }
}, },
"vcs": { "javascript": {
"clientKind": "git", "formatter": {
"enabled": true, "quoteStyle": "double",
"useIgnoreFile": false "trailingCommas": "all"
}
} }
} }
Generated Vendored
+215 -1421
View File
@@ -220,7 +220,7 @@ function restoreCacheV2(paths, primaryKey, restoreKeys, options, enableCrossOsAr
}; };
const response = yield twirpClient.GetCacheEntryDownloadURL(request); const response = yield twirpClient.GetCacheEntryDownloadURL(request);
if (!response.ok) { if (!response.ok) {
core.debug(`Cache not found for version ${request.version} of keys: ${keys.join(', ')}`); core.debug(`Cache not found for keys: ${keys.join(', ')}`);
return undefined; return undefined;
} }
core.info(`Cache hit for: ${request.key}`); core.info(`Cache hit for: ${request.key}`);
@@ -2204,7 +2204,6 @@ const cacheUtils_1 = __nccwpck_require__(8299);
const auth_1 = __nccwpck_require__(4552); const auth_1 = __nccwpck_require__(4552);
const http_client_1 = __nccwpck_require__(4844); const http_client_1 = __nccwpck_require__(4844);
const cache_twirp_client_1 = __nccwpck_require__(1486); const cache_twirp_client_1 = __nccwpck_require__(1486);
const util_1 = __nccwpck_require__(5183);
/** /**
* This class is a wrapper around the CacheServiceClientJSON class generated by Twirp. * This class is a wrapper around the CacheServiceClientJSON class generated by Twirp.
* *
@@ -2264,7 +2263,6 @@ class CacheServiceClient {
(0, core_1.debug)(`[Response] - ${response.message.statusCode}`); (0, core_1.debug)(`[Response] - ${response.message.statusCode}`);
(0, core_1.debug)(`Headers: ${JSON.stringify(response.message.headers, null, 2)}`); (0, core_1.debug)(`Headers: ${JSON.stringify(response.message.headers, null, 2)}`);
const body = JSON.parse(rawBody); const body = JSON.parse(rawBody);
(0, util_1.maskSecretUrls)(body);
(0, core_1.debug)(`Body: ${JSON.stringify(body, null, 2)}`); (0, core_1.debug)(`Body: ${JSON.stringify(body, null, 2)}`);
if (this.isSuccessStatusCode(statusCode)) { if (this.isSuccessStatusCode(statusCode)) {
return { response, body }; return { response, body };
@@ -2446,87 +2444,6 @@ exports.getUserAgentString = getUserAgentString;
/***/ }), /***/ }),
/***/ 5183:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.maskSecretUrls = exports.maskSigUrl = void 0;
const core_1 = __nccwpck_require__(7484);
/**
* Masks the `sig` parameter in a URL and sets it as a secret.
*
* @param url - The URL containing the signature parameter to mask
* @remarks
* This function attempts to parse the provided URL and identify the 'sig' query parameter.
* If found, it registers both the raw and URL-encoded signature values as secrets using
* the Actions `setSecret` API, which prevents them from being displayed in logs.
*
* The function handles errors gracefully if URL parsing fails, logging them as debug messages.
*
* @example
* ```typescript
* // Mask a signature in an Azure SAS token URL
* maskSigUrl('https://example.blob.core.windows.net/container/file.txt?sig=abc123&se=2023-01-01');
* ```
*/
function maskSigUrl(url) {
if (!url)
return;
try {
const parsedUrl = new URL(url);
const signature = parsedUrl.searchParams.get('sig');
if (signature) {
(0, core_1.setSecret)(signature);
(0, core_1.setSecret)(encodeURIComponent(signature));
}
}
catch (error) {
(0, core_1.debug)(`Failed to parse URL: ${url} ${error instanceof Error ? error.message : String(error)}`);
}
}
exports.maskSigUrl = maskSigUrl;
/**
* Masks sensitive information in URLs containing signature parameters.
* Currently supports masking 'sig' parameters in the 'signed_upload_url'
* and 'signed_download_url' properties of the provided object.
*
* @param body - The object should contain a signature
* @remarks
* This function extracts URLs from the object properties and calls maskSigUrl
* on each one to redact sensitive signature information. The function doesn't
* modify the original object; it only marks the signatures as secrets for
* logging purposes.
*
* @example
* ```typescript
* const responseBody = {
* signed_upload_url: 'https://blob.core.windows.net/?sig=abc123',
* signed_download_url: 'https://blob.core/windows.net/?sig=def456'
* };
* maskSecretUrls(responseBody);
* ```
*/
function maskSecretUrls(body) {
if (typeof body !== 'object' || body === null) {
(0, core_1.debug)('body is not an object or is null');
return;
}
if ('signed_upload_url' in body &&
typeof body.signed_upload_url === 'string') {
maskSigUrl(body.signed_upload_url);
}
if ('signed_download_url' in body &&
typeof body.signed_download_url === 'string') {
maskSigUrl(body.signed_download_url);
}
}
exports.maskSecretUrls = maskSecretUrls;
//# sourceMappingURL=util.js.map
/***/ }),
/***/ 5321: /***/ 5321:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
@@ -13417,7 +13334,7 @@ module.exports = {
const { parseSetCookie } = __nccwpck_require__(7803) const { parseSetCookie } = __nccwpck_require__(7803)
const { stringify } = __nccwpck_require__(6338) const { stringify, getHeadersList } = __nccwpck_require__(6338)
const { webidl } = __nccwpck_require__(8134) const { webidl } = __nccwpck_require__(8134)
const { Headers } = __nccwpck_require__(9061) const { Headers } = __nccwpck_require__(9061)
@@ -13493,13 +13410,14 @@ function getSetCookies (headers) {
webidl.brandCheck(headers, Headers, { strict: false }) webidl.brandCheck(headers, Headers, { strict: false })
const cookies = headers.getSetCookie() const cookies = getHeadersList(headers).cookies
if (!cookies) { if (!cookies) {
return [] return []
} }
return cookies.map((pair) => parseSetCookie(pair)) // In older versions of undici, cookies is a list of name:value.
return cookies.map((pair) => parseSetCookie(Array.isArray(pair) ? pair[1] : pair))
} }
/** /**
@@ -13927,15 +13845,14 @@ module.exports = {
/***/ }), /***/ }),
/***/ 6338: /***/ 6338:
/***/ ((module) => { /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict"; "use strict";
/** const assert = __nccwpck_require__(2613)
* @param {string} value const { kHeadersList } = __nccwpck_require__(9411)
* @returns {boolean}
*/
function isCTLExcludingHtab (value) { function isCTLExcludingHtab (value) {
if (value.length === 0) { if (value.length === 0) {
return false return false
@@ -14196,13 +14113,31 @@ function stringify (cookie) {
return out.join('; ') 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 = { module.exports = {
isCTLExcludingHtab, isCTLExcludingHtab,
validateCookieName, stringify,
validateCookiePath, getHeadersList
validateCookieValue,
toIMFDate,
stringify
} }
@@ -18206,7 +18141,6 @@ const {
isValidHeaderName, isValidHeaderName,
isValidHeaderValue isValidHeaderValue
} = __nccwpck_require__(555) } = __nccwpck_require__(555)
const util = __nccwpck_require__(9023)
const { webidl } = __nccwpck_require__(8134) const { webidl } = __nccwpck_require__(8134)
const assert = __nccwpck_require__(2613) const assert = __nccwpck_require__(2613)
@@ -18760,9 +18694,6 @@ Object.defineProperties(Headers.prototype, {
[Symbol.toStringTag]: { [Symbol.toStringTag]: {
value: 'Headers', value: 'Headers',
configurable: true configurable: true
},
[util.inspect.custom]: {
enumerable: false
} }
}) })
@@ -27939,20 +27870,6 @@ class Pool extends PoolBase {
? { ...options.interceptors } ? { ...options.interceptors }
: undefined : undefined
this[kFactory] = factory 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] () { [kGetDispatcher] () {
@@ -36699,9 +36616,6 @@ exports.userAgentPolicy = userAgentPolicy;
/***/ 172: /***/ 172:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var CombinedStream = __nccwpck_require__(5630); var CombinedStream = __nccwpck_require__(5630);
var util = __nccwpck_require__(9023); var util = __nccwpck_require__(9023);
var path = __nccwpck_require__(6928); var path = __nccwpck_require__(6928);
@@ -36710,20 +36624,23 @@ var https = __nccwpck_require__(5692);
var parseUrl = (__nccwpck_require__(7016).parse); var parseUrl = (__nccwpck_require__(7016).parse);
var fs = __nccwpck_require__(9896); var fs = __nccwpck_require__(9896);
var Stream = (__nccwpck_require__(2203).Stream); var Stream = (__nccwpck_require__(2203).Stream);
var crypto = __nccwpck_require__(6982);
var mime = __nccwpck_require__(4096); var mime = __nccwpck_require__(4096);
var asynckit = __nccwpck_require__(1324); var asynckit = __nccwpck_require__(1324);
var setToStringTag = __nccwpck_require__(8700);
var hasOwn = __nccwpck_require__(4076);
var populate = __nccwpck_require__(2209); var populate = __nccwpck_require__(2209);
// Public API
module.exports = FormData;
// make it a Stream
util.inherits(FormData, CombinedStream);
/** /**
* Create readable "multipart/form-data" streams. * Create readable "multipart/form-data" streams.
* Can be used to submit forms * Can be used to submit forms
* and file uploads to other web applications. * and file uploads to other web applications.
* *
* @constructor * @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) { function FormData(options) {
if (!(this instanceof FormData)) { if (!(this instanceof FormData)) {
@@ -36736,39 +36653,35 @@ function FormData(options) {
CombinedStream.call(this); CombinedStream.call(this);
options = options || {}; // eslint-disable-line no-param-reassign options = options || {};
for (var option in options) { // eslint-disable-line no-restricted-syntax for (var option in options) {
this[option] = options[option]; this[option] = options[option];
} }
} }
// make it a Stream
util.inherits(FormData, CombinedStream);
FormData.LINE_BREAK = '\r\n'; FormData.LINE_BREAK = '\r\n';
FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream'; FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream';
FormData.prototype.append = function (field, value, options) { FormData.prototype.append = function(field, value, options) {
options = options || {}; // eslint-disable-line no-param-reassign
options = options || {};
// allow filename as single option // allow filename as single option
if (typeof options === 'string') { if (typeof options == 'string') {
options = { filename: options }; // eslint-disable-line no-param-reassign options = {filename: options};
} }
var append = CombinedStream.prototype.append.bind(this); var append = CombinedStream.prototype.append.bind(this);
// all that streamy business can't handle numbers // all that streamy business can't handle numbers
if (typeof value === 'number' || value == null) { if (typeof value == 'number') {
value = String(value); // eslint-disable-line no-param-reassign value = '' + value;
} }
// https://github.com/felixge/node-form-data/issues/38 // https://github.com/felixge/node-form-data/issues/38
if (Array.isArray(value)) { if (util.isArray(value)) {
/* // Please convert your array into string
* Please convert your array into string // the way web server expects it
* the way web server expects it
*/
this._error(new Error('Arrays are not supported.')); this._error(new Error('Arrays are not supported.'));
return; return;
} }
@@ -36784,17 +36697,15 @@ FormData.prototype.append = function (field, value, options) {
this._trackLength(header, value, options); this._trackLength(header, value, options);
}; };
FormData.prototype._trackLength = function (header, value, options) { FormData.prototype._trackLength = function(header, value, options) {
var valueLength = 0; var valueLength = 0;
/* // used w/ getLengthSync(), when length is known.
* used w/ getLengthSync(), when length is known. // e.g. for streaming directly from a remote server,
* e.g. for streaming directly from a remote server, // w/ a known file a size, and not wanting to wait for
* w/ a known file a size, and not wanting to wait for // incoming file to finish to get its size.
* incoming file to finish to get its size.
*/
if (options.knownLength != null) { if (options.knownLength != null) {
valueLength += Number(options.knownLength); valueLength += +options.knownLength;
} else if (Buffer.isBuffer(value)) { } else if (Buffer.isBuffer(value)) {
valueLength = value.length; valueLength = value.length;
} else if (typeof value === 'string') { } else if (typeof value === 'string') {
@@ -36804,10 +36715,12 @@ FormData.prototype._trackLength = function (header, value, options) {
this._valueLength += valueLength; this._valueLength += valueLength;
// @check why add CRLF? does this account for custom/multiple CRLFs? // @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 // empty or either doesn't have path or not an http response or not a stream
if (!value || (!value.path && !(value.readable && hasOwn(value, 'httpVersion')) && !(value instanceof Stream))) { if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) && !(value instanceof Stream))) {
return; return;
} }
@@ -36817,8 +36730,10 @@ FormData.prototype._trackLength = function (header, value, options) {
} }
}; };
FormData.prototype._lengthRetriever = function (value, callback) { FormData.prototype._lengthRetriever = function(value, callback) {
if (hasOwn(value, 'fd')) {
if (value.hasOwnProperty('fd')) {
// take read range into a account // take read range into a account
// `end` = Infinity –> read file till the end // `end` = Infinity –> read file till the end
// //
@@ -36827,52 +36742,54 @@ FormData.prototype._lengthRetriever = function (value, callback) {
// Fix it when node fixes it. // Fix it when node fixes it.
// https://github.com/joyent/node/issues/7819 // https://github.com/joyent/node/issues/7819
if (value.end != undefined && value.end != Infinity && value.start != undefined) { if (value.end != undefined && value.end != Infinity && value.start != undefined) {
// when end specified // when end specified
// no need to calculate range // no need to calculate range
// inclusive, starts with 0 // inclusive, starts with 0
callback(null, value.end + 1 - (value.start ? value.start : 0)); // eslint-disable-line callback-return callback(null, value.end + 1 - (value.start ? value.start : 0));
// not that fast snoopy // not that fast snoopy
} else { } else {
// still need to fetch file size from fs // still need to fetch file size from fs
fs.stat(value.path, function (err, stat) { fs.stat(value.path, function(err, stat) {
var fileSize;
if (err) { if (err) {
callback(err); callback(err);
return; return;
} }
// update final size based on the range options // update final size based on the range options
var fileSize = stat.size - (value.start ? value.start : 0); fileSize = stat.size - (value.start ? value.start : 0);
callback(null, fileSize); callback(null, fileSize);
}); });
} }
// or http response // or http response
} else if (hasOwn(value, 'httpVersion')) { } else if (value.hasOwnProperty('httpVersion')) {
callback(null, Number(value.headers['content-length'])); // eslint-disable-line callback-return callback(null, +value.headers['content-length']);
// or request stream http://github.com/mikeal/request // or request stream http://github.com/mikeal/request
} else if (hasOwn(value, 'httpModule')) { } else if (value.hasOwnProperty('httpModule')) {
// wait till response come back // wait till response come back
value.on('response', function (response) { value.on('response', function(response) {
value.pause(); value.pause();
callback(null, Number(response.headers['content-length'])); callback(null, +response.headers['content-length']);
}); });
value.resume(); value.resume();
// something else // something else
} else { } else {
callback('Unknown stream'); // eslint-disable-line callback-return callback('Unknown stream');
} }
}; };
FormData.prototype._multiPartHeader = function (field, value, options) { FormData.prototype._multiPartHeader = function(field, value, options) {
/* // custom header specified (as string)?
* custom header specified (as string)? // it becomes responsible for boundary
* it becomes responsible for boundary // (e.g. to handle extra CRLFs on .NET servers)
* (e.g. to handle extra CRLFs on .NET servers) if (typeof options.header == 'string') {
*/
if (typeof options.header === 'string') {
return options.header; return options.header;
} }
@@ -36880,7 +36797,7 @@ FormData.prototype._multiPartHeader = function (field, value, options) {
var contentType = this._getContentType(value, options); var contentType = this._getContentType(value, options);
var contents = ''; var contents = '';
var headers = { var headers = {
// add custom disposition as third element or keep it two elements if not // add custom disposition as third element or keep it two elements if not
'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []), 'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []),
// if no content type. allow it to be empty array // if no content type. allow it to be empty array
@@ -36888,74 +36805,77 @@ FormData.prototype._multiPartHeader = function (field, value, options) {
}; };
// allow custom headers. // allow custom headers.
if (typeof options.header === 'object') { if (typeof options.header == 'object') {
populate(headers, options.header); populate(headers, options.header);
} }
var header; var header;
for (var prop in headers) { // eslint-disable-line no-restricted-syntax for (var prop in headers) {
if (hasOwn(headers, prop)) { if (!headers.hasOwnProperty(prop)) continue;
header = headers[prop]; header = headers[prop];
// skip nullish headers. // skip nullish headers.
if (header == null) { if (header == null) {
continue; // eslint-disable-line no-restricted-syntax, no-continue continue;
} }
// convert all headers to arrays. // convert all headers to arrays.
if (!Array.isArray(header)) { if (!Array.isArray(header)) {
header = [header]; header = [header];
} }
// add non-empty headers. // add non-empty headers.
if (header.length) { if (header.length) {
contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK; contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK;
}
} }
} }
return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK; return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK;
}; };
FormData.prototype._getContentDisposition = function (value, options) { // eslint-disable-line consistent-return FormData.prototype._getContentDisposition = function(value, options) {
var filename;
var filename
, contentDisposition
;
if (typeof options.filepath === 'string') { if (typeof options.filepath === 'string') {
// custom filepath for relative paths // custom filepath for relative paths
filename = path.normalize(options.filepath).replace(/\\/g, '/'); filename = path.normalize(options.filepath).replace(/\\/g, '/');
} else if (options.filename || (value && (value.name || value.path))) { } else if (options.filename || value.name || value.path) {
/* // custom filename take precedence
* custom filename take precedence // formidable and the browser add a name property
* formidable and the browser add a name property // fs- and request- streams have path property
* fs- and request- streams have path property filename = path.basename(options.filename || value.name || value.path);
*/ } else if (value.readable && value.hasOwnProperty('httpVersion')) {
filename = path.basename(options.filename || (value && (value.name || value.path)));
} else if (value && value.readable && hasOwn(value, 'httpVersion')) {
// or try http response // or try http response
filename = path.basename(value.client._httpMessage.path || ''); filename = path.basename(value.client._httpMessage.path || '');
} }
if (filename) { if (filename) {
return 'filename="' + filename + '"'; contentDisposition = 'filename="' + filename + '"';
} }
return contentDisposition;
}; };
FormData.prototype._getContentType = function (value, options) { FormData.prototype._getContentType = function(value, options) {
// use custom content-type above all // use custom content-type above all
var contentType = options.contentType; var contentType = options.contentType;
// or try `name` from formidable, browser // or try `name` from formidable, browser
if (!contentType && value && value.name) { if (!contentType && value.name) {
contentType = mime.lookup(value.name); contentType = mime.lookup(value.name);
} }
// or try `path` from fs-, request- streams // or try `path` from fs-, request- streams
if (!contentType && value && value.path) { if (!contentType && value.path) {
contentType = mime.lookup(value.path); contentType = mime.lookup(value.path);
} }
// or if it's http-reponse // or if it's http-reponse
if (!contentType && value && value.readable && hasOwn(value, 'httpVersion')) { if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) {
contentType = value.headers['content-type']; contentType = value.headers['content-type'];
} }
@@ -36965,18 +36885,18 @@ FormData.prototype._getContentType = function (value, options) {
} }
// fallback to the default content type if `value` is not simple value // fallback to the default content type if `value` is not simple value
if (!contentType && value && typeof value === 'object') { if (!contentType && typeof value == 'object') {
contentType = FormData.DEFAULT_CONTENT_TYPE; contentType = FormData.DEFAULT_CONTENT_TYPE;
} }
return contentType; return contentType;
}; };
FormData.prototype._multiPartFooter = function () { FormData.prototype._multiPartFooter = function() {
return function (next) { return function(next) {
var footer = FormData.LINE_BREAK; var footer = FormData.LINE_BREAK;
var lastPart = this._streams.length === 0; var lastPart = (this._streams.length === 0);
if (lastPart) { if (lastPart) {
footer += this._lastBoundary(); footer += this._lastBoundary();
} }
@@ -36985,18 +36905,18 @@ FormData.prototype._multiPartFooter = function () {
}.bind(this); }.bind(this);
}; };
FormData.prototype._lastBoundary = function () { FormData.prototype._lastBoundary = function() {
return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK; return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK;
}; };
FormData.prototype.getHeaders = function (userHeaders) { FormData.prototype.getHeaders = function(userHeaders) {
var header; var header;
var formHeaders = { var formHeaders = {
'content-type': 'multipart/form-data; boundary=' + this.getBoundary() 'content-type': 'multipart/form-data; boundary=' + this.getBoundary()
}; };
for (header in userHeaders) { // eslint-disable-line no-restricted-syntax for (header in userHeaders) {
if (hasOwn(userHeaders, header)) { if (userHeaders.hasOwnProperty(header)) {
formHeaders[header.toLowerCase()] = userHeaders[header]; formHeaders[header.toLowerCase()] = userHeaders[header];
} }
} }
@@ -37004,14 +36924,11 @@ FormData.prototype.getHeaders = function (userHeaders) {
return formHeaders; 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; this._boundary = boundary;
}; };
FormData.prototype.getBoundary = function () { FormData.prototype.getBoundary = function() {
if (!this._boundary) { if (!this._boundary) {
this._generateBoundary(); this._generateBoundary();
} }
@@ -37019,55 +36936,60 @@ FormData.prototype.getBoundary = function () {
return this._boundary; return this._boundary;
}; };
FormData.prototype.getBuffer = function () { FormData.prototype.getBuffer = function() {
var dataBuffer = new Buffer.alloc(0); // eslint-disable-line new-cap var dataBuffer = new Buffer.alloc( 0 );
var boundary = this.getBoundary(); var boundary = this.getBoundary();
// Create the form content. Add Line breaks to the end of data. // Create the form content. Add Line breaks to the end of data.
for (var i = 0, len = this._streams.length; i < len; i++) { for (var i = 0, len = this._streams.length; i < len; i++) {
if (typeof this._streams[i] !== 'function') { if (typeof this._streams[i] !== 'function') {
// Add content to the buffer. // Add content to the buffer.
if (Buffer.isBuffer(this._streams[i])) { if(Buffer.isBuffer(this._streams[i])) {
dataBuffer = Buffer.concat([dataBuffer, this._streams[i]]); dataBuffer = Buffer.concat( [dataBuffer, this._streams[i]]);
} else { }else {
dataBuffer = Buffer.concat([dataBuffer, Buffer.from(this._streams[i])]); dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(this._streams[i])]);
} }
// Add break after content. // Add break after content.
if (typeof this._streams[i] !== 'string' || this._streams[i].substring(2, boundary.length + 2) !== boundary) { if (typeof this._streams[i] !== 'string' || this._streams[i].substring( 2, boundary.length + 2 ) !== boundary) {
dataBuffer = Buffer.concat([dataBuffer, Buffer.from(FormData.LINE_BREAK)]); dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(FormData.LINE_BREAK)] );
} }
} }
} }
// Add the footer and return the Buffer object. // 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. // This generates a 50 character boundary similar to those used by Firefox.
// They are optimized for boyer-moore parsing. // They are optimized for boyer-moore parsing.
this._boundary = '--------------------------' + crypto.randomBytes(12).toString('hex'); var boundary = '--------------------------';
for (var i = 0; i < 24; i++) {
boundary += Math.floor(Math.random() * 10).toString(16);
}
this._boundary = boundary;
}; };
// Note: getLengthSync DOESN'T calculate streams length // Note: getLengthSync DOESN'T calculate streams length
// As workaround one can calculate file size manually and add it as knownLength option // As workaround one can calculate file size manually
FormData.prototype.getLengthSync = function () { // and add it as knownLength option
FormData.prototype.getLengthSync = function() {
var knownLength = this._overheadLength + this._valueLength; 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) { if (this._streams.length) {
knownLength += this._lastBoundary().length; knownLength += this._lastBoundary().length;
} }
// https://github.com/form-data/form-data/issues/40 // https://github.com/form-data/form-data/issues/40
if (!this.hasKnownLength()) { if (!this.hasKnownLength()) {
/* // Some async length retrievers are present
* Some async length retrievers are present // therefore synchronous length calculation is false.
* therefore synchronous length calculation is false. // Please use getLength(callback) to get proper length
* Please use getLength(callback) to get proper length
*/
this._error(new Error('Cannot calculate proper length in synchronous way.')); this._error(new Error('Cannot calculate proper length in synchronous way.'));
} }
@@ -37077,7 +36999,7 @@ FormData.prototype.getLengthSync = function () {
// Public API to check if length of added values is known // 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/196
// https://github.com/form-data/form-data/issues/262 // https://github.com/form-data/form-data/issues/262
FormData.prototype.hasKnownLength = function () { FormData.prototype.hasKnownLength = function() {
var hasKnownLength = true; var hasKnownLength = true;
if (this._valuesToMeasure.length) { if (this._valuesToMeasure.length) {
@@ -37087,7 +37009,7 @@ FormData.prototype.hasKnownLength = function () {
return hasKnownLength; return hasKnownLength;
}; };
FormData.prototype.getLength = function (cb) { FormData.prototype.getLength = function(cb) {
var knownLength = this._overheadLength + this._valueLength; var knownLength = this._overheadLength + this._valueLength;
if (this._streams.length) { if (this._streams.length) {
@@ -37099,13 +37021,13 @@ FormData.prototype.getLength = function (cb) {
return; return;
} }
asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function (err, values) { asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) {
if (err) { if (err) {
cb(err); cb(err);
return; return;
} }
values.forEach(function (length) { values.forEach(function(length) {
knownLength += length; knownLength += length;
}); });
@@ -37113,26 +37035,31 @@ FormData.prototype.getLength = function (cb) {
}); });
}; };
FormData.prototype.submit = function (params, cb) { FormData.prototype.submit = function(params, cb) {
var request; var request
var options; , options
var defaults = { method: 'post' }; , defaults = {method: 'post'}
;
// parse provided url if it's string or treat it as options object // parse provided url if it's string
if (typeof params === 'string') { // or treat it as options object
params = parseUrl(params); // eslint-disable-line no-param-reassign if (typeof params == 'string') {
/* eslint sort-keys: 0 */
params = parseUrl(params);
options = populate({ options = populate({
port: params.port, port: params.port,
path: params.pathname, path: params.pathname,
host: params.hostname, host: params.hostname,
protocol: params.protocol protocol: params.protocol
}, defaults); }, defaults);
} else { // use custom params
// use custom params
} else {
options = populate(params, defaults); options = populate(params, defaults);
// if no port provided use default one // if no port provided use default one
if (!options.port) { if (!options.port) {
options.port = options.protocol === 'https:' ? 443 : 80; options.port = options.protocol == 'https:' ? 443 : 80;
} }
} }
@@ -37140,14 +37067,14 @@ FormData.prototype.submit = function (params, cb) {
options.headers = this.getHeaders(params.headers); options.headers = this.getHeaders(params.headers);
// https if specified, fallback to http in any other case // https if specified, fallback to http in any other case
if (options.protocol === 'https:') { if (options.protocol == 'https:') {
request = https.request(options); request = https.request(options);
} else { } else {
request = http.request(options); request = http.request(options);
} }
// get content length and fire away // get content length and fire away
this.getLength(function (err, length) { this.getLength(function(err, length) {
if (err && err !== 'Unknown stream') { if (err && err !== 'Unknown stream') {
this._error(err); this._error(err);
return; return;
@@ -37166,7 +37093,7 @@ FormData.prototype.submit = function (params, cb) {
request.removeListener('error', callback); request.removeListener('error', callback);
request.removeListener('response', onResponse); request.removeListener('response', onResponse);
return cb.call(this, error, responce); // eslint-disable-line no-invalid-this return cb.call(this, error, responce);
}; };
onResponse = callback.bind(this, null); onResponse = callback.bind(this, null);
@@ -37179,7 +37106,7 @@ FormData.prototype.submit = function (params, cb) {
return request; return request;
}; };
FormData.prototype._error = function (err) { FormData.prototype._error = function(err) {
if (!this.error) { if (!this.error) {
this.error = err; this.error = err;
this.pause(); this.pause();
@@ -37190,10 +37117,6 @@ FormData.prototype._error = function (err) {
FormData.prototype.toString = function () { FormData.prototype.toString = function () {
return '[object FormData]'; return '[object FormData]';
}; };
setToStringTag(FormData, 'FormData');
// Public API
module.exports = FormData;
/***/ }), /***/ }),
@@ -37201,13 +37124,12 @@ module.exports = FormData;
/***/ 2209: /***/ 2209:
/***/ ((module) => { /***/ ((module) => {
"use strict";
// populates missing values // populates missing values
module.exports = function (dst, src) { module.exports = function(dst, src) {
Object.keys(src).forEach(function (prop) {
dst[prop] = dst[prop] || src[prop]; // eslint-disable-line no-param-reassign Object.keys(src).forEach(function(prop)
{
dst[prop] = dst[prop] || src[prop];
}); });
return dst; return dst;
@@ -76346,7 +76268,7 @@ function expand(str, isTop) {
var isOptions = m.body.indexOf(',') >= 0; var isOptions = m.body.indexOf(',') >= 0;
if (!isSequence && !isOptions) { if (!isSequence && !isOptions) {
// {a},b} // {a},b}
if (m.post.match(/,(?!,).*\}/)) { if (m.post.match(/,.*\}/)) {
str = m.pre + '{' + m.body + escClose + m.post; str = m.pre + '{' + m.body + escClose + m.post;
return expand(str); return expand(str);
} }
@@ -76438,83 +76360,6 @@ function expand(str, isTop) {
/***/ }),
/***/ 2639:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var bind = __nccwpck_require__(7564);
var $apply = __nccwpck_require__(3945);
var $call = __nccwpck_require__(8093);
var $reflectApply = __nccwpck_require__(1330);
/** @type {import('./actualApply')} */
module.exports = $reflectApply || bind.call($call, $apply);
/***/ }),
/***/ 3945:
/***/ ((module) => {
"use strict";
/** @type {import('./functionApply')} */
module.exports = Function.prototype.apply;
/***/ }),
/***/ 8093:
/***/ ((module) => {
"use strict";
/** @type {import('./functionCall')} */
module.exports = Function.prototype.call;
/***/ }),
/***/ 8705:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var bind = __nccwpck_require__(7564);
var $TypeError = __nccwpck_require__(3314);
var $call = __nccwpck_require__(8093);
var $actualApply = __nccwpck_require__(2639);
/** @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);
};
/***/ }),
/***/ 1330:
/***/ ((module) => {
"use strict";
/** @type {import('./reflectApply')} */
module.exports = typeof Reflect !== 'undefined' && Reflect && Reflect.apply;
/***/ }), /***/ }),
/***/ 5630: /***/ 5630:
@@ -76864,1004 +76709,6 @@ DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {
}; };
/***/ }),
/***/ 6669:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var callBind = __nccwpck_require__(8705);
var gOPD = __nccwpck_require__(3170);
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;
/***/ }),
/***/ 9094:
/***/ ((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;
/***/ }),
/***/ 3056:
/***/ ((module) => {
"use strict";
/** @type {import('./eval')} */
module.exports = EvalError;
/***/ }),
/***/ 1620:
/***/ ((module) => {
"use strict";
/** @type {import('.')} */
module.exports = Error;
/***/ }),
/***/ 4585:
/***/ ((module) => {
"use strict";
/** @type {import('./range')} */
module.exports = RangeError;
/***/ }),
/***/ 6905:
/***/ ((module) => {
"use strict";
/** @type {import('./ref')} */
module.exports = ReferenceError;
/***/ }),
/***/ 105:
/***/ ((module) => {
"use strict";
/** @type {import('./syntax')} */
module.exports = SyntaxError;
/***/ }),
/***/ 3314:
/***/ ((module) => {
"use strict";
/** @type {import('./type')} */
module.exports = TypeError;
/***/ }),
/***/ 2578:
/***/ ((module) => {
"use strict";
/** @type {import('./uri')} */
module.exports = URIError;
/***/ }),
/***/ 5399:
/***/ ((module) => {
"use strict";
/** @type {import('.')} */
module.exports = Object;
/***/ }),
/***/ 8700:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var GetIntrinsic = __nccwpck_require__(8089);
var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
var hasToStringTag = __nccwpck_require__(5479)();
var hasOwn = __nccwpck_require__(4076);
var $TypeError = __nccwpck_require__(3314);
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
}
}
};
/***/ }),
/***/ 9808:
/***/ ((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;
};
/***/ }),
/***/ 7564:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var implementation = __nccwpck_require__(9808);
module.exports = Function.prototype.bind || implementation;
/***/ }),
/***/ 8089:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var undefined;
var $Object = __nccwpck_require__(5399);
var $Error = __nccwpck_require__(1620);
var $EvalError = __nccwpck_require__(3056);
var $RangeError = __nccwpck_require__(4585);
var $ReferenceError = __nccwpck_require__(6905);
var $SyntaxError = __nccwpck_require__(105);
var $TypeError = __nccwpck_require__(3314);
var $URIError = __nccwpck_require__(2578);
var abs = __nccwpck_require__(5641);
var floor = __nccwpck_require__(6171);
var max = __nccwpck_require__(7147);
var min = __nccwpck_require__(1017);
var pow = __nccwpck_require__(6947);
var round = __nccwpck_require__(2621);
var sign = __nccwpck_require__(156);
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__(3170);
var $defineProperty = __nccwpck_require__(9094);
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__(3336)();
var getProto = __nccwpck_require__(1967);
var $ObjectGPO = __nccwpck_require__(1311);
var $ReflectGPO = __nccwpck_require__(8681);
var $apply = __nccwpck_require__(3945);
var $call = __nccwpck_require__(8093);
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__(7564);
var hasOwn = __nccwpck_require__(4076);
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;
};
/***/ }),
/***/ 1311:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var $Object = __nccwpck_require__(5399);
/** @type {import('./Object.getPrototypeOf')} */
module.exports = $Object.getPrototypeOf || null;
/***/ }),
/***/ 8681:
/***/ ((module) => {
"use strict";
/** @type {import('./Reflect.getPrototypeOf')} */
module.exports = (typeof Reflect !== 'undefined' && Reflect.getPrototypeOf) || null;
/***/ }),
/***/ 1967:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var reflectGetProto = __nccwpck_require__(8681);
var originalGetProto = __nccwpck_require__(1311);
var getDunderProto = __nccwpck_require__(6669);
/** @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;
/***/ }),
/***/ 1174:
/***/ ((module) => {
"use strict";
/** @type {import('./gOPD')} */
module.exports = Object.getOwnPropertyDescriptor;
/***/ }),
/***/ 3170:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
/** @type {import('.')} */
var $gOPD = __nccwpck_require__(1174);
if ($gOPD) {
try {
$gOPD([], 'length');
} catch (e) {
// IE 8 has a broken gOPD
$gOPD = null;
}
}
module.exports = $gOPD;
/***/ }),
/***/ 3336:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var origSymbol = typeof Symbol !== 'undefined' && Symbol;
var hasSymbolSham = __nccwpck_require__(1114);
/** @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();
};
/***/ }),
/***/ 1114:
/***/ ((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;
};
/***/ }),
/***/ 5479:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var hasSymbols = __nccwpck_require__(1114);
/** @type {import('.')} */
module.exports = function hasToStringTagShams() {
return hasSymbols() && !!Symbol.toStringTag;
};
/***/ }),
/***/ 4076:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var call = Function.prototype.call;
var $hasOwn = Object.prototype.hasOwnProperty;
var bind = __nccwpck_require__(7564);
/** @type {import('.')} */
module.exports = bind.call(call, $hasOwn);
/***/ }),
/***/ 5641:
/***/ ((module) => {
"use strict";
/** @type {import('./abs')} */
module.exports = Math.abs;
/***/ }),
/***/ 6171:
/***/ ((module) => {
"use strict";
/** @type {import('./floor')} */
module.exports = Math.floor;
/***/ }),
/***/ 7044:
/***/ ((module) => {
"use strict";
/** @type {import('./isNaN')} */
module.exports = Number.isNaN || function isNaN(a) {
return a !== a;
};
/***/ }),
/***/ 7147:
/***/ ((module) => {
"use strict";
/** @type {import('./max')} */
module.exports = Math.max;
/***/ }),
/***/ 1017:
/***/ ((module) => {
"use strict";
/** @type {import('./min')} */
module.exports = Math.min;
/***/ }),
/***/ 6947:
/***/ ((module) => {
"use strict";
/** @type {import('./pow')} */
module.exports = Math.pow;
/***/ }),
/***/ 2621:
/***/ ((module) => {
"use strict";
/** @type {import('./round')} */
module.exports = Math.round;
/***/ }),
/***/ 156:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
var $isNaN = __nccwpck_require__(7044);
/** @type {import('./sign')} */
module.exports = function sign(number) {
if ($isNaN(number) || number === 0) {
return number;
}
return number < 0 ? -1 : +1;
};
/***/ }), /***/ }),
/***/ 9829: /***/ 9829:
@@ -89747,10 +88594,10 @@ exports.STATE_CACHE_MATCHED_KEY = exports.STATE_CACHE_KEY = void 0;
exports.restoreCache = restoreCache; exports.restoreCache = restoreCache;
const cache = __importStar(__nccwpck_require__(5116)); const cache = __importStar(__nccwpck_require__(5116));
const core = __importStar(__nccwpck_require__(7484)); const core = __importStar(__nccwpck_require__(7484));
const exec = __importStar(__nccwpck_require__(5236));
const hash_files_1 = __nccwpck_require__(9660);
const inputs_1 = __nccwpck_require__(9612); const inputs_1 = __nccwpck_require__(9612);
const platforms_1 = __nccwpck_require__(8361); const platforms_1 = __nccwpck_require__(8361);
const hash_files_1 = __nccwpck_require__(9660);
const exec = __importStar(__nccwpck_require__(5236));
exports.STATE_CACHE_KEY = "cache-key"; exports.STATE_CACHE_KEY = "cache-key";
exports.STATE_CACHE_MATCHED_KEY = "cache-matched-key"; exports.STATE_CACHE_MATCHED_KEY = "cache-matched-key";
const CACHE_VERSION = "1"; const CACHE_VERSION = "1";
@@ -89785,8 +88632,7 @@ async function computeKeys() {
const suffix = inputs_1.cacheSuffix ? `-${inputs_1.cacheSuffix}` : ""; const suffix = inputs_1.cacheSuffix ? `-${inputs_1.cacheSuffix}` : "";
const pythonVersion = await getPythonVersion(); const pythonVersion = await getPythonVersion();
const platform = await (0, platforms_1.getPlatform)(); const platform = await (0, platforms_1.getPlatform)();
const pruned = inputs_1.pruneCache ? "-pruned" : ""; return `setup-uv-${CACHE_VERSION}-${(0, platforms_1.getArch)()}-${platform}-${pythonVersion}${cacheDependencyPathHash}${suffix}`;
return `setup-uv-${CACHE_VERSION}-${(0, platforms_1.getArch)()}-${platform}-${pythonVersion}${pruned}${cacheDependencyPathHash}${suffix}`;
} }
async function getPythonVersion() { async function getPythonVersion() {
if (inputs_1.pythonVersion !== "") { if (inputs_1.pythonVersion !== "") {
@@ -89794,15 +88640,15 @@ async function getPythonVersion() {
} }
let output = ""; let output = "";
const options = { const options = {
silent: !core.isDebug(),
listeners: { listeners: {
stdout: (data) => { stdout: (data) => {
output += data.toString(); output += data.toString();
}, },
}, },
silent: !core.isDebug(),
}; };
try { try {
const execArgs = ["python", "find", "--directory", inputs_1.workingDirectory]; const execArgs = ["python", "find"];
await exec.exec("uv", execArgs, options); await exec.exec("uv", execArgs, options);
const pythonPath = output.trim(); const pythonPath = output.trim();
output = ""; output = "";
@@ -89871,10 +88717,10 @@ var __importStar = (this && this.__importStar) || (function () {
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.hashFiles = hashFiles; exports.hashFiles = hashFiles;
const crypto = __importStar(__nccwpck_require__(7598)); const crypto = __importStar(__nccwpck_require__(7598));
const core = __importStar(__nccwpck_require__(7484));
const fs = __importStar(__nccwpck_require__(3024)); const fs = __importStar(__nccwpck_require__(3024));
const stream = __importStar(__nccwpck_require__(7075)); const stream = __importStar(__nccwpck_require__(7075));
const util = __importStar(__nccwpck_require__(7975)); const util = __importStar(__nccwpck_require__(7975));
const core = __importStar(__nccwpck_require__(7484));
const glob_1 = __nccwpck_require__(7206); const glob_1 = __nccwpck_require__(7206);
/** /**
* Hashes files matching the given glob pattern. * Hashes files matching the given glob pattern.
@@ -89957,10 +88803,10 @@ var __importStar = (this && this.__importStar) || (function () {
})(); })();
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.run = run; exports.run = run;
const fs = __importStar(__nccwpck_require__(3024));
const cache = __importStar(__nccwpck_require__(5116)); const cache = __importStar(__nccwpck_require__(5116));
const core = __importStar(__nccwpck_require__(7484)); const core = __importStar(__nccwpck_require__(7484));
const exec = __importStar(__nccwpck_require__(5236)); const exec = __importStar(__nccwpck_require__(5236));
const fs = __importStar(__nccwpck_require__(3024));
const restore_cache_1 = __nccwpck_require__(5391); const restore_cache_1 = __nccwpck_require__(5391);
const inputs_1 = __nccwpck_require__(9612); const inputs_1 = __nccwpck_require__(9612);
async function run() { async function run() {
@@ -90068,36 +88914,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod }; return (mod && mod.__esModule) ? mod : { "default": mod };
}; };
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.addProblemMatchers = exports.manifestFile = exports.githubToken = exports.serverUrl = exports.toolDir = exports.toolBinDir = exports.ignoreEmptyWorkdir = exports.ignoreNothingToCache = exports.pruneCache = exports.cacheDependencyGlob = exports.cacheLocalPath = exports.cacheSuffix = exports.enableCache = exports.checkSum = exports.activateEnvironment = exports.pythonVersion = exports.versionFile = exports.version = exports.workingDirectory = void 0; exports.githubToken = exports.toolDir = exports.toolBinDir = exports.ignoreEmptyWorkdir = exports.ignoreNothingToCache = exports.pruneCache = exports.cacheDependencyGlob = exports.cacheLocalPath = exports.cacheSuffix = exports.enableCache = exports.checkSum = exports.pythonVersion = exports.uvFile = exports.pyProjectFile = exports.version = void 0;
const node_path_1 = __importDefault(__nccwpck_require__(6760));
const core = __importStar(__nccwpck_require__(7484)); const core = __importStar(__nccwpck_require__(7484));
exports.workingDirectory = core.getInput("working-directory"); const node_path_1 = __importDefault(__nccwpck_require__(6760));
exports.version = core.getInput("version"); exports.version = core.getInput("version");
exports.versionFile = getVersionFile(); exports.pyProjectFile = core.getInput("pyproject-file");
exports.uvFile = core.getInput("uv-file");
exports.pythonVersion = core.getInput("python-version"); exports.pythonVersion = core.getInput("python-version");
exports.activateEnvironment = core.getBooleanInput("activate-environment");
exports.checkSum = core.getInput("checksum"); exports.checkSum = core.getInput("checksum");
exports.enableCache = getEnableCache(); exports.enableCache = getEnableCache();
exports.cacheSuffix = core.getInput("cache-suffix") || ""; exports.cacheSuffix = core.getInput("cache-suffix") || "";
exports.cacheLocalPath = getCacheLocalPath(); exports.cacheLocalPath = getCacheLocalPath();
exports.cacheDependencyGlob = getCacheDependencyGlob(); exports.cacheDependencyGlob = core.getInput("cache-dependency-glob");
exports.pruneCache = core.getInput("prune-cache") === "true"; exports.pruneCache = core.getInput("prune-cache") === "true";
exports.ignoreNothingToCache = core.getInput("ignore-nothing-to-cache") === "true"; exports.ignoreNothingToCache = core.getInput("ignore-nothing-to-cache") === "true";
exports.ignoreEmptyWorkdir = core.getInput("ignore-empty-workdir") === "true"; exports.ignoreEmptyWorkdir = core.getInput("ignore-empty-workdir") === "true";
exports.toolBinDir = getToolBinDir(); exports.toolBinDir = getToolBinDir();
exports.toolDir = getToolDir(); exports.toolDir = getToolDir();
exports.serverUrl = core.getInput("server-url");
exports.githubToken = core.getInput("github-token"); exports.githubToken = core.getInput("github-token");
exports.manifestFile = getManifestFile();
exports.addProblemMatchers = core.getInput("add-problem-matchers") === "true";
function getVersionFile() {
const versionFileInput = core.getInput("version-file");
if (versionFileInput !== "") {
const tildeExpanded = expandTilde(versionFileInput);
return resolveRelativePath(tildeExpanded);
}
return versionFileInput;
}
function getEnableCache() { function getEnableCache() {
const enableCacheInput = core.getInput("enable-cache"); const enableCacheInput = core.getInput("enable-cache");
if (enableCacheInput === "auto") { if (enableCacheInput === "auto") {
@@ -90108,8 +88942,7 @@ function getEnableCache() {
function getToolBinDir() { function getToolBinDir() {
const toolBinDirInput = core.getInput("tool-bin-dir"); const toolBinDirInput = core.getInput("tool-bin-dir");
if (toolBinDirInput !== "") { if (toolBinDirInput !== "") {
const tildeExpanded = expandTilde(toolBinDirInput); return expandTilde(toolBinDirInput);
return resolveRelativePath(tildeExpanded);
} }
if (process.platform === "win32") { if (process.platform === "win32") {
if (process.env.RUNNER_TEMP !== undefined) { if (process.env.RUNNER_TEMP !== undefined) {
@@ -90122,8 +88955,7 @@ function getToolBinDir() {
function getToolDir() { function getToolDir() {
const toolDirInput = core.getInput("tool-dir"); const toolDirInput = core.getInput("tool-dir");
if (toolDirInput !== "") { if (toolDirInput !== "") {
const tildeExpanded = expandTilde(toolDirInput); return expandTilde(toolDirInput);
return resolveRelativePath(tildeExpanded);
} }
if (process.platform === "win32") { if (process.platform === "win32") {
if (process.env.RUNNER_TEMP !== undefined) { if (process.env.RUNNER_TEMP !== undefined) {
@@ -90136,31 +88968,12 @@ function getToolDir() {
function getCacheLocalPath() { function getCacheLocalPath() {
const cacheLocalPathInput = core.getInput("cache-local-path"); const cacheLocalPathInput = core.getInput("cache-local-path");
if (cacheLocalPathInput !== "") { if (cacheLocalPathInput !== "") {
const tildeExpanded = expandTilde(cacheLocalPathInput); return expandTilde(cacheLocalPathInput);
return resolveRelativePath(tildeExpanded);
} }
if (process.env.RUNNER_ENVIRONMENT === "github-hosted") { if (process.env.RUNNER_TEMP !== undefined) {
if (process.env.RUNNER_TEMP !== undefined) { return `${process.env.RUNNER_TEMP}${node_path_1.default.sep}setup-uv-cache`;
return `${process.env.RUNNER_TEMP}${node_path_1.default.sep}setup-uv-cache`;
}
throw Error("Could not determine UV_CACHE_DIR. Please make sure RUNNER_TEMP is set or provide the cache-local-path input");
} }
if (process.platform === "win32") { throw Error("Could not determine UV_CACHE_DIR. Please make sure RUNNER_TEMP is set or provide the cache-local-path input");
return `${process.env.APPDATA}${node_path_1.default.sep}uv${node_path_1.default.sep}cache`;
}
return `${process.env.HOME}${node_path_1.default.sep}.cache${node_path_1.default.sep}uv`;
}
function getCacheDependencyGlob() {
const cacheDependencyGlobInput = core.getInput("cache-dependency-glob");
if (cacheDependencyGlobInput !== "") {
return cacheDependencyGlobInput
.split("\n")
.map((part) => part.trim())
.map((part) => expandTilde(part))
.map((part) => resolveRelativePath(part))
.join("\n");
}
return cacheDependencyGlobInput;
} }
function expandTilde(input) { function expandTilde(input) {
if (input.startsWith("~")) { if (input.startsWith("~")) {
@@ -90168,25 +88981,6 @@ function expandTilde(input) {
} }
return input; return input;
} }
function resolveRelativePath(inputPath) {
if (node_path_1.default.isAbsolute(inputPath)) {
return inputPath;
}
let absolutePath = inputPath;
if (absolutePath.startsWith("./")) {
absolutePath = absolutePath.substring(2);
}
absolutePath = `${exports.workingDirectory}${node_path_1.default.sep}${absolutePath}`;
core.debug(`Resolving relative path ${inputPath} to ${absolutePath}`);
return absolutePath;
}
function getManifestFile() {
const manifestFileInput = core.getInput("manifest-file");
if (manifestFileInput !== "") {
return manifestFileInput;
}
return undefined;
}
/***/ }), /***/ }),
@@ -90232,16 +89026,16 @@ var __importStar = (this && this.__importStar) || (function () {
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getArch = getArch; exports.getArch = getArch;
exports.getPlatform = getPlatform; exports.getPlatform = getPlatform;
const core = __importStar(__nccwpck_require__(7484));
const exec = __importStar(__nccwpck_require__(5236)); const exec = __importStar(__nccwpck_require__(5236));
const core = __importStar(__nccwpck_require__(7484));
function getArch() { function getArch() {
const arch = process.arch; const arch = process.arch;
const archMapping = { const archMapping = {
arm64: "aarch64",
ia32: "i686", ia32: "i686",
ppc64: "powerpc64le",
s390x: "s390x",
x64: "x86_64", x64: "x86_64",
arm64: "aarch64",
s390x: "s390x",
ppc64: "powerpc64le",
}; };
if (arch in archMapping) { if (arch in archMapping) {
return archMapping[arch]; return archMapping[arch];
@@ -90250,8 +89044,8 @@ function getArch() {
async function getPlatform() { async function getPlatform() {
const processPlatform = process.platform; const processPlatform = process.platform;
const platformMapping = { const platformMapping = {
darwin: "apple-darwin",
linux: "unknown-linux-gnu", linux: "unknown-linux-gnu",
darwin: "apple-darwin",
win32: "pc-windows-msvc", win32: "pc-windows-msvc",
}; };
if (processPlatform in platformMapping) { if (processPlatform in platformMapping) {
@@ -90267,16 +89061,16 @@ async function isMuslOs() {
let stdOutput = ""; let stdOutput = "";
let errOutput = ""; let errOutput = "";
const options = { const options = {
ignoreReturnCode: true, silent: !core.isDebug(),
listeners: { listeners: {
stderr: (data) => {
errOutput += data.toString();
},
stdout: (data) => { stdout: (data) => {
stdOutput += data.toString(); stdOutput += data.toString();
}, },
stderr: (data) => {
errOutput += data.toString();
},
}, },
silent: !core.isDebug(), ignoreReturnCode: true,
}; };
try { try {
const execArgs = ["--version"]; const execArgs = ["--version"];
@@ -92202,7 +90996,7 @@ module.exports = parseParams
/***/ ((module) => { /***/ ((module) => {
"use strict"; "use strict";
module.exports = /*#__PURE__*/JSON.parse('{"name":"@actions/cache","version":"4.0.3","preview":true,"description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","main":"lib/cache.js","types":"lib/cache.d.ts","directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^1.11.1","@actions/exec":"^1.0.1","@actions/glob":"^0.1.0","@actions/http-client":"^2.1.1","@actions/io":"^1.0.1","@azure/abort-controller":"^1.1.0","@azure/ms-rest-js":"^2.6.0","@azure/storage-blob":"^12.13.0","@protobuf-ts/plugin":"^2.9.4","semver":"^6.3.1"},"devDependencies":{"@types/node":"^22.13.9","@types/semver":"^6.0.0","typescript":"^5.2.2"}}'); module.exports = /*#__PURE__*/JSON.parse('{"name":"@actions/cache","version":"4.0.2","preview":true,"description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","main":"lib/cache.js","types":"lib/cache.d.ts","directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^1.11.1","@actions/exec":"^1.0.1","@actions/glob":"^0.1.0","@actions/http-client":"^2.1.1","@actions/io":"^1.0.1","@azure/abort-controller":"^1.1.0","@azure/ms-rest-js":"^2.6.0","@azure/storage-blob":"^12.13.0","@protobuf-ts/plugin":"^2.9.4","semver":"^6.3.1"},"devDependencies":{"@types/semver":"^6.0.0","typescript":"^5.2.2"}}');
/***/ }), /***/ }),
Generated Vendored
+1329 -6254
View File
File diff suppressed because it is too large Load Diff
+1010 -3709
View File
@@ -3021,7 +3021,7 @@ module.exports = Agent
/***/ }), /***/ }),
/***/ 9318: /***/ 6937:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
const { addAbortListener } = __nccwpck_require__(1544) const { addAbortListener } = __nccwpck_require__(1544)
@@ -3091,7 +3091,7 @@ module.exports = {
const { AsyncResource } = __nccwpck_require__(290) const { AsyncResource } = __nccwpck_require__(290)
const { InvalidArgumentError, RequestAbortedError, SocketError } = __nccwpck_require__(8091) const { InvalidArgumentError, RequestAbortedError, SocketError } = __nccwpck_require__(8091)
const util = __nccwpck_require__(1544) const util = __nccwpck_require__(1544)
const { addSignal, removeSignal } = __nccwpck_require__(9318) const { addSignal, removeSignal } = __nccwpck_require__(6937)
class ConnectHandler extends AsyncResource { class ConnectHandler extends AsyncResource {
constructor (opts, callback) { constructor (opts, callback) {
@@ -3212,7 +3212,7 @@ const {
} = __nccwpck_require__(8091) } = __nccwpck_require__(8091)
const util = __nccwpck_require__(1544) const util = __nccwpck_require__(1544)
const { AsyncResource } = __nccwpck_require__(290) const { AsyncResource } = __nccwpck_require__(290)
const { addSignal, removeSignal } = __nccwpck_require__(9318) const { addSignal, removeSignal } = __nccwpck_require__(6937)
const assert = __nccwpck_require__(2613) const assert = __nccwpck_require__(2613)
const kResume = Symbol('resume') const kResume = Symbol('resume')
@@ -3465,7 +3465,7 @@ const {
const util = __nccwpck_require__(1544) const util = __nccwpck_require__(1544)
const { getResolveErrorBodyCallback } = __nccwpck_require__(8447) const { getResolveErrorBodyCallback } = __nccwpck_require__(8447)
const { AsyncResource } = __nccwpck_require__(290) const { AsyncResource } = __nccwpck_require__(290)
const { addSignal, removeSignal } = __nccwpck_require__(9318) const { addSignal, removeSignal } = __nccwpck_require__(6937)
class RequestHandler extends AsyncResource { class RequestHandler extends AsyncResource {
constructor (opts, callback) { constructor (opts, callback) {
@@ -3654,7 +3654,7 @@ const {
const util = __nccwpck_require__(1544) const util = __nccwpck_require__(1544)
const { getResolveErrorBodyCallback } = __nccwpck_require__(8447) const { getResolveErrorBodyCallback } = __nccwpck_require__(8447)
const { AsyncResource } = __nccwpck_require__(290) const { AsyncResource } = __nccwpck_require__(290)
const { addSignal, removeSignal } = __nccwpck_require__(9318) const { addSignal, removeSignal } = __nccwpck_require__(6937)
class StreamHandler extends AsyncResource { class StreamHandler extends AsyncResource {
constructor (opts, factory, callback) { constructor (opts, factory, callback) {
@@ -3876,7 +3876,7 @@ module.exports = stream
const { InvalidArgumentError, RequestAbortedError, SocketError } = __nccwpck_require__(8091) const { InvalidArgumentError, RequestAbortedError, SocketError } = __nccwpck_require__(8091)
const { AsyncResource } = __nccwpck_require__(290) const { AsyncResource } = __nccwpck_require__(290)
const util = __nccwpck_require__(1544) const util = __nccwpck_require__(1544)
const { addSignal, removeSignal } = __nccwpck_require__(9318) const { addSignal, removeSignal } = __nccwpck_require__(6937)
const assert = __nccwpck_require__(2613) const assert = __nccwpck_require__(2613)
class UpgradeHandler extends AsyncResource { class UpgradeHandler extends AsyncResource {
@@ -8018,7 +8018,7 @@ module.exports = {
const { parseSetCookie } = __nccwpck_require__(7803) const { parseSetCookie } = __nccwpck_require__(7803)
const { stringify } = __nccwpck_require__(6338) const { stringify, getHeadersList } = __nccwpck_require__(6338)
const { webidl } = __nccwpck_require__(8134) const { webidl } = __nccwpck_require__(8134)
const { Headers } = __nccwpck_require__(9061) const { Headers } = __nccwpck_require__(9061)
@@ -8094,13 +8094,14 @@ function getSetCookies (headers) {
webidl.brandCheck(headers, Headers, { strict: false }) webidl.brandCheck(headers, Headers, { strict: false })
const cookies = headers.getSetCookie() const cookies = getHeadersList(headers).cookies
if (!cookies) { if (!cookies) {
return [] return []
} }
return cookies.map((pair) => parseSetCookie(pair)) // In older versions of undici, cookies is a list of name:value.
return cookies.map((pair) => parseSetCookie(Array.isArray(pair) ? pair[1] : pair))
} }
/** /**
@@ -8528,15 +8529,14 @@ module.exports = {
/***/ }), /***/ }),
/***/ 6338: /***/ 6338:
/***/ ((module) => { /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict"; "use strict";
/** const assert = __nccwpck_require__(2613)
* @param {string} value const { kHeadersList } = __nccwpck_require__(9411)
* @returns {boolean}
*/
function isCTLExcludingHtab (value) { function isCTLExcludingHtab (value) {
if (value.length === 0) { if (value.length === 0) {
return false return false
@@ -8797,13 +8797,31 @@ function stringify (cookie) {
return out.join('; ') 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 = { module.exports = {
isCTLExcludingHtab, isCTLExcludingHtab,
validateCookieName, stringify,
validateCookiePath, getHeadersList
validateCookieValue,
toIMFDate,
stringify
} }
@@ -12807,7 +12825,6 @@ const {
isValidHeaderName, isValidHeaderName,
isValidHeaderValue isValidHeaderValue
} = __nccwpck_require__(555) } = __nccwpck_require__(555)
const util = __nccwpck_require__(9023)
const { webidl } = __nccwpck_require__(8134) const { webidl } = __nccwpck_require__(8134)
const assert = __nccwpck_require__(2613) const assert = __nccwpck_require__(2613)
@@ -13361,9 +13378,6 @@ Object.defineProperties(Headers.prototype, {
[Symbol.toStringTag]: { [Symbol.toStringTag]: {
value: 'Headers', value: 'Headers',
configurable: true configurable: true
},
[util.inspect.custom]: {
enumerable: false
} }
}) })
@@ -22540,20 +22554,6 @@ class Pool extends PoolBase {
? { ...options.interceptors } ? { ...options.interceptors }
: undefined : undefined
this[kFactory] = factory 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] () { [kGetDispatcher] () {
@@ -25393,7 +25393,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
}; };
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports._readLinuxVersionFile = exports._getOsVersion = exports._findMatch = void 0; exports._readLinuxVersionFile = exports._getOsVersion = exports._findMatch = void 0;
const semver = __importStar(__nccwpck_require__(6937)); const semver = __importStar(__nccwpck_require__(9318));
const core_1 = __nccwpck_require__(7484); const core_1 = __nccwpck_require__(7484);
// needs to be require for core node modules to be mocked // needs to be require for core node modules to be mocked
/* eslint @typescript-eslint/no-require-imports: 0 */ /* eslint @typescript-eslint/no-require-imports: 0 */
@@ -25631,7 +25631,7 @@ const mm = __importStar(__nccwpck_require__(8036));
const os = __importStar(__nccwpck_require__(857)); const os = __importStar(__nccwpck_require__(857));
const path = __importStar(__nccwpck_require__(6928)); const path = __importStar(__nccwpck_require__(6928));
const httpm = __importStar(__nccwpck_require__(4844)); const httpm = __importStar(__nccwpck_require__(4844));
const semver = __importStar(__nccwpck_require__(6937)); const semver = __importStar(__nccwpck_require__(9318));
const stream = __importStar(__nccwpck_require__(2203)); const stream = __importStar(__nccwpck_require__(2203));
const util = __importStar(__nccwpck_require__(9023)); const util = __importStar(__nccwpck_require__(9023));
const assert_1 = __nccwpck_require__(2613); const assert_1 = __nccwpck_require__(2613);
@@ -26257,7 +26257,7 @@ function _unique(values) {
/***/ }), /***/ }),
/***/ 6937: /***/ 9318:
/***/ ((module, exports) => { /***/ ((module, exports) => {
exports = module.exports = SemVer exports = module.exports = SemVer
@@ -28201,7 +28201,6 @@ const Agent = __nccwpck_require__(7405)
const ProxyAgent = __nccwpck_require__(6672) const ProxyAgent = __nccwpck_require__(6672)
const EnvHttpProxyAgent = __nccwpck_require__(3137) const EnvHttpProxyAgent = __nccwpck_require__(3137)
const RetryAgent = __nccwpck_require__(50) const RetryAgent = __nccwpck_require__(50)
const H2CClient = __nccwpck_require__(6815)
const errors = __nccwpck_require__(8707) const errors = __nccwpck_require__(8707)
const util = __nccwpck_require__(3440) const util = __nccwpck_require__(3440)
const { InvalidArgumentError } = errors const { InvalidArgumentError } = errors
@@ -28211,7 +28210,6 @@ const MockClient = __nccwpck_require__(7365)
const { MockCallHistory, MockCallHistoryLog } = __nccwpck_require__(431) const { MockCallHistory, MockCallHistoryLog } = __nccwpck_require__(431)
const MockAgent = __nccwpck_require__(7501) const MockAgent = __nccwpck_require__(7501)
const MockPool = __nccwpck_require__(4004) const MockPool = __nccwpck_require__(4004)
const SnapshotAgent = __nccwpck_require__(5095)
const mockErrors = __nccwpck_require__(2429) const mockErrors = __nccwpck_require__(2429)
const RetryHandler = __nccwpck_require__(7816) const RetryHandler = __nccwpck_require__(7816)
const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(2581) const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(2581)
@@ -28228,7 +28226,6 @@ module.exports.Agent = Agent
module.exports.ProxyAgent = ProxyAgent module.exports.ProxyAgent = ProxyAgent
module.exports.EnvHttpProxyAgent = EnvHttpProxyAgent module.exports.EnvHttpProxyAgent = EnvHttpProxyAgent
module.exports.RetryAgent = RetryAgent module.exports.RetryAgent = RetryAgent
module.exports.H2CClient = H2CClient
module.exports.RetryHandler = RetryHandler module.exports.RetryHandler = RetryHandler
module.exports.DecoratorHandler = DecoratorHandler module.exports.DecoratorHandler = DecoratorHandler
@@ -28351,12 +28348,10 @@ module.exports.parseMIMEType = parseMIMEType
module.exports.serializeAMimeType = serializeAMimeType module.exports.serializeAMimeType = serializeAMimeType
const { CloseEvent, ErrorEvent, MessageEvent } = __nccwpck_require__(5188) const { CloseEvent, ErrorEvent, MessageEvent } = __nccwpck_require__(5188)
const { WebSocket, ping } = __nccwpck_require__(3726) module.exports.WebSocket = __nccwpck_require__(3726).WebSocket
module.exports.WebSocket = WebSocket
module.exports.CloseEvent = CloseEvent module.exports.CloseEvent = CloseEvent
module.exports.ErrorEvent = ErrorEvent module.exports.ErrorEvent = ErrorEvent
module.exports.MessageEvent = MessageEvent module.exports.MessageEvent = MessageEvent
module.exports.ping = ping
module.exports.WebSocketStream = __nccwpck_require__(2873).WebSocketStream module.exports.WebSocketStream = __nccwpck_require__(2873).WebSocketStream
module.exports.WebSocketError = __nccwpck_require__(6919).WebSocketError module.exports.WebSocketError = __nccwpck_require__(6919).WebSocketError
@@ -28372,28 +28367,12 @@ module.exports.MockCallHistory = MockCallHistory
module.exports.MockCallHistoryLog = MockCallHistoryLog module.exports.MockCallHistoryLog = MockCallHistoryLog
module.exports.MockPool = MockPool module.exports.MockPool = MockPool
module.exports.MockAgent = MockAgent module.exports.MockAgent = MockAgent
module.exports.SnapshotAgent = SnapshotAgent
module.exports.mockErrors = mockErrors module.exports.mockErrors = mockErrors
const { EventSource } = __nccwpck_require__(1238) const { EventSource } = __nccwpck_require__(1238)
module.exports.EventSource = EventSource module.exports.EventSource = EventSource
function install () {
globalThis.fetch = module.exports.fetch
globalThis.Headers = module.exports.Headers
globalThis.Response = module.exports.Response
globalThis.Request = module.exports.Request
globalThis.FormData = module.exports.FormData
globalThis.WebSocket = module.exports.WebSocket
globalThis.CloseEvent = module.exports.CloseEvent
globalThis.ErrorEvent = module.exports.ErrorEvent
globalThis.MessageEvent = module.exports.MessageEvent
globalThis.EventSource = module.exports.EventSource
}
module.exports.install = install
/***/ }), /***/ }),
@@ -29172,7 +29151,7 @@ class StreamHandler extends AsyncResource {
const { callback, res, opaque, trailers, abort } = this const { callback, res, opaque, trailers, abort } = this
this.res = null this.res = null
if (err || !res?.readable) { if (err || !res.readable) {
util.destroy(res, err) util.destroy(res, err)
} }
@@ -29403,6 +29382,8 @@ module.exports.connect = __nccwpck_require__(2279)
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict"; "use strict";
// Ported from https://github.com/nodejs/undici/pull/907
const assert = __nccwpck_require__(4589) const assert = __nccwpck_require__(4589)
@@ -29453,32 +29434,23 @@ class BodyReadable extends Readable {
this[kAbort] = abort this[kAbort] = abort
/** @type {Consume | null} */ /**
* @type {Consume | null}
*/
this[kConsume] = null this[kConsume] = null
/** @type {number} */
this[kBytesRead] = 0 this[kBytesRead] = 0
/**
/** @type {ReadableStream|null} */ * @type {ReadableStream|null}
*/
this[kBody] = null this[kBody] = null
/** @type {boolean} */
this[kUsed] = false this[kUsed] = false
/** @type {string} */
this[kContentType] = contentType this[kContentType] = contentType
/** @type {number|null} */
this[kContentLength] = Number.isFinite(contentLength) ? contentLength : null this[kContentLength] = Number.isFinite(contentLength) ? contentLength : null
/** // Is stream being consumed through Readable API?
* Is stream being consumed through Readable API? // This is an optimization so that we avoid checking
* This is an optimization so that we avoid checking // for 'data' and 'readable' listeners in the hot path
* for 'data' and 'readable' listeners in the hot path // inside push().
* inside push().
*
* @type {boolean}
*/
this[kReading] = false this[kReading] = false
} }
@@ -29501,14 +29473,16 @@ class BodyReadable extends Readable {
// promise (i.e micro tick) for installing an 'error' listener will // promise (i.e micro tick) for installing an 'error' listener will
// never get a chance and will always encounter an unhandled exception. // never get a chance and will always encounter an unhandled exception.
if (!this[kUsed]) { if (!this[kUsed]) {
setImmediate(callback, err) setImmediate(() => {
callback(err)
})
} else { } else {
callback(err) callback(err)
} }
} }
/** /**
* @param {string|symbol} event * @param {string} event
* @param {(...args: any[]) => void} listener * @param {(...args: any[]) => void} listener
* @returns {this} * @returns {this}
*/ */
@@ -29521,7 +29495,7 @@ class BodyReadable extends Readable {
} }
/** /**
* @param {string|symbol} event * @param {string} event
* @param {(...args: any[]) => void} listener * @param {(...args: any[]) => void} listener
* @returns {this} * @returns {this}
*/ */
@@ -29559,14 +29533,12 @@ class BodyReadable extends Readable {
* @returns {boolean} * @returns {boolean}
*/ */
push (chunk) { push (chunk) {
if (chunk) { this[kBytesRead] += chunk ? chunk.length : 0
this[kBytesRead] += chunk.length
if (this[kConsume]) {
consumePush(this[kConsume], chunk)
return this[kReading] ? super.push(chunk) : true
}
}
if (this[kConsume] && chunk !== null) {
consumePush(this[kConsume], chunk)
return this[kReading] ? super.push(chunk) : true
}
return super.push(chunk) return super.push(chunk)
} }
@@ -29752,23 +29724,9 @@ function isUnusable (bodyReadable) {
return util.isDisturbed(bodyReadable) || isLocked(bodyReadable) return util.isDisturbed(bodyReadable) || isLocked(bodyReadable)
} }
/**
* @typedef {'text' | 'json' | 'blob' | 'bytes' | 'arrayBuffer'} ConsumeType
*/
/**
* @template {ConsumeType} T
* @typedef {T extends 'text' ? string :
* T extends 'json' ? unknown :
* T extends 'blob' ? Blob :
* T extends 'arrayBuffer' ? ArrayBuffer :
* T extends 'bytes' ? Uint8Array :
* never
* } ConsumeReturnType
*/
/** /**
* @typedef {object} Consume * @typedef {object} Consume
* @property {ConsumeType} type * @property {string} type
* @property {BodyReadable} stream * @property {BodyReadable} stream
* @property {((value?: any) => void)} resolve * @property {((value?: any) => void)} resolve
* @property {((err: Error) => void)} reject * @property {((err: Error) => void)} reject
@@ -29777,10 +29735,9 @@ function isUnusable (bodyReadable) {
*/ */
/** /**
* @template {ConsumeType} T
* @param {BodyReadable} stream * @param {BodyReadable} stream
* @param {T} type * @param {string} type
* @returns {Promise<ConsumeReturnType<T>>} * @returns {Promise<any>}
*/ */
function consume (stream, type) { function consume (stream, type) {
assert(!stream[kConsume]) assert(!stream[kConsume])
@@ -29790,7 +29747,9 @@ function consume (stream, type) {
const rState = stream._readableState const rState = stream._readableState
if (rState.destroyed && rState.closeEmitted === false) { if (rState.destroyed && rState.closeEmitted === false) {
stream stream
.on('error', reject) .on('error', err => {
reject(err)
})
.on('close', () => { .on('close', () => {
reject(new TypeError('unusable')) reject(new TypeError('unusable'))
}) })
@@ -29865,7 +29824,7 @@ function consumeStart (consume) {
/** /**
* @param {Buffer[]} chunks * @param {Buffer[]} chunks
* @param {number} length * @param {number} length
* @param {BufferEncoding} [encoding='utf8'] * @param {BufferEncoding} encoding
* @returns {string} * @returns {string}
*/ */
function chunksDecode (chunks, length, encoding) { function chunksDecode (chunks, length, encoding) {
@@ -29992,7 +29951,6 @@ module.exports = {
const { Writable } = __nccwpck_require__(7075) const { Writable } = __nccwpck_require__(7075)
const { EventEmitter } = __nccwpck_require__(8474)
const { assertCacheKey, assertCacheValue } = __nccwpck_require__(7659) const { assertCacheKey, assertCacheValue } = __nccwpck_require__(7659)
/** /**
@@ -30004,23 +29962,20 @@ const { assertCacheKey, assertCacheValue } = __nccwpck_require__(7659)
/** /**
* @implements {CacheStore} * @implements {CacheStore}
* @extends {EventEmitter}
*/ */
class MemoryCacheStore extends EventEmitter { class MemoryCacheStore {
#maxCount = 1024 #maxCount = Infinity
#maxSize = 104857600 // 100MB #maxSize = Infinity
#maxEntrySize = 5242880 // 5MB #maxEntrySize = Infinity
#size = 0 #size = 0
#count = 0 #count = 0
#entries = new Map() #entries = new Map()
#hasEmittedMaxSizeEvent = false
/** /**
* @param {import('../../types/cache-interceptor.d.ts').default.MemoryCacheStoreOpts | undefined} [opts] * @param {import('../../types/cache-interceptor.d.ts').default.MemoryCacheStoreOpts | undefined} [opts]
*/ */
constructor (opts) { constructor (opts) {
super()
if (opts) { if (opts) {
if (typeof opts !== 'object') { if (typeof opts !== 'object') {
throw new TypeError('MemoryCacheStore options must be an object') throw new TypeError('MemoryCacheStore options must be an object')
@@ -30061,22 +30016,6 @@ class MemoryCacheStore extends EventEmitter {
} }
} }
/**
* Get the current size of the cache in bytes
* @returns {number} The current size of the cache in bytes
*/
get size () {
return this.#size
}
/**
* Check if the cache is full (either max size or max count reached)
* @returns {boolean} True if the cache is full, false otherwise
*/
isFull () {
return this.#size >= this.#maxSize || this.#count >= this.#maxCount
}
/** /**
* @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} req * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} req
* @returns {import('../../types/cache-interceptor.d.ts').default.GetResult | undefined} * @returns {import('../../types/cache-interceptor.d.ts').default.GetResult | undefined}
@@ -30087,9 +30026,17 @@ class MemoryCacheStore extends EventEmitter {
const topLevelKey = `${key.origin}:${key.path}` const topLevelKey = `${key.origin}:${key.path}`
const now = Date.now() const now = Date.now()
const entries = this.#entries.get(topLevelKey) const entry = this.#entries.get(topLevelKey)?.find((entry) => (
entry.deleteAt > now &&
entry.method === key.method &&
(entry.vary == null || Object.keys(entry.vary).every(headerName => {
if (entry.vary[headerName] === null) {
return key.headers[headerName] === undefined
}
const entry = entries ? findEntry(key, entries, now) : null return entry.vary[headerName] === key.headers[headerName]
}))
))
return entry == null return entry == null
? undefined ? undefined
@@ -30143,32 +30090,12 @@ class MemoryCacheStore extends EventEmitter {
entries = [] entries = []
store.#entries.set(topLevelKey, entries) store.#entries.set(topLevelKey, entries)
} }
const previousEntry = findEntry(key, entries, Date.now()) entries.push(entry)
if (previousEntry) {
const index = entries.indexOf(previousEntry)
entries.splice(index, 1, entry)
store.#size -= previousEntry.size
} else {
entries.push(entry)
store.#count += 1
}
store.#size += entry.size store.#size += entry.size
store.#count += 1
// Check if cache is full and emit event if needed
if (store.#size > store.#maxSize || store.#count > store.#maxCount) { if (store.#size > store.#maxSize || store.#count > store.#maxCount) {
// Emit maxSizeExceeded event if we haven't already
if (!store.#hasEmittedMaxSizeEvent) {
store.emit('maxSizeExceeded', {
size: store.#size,
maxSize: store.#maxSize,
count: store.#count,
maxCount: store.#maxCount
})
store.#hasEmittedMaxSizeEvent = true
}
// Perform eviction
for (const [key, entries] of store.#entries) { for (const [key, entries] of store.#entries) {
for (const entry of entries.splice(0, entries.length / 2)) { for (const entry of entries.splice(0, entries.length / 2)) {
store.#size -= entry.size store.#size -= entry.size
@@ -30178,11 +30105,6 @@ class MemoryCacheStore extends EventEmitter {
store.#entries.delete(key) store.#entries.delete(key)
} }
} }
// Reset the event flag after eviction
if (store.#size < store.#maxSize && store.#count < store.#maxCount) {
store.#hasEmittedMaxSizeEvent = false
}
} }
callback(null) callback(null)
@@ -30208,20 +30130,6 @@ class MemoryCacheStore extends EventEmitter {
} }
} }
function findEntry (key, entries, now) {
return entries.find((entry) => (
entry.deleteAt > now &&
entry.method === key.method &&
(entry.vary == null || Object.keys(entry.vary).every(headerName => {
if (entry.vary[headerName] === null) {
return key.headers[headerName] === undefined
}
return entry.vary[headerName] === key.headers[headerName]
}))
))
}
module.exports = MemoryCacheStore module.exports = MemoryCacheStore
@@ -30233,7 +30141,7 @@ module.exports = MemoryCacheStore
"use strict"; "use strict";
const { Writable } = __nccwpck_require__(7075) const { Writable } = __nccwpck_require__(2203)
const { assertCacheKey, assertCacheValue } = __nccwpck_require__(7659) const { assertCacheKey, assertCacheValue } = __nccwpck_require__(7659)
let DatabaseSync let DatabaseSync
@@ -30348,11 +30256,6 @@ module.exports = class SqliteCacheStore {
this.#db = new DatabaseSync(opts?.location ?? ':memory:') this.#db = new DatabaseSync(opts?.location ?? ':memory:')
this.#db.exec(` this.#db.exec(`
PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL;
PRAGMA temp_store = memory;
PRAGMA optimize;
CREATE TABLE IF NOT EXISTS cacheInterceptorV${VERSION} ( CREATE TABLE IF NOT EXISTS cacheInterceptorV${VERSION} (
-- Data specific to us -- Data specific to us
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -30372,8 +30275,9 @@ module.exports = class SqliteCacheStore {
staleAt INTEGER NOT NULL staleAt INTEGER NOT NULL
); );
CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION}_getValuesQuery ON cacheInterceptorV${VERSION}(url, method, deleteAt); CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION}_url ON cacheInterceptorV${VERSION}(url);
CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION}_deleteByUrlQuery ON cacheInterceptorV${VERSION}(deleteAt); CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION}_method ON cacheInterceptorV${VERSION}(method);
CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION}_deleteAt ON cacheInterceptorV${VERSION}(deleteAt);
`) `)
this.#getValuesQuery = this.#db.prepare(` this.#getValuesQuery = this.#db.prepare(`
@@ -30583,7 +30487,7 @@ module.exports = class SqliteCacheStore {
} }
#prune () { #prune () {
if (Number.isFinite(this.#maxCount) && this.size <= this.#maxCount) { if (this.size <= this.#maxCount) {
return 0 return 0
} }
@@ -30705,7 +30609,10 @@ function headerValueEquals (lhs, rhs) {
const net = __nccwpck_require__(7030) const net = __nccwpck_require__(7030)
const assert = __nccwpck_require__(4589) const assert = __nccwpck_require__(4589)
const util = __nccwpck_require__(3440) const util = __nccwpck_require__(3440)
const { InvalidArgumentError } = __nccwpck_require__(8707) const { InvalidArgumentError, ConnectTimeoutError } = __nccwpck_require__(8707)
const timers = __nccwpck_require__(6603)
function noop () {}
let tls // include tls conditionally since it is not always available let tls // include tls conditionally since it is not always available
@@ -30714,34 +30621,64 @@ let tls // include tls conditionally since it is not always available
// resolve the same servername multiple times even when // resolve the same servername multiple times even when
// re-use is enabled. // re-use is enabled.
const SessionCache = class WeakSessionCache { let SessionCache
constructor (maxCachedSessions) { // FIXME: remove workaround when the Node bug is fixed
this._maxCachedSessions = maxCachedSessions // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308
this._sessionCache = new Map() if (global.FinalizationRegistry && !(process.env.NODE_V8_COVERAGE || process.env.UNDICI_NO_FG)) {
this._sessionRegistry = new FinalizationRegistry((key) => { SessionCache = class WeakSessionCache {
if (this._sessionCache.size < this._maxCachedSessions) { constructor (maxCachedSessions) {
this._maxCachedSessions = maxCachedSessions
this._sessionCache = new Map()
this._sessionRegistry = new global.FinalizationRegistry((key) => {
if (this._sessionCache.size < this._maxCachedSessions) {
return
}
const ref = this._sessionCache.get(key)
if (ref !== undefined && ref.deref() === undefined) {
this._sessionCache.delete(key)
}
})
}
get (sessionKey) {
const ref = this._sessionCache.get(sessionKey)
return ref ? ref.deref() : null
}
set (sessionKey, session) {
if (this._maxCachedSessions === 0) {
return return
} }
const ref = this._sessionCache.get(key) this._sessionCache.set(sessionKey, new WeakRef(session))
if (ref !== undefined && ref.deref() === undefined) { this._sessionRegistry.register(session, sessionKey)
this._sessionCache.delete(key) }
}
})
} }
} else {
get (sessionKey) { SessionCache = class SimpleSessionCache {
const ref = this._sessionCache.get(sessionKey) constructor (maxCachedSessions) {
return ref ? ref.deref() : null this._maxCachedSessions = maxCachedSessions
} this._sessionCache = new Map()
set (sessionKey, session) {
if (this._maxCachedSessions === 0) {
return
} }
this._sessionCache.set(sessionKey, new WeakRef(session)) get (sessionKey) {
this._sessionRegistry.register(session, sessionKey) return this._sessionCache.get(sessionKey)
}
set (sessionKey, session) {
if (this._maxCachedSessions === 0) {
return
}
if (this._sessionCache.size >= this._maxCachedSessions) {
// remove the oldest session
const { value: oldestKey } = this._sessionCache.keys().next()
this._sessionCache.delete(oldestKey)
}
this._sessionCache.set(sessionKey, session)
}
} }
} }
@@ -30775,6 +30712,7 @@ function buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, sess
servername, servername,
session, session,
localAddress, localAddress,
// TODO(HTTP/2): Add support for h2c
ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'], ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'],
socket: httpSocket, // upgrade socket connection socket: httpSocket, // upgrade socket connection
port, port,
@@ -30806,7 +30744,7 @@ function buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, sess
socket.setKeepAlive(true, keepAliveInitialDelay) socket.setKeepAlive(true, keepAliveInitialDelay)
} }
const clearConnectTimeout = util.setupConnectTimeout(new WeakRef(socket), { timeout, hostname, port }) const clearConnectTimeout = setupConnectTimeout(new WeakRef(socket), { timeout, hostname, port })
socket socket
.setNoDelay(true) .setNoDelay(true)
@@ -30833,6 +30771,78 @@ function buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, sess
} }
} }
/**
* @param {WeakRef<net.Socket>} socketWeakRef
* @param {object} opts
* @param {number} opts.timeout
* @param {string} opts.hostname
* @param {number} opts.port
* @returns {() => void}
*/
const setupConnectTimeout = process.platform === 'win32'
? (socketWeakRef, opts) => {
if (!opts.timeout) {
return noop
}
let s1 = null
let s2 = null
const fastTimer = timers.setFastTimeout(() => {
// setImmediate is added to make sure that we prioritize socket error events over timeouts
s1 = setImmediate(() => {
// Windows needs an extra setImmediate probably due to implementation differences in the socket logic
s2 = setImmediate(() => onConnectTimeout(socketWeakRef.deref(), opts))
})
}, opts.timeout)
return () => {
timers.clearFastTimeout(fastTimer)
clearImmediate(s1)
clearImmediate(s2)
}
}
: (socketWeakRef, opts) => {
if (!opts.timeout) {
return noop
}
let s1 = null
const fastTimer = timers.setFastTimeout(() => {
// setImmediate is added to make sure that we prioritize socket error events over timeouts
s1 = setImmediate(() => {
onConnectTimeout(socketWeakRef.deref(), opts)
})
}, opts.timeout)
return () => {
timers.clearFastTimeout(fastTimer)
clearImmediate(s1)
}
}
/**
* @param {net.Socket} socket
* @param {object} opts
* @param {number} opts.timeout
* @param {string} opts.hostname
* @param {number} opts.port
*/
function onConnectTimeout (socket, opts) {
// The socket could be already garbage collected
if (socket == null) {
return
}
let message = 'Connect Timeout Error'
if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) {
message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(', ')},`
} else {
message += ` (attempted address: ${opts.hostname}:${opts.port},`
}
message += ` timeout: ${opts.timeout}ms)`
util.destroy(socket, new ConnectTimeoutError(message))
}
module.exports = buildConnector module.exports = buildConnector
@@ -31011,8 +31021,6 @@ const channels = {
// Request // Request
create: diagnosticsChannel.channel('undici:request:create'), create: diagnosticsChannel.channel('undici:request:create'),
bodySent: diagnosticsChannel.channel('undici:request:bodySent'), bodySent: diagnosticsChannel.channel('undici:request:bodySent'),
bodyChunkSent: diagnosticsChannel.channel('undici:request:bodyChunkSent'),
bodyChunkReceived: diagnosticsChannel.channel('undici:request:bodyChunkReceived'),
headers: diagnosticsChannel.channel('undici:request:headers'), headers: diagnosticsChannel.channel('undici:request:headers'),
trailers: diagnosticsChannel.channel('undici:request:trailers'), trailers: diagnosticsChannel.channel('undici:request:trailers'),
error: diagnosticsChannel.channel('undici:request:error'), error: diagnosticsChannel.channel('undici:request:error'),
@@ -31082,7 +31090,7 @@ function trackClientEvents (debugLog = undiciDebugLog) {
const { const {
request: { method, path, origin } request: { method, path, origin }
} = evt } = evt
debugLog('sending request to %s %s%s', method, origin, path) debugLog('sending request to %s %s/%s', method, origin, path)
}) })
} }
@@ -31102,7 +31110,7 @@ function trackRequestEvents (debugLog = undiciDebugLog) {
response: { statusCode } response: { statusCode }
} = evt } = evt
debugLog( debugLog(
'received response to %s %s%s - HTTP %d', 'received response to %s %s/%s - HTTP %d',
method, method,
origin, origin,
path, path,
@@ -31115,7 +31123,7 @@ function trackRequestEvents (debugLog = undiciDebugLog) {
const { const {
request: { method, path, origin } request: { method, path, origin }
} = evt } = evt
debugLog('trailers received from %s %s%s', method, origin, path) debugLog('trailers received from %s %s/%s', method, origin, path)
}) })
diagnosticsChannel.subscribe('undici:request:error', diagnosticsChannel.subscribe('undici:request:error',
@@ -31125,7 +31133,7 @@ function trackRequestEvents (debugLog = undiciDebugLog) {
error error
} = evt } = evt
debugLog( debugLog(
'request to %s %s%s errored - %s', 'request to %s %s/%s errored - %s',
method, method,
origin, origin,
path, path,
@@ -31495,8 +31503,7 @@ class Request {
reset, reset,
expectContinue, expectContinue,
servername, servername,
throwOnError, throwOnError
maxRedirections
}, handler) { }, handler) {
if (typeof path !== 'string') { if (typeof path !== 'string') {
throw new InvalidArgumentError('path must be a string') throw new InvalidArgumentError('path must be a string')
@@ -31540,10 +31547,6 @@ class Request {
throw new InvalidArgumentError('invalid throwOnError') throw new InvalidArgumentError('invalid throwOnError')
} }
if (maxRedirections != null && maxRedirections !== 0) {
throw new InvalidArgumentError('maxRedirections is not supported, use the redirect interceptor')
}
this.headersTimeout = headersTimeout this.headersTimeout = headersTimeout
this.bodyTimeout = bodyTimeout this.bodyTimeout = bodyTimeout
@@ -31652,9 +31655,6 @@ class Request {
} }
onBodySent (chunk) { onBodySent (chunk) {
if (channels.bodyChunkSent.hasSubscribers) {
channels.bodyChunkSent.publish({ request: this, chunk })
}
if (this[kHandler].onBodySent) { if (this[kHandler].onBodySent) {
try { try {
return this[kHandler].onBodySent(chunk) return this[kHandler].onBodySent(chunk)
@@ -31713,9 +31713,6 @@ class Request {
assert(!this.aborted) assert(!this.aborted)
assert(!this.completed) assert(!this.completed)
if (channels.bodyChunkReceived.hasSubscribers) {
channels.bodyChunkReceived.publish({ request: this, chunk })
}
try { try {
return this[kHandler].onData(chunk) return this[kHandler].onData(chunk)
} catch (err) { } catch (err) {
@@ -32031,7 +32028,7 @@ class TstNode {
/** /**
* @param {Uint8Array} key * @param {Uint8Array} key
* @returns {TstNode | null} * @return {TstNode | null}
*/ */
search (key) { search (key) {
const keylength = key.length const keylength = key.length
@@ -32118,14 +32115,15 @@ const { kDestroyed, kBodyUsed, kListeners, kBody } = __nccwpck_require__(6443)
const { IncomingMessage } = __nccwpck_require__(7067) const { IncomingMessage } = __nccwpck_require__(7067)
const stream = __nccwpck_require__(7075) const stream = __nccwpck_require__(7075)
const net = __nccwpck_require__(7030) const net = __nccwpck_require__(7030)
const { Blob } = __nccwpck_require__(4573)
const nodeUtil = __nccwpck_require__(7975)
const { stringify } = __nccwpck_require__(1792) const { stringify } = __nccwpck_require__(1792)
const { EventEmitter: EE } = __nccwpck_require__(8474) const { EventEmitter: EE } = __nccwpck_require__(8474)
const timers = __nccwpck_require__(6603) const { InvalidArgumentError } = __nccwpck_require__(8707)
const { InvalidArgumentError, ConnectTimeoutError } = __nccwpck_require__(8707)
const { headerNameLowerCasedRecord } = __nccwpck_require__(735) const { headerNameLowerCasedRecord } = __nccwpck_require__(735)
const { tree } = __nccwpck_require__(7752) const { tree } = __nccwpck_require__(7752)
const [nodeMajor, nodeMinor] = process.versions.node.split('.', 2).map(v => Number(v)) const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v))
class BodyAsyncIterable { class BodyAsyncIterable {
constructor (body) { constructor (body) {
@@ -32140,8 +32138,6 @@ class BodyAsyncIterable {
} }
} }
function noop () {}
/** /**
* @param {*} body * @param {*} body
* @returns {*} * @returns {*}
@@ -32771,6 +32767,48 @@ function addAbortListener (signal, listener) {
return () => signal.removeListener('abort', listener) return () => signal.removeListener('abort', listener)
} }
/**
* @function
* @param {string} value
* @returns {string}
*/
const toUSVString = (() => {
if (typeof String.prototype.toWellFormed === 'function') {
/**
* @param {string} value
* @returns {string}
*/
return (value) => `${value}`.toWellFormed()
} else {
/**
* @param {string} value
* @returns {string}
*/
return nodeUtil.toUSVString
}
})()
/**
* @param {*} value
* @returns {boolean}
*/
// TODO: move this to webidl
const isUSVString = (() => {
if (typeof String.prototype.isWellFormed === 'function') {
/**
* @param {*} value
* @returns {boolean}
*/
return (value) => `${value}`.isWellFormed()
} else {
/**
* @param {*} value
* @returns {boolean}
*/
return (value) => toUSVString(value) === `${value}`
}
})()
/** /**
* @see https://tools.ietf.org/html/rfc7230#section-3.2.6 * @see https://tools.ietf.org/html/rfc7230#section-3.2.6
* @param {number} c * @param {number} c
@@ -32909,78 +32947,6 @@ function errorRequest (client, request, err) {
} }
} }
/**
* @param {WeakRef<net.Socket>} socketWeakRef
* @param {object} opts
* @param {number} opts.timeout
* @param {string} opts.hostname
* @param {number} opts.port
* @returns {() => void}
*/
const setupConnectTimeout = process.platform === 'win32'
? (socketWeakRef, opts) => {
if (!opts.timeout) {
return noop
}
let s1 = null
let s2 = null
const fastTimer = timers.setFastTimeout(() => {
// setImmediate is added to make sure that we prioritize socket error events over timeouts
s1 = setImmediate(() => {
// Windows needs an extra setImmediate probably due to implementation differences in the socket logic
s2 = setImmediate(() => onConnectTimeout(socketWeakRef.deref(), opts))
})
}, opts.timeout)
return () => {
timers.clearFastTimeout(fastTimer)
clearImmediate(s1)
clearImmediate(s2)
}
}
: (socketWeakRef, opts) => {
if (!opts.timeout) {
return noop
}
let s1 = null
const fastTimer = timers.setFastTimeout(() => {
// setImmediate is added to make sure that we prioritize socket error events over timeouts
s1 = setImmediate(() => {
onConnectTimeout(socketWeakRef.deref(), opts)
})
}, opts.timeout)
return () => {
timers.clearFastTimeout(fastTimer)
clearImmediate(s1)
}
}
/**
* @param {net.Socket} socket
* @param {object} opts
* @param {number} opts.timeout
* @param {string} opts.hostname
* @param {number} opts.port
*/
function onConnectTimeout (socket, opts) {
// The socket could be already garbage collected
if (socket == null) {
return
}
let message = 'Connect Timeout Error'
if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) {
message += ` (attempted addresses: ${socket.autoSelectFamilyAttemptedAddresses.join(', ')},`
} else {
message += ` (attempted address: ${opts.hostname}:${opts.port},`
}
message += ` timeout: ${opts.timeout}ms)`
destroy(socket, new ConnectTimeoutError(message))
}
const kEnumerableProperty = Object.create(null) const kEnumerableProperty = Object.create(null)
kEnumerableProperty.enumerable = true kEnumerableProperty.enumerable = true
@@ -33012,6 +32978,8 @@ Object.setPrototypeOf(normalizedMethodRecords, null)
module.exports = { module.exports = {
kEnumerableProperty, kEnumerableProperty,
isDisturbed, isDisturbed,
toUSVString,
isUSVString,
isBlobLike, isBlobLike,
parseOrigin, parseOrigin,
parseURL, parseURL,
@@ -33050,8 +33018,7 @@ module.exports = {
nodeMajor, nodeMajor,
nodeMinor, nodeMinor,
safeHTTPMethods: Object.freeze(['GET', 'HEAD', 'OPTIONS', 'TRACE']), safeHTTPMethods: Object.freeze(['GET', 'HEAD', 'OPTIONS', 'TRACE']),
wrapRequestBody, wrapRequestBody
setupConnectTimeout
} }
@@ -33064,7 +33031,7 @@ module.exports = {
const { InvalidArgumentError } = __nccwpck_require__(8707) const { InvalidArgumentError } = __nccwpck_require__(8707)
const { kClients, kRunning, kClose, kDestroy, kDispatch, kUrl } = __nccwpck_require__(6443) const { kClients, kRunning, kClose, kDestroy, kDispatch } = __nccwpck_require__(6443)
const DispatcherBase = __nccwpck_require__(1841) const DispatcherBase = __nccwpck_require__(1841)
const Pool = __nccwpck_require__(628) const Pool = __nccwpck_require__(628)
const Client = __nccwpck_require__(3701) const Client = __nccwpck_require__(3701)
@@ -33108,35 +33075,22 @@ class Agent extends DispatcherBase {
} }
this[kOnConnect] = (origin, targets) => { this[kOnConnect] = (origin, targets) => {
const result = this[kClients].get(origin)
if (result) {
result.count += 1
}
this.emit('connect', origin, [this, ...targets]) this.emit('connect', origin, [this, ...targets])
} }
this[kOnDisconnect] = (origin, targets, err) => { this[kOnDisconnect] = (origin, targets, err) => {
const result = this[kClients].get(origin)
if (result) {
result.count -= 1
if (result.count <= 0) {
this[kClients].delete(origin)
result.dispatcher.destroy()
}
}
this.emit('disconnect', origin, [this, ...targets], err) this.emit('disconnect', origin, [this, ...targets], err)
} }
this[kOnConnectionError] = (origin, targets, err) => { this[kOnConnectionError] = (origin, targets, err) => {
// TODO: should this decrement result.count here?
this.emit('connectionError', origin, [this, ...targets], err) this.emit('connectionError', origin, [this, ...targets], err)
} }
} }
get [kRunning] () { get [kRunning] () {
let ret = 0 let ret = 0
for (const { dispatcher } of this[kClients].values()) { for (const client of this[kClients].values()) {
ret += dispatcher[kRunning] ret += client[kRunning]
} }
return ret return ret
} }
@@ -33149,8 +33103,8 @@ class Agent extends DispatcherBase {
throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.') throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.')
} }
const result = this[kClients].get(key) let dispatcher = this[kClients].get(key)
let dispatcher = result && result.dispatcher
if (!dispatcher) { if (!dispatcher) {
dispatcher = this[kFactory](opts.origin, this[kOptions]) dispatcher = this[kFactory](opts.origin, this[kOptions])
.on('drain', this[kOnDrain]) .on('drain', this[kOnDrain])
@@ -33158,7 +33112,10 @@ class Agent extends DispatcherBase {
.on('disconnect', this[kOnDisconnect]) .on('disconnect', this[kOnDisconnect])
.on('connectionError', this[kOnConnectionError]) .on('connectionError', this[kOnConnectionError])
this[kClients].set(key, { count: 0, dispatcher }) // This introduces a tiny memory leak, as dispatchers are never removed from the map.
// TODO(mcollina): remove te timer when the client/pool do not have any more
// active connections.
this[kClients].set(key, dispatcher)
} }
return dispatcher.dispatch(opts, handler) return dispatcher.dispatch(opts, handler)
@@ -33166,8 +33123,8 @@ class Agent extends DispatcherBase {
async [kClose] () { async [kClose] () {
const closePromises = [] const closePromises = []
for (const { dispatcher } of this[kClients].values()) { for (const client of this[kClients].values()) {
closePromises.push(dispatcher.close()) closePromises.push(client.close())
} }
this[kClients].clear() this[kClients].clear()
@@ -33176,23 +33133,13 @@ class Agent extends DispatcherBase {
async [kDestroy] (err) { async [kDestroy] (err) {
const destroyPromises = [] const destroyPromises = []
for (const { dispatcher } of this[kClients].values()) { for (const client of this[kClients].values()) {
destroyPromises.push(dispatcher.destroy(err)) destroyPromises.push(client.destroy(err))
} }
this[kClients].clear() this[kClients].clear()
await Promise.all(destroyPromises) await Promise.all(destroyPromises)
} }
get stats () {
const allClientStats = {}
for (const { dispatcher } of this[kClients].values()) {
if (dispatcher.stats) {
allClientStats[dispatcher[kUrl].origin] = dispatcher.stats
}
}
return allClientStats
}
} }
module.exports = Agent module.exports = Agent
@@ -33480,12 +33427,12 @@ const removeAllListeners = util.removeAllListeners
let extractBody let extractBody
function lazyllhttp () { async function lazyllhttp () {
const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(3870) : undefined const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(3870) : undefined
let mod let mod
try { try {
mod = new WebAssembly.Module(__nccwpck_require__(3434)) mod = await WebAssembly.compile(__nccwpck_require__(3434))
} catch (e) { } catch (e) {
/* istanbul ignore next */ /* istanbul ignore next */
@@ -33493,10 +33440,10 @@ function lazyllhttp () {
// being enabled, but the occurring of this other error // being enabled, but the occurring of this other error
// * https://github.com/emscripten-core/emscripten/issues/11495 // * https://github.com/emscripten-core/emscripten/issues/11495
// got me to remove that check to avoid breaking Node 12. // got me to remove that check to avoid breaking Node 12.
mod = new WebAssembly.Module(llhttpWasmData || __nccwpck_require__(3870)) mod = await WebAssembly.compile(llhttpWasmData || __nccwpck_require__(3870))
} }
return new WebAssembly.Instance(mod, { return await WebAssembly.instantiate(mod, {
env: { env: {
/** /**
* @param {number} p * @param {number} p
@@ -33585,6 +33532,11 @@ function lazyllhttp () {
} }
let llhttpInstance = null let llhttpInstance = null
/**
* @type {Promise<WebAssembly.Instance>|null}
*/
let llhttpPromise = lazyllhttp()
llhttpPromise.catch()
/** /**
* @type {Parser|null} * @type {Parser|null}
@@ -33664,7 +33616,7 @@ class Parser {
this.timeout = timers.setFastTimeout(onParserTimeout, delay, new WeakRef(this)) this.timeout = timers.setFastTimeout(onParserTimeout, delay, new WeakRef(this))
} else { } else {
this.timeout = setTimeout(onParserTimeout, delay, new WeakRef(this)) this.timeout = setTimeout(onParserTimeout, delay, new WeakRef(this))
this.timeout?.unref() this.timeout.unref()
} }
} }
@@ -34147,7 +34099,7 @@ class Parser {
// We must wait a full event loop cycle to reuse this socket to make sure // We must wait a full event loop cycle to reuse this socket to make sure
// that non-spec compliant servers are not closing the connection even if they // that non-spec compliant servers are not closing the connection even if they
// said they won't. // said they won't.
setImmediate(client[kResume]) setImmediate(() => client[kResume]())
} else { } else {
client[kResume]() client[kResume]()
} }
@@ -34184,7 +34136,11 @@ async function connectH1 (client, socket) {
client[kSocket] = socket client[kSocket] = socket
if (!llhttpInstance) { if (!llhttpInstance) {
llhttpInstance = lazyllhttp() const noop = () => {}
socket.on('error', noop)
llhttpInstance = await llhttpPromise
llhttpPromise = null
socket.off('error', noop)
} }
if (socket.errored) { if (socket.errored) {
@@ -34708,9 +34664,9 @@ function writeStream (abort, body, client, request, socket, contentLength, heade
.on('error', onFinished) .on('error', onFinished)
if (body.errorEmitted ?? body.errored) { if (body.errorEmitted ?? body.errored) {
setImmediate(onFinished, body.errored) setImmediate(() => onFinished(body.errored))
} else if (body.endEmitted ?? body.readableEnded) { } else if (body.endEmitted ?? body.readableEnded) {
setImmediate(onFinished, null) setImmediate(() => onFinished(null))
} }
if (body.closeEmitted ?? body.closed) { if (body.closeEmitted ?? body.closed) {
@@ -35242,7 +35198,6 @@ function onHttp2SessionGoAway (errorCode) {
assert(client[kRunning] === 0) assert(client[kRunning] === 0)
client.emit('disconnect', client[kUrl], [client], err) client.emit('disconnect', client[kUrl], [client], err)
client.emit('connectionError', client[kUrl], [client], err)
client[kResume]() client[kResume]()
} }
@@ -35329,13 +35284,11 @@ function writeH2 (client, request) {
if (Array.isArray(val)) { if (Array.isArray(val)) {
for (let i = 0; i < val.length; i++) { for (let i = 0; i < val.length; i++) {
if (headers[key]) { if (headers[key]) {
headers[key] += `, ${val[i]}` headers[key] += `,${val[i]}`
} else { } else {
headers[key] = val[i] headers[key] = val[i]
} }
} }
} else if (headers[key]) {
headers[key] += `, ${val}`
} else { } else {
headers[key] = val headers[key] = val
} }
@@ -35844,7 +35797,6 @@ const assert = __nccwpck_require__(4589)
const net = __nccwpck_require__(7030) const net = __nccwpck_require__(7030)
const http = __nccwpck_require__(7067) const http = __nccwpck_require__(7067)
const util = __nccwpck_require__(3440) const util = __nccwpck_require__(3440)
const { ClientStats } = __nccwpck_require__(6854)
const { channels } = __nccwpck_require__(2414) const { channels } = __nccwpck_require__(2414)
const Request = __nccwpck_require__(4655) const Request = __nccwpck_require__(4655)
const DispatcherBase = __nccwpck_require__(1841) const DispatcherBase = __nccwpck_require__(1841)
@@ -36101,10 +36053,6 @@ class Client extends DispatcherBase {
this[kResume](true) this[kResume](true)
} }
get stats () {
return new ClientStats(this)
}
get [kPending] () { get [kPending] () {
return this[kQueue].length - this[kPendingIdx] return this[kQueue].length - this[kPendingIdx]
} }
@@ -37005,136 +36953,6 @@ module.exports = class FixedQueue {
} }
/***/ }),
/***/ 6815:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
const { connect } = __nccwpck_require__(7030)
const { kClose, kDestroy } = __nccwpck_require__(6443)
const { InvalidArgumentError } = __nccwpck_require__(8707)
const util = __nccwpck_require__(3440)
const Client = __nccwpck_require__(3701)
const DispatcherBase = __nccwpck_require__(1841)
class H2CClient extends DispatcherBase {
#client = null
constructor (origin, clientOpts) {
super()
if (typeof origin === 'string') {
origin = new URL(origin)
}
if (origin.protocol !== 'http:') {
throw new InvalidArgumentError(
'h2c-client: Only h2c protocol is supported'
)
}
const { connect, maxConcurrentStreams, pipelining, ...opts } =
clientOpts ?? {}
let defaultMaxConcurrentStreams = 100
let defaultPipelining = 100
if (
maxConcurrentStreams != null &&
Number.isInteger(maxConcurrentStreams) &&
maxConcurrentStreams > 0
) {
defaultMaxConcurrentStreams = maxConcurrentStreams
}
if (pipelining != null && Number.isInteger(pipelining) && pipelining > 0) {
defaultPipelining = pipelining
}
if (defaultPipelining > defaultMaxConcurrentStreams) {
throw new InvalidArgumentError(
'h2c-client: pipelining cannot be greater than maxConcurrentStreams'
)
}
this.#client = new Client(origin, {
...opts,
connect: this.#buildConnector(connect),
maxConcurrentStreams: defaultMaxConcurrentStreams,
pipelining: defaultPipelining,
allowH2: true
})
}
#buildConnector (connectOpts) {
return (opts, callback) => {
const timeout = connectOpts?.connectOpts ?? 10e3
const { hostname, port, pathname } = opts
const socket = connect({
...opts,
host: hostname,
port,
pathname
})
// Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket
if (opts.keepAlive == null || opts.keepAlive) {
const keepAliveInitialDelay =
opts.keepAliveInitialDelay == null ? 60e3 : opts.keepAliveInitialDelay
socket.setKeepAlive(true, keepAliveInitialDelay)
}
socket.alpnProtocol = 'h2'
const clearConnectTimeout = util.setupConnectTimeout(
new WeakRef(socket),
{ timeout, hostname, port }
)
socket
.setNoDelay(true)
.once('connect', function () {
queueMicrotask(clearConnectTimeout)
if (callback) {
const cb = callback
callback = null
cb(null, this)
}
})
.on('error', function (err) {
queueMicrotask(clearConnectTimeout)
if (callback) {
const cb = callback
callback = null
cb(err)
}
})
return socket
}
}
dispatch (opts, handler) {
return this.#client.dispatch(opts, handler)
}
async [kClose] () {
await this.#client.close()
}
async [kDestroy] () {
await this.#client.destroy()
}
}
module.exports = H2CClient
/***/ }), /***/ }),
/***/ 2128: /***/ 2128:
@@ -37143,10 +36961,10 @@ module.exports = H2CClient
"use strict"; "use strict";
const { PoolStats } = __nccwpck_require__(6854)
const DispatcherBase = __nccwpck_require__(1841) const DispatcherBase = __nccwpck_require__(1841)
const FixedQueue = __nccwpck_require__(4660) const FixedQueue = __nccwpck_require__(4660)
const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = __nccwpck_require__(6443) const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = __nccwpck_require__(6443)
const PoolStats = __nccwpck_require__(3246)
const kClients = Symbol('clients') const kClients = Symbol('clients')
const kNeedDrain = Symbol('needDrain') const kNeedDrain = Symbol('needDrain')
@@ -37159,6 +36977,7 @@ const kOnConnectionError = Symbol('onConnectionError')
const kGetDispatcher = Symbol('get dispatcher') const kGetDispatcher = Symbol('get dispatcher')
const kAddClient = Symbol('add client') const kAddClient = Symbol('add client')
const kRemoveClient = Symbol('remove client') const kRemoveClient = Symbol('remove client')
const kStats = Symbol('stats')
class PoolBase extends DispatcherBase { class PoolBase extends DispatcherBase {
constructor () { constructor () {
@@ -37209,6 +37028,8 @@ class PoolBase extends DispatcherBase {
this[kOnConnectionError] = (origin, targets, err) => { this[kOnConnectionError] = (origin, targets, err) => {
pool.emit('connectionError', origin, [pool, ...targets], err) pool.emit('connectionError', origin, [pool, ...targets], err)
} }
this[kStats] = new PoolStats(this)
} }
get [kBusy] () { get [kBusy] () {
@@ -37248,7 +37069,7 @@ class PoolBase extends DispatcherBase {
} }
get stats () { get stats () {
return new PoolStats(this) return this[kStats]
} }
async [kClose] () { async [kClose] () {
@@ -37334,6 +37155,50 @@ module.exports = {
} }
/***/ }),
/***/ 3246:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = __nccwpck_require__(6443)
const kPool = Symbol('pool')
class PoolStats {
constructor (pool) {
this[kPool] = pool
}
get connected () {
return this[kPool][kConnected]
}
get free () {
return this[kPool][kFree]
}
get pending () {
return this[kPool][kPending]
}
get queued () {
return this[kPool][kQueued]
}
get running () {
return this[kPool][kRunning]
}
get size () {
return this[kPool][kSize]
}
}
module.exports = PoolStats
/***/ }), /***/ }),
/***/ 628: /***/ 628:
@@ -37347,8 +37212,7 @@ const {
kClients, kClients,
kNeedDrain, kNeedDrain,
kAddClient, kAddClient,
kGetDispatcher, kGetDispatcher
kRemoveClient
} = __nccwpck_require__(2128) } = __nccwpck_require__(2128)
const Client = __nccwpck_require__(3701) const Client = __nccwpck_require__(3701)
const { const {
@@ -37378,7 +37242,6 @@ class Pool extends PoolBase {
autoSelectFamily, autoSelectFamily,
autoSelectFamilyAttemptTimeout, autoSelectFamilyAttemptTimeout,
allowH2, allowH2,
clientTtl,
...options ...options
} = {}) { } = {}) {
if (connections != null && (!Number.isFinite(connections) || connections < 0)) { if (connections != null && (!Number.isFinite(connections) || connections < 0)) {
@@ -37409,20 +37272,12 @@ class Pool extends PoolBase {
this[kConnections] = connections || null this[kConnections] = connections || null
this[kUrl] = util.parseOrigin(origin) this[kUrl] = util.parseOrigin(origin)
this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl } this[kOptions] = { ...util.deepClone(options), connect, allowH2 }
this[kOptions].interceptors = options.interceptors this[kOptions].interceptors = options.interceptors
? { ...options.interceptors } ? { ...options.interceptors }
: undefined : undefined
this[kFactory] = factory this[kFactory] = factory
this.on('connect', (origin, targets) => {
if (clientTtl != null && clientTtl > 0) {
for (const target of targets) {
Object.assign(target, { ttl: Date.now() })
}
}
})
this.on('connectionError', (origin, targets, error) => { this.on('connectionError', (origin, targets, error) => {
// If a connection error occurs, we remove the client from the pool, // If a connection error occurs, we remove the client from the pool,
// and emit a connectionError event. They will not be re-used. // and emit a connectionError event. They will not be re-used.
@@ -37439,12 +37294,8 @@ class Pool extends PoolBase {
} }
[kGetDispatcher] () { [kGetDispatcher] () {
const clientTtlOption = this[kOptions].clientTtl
for (const client of this[kClients]) { for (const client of this[kClients]) {
// check ttl of client and if it's stale, remove it from the pool if (!client[kNeedDrain]) {
if (clientTtlOption != null && clientTtlOption > 0 && client.ttl && ((Date.now() - client.ttl) > clientTtlOption)) {
this[kRemoveClient](client)
} else if (!client[kNeedDrain]) {
return client return client
} }
} }
@@ -37468,13 +37319,13 @@ module.exports = Pool
"use strict"; "use strict";
const { kProxy, kClose, kDestroy, kDispatch } = __nccwpck_require__(6443) const { kProxy, kClose, kDestroy } = __nccwpck_require__(6443)
const { URL } = __nccwpck_require__(3136)
const Agent = __nccwpck_require__(7405) const Agent = __nccwpck_require__(7405)
const Pool = __nccwpck_require__(628) const Pool = __nccwpck_require__(628)
const DispatcherBase = __nccwpck_require__(1841) const DispatcherBase = __nccwpck_require__(1841)
const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = __nccwpck_require__(8707) const { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = __nccwpck_require__(8707)
const buildConnector = __nccwpck_require__(9136) const buildConnector = __nccwpck_require__(9136)
const Client = __nccwpck_require__(3701)
const kAgent = Symbol('proxy agent') const kAgent = Symbol('proxy agent')
const kClient = Symbol('proxy client') const kClient = Symbol('proxy client')
@@ -37482,7 +37333,6 @@ const kProxyHeaders = Symbol('proxy headers')
const kRequestTls = Symbol('request tls settings') const kRequestTls = Symbol('request tls settings')
const kProxyTls = Symbol('proxy tls settings') const kProxyTls = Symbol('proxy tls settings')
const kConnectEndpoint = Symbol('connect endpoint function') const kConnectEndpoint = Symbol('connect endpoint function')
const kTunnelProxy = Symbol('tunnel proxy')
function defaultProtocolPort (protocol) { function defaultProtocolPort (protocol) {
return protocol === 'https:' ? 443 : 80 return protocol === 'https:' ? 443 : 80
@@ -37494,69 +37344,6 @@ function defaultFactory (origin, opts) {
const noop = () => {} const noop = () => {}
function defaultAgentFactory (origin, opts) {
if (opts.connections === 1) {
return new Client(origin, opts)
}
return new Pool(origin, opts)
}
class Http1ProxyWrapper extends DispatcherBase {
#client
constructor (proxyUrl, { headers = {}, connect, factory }) {
super()
if (!proxyUrl) {
throw new InvalidArgumentError('Proxy URL is mandatory')
}
this[kProxyHeaders] = headers
if (factory) {
this.#client = factory(proxyUrl, { connect })
} else {
this.#client = new Client(proxyUrl, { connect })
}
}
[kDispatch] (opts, handler) {
const onHeaders = handler.onHeaders
handler.onHeaders = function (statusCode, data, resume) {
if (statusCode === 407) {
if (typeof handler.onError === 'function') {
handler.onError(new InvalidArgumentError('Proxy Authentication Required (407)'))
}
return
}
if (onHeaders) onHeaders.call(this, statusCode, data, resume)
}
// Rewrite request as an HTTP1 Proxy request, without tunneling.
const {
origin,
path = '/',
headers = {}
} = opts
opts.path = origin + path
if (!('host' in headers) && !('Host' in headers)) {
const { host } = new URL(origin)
headers.host = host
}
opts.headers = { ...this[kProxyHeaders], ...headers }
return this.#client[kDispatch](opts, handler)
}
async [kClose] () {
return this.#client.close()
}
async [kDestroy] (err) {
return this.#client.destroy(err)
}
}
class ProxyAgent extends DispatcherBase { class ProxyAgent extends DispatcherBase {
constructor (opts) { constructor (opts) {
if (!opts || (typeof opts === 'object' && !(opts instanceof URL) && !opts.uri)) { if (!opts || (typeof opts === 'object' && !(opts instanceof URL) && !opts.uri)) {
@@ -37568,8 +37355,6 @@ class ProxyAgent extends DispatcherBase {
throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.') throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.')
} }
const { proxyTunnel = true } = opts
super() super()
const url = this.#getUrl(opts) const url = this.#getUrl(opts)
@@ -37579,7 +37364,6 @@ class ProxyAgent extends DispatcherBase {
this[kRequestTls] = opts.requestTls this[kRequestTls] = opts.requestTls
this[kProxyTls] = opts.proxyTls this[kProxyTls] = opts.proxyTls
this[kProxyHeaders] = opts.headers || {} this[kProxyHeaders] = opts.headers || {}
this[kTunnelProxy] = proxyTunnel
if (opts.auth && opts.token) { if (opts.auth && opts.token) {
throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token') throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token')
@@ -37594,23 +37378,9 @@ class ProxyAgent extends DispatcherBase {
const connect = buildConnector({ ...opts.proxyTls }) const connect = buildConnector({ ...opts.proxyTls })
this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }) this[kConnectEndpoint] = buildConnector({ ...opts.requestTls })
const agentFactory = opts.factory || defaultAgentFactory
const factory = (origin, options) => {
const { protocol } = new URL(origin)
if (!this[kTunnelProxy] && protocol === 'http:' && this[kProxy].protocol === 'http:') {
return new Http1ProxyWrapper(this[kProxy].uri, {
headers: this[kProxyHeaders],
connect,
factory: agentFactory
})
}
return agentFactory(origin, options)
}
this[kClient] = clientFactory(url, { connect }) this[kClient] = clientFactory(url, { connect })
this[kAgent] = new Agent({ this[kAgent] = new Agent({
...opts, ...opts,
factory,
connect: async (opts, callback) => { connect: async (opts, callback) => {
let requestedPath = opts.host let requestedPath = opts.host
if (!opts.port) { if (!opts.port) {
@@ -37624,8 +37394,7 @@ class ProxyAgent extends DispatcherBase {
signal: opts.signal, signal: opts.signal,
headers: { headers: {
...this[kProxyHeaders], ...this[kProxyHeaders],
host: opts.host, host: opts.host
...(opts.connections == null || opts.connections > 0 ? { 'proxy-connection': 'keep-alive' } : {})
}, },
servername: this[kProxyTls]?.servername || proxyHostname servername: this[kProxyTls]?.servername || proxyHostname
}) })
@@ -37675,7 +37444,7 @@ class ProxyAgent extends DispatcherBase {
} }
/** /**
* @param {import('../../types/proxy-agent').ProxyAgent.Options | string | URL} opts * @param {import('../types/proxy-agent').ProxyAgent.Options | string | URL} opts
* @returns {URL} * @returns {URL}
*/ */
#getUrl (opts) { #getUrl (opts) {
@@ -37845,15 +37614,6 @@ const HEURISTICALLY_CACHEABLE_STATUS_CODES = [
200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414, 501 200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414, 501
] ]
// Status codes which semantic is not handled by the cache
// https://datatracker.ietf.org/doc/html/rfc9111#section-3
// This list should not grow beyond 206 and 304 unless the RFC is updated
// by a newer one including more. Please introduce another list if
// implementing caching of responses with the 'must-understand' directive.
const NOT_UNDERSTOOD_STATUS_CODES = [
206, 304
]
const MAX_RESPONSE_AGE = 2147483647000 const MAX_RESPONSE_AGE = 2147483647000
/** /**
@@ -38080,19 +37840,7 @@ class CacheHandler {
* @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives
*/ */
function canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirectives) { function canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirectives) {
// Status code must be final and understood. if (statusCode !== 200 && statusCode !== 307) {
if (statusCode < 200 || NOT_UNDERSTOOD_STATUS_CODES.includes(statusCode)) {
return false
}
// Responses with neither status codes that are heuristically cacheable, nor "explicit enough" caching
// directives, are not cacheable. "Explicit enough": see https://www.rfc-editor.org/rfc/rfc9111.html#section-3
if (!HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode) && !resHeaders['expires'] &&
!cacheControlDirectives.public &&
cacheControlDirectives['max-age'] === undefined &&
// RFC 9111: a private response directive, if the cache is not shared
!(cacheControlDirectives.private && cacheType === 'private') &&
!(cacheControlDirectives['s-maxage'] !== undefined && cacheType === 'shared')
) {
return false return false
} }
@@ -38316,7 +38064,7 @@ const assert = __nccwpck_require__(4589)
* here, which we then just pass on to the next handler (most likely a * here, which we then just pass on to the next handler (most likely a
* CacheHandler). Note that this assumes the proper headers were already * CacheHandler). Note that this assumes the proper headers were already
* included in the request to tell the origin that we want to revalidate the * included in the request to tell the origin that we want to revalidate the
* response (i.e. if-modified-since or if-none-match). * response (i.e. if-modified-since).
* *
* @see https://www.rfc-editor.org/rfc/rfc9111.html#name-validation * @see https://www.rfc-editor.org/rfc/rfc9111.html#name-validation
* *
@@ -38556,8 +38304,7 @@ class RedirectHandler {
this.dispatch = dispatch this.dispatch = dispatch
this.location = null this.location = null
const { maxRedirections: _, ...cleanOpts } = opts this.opts = { ...opts, maxRedirections: 0 } // opts must be a copy
this.opts = cleanOpts // opts must be a copy, exclude maxRedirections
this.maxRedirections = maxRedirections this.maxRedirections = maxRedirections
this.handler = handler this.handler = handler
this.history = [] this.history = []
@@ -38647,22 +38394,13 @@ class RedirectHandler {
const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))) const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin)))
const path = search ? `${pathname}${search}` : pathname const path = search ? `${pathname}${search}` : pathname
// Check for redirect loops by seeing if we've already visited this URL in our history
// This catches the case where Client/Pool try to handle cross-origin redirects but fail
// and keep redirecting to the same URL in an infinite loop
const redirectUrlString = `${origin}${path}`
for (const historyUrl of this.history) {
if (historyUrl.toString() === redirectUrlString) {
throw new InvalidArgumentError(`Redirect loop detected. Cannot redirect to ${origin}. This typically happens when using a Client or Pool with cross-origin redirects. Use an Agent for cross-origin redirects.`)
}
}
// Remove headers referring to the original URL. // Remove headers referring to the original URL.
// By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers. // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers.
// https://tools.ietf.org/html/rfc7231#section-6.4 // https://tools.ietf.org/html/rfc7231#section-6.4
this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin) this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin)
this.opts.path = path this.opts.path = path
this.opts.origin = origin this.opts.origin = origin
this.opts.maxRedirections = 0
this.opts.query = null this.opts.query = null
} }
@@ -38788,16 +38526,13 @@ class RetryHandler {
methods, methods,
errorCodes, errorCodes,
retryAfter, retryAfter,
statusCodes, statusCodes
throwOnError
} = retryOptions ?? {} } = retryOptions ?? {}
this.error = null
this.dispatch = dispatch this.dispatch = dispatch
this.handler = WrapHandler.wrap(handler) this.handler = WrapHandler.wrap(handler)
this.opts = { ...dispatchOpts, body: wrapRequestBody(opts.body) } this.opts = { ...dispatchOpts, body: wrapRequestBody(opts.body) }
this.retryOpts = { this.retryOpts = {
throwOnError: throwOnError ?? true,
retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry], retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry],
retryAfter: retryAfter ?? true, retryAfter: retryAfter ?? true,
maxTimeout: maxTimeout ?? 30 * 1000, // 30s, maxTimeout: maxTimeout ?? 30 * 1000, // 30s,
@@ -38830,50 +38565,6 @@ class RetryHandler {
this.etag = null this.etag = null
} }
onResponseStartWithRetry (controller, statusCode, headers, statusMessage, err) {
if (this.retryOpts.throwOnError) {
// Preserve old behavior for status codes that are not eligible for retry
if (this.retryOpts.statusCodes.includes(statusCode) === false) {
this.headersSent = true
this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)
} else {
this.error = err
}
return
}
if (isDisturbed(this.opts.body)) {
this.headersSent = true
this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)
return
}
function shouldRetry (passedErr) {
if (passedErr) {
this.headersSent = true
this.headersSent = true
this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage)
controller.resume()
return
}
this.error = err
controller.resume()
}
controller.pause()
this.retryOpts.retry(
err,
{
state: { counter: this.retryCount },
opts: { retryOptions: this.retryOpts, ...this.opts }
},
shouldRetry.bind(this)
)
}
onRequestStart (controller, context) { onRequestStart (controller, context) {
if (!this.headersSent) { if (!this.headersSent) {
this.handler.onRequestStart?.(controller, context) this.handler.onRequestStart?.(controller, context)
@@ -38943,19 +38634,26 @@ class RetryHandler {
} }
onResponseStart (controller, statusCode, headers, statusMessage) { onResponseStart (controller, statusCode, headers, statusMessage) {
this.error = null
this.retryCount += 1 this.retryCount += 1
if (statusCode >= 300) { if (statusCode >= 300) {
const err = new RequestRetryError('Request failed', statusCode, { if (this.retryOpts.statusCodes.includes(statusCode) === false) {
headers, this.headersSent = true
data: { this.handler.onResponseStart?.(
count: this.retryCount controller,
} statusCode,
}) headers,
statusMessage
this.onResponseStartWithRetry(controller, statusCode, headers, statusMessage, err) )
return return
} else {
throw new RequestRetryError('Request failed', statusCode, {
headers,
data: {
count: this.retryCount
}
})
}
} }
// Checkpoint for resume from where we left it // Checkpoint for resume from where we left it
@@ -38974,7 +38672,6 @@ class RetryHandler {
const contentRange = parseRangeHeader(headers['content-range']) const contentRange = parseRangeHeader(headers['content-range'])
// If no content range // If no content range
if (!contentRange) { if (!contentRange) {
// We always throw here as we want to indicate that we entred unexpected path
throw new RequestRetryError('Content-Range mismatch', statusCode, { throw new RequestRetryError('Content-Range mismatch', statusCode, {
headers, headers,
data: { count: this.retryCount } data: { count: this.retryCount }
@@ -38983,7 +38680,6 @@ class RetryHandler {
// Let's start with a weak etag check // Let's start with a weak etag check
if (this.etag != null && this.etag !== headers.etag) { if (this.etag != null && this.etag !== headers.etag) {
// We always throw here as we want to indicate that we entred unexpected path
throw new RequestRetryError('ETag mismatch', statusCode, { throw new RequestRetryError('ETag mismatch', statusCode, {
headers, headers,
data: { count: this.retryCount } data: { count: this.retryCount }
@@ -39067,52 +38763,14 @@ class RetryHandler {
} }
onResponseData (controller, chunk) { onResponseData (controller, chunk) {
if (this.error) {
return
}
this.start += chunk.length this.start += chunk.length
this.handler.onResponseData?.(controller, chunk) this.handler.onResponseData?.(controller, chunk)
} }
onResponseEnd (controller, trailers) { onResponseEnd (controller, trailers) {
if (this.error && this.retryOpts.throwOnError) { this.retryCount = 0
throw this.error return this.handler.onResponseEnd?.(controller, trailers)
}
if (!this.error) {
this.retryCount = 0
return this.handler.onResponseEnd?.(controller, trailers)
}
this.retry(controller)
}
retry (controller) {
if (this.start !== 0) {
const headers = { range: `bytes=${this.start}-${this.end ?? ''}` }
// Weak etag check - weak etags will make comparison algorithms never match
if (this.etag != null) {
headers['if-match'] = this.etag
}
this.opts = {
...this.opts,
headers: {
...this.opts.headers,
...headers
}
}
}
try {
this.retryCountCheckpoint = this.retryCount
this.dispatch(this.opts, this)
} catch (err) {
this.handler.onResponseError?.(controller, err)
}
} }
onResponseError (controller, err) { onResponseError (controller, err) {
@@ -39121,15 +38779,6 @@ class RetryHandler {
return return
} }
function shouldRetry (returnedErr) {
if (!returnedErr) {
this.retry(controller)
return
}
this.handler?.onResponseError?.(controller, returnedErr)
}
// We reconcile in case of a mix between network errors // We reconcile in case of a mix between network errors
// and server error response // and server error response
if (this.retryCount - this.retryCountCheckpoint > 0) { if (this.retryCount - this.retryCountCheckpoint > 0) {
@@ -39147,8 +38796,43 @@ class RetryHandler {
state: { counter: this.retryCount }, state: { counter: this.retryCount },
opts: { retryOptions: this.retryOpts, ...this.opts } opts: { retryOptions: this.retryOpts, ...this.opts }
}, },
shouldRetry.bind(this) onRetry.bind(this)
) )
/**
* @this {RetryHandler}
* @param {Error} [err]
* @returns
*/
function onRetry (err) {
if (err != null || controller?.aborted || isDisturbed(this.opts.body)) {
return this.handler.onResponseError?.(controller, err)
}
if (this.start !== 0) {
const headers = { range: `bytes=${this.start}-${this.end ?? ''}` }
// Weak etag check - weak etags will make comparison algorithms never match
if (this.etag != null) {
headers['if-match'] = this.etag
}
this.opts = {
...this.opts,
headers: {
...this.opts.headers,
...headers
}
}
}
try {
this.retryCountCheckpoint = this.retryCount
this.dispatch(this.opts, this)
} catch (err) {
this.handler.onResponseError?.(controller, err)
}
}
} }
} }
@@ -39376,7 +39060,7 @@ const util = __nccwpck_require__(3440)
const CacheHandler = __nccwpck_require__(9976) const CacheHandler = __nccwpck_require__(9976)
const MemoryCacheStore = __nccwpck_require__(4889) const MemoryCacheStore = __nccwpck_require__(4889)
const CacheRevalidationHandler = __nccwpck_require__(7133) const CacheRevalidationHandler = __nccwpck_require__(7133)
const { assertCacheStore, assertCacheMethods, makeCacheKey, normalizeHeaders, parseCacheControlHeader } = __nccwpck_require__(7659) const { assertCacheStore, assertCacheMethods, makeCacheKey, parseCacheControlHeader } = __nccwpck_require__(7659)
const { AbortError } = __nccwpck_require__(8707) const { AbortError } = __nccwpck_require__(8707)
/** /**
@@ -39390,12 +39074,7 @@ const { AbortError } = __nccwpck_require__(8707)
*/ */
function needsRevalidation (result, cacheControlDirectives) { function needsRevalidation (result, cacheControlDirectives) {
if (cacheControlDirectives?.['no-cache']) { if (cacheControlDirectives?.['no-cache']) {
// Always revalidate requests with the no-cache request directive // Always revalidate requests with the no-cache directive
return true
}
if (result.cacheControlDirectives?.['no-cache'] && !Array.isArray(result.cacheControlDirectives['no-cache'])) {
// Always revalidate requests with unqualified no-cache response directive
return true return true
} }
@@ -39596,7 +39275,7 @@ function handleResult (
// Check if the response is stale // Check if the response is stale
if (needsRevalidation(result, reqCacheControl)) { if (needsRevalidation(result, reqCacheControl)) {
if (util.isStream(opts.body) && util.bodyLength(opts.body) !== 0) { if (util.isStream(opts.body) && util.bodyLength(opts.body) !== 0) {
// If body is a stream we can't revalidate... // If body is is stream we can't revalidate...
// TODO (fix): This could be less strict... // TODO (fix): This could be less strict...
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler)) return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))
} }
@@ -39671,11 +39350,11 @@ module.exports = (opts = {}) => {
assertCacheMethods(methods, 'opts.methods') assertCacheMethods(methods, 'opts.methods')
if (typeof cacheByDefault !== 'undefined' && typeof cacheByDefault !== 'number') { if (typeof cacheByDefault !== 'undefined' && typeof cacheByDefault !== 'number') {
throw new TypeError(`expected opts.cacheByDefault to be number or undefined, got ${typeof cacheByDefault}`) throw new TypeError(`exepcted opts.cacheByDefault to be number or undefined, got ${typeof cacheByDefault}`)
} }
if (typeof type !== 'undefined' && type !== 'shared' && type !== 'private') { if (typeof type !== 'undefined' && type !== 'shared' && type !== 'private') {
throw new TypeError(`expected opts.type to be shared, private, or undefined, got ${typeof type}`) throw new TypeError(`exepcted opts.type to be shared, private, or undefined, got ${typeof type}`)
} }
const globalOpts = { const globalOpts = {
@@ -39694,11 +39373,6 @@ module.exports = (opts = {}) => {
return dispatch(opts, handler) return dispatch(opts, handler)
} }
opts = {
...opts,
headers: normalizeHeaders(opts)
}
const reqCacheControl = opts.headers?.['cache-control'] const reqCacheControl = opts.headers?.['cache-control']
? parseCacheControlHeader(opts.headers['cache-control']) ? parseCacheControlHeader(opts.headers['cache-control'])
: undefined : undefined
@@ -40247,8 +39921,7 @@ class DumpHandler extends DecoratorHandler {
return return
} }
// On network errors before connect, controller will be null err = this.#controller.reason ?? err
err = this.#controller?.reason ?? err
super.onResponseError(controller, err) super.onResponseError(controller, err)
} }
@@ -40321,7 +39994,7 @@ function createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }
return dispatch(opts, handler) return dispatch(opts, handler)
} }
const dispatchOpts = { ...rest } // Stop sub dispatcher from also redirecting. const dispatchOpts = { ...rest, maxRedirections: 0 } // Stop sub dispatcher from also redirecting.
const redirectHandler = new RedirectHandler(dispatch, maxRedirections, dispatchOpts, handler) const redirectHandler = new RedirectHandler(dispatch, maxRedirections, dispatchOpts, handler)
return dispatch(dispatchOpts, redirectHandler) return dispatch(dispatchOpts, redirectHandler)
} }
@@ -41060,13 +40733,11 @@ const {
kMockAgentIsCallHistoryEnabled, kMockAgentIsCallHistoryEnabled,
kMockAgentAddCallHistoryLog, kMockAgentAddCallHistoryLog,
kMockAgentMockCallHistoryInstance, kMockAgentMockCallHistoryInstance,
kMockAgentAcceptsNonStandardSearchParameters, kMockCallHistoryAddLog
kMockCallHistoryAddLog,
kIgnoreTrailingSlash
} = __nccwpck_require__(1117) } = __nccwpck_require__(1117)
const MockClient = __nccwpck_require__(7365) const MockClient = __nccwpck_require__(7365)
const MockPool = __nccwpck_require__(4004) const MockPool = __nccwpck_require__(4004)
const { matchValue, normalizeSearchParams, buildAndValidateMockOptions } = __nccwpck_require__(3397) const { matchValue, buildAndValidateMockOptions } = __nccwpck_require__(3397)
const { InvalidArgumentError, UndiciError } = __nccwpck_require__(8707) const { InvalidArgumentError, UndiciError } = __nccwpck_require__(8707)
const Dispatcher = __nccwpck_require__(883) const Dispatcher = __nccwpck_require__(883)
const PendingInterceptorsFormatter = __nccwpck_require__(6142) const PendingInterceptorsFormatter = __nccwpck_require__(6142)
@@ -41081,8 +40752,6 @@ class MockAgent extends Dispatcher {
this[kNetConnect] = true this[kNetConnect] = true
this[kIsMockActive] = true this[kIsMockActive] = true
this[kMockAgentIsCallHistoryEnabled] = mockOptions?.enableCallHistory ?? false this[kMockAgentIsCallHistoryEnabled] = mockOptions?.enableCallHistory ?? false
this[kMockAgentAcceptsNonStandardSearchParameters] = mockOptions?.acceptNonStandardSearchParameters ?? false
this[kIgnoreTrailingSlash] = mockOptions?.ignoreTrailingSlash ?? false
// Instantiate Agent and encapsulate // Instantiate Agent and encapsulate
if (opts?.agent && typeof opts.agent.dispatch !== 'function') { if (opts?.agent && typeof opts.agent.dispatch !== 'function') {
@@ -41100,15 +40769,11 @@ class MockAgent extends Dispatcher {
} }
get (origin) { get (origin) {
const originKey = this[kIgnoreTrailingSlash] let dispatcher = this[kMockAgentGet](origin)
? origin.replace(/\/$/, '')
: origin
let dispatcher = this[kMockAgentGet](originKey)
if (!dispatcher) { if (!dispatcher) {
dispatcher = this[kFactory](originKey) dispatcher = this[kFactory](origin)
this[kMockAgentSet](originKey, dispatcher) this[kMockAgentSet](origin, dispatcher)
} }
return dispatcher return dispatcher
} }
@@ -41119,17 +40784,7 @@ class MockAgent extends Dispatcher {
this[kMockAgentAddCallHistoryLog](opts) this[kMockAgentAddCallHistoryLog](opts)
const acceptNonStandardSearchParameters = this[kMockAgentAcceptsNonStandardSearchParameters] return this[kAgent].dispatch(opts, handler)
const dispatchOpts = { ...opts }
if (acceptNonStandardSearchParameters && dispatchOpts.path) {
const [path, searchParams] = dispatchOpts.path.split('?')
const normalizedSearchParams = normalizeSearchParams(searchParams, acceptNonStandardSearchParameters)
dispatchOpts.path = `${path}?${normalizedSearchParams}`
}
return this[kAgent].dispatch(dispatchOpts, handler)
} }
async close () { async close () {
@@ -41209,7 +40864,7 @@ class MockAgent extends Dispatcher {
} }
[kMockAgentSet] (origin, dispatcher) { [kMockAgentSet] (origin, dispatcher) {
this[kClients].set(origin, { count: 0, dispatcher }) this[kClients].set(origin, dispatcher)
} }
[kFactory] (origin) { [kFactory] (origin) {
@@ -41221,9 +40876,9 @@ class MockAgent extends Dispatcher {
[kMockAgentGet] (origin) { [kMockAgentGet] (origin) {
// First check if we can immediately find it // First check if we can immediately find it
const result = this[kClients].get(origin) const client = this[kClients].get(origin)
if (result?.dispatcher) { if (client) {
return result.dispatcher return client
} }
// If the origin is not a string create a dummy parent pool and return to user // If the origin is not a string create a dummy parent pool and return to user
@@ -41234,11 +40889,11 @@ class MockAgent extends Dispatcher {
} }
// If we match, create a pool and assign the same dispatches // If we match, create a pool and assign the same dispatches
for (const [keyMatcher, result] of Array.from(this[kClients])) { for (const [keyMatcher, nonExplicitDispatcher] of Array.from(this[kClients])) {
if (result && typeof keyMatcher !== 'string' && matchValue(keyMatcher, origin)) { if (nonExplicitDispatcher && typeof keyMatcher !== 'string' && matchValue(keyMatcher, origin)) {
const dispatcher = this[kFactory](origin) const dispatcher = this[kFactory](origin)
this[kMockAgentSet](origin, dispatcher) this[kMockAgentSet](origin, dispatcher)
dispatcher[kDispatches] = result.dispatcher[kDispatches] dispatcher[kDispatches] = nonExplicitDispatcher[kDispatches]
return dispatcher return dispatcher
} }
} }
@@ -41252,7 +40907,7 @@ class MockAgent extends Dispatcher {
const mockAgentClients = this[kClients] const mockAgentClients = this[kClients]
return Array.from(mockAgentClients.entries()) return Array.from(mockAgentClients.entries())
.flatMap(([origin, result]) => result.dispatcher[kDispatches].map(dispatch => ({ ...dispatch, origin }))) .flatMap(([origin, scope]) => scope[kDispatches].map(dispatch => ({ ...dispatch, origin })))
.filter(({ pending }) => pending) .filter(({ pending }) => pending)
} }
@@ -41592,10 +41247,6 @@ class MockClient extends Client {
) )
} }
cleanMocks () {
this[kDispatches] = []
}
async [kClose] () { async [kClose] () {
await promisify(this[kOriginalClose])() await promisify(this[kOriginalClose])()
this[kConnected] = 0 this[kConnected] = 0
@@ -41912,10 +41563,6 @@ class MockPool extends Pool {
) )
} }
cleanMocks () {
this[kDispatches] = []
}
async [kClose] () { async [kClose] () {
await promisify(this[kOriginalClose])() await promisify(this[kOriginalClose])()
this[kConnected] = 0 this[kConnected] = 0
@@ -41960,7 +41607,6 @@ module.exports = {
kMockAgentRegisterCallHistory: Symbol('mock agent register mock call history'), kMockAgentRegisterCallHistory: Symbol('mock agent register mock call history'),
kMockAgentAddCallHistoryLog: Symbol('mock agent add call history log'), kMockAgentAddCallHistoryLog: Symbol('mock agent add call history log'),
kMockAgentIsCallHistoryEnabled: Symbol('mock agent is call history enabled'), kMockAgentIsCallHistoryEnabled: Symbol('mock agent is call history enabled'),
kMockAgentAcceptsNonStandardSearchParameters: Symbol('mock agent accepts non standard search parameters'),
kMockCallHistoryAddLog: Symbol('mock call history add log') kMockCallHistoryAddLog: Symbol('mock call history add log')
} }
@@ -42065,42 +41711,13 @@ function matchHeaders (mockDispatch, headers) {
return true return true
} }
function normalizeSearchParams (query) {
if (typeof query !== 'string') {
return query
}
const originalQp = new URLSearchParams(query)
const normalizedQp = new URLSearchParams()
for (let [key, value] of originalQp.entries()) {
key = key.replace('[]', '')
const valueRepresentsString = /^(['"]).*\1$/.test(value)
if (valueRepresentsString) {
normalizedQp.append(key, value)
continue
}
if (value.includes(',')) {
const values = value.split(',')
for (const v of values) {
normalizedQp.append(key, v)
}
continue
}
normalizedQp.append(key, value)
}
return normalizedQp
}
function safeUrl (path) { function safeUrl (path) {
if (typeof path !== 'string') { if (typeof path !== 'string') {
return path return path
} }
const pathSegments = path.split('?', 3)
const pathSegments = path.split('?')
if (pathSegments.length !== 2) { if (pathSegments.length !== 2) {
return path return path
} }
@@ -42378,10 +41995,6 @@ function buildAndValidateMockOptions (opts) {
throw new InvalidArgumentError('options.enableCallHistory must to be a boolean') throw new InvalidArgumentError('options.enableCallHistory must to be a boolean')
} }
if ('acceptNonStandardSearchParameters' in mockOptions && typeof mockOptions.acceptNonStandardSearchParameters !== 'boolean') {
throw new InvalidArgumentError('options.acceptNonStandardSearchParameters must to be a boolean')
}
return mockOptions return mockOptions
} }
} }
@@ -42401,8 +42014,7 @@ module.exports = {
checkNetConnect, checkNetConnect,
buildAndValidateMockOptions, buildAndValidateMockOptions,
getHeaderByName, getHeaderByName,
buildHeadersFromArray, buildHeadersFromArray
normalizeSearchParams
} }
@@ -42457,1115 +42069,6 @@ module.exports = class PendingInterceptorsFormatter {
} }
/***/ }),
/***/ 5095:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
const Agent = __nccwpck_require__(7405)
const MockAgent = __nccwpck_require__(7501)
const { SnapshotRecorder } = __nccwpck_require__(3766)
const WrapHandler = __nccwpck_require__(9510)
const { InvalidArgumentError, UndiciError } = __nccwpck_require__(8707)
const { validateSnapshotMode } = __nccwpck_require__(9683)
const kSnapshotRecorder = Symbol('kSnapshotRecorder')
const kSnapshotMode = Symbol('kSnapshotMode')
const kSnapshotPath = Symbol('kSnapshotPath')
const kSnapshotLoaded = Symbol('kSnapshotLoaded')
const kRealAgent = Symbol('kRealAgent')
// Static flag to ensure warning is only emitted once per process
let warningEmitted = false
class SnapshotAgent extends MockAgent {
constructor (opts = {}) {
// Emit experimental warning only once
if (!warningEmitted) {
process.emitWarning(
'SnapshotAgent is experimental and subject to change',
'ExperimentalWarning'
)
warningEmitted = true
}
const {
mode = 'record',
snapshotPath = null,
...mockAgentOpts
} = opts
super(mockAgentOpts)
validateSnapshotMode(mode)
// Validate snapshotPath is provided when required
if ((mode === 'playback' || mode === 'update') && !snapshotPath) {
throw new InvalidArgumentError(`snapshotPath is required when mode is '${mode}'`)
}
this[kSnapshotMode] = mode
this[kSnapshotPath] = snapshotPath
this[kSnapshotRecorder] = new SnapshotRecorder({
snapshotPath: this[kSnapshotPath],
mode: this[kSnapshotMode],
maxSnapshots: opts.maxSnapshots,
autoFlush: opts.autoFlush,
flushInterval: opts.flushInterval,
matchHeaders: opts.matchHeaders,
ignoreHeaders: opts.ignoreHeaders,
excludeHeaders: opts.excludeHeaders,
matchBody: opts.matchBody,
matchQuery: opts.matchQuery,
caseSensitive: opts.caseSensitive,
shouldRecord: opts.shouldRecord,
shouldPlayback: opts.shouldPlayback,
excludeUrls: opts.excludeUrls
})
this[kSnapshotLoaded] = false
// For recording/update mode, we need a real agent to make actual requests
if (this[kSnapshotMode] === 'record' || this[kSnapshotMode] === 'update') {
this[kRealAgent] = new Agent(opts)
}
// Auto-load snapshots in playback/update mode
if ((this[kSnapshotMode] === 'playback' || this[kSnapshotMode] === 'update') && this[kSnapshotPath]) {
this.loadSnapshots().catch(() => {
// Ignore load errors - file might not exist yet
})
}
}
dispatch (opts, handler) {
handler = WrapHandler.wrap(handler)
const mode = this[kSnapshotMode]
if (mode === 'playback' || mode === 'update') {
// Ensure snapshots are loaded
if (!this[kSnapshotLoaded]) {
// Need to load asynchronously, delegate to async version
return this.#asyncDispatch(opts, handler)
}
// Try to find existing snapshot (synchronous)
const snapshot = this[kSnapshotRecorder].findSnapshot(opts)
if (snapshot) {
// Use recorded response (synchronous)
return this.#replaySnapshot(snapshot, handler)
} else if (mode === 'update') {
// Make real request and record it (async required)
return this.#recordAndReplay(opts, handler)
} else {
// Playback mode but no snapshot found
const error = new UndiciError(`No snapshot found for ${opts.method || 'GET'} ${opts.path}`)
if (handler.onError) {
handler.onError(error)
return
}
throw error
}
} else if (mode === 'record') {
// Record mode - make real request and save response (async required)
return this.#recordAndReplay(opts, handler)
}
}
/**
* Async version of dispatch for when we need to load snapshots first
*/
async #asyncDispatch (opts, handler) {
await this.loadSnapshots()
return this.dispatch(opts, handler)
}
/**
* Records a real request and replays the response
*/
#recordAndReplay (opts, handler) {
const responseData = {
statusCode: null,
headers: {},
trailers: {},
body: []
}
const self = this // Capture 'this' context for use within nested handler callbacks
const recordingHandler = {
onRequestStart (controller, context) {
return handler.onRequestStart(controller, { ...context, history: this.history })
},
onRequestUpgrade (controller, statusCode, headers, socket) {
return handler.onRequestUpgrade(controller, statusCode, headers, socket)
},
onResponseStart (controller, statusCode, headers, statusMessage) {
responseData.statusCode = statusCode
responseData.headers = headers
return handler.onResponseStart(controller, statusCode, headers, statusMessage)
},
onResponseData (controller, chunk) {
responseData.body.push(chunk)
return handler.onResponseData(controller, chunk)
},
onResponseEnd (controller, trailers) {
responseData.trailers = trailers
// Record the interaction using captured 'self' context (fire and forget)
const responseBody = Buffer.concat(responseData.body)
self[kSnapshotRecorder].record(opts, {
statusCode: responseData.statusCode,
headers: responseData.headers,
body: responseBody,
trailers: responseData.trailers
}).then(() => {
handler.onResponseEnd(controller, trailers)
}).catch((error) => {
handler.onResponseError(controller, error)
})
}
}
// Use composed agent if available (includes interceptors), otherwise use real agent
const agent = this[kRealAgent]
return agent.dispatch(opts, recordingHandler)
}
/**
* Replays a recorded response
*
* @param {Object} snapshot - The recorded snapshot to replay.
* @param {Object} handler - The handler to call with the response data.
* @returns {void}
*/
#replaySnapshot (snapshot, handler) {
try {
const { response } = snapshot
const controller = {
pause () { },
resume () { },
abort (reason) {
this.aborted = true
this.reason = reason
},
aborted: false,
paused: false
}
handler.onRequestStart(controller)
handler.onResponseStart(controller, response.statusCode, response.headers)
// Body is always stored as base64 string
const body = Buffer.from(response.body, 'base64')
handler.onResponseData(controller, body)
handler.onResponseEnd(controller, response.trailers)
} catch (error) {
handler.onError?.(error)
}
}
/**
* Loads snapshots from file
*
* @param {string} [filePath] - Optional file path to load snapshots from.
* @returns {Promise<void>} - Resolves when snapshots are loaded.
*/
async loadSnapshots (filePath) {
await this[kSnapshotRecorder].loadSnapshots(filePath || this[kSnapshotPath])
this[kSnapshotLoaded] = true
// In playback mode, set up MockAgent interceptors for all snapshots
if (this[kSnapshotMode] === 'playback') {
this.#setupMockInterceptors()
}
}
/**
* Saves snapshots to file
*
* @param {string} [filePath] - Optional file path to save snapshots to.
* @returns {Promise<void>} - Resolves when snapshots are saved.
*/
async saveSnapshots (filePath) {
return this[kSnapshotRecorder].saveSnapshots(filePath || this[kSnapshotPath])
}
/**
* Sets up MockAgent interceptors based on recorded snapshots.
*
* This method creates MockAgent interceptors for each recorded snapshot,
* allowing the SnapshotAgent to fall back to MockAgent's standard intercept
* mechanism in playback mode. Each interceptor is configured to persist
* (remain active for multiple requests) and responds with the recorded
* response data.
*
* Called automatically when loading snapshots in playback mode.
*
* @returns {void}
*/
#setupMockInterceptors () {
for (const snapshot of this[kSnapshotRecorder].getSnapshots()) {
const { request, responses, response } = snapshot
const url = new URL(request.url)
const mockPool = this.get(url.origin)
// Handle both new format (responses array) and legacy format (response object)
const responseData = responses ? responses[0] : response
if (!responseData) continue
mockPool.intercept({
path: url.pathname + url.search,
method: request.method,
headers: request.headers,
body: request.body
}).reply(responseData.statusCode, responseData.body, {
headers: responseData.headers,
trailers: responseData.trailers
}).persist()
}
}
/**
* Gets the snapshot recorder
* @return {SnapshotRecorder} - The snapshot recorder instance
*/
getRecorder () {
return this[kSnapshotRecorder]
}
/**
* Gets the current mode
* @return {import('./snapshot-utils').SnapshotMode} - The current snapshot mode
*/
getMode () {
return this[kSnapshotMode]
}
/**
* Clears all snapshots
* @returns {void}
*/
clearSnapshots () {
this[kSnapshotRecorder].clear()
}
/**
* Resets call counts for all snapshots (useful for test cleanup)
* @returns {void}
*/
resetCallCounts () {
this[kSnapshotRecorder].resetCallCounts()
}
/**
* Deletes a specific snapshot by request options
* @param {import('./snapshot-recorder').SnapshotRequestOptions} requestOpts - Request options to identify the snapshot
* @return {Promise<boolean>} - Returns true if the snapshot was deleted, false if not found
*/
deleteSnapshot (requestOpts) {
return this[kSnapshotRecorder].deleteSnapshot(requestOpts)
}
/**
* Gets information about a specific snapshot
* @returns {import('./snapshot-recorder').SnapshotInfo|null} - Snapshot information or null if not found
*/
getSnapshotInfo (requestOpts) {
return this[kSnapshotRecorder].getSnapshotInfo(requestOpts)
}
/**
* Replaces all snapshots with new data (full replacement)
* @param {Array<{hash: string; snapshot: import('./snapshot-recorder').SnapshotEntryshotEntry}>|Record<string, import('./snapshot-recorder').SnapshotEntry>} snapshotData - New snapshot data to replace existing snapshots
* @returns {void}
*/
replaceSnapshots (snapshotData) {
this[kSnapshotRecorder].replaceSnapshots(snapshotData)
}
/**
* Closes the agent, saving snapshots and cleaning up resources.
*
* @returns {Promise<void>}
*/
async close () {
await this[kSnapshotRecorder].close()
await this[kRealAgent]?.close()
await super.close()
}
}
module.exports = SnapshotAgent
/***/ }),
/***/ 3766:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
const { writeFile, readFile, mkdir } = __nccwpck_require__(1455)
const { dirname, resolve } = __nccwpck_require__(6760)
const { setTimeout, clearTimeout } = __nccwpck_require__(7997)
const { InvalidArgumentError, UndiciError } = __nccwpck_require__(8707)
const { hashId, isUrlExcludedFactory, normalizeHeaders, createHeaderFilters } = __nccwpck_require__(9683)
/**
* @typedef {Object} SnapshotRequestOptions
* @property {string} method - HTTP method (e.g. 'GET', 'POST', etc.)
* @property {string} path - Request path
* @property {string} origin - Request origin (base URL)
* @property {import('./snapshot-utils').Headers|import('./snapshot-utils').UndiciHeaders} headers - Request headers
* @property {import('./snapshot-utils').NormalizedHeaders} _normalizedHeaders - Request headers as a lowercase object
* @property {string|Buffer} [body] - Request body (optional)
*/
/**
* @typedef {Object} SnapshotEntryRequest
* @property {string} method - HTTP method (e.g. 'GET', 'POST', etc.)
* @property {string} url - Full URL of the request
* @property {import('./snapshot-utils').NormalizedHeaders} headers - Normalized headers as a lowercase object
* @property {string|Buffer} [body] - Request body (optional)
*/
/**
* @typedef {Object} SnapshotEntryResponse
* @property {number} statusCode - HTTP status code of the response
* @property {import('./snapshot-utils').NormalizedHeaders} headers - Normalized response headers as a lowercase object
* @property {string} body - Response body as a base64url encoded string
* @property {Object} [trailers] - Optional response trailers
*/
/**
* @typedef {Object} SnapshotEntry
* @property {SnapshotEntryRequest} request - The request object
* @property {Array<SnapshotEntryResponse>} responses - Array of response objects
* @property {number} callCount - Number of times this snapshot has been called
* @property {string} timestamp - ISO timestamp of when the snapshot was created
*/
/**
* @typedef {Object} SnapshotRecorderMatchOptions
* @property {Array<string>} [matchHeaders=[]] - Headers to match (empty array means match all headers)
* @property {Array<string>} [ignoreHeaders=[]] - Headers to ignore for matching
* @property {Array<string>} [excludeHeaders=[]] - Headers to exclude from matching
* @property {boolean} [matchBody=true] - Whether to match request body
* @property {boolean} [matchQuery=true] - Whether to match query properties
* @property {boolean} [caseSensitive=false] - Whether header matching is case-sensitive
*/
/**
* @typedef {Object} SnapshotRecorderOptions
* @property {string} [snapshotPath] - Path to save/load snapshots
* @property {import('./snapshot-utils').SnapshotMode} [mode='record'] - Mode: 'record' or 'playback'
* @property {number} [maxSnapshots=Infinity] - Maximum number of snapshots to keep
* @property {boolean} [autoFlush=false] - Whether to automatically flush snapshots to disk
* @property {number} [flushInterval=30000] - Auto-flush interval in milliseconds (default: 30 seconds)
* @property {Array<string|RegExp>} [excludeUrls=[]] - URLs to exclude from recording
* @property {function} [shouldRecord=null] - Function to filter requests for recording
* @property {function} [shouldPlayback=null] - Function to filter requests
*/
/**
* @typedef {Object} SnapshotFormattedRequest
* @property {string} method - HTTP method (e.g. 'GET', 'POST', etc.)
* @property {string} url - Full URL of the request (with query parameters if matchQuery is true)
* @property {import('./snapshot-utils').NormalizedHeaders} headers - Normalized headers as a lowercase object
* @property {string} body - Request body (optional, only if matchBody is true)
*/
/**
* @typedef {Object} SnapshotInfo
* @property {string} hash - Hash key for the snapshot
* @property {SnapshotEntryRequest} request - The request object
* @property {number} responseCount - Number of responses recorded for this request
* @property {number} callCount - Number of times this snapshot has been called
* @property {string} timestamp - ISO timestamp of when the snapshot was created
*/
/**
* Formats a request for consistent snapshot storage
* Caches normalized headers to avoid repeated processing
*
* @param {SnapshotRequestOptions} opts - Request options
* @param {import('./snapshot-utils').HeaderFilters} headerFilters - Cached header sets for performance
* @param {SnapshotRecorderMatchOptions} [matchOptions] - Matching options for headers and body
* @returns {SnapshotFormattedRequest} - Formatted request object
*/
function formatRequestKey (opts, headerFilters, matchOptions = {}) {
const url = new URL(opts.path, opts.origin)
// Cache normalized headers if not already done
const normalized = opts._normalizedHeaders || normalizeHeaders(opts.headers)
if (!opts._normalizedHeaders) {
opts._normalizedHeaders = normalized
}
return {
method: opts.method || 'GET',
url: matchOptions.matchQuery !== false ? url.toString() : `${url.origin}${url.pathname}`,
headers: filterHeadersForMatching(normalized, headerFilters, matchOptions),
body: matchOptions.matchBody !== false && opts.body ? String(opts.body) : ''
}
}
/**
* Filters headers based on matching configuration
*
* @param {import('./snapshot-utils').Headers} headers - Headers to filter
* @param {import('./snapshot-utils').HeaderFilters} headerFilters - Cached sets for ignore, exclude, and match headers
* @param {SnapshotRecorderMatchOptions} [matchOptions] - Matching options for headers
*/
function filterHeadersForMatching (headers, headerFilters, matchOptions = {}) {
if (!headers || typeof headers !== 'object') return {}
const {
caseSensitive = false
} = matchOptions
const filtered = {}
const { ignore, exclude, match } = headerFilters
for (const [key, value] of Object.entries(headers)) {
const headerKey = caseSensitive ? key : key.toLowerCase()
// Skip if in exclude list (for security)
if (exclude.has(headerKey)) continue
// Skip if in ignore list (for matching)
if (ignore.has(headerKey)) continue
// If matchHeaders is specified, only include those headers
if (match.size !== 0) {
if (!match.has(headerKey)) continue
}
filtered[headerKey] = value
}
return filtered
}
/**
* Filters headers for storage (only excludes sensitive headers)
*
* @param {import('./snapshot-utils').Headers} headers - Headers to filter
* @param {import('./snapshot-utils').HeaderFilters} headerFilters - Cached sets for ignore, exclude, and match headers
* @param {SnapshotRecorderMatchOptions} [matchOptions] - Matching options for headers
*/
function filterHeadersForStorage (headers, headerFilters, matchOptions = {}) {
if (!headers || typeof headers !== 'object') return {}
const {
caseSensitive = false
} = matchOptions
const filtered = {}
const { exclude: excludeSet } = headerFilters
for (const [key, value] of Object.entries(headers)) {
const headerKey = caseSensitive ? key : key.toLowerCase()
// Skip if in exclude list (for security)
if (excludeSet.has(headerKey)) continue
filtered[headerKey] = value
}
return filtered
}
/**
* Creates a hash key for request matching
* Properly orders headers to avoid conflicts and uses crypto hashing when available
*
* @param {SnapshotFormattedRequest} formattedRequest - Request object
* @returns {string} - Base64url encoded hash of the request
*/
function createRequestHash (formattedRequest) {
const parts = [
formattedRequest.method,
formattedRequest.url
]
// Process headers in a deterministic way to avoid conflicts
if (formattedRequest.headers && typeof formattedRequest.headers === 'object') {
const headerKeys = Object.keys(formattedRequest.headers).sort()
for (const key of headerKeys) {
const values = Array.isArray(formattedRequest.headers[key])
? formattedRequest.headers[key]
: [formattedRequest.headers[key]]
// Add header name
parts.push(key)
// Add all values for this header, sorted for consistency
for (const value of values.sort()) {
parts.push(String(value))
}
}
}
// Add body
parts.push(formattedRequest.body)
const content = parts.join('|')
return hashId(content)
}
class SnapshotRecorder {
/** @type {NodeJS.Timeout | null} */
#flushTimeout
/** @type {import('./snapshot-utils').IsUrlExcluded} */
#isUrlExcluded
/** @type {Map<string, SnapshotEntry>} */
#snapshots = new Map()
/** @type {string|undefined} */
#snapshotPath
/** @type {number} */
#maxSnapshots = Infinity
/** @type {boolean} */
#autoFlush = false
/** @type {import('./snapshot-utils').HeaderFilters} */
#headerFilters
/**
* Creates a new SnapshotRecorder instance
* @param {SnapshotRecorderOptions&SnapshotRecorderMatchOptions} [options={}] - Configuration options for the recorder
*/
constructor (options = {}) {
this.#snapshotPath = options.snapshotPath
this.#maxSnapshots = options.maxSnapshots || Infinity
this.#autoFlush = options.autoFlush || false
this.flushInterval = options.flushInterval || 30000 // 30 seconds default
this._flushTimer = null
// Matching configuration
/** @type {Required<SnapshotRecorderMatchOptions>} */
this.matchOptions = {
matchHeaders: options.matchHeaders || [], // empty means match all headers
ignoreHeaders: options.ignoreHeaders || [],
excludeHeaders: options.excludeHeaders || [],
matchBody: options.matchBody !== false, // default: true
matchQuery: options.matchQuery !== false, // default: true
caseSensitive: options.caseSensitive || false
}
// Cache processed header sets to avoid recreating them on every request
this.#headerFilters = createHeaderFilters(this.matchOptions)
// Request filtering callbacks
this.shouldRecord = options.shouldRecord || (() => true) // function(requestOpts) -> boolean
this.shouldPlayback = options.shouldPlayback || (() => true) // function(requestOpts) -> boolean
// URL pattern filtering
this.#isUrlExcluded = isUrlExcludedFactory(options.excludeUrls) // Array of regex patterns or strings
// Start auto-flush timer if enabled
if (this.#autoFlush && this.#snapshotPath) {
this.#startAutoFlush()
}
}
/**
* Records a request-response interaction
* @param {SnapshotRequestOptions} requestOpts - Request options
* @param {SnapshotEntryResponse} response - Response data to record
* @return {Promise<void>} - Resolves when the recording is complete
*/
async record (requestOpts, response) {
// Check if recording should be filtered out
if (!this.shouldRecord(requestOpts)) {
return // Skip recording
}
// Check URL exclusion patterns
const url = new URL(requestOpts.path, requestOpts.origin).toString()
if (this.#isUrlExcluded(url)) {
return // Skip recording
}
const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions)
const hash = createRequestHash(request)
// Extract response data - always store body as base64
const normalizedHeaders = normalizeHeaders(response.headers)
/** @type {SnapshotEntryResponse} */
const responseData = {
statusCode: response.statusCode,
headers: filterHeadersForStorage(normalizedHeaders, this.#headerFilters, this.matchOptions),
body: Buffer.isBuffer(response.body)
? response.body.toString('base64')
: Buffer.from(String(response.body || '')).toString('base64'),
trailers: response.trailers
}
// Remove oldest snapshot if we exceed maxSnapshots limit
if (this.#snapshots.size >= this.#maxSnapshots && !this.#snapshots.has(hash)) {
const oldestKey = this.#snapshots.keys().next().value
this.#snapshots.delete(oldestKey)
}
// Support sequential responses - if snapshot exists, add to responses array
const existingSnapshot = this.#snapshots.get(hash)
if (existingSnapshot && existingSnapshot.responses) {
existingSnapshot.responses.push(responseData)
existingSnapshot.timestamp = new Date().toISOString()
} else {
this.#snapshots.set(hash, {
request,
responses: [responseData], // Always store as array for consistency
callCount: 0,
timestamp: new Date().toISOString()
})
}
// Auto-flush if enabled
if (this.#autoFlush && this.#snapshotPath) {
this.#scheduleFlush()
}
}
/**
* Finds a matching snapshot for the given request
* Returns the appropriate response based on call count for sequential responses
*
* @param {SnapshotRequestOptions} requestOpts - Request options to match
* @returns {SnapshotEntry&Record<'response', SnapshotEntryResponse>|undefined} - Matching snapshot response or undefined if not found
*/
findSnapshot (requestOpts) {
// Check if playback should be filtered out
if (!this.shouldPlayback(requestOpts)) {
return undefined // Skip playback
}
// Check URL exclusion patterns
const url = new URL(requestOpts.path, requestOpts.origin).toString()
if (this.#isUrlExcluded(url)) {
return undefined // Skip playback
}
const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions)
const hash = createRequestHash(request)
const snapshot = this.#snapshots.get(hash)
if (!snapshot) return undefined
// Handle sequential responses
const currentCallCount = snapshot.callCount || 0
const responseIndex = Math.min(currentCallCount, snapshot.responses.length - 1)
snapshot.callCount = currentCallCount + 1
return {
...snapshot,
response: snapshot.responses[responseIndex]
}
}
/**
* Loads snapshots from file
* @param {string} [filePath] - Optional file path to load snapshots from
* @return {Promise<void>} - Resolves when snapshots are loaded
*/
async loadSnapshots (filePath) {
const path = filePath || this.#snapshotPath
if (!path) {
throw new InvalidArgumentError('Snapshot path is required')
}
try {
const data = await readFile(resolve(path), 'utf8')
const parsed = JSON.parse(data)
// Convert array format back to Map
if (Array.isArray(parsed)) {
this.#snapshots.clear()
for (const { hash, snapshot } of parsed) {
this.#snapshots.set(hash, snapshot)
}
} else {
// Legacy object format
this.#snapshots = new Map(Object.entries(parsed))
}
} catch (error) {
if (error.code === 'ENOENT') {
// File doesn't exist yet - that's ok for recording mode
this.#snapshots.clear()
} else {
throw new UndiciError(`Failed to load snapshots from ${path}`, { cause: error })
}
}
}
/**
* Saves snapshots to file
*
* @param {string} [filePath] - Optional file path to save snapshots
* @returns {Promise<void>} - Resolves when snapshots are saved
*/
async saveSnapshots (filePath) {
const path = filePath || this.#snapshotPath
if (!path) {
throw new InvalidArgumentError('Snapshot path is required')
}
const resolvedPath = resolve(path)
// Ensure directory exists
await mkdir(dirname(resolvedPath), { recursive: true })
// Convert Map to serializable format
const data = Array.from(this.#snapshots.entries()).map(([hash, snapshot]) => ({
hash,
snapshot
}))
await writeFile(resolvedPath, JSON.stringify(data, null, 2), { flush: true })
}
/**
* Clears all recorded snapshots
* @returns {void}
*/
clear () {
this.#snapshots.clear()
}
/**
* Gets all recorded snapshots
* @return {Array<SnapshotEntry>} - Array of all recorded snapshots
*/
getSnapshots () {
return Array.from(this.#snapshots.values())
}
/**
* Gets snapshot count
* @return {number} - Number of recorded snapshots
*/
size () {
return this.#snapshots.size
}
/**
* Resets call counts for all snapshots (useful for test cleanup)
* @returns {void}
*/
resetCallCounts () {
for (const snapshot of this.#snapshots.values()) {
snapshot.callCount = 0
}
}
/**
* Deletes a specific snapshot by request options
* @param {SnapshotRequestOptions} requestOpts - Request options to match
* @returns {boolean} - True if snapshot was deleted, false if not found
*/
deleteSnapshot (requestOpts) {
const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions)
const hash = createRequestHash(request)
return this.#snapshots.delete(hash)
}
/**
* Gets information about a specific snapshot
* @param {SnapshotRequestOptions} requestOpts - Request options to match
* @returns {SnapshotInfo|null} - Snapshot information or null if not found
*/
getSnapshotInfo (requestOpts) {
const request = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions)
const hash = createRequestHash(request)
const snapshot = this.#snapshots.get(hash)
if (!snapshot) return null
return {
hash,
request: snapshot.request,
responseCount: snapshot.responses ? snapshot.responses.length : (snapshot.response ? 1 : 0), // .response for legacy snapshots
callCount: snapshot.callCount || 0,
timestamp: snapshot.timestamp
}
}
/**
* Replaces all snapshots with new data (full replacement)
* @param {Array<{hash: string; snapshot: SnapshotEntry}>|Record<string, SnapshotEntry>} snapshotData - New snapshot data to replace existing ones
* @returns {void}
*/
replaceSnapshots (snapshotData) {
this.#snapshots.clear()
if (Array.isArray(snapshotData)) {
for (const { hash, snapshot } of snapshotData) {
this.#snapshots.set(hash, snapshot)
}
} else if (snapshotData && typeof snapshotData === 'object') {
// Legacy object format
this.#snapshots = new Map(Object.entries(snapshotData))
}
}
/**
* Starts the auto-flush timer
* @returns {void}
*/
#startAutoFlush () {
return this.#scheduleFlush()
}
/**
* Stops the auto-flush timer
* @returns {void}
*/
#stopAutoFlush () {
if (this.#flushTimeout) {
clearTimeout(this.#flushTimeout)
// Ensure any pending flush is completed
this.saveSnapshots().catch(() => {
// Ignore flush errors
})
this.#flushTimeout = null
}
}
/**
* Schedules a flush (debounced to avoid excessive writes)
*/
#scheduleFlush () {
this.#flushTimeout = setTimeout(() => {
this.saveSnapshots().catch(() => {
// Ignore flush errors
})
if (this.#autoFlush) {
this.#flushTimeout?.refresh()
} else {
this.#flushTimeout = null
}
}, 1000) // 1 second debounce
}
/**
* Cleanup method to stop timers
* @returns {void}
*/
destroy () {
this.#stopAutoFlush()
if (this.#flushTimeout) {
clearTimeout(this.#flushTimeout)
this.#flushTimeout = null
}
}
/**
* Async close method that saves all recordings and performs cleanup
* @returns {Promise<void>}
*/
async close () {
// Save any pending recordings if we have a snapshot path
if (this.#snapshotPath && this.#snapshots.size !== 0) {
await this.saveSnapshots()
}
// Perform cleanup
this.destroy()
}
}
module.exports = { SnapshotRecorder, formatRequestKey, createRequestHash, filterHeadersForMatching, filterHeadersForStorage, createHeaderFilters }
/***/ }),
/***/ 9683:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
const { InvalidArgumentError } = __nccwpck_require__(8707)
/**
* @typedef {Object} HeaderFilters
* @property {Set<string>} ignore - Set of headers to ignore for matching
* @property {Set<string>} exclude - Set of headers to exclude from matching
* @property {Set<string>} match - Set of headers to match (empty means match
*/
/**
* Creates cached header sets for performance
*
* @param {import('./snapshot-recorder').SnapshotRecorderMatchOptions} matchOptions - Matching options for headers
* @returns {HeaderFilters} - Cached sets for ignore, exclude, and match headers
*/
function createHeaderFilters (matchOptions = {}) {
const { ignoreHeaders = [], excludeHeaders = [], matchHeaders = [], caseSensitive = false } = matchOptions
return {
ignore: new Set(ignoreHeaders.map(header => caseSensitive ? header : header.toLowerCase())),
exclude: new Set(excludeHeaders.map(header => caseSensitive ? header : header.toLowerCase())),
match: new Set(matchHeaders.map(header => caseSensitive ? header : header.toLowerCase()))
}
}
let crypto
try {
crypto = __nccwpck_require__(7598)
} catch { /* Fallback if crypto is not available */ }
/**
* @callback HashIdFunction
* @param {string} value - The value to hash
* @returns {string} - The base64url encoded hash of the value
*/
/**
* Generates a hash for a given value
* @type {HashIdFunction}
*/
const hashId = crypto?.hash
? (value) => crypto.hash('sha256', value, 'base64url')
: (value) => Buffer.from(value).toString('base64url')
/**
* @typedef {(url: string) => boolean} IsUrlExcluded Checks if a URL matches any of the exclude patterns
*/
/** @typedef {{[key: Lowercase<string>]: string}} NormalizedHeaders */
/** @typedef {Array<string>} UndiciHeaders */
/** @typedef {Record<string, string|string[]>} Headers */
/**
* @param {*} headers
* @returns {headers is UndiciHeaders}
*/
function isUndiciHeaders (headers) {
return Array.isArray(headers) && (headers.length & 1) === 0
}
/**
* Factory function to create a URL exclusion checker
* @param {Array<string| RegExp>} [excludePatterns=[]] - Array of patterns to exclude
* @returns {IsUrlExcluded} - A function that checks if a URL matches any of the exclude patterns
*/
function isUrlExcludedFactory (excludePatterns = []) {
if (excludePatterns.length === 0) {
return () => false
}
return function isUrlExcluded (url) {
let urlLowerCased
for (const pattern of excludePatterns) {
if (typeof pattern === 'string') {
if (!urlLowerCased) {
// Convert URL to lowercase only once
urlLowerCased = url.toLowerCase()
}
// Simple string match (case-insensitive)
if (urlLowerCased.includes(pattern.toLowerCase())) {
return true
}
} else if (pattern instanceof RegExp) {
// Regex pattern match
if (pattern.test(url)) {
return true
}
}
}
return false
}
}
/**
* Normalizes headers for consistent comparison
*
* @param {Object|UndiciHeaders} headers - Headers to normalize
* @returns {NormalizedHeaders} - Normalized headers as a lowercase object
*/
function normalizeHeaders (headers) {
/** @type {NormalizedHeaders} */
const normalizedHeaders = {}
if (!headers) return normalizedHeaders
// Handle array format (undici internal format: [name, value, name, value, ...])
if (isUndiciHeaders(headers)) {
for (let i = 0; i < headers.length; i += 2) {
const key = headers[i]
const value = headers[i + 1]
if (key && value !== undefined) {
// Convert Buffers to strings if needed
const keyStr = Buffer.isBuffer(key) ? key.toString() : key
const valueStr = Buffer.isBuffer(value) ? value.toString() : value
normalizedHeaders[keyStr.toLowerCase()] = valueStr
}
}
return normalizedHeaders
}
// Handle object format
if (headers && typeof headers === 'object') {
for (const [key, value] of Object.entries(headers)) {
if (key && typeof key === 'string') {
normalizedHeaders[key.toLowerCase()] = Array.isArray(value) ? value.join(', ') : String(value)
}
}
}
return normalizedHeaders
}
const validSnapshotModes = /** @type {const} */ (['record', 'playback', 'update'])
/** @typedef {typeof validSnapshotModes[number]} SnapshotMode */
/**
* @param {*} mode - The snapshot mode to validate
* @returns {asserts mode is SnapshotMode}
*/
function validateSnapshotMode (mode) {
if (!validSnapshotModes.includes(mode)) {
throw new InvalidArgumentError(`Invalid snapshot mode: ${mode}. Must be one of: ${validSnapshotModes.join(', ')}`)
}
}
module.exports = {
createHeaderFilters,
hashId,
isUndiciHeaders,
normalizeHeaders,
isUrlExcludedFactory,
validateSnapshotMode
}
/***/ }), /***/ }),
/***/ 7659: /***/ 7659:
@@ -43578,8 +42081,6 @@ const {
safeHTTPMethods safeHTTPMethods
} = __nccwpck_require__(3440) } = __nccwpck_require__(3440)
const { serializePathWithQuery } = __nccwpck_require__(3440)
/** /**
* @param {import('../../types/dispatcher.d.ts').default.DispatchOptions} opts * @param {import('../../types/dispatcher.d.ts').default.DispatchOptions} opts
*/ */
@@ -43588,27 +42089,7 @@ function makeCacheKey (opts) {
throw new Error('opts.origin is undefined') throw new Error('opts.origin is undefined')
} }
let fullPath /** @type {Record<string, string[] | string>} */
try {
fullPath = serializePathWithQuery(opts.path || '/', opts.query)
} catch (error) {
// If fails (path already has query params), use as-is
fullPath = opts.path || '/'
}
return {
origin: opts.origin.toString(),
method: opts.method,
path: fullPath,
headers: opts.headers
}
}
/**
* @param {Record<string, string[] | string>}
* @returns {Record<string, string[] | string>}
*/
function normalizeHeaders (opts) {
let headers let headers
if (opts.headers == null) { if (opts.headers == null) {
headers = {} headers = {}
@@ -43634,7 +42115,12 @@ function normalizeHeaders (opts) {
throw new Error('opts.headers is not an object') throw new Error('opts.headers is not an object')
} }
return headers return {
origin: opts.origin.toString(),
method: opts.method,
path: opts.path,
headers
}
} }
/** /**
@@ -43808,7 +42294,7 @@ function parseCacheControlHeader (header) {
} }
} }
} else { } else {
// Something like `no-cache="some-header"` // Something like `no-cache=some-header`
if (key in output) { if (key in output) {
output[key] = output[key].concat(value) output[key] = output[key].concat(value)
} else { } else {
@@ -43941,7 +42427,6 @@ function assertCacheMethods (methods, name = 'CacheMethods') {
module.exports = { module.exports = {
makeCacheKey, makeCacheKey,
normalizeHeaders,
assertCacheKey, assertCacheKey,
assertCacheValue, assertCacheValue,
parseCacheControlHeader, parseCacheControlHeader,
@@ -44219,82 +42704,6 @@ module.exports = {
} }
/***/ }),
/***/ 6436:
/***/ ((module) => {
"use strict";
/**
* @template {*} T
* @typedef {Object} DeferredPromise
* @property {Promise<T>} promise
* @property {(value?: T) => void} resolve
* @property {(reason?: any) => void} reject
*/
/**
* @template {*} T
* @returns {DeferredPromise<T>} An object containing a promise and its resolve/reject methods.
*/
function createDeferredPromise () {
let res
let rej
const promise = new Promise((resolve, reject) => {
res = resolve
rej = reject
})
return { promise, resolve: res, reject: rej }
}
module.exports = {
createDeferredPromise
}
/***/ }),
/***/ 6854:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
const {
kConnected,
kPending,
kRunning,
kSize,
kFree,
kQueued
} = __nccwpck_require__(6443)
class ClientStats {
constructor (client) {
this.connected = client[kConnected]
this.pending = client[kPending]
this.running = client[kRunning]
this.size = client[kSize]
}
}
class PoolStats {
constructor (pool) {
this.connected = pool[kConnected]
this.free = pool[kFree]
this.pending = pool[kPending]
this.queued = pool[kQueued]
this.running = pool[kRunning]
this.size = pool[kSize]
}
}
module.exports = { ClientStats, PoolStats }
/***/ }), /***/ }),
/***/ 6603: /***/ 6603:
@@ -44491,21 +42900,19 @@ function onTick () {
} }
function refreshTimeout () { function refreshTimeout () {
// If the fastNowTimeout is already set and the Timer has the refresh()- // If the fastNowTimeout is already set, refresh it.
// method available, call it to refresh the timer. if (fastNowTimeout) {
// Some timer objects returned by setTimeout may not have a .refresh()
// method (e.g. mocked timers in tests).
if (fastNowTimeout?.refresh) {
fastNowTimeout.refresh() fastNowTimeout.refresh()
// fastNowTimeout is not instantiated yet or refresh is not availabe, // fastNowTimeout is not instantiated yet, create a new Timer.
// create a new Timer.
} else { } else {
clearTimeout(fastNowTimeout) clearTimeout(fastNowTimeout)
fastNowTimeout = setTimeout(onTick, TICK_MS) fastNowTimeout = setTimeout(onTick, TICK_MS)
// If the Timer has an unref method, call it to allow the process to exit,
// if there are no other active handles. When using fake timers or mocked // If the Timer has an unref method, call it to allow the process to exit if
// environments (like Jest), .unref() may not be defined, // there are no other active handles.
fastNowTimeout?.unref() if (fastNowTimeout.unref) {
fastNowTimeout.unref()
}
} }
} }
@@ -44736,17 +43143,15 @@ module.exports = {
"use strict"; "use strict";
const assert = __nccwpck_require__(4589)
const { kConstruct } = __nccwpck_require__(6443) const { kConstruct } = __nccwpck_require__(6443)
const { urlEquals, getFieldValues } = __nccwpck_require__(6798) const { urlEquals, getFieldValues } = __nccwpck_require__(6798)
const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(3440) const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(3440)
const { webidl } = __nccwpck_require__(7879) const { webidl } = __nccwpck_require__(5893)
const { cloneResponse, fromInnerResponse, getResponseState } = __nccwpck_require__(9051) const { cloneResponse, fromInnerResponse, getResponseState } = __nccwpck_require__(9051)
const { Request, fromInnerRequest, getRequestState } = __nccwpck_require__(9967) const { Request, fromInnerRequest, getRequestState } = __nccwpck_require__(9967)
const { fetching } = __nccwpck_require__(4398) const { fetching } = __nccwpck_require__(4398)
const { urlIsHttpHttpsScheme, readAllBytes } = __nccwpck_require__(3168) const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(3168)
const { createDeferredPromise } = __nccwpck_require__(6436) const assert = __nccwpck_require__(4589)
/** /**
* @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation * @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation
@@ -44754,7 +43159,7 @@ const { createDeferredPromise } = __nccwpck_require__(6436)
* @property {'delete' | 'put'} type * @property {'delete' | 'put'} type
* @property {any} request * @property {any} request
* @property {any} response * @property {any} response
* @property {import('../../../types/cache').CacheQueryOptions} options * @property {import('../../types/cache').CacheQueryOptions} options
*/ */
/** /**
@@ -44784,7 +43189,7 @@ class Cache {
const prefix = 'Cache.match' const prefix = 'Cache.match'
webidl.argumentLengthCheck(arguments, 1, prefix) webidl.argumentLengthCheck(arguments, 1, prefix)
request = webidl.converters.RequestInfo(request) request = webidl.converters.RequestInfo(request, prefix, 'request')
options = webidl.converters.CacheQueryOptions(options, prefix, 'options') options = webidl.converters.CacheQueryOptions(options, prefix, 'options')
const p = this.#internalMatchAll(request, options, 1) const p = this.#internalMatchAll(request, options, 1)
@@ -44800,7 +43205,7 @@ class Cache {
webidl.brandCheck(this, Cache) webidl.brandCheck(this, Cache)
const prefix = 'Cache.matchAll' const prefix = 'Cache.matchAll'
if (request !== undefined) request = webidl.converters.RequestInfo(request) if (request !== undefined) request = webidl.converters.RequestInfo(request, prefix, 'request')
options = webidl.converters.CacheQueryOptions(options, prefix, 'options') options = webidl.converters.CacheQueryOptions(options, prefix, 'options')
return this.#internalMatchAll(request, options) return this.#internalMatchAll(request, options)
@@ -44812,7 +43217,7 @@ class Cache {
const prefix = 'Cache.add' const prefix = 'Cache.add'
webidl.argumentLengthCheck(arguments, 1, prefix) webidl.argumentLengthCheck(arguments, 1, prefix)
request = webidl.converters.RequestInfo(request) request = webidl.converters.RequestInfo(request, prefix, 'request')
// 1. // 1.
const requests = [request] const requests = [request]
@@ -45000,7 +43405,7 @@ class Cache {
const prefix = 'Cache.put' const prefix = 'Cache.put'
webidl.argumentLengthCheck(arguments, 2, prefix) webidl.argumentLengthCheck(arguments, 2, prefix)
request = webidl.converters.RequestInfo(request) request = webidl.converters.RequestInfo(request, prefix, 'request')
response = webidl.converters.Response(response, prefix, 'response') response = webidl.converters.Response(response, prefix, 'response')
// 1. // 1.
@@ -45131,7 +43536,7 @@ class Cache {
const prefix = 'Cache.delete' const prefix = 'Cache.delete'
webidl.argumentLengthCheck(arguments, 1, prefix) webidl.argumentLengthCheck(arguments, 1, prefix)
request = webidl.converters.RequestInfo(request) request = webidl.converters.RequestInfo(request, prefix, 'request')
options = webidl.converters.CacheQueryOptions(options, prefix, 'options') options = webidl.converters.CacheQueryOptions(options, prefix, 'options')
/** /**
@@ -45188,7 +43593,7 @@ class Cache {
/** /**
* @see https://w3c.github.io/ServiceWorker/#dom-cache-keys * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys
* @param {any} request * @param {any} request
* @param {import('../../../types/cache').CacheQueryOptions} options * @param {import('../../types/cache').CacheQueryOptions} options
* @returns {Promise<readonly Request[]>} * @returns {Promise<readonly Request[]>}
*/ */
async keys (request = undefined, options = {}) { async keys (request = undefined, options = {}) {
@@ -45196,7 +43601,7 @@ class Cache {
const prefix = 'Cache.keys' const prefix = 'Cache.keys'
if (request !== undefined) request = webidl.converters.RequestInfo(request) if (request !== undefined) request = webidl.converters.RequestInfo(request, prefix, 'request')
options = webidl.converters.CacheQueryOptions(options, prefix, 'options') options = webidl.converters.CacheQueryOptions(options, prefix, 'options')
// 1. // 1.
@@ -45406,7 +43811,7 @@ class Cache {
/** /**
* @see https://w3c.github.io/ServiceWorker/#query-cache * @see https://w3c.github.io/ServiceWorker/#query-cache
* @param {any} requestQuery * @param {any} requestQuery
* @param {import('../../../types/cache').CacheQueryOptions} options * @param {import('../../types/cache').CacheQueryOptions} options
* @param {requestResponseList} targetStorage * @param {requestResponseList} targetStorage
* @returns {requestResponseList} * @returns {requestResponseList}
*/ */
@@ -45431,7 +43836,7 @@ class Cache {
* @param {any} requestQuery * @param {any} requestQuery
* @param {any} request * @param {any} request
* @param {any | null} response * @param {any | null} response
* @param {import('../../../types/cache').CacheQueryOptions | undefined} options * @param {import('../../types/cache').CacheQueryOptions | undefined} options
* @returns {boolean} * @returns {boolean}
*/ */
#requestMatchesCachedItem (requestQuery, request, response = null, options) { #requestMatchesCachedItem (requestQuery, request, response = null, options) {
@@ -45609,7 +44014,7 @@ module.exports = {
const { Cache } = __nccwpck_require__(9634) const { Cache } = __nccwpck_require__(9634)
const { webidl } = __nccwpck_require__(7879) const { webidl } = __nccwpck_require__(5893)
const { kEnumerableProperty } = __nccwpck_require__(3440) const { kEnumerableProperty } = __nccwpck_require__(3440)
const { kConstruct } = __nccwpck_require__(6443) const { kConstruct } = __nccwpck_require__(6443)
@@ -45843,7 +44248,7 @@ module.exports = {
const { parseSetCookie } = __nccwpck_require__(1978) const { parseSetCookie } = __nccwpck_require__(1978)
const { stringify } = __nccwpck_require__(7797) const { stringify } = __nccwpck_require__(7797)
const { webidl } = __nccwpck_require__(7879) const { webidl } = __nccwpck_require__(5893)
const { Headers } = __nccwpck_require__(660) const { Headers } = __nccwpck_require__(660)
const brandChecks = webidl.brandCheckMultiple([Headers, globalThis.Headers].filter(Boolean)) const brandChecks = webidl.brandCheckMultiple([Headers, globalThis.Headers].filter(Boolean))
@@ -47078,7 +45483,7 @@ module.exports = {
const { pipeline } = __nccwpck_require__(7075) const { pipeline } = __nccwpck_require__(7075)
const { fetching } = __nccwpck_require__(4398) const { fetching } = __nccwpck_require__(4398)
const { makeRequest } = __nccwpck_require__(9967) const { makeRequest } = __nccwpck_require__(9967)
const { webidl } = __nccwpck_require__(7879) const { webidl } = __nccwpck_require__(5893)
const { EventSourceStream } = __nccwpck_require__(4031) const { EventSourceStream } = __nccwpck_require__(4031)
const { parseMIMEType } = __nccwpck_require__(1900) const { parseMIMEType } = __nccwpck_require__(1900)
const { createFastMessageEvent } = __nccwpck_require__(5188) const { createFastMessageEvent } = __nccwpck_require__(5188)
@@ -47199,10 +45604,10 @@ class EventSource extends EventTarget {
url = webidl.converters.USVString(url) url = webidl.converters.USVString(url)
eventSourceInitDict = webidl.converters.EventSourceInitDict(eventSourceInitDict, prefix, 'eventSourceInitDict') eventSourceInitDict = webidl.converters.EventSourceInitDict(eventSourceInitDict, prefix, 'eventSourceInitDict')
this.#dispatcher = eventSourceInitDict.node.dispatcher || eventSourceInitDict.dispatcher this.#dispatcher = eventSourceInitDict.dispatcher
this.#state = { this.#state = {
lastEventId: '', lastEventId: '',
reconnectionTime: eventSourceInitDict.node.reconnectionTime reconnectionTime: defaultReconnectionTime
} }
// 2. Let settings be ev's relevant settings object. // 2. Let settings be ev's relevant settings object.
@@ -47306,9 +45711,12 @@ class EventSource extends EventTarget {
// 14. Let processEventSourceEndOfBody given response res be the following step: if res is not a network error, then reestablish the connection. // 14. Let processEventSourceEndOfBody given response res be the following step: if res is not a network error, then reestablish the connection.
const processEventSourceEndOfBody = (response) => { const processEventSourceEndOfBody = (response) => {
if (!isNetworkError(response)) { if (isNetworkError(response)) {
return this.#reconnect() this.dispatchEvent(new Event('error'))
this.close()
} }
this.#reconnect()
} }
// 15. Fetch request, with processResponseEndOfBody set to processEventSourceEndOfBody... // 15. Fetch request, with processResponseEndOfBody set to processEventSourceEndOfBody...
@@ -47547,21 +45955,6 @@ webidl.converters.EventSourceInitDict = webidl.dictionaryConverter([
{ {
key: 'dispatcher', // undici only key: 'dispatcher', // undici only
converter: webidl.converters.any converter: webidl.converters.any
},
{
key: 'node', // undici only
converter: webidl.dictionaryConverter([
{
key: 'reconnectionTime',
converter: webidl.converters['unsigned long'],
defaultValue: () => defaultReconnectionTime
},
{
key: 'dispatcher',
converter: webidl.converters.any
}
]),
defaultValue: () => ({})
} }
]) ])
@@ -47605,7 +45998,7 @@ function isASCIINumber (value) {
// https://github.com/nodejs/undici/issues/2664 // https://github.com/nodejs/undici/issues/2664
function delay (ms) { function delay (ms) {
return new Promise((resolve) => { return new Promise((resolve) => {
setTimeout(resolve, ms) setTimeout(resolve, ms).unref()
}) })
} }
@@ -47628,19 +46021,19 @@ const util = __nccwpck_require__(3440)
const { const {
ReadableStreamFrom, ReadableStreamFrom,
readableStreamClose, readableStreamClose,
createDeferredPromise,
fullyReadBody, fullyReadBody,
extractMimeType, extractMimeType,
utf8DecodeBytes utf8DecodeBytes
} = __nccwpck_require__(3168) } = __nccwpck_require__(3168)
const { FormData, setFormDataState } = __nccwpck_require__(5910) const { FormData, setFormDataState } = __nccwpck_require__(5910)
const { webidl } = __nccwpck_require__(7879) const { webidl } = __nccwpck_require__(5893)
const { Blob } = __nccwpck_require__(4573)
const assert = __nccwpck_require__(4589) const assert = __nccwpck_require__(4589)
const { isErrored, isDisturbed } = __nccwpck_require__(7075) const { isErrored, isDisturbed } = __nccwpck_require__(7075)
const { isArrayBuffer } = __nccwpck_require__(3429) const { isArrayBuffer } = __nccwpck_require__(3429)
const { serializeAMimeType } = __nccwpck_require__(1900) const { serializeAMimeType } = __nccwpck_require__(1900)
const { multipartFormDataParser } = __nccwpck_require__(116) const { multipartFormDataParser } = __nccwpck_require__(116)
const { createDeferredPromise } = __nccwpck_require__(6436)
let random let random
try { try {
@@ -47653,22 +46046,19 @@ try {
const textEncoder = new TextEncoder() const textEncoder = new TextEncoder()
function noop () {} function noop () {}
const streamRegistry = new FinalizationRegistry((weakRef) => { const hasFinalizationRegistry = globalThis.FinalizationRegistry && process.version.indexOf('v18') !== 0
const stream = weakRef.deref() let streamRegistry
if (stream && !stream.locked && !isDisturbed(stream) && !isErrored(stream)) {
stream.cancel('Response object has been garbage collected').catch(noop)
}
})
/** if (hasFinalizationRegistry) {
* Extract a body with type from a byte sequence or BodyInit object streamRegistry = new FinalizationRegistry((weakRef) => {
* const stream = weakRef.deref()
* @param {import('../../../types').BodyInit} object - The BodyInit object to extract from if (stream && !stream.locked && !isDisturbed(stream) && !isErrored(stream)) {
* @param {boolean} [keepalive=false] - If true, indicates that the body stream.cancel('Response object has been garbage collected').catch(noop)
* @returns {[{stream: ReadableStream, source: any, length: number | null}, string | null]} - Returns a tuple containing the body and its type }
* })
* @see https://fetch.spec.whatwg.org/#concept-bodyinit-extract }
*/
// https://fetch.spec.whatwg.org/#concept-bodyinit-extract
function extractBody (object, keepalive = false) { function extractBody (object, keepalive = false) {
// 1. Let stream be null. // 1. Let stream be null.
let stream = null let stream = null
@@ -47894,22 +46284,7 @@ function extractBody (object, keepalive = false) {
return [body, type] return [body, type]
} }
/** // https://fetch.spec.whatwg.org/#bodyinit-safely-extract
* @typedef {object} ExtractBodyResult
* @property {ReadableStream<Uint8Array<ArrayBuffer>>} stream - The ReadableStream containing the body data
* @property {any} source - The original source of the body data
* @property {number | null} length - The length of the body data, or null
*/
/**
* Safely extract a body with type from a byte sequence or BodyInit object.
*
* @param {import('../../../types').BodyInit} object - The BodyInit object to extract from
* @param {boolean} [keepalive=false] - If true, indicates that the body
* @returns {[ExtractBodyResult, string | null]} - Returns a tuple containing the body and its type
*
* @see https://fetch.spec.whatwg.org/#bodyinit-safely-extract
*/
function safelyExtractBody (object, keepalive = false) { function safelyExtractBody (object, keepalive = false) {
// To safely extract a body and a `Content-Type` value from // To safely extract a body and a `Content-Type` value from
// a byte sequence or BodyInit object object, run these steps: // a byte sequence or BodyInit object object, run these steps:
@@ -47917,7 +46292,9 @@ function safelyExtractBody (object, keepalive = false) {
// 1. If object is a ReadableStream object, then: // 1. If object is a ReadableStream object, then:
if (webidl.is.ReadableStream(object)) { if (webidl.is.ReadableStream(object)) {
// Assert: object is neither disturbed nor locked. // Assert: object is neither disturbed nor locked.
// istanbul ignore next
assert(!util.isDisturbed(object), 'The body has already been consumed.') assert(!util.isDisturbed(object), 'The body has already been consumed.')
// istanbul ignore next
assert(!object.locked, 'The stream is locked.') assert(!object.locked, 'The stream is locked.')
} }
@@ -47925,13 +46302,17 @@ function safelyExtractBody (object, keepalive = false) {
return extractBody(object, keepalive) return extractBody(object, keepalive)
} }
function cloneBody (body) { function cloneBody (instance, body) {
// To clone a body body, run these steps: // To clone a body body, run these steps:
// https://fetch.spec.whatwg.org/#concept-body-clone // https://fetch.spec.whatwg.org/#concept-body-clone
// 1. Let « out1, out2 » be the result of teeing body’s stream. // 1. Let « out1, out2 » be the result of teeing body’s stream.
const { 0: out1, 1: out2 } = body.stream.tee() const [out1, out2] = body.stream.tee()
if (hasFinalizationRegistry) {
streamRegistry.register(instance, new WeakRef(out1))
}
// 2. Set body’s stream to out1. // 2. Set body’s stream to out1.
body.stream = out1 body.stream = out1
@@ -48163,6 +46544,7 @@ module.exports = {
cloneBody, cloneBody,
mixinBody, mixinBody,
streamRegistry, streamRegistry,
hasFinalizationRegistry,
bodyUnusable bodyUnusable
} }
@@ -49058,6 +47440,60 @@ module.exports = {
} }
/***/ }),
/***/ 6653:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
const { kConnected, kSize } = __nccwpck_require__(6443)
class CompatWeakRef {
constructor (value) {
this.value = value
}
deref () {
return this.value[kConnected] === 0 && this.value[kSize] === 0
? undefined
: this.value
}
}
class CompatFinalizer {
constructor (finalizer) {
this.finalizer = finalizer
}
register (dispatcher, key) {
if (dispatcher.on) {
dispatcher.on('disconnect', () => {
if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) {
this.finalizer(key)
}
})
}
}
unregister (key) {}
}
module.exports = function () {
// FIXME: remove workaround when the Node bug is backported to v18
// https://github.com/nodejs/node/issues/49344#issuecomment-1741776308
if (process.env.NODE_V8_COVERAGE && process.version.startsWith('v18')) {
process._rawDebug('Using compatibility WeakRef and FinalizationRegistry')
return {
WeakRef: CompatWeakRef,
FinalizationRegistry: CompatFinalizer
}
}
return { WeakRef, FinalizationRegistry }
}
/***/ }), /***/ }),
/***/ 116: /***/ 116:
@@ -49066,12 +47502,15 @@ module.exports = {
"use strict"; "use strict";
const { bufferToLowerCasedHeaderName } = __nccwpck_require__(3440) const { isUSVString, bufferToLowerCasedHeaderName } = __nccwpck_require__(3440)
const { utf8DecodeBytes } = __nccwpck_require__(3168) const { utf8DecodeBytes } = __nccwpck_require__(3168)
const { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = __nccwpck_require__(1900) const { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = __nccwpck_require__(1900)
const { makeEntry } = __nccwpck_require__(5910) const { makeEntry } = __nccwpck_require__(5910)
const { webidl } = __nccwpck_require__(7879) const { webidl } = __nccwpck_require__(5893)
const assert = __nccwpck_require__(4589) const assert = __nccwpck_require__(4589)
const { File: NodeFile } = __nccwpck_require__(4573)
const File = globalThis.File ?? NodeFile
const formDataNameBuffer = Buffer.from('form-data; name="') const formDataNameBuffer = Buffer.from('form-data; name="')
const filenameBuffer = Buffer.from('filename') const filenameBuffer = Buffer.from('filename')
@@ -49263,8 +47702,8 @@ function multipartFormDataParser (input, mimeType) {
} }
// 5.12. Assert: name is a scalar value string and value is either a scalar value string or a File object. // 5.12. Assert: name is a scalar value string and value is either a scalar value string or a File object.
assert(webidl.is.USVString(name)) assert(isUSVString(name))
assert((typeof value === 'string' && webidl.is.USVString(value)) || webidl.is.File(value)) assert((typeof value === 'string' && isUSVString(value)) || webidl.is.File(value))
// 5.13. Create an entry with name and value, and append it to entry list. // 5.13. Create an entry with name and value, and append it to entry list.
entryList.push(makeEntry(name, value, filename)) entryList.push(makeEntry(name, value, filename))
@@ -49574,14 +48013,18 @@ module.exports = {
const { iteratorMixin } = __nccwpck_require__(3168) const { iteratorMixin } = __nccwpck_require__(3168)
const { kEnumerableProperty } = __nccwpck_require__(3440) const { kEnumerableProperty } = __nccwpck_require__(3440)
const { webidl } = __nccwpck_require__(7879) const { webidl } = __nccwpck_require__(5893)
const { File: NativeFile } = __nccwpck_require__(4573)
const nodeUtil = __nccwpck_require__(7975) const nodeUtil = __nccwpck_require__(7975)
/** @type {globalThis['File']} */
const File = globalThis.File ?? NativeFile
// https://xhr.spec.whatwg.org/#formdata // https://xhr.spec.whatwg.org/#formdata
class FormData { class FormData {
#state = [] #state = []
constructor (form = undefined) { constructor (form) {
webidl.util.markAsUncloneable(this) webidl.util.markAsUncloneable(this)
if (form !== undefined) { if (form !== undefined) {
@@ -49896,7 +48339,7 @@ const {
isValidHeaderName, isValidHeaderName,
isValidHeaderValue isValidHeaderValue
} = __nccwpck_require__(3168) } = __nccwpck_require__(3168)
const { webidl } = __nccwpck_require__(7879) const { webidl } = __nccwpck_require__(5893)
const assert = __nccwpck_require__(4589) const assert = __nccwpck_require__(4589)
const util = __nccwpck_require__(7975) const util = __nccwpck_require__(7975)
@@ -50644,6 +49087,7 @@ const {
crossOriginResourcePolicyCheck, crossOriginResourcePolicyCheck,
determineRequestsReferrer, determineRequestsReferrer,
coarsenedSharedCurrentTime, coarsenedSharedCurrentTime,
createDeferredPromise,
sameOrigin, sameOrigin,
isCancelled, isCancelled,
isAborted, isAborted,
@@ -50674,9 +49118,8 @@ const { Readable, pipeline, finished, isErrored, isReadable } = __nccwpck_requir
const { addAbortListener, bufferToLowerCasedHeaderName } = __nccwpck_require__(3440) const { addAbortListener, bufferToLowerCasedHeaderName } = __nccwpck_require__(3440)
const { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = __nccwpck_require__(1900) const { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = __nccwpck_require__(1900)
const { getGlobalDispatcher } = __nccwpck_require__(2581) const { getGlobalDispatcher } = __nccwpck_require__(2581)
const { webidl } = __nccwpck_require__(7879) const { webidl } = __nccwpck_require__(5893)
const { STATUS_CODES } = __nccwpck_require__(7067) const { STATUS_CODES } = __nccwpck_require__(7067)
const { createDeferredPromise } = __nccwpck_require__(6436)
const GET_OR_HEAD = ['GET', 'HEAD'] const GET_OR_HEAD = ['GET', 'HEAD']
const defaultUserAgent = typeof __UNDICI_IS_NODE__ !== 'undefined' || typeof esbuildDetection !== 'undefined' const defaultUserAgent = typeof __UNDICI_IS_NODE__ !== 'undefined' || typeof esbuildDetection !== 'undefined'
@@ -50923,9 +49366,7 @@ function finalizeAndReportTiming (response, initiatorType = 'other') {
originalURL.href, originalURL.href,
initiatorType, initiatorType,
globalThis, globalThis,
cacheState, cacheState
'', // bodyType
response.status
) )
} }
@@ -51121,258 +49562,257 @@ function fetching ({
} }
// 16. Run main fetch given fetchParams. // 16. Run main fetch given fetchParams.
mainFetch(fetchParams, false) mainFetch(fetchParams)
.catch(err => {
fetchParams.controller.terminate(err)
})
// 17. Return fetchParam's controller // 17. Return fetchParam's controller
return fetchParams.controller return fetchParams.controller
} }
// https://fetch.spec.whatwg.org/#concept-main-fetch // https://fetch.spec.whatwg.org/#concept-main-fetch
async function mainFetch (fetchParams, recursive) { async function mainFetch (fetchParams, recursive = false) {
try { // 1. Let request be fetchParams’s request.
// 1. Let request be fetchParams’s request. const request = fetchParams.request
const request = fetchParams.request
// 2. Let response be null. // 2. Let response be null.
let response = null let response = null
// 3. If request’s local-URLs-only flag is set and request’s current URL is // 3. If request’s local-URLs-only flag is set and request’s current URL is
// not local, then set response to a network error. // not local, then set response to a network error.
if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) { if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) {
response = makeNetworkError('local URLs only') response = makeNetworkError('local URLs only')
} }
// 4. Run report Content Security Policy violations for request. // 4. Run report Content Security Policy violations for request.
// TODO // TODO
// 5. Upgrade request to a potentially trustworthy URL, if appropriate. // 5. Upgrade request to a potentially trustworthy URL, if appropriate.
tryUpgradeRequestToAPotentiallyTrustworthyURL(request) tryUpgradeRequestToAPotentiallyTrustworthyURL(request)
// 6. If should request be blocked due to a bad port, should fetching request // 6. If should request be blocked due to a bad port, should fetching request
// be blocked as mixed content, or should request be blocked by Content // be blocked as mixed content, or should request be blocked by Content
// Security Policy returns blocked, then set response to a network error. // Security Policy returns blocked, then set response to a network error.
if (requestBadPort(request) === 'blocked') { if (requestBadPort(request) === 'blocked') {
response = makeNetworkError('bad port') response = makeNetworkError('bad port')
} }
// TODO: should fetching request be blocked as mixed content? // TODO: should fetching request be blocked as mixed content?
// TODO: should request be blocked by Content Security Policy? // TODO: should request be blocked by Content Security Policy?
// 7. If request’s referrer policy is the empty string, then set request’s // 7. If request’s referrer policy is the empty string, then set request’s
// referrer policy to request’s policy container’s referrer policy. // referrer policy to request’s policy container’s referrer policy.
if (request.referrerPolicy === '') { if (request.referrerPolicy === '') {
request.referrerPolicy = request.policyContainer.referrerPolicy request.referrerPolicy = request.policyContainer.referrerPolicy
} }
// 8. If request’s referrer is not "no-referrer", then set request’s // 8. If request’s referrer is not "no-referrer", then set request’s
// referrer to the result of invoking determine request’s referrer. // referrer to the result of invoking determine request’s referrer.
if (request.referrer !== 'no-referrer') { if (request.referrer !== 'no-referrer') {
request.referrer = determineRequestsReferrer(request) request.referrer = determineRequestsReferrer(request)
} }
// 9. Set request’s current URL’s scheme to "https" if all of the following // 9. Set request’s current URL’s scheme to "https" if all of the following
// conditions are true: // conditions are true:
// - request’s current URL’s scheme is "http" // - request’s current URL’s scheme is "http"
// - request’s current URL’s host is a domain // - request’s current URL’s host is a domain
// - Matching request’s current URL’s host per Known HSTS Host Domain Name // - Matching request’s current URL’s host per Known HSTS Host Domain Name
// Matching results in either a superdomain match with an asserted // Matching results in either a superdomain match with an asserted
// includeSubDomains directive or a congruent match (with or without an // includeSubDomains directive or a congruent match (with or without an
// asserted includeSubDomains directive). [HSTS] // asserted includeSubDomains directive). [HSTS]
// TODO // TODO
// 10. If recursive is false, then run the remaining steps in parallel. // 10. If recursive is false, then run the remaining steps in parallel.
// TODO // TODO
// 11. If response is null, then set response to the result of running // 11. If response is null, then set response to the result of running
// the steps corresponding to the first matching statement: // the steps corresponding to the first matching statement:
if (response === null) { if (response === null) {
const currentURL = requestCurrentURL(request) const currentURL = requestCurrentURL(request)
if ( if (
// - request’s current URL’s origin is same origin with request’s origin, // - request’s current URL’s origin is same origin with request’s origin,
// and request’s response tainting is "basic" // and request’s response tainting is "basic"
(sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') || (sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') ||
// request’s current URL’s scheme is "data" // request’s current URL’s scheme is "data"
(currentURL.protocol === 'data:') || (currentURL.protocol === 'data:') ||
// - request’s mode is "navigate" or "websocket" // - request’s mode is "navigate" or "websocket"
(request.mode === 'navigate' || request.mode === 'websocket') (request.mode === 'navigate' || request.mode === 'websocket')
) { ) {
// 1. Set request’s response tainting to "basic". // 1. Set request’s response tainting to "basic".
request.responseTainting = 'basic' request.responseTainting = 'basic'
// 2. Return the result of running scheme fetch given fetchParams. // 2. Return the result of running scheme fetch given fetchParams.
response = await schemeFetch(fetchParams)
// request’s mode is "same-origin"
} else if (request.mode === 'same-origin') {
// 1. Return a network error.
response = makeNetworkError('request mode cannot be "same-origin"')
// request’s mode is "no-cors"
} else if (request.mode === 'no-cors') {
// 1. If request’s redirect mode is not "follow", then return a network
// error.
if (request.redirect !== 'follow') {
response = makeNetworkError(
'redirect mode cannot be "follow" for "no-cors" request'
)
} else {
// 2. Set request’s response tainting to "opaque".
request.responseTainting = 'opaque'
// 3. Return the result of running scheme fetch given fetchParams.
response = await schemeFetch(fetchParams) response = await schemeFetch(fetchParams)
// request’s mode is "same-origin"
} else if (request.mode === 'same-origin') {
// 1. Return a network error.
response = makeNetworkError('request mode cannot be "same-origin"')
// request’s mode is "no-cors"
} else if (request.mode === 'no-cors') {
// 1. If request’s redirect mode is not "follow", then return a network
// error.
if (request.redirect !== 'follow') {
response = makeNetworkError(
'redirect mode cannot be "follow" for "no-cors" request'
)
} else {
// 2. Set request’s response tainting to "opaque".
request.responseTainting = 'opaque'
// 3. Return the result of running scheme fetch given fetchParams.
response = await schemeFetch(fetchParams)
}
// request’s current URL’s scheme is not an HTTP(S) scheme
} else if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) {
// Return a network error.
response = makeNetworkError('URL scheme must be a HTTP(S) scheme')
// - request’s use-CORS-preflight flag is set
// - request’s unsafe-request flag is set and either request’s method is
// not a CORS-safelisted method or CORS-unsafe request-header names with
// request’s header list is not empty
// 1. Set request’s response tainting to "cors".
// 2. Let corsWithPreflightResponse be the result of running HTTP fetch
// given fetchParams and true.
// 3. If corsWithPreflightResponse is a network error, then clear cache
// entries using request.
// 4. Return corsWithPreflightResponse.
// TODO
// Otherwise
} else {
// 1. Set request’s response tainting to "cors".
request.responseTainting = 'cors'
// 2. Return the result of running HTTP fetch given fetchParams.
response = await httpFetch(fetchParams)
} }
// request’s current URL’s scheme is not an HTTP(S) scheme
} else if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) {
// Return a network error.
response = makeNetworkError('URL scheme must be a HTTP(S) scheme')
// - request’s use-CORS-preflight flag is set
// - request’s unsafe-request flag is set and either request’s method is
// not a CORS-safelisted method or CORS-unsafe request-header names with
// request’s header list is not empty
// 1. Set request’s response tainting to "cors".
// 2. Let corsWithPreflightResponse be the result of running HTTP fetch
// given fetchParams and true.
// 3. If corsWithPreflightResponse is a network error, then clear cache
// entries using request.
// 4. Return corsWithPreflightResponse.
// TODO
// Otherwise
} else {
// 1. Set request’s response tainting to "cors".
request.responseTainting = 'cors'
// 2. Return the result of running HTTP fetch given fetchParams.
response = await httpFetch(fetchParams)
}
}
// 12. If recursive is true, then return response.
if (recursive) {
return response
}
// 13. If response is not a network error and response is not a filtered
// response, then:
if (response.status !== 0 && !response.internalResponse) {
// If request’s response tainting is "cors", then:
if (request.responseTainting === 'cors') {
// 1. Let headerNames be the result of extracting header list values
// given `Access-Control-Expose-Headers` and response’s header list.
// TODO
// 2. If request’s credentials mode is not "include" and headerNames
// contains `*`, then set response’s CORS-exposed header-name list to
// all unique header names in response’s header list.
// TODO
// 3. Otherwise, if headerNames is not null or failure, then set
// response’s CORS-exposed header-name list to headerNames.
// TODO
} }
// 12. If recursive is true, then return response. // Set response to the following filtered response with response as its
if (recursive) { // internal response, depending on request’s response tainting:
return response if (request.responseTainting === 'basic') {
response = filterResponse(response, 'basic')
} else if (request.responseTainting === 'cors') {
response = filterResponse(response, 'cors')
} else if (request.responseTainting === 'opaque') {
response = filterResponse(response, 'opaque')
} else {
assert(false)
}
}
// 14. Let internalResponse be response, if response is a network error,
// and response’s internal response otherwise.
let internalResponse =
response.status === 0 ? response : response.internalResponse
// 15. If internalResponse’s URL list is empty, then set it to a clone of
// request’s URL list.
if (internalResponse.urlList.length === 0) {
internalResponse.urlList.push(...request.urlList)
}
// 16. If request’s timing allow failed flag is unset, then set
// internalResponse’s timing allow passed flag.
if (!request.timingAllowFailed) {
response.timingAllowPassed = true
}
// 17. If response is not a network error and any of the following returns
// blocked
// - should internalResponse to request be blocked as mixed content
// - should internalResponse to request be blocked by Content Security Policy
// - should internalResponse to request be blocked due to its MIME type
// - should internalResponse to request be blocked due to nosniff
// TODO
// 18. If response’s type is "opaque", internalResponse’s status is 206,
// internalResponse’s range-requested flag is set, and request’s header
// list does not contain `Range`, then set response and internalResponse
// to a network error.
if (
response.type === 'opaque' &&
internalResponse.status === 206 &&
internalResponse.rangeRequested &&
!request.headers.contains('range', true)
) {
response = internalResponse = makeNetworkError()
}
// 19. If response is not a network error and either request’s method is
// `HEAD` or `CONNECT`, or internalResponse’s status is a null body status,
// set internalResponse’s body to null and disregard any enqueuing toward
// it (if any).
if (
response.status !== 0 &&
(request.method === 'HEAD' ||
request.method === 'CONNECT' ||
nullBodyStatus.includes(internalResponse.status))
) {
internalResponse.body = null
fetchParams.controller.dump = true
}
// 20. If request’s integrity metadata is not the empty string, then:
if (request.integrity) {
// 1. Let processBodyError be this step: run fetch finale given fetchParams
// and a network error.
const processBodyError = (reason) =>
fetchFinale(fetchParams, makeNetworkError(reason))
// 2. If request’s response tainting is "opaque", or response’s body is null,
// then run processBodyError and abort these steps.
if (request.responseTainting === 'opaque' || response.body == null) {
processBodyError(response.error)
return
} }
// 13. If response is not a network error and response is not a filtered // 3. Let processBody given bytes be these steps:
// response, then: const processBody = (bytes) => {
if (response.status !== 0 && !response.internalResponse) { // 1. If bytes do not match request’s integrity metadata,
// If request’s response tainting is "cors", then: // then run processBodyError and abort these steps. [SRI]
if (request.responseTainting === 'cors') { if (!bytesMatch(bytes, request.integrity)) {
// 1. Let headerNames be the result of extracting header list values processBodyError('integrity mismatch')
// given `Access-Control-Expose-Headers` and response’s header list.
// TODO
// 2. If request’s credentials mode is not "include" and headerNames
// contains `*`, then set response’s CORS-exposed header-name list to
// all unique header names in response’s header list.
// TODO
// 3. Otherwise, if headerNames is not null or failure, then set
// response’s CORS-exposed header-name list to headerNames.
// TODO
}
// Set response to the following filtered response with response as its
// internal response, depending on request’s response tainting:
if (request.responseTainting === 'basic') {
response = filterResponse(response, 'basic')
} else if (request.responseTainting === 'cors') {
response = filterResponse(response, 'cors')
} else if (request.responseTainting === 'opaque') {
response = filterResponse(response, 'opaque')
} else {
assert(false)
}
}
// 14. Let internalResponse be response, if response is a network error,
// and response’s internal response otherwise.
let internalResponse =
response.status === 0 ? response : response.internalResponse
// 15. If internalResponse’s URL list is empty, then set it to a clone of
// request’s URL list.
if (internalResponse.urlList.length === 0) {
internalResponse.urlList.push(...request.urlList)
}
// 16. If request’s timing allow failed flag is unset, then set
// internalResponse’s timing allow passed flag.
if (!request.timingAllowFailed) {
response.timingAllowPassed = true
}
// 17. If response is not a network error and any of the following returns
// blocked
// - should internalResponse to request be blocked as mixed content
// - should internalResponse to request be blocked by Content Security Policy
// - should internalResponse to request be blocked due to its MIME type
// - should internalResponse to request be blocked due to nosniff
// TODO
// 18. If response’s type is "opaque", internalResponse’s status is 206,
// internalResponse’s range-requested flag is set, and request’s header
// list does not contain `Range`, then set response and internalResponse
// to a network error.
if (
response.type === 'opaque' &&
internalResponse.status === 206 &&
internalResponse.rangeRequested &&
!request.headers.contains('range', true)
) {
response = internalResponse = makeNetworkError()
}
// 19. If response is not a network error and either request’s method is
// `HEAD` or `CONNECT`, or internalResponse’s status is a null body status,
// set internalResponse’s body to null and disregard any enqueuing toward
// it (if any).
if (
response.status !== 0 &&
(request.method === 'HEAD' ||
request.method === 'CONNECT' ||
nullBodyStatus.includes(internalResponse.status))
) {
internalResponse.body = null
fetchParams.controller.dump = true
}
// 20. If request’s integrity metadata is not the empty string, then:
if (request.integrity) {
// 1. Let processBodyError be this step: run fetch finale given fetchParams
// and a network error.
const processBodyError = (reason) =>
fetchFinale(fetchParams, makeNetworkError(reason))
// 2. If request’s response tainting is "opaque", or response’s body is null,
// then run processBodyError and abort these steps.
if (request.responseTainting === 'opaque' || response.body == null) {
processBodyError(response.error)
return return
} }
// 3. Let processBody given bytes be these steps: // 2. Set response’s body to bytes as a body.
const processBody = (bytes) => { response.body = safelyExtractBody(bytes)[0]
// 1. If bytes do not match request’s integrity metadata,
// then run processBodyError and abort these steps. [SRI]
if (!bytesMatch(bytes, request.integrity)) {
processBodyError('integrity mismatch')
return
}
// 2. Set response’s body to bytes as a body. // 3. Run fetch finale given fetchParams and response.
response.body = safelyExtractBody(bytes)[0]
// 3. Run fetch finale given fetchParams and response.
fetchFinale(fetchParams, response)
}
// 4. Fully read response’s body given processBody and processBodyError.
fullyReadBody(response.body, processBody, processBodyError)
} else {
// 21. Otherwise, run fetch finale given fetchParams and response.
fetchFinale(fetchParams, response) fetchFinale(fetchParams, response)
} }
} catch (err) {
fetchParams.controller.terminate(err) // 4. Fully read response’s body given processBody and processBodyError.
await fullyReadBody(response.body, processBody, processBodyError)
} else {
// 21. Otherwise, run fetch finale given fetchParams and response.
fetchFinale(fetchParams, response)
} }
} }
@@ -51611,7 +50051,7 @@ function fetchFinale (fetchParams, response) {
// 3. Set fetchParams’s controller’s report timing steps to the following steps given a global object global: // 3. Set fetchParams’s controller’s report timing steps to the following steps given a global object global:
fetchParams.controller.reportTimingSteps = () => { fetchParams.controller.reportTimingSteps = () => {
// 1. If fetchParams’s request’s URL’s scheme is not an HTTP(S) scheme, then return. // 1. If fetchParams’s request’s URL’s scheme is not an HTTP(S) scheme, then return.
if (!urlIsHttpHttpsScheme(fetchParams.request.url)) { if (fetchParams.request.url.protocol !== 'https:') {
return return
} }
@@ -51653,6 +50093,7 @@ function fetchFinale (fetchParams, response) {
// fetchParams’s request’s URL, fetchParams’s request’s initiator type, global, cacheState, bodyInfo, // fetchParams’s request’s URL, fetchParams’s request’s initiator type, global, cacheState, bodyInfo,
// and responseStatus. // and responseStatus.
if (fetchParams.request.initiatorType != null) { if (fetchParams.request.initiatorType != null) {
// TODO: update markresourcetiming
markResourceTiming(timingInfo, fetchParams.request.url.href, fetchParams.request.initiatorType, globalThis, cacheState, bodyInfo, responseStatus) markResourceTiming(timingInfo, fetchParams.request.url.href, fetchParams.request.initiatorType, globalThis, cacheState, bodyInfo, responseStatus)
} }
} }
@@ -52524,11 +50965,15 @@ async function httpNetworkFetch (
// cancelAlgorithm set to cancelAlgorithm. // cancelAlgorithm set to cancelAlgorithm.
const stream = new ReadableStream( const stream = new ReadableStream(
{ {
start (controller) { async start (controller) {
fetchParams.controller.controller = controller fetchParams.controller.controller = controller
}, },
pull: pullAlgorithm, async pull (controller) {
cancel: cancelAlgorithm, await pullAlgorithm(controller)
},
async cancel (reason) {
await cancelAlgorithm(reason)
},
type: 'bytes' type: 'bytes'
} }
) )
@@ -52666,7 +51111,7 @@ async function httpNetworkFetch (
function dispatch ({ body }) { function dispatch ({ body }) {
const url = requestCurrentURL(request) const url = requestCurrentURL(request)
/** @type {import('../../..').Agent} */ /** @type {import('../..').Agent} */
const agent = fetchParams.controller.dispatcher const agent = fetchParams.controller.dispatcher
return new Promise((resolve, reject) => agent.dispatch( return new Promise((resolve, reject) => agent.dispatch(
@@ -52715,11 +51160,12 @@ async function httpNetworkFetch (
onHeaders (status, rawHeaders, resume, statusText) { onHeaders (status, rawHeaders, resume, statusText) {
if (status < 200) { if (status < 200) {
return false return
} }
/** @type {string[]} */ /** @type {string[]} */
let codings = [] let codings = []
let location = ''
const headersList = new HeadersList() const headersList = new HeadersList()
@@ -52732,7 +51178,7 @@ async function httpNetworkFetch (
// "All content-coding values are case-insensitive..." // "All content-coding values are case-insensitive..."
codings = contentEncoding.toLowerCase().split(',').map((x) => x.trim()) codings = contentEncoding.toLowerCase().split(',').map((x) => x.trim())
} }
const location = headersList.get('location', true) location = headersList.get('location', true)
this.body = new Readable({ read: resume }) this.body = new Readable({ read: resume })
@@ -52765,12 +51211,6 @@ async function httpNetworkFetch (
flush: zlib.constants.BROTLI_OPERATION_FLUSH, flush: zlib.constants.BROTLI_OPERATION_FLUSH,
finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH
})) }))
} else if (coding === 'zstd' && typeof zlib.createZstdDecompress === 'function') {
// Node.js v23.8.0+ and v22.15.0+ supports Zstandard
decoders.push(zlib.createZstdDecompress({
flush: zlib.constants.ZSTD_e_continue,
finishFlush: zlib.constants.ZSTD_e_end
}))
} else { } else {
decoders.length = 0 decoders.length = 0
break break
@@ -52886,6 +51326,7 @@ module.exports = {
const { extractBody, mixinBody, cloneBody, bodyUnusable } = __nccwpck_require__(4492) const { extractBody, mixinBody, cloneBody, bodyUnusable } = __nccwpck_require__(4492)
const { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = __nccwpck_require__(660) const { Headers, fill: fillHeaders, HeadersList, setHeadersGuard, getHeadersGuard, setHeadersList, getHeadersList } = __nccwpck_require__(660)
const { FinalizationRegistry } = __nccwpck_require__(6653)()
const util = __nccwpck_require__(3440) const util = __nccwpck_require__(3440)
const nodeUtil = __nccwpck_require__(7975) const nodeUtil = __nccwpck_require__(7975)
const { const {
@@ -52904,7 +51345,7 @@ const {
requestDuplex requestDuplex
} = __nccwpck_require__(4495) } = __nccwpck_require__(4495)
const { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util const { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util
const { webidl } = __nccwpck_require__(7879) const { webidl } = __nccwpck_require__(5893)
const { URLSerializer } = __nccwpck_require__(1900) const { URLSerializer } = __nccwpck_require__(1900)
const { kConstruct } = __nccwpck_require__(6443) const { kConstruct } = __nccwpck_require__(6443)
const assert = __nccwpck_require__(4589) const assert = __nccwpck_require__(4589)
@@ -52990,8 +51431,8 @@ class Request {
const prefix = 'Request constructor' const prefix = 'Request constructor'
webidl.argumentLengthCheck(arguments, 1, prefix) webidl.argumentLengthCheck(arguments, 1, prefix)
input = webidl.converters.RequestInfo(input) input = webidl.converters.RequestInfo(input, prefix, 'input')
init = webidl.converters.RequestInit(init) init = webidl.converters.RequestInit(init, prefix, 'init')
// 1. Let request be null. // 1. Let request be null.
let request = null let request = null
@@ -53818,7 +52259,7 @@ function cloneRequest (request) {
// 2. If request’s body is non-null, set newRequest’s body to the // 2. If request’s body is non-null, set newRequest’s body to the
// result of cloning request’s body. // result of cloning request’s body.
if (request.body != null) { if (request.body != null) {
newRequest.body = cloneBody(request.body) newRequest.body = cloneBody(newRequest, request.body)
} }
// 3. Return newRequest. // 3. Return newRequest.
@@ -53874,13 +52315,8 @@ Object.defineProperties(Request.prototype, {
webidl.is.Request = webidl.util.MakeTypeAssertion(Request) webidl.is.Request = webidl.util.MakeTypeAssertion(Request)
/** // https://fetch.spec.whatwg.org/#requestinfo
* @param {*} V webidl.converters.RequestInfo = function (V, prefix, argument) {
* @returns {import('../../../types/fetch').Request|string}
*
* @see https://fetch.spec.whatwg.org/#requestinfo
*/
webidl.converters.RequestInfo = function (V) {
if (typeof V === 'string') { if (typeof V === 'string') {
return webidl.converters.USVString(V) return webidl.converters.USVString(V)
} }
@@ -53892,11 +52328,7 @@ webidl.converters.RequestInfo = function (V) {
return webidl.converters.USVString(V) return webidl.converters.USVString(V)
} }
/** // https://fetch.spec.whatwg.org/#requestinit
* @param {*} V
* @returns {import('../../../types/fetch').RequestInit}
* @see https://fetch.spec.whatwg.org/#requestinit
*/
webidl.converters.RequestInit = webidl.dictionaryConverter([ webidl.converters.RequestInit = webidl.dictionaryConverter([
{ {
key: 'method', key: 'method',
@@ -53998,7 +52430,7 @@ module.exports = {
const { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = __nccwpck_require__(660) const { Headers, HeadersList, fill, getHeadersGuard, setHeadersGuard, setHeadersList } = __nccwpck_require__(660)
const { extractBody, cloneBody, mixinBody, streamRegistry, bodyUnusable } = __nccwpck_require__(4492) const { extractBody, cloneBody, mixinBody, hasFinalizationRegistry, streamRegistry, bodyUnusable } = __nccwpck_require__(4492)
const util = __nccwpck_require__(3440) const util = __nccwpck_require__(3440)
const nodeUtil = __nccwpck_require__(7975) const nodeUtil = __nccwpck_require__(7975)
const { kEnumerableProperty } = util const { kEnumerableProperty } = util
@@ -54015,12 +52447,11 @@ const {
redirectStatusSet, redirectStatusSet,
nullBodyStatus nullBodyStatus
} = __nccwpck_require__(4495) } = __nccwpck_require__(4495)
const { webidl } = __nccwpck_require__(7879) const { webidl } = __nccwpck_require__(5893)
const { URLSerializer } = __nccwpck_require__(1900) const { URLSerializer } = __nccwpck_require__(1900)
const { kConstruct } = __nccwpck_require__(6443) const { kConstruct } = __nccwpck_require__(6443)
const assert = __nccwpck_require__(4589) const assert = __nccwpck_require__(4589)
const { types } = __nccwpck_require__(7975)
const { isArrayBuffer } = nodeUtil.types
const textEncoder = new TextEncoder('utf-8') const textEncoder = new TextEncoder('utf-8')
@@ -54241,11 +52672,6 @@ class Response {
// 2. Let clonedResponse be the result of cloning this’s response. // 2. Let clonedResponse be the result of cloning this’s response.
const clonedResponse = cloneResponse(this.#state) const clonedResponse = cloneResponse(this.#state)
// Note: To re-register because of a new stream.
if (this.#state.body?.stream) {
streamRegistry.register(this, new WeakRef(this.#state.body.stream))
}
// 3. Return the result of creating a Response object, given // 3. Return the result of creating a Response object, given
// clonedResponse, this’s headers’s guard, and this’s relevant Realm. // clonedResponse, this’s headers’s guard, and this’s relevant Realm.
return fromInnerResponse(clonedResponse, getHeadersGuard(this.#headers)) return fromInnerResponse(clonedResponse, getHeadersGuard(this.#headers))
@@ -54355,7 +52781,7 @@ function cloneResponse (response) {
// 3. If response’s body is non-null, then set newResponse’s body to the // 3. If response’s body is non-null, then set newResponse’s body to the
// result of cloning response’s body. // result of cloning response’s body.
if (response.body != null) { if (response.body != null) {
newResponse.body = cloneBody(response.body) newResponse.body = cloneBody(newResponse, response.body)
} }
// 4. Return newResponse. // 4. Return newResponse.
@@ -54555,7 +52981,7 @@ function fromInnerResponse (innerResponse, guard) {
setHeadersList(headers, innerResponse.headersList) setHeadersList(headers, innerResponse.headersList)
setHeadersGuard(headers, guard) setHeadersGuard(headers, guard)
if (innerResponse.body?.stream) { if (hasFinalizationRegistry && innerResponse.body?.stream) {
// If the target (response) is reclaimed, the cleanup callback may be called at some point with // If the target (response) is reclaimed, the cleanup callback may be called at some point with
// the held value provided for it (innerResponse.body.stream). The held value can be any value: // the held value provided for it (innerResponse.body.stream). The held value can be any value:
// a primitive or an object, even undefined. If the held value is an object, the registry keeps // a primitive or an object, even undefined. If the held value is an object, the registry keeps
@@ -54577,7 +53003,7 @@ webidl.converters.XMLHttpRequestBodyInit = function (V, prefix, name) {
return V return V
} }
if (ArrayBuffer.isView(V) || isArrayBuffer(V)) { if (ArrayBuffer.isView(V) || types.isArrayBuffer(V)) {
return V return V
} }
@@ -54656,7 +53082,7 @@ const { performance } = __nccwpck_require__(643)
const { ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = __nccwpck_require__(3440) const { ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = __nccwpck_require__(3440)
const assert = __nccwpck_require__(4589) const assert = __nccwpck_require__(4589)
const { isUint8Array } = __nccwpck_require__(3429) const { isUint8Array } = __nccwpck_require__(3429)
const { webidl } = __nccwpck_require__(7879) const { webidl } = __nccwpck_require__(5893)
let supportedHashes = [] let supportedHashes = []
@@ -55571,6 +53997,17 @@ function sameOrigin (A, B) {
return false return false
} }
function createDeferredPromise () {
let res
let rej
const promise = new Promise((resolve, reject) => {
res = resolve
rej = reject
})
return { promise, resolve: res, reject: rej }
}
function isAborted (fetchParams) { function isAborted (fetchParams) {
return fetchParams.controller.state === 'aborted' return fetchParams.controller.state === 'aborted'
} }
@@ -55813,11 +54250,6 @@ function iteratorMixin (name, object, kInternalIterator, keyIndex = 0, valueInde
} }
/** /**
* @param {import('./body').ExtractBodyResult} body
* @param {(bytes: Uint8Array) => void} processBody
* @param {(error: Error) => void} processBodyError
* @returns {void}
*
* @see https://fetch.spec.whatwg.org/#body-fully-read * @see https://fetch.spec.whatwg.org/#body-fully-read
*/ */
function fullyReadBody (body, processBody, processBodyError) { function fullyReadBody (body, processBody, processBodyError) {
@@ -55832,17 +54264,20 @@ function fullyReadBody (body, processBody, processBodyError) {
// with taskDestination. // with taskDestination.
const errorSteps = processBodyError const errorSteps = processBodyError
try {
// 4. Let reader be the result of getting a reader for body’s stream. // 4. Let reader be the result of getting a reader for body’s stream.
// If that threw an exception, then run errorSteps with that // If that threw an exception, then run errorSteps with that
// exception and return. // exception and return.
const reader = body.stream.getReader() let reader
// 5. Read all bytes from reader, given successSteps and errorSteps. try {
readAllBytes(reader, successSteps, errorSteps) reader = body.stream.getReader()
} catch (e) { } catch (e) {
errorSteps(e) errorSteps(e)
return
} }
// 5. Read all bytes from reader, given successSteps and errorSteps.
readAllBytes(reader, successSteps, errorSteps)
} }
/** /**
@@ -55879,16 +54314,15 @@ function isomorphicEncode (input) {
/** /**
* @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes
* @see https://streams.spec.whatwg.org/#read-loop * @see https://streams.spec.whatwg.org/#read-loop
* @param {ReadableStream<Uint8Array<ArrayBuffer>>} reader * @param {ReadableStreamDefaultReader} reader
* @param {(bytes: Uint8Array) => void} successSteps * @param {(bytes: Uint8Array) => void} successSteps
* @param {(error: Error) => void} failureSteps * @param {(error: Error) => void} failureSteps
* @returns {Promise<void>}
*/ */
async function readAllBytes (reader, successSteps, failureSteps) { async function readAllBytes (reader, successSteps, failureSteps) {
try { const bytes = []
const bytes = [] let byteLength = 0
let byteLength = 0
try {
do { do {
const { done, value: chunk } = await reader.read() const { done, value: chunk } = await reader.read()
@@ -55901,7 +54335,7 @@ async function readAllBytes (reader, successSteps, failureSteps) {
// 1. If chunk is not a Uint8Array object, call failureSteps // 1. If chunk is not a Uint8Array object, call failureSteps
// with a TypeError and abort these steps. // with a TypeError and abort these steps.
if (!isUint8Array(chunk)) { if (!isUint8Array(chunk)) {
failureSteps(new TypeError('Received non-Uint8Array chunk')) failureSteps(TypeError('Received non-Uint8Array chunk'))
return return
} }
@@ -55963,17 +54397,10 @@ function urlIsHttpHttpsScheme (url) {
return protocol === 'http:' || protocol === 'https:' return protocol === 'http:' || protocol === 'https:'
} }
/**
* @typedef {Object} RangeHeaderValue
* @property {number|null} rangeStartValue
* @property {number|null} rangeEndValue
*/
/** /**
* @see https://fetch.spec.whatwg.org/#simple-range-header-value * @see https://fetch.spec.whatwg.org/#simple-range-header-value
* @param {string} value * @param {string} value
* @param {boolean} allowWhitespace * @param {boolean} allowWhitespace
* @return {RangeHeaderValue|'failure'}
*/ */
function simpleRangeHeaderValue (value, allowWhitespace) { function simpleRangeHeaderValue (value, allowWhitespace) {
// 1. Let data be the isomorphic decoding of value. // 1. Let data be the isomorphic decoding of value.
@@ -56378,6 +54805,7 @@ module.exports = {
isAborted, isAborted,
isCancelled, isCancelled,
isValidEncodedURL, isValidEncodedURL,
createDeferredPromise,
ReadableStreamFrom, ReadableStreamFrom,
tryUpgradeRequestToAPotentiallyTrustworthyURL, tryUpgradeRequestToAPotentiallyTrustworthyURL,
clampAndCoarsenConnectionTimingInfo, clampAndCoarsenConnectionTimingInfo,
@@ -56429,7 +54857,7 @@ module.exports = {
/***/ }), /***/ }),
/***/ 7879: /***/ 5893:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict"; "use strict";
@@ -56437,6 +54865,7 @@ module.exports = {
const { types, inspect } = __nccwpck_require__(7975) const { types, inspect } = __nccwpck_require__(7975)
const { markAsUncloneable } = __nccwpck_require__(5919) const { markAsUncloneable } = __nccwpck_require__(5919)
const { toUSVString } = __nccwpck_require__(3440)
const UNDEFINED = 1 const UNDEFINED = 1
const BOOLEAN = 2 const BOOLEAN = 2
@@ -56457,48 +54886,22 @@ const webidl = {
is: {} is: {}
} }
/**
* @description Instantiate an error.
*
* @param {Object} opts
* @param {string} opts.header
* @param {string} opts.message
* @returns {TypeError}
*/
webidl.errors.exception = function (message) { webidl.errors.exception = function (message) {
return new TypeError(`${message.header}: ${message.message}`) return new TypeError(`${message.header}: ${message.message}`)
} }
/** webidl.errors.conversionFailed = function (context) {
* @description Instantiate an error when conversion from one type to another has failed. const plural = context.types.length === 1 ? '' : ' one of'
*
* @param {Object} opts
* @param {string} opts.prefix
* @param {string} opts.argument
* @param {string[]} opts.types
* @returns {TypeError}
*/
webidl.errors.conversionFailed = function (opts) {
const plural = opts.types.length === 1 ? '' : ' one of'
const message = const message =
`${opts.argument} could not be converted to` + `${context.argument} could not be converted to` +
`${plural}: ${opts.types.join(', ')}.` `${plural}: ${context.types.join(', ')}.`
return webidl.errors.exception({ return webidl.errors.exception({
header: opts.prefix, header: context.prefix,
message message
}) })
} }
/**
* @description Instantiate an error when an invalid argument is provided
*
* @param {Object} context
* @param {string} context.prefix
* @param {string} context.value
* @param {string} context.type
* @returns {TypeError}
*/
webidl.errors.invalidArgument = function (context) { webidl.errors.invalidArgument = function (context) {
return webidl.errors.exception({ return webidl.errors.exception({
header: context.prefix, header: context.prefix,
@@ -56738,8 +55141,6 @@ webidl.util.Stringify = function (V) {
return inspect(V) return inspect(V)
case STRING: case STRING:
return `"${V}"` return `"${V}"`
case BIGINT:
return `${V}n`
default: default:
return `${V}` return `${V}`
} }
@@ -56930,21 +55331,10 @@ webidl.nullableConverter = function (converter) {
} }
} }
/**
* @param {*} value
* @returns {boolean}
*/
webidl.is.USVString = function (value) {
return (
typeof value === 'string' &&
value.isWellFormed()
)
}
webidl.is.ReadableStream = webidl.util.MakeTypeAssertion(ReadableStream) webidl.is.ReadableStream = webidl.util.MakeTypeAssertion(ReadableStream)
webidl.is.Blob = webidl.util.MakeTypeAssertion(Blob) webidl.is.Blob = webidl.util.MakeTypeAssertion(Blob)
webidl.is.URLSearchParams = webidl.util.MakeTypeAssertion(URLSearchParams) webidl.is.URLSearchParams = webidl.util.MakeTypeAssertion(URLSearchParams)
webidl.is.File = webidl.util.MakeTypeAssertion(File) webidl.is.File = webidl.util.MakeTypeAssertion(globalThis.File ?? (__nccwpck_require__(4573).File))
webidl.is.URL = webidl.util.MakeTypeAssertion(URL) webidl.is.URL = webidl.util.MakeTypeAssertion(URL)
webidl.is.AbortSignal = webidl.util.MakeTypeAssertion(AbortSignal) webidl.is.AbortSignal = webidl.util.MakeTypeAssertion(AbortSignal)
webidl.is.MessagePort = webidl.util.MakeTypeAssertion(MessagePort) webidl.is.MessagePort = webidl.util.MakeTypeAssertion(MessagePort)
@@ -57002,23 +55392,13 @@ webidl.converters.ByteString = function (V, prefix, argument) {
return x return x
} }
/** // https://webidl.spec.whatwg.org/#es-USVString
* @param {unknown} value // TODO: rewrite this so we can control the errors thrown
* @returns {string} webidl.converters.USVString = toUSVString
* @see https://webidl.spec.whatwg.org/#es-USVString
*/
webidl.converters.USVString = function (value) {
// TODO: rewrite this so we can control the errors thrown
if (typeof value === 'string') {
return value.toWellFormed()
}
return `${value}`.toWellFormed()
}
// https://webidl.spec.whatwg.org/#es-boolean // https://webidl.spec.whatwg.org/#es-boolean
webidl.converters.boolean = function (V) { webidl.converters.boolean = function (V) {
// 1. Let x be the result of computing ToBoolean(V). // 1. Let x be the result of computing ToBoolean(V).
// https://262.ecma-international.org/10.0/index.html#table-10
const x = Boolean(V) const x = Boolean(V)
// 2. Return the IDL boolean value that is the one that represents // 2. Return the IDL boolean value that is the one that represents
@@ -57233,6 +55613,7 @@ module.exports = {
const { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = __nccwpck_require__(736) const { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = __nccwpck_require__(736)
const { parseExtensions, isClosed, isClosing, isEstablished, validateCloseCodeAndReason } = __nccwpck_require__(8625) const { parseExtensions, isClosed, isClosing, isEstablished, validateCloseCodeAndReason } = __nccwpck_require__(8625)
const { channels } = __nccwpck_require__(2414)
const { makeRequest } = __nccwpck_require__(9967) const { makeRequest } = __nccwpck_require__(9967)
const { fetching } = __nccwpck_require__(4398) const { fetching } = __nccwpck_require__(4398)
const { Headers, getHeadersList } = __nccwpck_require__(660) const { Headers, getHeadersList } = __nccwpck_require__(660)
@@ -57335,7 +55716,7 @@ function establishWebSocketConnection (url, protocols, client, handler, options)
// 1. If response is a network error or its status is not 101, // 1. If response is a network error or its status is not 101,
// fail the WebSocket connection. // fail the WebSocket connection.
if (response.type === 'error' || response.status !== 101) { if (response.type === 'error' || response.status !== 101) {
failWebsocketConnection(handler, 1002, 'Received network error or non-101 status code.', response.error) failWebsocketConnection(handler, 1002, 'Received network error or non-101 status code.')
return return
} }
@@ -57430,6 +55811,14 @@ function establishWebSocketConnection (url, protocols, client, handler, options)
response.socket.on('close', handler.onSocketClose) response.socket.on('close', handler.onSocketClose)
response.socket.on('error', handler.onSocketError) response.socket.on('error', handler.onSocketError)
if (channels.open.hasSubscribers) {
channels.open.publish({
address: response.socket.address(),
protocol: secProtocol,
extensions: secExtension
})
}
handler.wasEverConnected = true handler.wasEverConnected = true
handler.onConnectionEstablished(response, extensions) handler.onConnectionEstablished(response, extensions)
} }
@@ -57520,10 +55909,9 @@ function closeWebSocketConnection (object, code, reason, validate = false) {
* @param {import('./websocket').Handler} handler * @param {import('./websocket').Handler} handler
* @param {number} code * @param {number} code
* @param {string|undefined} reason * @param {string|undefined} reason
* @param {unknown} cause
* @returns {void} * @returns {void}
*/ */
function failWebsocketConnection (handler, code, reason, cause) { function failWebsocketConnection (handler, code, reason) {
// If _The WebSocket Connection is Established_ prior to the point where // If _The WebSocket Connection is Established_ prior to the point where
// the endpoint is required to _Fail the WebSocket Connection_, the // the endpoint is required to _Fail the WebSocket Connection_, the
// endpoint SHOULD send a Close frame with an appropriate status code // endpoint SHOULD send a Close frame with an appropriate status code
@@ -57538,7 +55926,7 @@ function failWebsocketConnection (handler, code, reason, cause) {
handler.socket.destroy() handler.socket.destroy()
} }
handler.onFail(code, reason, cause) handler.onFail(code, reason)
} }
module.exports = { module.exports = {
@@ -57690,7 +56078,7 @@ module.exports = {
"use strict"; "use strict";
const { webidl } = __nccwpck_require__(7879) const { webidl } = __nccwpck_require__(5893)
const { kEnumerableProperty } = __nccwpck_require__(3440) const { kEnumerableProperty } = __nccwpck_require__(3440)
const { kConstruct } = __nccwpck_require__(6443) const { kConstruct } = __nccwpck_require__(6443)
@@ -58163,8 +56551,7 @@ class WebsocketFrameSend {
} }
module.exports = { module.exports = {
WebsocketFrameSend, WebsocketFrameSend
generateMask // for benchmark
} }
@@ -58257,6 +56644,7 @@ module.exports = { PerMessageDeflate }
const { Writable } = __nccwpck_require__(7075) const { Writable } = __nccwpck_require__(7075)
const assert = __nccwpck_require__(4589) const assert = __nccwpck_require__(4589)
const { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = __nccwpck_require__(736) const { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = __nccwpck_require__(736)
const { channels } = __nccwpck_require__(2414)
const { const {
isValidStatusCode, isValidStatusCode,
isValidOpcode, isValidOpcode,
@@ -58676,13 +57064,22 @@ class ByteParser extends Writable {
this.#handler.socket.write(frame.createFrame(opcodes.PONG)) this.#handler.socket.write(frame.createFrame(opcodes.PONG))
this.#handler.onPing(body) if (channels.ping.hasSubscribers) {
channels.ping.publish({
payload: body
})
}
} }
} else if (opcode === opcodes.PONG) { } else if (opcode === opcodes.PONG) {
// A Pong frame MAY be sent unsolicited. This serves as a // A Pong frame MAY be sent unsolicited. This serves as a
// unidirectional heartbeat. A response to an unsolicited Pong frame is // unidirectional heartbeat. A response to an unsolicited Pong frame is
// not expected. // not expected.
this.#handler.onPong(body)
if (channels.pong.hasSubscribers) {
channels.pong.publish({
payload: body
})
}
} }
return true return true
@@ -58823,7 +57220,7 @@ module.exports = { SendQueue }
"use strict"; "use strict";
const { webidl } = __nccwpck_require__(7879) const { webidl } = __nccwpck_require__(5893)
const { validateCloseCodeAndReason } = __nccwpck_require__(8625) const { validateCloseCodeAndReason } = __nccwpck_require__(8625)
const { kConstruct } = __nccwpck_require__(6443) const { kConstruct } = __nccwpck_require__(6443)
const { kEnumerableProperty } = __nccwpck_require__(3440) const { kEnumerableProperty } = __nccwpck_require__(3440)
@@ -58914,13 +57311,12 @@ module.exports = { WebSocketError, createUnvalidatedWebSocketError }
"use strict"; "use strict";
const { createDeferredPromise } = __nccwpck_require__(6436) const { createDeferredPromise, environmentSettingsObject } = __nccwpck_require__(3168)
const { environmentSettingsObject } = __nccwpck_require__(3168)
const { states, opcodes, sentCloseFrameState } = __nccwpck_require__(736) const { states, opcodes, sentCloseFrameState } = __nccwpck_require__(736)
const { webidl } = __nccwpck_require__(7879) const { webidl } = __nccwpck_require__(5893)
const { getURLRecord, isValidSubprotocol, isEstablished, utf8Decode } = __nccwpck_require__(8625) const { getURLRecord, isValidSubprotocol, isEstablished, utf8Decode } = __nccwpck_require__(8625)
const { establishWebSocketConnection, failWebsocketConnection, closeWebSocketConnection } = __nccwpck_require__(6897) const { establishWebSocketConnection, failWebsocketConnection, closeWebSocketConnection } = __nccwpck_require__(6897)
const { isArrayBuffer } = __nccwpck_require__(3429) const { types } = __nccwpck_require__(7975)
const { channels } = __nccwpck_require__(2414) const { channels } = __nccwpck_require__(2414)
const { WebsocketFrameSend } = __nccwpck_require__(3264) const { WebsocketFrameSend } = __nccwpck_require__(3264)
const { ByteParser } = __nccwpck_require__(1652) const { ByteParser } = __nccwpck_require__(1652)
@@ -58936,11 +57332,11 @@ class WebSocketStream {
#url #url
// Each WebSocketStream object has an associated opened promise , which is a promise. // Each WebSocketStream object has an associated opened promise , which is a promise.
/** @type {import('../../../util/promise').DeferredPromise} */ /** @type {ReturnType<typeof createDeferredPromise>} */
#openedPromise #openedPromise
// Each WebSocketStream object has an associated closed promise , which is a promise. // Each WebSocketStream object has an associated closed promise , which is a promise.
/** @type {import('../../../util/promise').DeferredPromise} */ /** @type {ReturnType<typeof createDeferredPromise>} */
#closedPromise #closedPromise
// Each WebSocketStream object has an associated readable stream , which is a ReadableStream . // Each WebSocketStream object has an associated readable stream , which is a ReadableStream .
@@ -58979,8 +57375,6 @@ class WebSocketStream {
this.#handler.socket.destroy() this.#handler.socket.destroy()
}, },
onSocketClose: () => this.#onSocketClose(), onSocketClose: () => this.#onSocketClose(),
onPing: () => {},
onPong: () => {},
readyState: states.CONNECTING, readyState: states.CONNECTING,
socket: null, socket: null,
@@ -59124,7 +57518,7 @@ class WebSocketStream {
let opcode = null let opcode = null
// 4. If chunk is a BufferSource , // 4. If chunk is a BufferSource ,
if (ArrayBuffer.isView(chunk) || isArrayBuffer(chunk)) { if (ArrayBuffer.isView(chunk) || types.isArrayBuffer(chunk)) {
// 4.1. Set data to a copy of the bytes given chunk . // 4.1. Set data to a copy of the bytes given chunk .
data = new Uint8Array(ArrayBuffer.isView(chunk) ? new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength) : chunk) data = new Uint8Array(ArrayBuffer.isView(chunk) ? new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength) : chunk)
@@ -59305,7 +57699,7 @@ class WebSocketStream {
// 6. If the connection was closed cleanly , // 6. If the connection was closed cleanly ,
if (wasClean) { if (wasClean) {
// 6.1. Close stream ’s readable stream . // 6.1. Close stream ’s readable stream .
this.#readableStreamController.close() this.#readableStream.cancel().catch(() => {})
// 6.2. Error stream ’s writable stream with an " InvalidStateError " DOMException indicating that a closed WebSocketStream cannot be written to. // 6.2. Error stream ’s writable stream with an " InvalidStateError " DOMException indicating that a closed WebSocketStream cannot be written to.
if (!this.#writableStream.locked) { if (!this.#writableStream.locked) {
@@ -59616,7 +58010,7 @@ function parseExtensions (extensions) {
while (position.position < extensions.length) { while (position.position < extensions.length) {
const pair = collectASequenceOfCodePointsFast(';', extensions, position) const pair = collectASequenceOfCodePointsFast(';', extensions, position)
const [name, value = ''] = pair.split('=', 2) const [name, value = ''] = pair.split('=')
extensionList.set( extensionList.set(
removeHTTPWhitespace(name, true, false), removeHTTPWhitespace(name, true, false),
@@ -59756,8 +58150,7 @@ module.exports = {
"use strict"; "use strict";
const { isArrayBuffer } = __nccwpck_require__(3429) const { webidl } = __nccwpck_require__(5893)
const { webidl } = __nccwpck_require__(7879)
const { URLSerializer } = __nccwpck_require__(1900) const { URLSerializer } = __nccwpck_require__(1900)
const { environmentSettingsObject } = __nccwpck_require__(3168) const { environmentSettingsObject } = __nccwpck_require__(3168)
const { staticPropertyDescriptors, states, sentCloseFrameState, sendHints, opcodes } = __nccwpck_require__(736) const { staticPropertyDescriptors, states, sentCloseFrameState, sendHints, opcodes } = __nccwpck_require__(736)
@@ -59765,7 +58158,6 @@ const {
isConnecting, isConnecting,
isEstablished, isEstablished,
isClosing, isClosing,
isClosed,
isValidSubprotocol, isValidSubprotocol,
fireEvent, fireEvent,
utf8Decode, utf8Decode,
@@ -59776,9 +58168,9 @@ const { establishWebSocketConnection, closeWebSocketConnection, failWebsocketCon
const { ByteParser } = __nccwpck_require__(1652) const { ByteParser } = __nccwpck_require__(1652)
const { kEnumerableProperty } = __nccwpck_require__(3440) const { kEnumerableProperty } = __nccwpck_require__(3440)
const { getGlobalDispatcher } = __nccwpck_require__(2581) const { getGlobalDispatcher } = __nccwpck_require__(2581)
const { types } = __nccwpck_require__(7975)
const { ErrorEvent, CloseEvent, createFastMessageEvent } = __nccwpck_require__(5188) const { ErrorEvent, CloseEvent, createFastMessageEvent } = __nccwpck_require__(5188)
const { SendQueue } = __nccwpck_require__(3900) const { SendQueue } = __nccwpck_require__(3900)
const { WebsocketFrameSend } = __nccwpck_require__(3264)
const { channels } = __nccwpck_require__(2414) const { channels } = __nccwpck_require__(2414)
/** /**
@@ -59791,8 +58183,6 @@ const { channels } = __nccwpck_require__(2414)
* @property {(chunk: Buffer) => void} onSocketData * @property {(chunk: Buffer) => void} onSocketData
* @property {(err: Error) => void} onSocketError * @property {(err: Error) => void} onSocketError
* @property {() => void} onSocketClose * @property {() => void} onSocketClose
* @property {(body: Buffer) => void} onPing
* @property {(body: Buffer) => void} onPong
* *
* @property {number} readyState * @property {number} readyState
* @property {import('stream').Duplex} socket * @property {import('stream').Duplex} socket
@@ -59820,7 +58210,7 @@ class WebSocket extends EventTarget {
/** @type {Handler} */ /** @type {Handler} */
#handler = { #handler = {
onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions), onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions),
onFail: (code, reason, cause) => this.#onFail(code, reason, cause), onFail: (code, reason) => this.#onFail(code, reason),
onMessage: (opcode, data) => this.#onMessage(opcode, data), onMessage: (opcode, data) => this.#onMessage(opcode, data),
onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message), onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message),
onParserDrain: () => this.#onParserDrain(), onParserDrain: () => this.#onParserDrain(),
@@ -59839,22 +58229,6 @@ class WebSocket extends EventTarget {
this.#handler.socket.destroy() this.#handler.socket.destroy()
}, },
onSocketClose: () => this.#onSocketClose(), onSocketClose: () => this.#onSocketClose(),
onPing: (body) => {
if (channels.ping.hasSubscribers) {
channels.ping.publish({
payload: body,
websocket: this
})
}
},
onPong: (body) => {
if (channels.pong.hasSubscribers) {
channels.pong.publish({
payload: body,
websocket: this
})
}
},
readyState: states.CONNECTING, readyState: states.CONNECTING,
socket: null, socket: null,
@@ -60013,7 +58387,7 @@ class WebSocket extends EventTarget {
this.#sendQueue.add(buffer, () => { this.#sendQueue.add(buffer, () => {
this.#bufferedAmount -= buffer.byteLength this.#bufferedAmount -= buffer.byteLength
}, sendHints.text) }, sendHints.text)
} else if (isArrayBuffer(data)) { } else if (types.isArrayBuffer(data)) {
// If the WebSocket connection is established, and the WebSocket // If the WebSocket connection is established, and the WebSocket
// closing handshake has not yet started, then the user agent must // closing handshake has not yet started, then the user agent must
// send a WebSocket Message comprised of data using a binary frame // send a WebSocket Message comprised of data using a binary frame
@@ -60236,29 +58610,13 @@ class WebSocket extends EventTarget {
// 4. Fire an event named open at the WebSocket object. // 4. Fire an event named open at the WebSocket object.
fireEvent('open', this) fireEvent('open', this)
if (channels.open.hasSubscribers) {
// Convert headers to a plain object for the event
const headers = response.headersList.entries
channels.open.publish({
address: response.socket.address(),
protocol: this.#protocol,
extensions: this.#extensions,
websocket: this,
handshakeResponse: {
status: response.status,
statusText: response.statusText,
headers
}
})
}
} }
#onFail (code, reason, cause) { #onFail (code, reason) {
if (reason) { if (reason) {
// TODO: process.nextTick // TODO: process.nextTick
fireEvent('error', this, (type, init) => new ErrorEvent(type, init), { fireEvent('error', this, (type, init) => new ErrorEvent(type, init), {
error: new Error(reason, cause ? { cause } : undefined), error: new Error(reason),
message: reason message: reason
}) })
} }
@@ -60378,34 +58736,8 @@ class WebSocket extends EventTarget {
}) })
} }
} }
/**
* @param {WebSocket} ws
* @param {Buffer|undefined} buffer
*/
static ping (ws, buffer) {
if (Buffer.isBuffer(buffer)) {
if (buffer.length > 125) {
throw new TypeError('A PING frame cannot have a body larger than 125 bytes.')
}
} else if (buffer !== undefined) {
throw new TypeError('Expected buffer payload')
}
// An endpoint MAY send a Ping frame any time after the connection is
// established and before the connection is closed.
const readyState = ws.#handler.readyState
if (isEstablished(readyState) && !isClosing(readyState) && !isClosed(readyState)) {
const frame = new WebsocketFrameSend(buffer)
ws.#handler.socket.write(frame.createFrame(opcodes.PING))
}
}
} }
const { ping } = WebSocket
Reflect.deleteProperty(WebSocket, 'ping')
// https://websockets.spec.whatwg.org/#dom-websocket-connecting // https://websockets.spec.whatwg.org/#dom-websocket-connecting
WebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING WebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING
// https://websockets.spec.whatwg.org/#dom-websocket-open // https://websockets.spec.whatwg.org/#dom-websocket-open
@@ -60491,7 +58823,7 @@ webidl.converters.WebSocketSendData = function (V) {
return V return V
} }
if (ArrayBuffer.isView(V) || isArrayBuffer(V)) { if (ArrayBuffer.isView(V) || types.isArrayBuffer(V)) {
return V return V
} }
} }
@@ -60500,8 +58832,7 @@ webidl.converters.WebSocketSendData = function (V) {
} }
module.exports = { module.exports = {
WebSocket, WebSocket
ping
} }
@@ -60516,828 +58847,6 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.KNOWN_CHECKSUMS = void 0; exports.KNOWN_CHECKSUMS = void 0;
// AUTOGENERATED_DO_NOT_EDIT // AUTOGENERATED_DO_NOT_EDIT
exports.KNOWN_CHECKSUMS = { exports.KNOWN_CHECKSUMS = {
"aarch64-apple-darwin-0.8.12": "a3f78d20465c6d18f7072f118ce1c61b164b98698fdc37357e72958c7d1b68fd",
"aarch64-pc-windows-msvc-0.8.12": "eb0c7e47411d11cbc3990eef51a5e10215a1fc9d5f5058fd8e952da94be16512",
"aarch64-unknown-linux-gnu-0.8.12": "9a8a53df515bd64d423c85ace7ddca08fb9a91d8a115934c4495b5cf74c60ea6",
"aarch64-unknown-linux-musl-0.8.12": "de85bafc3e238a4fce87eb6a4e584c9c04721475abb9e5f6fe186bdce650763f",
"arm-unknown-linux-musleabihf-0.8.12": "5fe2f13d8c62d410278fbd69b0c1f03be5bd2c40168a98dc8fc82bca64c2eaad",
"armv7-unknown-linux-gnueabihf-0.8.12": "6ddde49d5fcc04a90855f31b5cb500146dac23f31d16f6d7fa7da1ae481eab1e",
"armv7-unknown-linux-musleabihf-0.8.12": "39b626f438c22a3122546445d581fe02b6fc449649b4890f44791af4f3d3c18b",
"i686-pc-windows-msvc-0.8.12": "97e0e04648e48cccdd25210f5eaf6fb2d46f1a198983b7de10613faf1629663d",
"i686-unknown-linux-gnu-0.8.12": "74484899512bb91ed4bd64d117284c20912c39c600cc775d6ef1bf278d6c2a94",
"i686-unknown-linux-musl-0.8.12": "b1e303c231068a3a419b12d3ba4dc852931740ab3ad691c7a87309327eac732f",
"powerpc64-unknown-linux-gnu-0.8.12": "455bd841952724bff1f45dad91555ce2a33c837cc8d734ca39afaa0ac3c8385d",
"powerpc64le-unknown-linux-gnu-0.8.12": "30f1191e997d8d2845b27f57ce30e8d3643994161b7d099caf81fde22d723fa6",
"riscv64gc-unknown-linux-gnu-0.8.12": "1e9e7ca966999161ef5174d28a18777d2a143c081a63d455f5b7fd5a1513d2e7",
"s390x-unknown-linux-gnu-0.8.12": "55ec25ef06c1e0c095f2baa1a12ce38879db8db99a4b046286a9573dd3c605d5",
"x86_64-apple-darwin-0.8.12": "467b462e854bc750fcad8e3ad35e2aca0d301c9287f2365afad8c17b7672b6a8",
"x86_64-pc-windows-msvc-0.8.12": "3fb92ce0860db7cb094ddeeb1ac521532fdd3e61d0a130f7bbc6be54caca7c2e",
"x86_64-unknown-linux-gnu-0.8.12": "f976ebdc612e71209f46664ab6c0325fa0090059b4474e047edd39eb9395373b",
"x86_64-unknown-linux-musl-0.8.12": "fa682c444b8a57a0984129d0989801fb0406f9238a57df76fdde063c6b2339c2",
"aarch64-apple-darwin-0.8.11": "c9e74f779a65798057bca2ff328d5c9952f458391e220c3d3216d7a03a338d9f",
"aarch64-pc-windows-msvc-0.8.11": "09c6cc8c511d166dc12c9e56ce06c92de928a2e5bad14fc079654901dc8ea114",
"aarch64-unknown-linux-gnu-0.8.11": "472dbebd1369049e58d3bbeaae663b212e691676cfd15d799e4faca616d37264",
"aarch64-unknown-linux-musl-0.8.11": "1c6045bec4d5ca17777dd271401a0407c5acad79f74fd38f35c31ca64c689808",
"arm-unknown-linux-musleabihf-0.8.11": "84da6bfdf9ee693c7278770e1d16d0d5e3ba5ea8f913d7fed13e9854aad95e31",
"armv7-unknown-linux-gnueabihf-0.8.11": "a27bb0ae23d0584f1a6a7f851362cb52687bbd22ecce37cc80f3eeca0925dac4",
"armv7-unknown-linux-musleabihf-0.8.11": "29605e9724eb7c68bc67892b4d8bcc28d03c1cb1125cb3dd783e81dd61cc15b5",
"i686-pc-windows-msvc-0.8.11": "17e45a6afa19443a9749668540a033e9fedd3d6bec1ad8952d10da1f40ed9e92",
"i686-unknown-linux-gnu-0.8.11": "85fb818676480ac0cc0f7219e4fd96667d851790c4dd054dc84f304128d88817",
"i686-unknown-linux-musl-0.8.11": "194bc103af40c2a15b0a2e86e5eaad53a5219243df8e296d98e9c6269f67e0b3",
"powerpc64-unknown-linux-gnu-0.8.11": "fde3e344ee3ef3eabc4803a27a05f06b082819d09153ec126b09f93882e54082",
"powerpc64le-unknown-linux-gnu-0.8.11": "a1de2c76674c5566e27f8a5b8868b4f416ec659ad657aa87ccc2d17f9cfeaac5",
"riscv64gc-unknown-linux-gnu-0.8.11": "c068fe0b27b7b91d79c3505fcca16ea8dc2df499e6420877bd5cf75b26f5304f",
"s390x-unknown-linux-gnu-0.8.11": "e4d8ee92b9e20a7713cf7a9f7d7b288d9d726e7e96d874aaa20e3acc1d408287",
"x86_64-apple-darwin-0.8.11": "7ed76b0cc314fa0cb6dd7ae99379efd3cf8fc14d71af8d71b0b5238582c7958d",
"x86_64-pc-windows-msvc-0.8.11": "3e802b69307b10f228c8f1d096bd5721ac37a133bf33672f9fcc46a58dd5c920",
"x86_64-unknown-linux-gnu-0.8.11": "0c6078318332c100d7d9988ea99144b534e40adef2958aa314a9f7c7b8516ed7",
"x86_64-unknown-linux-musl-0.8.11": "0c66f4d06a4f933bddf75d4ad64e0e2d717f015ba1876c51e32ff293c84f57d5",
"aarch64-apple-darwin-0.8.10": "5200278ae00b5c0822a7db7a99376b2167e8e9391b29c3de22f9e4fdebc9c0e8",
"aarch64-pc-windows-msvc-0.8.10": "c51b02188c312baef71187273afa625576101e5680739eab83b1b09ca5d2f3a8",
"aarch64-unknown-linux-gnu-0.8.10": "de60f5e3d69b54e6196fb8937fef4feb15e239f0fd14278e77e44dbb353214ae",
"aarch64-unknown-linux-musl-0.8.10": "704f202ca92386eaa095706ec7e26c4f052f7e17721767d4ee18c676565c51b1",
"arm-unknown-linux-musleabihf-0.8.10": "51d1244dd7f23d8aa021fa4d2a662a3727b27241e0ceb6f11820cb495611965f",
"armv7-unknown-linux-gnueabihf-0.8.10": "ce22ffada0356570f63ad0aae096226f1c45c3d561023b3fb2b1f0936f2b804c",
"armv7-unknown-linux-musleabihf-0.8.10": "9ee0a14ec4fa263095bae4da329602f7735d914db4ad59079b47d714bfb95409",
"i686-pc-windows-msvc-0.8.10": "e62a2549135b4b9474c18e7bc9f0937837012dd9039f6b4b2c109a1cf99ad925",
"i686-unknown-linux-gnu-0.8.10": "cdd36af87ca53ec6b8cc4507e85c9ca54c40fd77613633a1095a1a2f317a0563",
"i686-unknown-linux-musl-0.8.10": "658f14b093e3bf4ffcad645fe27d7aa2f8f18a6f625a22a246288c6368a4d88f",
"powerpc64-unknown-linux-gnu-0.8.10": "f16d77cfca0dfca2bcef7cc556e0316ba5fdc61b1c3387d60b7c40e12f6617dd",
"powerpc64le-unknown-linux-gnu-0.8.10": "00bc1b47078520c588dbd383700d35c786ac2fa3e53c9fca51c5410581f8c87e",
"riscv64gc-unknown-linux-gnu-0.8.10": "db605bb442563f0494c174be639b9d80fcc4e27e360a31ad2675005ea1a1e3ab",
"s390x-unknown-linux-gnu-0.8.10": "83ca774828d652ce9dd1d6e2619e66c471e2cb236754783019b9ae0f4da72718",
"x86_64-apple-darwin-0.8.10": "3b935381af9124a5d5da48235e149f5f0662f2717e75782d1b843d39d9265d6d",
"x86_64-pc-windows-msvc-0.8.10": "37fcd011fd22b2a569f7e583a924af2d624d99445f669752923a2fd3841f8e3d",
"x86_64-unknown-linux-gnu-0.8.10": "2c4392591fe9469d006452ef22f32712f35087d87fb1764ec03e23544eb8770d",
"x86_64-unknown-linux-musl-0.8.10": "4031c6f7ac3890f29c72e0ea655add58b8fa1c678d20afcf57efa51e57751732",
"aarch64-apple-darwin-0.8.9": "c233bee389c15fdef09a6028db61cc54a12e6171f27d6d9c018eedca5bbbd011",
"aarch64-pc-windows-msvc-0.8.9": "7dc9b954e236f842c2120bdb50307f23104ca20a52896c7ae0ea0100904b2aed",
"aarch64-unknown-linux-gnu-0.8.9": "03108a851cb87ce44069767e0ae7907d9a31180bdd64913852fcde25848d84f2",
"aarch64-unknown-linux-musl-0.8.9": "fb1f2800bfd0bc9a121269e276653899c726d81cd08d6299f0fb34b4b0d61fcf",
"arm-unknown-linux-musleabihf-0.8.9": "9a73ca16557efd21d4dad17759261c6f93eb4079a95bb39c578998ad787ee871",
"armv7-unknown-linux-gnueabihf-0.8.9": "a6be2240c8bf070baaed8ee0a9071fe5f33b2fad55f67d39fcdc8ea720ff668a",
"armv7-unknown-linux-musleabihf-0.8.9": "758bf39e33d3162fe6ec7bd5f359cc78daf8ce46b2300dec6c31f37b705521f9",
"i686-pc-windows-msvc-0.8.9": "25988dae5e7698de1a6ff4bf08ed336d138710ee52f52de60859b99acf2bc96b",
"i686-unknown-linux-gnu-0.8.9": "02a140e4d0af8d469ec088eff51ed9b232c76cfa02d4df0b84b7567c2d6ab95e",
"i686-unknown-linux-musl-0.8.9": "99fa13e9079901365277b9b409a2892afe2efb0260f940388cadb2d56d706766",
"powerpc64-unknown-linux-gnu-0.8.9": "604102c2bf07fbb3cc26bcb6b95e60cac55d74b4e21f1cee4b2d5f58930aa5cf",
"powerpc64le-unknown-linux-gnu-0.8.9": "8ab18629d8a71a4188761e4e2b0eca0970690f13c85697ad232fe8b22e8d5a99",
"riscv64gc-unknown-linux-gnu-0.8.9": "757944803901c5ca4049147e28e429e34c04d5ac5fe78728396ec4b810063b00",
"s390x-unknown-linux-gnu-0.8.9": "b78f56186edfed8f117ed1fa09fc59ad9932864ae4e655ae61f3e205846c7ced",
"x86_64-apple-darwin-0.8.9": "27fe8645c2599b672c3a6c865131a3d916eed9a3ba7cff5a0b863e01a473df66",
"x86_64-pc-windows-msvc-0.8.9": "b08d68a0d86e4d0d1b5fa439ffa73ac90df2305c595f617ba9d9b5e8740a8efb",
"x86_64-unknown-linux-gnu-0.8.9": "1056ab7c04bf9030dc0623c260fae0b414675775f333f318918000f667da6ee1",
"x86_64-unknown-linux-musl-0.8.9": "6bb907345f9100978d3529c8a5b2cbb4e831080909c51a5bff714b491251303e",
"aarch64-apple-darwin-0.8.8": "9de9365997d7579d27cdbc132883343b3c47add16804f11be679375037dec33a",
"aarch64-pc-windows-msvc-0.8.8": "3029df83f2b40d2fa0cc896aed8a157afd02e8ce767064d80923e166e46b75ce",
"aarch64-unknown-linux-gnu-0.8.8": "4e144807bef9a3b6f44fd5e4084d5010738787745c07e09dee4f008e8bee17a8",
"aarch64-unknown-linux-musl-0.8.8": "fb7785d31a64f416ef67292ba3717781ef4eb1d6f93b6e30715d9127e862de2b",
"arm-unknown-linux-musleabihf-0.8.8": "fb8ea8fa543322b4901b5acc585e1373dafd996d9aadce7d0c00c00ad36f2cdd",
"armv7-unknown-linux-gnueabihf-0.8.8": "684538c1aa5da718abb86b0f5a3c5d2eb05a11520e5c87a2b75050751adcc8c6",
"armv7-unknown-linux-musleabihf-0.8.8": "c5eebbf9ae549ca45f563a9a9770c1534854a5c4056acac0ab3779b9e1f24d75",
"i686-pc-windows-msvc-0.8.8": "9ec9bf63460e0625cd941a5bbe0775b99c33def5a2f1fe6cbc9e99e167fea33e",
"i686-unknown-linux-gnu-0.8.8": "d934b2f6c892a25d928cdc2dfd42b3e925011992603879d2035bc7b15a236c35",
"i686-unknown-linux-musl-0.8.8": "a5b258ee1f686bb58f912ce8c5def3531e0e4cd2bcfe3ee332bfaf3b35e674e0",
"powerpc64-unknown-linux-gnu-0.8.8": "23dc87674b030bf4d7f4f1cd1b903d18ccaec43af0373d62e309ee79cbe2c2f8",
"powerpc64le-unknown-linux-gnu-0.8.8": "6a72bb057073ca989690882ac0ae70e6825151e0d2d52d37540be2dd41d70b56",
"riscv64gc-unknown-linux-gnu-0.8.8": "f107450c910336bfc636208d4d0430a8a6581d98824a4deee5715ac72b73c97a",
"s390x-unknown-linux-gnu-0.8.8": "5aafe51b39dc715c887d6c1960d82659fa18a7505d0050e6eba36ae5956e4c96",
"x86_64-apple-darwin-0.8.8": "3346a3d4a45d7457dafadcc1715e8e529e5b65c27aaba2417db4b0b32a8cbac6",
"x86_64-pc-windows-msvc-0.8.8": "ac76b826e5ba70c7a041e9ee344cbcba2919cdd3010fff7f1a83b7864911633e",
"x86_64-unknown-linux-gnu-0.8.8": "ecc2e39de86afea661c145f33f6a89a45b1d2427d51a22b458e2c64238794180",
"x86_64-unknown-linux-musl-0.8.8": "80ee2bde42e1cc39c59ae8a3a20f5b73127b90ece009ef7bdd13ab189ff0c353",
"aarch64-apple-darwin-0.8.7": "d1f056d2d04b07a69d2be6ed7eb07ece12dda26570a9af316309787865eba374",
"aarch64-pc-windows-msvc-0.8.7": "5e0fdc7ebe4f237fa1b24a95116243e6c5fb52e0601aed3b7ca24b6a76b6c2ec",
"aarch64-unknown-linux-gnu-0.8.7": "405965165e6c5a782d9b69e1a641a491533cec80390b0bfbe95eedcf5cdc5078",
"aarch64-unknown-linux-musl-0.8.7": "70fa63fca7c7b1ccb5a96b8b5691f8dee2f2caeb61fcf6a110227e3f55fcf94c",
"arm-unknown-linux-musleabihf-0.8.7": "172e93344f2aaee552e606150a1d9bd8de2df2716c81ecc332904e4b2713b964",
"armv7-unknown-linux-gnueabihf-0.8.7": "3277a9db5244767ed6e8848e487377dea69b67e0a196886696263ddbc5681daf",
"armv7-unknown-linux-musleabihf-0.8.7": "3170d7251d8d2ab40c86a1b20221d6486baf5f52e7069525893cf20481cc8281",
"i686-pc-windows-msvc-0.8.7": "f97b09e12f10e8e77b1519124f1f16720bbd64bc0436cad0868f4a2927a7a0e0",
"i686-unknown-linux-gnu-0.8.7": "0e88d6a9f088f6632026d7009559d519598876db8b46540dcc6ff015bbf16b85",
"i686-unknown-linux-musl-0.8.7": "1ab32b294aa94846ee9d1c2597ea8f617aade1e7faf2c8e460d5414d87dd8a58",
"powerpc64-unknown-linux-gnu-0.8.7": "52fe0acf3cb57ee33407c1a2d25e66ec08ac6c4a259e016a54ea34cfe749f148",
"powerpc64le-unknown-linux-gnu-0.8.7": "ad8d7a098c7f1603adb55bf794a6ba952c715d5d05112482a6c9a9b63d04fef8",
"riscv64gc-unknown-linux-gnu-0.8.7": "f6bea3521a2d5b1593cb8f18d54237d0ae3b388cbd2cce83c1dcd4b512dde1a6",
"s390x-unknown-linux-gnu-0.8.7": "ee877021eb1862d9d0cc37697267a01cfdae307c6a8bf7ece27ae92b330fd2d9",
"x86_64-apple-darwin-0.8.7": "dca85ae222d59ddbd83f61355561d3183cce9d23eb5931c41646499f43cb2b93",
"x86_64-pc-windows-msvc-0.8.7": "0baf6d021ca283df5e5c768ff51281043fefc889ac14aff8ce58189453166eef",
"x86_64-unknown-linux-gnu-0.8.7": "060f68b7e86fee70ed19b852934ce6f05bb15d42894ce4a26c34a18b4c3cd511",
"x86_64-unknown-linux-musl-0.8.7": "b1283a1b42f81dc79c2e58eb77a41e21fd4c59344d3d19e72810ab031ba93771",
"aarch64-apple-darwin-0.8.6": "15269226c753f01137b5a35c79e59ab46d8aab25a242641fdc4003a6d0a831ff",
"aarch64-pc-windows-msvc-0.8.6": "a2891f1f1c56e717115579da655951007e2e5e498535b473d9f7cbffe7369e1a",
"aarch64-unknown-linux-gnu-0.8.6": "6fd314ca589788265ff99ec754bd2fa2a5d090ef592ddbbe8ded6b141615a491",
"aarch64-unknown-linux-musl-0.8.6": "d78076c7e0dfcd3580736c11e009ef856bd13015f00406e3ded1fc895e2104ba",
"arm-unknown-linux-musleabihf-0.8.6": "87d33a579cc2ee986e3163bb5de1791c6052ef8716d5fb8d8bf73aa2e5f1bf66",
"armv7-unknown-linux-gnueabihf-0.8.6": "4139d74dfe3192bc71dacd3cf0cdf6a006d121db2c4d841e08f369761baaf00e",
"armv7-unknown-linux-musleabihf-0.8.6": "5d4d117cebddc7dbdbf6e1410c65868f113a75700acac77eed28dfdc0411c113",
"i686-pc-windows-msvc-0.8.6": "4eaa185b61f9cfe73ab7534de7282e51cc0f6bf47361429bdcbb6a5f3264f6e4",
"i686-unknown-linux-gnu-0.8.6": "7fb9324cfb0c57a9b9145e73598794c7bc4df01f50730bd926d4ab10d4fc59ff",
"i686-unknown-linux-musl-0.8.6": "3c2e2d69e8da093df76ffffa9758669c33ae47624f73d06ec2a83a363f17fbd4",
"powerpc64-unknown-linux-gnu-0.8.6": "264dbfddd58cdbd35b33ea24dd802a3409eae1d4516d057bdff88df2e257eaa2",
"powerpc64le-unknown-linux-gnu-0.8.6": "d34c6d7df2ed9e9739bc0313875e602a943b17fccbf1127f824a5ff9a3253bb5",
"riscv64gc-unknown-linux-gnu-0.8.6": "6bcd5a72977a4362f042cc2568960b5a42c1f13240ada6b1cce6aa2f6d6a3e42",
"s390x-unknown-linux-gnu-0.8.6": "8b4372280249038ea5824937d6e1ca7e2192061bd38f3362200133ff55cbb9c3",
"x86_64-apple-darwin-0.8.6": "4b1da363d8913a85a4a40df6620ae800b16c62beb54f60b1d336432644cb12bb",
"x86_64-pc-windows-msvc-0.8.6": "f7ed402ea1e4d7fb2b2490e1a097e9849bfdaaa689521d290bdce5478db0428f",
"x86_64-unknown-linux-gnu-0.8.6": "5429c9b96cab65198c2e5bfe83e933329aa16303a0369d5beedc71785a4a2f36",
"x86_64-unknown-linux-musl-0.8.6": "0d89cffae3ad1c4ae2d4da06f71ad4539974185a31f7c196a6151b400bf84039",
"aarch64-apple-darwin-0.8.5": "467e875ac84ac2155f048b56e33741d7dee6f02369048d5b6c05b74b745411e2",
"aarch64-pc-windows-msvc-0.8.5": "8d3dda6ff64065e65b49ecd42018a885c0f20e6967af950ef121f976d73e72db",
"aarch64-unknown-linux-gnu-0.8.5": "db05450c7c1e9dd51eeaf4b59c3bc3721bd9146e7ad95e87f5736d45c4037ae0",
"aarch64-unknown-linux-musl-0.8.5": "400771c1136c9d5cf624bb1695b08d46a4e4e0fc2c9b8897e7be950ac5e00ae0",
"arm-unknown-linux-musleabihf-0.8.5": "7dcd2a34735d2871714ee4993cf0227492c860ab089691a30f6a65d48ec469b6",
"armv7-unknown-linux-gnueabihf-0.8.5": "0032fa90b0a74559ac965538178499de6b396ec7ff9b8d8134f442d2d3079f8a",
"armv7-unknown-linux-musleabihf-0.8.5": "daab0e8f9b563dcbd6bc6ac517a5f9ebe1b1dca9671011d40012c73f0cde8cd0",
"i686-pc-windows-msvc-0.8.5": "2c133809d2839eac93341a14df6fb16bf834ae3c7582f069cf24ccc60cf367f7",
"i686-unknown-linux-gnu-0.8.5": "6c6b88bf178f5bd508523457a589e09c885deb57983f8d73dfdd43794d6decfb",
"i686-unknown-linux-musl-0.8.5": "5968f60135941a2bcca742bf44854bbbe8adfba4d0a170f5991d95572c0e4d26",
"powerpc64-unknown-linux-gnu-0.8.5": "a4e7b7dca6386b8623c12581ecb606b31a9df53ca8acbbb14dec5ceaa23c1603",
"powerpc64le-unknown-linux-gnu-0.8.5": "1d521c56d8ee83b90f15350f1cebb506e2441e574b27acdbdfce8449ddbfa1c3",
"riscv64gc-unknown-linux-gnu-0.8.5": "ca7536b206090982e6f90d566bc441598a6aaad4cfc885618f12051c51a0e454",
"s390x-unknown-linux-gnu-0.8.5": "92fd077879ea943775bebf49d3515b5da8a237bcb9a975b2476183946b6ed017",
"x86_64-apple-darwin-0.8.5": "9ee5b34975ab4659345fc96cc08098d7ec871cdfa969a5774894bcaebdaf3b58",
"x86_64-pc-windows-msvc-0.8.5": "898049e2db4a92e59bf1da7e14cad9b5afadb7d0cf9dd55a5274825290f7ba6d",
"x86_64-unknown-linux-gnu-0.8.5": "9db7e7db3cf98ddb57954bfb72c9ba4b8a4514b910e666e3c57e8b4e83a0d630",
"x86_64-unknown-linux-musl-0.8.5": "64aec5c2fa8255d19ff20480afb6445e29be94628c58a429c131f5c60bd990b5",
"aarch64-apple-darwin-0.8.4": "ef6785df8c23232ce6209c04acefd0c0d2ffb3a3ba0eef16422bdfe99a059105",
"aarch64-pc-windows-msvc-0.8.4": "34cdff9ed7e1ffece93a895e65377a0ea4f186eb6785ead045280be59edabf19",
"aarch64-unknown-linux-gnu-0.8.4": "d42742a28ce161e72cce45c8c5621ee23317e30d461f595c382acf0f9b331f20",
"aarch64-unknown-linux-musl-0.8.4": "d194e457ba2c9f4e737ee9919c66465e0297d956b6c7121b61d37b98e15a694c",
"arm-unknown-linux-musleabihf-0.8.4": "cfd9d5c2d5bc462308c54e4224cb4102819cfc230cd7a75dcf5cd345969ab732",
"armv7-unknown-linux-gnueabihf-0.8.4": "234358eb9384c6392678d392ab0835daf500a71b6d78b5b33f10793c2c695d05",
"armv7-unknown-linux-musleabihf-0.8.4": "65408f9aab2895faa1c523a064eef01f2d5cea4686ceb704217d8ece03a69a8c",
"i686-pc-windows-msvc-0.8.4": "fc4fca95757e78fa4a782ae7f5cba4f52137df49b737cec0a6ad8092ca829151",
"i686-unknown-linux-gnu-0.8.4": "d43485d5531529c4a57bf9b504e9ac1609a4467d220a268c38464d83d6df08b6",
"i686-unknown-linux-musl-0.8.4": "cd4e9127d6562f0817060aa9c1b396afc7db31cdf48b73ecc347bd6f4f77f075",
"powerpc64-unknown-linux-gnu-0.8.4": "3083419366b512e89e53f7e73c48ca15e28daa1ec674f5ef6492d06b0834e62d",
"powerpc64le-unknown-linux-gnu-0.8.4": "1e1164b8b2bfcd09daf5b32bada5fdc08b81d384bebd9707691cc48561749a27",
"riscv64gc-unknown-linux-gnu-0.8.4": "0b4e5e41b4c2836e6d8c1b4eb5151a0ea775908bc892ba62a8126fcdd7b06914",
"s390x-unknown-linux-gnu-0.8.4": "28aefb0bac0349aa3f218cfa43ce50793f81c6948d01e2e4b97ea5421a2734ab",
"x86_64-apple-darwin-0.8.4": "14e5309f182d1a92cf6c82f5891a0a0dc1cd5d46627171eaa1e84fa2b7e0afc3",
"x86_64-pc-windows-msvc-0.8.4": "817c50c80229f88de9699626ee3774c0cceed86099663e8fb00c5ffae7ea911c",
"x86_64-unknown-linux-gnu-0.8.4": "eb61d39fdc6ea21a6d00a24b50376102168240849c5022d3eba331f972ba3934",
"x86_64-unknown-linux-musl-0.8.4": "4e16694fcc20a94136af70fb1449e8817150896af0339b6b28dfb6d006cd8116",
"aarch64-apple-darwin-0.8.3": "9ebfe9f3b51187932ef97270b689da48261acacadd6ea7018d2cc62719c86ffe",
"aarch64-pc-windows-msvc-0.8.3": "6e0692b817c5d6cfddad13ad177e866e36d95e8d32b4a296a49d937fdcda18d3",
"aarch64-unknown-linux-gnu-0.8.3": "e82b5a3eb19e5087a6ea92800b0402f60378bd395e3483acd0b46124128ab71f",
"aarch64-unknown-linux-musl-0.8.3": "05707835aadb8d0dfacf64a50dc31eb77fb11d1773b13ddd78d2404d43be3b7f",
"arm-unknown-linux-musleabihf-0.8.3": "63f09a167470e40f5a7afce7ba726fa31d700042107215a8f46572a617b2ba64",
"armv7-unknown-linux-gnueabihf-0.8.3": "ca3ab5110a248febf3af56ca8e417add5a164228d8861d2f6439d6c77654ad24",
"armv7-unknown-linux-musleabihf-0.8.3": "79b9f2f8abf64b93aaf48f87b159bc34e73b92428c6424a9e633f481449bc8be",
"i686-pc-windows-msvc-0.8.3": "5d272849a94b7ad36711f336d745e08ed3732042fc51f5c7f28bfc4e95463615",
"i686-unknown-linux-gnu-0.8.3": "5ca9dcdd8aba4c59266536c00453f3815ccf4852a1bef78f181f4ae43726e742",
"i686-unknown-linux-musl-0.8.3": "7a7eb903b673c0a0fa8282e12d2130fb63c1f0e574b1b8eb24ac63503db5db9e",
"powerpc64-unknown-linux-gnu-0.8.3": "ad94079c0aa352730e5656246ecb8fd6cb5c7c1bbcc100954020f32128d6b0de",
"powerpc64le-unknown-linux-gnu-0.8.3": "27ccd00f3c617b59d6977e48612dc5fe49d15c1181bf995863350e78002e54ac",
"riscv64gc-unknown-linux-gnu-0.8.3": "897257393ca612058bb22691fab3a45480d3f7fc1df5bb968696576d7d98d6c1",
"s390x-unknown-linux-gnu-0.8.3": "d148aebfc019aa14c686713fb0a391bb700290ecdf2903c2fdab0009182d880b",
"x86_64-apple-darwin-0.8.3": "77eac9622f76ad89a8c59b31a96277aa61eb290d2949c69ab2061076471aeda2",
"x86_64-pc-windows-msvc-0.8.3": "4ca84e28b08f48255f95156c5987d61a5e4c51a43372708bc6d84e994eeb7bdb",
"x86_64-unknown-linux-gnu-0.8.3": "427c27ed5f87bf91aa045cf459ea34d348ed6377c62c3c054f1b4046b2f83fe2",
"x86_64-unknown-linux-musl-0.8.3": "bfbe34caae328355b720ad0f667be99990b1b93721c8cb726e4a502796eb6d68",
"aarch64-apple-darwin-0.8.2": "954d24634d5f37fa26c7af75eb79893d11623fc81b4de4b82d60d1ade4bfca22",
"aarch64-pc-windows-msvc-0.8.2": "0e1e80ca0d6faab2c716ac7b73214c6df7a37dc0a45998d5f7d6e73339db8e48",
"aarch64-unknown-linux-gnu-0.8.2": "27da35ef54e9131c2e305de67dd59a07c19257882c6b1f3cf4d8d5fbb8eaf4ca",
"aarch64-unknown-linux-musl-0.8.2": "725237095ea91ad4fe54b1a047138194bdef428002709e0ae9dfea33b66e1c8a",
"arm-unknown-linux-musleabihf-0.8.2": "ea523b34d5c96b32f1f68a51b690774f7822474a355fd74973a089ba2002e82a",
"armv7-unknown-linux-gnueabihf-0.8.2": "8fcbdce85af3b62b8625e780c0065ccd35aab830fcd380c2bb5a03e2174861b0",
"armv7-unknown-linux-musleabihf-0.8.2": "d433a35cd4e0b9ed8163b42b69d050954b77163765e5c25ac21aa08da2117ad3",
"i686-pc-windows-msvc-0.8.2": "d862eaf046abe9143b3e172137cb50657920d324cb3e00be78d22aba4478d7f8",
"i686-unknown-linux-gnu-0.8.2": "fc0baebac65fba4865c23f0ec31722750543c5f5320d7c52221b0565065520ce",
"i686-unknown-linux-musl-0.8.2": "fff6ad20fbcf808089823161a303ab32bfbec31b0af73c3d5717fe8b80aa8a81",
"powerpc64-unknown-linux-gnu-0.8.2": "d0cfde8f85eeeb7baabbca6ad7e66fba0bfb2e6145a95fb9fc97d82d153d08c8",
"powerpc64le-unknown-linux-gnu-0.8.2": "f44b3870a323ba5dbd189c46ef10e565f9ba94c1f675b1daf8d1deab7cda92fb",
"riscv64gc-unknown-linux-gnu-0.8.2": "87e97d546129846a2ee73516fa71770ee787ee62121ebfc5c3db682ae0f54cf1",
"s390x-unknown-linux-gnu-0.8.2": "de324cd0b04162e25fd1dc2332b05e556978fec4bfcc3fbea6565e8276caac53",
"x86_64-apple-darwin-0.8.2": "ae755df53c8c2c1f3dfbee6e3d2e00be0dfbc9c9b4bdffdb040b96f43678b7ce",
"x86_64-pc-windows-msvc-0.8.2": "503a430df36957f851daedaed707a2ab69ed21a48bd499c2f0f7253ad5ba983f",
"x86_64-unknown-linux-gnu-0.8.2": "6dcb28a541868a455aefb2e8d4a1283dd6bf888605a2db710f0530cec888b0ad",
"x86_64-unknown-linux-musl-0.8.2": "2df1c90246ac03b237f997dce0a31a757523a6aaa9a15b26996a9851dc08ad3c",
"aarch64-apple-darwin-0.8.1": "4dd195318b0ca893f9e51bd243441016fcf721dfc2c29f86ab7de74c1c216e53",
"aarch64-pc-windows-msvc-0.8.1": "759b952f7ee0f2a556f6470ea48a2a87508f9a5cbd3624c881875c93748389af",
"aarch64-unknown-linux-gnu-0.8.1": "0604abcd1a9232022f1b093874e6303d2725512f2e9fc324f0ac49a30d1b2de6",
"aarch64-unknown-linux-musl-0.8.1": "4b87748593ca3fd060b96599494d5bad6e172455208c3d6a0f4d36cc89a435f9",
"arm-unknown-linux-musleabihf-0.8.1": "6903a6c4ac2f00548a0164ff53ba1898be2e48449071c90bdf38811537ef47d2",
"armv7-unknown-linux-gnueabihf-0.8.1": "179e0c81217d97eecba4c75566404edf947614f72b0be8b5c975b60b7d973282",
"armv7-unknown-linux-musleabihf-0.8.1": "f62be877927f3a5e6ee99e352e73af8e1735e4251bb8cf11424f79b560616b20",
"i686-pc-windows-msvc-0.8.1": "87107714fee0e0b137360b8b5f2425d5994655c58f2743fac5203c5d5cbf2f7e",
"i686-unknown-linux-gnu-0.8.1": "1689bb02d731cd4e0ad6e9fb384c937d5ea38246f80c4a3f86bd9bf30c395490",
"i686-unknown-linux-musl-0.8.1": "9a39a92210752fb03436eb9e69a52cade45c6fdad92aca209fef5594df2dded1",
"powerpc64-unknown-linux-gnu-0.8.1": "5a6bb32ba3f0e26d7a2de90987ba285850a8b405eb402484448c927721fb784d",
"powerpc64le-unknown-linux-gnu-0.8.1": "0e7bb9f5c298b9a55e019809fbc7d4a88e491ea7b606cd6b4bbc9ab648904af0",
"riscv64gc-unknown-linux-gnu-0.8.1": "5346c2757546b26fc3b738cc021c3c17e372a08b6ee361cde95a88ee1eb87577",
"s390x-unknown-linux-gnu-0.8.1": "66108f45f1fe81b7b02c3490debf838a90c818de00dd8c17c45ccad65554f8d7",
"x86_64-apple-darwin-0.8.1": "96b3836b7bf97a24ac13a8854f2da7cd3a44993820935b29be964d776e3a3446",
"x86_64-pc-windows-msvc-0.8.1": "b161c45b2a7f97400b1005591d782d2c96ea1c4570ac1336cd82a2500dbbed1f",
"x86_64-unknown-linux-gnu-0.8.1": "abaeb153d85cf57277945c70fe449f813b14aa1913d1caa50daf333a01b2f317",
"x86_64-unknown-linux-musl-0.8.1": "e54c95d4f1420311b7266d57e36304755b24c956a2928f365bb91215e3554c34",
"aarch64-apple-darwin-0.8.0": "5a5ca58e3999d4f440632da87a56f7030eaaa3a13d3896561eec5fd51cb9ad45",
"aarch64-pc-windows-msvc-0.8.0": "2fc83c9e2de30c1de8e9461188ffdac75ad41ac1e2227fd158d46b6cd09501d3",
"aarch64-unknown-linux-gnu-0.8.0": "61f136a187150624c10ec7025137fdf5391ef083a4cab0eba4fbdb2a928de16b",
"aarch64-unknown-linux-musl-0.8.0": "c5a7c042e40a9acb693c5ee01f26db047b07e4f3f301470b38ee4a2f3e0e831b",
"arm-unknown-linux-musleabihf-0.8.0": "94c54815e371c93ce08ba5d4b95e7d847d11bdc1ba5af5e15656e6d1be521f74",
"armv7-unknown-linux-gnueabihf-0.8.0": "57c891ebe985ef1c4e83bbc60b9d2fce40fd6e383db451ac1fc04d60a415022d",
"armv7-unknown-linux-musleabihf-0.8.0": "fa8a3f50c1ffeb7013a7fb9d9dbba54ff0a1e5d2c4c758ec6fe785c37426ae7f",
"i686-pc-windows-msvc-0.8.0": "cd03e12986765e48297228678dbeada0c284c552884910bcb3f0ea3ceeec8ee4",
"i686-unknown-linux-gnu-0.8.0": "ebb52595b6b5a0b6805a50c5d5dc06fd632bbfcce5854228e1e426784e7813b6",
"i686-unknown-linux-musl-0.8.0": "b9a44b22bb0605f8413d84a811346696b79e624aed850c0087fbea389074d401",
"powerpc64-unknown-linux-gnu-0.8.0": "7b65a08c8ac4a2fae9f466d94e29896fb5f49f92d72a7c6ac315031b94d43857",
"powerpc64le-unknown-linux-gnu-0.8.0": "698bc873422f261ec7e9da3ddb3a1b2b2d96be3f4aa6abe566c9d4a315b9d9d4",
"riscv64gc-unknown-linux-gnu-0.8.0": "c508d286c64d34933f06e6ce04e2aada129e039692a57f6d8adf0bf9bbb90186",
"s390x-unknown-linux-gnu-0.8.0": "756f55e2567585f1e62522b3e25bfae8c1b7f8a856d2e7ec85b48fcf5abbe9a8",
"x86_64-apple-darwin-0.8.0": "828917cad79aae8327811c59fcc625ff3861bfe21d2cbb77c206737d41117ff2",
"x86_64-pc-windows-msvc-0.8.0": "bad5afed0c18bd7f6c5125f5c7ab89ac830a3db7340c96d50a50527e9880cdfe",
"x86_64-unknown-linux-gnu-0.8.0": "a7d74ee5c5ff3069b9d88236a05f293cc4e2809bad872f3a88a384489ba3675e",
"x86_64-unknown-linux-musl-0.8.0": "0208cbcb3850bfc69277c9a16c2b0399218b075dc923aca7e4b576ee4228c570",
"aarch64-apple-darwin-0.7.22": "707677074a9ae6906d4ccb22089341e3541db78022dc926e985bcc35fbb53a74",
"aarch64-pc-windows-msvc-0.7.22": "bcbee39a55eca43ea286cbaa467b083888c7811ab8f47458063bc53331224f4d",
"aarch64-unknown-linux-gnu-0.7.22": "d2ee24524f5ed45baceaddebded48493f7dd2692fad8a1d1796c606134c133b7",
"aarch64-unknown-linux-musl-0.7.22": "1d524e7d61336ccdc4caa2299df811f318b96d81034ff621b7217d6c440a1702",
"arm-unknown-linux-musleabihf-0.7.22": "ad458ba424cbd77f8278b634e9e14a2fea0ba1610b7a51b38e611cd8a8072792",
"armv7-unknown-linux-gnueabihf-0.7.22": "3523c1f0396249bc3eae97f15141921108214e4fdce50f153272c79c91d3e737",
"armv7-unknown-linux-musleabihf-0.7.22": "b96ec5d9be9527fe3a4e6642e26489cd1b12a8cbd3f2b80145bd61bd4919e188",
"i686-pc-windows-msvc-0.7.22": "aca18c571d8bd6d370e0440a16544afde421ea01585721a46d3847c11404fb41",
"i686-unknown-linux-gnu-0.7.22": "ea5f6c1460843bd1c391e06d731278707806666438a9389f957e604f60be3eca",
"i686-unknown-linux-musl-0.7.22": "e20e7eceb3100bc93ed638d723a5b4f9985dd2650398b3f10b175a93e744c7b7",
"powerpc64-unknown-linux-gnu-0.7.22": "7e7281c99a62a729483ea0268511bf9416a97f6256cc9123d7910b42d7c27937",
"powerpc64le-unknown-linux-gnu-0.7.22": "0891f6f9fb7099cf35cc6bf4d3e565504ce793466d0a592056703518cb771dcf",
"riscv64gc-unknown-linux-gnu-0.7.22": "8bf7e0bff7f1cfa2c8057405c2f5a377c7b864a83dfff8ce045f5773374f7add",
"s390x-unknown-linux-gnu-0.7.22": "d7aba1fe8783e39f5f05061fc255a28d98eff0b83600915b606903ee1764b674",
"x86_64-apple-darwin-0.7.22": "af8fb83280a000f5864653ca0c9a1f69bbdbc8b2bbfeb2e1d450ce7fd1518ff1",
"x86_64-pc-windows-msvc-0.7.22": "ce5c13291643e8306e8d2dbcaf340d36ea985a761a53f2ca0a45e1a8e8936c85",
"x86_64-unknown-linux-gnu-0.7.22": "8379e040fa1828e662968edaa3856aaeb6e1a0a0ec76ef8583096be1f72f19d4",
"x86_64-unknown-linux-musl-0.7.22": "0508e73f28fa4024c76c4e0a5e347fea6aeb4bead0234618e6cfb76804237259",
"aarch64-apple-darwin-0.7.21": "c73af7a4e0bcea9b5b593a0c7e5c025ee78d8be3f7cd60bfeadc8614a16c92ef",
"aarch64-pc-windows-msvc-0.7.21": "877454562ba2af12a020652fb8f63d14b6c05aa6d1d3497441822c6c0b198541",
"aarch64-unknown-linux-gnu-0.7.21": "1dae18211605b9d00767d913da5108aea50200a88372bf8a2e1f56abdbe509f0",
"aarch64-unknown-linux-musl-0.7.21": "6577895c91a6bf6c1fda5f0fdfd07f8ee05f75f24a70a49193f8fb8dcde81fc3",
"arm-unknown-linux-musleabihf-0.7.21": "cb175698eeb3abf77c00c4d19e9c5e10ed847f6988769f5b18a5c98c1ebd21ad",
"armv7-unknown-linux-gnueabihf-0.7.21": "9c64218ebc2f96520105fddf3b500026a50d9319c7faf4d2221a7113efd96fd7",
"armv7-unknown-linux-musleabihf-0.7.21": "9f83f0c4821e572e9289e270e64429495b188e372519ee88524e97b50943e657",
"i686-pc-windows-msvc-0.7.21": "aaf3f3bc934616214e1f33ccb22432dc59110211b2b15636d66e8e42e9cf2f6f",
"i686-unknown-linux-gnu-0.7.21": "141a4ecfe0bf08e82fe5834a0fd265cf3c27833c1bfbab69344efb1604c2d964",
"i686-unknown-linux-musl-0.7.21": "ae1faeda2475f0df8733215133771da58de159d9e7b5a728f30047708e21a724",
"powerpc64-unknown-linux-gnu-0.7.21": "bef76b3992d21682dfc82e096d18f449d43a757f28a00a62eb7e05002349f287",
"powerpc64le-unknown-linux-gnu-0.7.21": "107c6c5a444c27bf772b1ec233b5b83dffd79348488cccc832dc9c14ee5ddf56",
"riscv64gc-unknown-linux-gnu-0.7.21": "c5c160e64809ae29404354e555df7264763f7cf67012ffc1350619cc9d19299b",
"s390x-unknown-linux-gnu-0.7.21": "77f3472201867a766e6f2a37ceb2e2f2f78343d3460c2313e3643483c80ecf92",
"x86_64-apple-darwin-0.7.21": "f8a9b4f4a80a44653344d36b53e148134176e8f7cc99f8e823676a57c884595e",
"x86_64-pc-windows-msvc-0.7.21": "7a4e427ceaf3c7d8437e512cbc25af84796c4079cf842c3349d4b646a9209da5",
"x86_64-unknown-linux-gnu-0.7.21": "ca3e8898adfce5fcc891d393a079013fa4bd0d9636cef11aded8a7485bcba312",
"x86_64-unknown-linux-musl-0.7.21": "7400debadcd63e530cf58c3cfc71d43d5a1017d2f699be86c6e91d7dc2073c7c",
"aarch64-apple-darwin-0.7.20": "69da236af5934209a5c059fff1b2f69068918c423601f42448b1d92336853127",
"aarch64-pc-windows-msvc-0.7.20": "34f3720cdd736f034f3b0d1b03d6b74b85d3528ccefd3552b3aadf455f191b2f",
"aarch64-unknown-linux-gnu-0.7.20": "675165f879d6833aa313ecb25ac44781e131933a984727e180b3218d2cd6c1e9",
"aarch64-unknown-linux-musl-0.7.20": "0f68f4a4583923635e56f7f930526bbbcc14d090f1c1a7ec1d28cc4ddad05279",
"arm-unknown-linux-musleabihf-0.7.20": "9d3eb7fd1e3580a40e5d3f25db5d8a0719fb77be1d750b4849f6dbc96885e39f",
"armv7-unknown-linux-gnueabihf-0.7.20": "775c3634a1ed7f0c23e5ce8e418acdb394fe87df1ac21af9f274e1e68df0d9b4",
"armv7-unknown-linux-musleabihf-0.7.20": "27ac3e7f44c1af5bb9f01560e1848893e09c502a85552521cc9cf0d2cd4322c5",
"i686-pc-windows-msvc-0.7.20": "90367e9f5adc46d6effd2b2107bee5f900f959c64898ae3ffb1e28b9519b15e5",
"i686-unknown-linux-gnu-0.7.20": "9b53f988b7024728da39fc3e4217bf8cf233d1aa7afda20599dc3acb2049f328",
"i686-unknown-linux-musl-0.7.20": "fa3091a175cdba4202367b30bda899bc3ed3b6c2161b7c42500c3bd1b388c3e2",
"powerpc64-unknown-linux-gnu-0.7.20": "84b76581c50071a87609d340050b2cd0ba7fad7e929106202d4c99f4c5a41243",
"powerpc64le-unknown-linux-gnu-0.7.20": "25082231ee1b479cc9fc486949e3196affda09b82bf0c6b3c8eacde37f56e9db",
"riscv64gc-unknown-linux-gnu-0.7.20": "339015c2c934b93355a972c737f649fdf96abb699bebbc1b0955de9e5fff04bb",
"s390x-unknown-linux-gnu-0.7.20": "16819d631e56438ea2e58b60bfb99feb8b2b8cdbec73e375e21c6dbe1de8c725",
"x86_64-apple-darwin-0.7.20": "0c0edf17aff045bcb9bf89ffa43fefaec2d6585ff69debdb0ade62608f8ff069",
"x86_64-pc-windows-msvc-0.7.20": "ddf35e258c32971c00f3f4213cf1b5cf0847a42dac578738cb294d379e4a9f6c",
"x86_64-unknown-linux-gnu-0.7.20": "10f204426ff188925d22a53c1d0310d190a8d4d24513712e1b8e2ca9873f0666",
"x86_64-unknown-linux-musl-0.7.20": "c8efa6bacde9154aa705feb35985cbc852d75c7d634e8a6867aa2f5571b27a62",
"aarch64-apple-darwin-0.7.19": "698d24883fd441960fb4bc153b7030b89517a295502017ff3fdbba2fb0a0aa67",
"aarch64-pc-windows-msvc-0.7.19": "c843b95d9bad3e364ead2af00b793d42156cb4f8ac0c2e33bfd2b3e50a0efc86",
"aarch64-unknown-linux-gnu-0.7.19": "31b81b4b4ecd51ee4202f1e710fc22b72666f716ffbb825aa397c8246624d60f",
"aarch64-unknown-linux-musl-0.7.19": "e83c7c6d86c8e7456078c736a72550ce20222df8083f9317fc58cd49422ce5eb",
"arm-unknown-linux-musleabihf-0.7.19": "fe9834d5383feccd095cbfdbc290d7379f64bafc894ae8d8eb0724edfa754853",
"armv7-unknown-linux-gnueabihf-0.7.19": "6678e4d1a91349dacd3405b0efa88656d1c8a16fa7ccea822c368039988f8339",
"armv7-unknown-linux-musleabihf-0.7.19": "3022a75e757a31978e896e2e3fc2cf2dc966267a8757a270be0b421f541467e4",
"i686-pc-windows-msvc-0.7.19": "063829d117c2e42322b0e3a59ee91020dcb1d95522889b903ffad392df197a11",
"i686-unknown-linux-gnu-0.7.19": "1785537fc65a35609dc33063b5f1cc85437a08ade4c0a832071c018481afe515",
"i686-unknown-linux-musl-0.7.19": "e64bc4f74cee116694ea63ad0722245f62f386de271be1a1c28a6e4fd977326e",
"powerpc64-unknown-linux-gnu-0.7.19": "fb8a4a0d20dd3e236a88229e15af89fa3144bd06c4087dbfc7ba8ca691b0a953",
"powerpc64le-unknown-linux-gnu-0.7.19": "b335d0593c165fbfcc51915b3eb056f45c5691d06744a5ded7210d789469870a",
"riscv64gc-unknown-linux-gnu-0.7.19": "36ccef1387594e8fb212257fbeafa9e260709b363e1b262f43bd5a679134e4ac",
"s390x-unknown-linux-gnu-0.7.19": "08ac0245d24ba16bbf224b00e8bc8021d081f9dcfdc61881cb6e4ac83954705a",
"x86_64-apple-darwin-0.7.19": "40667bcb615b5af3e373ad611c4a9b95639b97e19b5924a436df8e69ca9331e2",
"x86_64-pc-windows-msvc-0.7.19": "3098b38638b271d8b14b81247d6d69bb105807ec9fc5eb85f8cc8b6de5867c86",
"x86_64-unknown-linux-gnu-0.7.19": "5ad6f11d5a04cb3af2418666031f20b63190f82032ec5a7f3a174385cc5567e4",
"x86_64-unknown-linux-musl-0.7.19": "6236ed00a7442ab2c0f56f807d5a3331f3fb5c7640a357482fbc8492682641b2",
"aarch64-apple-darwin-0.7.18": "c33cfaab95da1413a0403f643b7edb1c5af6798d8a2370196a80fc37b894df48",
"aarch64-pc-windows-msvc-0.7.18": "c9c78de380e459f8424f648d107d4ab5286273ab19622a5d17796dc6689de453",
"aarch64-unknown-linux-gnu-0.7.18": "2af8d0d963f547deba09c52aca79a26113f0ed5c903c101241fedcac90c2d8f4",
"aarch64-unknown-linux-musl-0.7.18": "32872da98e5c48945e45406d427b3b4fdc11f04e4b8f297f49f76724894eb61b",
"arm-unknown-linux-musleabihf-0.7.18": "c6c9e718aee25142139b25bf6bb5f9566c57812abced3efa71b4677ac3ef1275",
"armv7-unknown-linux-gnueabihf-0.7.18": "00cdc4c898a251ea0c12f5db7b22929ff6f73f87a51fc6f874dfb57aecdcc995",
"armv7-unknown-linux-musleabihf-0.7.18": "92a07d26943b5e223e941b64fa22e048c13fb6462ccb35f18fe2e212cfdc1c18",
"i686-pc-windows-msvc-0.7.18": "4293c65f1fce52bd5396ec4419ce1c76412e276e0f292ec2464c319b7f8d59be",
"i686-unknown-linux-gnu-0.7.18": "e5db36cb7b7edbe405c70211802ffe3b161983027f7644ca9ddc9ed5605dd504",
"i686-unknown-linux-musl-0.7.18": "5829e240206ca895f8e500e9432dd87553091459a80d2a40c0d144688d443336",
"powerpc64-unknown-linux-gnu-0.7.18": "927af365bc8388da27d241149a52ee3b9772db87ebace6fec6b00062aedd4a24",
"powerpc64le-unknown-linux-gnu-0.7.18": "dc7ca0bca11efd40a4f85c40e2d83d830dacb7b0f9626bc40360a6697aa035e6",
"riscv64gc-unknown-linux-gnu-0.7.18": "2cd75769322d264151e9abc2cf89edd086239afa00c0a1354d52a700657f7deb",
"s390x-unknown-linux-gnu-0.7.18": "bc63ad2eefe5278b121a78255e8c488eb69ae29784b69012439ef365701393db",
"x86_64-apple-darwin-0.7.18": "7a4a3350224a3a3904589ea306041af68686d72ec4d4b68e34c15d25dfc5cb4a",
"x86_64-pc-windows-msvc-0.7.18": "5a5b3ef7c6aee0bb1101ef047f35a0fc7cc82e34eef3286e54c5badd261cb599",
"x86_64-unknown-linux-gnu-0.7.18": "bcb8093f59eb08539087faf895ea1e794fe3db395de79eb41ddaa41d8c25adf7",
"x86_64-unknown-linux-musl-0.7.18": "c8b51ed978b5f95a7c34dfe39e1dce966f7497fc12179f27507d507d9f3ff40b",
"aarch64-apple-darwin-0.7.17": "0777e13ba598ccb9a9f78df209c98922b219a195765b9f1b309457a08cbae43d",
"aarch64-pc-windows-msvc-0.7.17": "be0e7263e4106ca73ac72b4f84ae1c203db446d42d764b2b6459bf1d84aa1859",
"aarch64-unknown-linux-gnu-0.7.17": "b88fda8f37769d445dd4b433c83490112afa18fc009b75e3cb28412a1d189c53",
"aarch64-unknown-linux-musl-0.7.17": "789f3749497181311fbc27d2da322f4f836d814389901e8a7917ee664f500a6b",
"arm-unknown-linux-musleabihf-0.7.17": "7f39a83f2cd7925aa25020dce70f9d2617213b710aec1c9fd686c3314ee814a2",
"armv7-unknown-linux-gnueabihf-0.7.17": "9a4ee0fe51b07b8badf7ca874b3a065a0d2cf3b04c69aa2c7618c03d6ddd46ce",
"armv7-unknown-linux-musleabihf-0.7.17": "6a5d3fa02a7bb5696ac392d6277f29174f27bc38e0100016ee67c55c8a472e3b",
"i686-pc-windows-msvc-0.7.17": "45ffa8cd52e6a0764c2bde7c97be840b6c7606f976e6ae51bab394a891653f52",
"i686-unknown-linux-gnu-0.7.17": "043897d13541c11c1221761c768d4234b889ce1fa39f1f27a567e11ca2c86233",
"i686-unknown-linux-musl-0.7.17": "0d7a846ff1ae9d620243da530adcc468bba4aa317cb3ba4210c724e2ec5734b4",
"powerpc64-unknown-linux-gnu-0.7.17": "46331c3771dbc8aaaa4c75421b6195edb763bac5ca4b8d551efd2da013351252",
"powerpc64le-unknown-linux-gnu-0.7.17": "9f7e13304c7f3977c2e1eaa068a6beb36e6974a2abcf8cb1b8e0d8b96c251203",
"riscv64gc-unknown-linux-gnu-0.7.17": "789fea86b495397c7bd12c92221259f07c78ba738d568757b06500ac94b6ebe8",
"s390x-unknown-linux-gnu-0.7.17": "208c6609012ca921aa3ca67d49dde34464e405041b1d8b041c15078687456570",
"x86_64-apple-darwin-0.7.17": "c0aff6481443e7dc38c01dfb3535814db42c00ad3ab374e7b4ed4ebb7f5b2237",
"x86_64-pc-windows-msvc-0.7.17": "b49d1a02662ac4a490c886fff8a340a4adc32da8d0634fc653a69459d2b5f863",
"x86_64-unknown-linux-gnu-0.7.17": "e9bf64a66a318a82d3c37a74c31527df0ac7e7c821a10f5e1032415f000d7d43",
"x86_64-unknown-linux-musl-0.7.17": "ffd877241741df0a6436ba6ed0d8cd6573f1f922ede3a967c32c57d2133c72b0",
"aarch64-apple-darwin-0.7.16": "a157919a2a615fac5de0fcef5120a63de7e6582fb6e0ae4428238af347ed1054",
"aarch64-pc-windows-msvc-0.7.16": "a832dd02c44cd8d373b226ca34128982aca5303dd3b477c90c5a1f83efa874b0",
"aarch64-unknown-linux-gnu-0.7.16": "4ff5b8542514b453073cad1dfba08db751ada21981b869c69a2ac29fd639b586",
"aarch64-unknown-linux-musl-0.7.16": "c1536a85aa85cae05c51d25b2819c5b9869f67c66c65948aadeb0c38c4bd51b3",
"arm-unknown-linux-musleabihf-0.7.16": "20902d98f9a309df2a83ffd31ecfda444dfb75249c2779eedaeed7d73274f34b",
"armv7-unknown-linux-gnueabihf-0.7.16": "72afc7e60eff20a1c2181f88c9d96e06553f854192b3a13069aba0f8b045a839",
"armv7-unknown-linux-musleabihf-0.7.16": "c0b5300958a489330a9790b701f1491a1bec72e402281cdaf6a2362b51fa4c13",
"i686-pc-windows-msvc-0.7.16": "6d4c4de0cc8c88fb7d94138c05091dac6746a7bc9d94b3743e804a485546154b",
"i686-unknown-linux-gnu-0.7.16": "ee03aaf5d736524a8b6e74c273d5877be1bb720933cb8f7f5e70b42c70933418",
"i686-unknown-linux-musl-0.7.16": "b815f060a689e0fe95ec36498533bb261b92dab5cdb60b02cc19fa30c6cd7e57",
"powerpc64-unknown-linux-gnu-0.7.16": "a2b78151e50646b26cacef24de87d625d4b100efe69347c88a8a6d340b0e82cb",
"powerpc64le-unknown-linux-gnu-0.7.16": "c231b3880c6584b6fe411b0c7507ed0c091856a64f84720b732ddd39b21b7e6c",
"riscv64gc-unknown-linux-gnu-0.7.16": "6be4c3e27989ffd49befc689884b78b55c53c817a27040b8e232edd92185b037",
"s390x-unknown-linux-gnu-0.7.16": "f4e1814f2326db1eb0d0d2ea96ee36c361a856e8c9d8d82817936aad9baa4299",
"x86_64-apple-darwin-0.7.16": "414cb3c348b0482bc88fdabbc267973a11401e684a78fd471b2c4553fa8b6965",
"x86_64-pc-windows-msvc-0.7.16": "409d19c14a9b1ce83bf7331dbda89984802efb3a2fbf9ffdf149b22ab9cf2826",
"x86_64-unknown-linux-gnu-0.7.16": "c51f5dc9fd33e789992839d2957d6cfe0b6dce1cd7ec641740af456b12e9d468",
"x86_64-unknown-linux-musl-0.7.16": "34c9da84a673e6c06d2e081d72d953f278fe5bb6aba0437210ba62817b340eb7",
"aarch64-apple-darwin-0.7.15": "7a20f3d33cbbc75683d66e0562d4bdbd702ca656d7dc1b7be3c592de6a6517b9",
"aarch64-pc-windows-msvc-0.7.15": "d15770be109fdde45c60a522fcc97bf19e0d9d9de8a0d2f0dadc772786110123",
"aarch64-unknown-linux-gnu-0.7.15": "a8241809c6efcf5ff649d259276dabd297a2c46e9e2f78891a1f9b8ae858e1e8",
"aarch64-unknown-linux-musl-0.7.15": "4351c1e2ec13f5eb4da058ac1c39f00ae3042de9d6fdb6480e0170f32813210f",
"arm-unknown-linux-musleabihf-0.7.15": "26c7f1baf3f14857d8d5d2df86ea47a3ce5a0e6223c1db9af2a32bb3d216d5f1",
"armv7-unknown-linux-gnueabihf-0.7.15": "6609e0f39c958a2b728ffec99ed53741cee92d5db168fb275448216a9e2f5a63",
"armv7-unknown-linux-musleabihf-0.7.15": "3a60e3bfc6b927537eff1c6fdb359bdfb5a02a59820bb964e04144d731b12ca9",
"i686-pc-windows-msvc-0.7.15": "831ac11382c9ae014f6f5d27506c8977bfba5aa6b104e278d3a87ff4d1e311d3",
"i686-unknown-linux-gnu-0.7.15": "8d11cd225843aa7e7b25a5300721d48519a13bc82fc8b7bf63b063b8520b2db6",
"i686-unknown-linux-musl-0.7.15": "8640a014e5ef7020b33a8e95fabd5e0c75adf80beeaf265ed50dfe2bee92aeb2",
"powerpc64-unknown-linux-gnu-0.7.15": "6a4c0fe1075c4f3b9dfb8d0654a58ca547aaa84f829bc9e1b60a096153d18686",
"powerpc64le-unknown-linux-gnu-0.7.15": "81f6d18b857cc3517f249fd7e321b9cad6e6c17bc7d7ad88cefc0c25cca3e486",
"riscv64gc-unknown-linux-gnu-0.7.15": "6a0a6ef8fa3d03b6a6cab9185cd84e28c78db1e5736efa711e6f5efa4e6c27e3",
"s390x-unknown-linux-gnu-0.7.15": "d5a2343934c7fec124fb0a140b12c4dd30e20c5473e67b11d064f5b6e52eead0",
"x86_64-apple-darwin-0.7.15": "4c7c1fe116566b6f8725a3801a33fa5e066b8687643acd73249e5db1351c2103",
"x86_64-pc-windows-msvc-0.7.15": "b78c2d265e74b21b1c04b5b4ffd61c5c7b8110f9188e24949ee9f6fd5fbaf0a8",
"x86_64-unknown-linux-gnu-0.7.15": "b1dc0892749e93382decbd894755be0ba1535587f0bb8333572b072d1b0f652a",
"x86_64-unknown-linux-musl-0.7.15": "c97afc120614c88bd8c13dac2d35015bc59656289633d61bc438e7e680a38710",
"aarch64-apple-darwin-0.7.14": "7cb9cb6b3005a16356493887d7e7e297237b754b5753b91e826ada98ab2da172",
"aarch64-pc-windows-msvc-0.7.14": "f28f27e529e30e96e7b289b724c8229cfc5ca25312c23bdae089d6998ffd0aae",
"aarch64-unknown-linux-gnu-0.7.14": "c0932f428d24d87aaad6a6b7ad48aa09f260d2da5c69e877acd87c3ac90fbbad",
"aarch64-unknown-linux-musl-0.7.14": "30e41b1f68b3e57c1375c0b2e7fe932a9eb5487fbcef7c4c7d03def3e05b9f7e",
"arm-unknown-linux-musleabihf-0.7.14": "3b494d3d6a892d9c03d1fa6dcec8ac6077653939a6645570ab6f1f40adbd0b3c",
"armv7-unknown-linux-gnueabihf-0.7.14": "d5d1f6c49559914678267ce9f3a57528ab45e26e907a816736306b4f10a7b4b8",
"armv7-unknown-linux-musleabihf-0.7.14": "0016d3138edc52de9f2f4b0587afb6b579dc3bb3abfe2df151f97cc43a4ab421",
"i686-pc-windows-msvc-0.7.14": "42391f3a71229342b17d944e956d116aabc5147b0ed28a26c59601feac1f24cd",
"i686-unknown-linux-gnu-0.7.14": "71c358c315da7ddd2de334fe52a54719f9bdac8d6970e7966e2d080ae73ad028",
"i686-unknown-linux-musl-0.7.14": "d02de9391fe7b7d7e97dc2fa63a539201a31eb51d2c6a87b7570cf8a5ac22398",
"powerpc64-unknown-linux-gnu-0.7.14": "a2a43332f860520f7cd3d32f5a4ed5e0d938cc59e025372f8f1bfe47ea64355a",
"powerpc64le-unknown-linux-gnu-0.7.14": "3c545528b601a75baad5e1cc93cbf973123e9e6df6d905b432d91ba9ca769c0b",
"riscv64gc-unknown-linux-gnu-0.7.14": "4085fd8d4acb0a50a012fa63ae37e50472bf8742d58f4943529b5b5bda95a1a9",
"s390x-unknown-linux-gnu-0.7.14": "b20a69092f3171dd99445fe0d71e3ed3e67ff85346cb0723a43a1b8d55ce0f33",
"x86_64-apple-darwin-0.7.14": "352a56bb3823040f19f936dd5e277340cd304da03e5b00c0959800a72a9f55ac",
"x86_64-pc-windows-msvc-0.7.14": "f9ac952c69d32b2263ba19ba93d18d9e708dcb9bddb8124555bbda96d6d5168f",
"x86_64-unknown-linux-gnu-0.7.14": "2b38641d02bf107c5099f09778fda93bbaa4a4a2ee44ba303a4097102254e5e5",
"x86_64-unknown-linux-musl-0.7.14": "8c62a823744630e6cf3fdf0bf38c4fe4558bfcbe082b076a76446a3aab2af5f5",
"aarch64-apple-darwin-0.7.13": "721f532b73171586574298d4311a91d5ea2c802ef4db3ebafc434239330090c6",
"aarch64-pc-windows-msvc-0.7.13": "bb40708ad549ad6a12209cb139dd751bf0ede41deb679ce7513ce197bd9ef234",
"aarch64-unknown-linux-gnu-0.7.13": "0b2ad9fe4295881615295add8cc5daa02549d29cc9a61f0578e397efcf12f08f",
"aarch64-unknown-linux-musl-0.7.13": "52baba71881c978d32b7c32216ad0cde4546a4dc62e606c9834ec4616c1610eb",
"arm-unknown-linux-musleabihf-0.7.13": "ff2b11fff489301f9d55c851b9ebce7ca5530d743d2c0a3861cc45896715ea9b",
"armv7-unknown-linux-gnueabihf-0.7.13": "903350811ee31b2b758c8afb853490c27a34382a535b236739705b104bc13894",
"armv7-unknown-linux-musleabihf-0.7.13": "7e3b2aa966c54ced0fcd9febea6b913ee7ea12ee85246513895f199ab13296a8",
"i686-pc-windows-msvc-0.7.13": "5cf71014fde208ee0833026b3828007f8eaf514ec003784dc1ae92633877179b",
"i686-unknown-linux-gnu-0.7.13": "ff031258ff08b3aca46648398e21fe9679744501e3c9a928c8e42d596a708bbc",
"i686-unknown-linux-musl-0.7.13": "41851d695bb5401bce5af81a156d63215087cf8e8e1275e69dd96de4bfa30c26",
"powerpc64-unknown-linux-gnu-0.7.13": "02a80ce1436bf673b0d7276bb24dea0bbc70958dc91e5fb04ad37ac515be7424",
"powerpc64le-unknown-linux-gnu-0.7.13": "60c8907cce089de97dcce732ae363eda0620f7196c25e8bd539f168b93f9e34c",
"riscv64gc-unknown-linux-gnu-0.7.13": "521a5235bc5a053dd7f0221c363544cef6d033064cc9d92dbb4ef19771000052",
"s390x-unknown-linux-gnu-0.7.13": "41e4b6093dd408b41dffb4c9e08c4aa31424ee4573ce9c95566c2617f7f2d0c6",
"x86_64-apple-darwin-0.7.13": "d785753ac092e25316180626aa691c5dfe1fb075290457ba4fdb72c7c5661321",
"x86_64-pc-windows-msvc-0.7.13": "e199b10bef1a7cc540014483e7f60f825a174988f41020e9d2a6b01bd60f0669",
"x86_64-unknown-linux-gnu-0.7.13": "909278eb197c5ed0e9b5f16317d1255270d1f9ea4196e7179ce934d48c4c2545",
"x86_64-unknown-linux-musl-0.7.13": "560bb64e060354e45138d7dd47c8dd48a4f7a349af5520d29cd3c704e79f286c",
"aarch64-apple-darwin-0.7.12": "189108cd026c25d40fb086eaaf320aac52c3f7aab63e185bac51305a1576fc7e",
"aarch64-pc-windows-msvc-0.7.12": "fbedfb71356d0e63c86b507cf1434a58406afe6eac77aee9d37b8282d4006e14",
"aarch64-unknown-linux-gnu-0.7.12": "23233d2e950ed8187858350da5c6803b14cbbeaef780382093bb2f2bc4ba1200",
"aarch64-unknown-linux-musl-0.7.12": "0589f6d27bbbe2e205aa6fc25e4cd28ab97e984cdba20842de8d3a00714e13e9",
"arm-unknown-linux-musleabihf-0.7.12": "6996e32ac1c37af33a4c6e40ab0126a82d62ccb94edb164b7dae554be4dd8336",
"armv7-unknown-linux-gnueabihf-0.7.12": "aee2dc202deed7e15984d71eb59803111052fbe8c0fb3ffad27ae0a6d290d74f",
"armv7-unknown-linux-musleabihf-0.7.12": "87bd7676d31858d9e1937ab69d13e30cc93ebb09fb246dde6a8f183e9570a82c",
"i686-pc-windows-msvc-0.7.12": "c7ec71ba64d01ef3cdb89553445de94ab4fd7375c8f2a7068353aec7a3a06342",
"i686-unknown-linux-gnu-0.7.12": "d1def68ff10b30327a5cacab497664aaf8338e192ba277b76f45dad63208f2e2",
"i686-unknown-linux-musl-0.7.12": "f56a0a9c84b35b7e910c4d628c667b843fb3fa1d9dddb0bbf4bf3f21eeaee07f",
"powerpc64-unknown-linux-gnu-0.7.12": "6eafb546d1b8642a5c27e4dfda213659fee41b0fd150b4c33ef96c917e595344",
"powerpc64le-unknown-linux-gnu-0.7.12": "0d550348d7a0f54352824cd751dc7baea0c23b17d744a5a7784b6b825e5fc909",
"s390x-unknown-linux-gnu-0.7.12": "76f5a2c1c13446233312d140136f3f55fa7c162176327830eb109ccaae6c9cea",
"x86_64-apple-darwin-0.7.12": "a338354420dba089218c05d4d585e4bcf174a65fe53260592b2af19ceec85835",
"x86_64-pc-windows-msvc-0.7.12": "2cf29c8ffaa2549aa0f86927b2510008e8ca3dcd2100277d86faf437382a371b",
"x86_64-unknown-linux-gnu-0.7.12": "735891fb553d0be129f3aa39dc8e9c4c49aaa76ec17f7dfb6a732e79a714873a",
"x86_64-unknown-linux-musl-0.7.12": "bb493f1e6ae426c06b5a103cb71aa60c678976d2377f0590644538658656c2a7",
"aarch64-apple-darwin-0.7.11": "b5f4cb27a3002d6590c3681377c6d826db0b52e2a9529c7144fcd53fec89ba79",
"aarch64-pc-windows-msvc-0.7.11": "856bac93344a6980b2703a4143f26fc042c941b02f11ed21f55ec6be3fdfde87",
"aarch64-unknown-linux-gnu-0.7.11": "80cf695c4e10b532e9db3c7fbbcfb0f8356f2e70e7a4a5040e005f0fae70923d",
"aarch64-unknown-linux-musl-0.7.11": "2ad20d143c74d7f63d1c99db3999f239f045b7be041e23f6ac8b269c99fa54fe",
"arm-unknown-linux-musleabihf-0.7.11": "21fec46f09d96cd9f51378fe01ed050dd2032c1fef823f8bd81fa50a2337bbcc",
"armv7-unknown-linux-gnueabihf-0.7.11": "1a75aaff4695c07151d5b9abb50232ea9fb6f5ccc82d4b319abd8796605d9db8",
"armv7-unknown-linux-musleabihf-0.7.11": "431b3115ab8fb5e2210d01f29b7901e6eb1174ff65545ec49318d6d4adf4c802",
"i686-pc-windows-msvc-0.7.11": "985f5eabf42b8ad0166ae6b9f799564220fa932938a8401c890d5e07321ce7c0",
"i686-unknown-linux-gnu-0.7.11": "619e205d56594fc530dbde6c6a543dd094c796791a5e2cfcd3bb70fa5767bf9d",
"i686-unknown-linux-musl-0.7.11": "838c6336ba8e88818459b10c3520e83601b9c0a9850a209accef9782c050faad",
"powerpc64-unknown-linux-gnu-0.7.11": "769c7f32cbc2ad918ccf9ae661d99a6c0d0fd3a0056691832b4a79049a9d06ec",
"powerpc64le-unknown-linux-gnu-0.7.11": "c9bbbcc2d4f11c83e0edbff5868d95f07f81455adb6f2f909cdb9b992928101b",
"s390x-unknown-linux-gnu-0.7.11": "0e7b9b27e9fef1b42aa052173a2a47a2ec33bad82425237dfac402b7f69bd073",
"x86_64-apple-darwin-0.7.11": "97980b067dc3fea16534371b030eaf38554d701de5058004edcfd542a88a2e84",
"x86_64-pc-windows-msvc-0.7.11": "0f4ef69fde75bb8bcfba7ecf0a4134d8875578cd2e98c9fcfc21573e746c70ac",
"x86_64-unknown-linux-gnu-0.7.11": "df54b274e99b7ef26030dc21d105ce115bc21a644fc6a321bde9222cb1616de6",
"x86_64-unknown-linux-musl-0.7.11": "e4e8948645ebea1950a3c77574ce079dfe1c71547ba5a8a141d6e362fa036684",
"aarch64-apple-darwin-0.7.10": "316b80c19832ff4085748c3a20a3e05f36e1d19234e8b9399a6fd1c971241bce",
"aarch64-pc-windows-msvc-0.7.10": "1eed0f11bca79403648195f8ce257763d956e861cb73de98c480dae15358bb26",
"aarch64-unknown-linux-gnu-0.7.10": "8746acb754807050124c6dbcb05fcad2665a3f0cdb2a0fe9de528bd37b092656",
"aarch64-unknown-linux-musl-0.7.10": "f9000f08850a5c575d5fe1ddc2ec928ecc9f287ecdcd9fa1ea4e3f405b23d4a3",
"arm-unknown-linux-musleabihf-0.7.10": "657b1b8a534f7fe78e63aff56aac5bbcb21f6254df79825fe204d5c7c1219653",
"armv7-unknown-linux-gnueabihf-0.7.10": "1cf4a8f40abbd802a7b44fe9695da356701100d267eb3567c17db27e0a24cf69",
"armv7-unknown-linux-musleabihf-0.7.10": "5282b825f469295dc2b88c94eccd375a93135a279b0711cb10e615e7a71a0617",
"i686-pc-windows-msvc-0.7.10": "f3c62ff935685d9d4312b82d01ed386493b97c3d22bd434d943fc99ce9aef83a",
"i686-unknown-linux-gnu-0.7.10": "24a2a3eb0e89b74de6aac492516303747519439775d22254e838d33410ac27b2",
"i686-unknown-linux-musl-0.7.10": "e317d35af60b38ad32935390a83d12adc3ed7ffdbc2ccccd3039bf6cef650eb3",
"powerpc64-unknown-linux-gnu-0.7.10": "c1ab41ec53cd720179f3351b61b4ded73ec520804413b75051736829a125e4fe",
"powerpc64le-unknown-linux-gnu-0.7.10": "ce2c3fdf177facf6c77c5316bb54b9deaf498bee9f664e01a4030ecf27063ab1",
"s390x-unknown-linux-gnu-0.7.10": "b7603e3f4494e9093a86ace1103e3fcfa172a952989f0c7dca6eeac7f77be81f",
"x86_64-apple-darwin-0.7.10": "9123e8aa944654404787f80731ec08850c4e9b9129c0d0445c9e41438828b8b8",
"x86_64-pc-windows-msvc-0.7.10": "1568a71af55e9d9bc4a050ec79134a342a8a3765a73f6b7ec26490c2814f8797",
"x86_64-unknown-linux-gnu-0.7.10": "ff2ef46298963fee8104ccb3c0a4ecbc97c057ac6a0bc5fec7636c855384252e",
"x86_64-unknown-linux-musl-0.7.10": "b2cf1f63e83a873652ffef032681bbbe1469e3bab617f7e715e09529c30f5689",
"aarch64-apple-darwin-0.7.9": "7a8b716a2b5905fb89512371ce6c6dbc0dd0344185bd1cd93a3fe27516eef7ec",
"aarch64-pc-windows-msvc-0.7.9": "63c0990b9c49dc9f9a92aaaa27ba627cbf9cf6b2e42766588ef6f880208893de",
"aarch64-unknown-linux-gnu-0.7.9": "23242a8051e2191ed8d61f71a6792f2fc069ef18e6cdf07dedac3d3f648643c5",
"aarch64-unknown-linux-musl-0.7.9": "60f30508c9002b2b7af55d70db2741cf7ea24c066ced710ad09681a6d2d19b3a",
"arm-unknown-linux-musleabihf-0.7.9": "57d8e43e257f0ccd9df2b8581338c5145b9937aba53e9c9bb81b31044b720c61",
"armv7-unknown-linux-gnueabihf-0.7.9": "83353ee7e1724083ea94d7f488fa34c9159995a3996f87017fdf72e422c93242",
"armv7-unknown-linux-musleabihf-0.7.9": "b2d8d81bc2abbdd857bad7cd3bf0d36c5155c0681aae8ac9fb8f49d54b95b3f2",
"i686-pc-windows-msvc-0.7.9": "b5dc0dc10d9dd0dcf5729a94e98538418760d13877d4d4b1bc4efa9926280e78",
"i686-unknown-linux-gnu-0.7.9": "fb8f1a7cb593c819c0fff71afa2dc480237ca80a3f5d8d433c8b51d2ae90ffdf",
"i686-unknown-linux-musl-0.7.9": "a77592be13fea81ca42b2b7815784e769e1fd9ff476cfab69f2652823f99c55e",
"powerpc64-unknown-linux-gnu-0.7.9": "26fee4867c158c04dd3a51ff9a23b4220a9ba69fae2e71be618d2cfa48164d96",
"powerpc64le-unknown-linux-gnu-0.7.9": "d588fbb01cacccb7fd6e0f101d34282ebb0569381f967d332f8072055e39840e",
"s390x-unknown-linux-gnu-0.7.9": "d823d68ff662b7e59c6791281427bf1019dae791a964ffae31ae1d2d723dfc08",
"x86_64-apple-darwin-0.7.9": "a4c084568850588b77e4a34c21b7df5c8cf9e2160b4d614307ed92fa12411742",
"x86_64-pc-windows-msvc-0.7.9": "f91d8a3322a10caf257fd416807bd8d2801285b80b46ee37f2d0c6e426b8822c",
"x86_64-unknown-linux-gnu-0.7.9": "b8450a419c0bcc85841bbed8511eb59e2a5683ddd3f813f2b98b97babf6b1b8b",
"x86_64-unknown-linux-musl-0.7.9": "95918a1e1faf851a39cad402f1a77318e8fc90b7f829833ebaff27de9722d60e",
"aarch64-apple-darwin-0.7.8": "ad6b3825ba277de70b9d0a37055f7d828f3f37416aee1cde65000f330efd4587",
"aarch64-pc-windows-msvc-0.7.8": "e43448e5e3267dffb6bbdc30ffa291f8db664d1da9d084c44f99dc568f459e0a",
"aarch64-unknown-linux-gnu-0.7.8": "da9e1c97f1452b25c8955127c92da7b68be228ad0b43bf50bba4dadb25c8b337",
"aarch64-unknown-linux-musl-0.7.8": "4d18efb46f93fa942dc4c212dea3b6b07e3db62fe57d0c3d08de6bf5d9f9bb51",
"arm-unknown-linux-musleabihf-0.7.8": "133b1c3fb850ec496bfb4ef84379bfaeff1d2c322114a0984d8a5c2e10e63028",
"armv7-unknown-linux-gnueabihf-0.7.8": "7d61c6e18e81447482dc80c090c65a6615a1232512899943566baf2808ca37bb",
"armv7-unknown-linux-musleabihf-0.7.8": "0b6d6afcdb7c78e5df42cb2ab0929d2bec2654a350a8efacc6f95e830a31eb6e",
"i686-pc-windows-msvc-0.7.8": "0d4b01372ca972543cd40366bb5480bb457e79dcf45b5f662721d709d6932dbd",
"i686-unknown-linux-gnu-0.7.8": "db1c60961aea7a7f8c64a098801e0138e761b7556d1c1691fc4f3f771f0e47ae",
"i686-unknown-linux-musl-0.7.8": "b765eb1817bc1d545f4860eff0adeb0c7907ea66be14536653192e588386b308",
"powerpc64-unknown-linux-gnu-0.7.8": "2c894b104195ab194af05c6ad756ce8746a349a8620c83888207db5fccf29a8f",
"powerpc64le-unknown-linux-gnu-0.7.8": "4b0d93385685f756068f76af1871dcb7cc8f427ab6d650afc07493d06dca71db",
"s390x-unknown-linux-gnu-0.7.8": "e58fc9f6d846ccbf50d9bcf27920ff4bc061541df8a6a3aa6f13be24981e0772",
"x86_64-apple-darwin-0.7.8": "f046249639014eb70b43cbaf83eb6f56aac724ada354f9b9aad65f9960737920",
"x86_64-pc-windows-msvc-0.7.8": "355736ddf9a01ab9da918b35470027c12128d7ed1d7f54f54771507d79529679",
"x86_64-unknown-linux-gnu-0.7.8": "285981409c746508c1fd125f66a1ea654e487bf1e4d9f45371a062338f788adb",
"x86_64-unknown-linux-musl-0.7.8": "8a707e45e0d1a8bdbc5bd1af0ae7d19ffab55f3722c5e73471039561900e3d48",
"aarch64-apple-darwin-0.7.7": "6a06eaa8165d5abd89c3dc37ffbe1db60fcf49a87d7c612bfca7e87a1514695d",
"aarch64-pc-windows-msvc-0.7.7": "e86cd59f2569f4bf475e5ad944910142c0ab107ad12613429ad8873a6f41087f",
"aarch64-unknown-linux-gnu-0.7.7": "013061d4d33385e9a3fc52df18d22334f20f12616970b0d81583d5125ce8d6fa",
"aarch64-unknown-linux-musl-0.7.7": "4014dc9dc024bb5a082f16c54adcd5936d47dae664bafa38453b3017ede41aab",
"arm-unknown-linux-musleabihf-0.7.7": "c1dc010e3ab855391f3a6906fcffbeac873d136df2b20cfd998105385444e45c",
"armv7-unknown-linux-gnueabihf-0.7.7": "e08406cfcc1ccc0c069d22c91008967f662664abdbf8a15779a1944070e0f5b2",
"armv7-unknown-linux-musleabihf-0.7.7": "35379428e6d001e63714449c26c9111d1d5ee6f3b6a95559c724ad57df9d8d17",
"i686-pc-windows-msvc-0.7.7": "5e47a44df7707b58884cdf5d30527857ec1bf186e8f200517fd11a572669cacc",
"i686-unknown-linux-gnu-0.7.7": "fc782a829cccb0201c4a918d9f5a3a114511d734953f7e5e60aed52951264454",
"i686-unknown-linux-musl-0.7.7": "10b852326ee48502d6da26c7fe394345b7ce7ca94d76f293dbe4cde9577c3993",
"powerpc64-unknown-linux-gnu-0.7.7": "4b26663e0c21289bd21c05a3ba344e6b069c600e5a6333e660ae16eb38027bd5",
"powerpc64le-unknown-linux-gnu-0.7.7": "e691d6a8a8c285cd644cf1f6d47c2568740ddca645c860f9bb23799790b54e56",
"s390x-unknown-linux-gnu-0.7.7": "b21953a1c6c5475306e64f9ccf721762d2fc6aa572ee5268ed61a3b1531f06c1",
"x86_64-apple-darwin-0.7.7": "4b337495ced2a9797357ee853873c2f5a45cc52f6ed68c9feba3c997443452b0",
"x86_64-pc-windows-msvc-0.7.7": "a27a1fdf3f6b850dfb45fb009f7ea0fe3db1a59f692ebdc64c24ff8dbd0467d1",
"x86_64-unknown-linux-gnu-0.7.7": "d83e2b9c2b251c93985824d9a12d97f5b036b7a9ff0b7d647c9ca7ae5ff2ae1b",
"x86_64-unknown-linux-musl-0.7.7": "3876cafbb6599287a78778d2c265fd2050acfc247409ed677a8583f20385a3ae",
"aarch64-apple-darwin-0.7.6": "a0e7c0e44ec4b2743e1c1d1f6edca1418687b05084f48c007c6e1c7d3a35bcd2",
"aarch64-pc-windows-msvc-0.7.6": "2ada1290e87144726b6a723b38fd34ce64da5a3fe820a21685564924f894408c",
"aarch64-unknown-linux-gnu-0.7.6": "4eae30038653bbec528257054fe07495f20c5d4bc663b630258e87d159e282b6",
"aarch64-unknown-linux-musl-0.7.6": "9e59f0753383d6a27404be238360165e415605b1504b209349852a27cc01d48f",
"arm-unknown-linux-musleabihf-0.7.6": "b81d59deeba1f92aba48aefce2b364530baa1cb8aa4c59fc2a90c9acf98c9a20",
"armv7-unknown-linux-gnueabihf-0.7.6": "e9d1b7d52def14fb1ab8af2fa52963ff8e4323934ec2e78720a94d92261fa9fc",
"armv7-unknown-linux-musleabihf-0.7.6": "c525ad0f41c67d944e56362adffcda206aef36f3ed84daf90386fcbfa4a62c66",
"i686-pc-windows-msvc-0.7.6": "aca45dbdb75cd2c5fdf70bf5ff436306d476352b135fcab544c4a9759d7d1af8",
"i686-unknown-linux-gnu-0.7.6": "71448fddb93306b1b67f0c2e711eb79b6ea33d027212259abd7546a48d15b49f",
"i686-unknown-linux-musl-0.7.6": "a641ada8b2ca3ec22c24414c2edef8c01370d7d4ac79998eac091b84f743c476",
"powerpc64-unknown-linux-gnu-0.7.6": "9f63727933d11b0157ebc3fd640811c1224fe55215acff24e8ec5747fb4f90fc",
"powerpc64le-unknown-linux-gnu-0.7.6": "da746e6e809f32ab9709e45c7d5e7c37901478cc610119c08ae335c43ac089b2",
"s390x-unknown-linux-gnu-0.7.6": "a07d4303e97f72312f9db8a1a67bae08f02d883f1879fa917b9ae87aec90d933",
"x86_64-apple-darwin-0.7.6": "718cfd68b13a1a642fadc53646742785cd33b2e06124a01454ad358617841852",
"x86_64-pc-windows-msvc-0.7.6": "4c81818cc89d75ca54762e2641deebad69c0af6594212a9fb24b9849df8ac413",
"x86_64-unknown-linux-gnu-0.7.6": "0c5f0935bba35359150774fc5876d72947b863b8173c94dda776e6d88014a0df",
"x86_64-unknown-linux-musl-0.7.6": "be755e8503b7e7174f24ad8cdcadab94f0662fe0b60df4fc35e1ddae48b19f35",
"aarch64-apple-darwin-0.7.5": "8d82c7f6fcfd79b142c8845f694c8225dd5b401cd720e8e1e2a35a1c4150f516",
"aarch64-pc-windows-msvc-0.7.5": "9ec005bf0b472d47ab730e463cc5a156b18ca9a9a6fe1c72bf18d97384d0b717",
"aarch64-unknown-linux-gnu-0.7.5": "715bd03f6b2924b8f742b716d0f4b9d31ccbb1ad4a7f8df4ce2f572efff7f2cb",
"aarch64-unknown-linux-musl-0.7.5": "ce23f5e1d22f1cdfc0db4358d3b2642c115ad99d404aef15030af31e39ef3484",
"arm-unknown-linux-musleabihf-0.7.5": "2e85c3ba3ba461822940bca197198babcb1a8ce620c3d1c624423e68bba49d43",
"armv7-unknown-linux-gnueabihf-0.7.5": "cbd7990fb0d06750f7e966a54dc344396e4d605d029aa94a0cf00d695cb283e9",
"armv7-unknown-linux-musleabihf-0.7.5": "96d5eb1246e654f4e2c37542797196d94c0d72fe44e470050a9fbf67e356fb10",
"i686-pc-windows-msvc-0.7.5": "84e70b46e0f218db9573b0efce085c13e0e5ce7808b3143b990d1a334e5a8ee6",
"i686-unknown-linux-gnu-0.7.5": "20efc06bc129d8757e81fdd00cf828a9c1d928a4a30c8c538c6d1ed219b52c5d",
"i686-unknown-linux-musl-0.7.5": "3cc8dbcdb230a6abbaa3cd6b918d6150f747f45f8f96b7399d6258c54fab5867",
"powerpc64-unknown-linux-gnu-0.7.5": "dab5571d40ce3347fe295b9afec9f560ad709461883ae604d0de827071b8d2f8",
"powerpc64le-unknown-linux-gnu-0.7.5": "4c3843068cd0e1bf9e5f68e5487fba28feef3196c025a1b1eaddd533a52b7bd7",
"s390x-unknown-linux-gnu-0.7.5": "1b286e386a4d66dd9393caf78888a881cf63202522a6a88262e551bc7b8b3995",
"x86_64-apple-darwin-0.7.5": "751ae339c91a6b8eddb868a64222c2533c722042476e4f28466683ddf96fa488",
"x86_64-pc-windows-msvc-0.7.5": "e95cb3789b2f80052c80048ff2865e06eae7512d06d304127898c70c4fd3564f",
"x86_64-unknown-linux-gnu-0.7.5": "a3d1964080a855e1f8806975b5fa943376045a64852c06ba80540813aa333305",
"x86_64-unknown-linux-musl-0.7.5": "be058167ae65f7a2b56f607b070bd4e93dacd09be52511ccb8ebb10fa132709f",
"aarch64-apple-darwin-0.7.4": "1af8c353479890b29b75933706890627555bbc07e12a0117ae62da3ec2ee372e",
"aarch64-pc-windows-msvc-0.7.4": "3800868f3cc1509d6ea16036e3268ff45fd22a85c922cf3de4fb9535dbb0099e",
"aarch64-unknown-linux-gnu-0.7.4": "c407e4c7431ee6cb28deb842edb49fea1ee3f5674a357f11244bfb0fd57e2ae4",
"aarch64-unknown-linux-musl-0.7.4": "ff0d9172d2105da526501e01c38ecf0558ea323cfcd25adff9a89cd7fad5c076",
"arm-unknown-linux-musleabihf-0.7.4": "4e6b7d15444ae58bc196ee4e7e6e11b451b4e994c0c73968254d3d4ff1c89bca",
"armv7-unknown-linux-gnueabihf-0.7.4": "303bac0f866c450fefe7543297fa87563941f924cb13f007dfe7cc02ac64dcd7",
"armv7-unknown-linux-musleabihf-0.7.4": "004e22fe946fabec6b5dff668f4bd8f93569dab30efe0f3d4640f266760744bd",
"i686-pc-windows-msvc-0.7.4": "113070d23ba1498cf9fff9ae634893a2a1dce42a0baa617c4a82009f61c71fbc",
"i686-unknown-linux-gnu-0.7.4": "19f0f19dfe9d722a2fb89bde4771682cf632182d6204cc4ddb11d700d5b34c07",
"i686-unknown-linux-musl-0.7.4": "fe281041401b4140a387f6101e64fcf4abb344791c12398c441c7e339510423d",
"powerpc64-unknown-linux-gnu-0.7.4": "ef2320254e52234750d9745e6dc6e3b3c990aa51e506057d0869d4d18b55e5e3",
"powerpc64le-unknown-linux-gnu-0.7.4": "e143278764aab89b68c6f55dfdfa4242c8f5d5213880b584880a776a5ca1b0dd",
"s390x-unknown-linux-gnu-0.7.4": "14dbae76be8999dcc8336fac1f6f86710e7ce4f4c3e1aec01e7ef7f9a3468811",
"x86_64-apple-darwin-0.7.4": "a6c5fd8aa67db03447934b14703a2d7bb04b5e5f7ff45630a749760393c5610f",
"x86_64-pc-windows-msvc-0.7.4": "966d0dd8d86f02f94128714180cd5ff42cd2ea9b33b86fc197f25cfa066aaea1",
"x86_64-unknown-linux-gnu-0.7.4": "5264d9b2bf021fccbaf6edb97bc17ce4863687745f2443460a8ca71e55891614",
"x86_64-unknown-linux-musl-0.7.4": "70083140d9efaf82cbb7ffa6231d5de3536d6497ec84d708afaf9b7e2fffbac2",
"aarch64-apple-darwin-0.7.3": "162b328fc63e0075d4267688201de91356e1c1b81db50419fa4466cfe2dfdebc",
"aarch64-pc-windows-msvc-0.7.3": "542b318c98b0295dd3d620fbcd63388757f382e14c69c569cb3ce793aa75c975",
"aarch64-unknown-linux-gnu-0.7.3": "2c2be8bbb83e9bc722f2013de8bb7506cfe6521d0e30b4ad046849d036b3eea6",
"aarch64-unknown-linux-musl-0.7.3": "a3f01c3c993b57fa8d13855c5ba60e3847bda4f8e795a52d52879e242e886604",
"arm-unknown-linux-musleabihf-0.7.3": "87f72dc1c3b1b598e08c8efc7f9ab8eca23df8549cf4c1fc27a4a6b2524809c1",
"armv7-unknown-linux-gnueabihf-0.7.3": "69f285d861cd1809a4bad0f08c2ea8a77ec17cbe20524a4ebbee4c5a7c868520",
"armv7-unknown-linux-musleabihf-0.7.3": "1a0071551cd575bbecef3218fb13bf05ab96ceb71b4b1d13a99b8a4af059f99f",
"i686-pc-windows-msvc-0.7.3": "1c9becbc63c15dcf43b09c0ba84e0ba6fa533fa799b7baf57a36363ef42fbc52",
"i686-unknown-linux-gnu-0.7.3": "a2b56cb262337380aa02b6d131e973d54090c3e655d3e55385d02850454c24de",
"i686-unknown-linux-musl-0.7.3": "d6e846079ef38929206079147448c5683a3018116b2b3e6059cf4c26bcfbb290",
"powerpc64-unknown-linux-gnu-0.7.3": "a9b94c618a5d5bc992102733a45759e38db9a9e069830c3e94c744d1bfc33c21",
"powerpc64le-unknown-linux-gnu-0.7.3": "782e9c343cb7c219b5514e64a799a8b9fa82585f6176b53ed095dc030a22d993",
"s390x-unknown-linux-gnu-0.7.3": "ea803eafd6e3414d3a18aed9257f8ded8f7d1f6f182d2572969c4c487faa1986",
"x86_64-apple-darwin-0.7.3": "d676940b51bdd5606b218bc2965fed67731f94ad07926045716acbf78626e09b",
"x86_64-pc-windows-msvc-0.7.3": "20d3a420abbf2af9699cd9a02225d9325344046af8deb15563cc451e3c4fd059",
"x86_64-unknown-linux-gnu-0.7.3": "17fc118ba4d7e9303f84fcabdc0a593fc3480ba76eb6980668fdbbb96fe88562",
"x86_64-unknown-linux-musl-0.7.3": "325143825b88e7b0dadd1a8e8d3cbe4791d3cbbb9e2244350d917803fec8b3d1",
"aarch64-apple-darwin-0.7.2": "8edc0bea8a9e35409f970b352036326393e79a6039577d8cc9ef63872c178a99",
"aarch64-pc-windows-msvc-0.7.2": "a3d7affcd62e617bd2dd2a91fde679dd8d68a84762c8f3aaac294606ec14ffe5",
"aarch64-unknown-linux-gnu-0.7.2": "2872fdf4785666575d129ba90590c44e6508e22584735f3e7e8a30d773dfc3db",
"aarch64-unknown-linux-musl-0.7.2": "d5b31df40da794dab943c55e67d14fc111146e185b14a6de6eb749ee264a641c",
"arm-unknown-linux-musleabihf-0.7.2": "fd203cef8c6cd775c2a5f7da31f69a72020a6c74b6fb808db3217ab04b70a038",
"armv7-unknown-linux-gnueabihf-0.7.2": "b69999c29c759f5a47f71c1f328d6e7c489229efa5ce0e84afce026201730abb",
"armv7-unknown-linux-musleabihf-0.7.2": "f98a827e198de2d0a7224ecad87eb64c18c9c0ed4f0c768456e9b48482015d2f",
"i686-pc-windows-msvc-0.7.2": "8b06489b2cc8814fc23dae4562c5e7d500e782c2b0d2556529f515a4d1e0b8e3",
"i686-unknown-linux-gnu-0.7.2": "36f26a496c6dc53703e070761ef96f07acc88eae868f94c4665f5c17a88d8acf",
"i686-unknown-linux-musl-0.7.2": "763bf7cd2119c40858cbd0892fd9b2c7102c79e5c590800b2f8e9c2f427cb7d1",
"powerpc64-unknown-linux-gnu-0.7.2": "bd4a42ed0b9ab725f0cb565ae29c338ea6ce0689ddb35da632535a47c891e72f",
"powerpc64le-unknown-linux-gnu-0.7.2": "9a598869167b7e56ab971614972a2c486c8137681210094009a6fb61ac36699b",
"s390x-unknown-linux-gnu-0.7.2": "7dd2240d60b1628869a2348ca0901cceee572bc20116ab04f9484ea0b6d40813",
"x86_64-apple-darwin-0.7.2": "7d30b59d54900c97c492f3c07ff21cc3387a9e5bd8ca6db2d502462eaaeefd68",
"x86_64-pc-windows-msvc-0.7.2": "35fd793df52fd13773425c9a97cc94cc13c8ee63abec6380b5083c183c688019",
"x86_64-unknown-linux-gnu-0.7.2": "cfaab1b5166a6439ff66f020333d3a12bbdf622deee3b510718283e8f06c9de7",
"x86_64-unknown-linux-musl-0.7.2": "dd10babf6c531597d246c97e55e32ca17b44fe251405fe539ec8ea2f22fac2d6",
"aarch64-apple-darwin-0.7.1": "236d70d7738a5f41b45253d68665fda039fecee579939921e0795680d300f55f",
"aarch64-pc-windows-msvc-0.7.1": "5fdbc703e6f22696ac053811e9750ff3cf50814aabf1792b9bc49f2647b836c6",
"aarch64-unknown-linux-gnu-0.7.1": "ee8a98f485a22837be9e95eb55e4cd06db6c8deba94b6a2dd63d828fb5ef4226",
"aarch64-unknown-linux-musl-0.7.1": "b65409802669913f5fd49ed6656d45c434aa9273fb864aefa0fbbb685b9834b6",
"arm-unknown-linux-musleabihf-0.7.1": "96cfceb7716a9003750111c7f1a62aebccf02e0288f95bc670c69062d2ec6e61",
"armv7-unknown-linux-gnueabihf-0.7.1": "f156bdedd8a969dc49a5e01f6b38c7e50a63cf69acf3b5982adfaf232dfcb80f",
"armv7-unknown-linux-musleabihf-0.7.1": "ae21a9c0b413976a24c51f095603294ca36da9089813022cb9bae0b84f0be6de",
"i686-pc-windows-msvc-0.7.1": "38a98c532e463169e8c4f1ae3649dd500c168f6db687e3b29570930c55ffedf7",
"i686-unknown-linux-gnu-0.7.1": "133a41ae763d8474cc4ff8e0c24ab8cdaf422f261cbcc284f4b90b57aa60f3fe",
"i686-unknown-linux-musl-0.7.1": "6e55fea1ee9a8c5c1d29b3aeb033a8b01d3895a347b27ee108ba94c53d60cfb7",
"powerpc64-unknown-linux-gnu-0.7.1": "cd6714a55577d6eb0ecad313646a4ade3c7a4407e1a2a4703a2fbb83c88681d5",
"powerpc64le-unknown-linux-gnu-0.7.1": "a354eda3a43323cf5445cfdf0197ebd4b36e967df9537e97910c47dcd9321aaa",
"s390x-unknown-linux-gnu-0.7.1": "59d194c544a8a53186c3da6ac26f90ab0f453fae71fd2e0d4d177a8ed8890abb",
"x86_64-apple-darwin-0.7.1": "a81e655cc0b6a5ccf9197f2dc0df513171e68804e498c17076d6e56b41234c5d",
"x86_64-pc-windows-msvc-0.7.1": "b4d48072e384014ecd04ec5c544aee523ead1faaebcd428ba5f6abf2836096df",
"x86_64-unknown-linux-gnu-0.7.1": "cec71afc57276b1857970d6ec96e110989c3e4ed0d81f0c4c11c1231970b7e56",
"x86_64-unknown-linux-musl-0.7.1": "9b714ddf470795d5f1aa5c8111ea153139ae202216ffbe4105fb92f202e0b02b",
"aarch64-apple-darwin-0.7.0": "964ebe641b563920e0650a60bf5ac21e6c8c56557704e5ecfaaad7ff62c3a73c",
"aarch64-pc-windows-msvc-0.7.0": "c00950aa4b243e1043d1ec651fdfd71e5f4e5b80135b30fcf3b70fc201aeb1c4",
"aarch64-unknown-linux-gnu-0.7.0": "540fcb8f2f972c82260a8063a6a4b496d7ff858edc42aa0e2c733a7b55ef8dd8",
"aarch64-unknown-linux-musl-0.7.0": "f6367e288617021aba6176945ba20a7f8ea3b22a5f8896314a7d0acb863b533e",
"arm-unknown-linux-musleabihf-0.7.0": "6fc85b25a4b3cb27b924e1f3181f96197667b7465fe52bf703afb5539d09c09c",
"armv7-unknown-linux-gnueabihf-0.7.0": "035b46fde90a7ee4b48292ff9d116cc771b10d9e955d1979b1a1cd6b3998f602",
"armv7-unknown-linux-musleabihf-0.7.0": "5f43390685fbb9f29d6075df1d492f9bf39cabb868bf37e0da3cd925c679b068",
"i686-pc-windows-msvc-0.7.0": "f045db339b2acecc790d2071598275086978a99262d9c4b0c52189c26cba68a9",
"i686-unknown-linux-gnu-0.7.0": "9936acd12616548a04ce6875aa125ea34f3b288181f2188bfb72d914965680be",
"i686-unknown-linux-musl-0.7.0": "bfad15225152d9fa8769731b35dd53e0b39cba045900b6d43f90e655652af5b8",
"powerpc64-unknown-linux-gnu-0.7.0": "91cfac9b5a9ba844c3ba90944e00bfb79da2983b7c6306bdb054c75ab3fea0fe",
"powerpc64le-unknown-linux-gnu-0.7.0": "d690793c993a1a03049b7e7f3f0e41c94ba2c45b0155bdde917d550ecd4ee02d",
"s390x-unknown-linux-gnu-0.7.0": "429ffee0dddd8c0c59e246fb89bef721d1ed22a4c051925d7dfafcfc7dce464f",
"x86_64-apple-darwin-0.7.0": "dc5037f3ffbf8074b3ee63de7a73aa57421b0da0837a478e26317424dbab16f3",
"x86_64-pc-windows-msvc-0.7.0": "62836c9d6e3f346d06c45fee4109be21ca9d1df8d087472dcc8d51815f182332",
"x86_64-unknown-linux-gnu-0.7.0": "ca1e8196672bf04ccb926519f2071208a8d6c0ce02fb65bc7d0a85be1b684b0f",
"x86_64-unknown-linux-musl-0.7.0": "08e1bb8fdea2c6d5edbe40ab1651de097b884020056c0925a9973582ff669d04",
"aarch64-apple-darwin-0.6.17": "e686c73b9314c77a36a6a4c9f94b07c001f0c9157c50c63c764941141c0d0088",
"aarch64-pc-windows-msvc-0.6.17": "3a9468e90df970f75759da6caed7dfde2816e0f3842031235c3835fc0c4e7d09",
"aarch64-unknown-linux-gnu-0.6.17": "6fb716c36e8ca9cf98b7cb347b0ced41679145837eb22890ee5fa9d8b68ce9f5",
"aarch64-unknown-linux-musl-0.6.17": "98750f5c0cd9eb520799d10649efb18441b616150f07e6c1125f616a3fd137e8",
"arm-unknown-linux-musleabihf-0.6.17": "649d8d0f37e8365af5aaa012b09dd083d6e71018e569a4d2e78316d5013f18a7",
"armv7-unknown-linux-gnueabihf-0.6.17": "efc12955d7a6120ea0be2de5ee03dbb33d0d7d9de9dbe0dce560514f2ee129d3",
"armv7-unknown-linux-musleabihf-0.6.17": "0661d97df8262ef83ccdc6a55ed101abfe8f1cf1ff1be879d9b0d7d1e894c970",
"i686-pc-windows-msvc-0.6.17": "56dea6c98e1606e95445e77177d7e3cd49bb3d1a63c81b11fe49bf733adb62a2",
"i686-unknown-linux-gnu-0.6.17": "4bc37f8303a4a5aae1c309f08166884027f325b6872c418cfbaa2cf20a2b2ac5",
"i686-unknown-linux-musl-0.6.17": "8ec08cca0806a9205ccf5758258c617b57e413b33275bcd861fca363e0eaddf7",
"powerpc64-unknown-linux-gnu-0.6.17": "d33b70ab206e1ed0663e755506a11db3776787012bfe9d2b2138a90942f506be",
"powerpc64le-unknown-linux-gnu-0.6.17": "cd91a579850fc45d3b786a654a2c0343836f007929b2e35de9606082eec5361f",
"s390x-unknown-linux-gnu-0.6.17": "3c753a9d3485bbac23403a0b41a9e70ceeb586f3b4df891ced7ed27d4c6c542b",
"x86_64-apple-darwin-0.6.17": "61e9bdc02aacdb994da6ea2a477b11b34c23fc09203237aeee8d3817daab012d",
"x86_64-pc-windows-msvc-0.6.17": "32882cf98f646cafca003e7a7c471b7ff4ba977b681c9fa3b12cf908ba64af82",
"x86_64-unknown-linux-gnu-0.6.17": "720ec28f7a94aa8cd91d3d57dec1434d64b9ae13d1dd6a25f4c0cdb837ba9cf6",
"x86_64-unknown-linux-musl-0.6.17": "28bd6b50be068cc09d8a46b76f8c4b72271d471c6673a5bdb47793622e62224d",
"aarch64-apple-darwin-0.6.16": "2b1ea0d5cf27375738f5f0f229587bc3590c0f501cb00bc48133a3d122d28364",
"aarch64-pc-windows-msvc-0.6.16": "5abca187b8aecbdffef7547cb39a527168e4cb93d8d2e4ce14271f5831a4d902",
"aarch64-unknown-linux-gnu-0.6.16": "a82f96ab5f285825f9acee6ac1563683c4940d80df2f08549cad43d37c7ba4a7",
"aarch64-unknown-linux-musl-0.6.16": "ae3f793c62fe6ced80483d6c78cb49f06a01088bc5d86f1446a9b5988b2acecc",
"arm-unknown-linux-musleabihf-0.6.16": "91f7f5a4eb97b7983a8e5421d5bfea8802064422ce2f535055f373726eb0aa9a",
"armv7-unknown-linux-gnueabihf-0.6.16": "a4ffe043952bf4e757a5ca0f546bb83b055b6ee0646dd5c4f5e5f13dbc5ee8f8",
"armv7-unknown-linux-musleabihf-0.6.16": "0237c8d9914e0d9fd2f022d6d5f91ce392d13e0ccbb7fa7ebe601296a67c3d6c",
"i686-pc-windows-msvc-0.6.16": "f5c6400f07db2014b2b0c66770e1125fa70efe4dd99cc8351838bed0045c34f8",
"i686-unknown-linux-gnu-0.6.16": "f46f89efcc599a6695e8378a1201e62cd4afb9a4438d65a89098ab11201f84ab",
"i686-unknown-linux-musl-0.6.16": "afe69380a9d3592a87893d6bdc11ff33e4180b98f1e1fd4e626c0307d7598914",
"powerpc64-unknown-linux-gnu-0.6.16": "bf455747580dbbf76cbcf616f67f825c40bd1bdec20c9ff993e03485f9eaad44",
"powerpc64le-unknown-linux-gnu-0.6.16": "508ec561b1740a551d2b33e96671e0e8435a1bcc0e97080f3d7ba88a096bd360",
"s390x-unknown-linux-gnu-0.6.16": "e25c5527826524f51f114388bff47871bf1ca67badbfd72d45427bdba4b46794",
"x86_64-apple-darwin-0.6.16": "ce512b5e40a8ad2916a46df2bdba729d5541e4b3649a09aaddff6e525be012e4",
"x86_64-pc-windows-msvc-0.6.16": "f1b4c24ec602b6c0b06b6bc64aa447bbe4cf313e93fbec326741961e80ffa8b7",
"x86_64-unknown-linux-gnu-0.6.16": "e9ef28b675df68978a60f87192fb8c730b8bfca9bef42b121686b218ea0f6542",
"x86_64-unknown-linux-musl-0.6.16": "25024557931d04cc34f80b818c7547c9c62b762ec6df807e30cb52f383fa2615",
"aarch64-apple-darwin-0.6.15": "1c5b25f75c6438b6910dbc4c6903debe53f31ee14aee55d02243dfe7bf7c9f72",
"aarch64-pc-windows-msvc-0.6.15": "317fe0b29e647aad1e9f02ffe764dcbbc6e2ef189f018c81b673884173ab98ba",
"aarch64-unknown-linux-gnu-0.6.15": "3bf650aec162157b7e01461f41c2a9797366b6043452c6e7035c6c926d0a585b",
"aarch64-unknown-linux-musl-0.6.15": "183cebae8c9d91bbd48219f9006a5c0c41c90a075d6724aec53a7ea0503c665a",
"arm-unknown-linux-musleabihf-0.6.15": "d83c76e130ffb25fb6a4ba8ea5870207d810190733a14ae87084c63a417912f6",
"armv7-unknown-linux-gnueabihf-0.6.15": "d661ec44e5fc7553cd8dd5ad5f48848c5a4d5279ba0df0036c0e2422ec9f312b",
"armv7-unknown-linux-musleabihf-0.6.15": "6fc86a829965362f99602c47627b269c9b676731586a60ca5bb9d6069677938d",
"i686-pc-windows-msvc-0.6.15": "7f15e3377e94fac882b33465cb8cbb24705f5c8d63d9d65c6f1b0816c1d30a0b",
"i686-unknown-linux-gnu-0.6.15": "bfedd03be9f579a9bc10e6c25176017e514cca0500cfb9bba43794387a577661",
"i686-unknown-linux-musl-0.6.15": "82bf8666c0a57514af4e5403f162314b710e1682e1065ab71a845ebb5d8db0b7",
"powerpc64-unknown-linux-gnu-0.6.15": "6e9795344d61ee9ac497d6e03a447d808f2aab13925f30e44c00638abec57deb",
"powerpc64le-unknown-linux-gnu-0.6.15": "e38f13284ed8b645b87ef07c8b549d1f1a5b746aa0411c2115dcd5cda0da13fc",
"s390x-unknown-linux-gnu-0.6.15": "416f61249b330ea9735cda0c866c9460f87111bc9d4e040c98916fda6a45be09",
"x86_64-apple-darwin-0.6.15": "97adf61511c0f6ea42c090443c38d8d71116b78ae626363f9f149924c91ae886",
"x86_64-pc-windows-msvc-0.6.15": "10c75d566db1447f3bdcbcb31d6598e4b5f4ea638be5d8b73a7350929389512b",
"x86_64-unknown-linux-gnu-0.6.15": "85d98ef282cdbfcb4020922f0c12421ecca4130f0a4570d3b827a15ffd544acc",
"x86_64-unknown-linux-musl-0.6.15": "78289c93836cb32b8b24e3216b5b316e7fdf483365de2fc571844d308387e8a4",
"aarch64-apple-darwin-0.6.14": "4ea4731010fbd1bc8e790e07f199f55a5c7c2c732e9b77f85e302b0bee61b756",
"aarch64-pc-windows-msvc-0.6.14": "7b0b3367c4060c9b47b961201ceb4252e97496c890ad1bd13c664bf5b0744d57",
"aarch64-unknown-linux-gnu-0.6.14": "ea25597354af186bdd55aee0de431e16d45d82951a4f41f065a8e4dc27885265",
"aarch64-unknown-linux-musl-0.6.14": "94e22c4be44d205def456427639ca5ca1c1a9e29acc31808a7b28fdd5dcf7f17",
"arm-unknown-linux-musleabihf-0.6.14": "de00f51ff804c145f9a0a13ead54e1ed08d317fac690477312cf9430ed43e62e",
"armv7-unknown-linux-gnueabihf-0.6.14": "d73b09f23c7056b3b5318edf670ebc8d2eac5adfdd4f4ee46796723298f21e18",
"armv7-unknown-linux-musleabihf-0.6.14": "f7844b89c77d1d57ca28a25b6b2e16a5bb3605ccf1dd9dc17ce641a2fa2d8b29",
"i686-pc-windows-msvc-0.6.14": "4e9f9ccc229a03d923213b8b4c7b373cd8bb941984f421de17fe9dac3d5491e9",
"i686-unknown-linux-gnu-0.6.14": "32c967c3dd80ecc9006a30be1a9c8ec77d63aa8080b78787d4ec0f79db12dbe4",
"i686-unknown-linux-musl-0.6.14": "c5a484d15049fd2b8ea9a7bbf0f968614819a7eda769f35c202e01e1904f6458",
"powerpc64-unknown-linux-gnu-0.6.14": "79abdc4c6e566e98067dc4b612f1fca5cb384b964553a0b8e0f5c40885ff3db8",
"powerpc64le-unknown-linux-gnu-0.6.14": "2eae20cf66ba5de1b7ac180458e4f2a889cd705637626e01c400f73f07dd0491",
"s390x-unknown-linux-gnu-0.6.14": "a51f8319b2b334c1392d3927e925b46c62ac584eb35b944d384f0af227cf0f36",
"x86_64-apple-darwin-0.6.14": "1d8ecb2eb3b68fb50e4249dc96ac9d2458dc24068848f04f4c5b42af2fd26552",
"x86_64-pc-windows-msvc-0.6.14": "93b29fc234758e381df461d7638ff73d0f08bdf3a0dc37923b1ee0b9e442ca3f",
"x86_64-unknown-linux-gnu-0.6.14": "0aaf451c391d3913823bfb8ed354b446dcfd0553a32ed8266611e4181c61fd51",
"x86_64-unknown-linux-musl-0.6.14": "0cac4df0cb3457b154f2039ae471e89cd4e15f3bd790bbb3cb0b8b40d940b93e",
"aarch64-apple-darwin-0.6.13": "0ddb8458634cc3a02799b6da839cb546dff9dabc6f3394912c48dd479016683b",
"aarch64-pc-windows-msvc-0.6.13": "3f3d6aa73b4859469fa3ad7efca3e5d0dba1112292c91d5c5f740983f16a8d8a",
"aarch64-unknown-linux-gnu-0.6.13": "ac0c723663ff76183077cc9aa91dcd0b5100081d87f93e1ba482930e0a584e90",
"aarch64-unknown-linux-musl-0.6.13": "379a5c48f6e3eb32c2d16022c0a4fc10cdfcca3543b75e2e9d819d62fead6a75",
"arm-unknown-linux-musleabihf-0.6.13": "ba1f630a299cfdd456b93a8b41e20bd2ad37a86aac884aca4efd722a62a26bb8",
"armv7-unknown-linux-gnueabihf-0.6.13": "1d55eb46510db8f169bb9be6fbd3a6ff34aa52340dff5eda0acdcb1b834e8bee",
"armv7-unknown-linux-musleabihf-0.6.13": "dc86e9d807ac324eed2e4a73fec341618ea288826a27143b8b695565a35f1b70",
"i686-pc-windows-msvc-0.6.13": "08367c3a04cf4da1c3ac6784431421de1efb8584ba68b8017efcd5e889d4a2a2",
"i686-unknown-linux-gnu-0.6.13": "2896a75940761a2ce90a8a650da02d6766de0b9990dfa6a99cd94fd3d1e6c530",
"i686-unknown-linux-musl-0.6.13": "29e64ef33ff2d7dcbbb3167bc7241de3b9d258fb39a6a992dfc847f1b968d32d",
"powerpc64-unknown-linux-gnu-0.6.13": "cdd2ba090ce9e3ed66a94bfe95b45a584bd5b9e45626836993f1279290b1a95e",
"powerpc64le-unknown-linux-gnu-0.6.13": "88830c596ef2a875a0c73aefda48e8398fdafe4eb4acecbee0b44a7995e9dc13",
"s390x-unknown-linux-gnu-0.6.13": "49e494038871006e36b404f0559f1c831b3e68692986b3c67510a675028c9696",
"x86_64-apple-darwin-0.6.13": "ed240854d97f7b234082f5a0ce734869a4310d86d46a819860bbce6d7df8b2eb",
"x86_64-pc-windows-msvc-0.6.13": "19bb08768fd3b8664068cc45faa633ee110bfef4215e560bc1e5833b1bc6c30e",
"x86_64-unknown-linux-gnu-0.6.13": "f6788fd45a25ea1033a671eaa9ece6c9b004ce5c9cf09552effadde567a7d7a5",
"x86_64-unknown-linux-musl-0.6.13": "779560faf6a21b5a6dbc2664c2dfbde2b9387b1f486c9197a9f4d143a3b66875",
"aarch64-apple-darwin-0.6.12": "fab8db5b62da1e945524b8d1a9d4946fcc6d9b77ec0cab423d953e82159967ac",
"aarch64-pc-windows-msvc-0.6.12": "d72d8cf0633dc40198a868e906442bc6bacfa38c3b807c26bcbf3fc364af5d96",
"aarch64-unknown-linux-gnu-0.6.12": "d867553e5ea19f9cea08e564179d909c69ecfce5e7e382099d1844dbf1c9878c",
"aarch64-unknown-linux-musl-0.6.12": "e999ae0679bfabe8a1e6343b8b204a531a6c851e315caff9b326f34182884af6",
"arm-unknown-linux-musleabihf-0.6.12": "da8d0700ec5e0cb0b2f20cc20834b48d5927197042e49bea5eef7fd139d72fe9",
"armv7-unknown-linux-gnueabihf-0.6.12": "b5dedaca5fbb46f412c5426102eec7c9f10003a67dd41b943232e4a2b6a5cc16",
"armv7-unknown-linux-musleabihf-0.6.12": "8fb6c1b16f8b3c2aa4073cd02729432f9afd9389f110850aed8228464fa37398",
"i686-pc-windows-msvc-0.6.12": "23431d1a798aee234bd7b271bce306fbd760c91d98e19a314ddd890a065aff83",
"i686-unknown-linux-gnu-0.6.12": "d0774e847de6c0fe6a9c3aba44b7d400261d01171ae32da60c472eb410691785",
"i686-unknown-linux-musl-0.6.12": "02e4503b244cbb18d2fa14b3a7e9433fe437e767ffcbfc39c5f0fdff9b8dd65e",
"powerpc64-unknown-linux-gnu-0.6.12": "046b43cf8af74d8892e9559e8b3181ec1e4045a4910a4dfdd00b110694c93188",
"powerpc64le-unknown-linux-gnu-0.6.12": "e61ba76fa6dfd6041c985881c024385c31d544d6a182d1a050da7594438f073f",
"s390x-unknown-linux-gnu-0.6.12": "6eae67730009eb4f8ad7a4e5733ab69b6c4dcb21b482f4567015e3e6d0729357",
"x86_64-apple-darwin-0.6.12": "5b6ee08766de11dc49ee9e292333e8b46ef2ceaaa3ebb0388467e114fca2ed8c",
"x86_64-pc-windows-msvc-0.6.12": "30fdf26c209f0cb7c97d3b08a26ab4e78ce5ae0e031b88798cbaccc0f24f452b",
"x86_64-unknown-linux-gnu-0.6.12": "eec3ccf53616e00905279a302bc043451bd96ca71a159a2ac3199452ac914c26",
"x86_64-unknown-linux-musl-0.6.12": "25f055a556576003fefc0f5fd213bf3c6df1824d4c7fc35e6361fbecc420139f",
"aarch64-apple-darwin-0.6.11": "a5b14a92448b908d1a5415f2a49522010fef8972695e2f7bbb4e5c5f88024573",
"aarch64-pc-windows-msvc-0.6.11": "858e523d9498a332aab093852c30c524bbd94622137dd6f773d19da14ac920b4",
"aarch64-unknown-linux-gnu-0.6.11": "5384098938893f060b8b47e606918c271a419b52eedda1546a4d6febae4b0c06",
"aarch64-unknown-linux-musl-0.6.11": "de20c247ef6a6bc0948e611ace3f3f321c098d7bf75b737f169c1db06b4f4d69",
"arm-unknown-linux-musleabihf-0.6.11": "76a1558e2cb8d0e5e646a0cf8a204b53d3779221bea3af50b204c8d28532daa7",
"armv7-unknown-linux-gnueabihf-0.6.11": "5abacc141dabb6071fcc3a19a301874083c6cc4a36d6eb6b0654a276efbfd33b",
"armv7-unknown-linux-musleabihf-0.6.11": "cf05ab1fe44494cc490ec5c29578e200a3c195b395e67fe62d45be9a4c897d06",
"i686-pc-windows-msvc-0.6.11": "331e94f1db12fa92266f764f63586d8c18e6cea5d37d430af2eb7673f108e874",
"i686-unknown-linux-gnu-0.6.11": "b9d193f28736c3166f533c61fc4a2e8e8a4c7961c6bd46e17c3db66f750ef4b6",
"i686-unknown-linux-musl-0.6.11": "dfa735baacc13ba9962fb9b7167599407aa733bfc7853824a785773769c58ed5",
"powerpc64-unknown-linux-gnu-0.6.11": "b79060dc0726a1fc8a4458a80fb1ce0489198dd3ad334fe54bb7926e473750ed",
"powerpc64le-unknown-linux-gnu-0.6.11": "ebd219d0b5f0a60a584ebb88e1379c616e746cabaaf79608d54be5919d742ee3",
"s390x-unknown-linux-gnu-0.6.11": "3b5563127303c16e0531c1fd13356763decc0ea91b860eb5f63c3108a275aa2c",
"x86_64-apple-darwin-0.6.11": "099b163ce5098558ccdc1df54bdcf8b02eb11364458095e95f8dd54ff8984d96",
"x86_64-pc-windows-msvc-0.6.11": "292ade13fc2e1530d0021ec7fd42526df58a8436974b8a5b829685db856e667e",
"x86_64-unknown-linux-gnu-0.6.11": "c19b3be7ac26f8b211f7a5f07f01a77fd4d2b6205ff257790770a585f7f5bda4",
"x86_64-unknown-linux-musl-0.6.11": "23aabfa5d0bde26d151eaf31a392595a5c88e74e0bc804351b02fbb0328f8aaa",
"aarch64-apple-darwin-0.6.10": "82bf2cb3b34ab504eb08486093c9e97cfaf5299da4d4a60e14b6642a2a2e9b8e",
"aarch64-pc-windows-msvc-0.6.10": "afc3c1ed78273843417b781fd30b263ba417dcfd05ef9a65be50eec7aa500f20",
"aarch64-unknown-linux-gnu-0.6.10": "527f0adc3bcf841a3a0df0d3fef8db277b8afffac588d80948638719b611a8c2",
"aarch64-unknown-linux-musl-0.6.10": "36c36aafdf4b2fb8040d0b8db2eaa4b3f44260a689a6e789bc1cd95689e890bc",
"arm-unknown-linux-musleabihf-0.6.10": "abef3136f0da26055368df298f3379bbd0d6776ba7e7a0c12275e403136408d8",
"armv7-unknown-linux-gnueabihf-0.6.10": "8b776d606b3b9566ae659ab8b2c767e771f1f3e2e632b4c634ff80b26796795f",
"armv7-unknown-linux-musleabihf-0.6.10": "d5af6869e1f69753e9ac2b8bacadd6356f84f373b0f6edfda60dc85c194d3a6b",
"i686-pc-windows-msvc-0.6.10": "ff6c580750d6bdbca1cb7c64601ebf0f079cc6d8ab79df6472e5fd61e4f89cf9",
"i686-unknown-linux-gnu-0.6.10": "978e8d7b495251d842250045a3f15c59e9fe148d09538aa322d4c045db632cc3",
"i686-unknown-linux-musl-0.6.10": "432c0609dec5d196f516639de8845fdf9393b4591978a927f6b2bfa92edd0220",
"powerpc64-unknown-linux-gnu-0.6.10": "ec4285062cc4bec8aa7f95efba227c4ee3301503938735902fdd896c3ef8ec7f",
"powerpc64le-unknown-linux-gnu-0.6.10": "d1dcbdd11b133bcce003aa48be6710a56f1c938eff496eb021dbeac8c09b5c2d",
"s390x-unknown-linux-gnu-0.6.10": "4a68f92213c567a8d2bc22ccc10a328f3dd851967f315c517fc1eb52c8f58ed5",
"x86_64-apple-darwin-0.6.10": "ddd27652b1a4053b848e35c348500841a8fde38e8ac2b37233464ab91e8f7788",
"x86_64-pc-windows-msvc-0.6.10": "c41c4f34782558d3263f7a51e4efd053bc4d074dc46fefa574c4fdb2ed0a00e1",
"x86_64-unknown-linux-gnu-0.6.10": "d58885f055fdb726d12cdd1cc54119432a0e4557c8e8ba04ca1d625058b98832",
"x86_64-unknown-linux-musl-0.6.10": "1bdeaa0396405a30c4bff35b2d7c9df832836da50eec132ccc0d92657a336c4c",
"aarch64-apple-darwin-0.6.9": "a6841484affb3c123313df98bcd8932208bdfb3d9d90a72aec274e8a696caa88",
"aarch64-pc-windows-msvc-0.6.9": "bdb7e5eebaa5bb807f2c665b909dbba4bce6f23adf774134924a4a3c6acd4e72",
"aarch64-unknown-linux-gnu-0.6.9": "f5032ad47151c7906c0fb25f7c3b00a85ab0bfed2170cbc444e79c438799095b",
"aarch64-unknown-linux-musl-0.6.9": "4de15999c38a0e57a3708eccb1fe3295b3d1c0c69410029b16e5e42452d232a9",
"arm-unknown-linux-musleabihf-0.6.9": "1a228a1cc86689894c771d0b4635b74708db416c240cfbdc36ddd87c90ae0eb0",
"armv7-unknown-linux-gnueabihf-0.6.9": "a9a307d6b3e6a3500aa0102ff7b03cccebe2a9af40130df97382688574afc637",
"armv7-unknown-linux-musleabihf-0.6.9": "2cf77dcd0e73b323c5f10120452f6ef34191cab3bb8061ee01d5e62706af7493",
"i686-pc-windows-msvc-0.6.9": "709d6d7e6d0e8244b4d51ac9ef0f373d2ac2cb20570e8bdf71c84ccab8c8cba0",
"i686-unknown-linux-gnu-0.6.9": "4000a6fd98af6ed84c9a7c2f06019cab5f4a8cfa4e5a9c37b6984e4c7cae1df2",
"i686-unknown-linux-musl-0.6.9": "d227586d574264922f344cf98b0f469335ce52d3443619d15448140b44ff8204",
"powerpc64-unknown-linux-gnu-0.6.9": "f12b8dbc8ed1ca24dfadbd3969730ab9c2cf797e117cdb508732f49b9fa4b620",
"powerpc64le-unknown-linux-gnu-0.6.9": "451cd936bd35405c1cf2d0b63c975d5490e2646f1516b9bcb27af66688946903",
"s390x-unknown-linux-gnu-0.6.9": "e25ec6762b68383abfbecb1ec24c1eda52a64dc67866021280c649ef3813726f",
"x86_64-apple-darwin-0.6.9": "96eb2bfbe2bb3b74836aa5d6f563ae21bbb9e071148adfda1e67000735a020a3",
"x86_64-pc-windows-msvc-0.6.9": "4d959abc2517c38b5527e3368b6755d66ecbb85679a9b2b34b7a78796c6cf7f8",
"x86_64-unknown-linux-gnu-0.6.9": "001b87a0c2ea642a3c75a98c6af3e8528aa473d560e653cf213efcc9aaa4a028",
"x86_64-unknown-linux-musl-0.6.9": "2b2914da53f9412a1aad7457cee424680da037e6a49c378365c3b5ff5ef0b926",
"aarch64-apple-darwin-0.6.8": "e4f83fc42d9735512198c2d86a6fc136e2f5a2b59b3ccc4f104018ed07465499",
"aarch64-pc-windows-msvc-0.6.8": "5619c7fbc026544c8cc77ade994ef79e799fc521a050268172aa47826f364834",
"aarch64-unknown-linux-gnu-0.6.8": "3ffcaa4f4dba917fa58484a1c3dcb96a958a4baca0204e9c10a4799f81b9ee2f",
"aarch64-unknown-linux-musl-0.6.8": "c1d4504ee47d8577761989c9daa4bbd1b93e5d04056215584a0415ad8738b0f9",
"arm-unknown-linux-musleabihf-0.6.8": "7280cb1425787faf335bed8e9f2d575bcb179e1b19489ee7984c546d6ef07fff",
"armv7-unknown-linux-gnueabihf-0.6.8": "6753d79f3f8e1556a855912f0f859b039b67e591332f6ee794e2c51f2eda1658",
"armv7-unknown-linux-musleabihf-0.6.8": "ba73e8503d3ded103cc1fd946bd307f5b986e096d673296eb616f2edb6cf23aa",
"i686-pc-windows-msvc-0.6.8": "c28ab471753368b79887fd5cbd12b002704fa7fb2e96b0f5a98277e4f1d8572a",
"i686-unknown-linux-gnu-0.6.8": "df60b14b5b6bf29c75c06d8d04b0dd358070bf91f19c6f23afaf738fd05fa271",
"i686-unknown-linux-musl-0.6.8": "b1e92aabb97fa356e8f0d4b61f698e0f372b6a5582df949ffbcc60565e7a9c7a",
"powerpc64-unknown-linux-gnu-0.6.8": "a18998d2f8f426b1ccf1f6c7ec279dd35ccc1cbe76d90b185e453e6b199df245",
"powerpc64le-unknown-linux-gnu-0.6.8": "0d7460fe945a7ed48a9236d50f683a5eb937f22eaa605f4e6eb6a5f9cdf3676e",
"s390x-unknown-linux-gnu-0.6.8": "127a7d547be5029b29532f937822332fed690e135d0a97ec9574d43904a4622a",
"x86_64-apple-darwin-0.6.8": "e069e79f6e0c430d7beaca3025b398980357b8b5c6faa7191032e20d5ee75970",
"x86_64-pc-windows-msvc-0.6.8": "d31c3d01ca3e1a75e15ed9514c135239770b6b40a99cae716661e28e433aa495",
"x86_64-unknown-linux-gnu-0.6.8": "2378ea0122bd56a11ee7ae2ad6116c1f22f4657c03b9efb78ac150236bf7974c",
"x86_64-unknown-linux-musl-0.6.8": "58902317e1872994b5e707c3c77f4cbf3010104d4b07990a5110bbc09f3e9b8a",
"aarch64-apple-darwin-0.6.7": "1a4d04477893c215e3def30149208fabe58a70d031388684d0125f553e3cd74f",
"aarch64-pc-windows-msvc-0.6.7": "1c6de0c79ad35baadb61f6be7a014f3114a320809868b4ccb09c4d16b7118b48",
"aarch64-unknown-linux-gnu-0.6.7": "b64c4ec32d55bd8e8b726b3162be0dfb3c117c3ca4cd798862497d33fe68e7b9",
"aarch64-unknown-linux-musl-0.6.7": "df9e1b9530ad63085b66936e65cca107acc98197856e2ac22b896b1ab3936ac4",
"arm-unknown-linux-musleabihf-0.6.7": "03a4b36d50fe4f0e50845559a524ed75610762072075c411f7ed84479e6c736d",
"armv7-unknown-linux-gnueabihf-0.6.7": "a877f7697375f6b19d3b537c5152cbb3d86430120b20d957cfa7c084e6b79d6c",
"armv7-unknown-linux-musleabihf-0.6.7": "e337a7dd6b86c842dac78041acfa9d9402662d5a8cede1d0ae694c9c17057162",
"i686-pc-windows-msvc-0.6.7": "33002d9f1dab894f48254f43b4b882f6c88078d70ace883ed29fcde82616bbb0",
"i686-unknown-linux-gnu-0.6.7": "b5f04a274f96aa41e8094b1c4355632f6caa9dfb7e62a45908950ca1c5d3fb38",
"i686-unknown-linux-musl-0.6.7": "bd56de94a3ffac99a06fc0d37e7cb45e1c35ba275924b5ed502da833dc712d12",
"powerpc64-unknown-linux-gnu-0.6.7": "57c668908878e1b12c726efc0439cd609697892a22e1e43c0ebb520ef2995a27",
"powerpc64le-unknown-linux-gnu-0.6.7": "abe3004c0fc468e89ddcf8490991c7fc83abc9d9f6e6a29c59473541265e8bd5",
"s390x-unknown-linux-gnu-0.6.7": "b6c60b7b907f871880a9be43294b02f84be5ec3187b1a16d7705f5beb622e01a",
"x86_64-apple-darwin-0.6.7": "680be39f40bf00a8c3a6776e9ddaa9c3c18ef2efbb0c1a9a854b333660ca8678",
"x86_64-pc-windows-msvc-0.6.7": "11b902b07e98331cef0d648c182c6aa1f279cde688c4411eb9153dc957d48f90",
"x86_64-unknown-linux-gnu-0.6.7": "601c2b1147117c4471a154b4cebbdb31c818105f796d5f8115fe42d2526689c8",
"x86_64-unknown-linux-musl-0.6.7": "a31bd6916eff780a7a44c84c194f4f8b70a8250b9175b3839ce2d4403fd735de",
"aarch64-apple-darwin-0.6.6": "d0fb047593122746c7529960f8efd5d7d10d2cb230302f71158e9765ad37727b", "aarch64-apple-darwin-0.6.6": "d0fb047593122746c7529960f8efd5d7d10d2cb230302f71158e9765ad37727b",
"aarch64-pc-windows-msvc-0.6.6": "6bb6d5a28e8a181fd5b0046778b97a75c3ec1c5117a058e1961e0f6df9ee2925", "aarch64-pc-windows-msvc-0.6.6": "6bb6d5a28e8a181fd5b0046778b97a75c3ec1c5117a058e1961e0f6df9ee2925",
"aarch64-unknown-linux-gnu-0.6.6": "37a543598cdb7d8fc9b74e6b1fe1fdf8b9a279c6137c7ff8396a88f69ec7a43c", "aarch64-unknown-linux-gnu-0.6.6": "37a543598cdb7d8fc9b74e6b1fe1fdf8b9a279c6137c7ff8396a88f69ec7a43c",
@@ -64077,7 +61586,7 @@ async function downloadAssetContent(downloadUrl) {
/***/ }), /***/ }),
/***/ 4000: /***/ 5653:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict"; "use strict";
@@ -64116,145 +61625,29 @@ var __importStar = (this && this.__importStar) || (function () {
}; };
})(); })();
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getLatestKnownVersion = getLatestKnownVersion; const semver = __importStar(__nccwpck_require__(9318));
exports.getDownloadUrl = getDownloadUrl;
exports.updateVersionManifest = updateVersionManifest;
const node_fs_1 = __nccwpck_require__(3024);
const node_path_1 = __nccwpck_require__(6760);
const core = __importStar(__nccwpck_require__(7484)); const core = __importStar(__nccwpck_require__(7484));
const semver = __importStar(__nccwpck_require__(6937));
const fetch_1 = __nccwpck_require__(3385);
const localManifestFile = (0, node_path_1.join)(__dirname, "..", "..", "version-manifest.json");
async function getLatestKnownVersion(manifestUrl) {
const manifestEntries = await getManifestEntries(manifestUrl);
return manifestEntries.reduce((a, b) => semver.gt(a.version, b.version) ? a : b).version;
}
async function getDownloadUrl(manifestUrl, version, arch, platform) {
const manifestEntries = await getManifestEntries(manifestUrl);
const entry = manifestEntries.find((entry) => entry.version === version &&
entry.arch === arch &&
entry.platform === platform);
return entry ? entry.downloadUrl : undefined;
}
async function getManifestEntries(manifestUrl) {
let data;
if (manifestUrl !== undefined) {
core.info(`Fetching manifest-file from: ${manifestUrl}`);
const response = await (0, fetch_1.fetch)(manifestUrl, {});
if (!response.ok) {
throw new Error(`Failed to fetch manifest-file: ${response.status} ${response.statusText}`);
}
data = await response.text();
}
else {
core.info("manifest-file not provided, reading from local file.");
const fileContent = await node_fs_1.promises.readFile(localManifestFile);
data = fileContent.toString();
}
return JSON.parse(data);
}
async function updateVersionManifest(manifestUrl, downloadUrls) {
const manifest = [];
for (const downloadUrl of downloadUrls) {
const urlParts = downloadUrl.split("/");
const version = urlParts[urlParts.length - 2];
const artifactName = urlParts[urlParts.length - 1];
if (!artifactName.startsWith("uv-")) {
continue;
}
if (artifactName.startsWith("uv-installer")) {
continue;
}
const artifactParts = artifactName.split(".")[0].split("-");
manifest.push({
arch: artifactParts[1],
artifactName: artifactName,
downloadUrl: downloadUrl,
platform: artifactName.split(`uv-${artifactParts[1]}-`)[1].split(".")[0],
version: version,
});
}
core.debug(`Updating manifest-file: ${JSON.stringify(manifest)}`);
await node_fs_1.promises.writeFile(manifestUrl, JSON.stringify(manifest));
}
/***/ }),
/***/ 7416:
/***/ (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 () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", ({ value: true }));
const core = __importStar(__nccwpck_require__(7484));
const semver = __importStar(__nccwpck_require__(6937));
const update_known_checksums_1 = __nccwpck_require__(6182);
const version_manifest_1 = __nccwpck_require__(4000);
const constants_1 = __nccwpck_require__(6156);
const octokit_1 = __nccwpck_require__(3352); const octokit_1 = __nccwpck_require__(3352);
const constants_1 = __nccwpck_require__(6156);
const update_known_checksums_1 = __nccwpck_require__(6182);
async function run() { async function run() {
const checksumFilePath = process.argv.slice(2)[0]; const checksumFilePath = process.argv.slice(2)[0];
const versionsManifestFile = process.argv.slice(2)[1]; const github_token = process.argv.slice(2)[1];
const githubToken = process.argv.slice(2)[2];
const octokit = new octokit_1.Octokit({ const octokit = new octokit_1.Octokit({
auth: githubToken, auth: github_token,
}); });
const { data: latestRelease } = await octokit.rest.repos.getLatestRelease({ const response = await octokit.paginate(octokit.rest.repos.listReleases, {
owner: constants_1.OWNER, owner: constants_1.OWNER,
repo: constants_1.REPO, repo: constants_1.REPO,
}); });
const latestKnownVersion = await (0, version_manifest_1.getLatestKnownVersion)(undefined); const downloadUrls = response.flatMap((release) => release.assets
if (semver.lte(latestRelease.tag_name, latestKnownVersion)) {
core.info(`Latest release (${latestRelease.tag_name}) is not newer than the latest known version (${latestKnownVersion}). Skipping update.`);
return;
}
const releases = await octokit.paginate(octokit.rest.repos.listReleases, {
owner: constants_1.OWNER,
repo: constants_1.REPO,
});
const checksumDownloadUrls = releases.flatMap((release) => release.assets
.filter((asset) => asset.name.endsWith(".sha256")) .filter((asset) => asset.name.endsWith(".sha256"))
.map((asset) => asset.browser_download_url)); .map((asset) => asset.browser_download_url));
await (0, update_known_checksums_1.updateChecksums)(checksumFilePath, checksumDownloadUrls); await (0, update_known_checksums_1.updateChecksums)(checksumFilePath, downloadUrls);
const artifactDownloadUrls = releases.flatMap((release) => release.assets const latestVersion = response
.filter((asset) => !asset.name.endsWith(".sha256")) .map((release) => release.tag_name)
.map((asset) => asset.browser_download_url)); .sort(semver.rcompare)[0];
await (0, version_manifest_1.updateVersionManifest)(versionsManifestFile, artifactDownloadUrls); core.setOutput("latest-version", latestVersion);
core.setOutput("latest-version", latestRelease.tag_name);
} }
run(); run();
@@ -64275,17 +61668,24 @@ exports.TOOL_CACHE_NAME = "uv";
/***/ }), /***/ }),
/***/ 3385: /***/ 3352:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.fetch = void 0; exports.Octokit = exports.customFetch = void 0;
exports.getProxyAgent = getProxyAgent; exports.getProxyAgent = getProxyAgent;
const core_1 = __nccwpck_require__(767);
const plugin_paginate_rest_1 = __nccwpck_require__(3779);
const plugin_rest_endpoint_methods_1 = __nccwpck_require__(9210);
const undici_1 = __nccwpck_require__(6752); const undici_1 = __nccwpck_require__(6752);
const DEFAULTS = {
baseUrl: "https://api.github.com",
userAgent: "setup-uv",
};
function getProxyAgent() { function getProxyAgent() {
const httpProxy = process.env.HTTP_PROXY || process.env.http_proxy; const httpProxy = process.env.HTTP_PROXY || process.env.http_prox;
if (httpProxy) { if (httpProxy) {
return new undici_1.ProxyAgent(httpProxy); return new undici_1.ProxyAgent(httpProxy);
} }
@@ -64295,36 +61695,17 @@ function getProxyAgent() {
} }
return undefined; return undefined;
} }
const fetch = async (url, opts) => await (0, undici_1.fetch)(url, { const customFetch = async (url, opts) => await (0, undici_1.fetch)(url, {
dispatcher: getProxyAgent(), dispatcher: getProxyAgent(),
...opts, ...opts,
}); });
exports.fetch = fetch; exports.customFetch = customFetch;
/***/ }),
/***/ 3352:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.Octokit = void 0;
const core_1 = __nccwpck_require__(767);
const plugin_paginate_rest_1 = __nccwpck_require__(3779);
const plugin_rest_endpoint_methods_1 = __nccwpck_require__(9210);
const fetch_1 = __nccwpck_require__(3385);
const DEFAULTS = {
baseUrl: "https://api.github.com",
userAgent: "setup-uv",
};
exports.Octokit = core_1.Octokit.plugin(plugin_paginate_rest_1.paginateRest, plugin_rest_endpoint_methods_1.legacyRestEndpointMethods).defaults(function buildDefaults(options) { exports.Octokit = core_1.Octokit.plugin(plugin_paginate_rest_1.paginateRest, plugin_rest_endpoint_methods_1.legacyRestEndpointMethods).defaults(function buildDefaults(options) {
return { return {
...DEFAULTS, ...DEFAULTS,
...options, ...options,
request: { request: {
fetch: fetch_1.fetch, fetch: exports.customFetch,
...options.request, ...options.request,
}, },
}; };
@@ -64509,14 +61890,6 @@ module.exports = require("node:fs");
/***/ }), /***/ }),
/***/ 1455:
/***/ ((module) => {
"use strict";
module.exports = require("node:fs/promises");
/***/ }),
/***/ 7067: /***/ 7067:
/***/ ((module) => { /***/ ((module) => {
@@ -64541,14 +61914,6 @@ module.exports = require("node:net");
/***/ }), /***/ }),
/***/ 6760:
/***/ ((module) => {
"use strict";
module.exports = require("node:path");
/***/ }),
/***/ 643: /***/ 643:
/***/ ((module) => { /***/ ((module) => {
@@ -64581,14 +61946,6 @@ module.exports = require("node:stream");
/***/ }), /***/ }),
/***/ 7997:
/***/ ((module) => {
"use strict";
module.exports = require("node:timers");
/***/ }),
/***/ 1692: /***/ 1692:
/***/ ((module) => { /***/ ((module) => {
@@ -64597,6 +61954,14 @@ module.exports = require("node:tls");
/***/ }), /***/ }),
/***/ 3136:
/***/ ((module) => {
"use strict";
module.exports = require("node:url");
/***/ }),
/***/ 7975: /***/ 7975:
/***/ ((module) => { /***/ ((module) => {
@@ -67344,8 +64709,7 @@ var NON_VARIABLE_OPTIONS = [
"headers", "headers",
"request", "request",
"query", "query",
"mediaType", "mediaType"
"operationName"
]; ];
var FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; var FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"];
var GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; var GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/;
@@ -67483,7 +64847,7 @@ var createTokenAuth = function createTokenAuth2(token) {
;// CONCATENATED MODULE: ./node_modules/@octokit/core/dist-src/version.js ;// CONCATENATED MODULE: ./node_modules/@octokit/core/dist-src/version.js
const version_VERSION = "7.0.3"; const version_VERSION = "6.1.4";
;// CONCATENATED MODULE: ./node_modules/@octokit/core/dist-src/index.js ;// CONCATENATED MODULE: ./node_modules/@octokit/core/dist-src/index.js
@@ -67497,21 +64861,6 @@ const noop = () => {
}; };
const consoleWarn = console.warn.bind(console); const consoleWarn = console.warn.bind(console);
const consoleError = console.error.bind(console); const consoleError = console.error.bind(console);
function createLogger(logger = {}) {
if (typeof logger.debug !== "function") {
logger.debug = noop;
}
if (typeof logger.info !== "function") {
logger.info = noop;
}
if (typeof logger.warn !== "function") {
logger.warn = consoleWarn;
}
if (typeof logger.error !== "function") {
logger.error = consoleError;
}
return logger;
}
const userAgentTrail = `octokit-core.js/${version_VERSION} ${getUserAgent()}`; const userAgentTrail = `octokit-core.js/${version_VERSION} ${getUserAgent()}`;
class Octokit { class Octokit {
static VERSION = version_VERSION; static VERSION = version_VERSION;
@@ -67579,7 +64928,15 @@ class Octokit {
} }
this.request = request.defaults(requestDefaults); this.request = request.defaults(requestDefaults);
this.graphql = withCustomRequest(this.request).defaults(requestDefaults); this.graphql = withCustomRequest(this.request).defaults(requestDefaults);
this.log = createLogger(options.log); this.log = Object.assign(
{
debug: noop,
info: noop,
warn: consoleWarn,
error: consoleError
},
options.log
);
this.hook = hook; this.hook = hook;
if (!options.authStrategy) { if (!options.authStrategy) {
if (!options.auth) { if (!options.auth) {
@@ -67652,16 +65009,14 @@ function normalizePaginatedListResponse(response) {
data: [] data: []
}; };
} }
const responseNeedsNormalization = ("total_count" in response.data || "total_commits" in response.data) && !("url" in response.data); const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data);
if (!responseNeedsNormalization) return response; if (!responseNeedsNormalization) return response;
const incompleteResults = response.data.incomplete_results; const incompleteResults = response.data.incomplete_results;
const repositorySelection = response.data.repository_selection; const repositorySelection = response.data.repository_selection;
const totalCount = response.data.total_count; const totalCount = response.data.total_count;
const totalCommits = response.data.total_commits;
delete response.data.incomplete_results; delete response.data.incomplete_results;
delete response.data.repository_selection; delete response.data.repository_selection;
delete response.data.total_count; delete response.data.total_count;
delete response.data.total_commits;
const namespaceKey = Object.keys(response.data)[0]; const namespaceKey = Object.keys(response.data)[0];
const data = response.data[namespaceKey]; const data = response.data[namespaceKey];
response.data = data; response.data = data;
@@ -67672,7 +65027,6 @@ function normalizePaginatedListResponse(response) {
response.data.repository_selection = repositorySelection; response.data.repository_selection = repositorySelection;
} }
response.data.total_count = totalCount; response.data.total_count = totalCount;
response.data.total_commits = totalCommits;
return response; return response;
} }
@@ -67693,16 +65047,6 @@ function iterator(octokit, route, parameters) {
url = ((normalizedResponse.headers.link || "").match( url = ((normalizedResponse.headers.link || "").match(
/<([^<>]+)>;\s*rel="next"/ /<([^<>]+)>;\s*rel="next"/
) || [])[1]; ) || [])[1];
if (!url && "total_commits" in normalizedResponse.data) {
const parsedUrl = new URL(normalizedResponse.url);
const params = parsedUrl.searchParams;
const page = parseInt(params.get("page") || "1", 10);
const per_page = parseInt(params.get("per_page") || "250", 10);
if (page * per_page < normalizedResponse.data.total_commits) {
params.set("page", String(page + 1));
url = parsedUrl.toString();
}
}
return { value: normalizedResponse }; return { value: normalizedResponse };
} catch (error) { } catch (error) {
if (error.status !== 409) throw error; if (error.status !== 409) throw error;
@@ -67788,10 +65132,8 @@ var paginatingEndpoints = [
"GET /notifications", "GET /notifications",
"GET /organizations", "GET /organizations",
"GET /orgs/{org}/actions/cache/usage-by-repository", "GET /orgs/{org}/actions/cache/usage-by-repository",
"GET /orgs/{org}/actions/hosted-runners",
"GET /orgs/{org}/actions/permissions/repositories", "GET /orgs/{org}/actions/permissions/repositories",
"GET /orgs/{org}/actions/runner-groups", "GET /orgs/{org}/actions/runner-groups",
"GET /orgs/{org}/actions/runner-groups/{runner_group_id}/hosted-runners",
"GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories", "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories",
"GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners", "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners",
"GET /orgs/{org}/actions/runners", "GET /orgs/{org}/actions/runners",
@@ -67801,7 +65143,6 @@ var paginatingEndpoints = [
"GET /orgs/{org}/actions/variables/{name}/repositories", "GET /orgs/{org}/actions/variables/{name}/repositories",
"GET /orgs/{org}/attestations/{subject_digest}", "GET /orgs/{org}/attestations/{subject_digest}",
"GET /orgs/{org}/blocks", "GET /orgs/{org}/blocks",
"GET /orgs/{org}/campaigns",
"GET /orgs/{org}/code-scanning/alerts", "GET /orgs/{org}/code-scanning/alerts",
"GET /orgs/{org}/code-security/configurations", "GET /orgs/{org}/code-security/configurations",
"GET /orgs/{org}/code-security/configurations/{configuration_id}/repositories", "GET /orgs/{org}/code-security/configurations/{configuration_id}/repositories",
@@ -67810,6 +65151,7 @@ var paginatingEndpoints = [
"GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories", "GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories",
"GET /orgs/{org}/copilot/billing/seats", "GET /orgs/{org}/copilot/billing/seats",
"GET /orgs/{org}/copilot/metrics", "GET /orgs/{org}/copilot/metrics",
"GET /orgs/{org}/copilot/usage",
"GET /orgs/{org}/dependabot/alerts", "GET /orgs/{org}/dependabot/alerts",
"GET /orgs/{org}/dependabot/secrets", "GET /orgs/{org}/dependabot/secrets",
"GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories", "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories",
@@ -67844,11 +65186,10 @@ var paginatingEndpoints = [
"GET /orgs/{org}/repos", "GET /orgs/{org}/repos",
"GET /orgs/{org}/rulesets", "GET /orgs/{org}/rulesets",
"GET /orgs/{org}/rulesets/rule-suites", "GET /orgs/{org}/rulesets/rule-suites",
"GET /orgs/{org}/rulesets/{ruleset_id}/history",
"GET /orgs/{org}/secret-scanning/alerts", "GET /orgs/{org}/secret-scanning/alerts",
"GET /orgs/{org}/security-advisories", "GET /orgs/{org}/security-advisories",
"GET /orgs/{org}/settings/network-configurations",
"GET /orgs/{org}/team/{team_slug}/copilot/metrics", "GET /orgs/{org}/team/{team_slug}/copilot/metrics",
"GET /orgs/{org}/team/{team_slug}/copilot/usage",
"GET /orgs/{org}/teams", "GET /orgs/{org}/teams",
"GET /orgs/{org}/teams/{team_slug}/discussions", "GET /orgs/{org}/teams/{team_slug}/discussions",
"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments",
@@ -67897,8 +65238,6 @@ var paginatingEndpoints = [
"GET /repos/{owner}/{repo}/commits/{ref}/check-suites", "GET /repos/{owner}/{repo}/commits/{ref}/check-suites",
"GET /repos/{owner}/{repo}/commits/{ref}/status", "GET /repos/{owner}/{repo}/commits/{ref}/status",
"GET /repos/{owner}/{repo}/commits/{ref}/statuses", "GET /repos/{owner}/{repo}/commits/{ref}/statuses",
"GET /repos/{owner}/{repo}/compare/{basehead}",
"GET /repos/{owner}/{repo}/compare/{base}...{head}",
"GET /repos/{owner}/{repo}/contributors", "GET /repos/{owner}/{repo}/contributors",
"GET /repos/{owner}/{repo}/dependabot/alerts", "GET /repos/{owner}/{repo}/dependabot/alerts",
"GET /repos/{owner}/{repo}/dependabot/secrets", "GET /repos/{owner}/{repo}/dependabot/secrets",
@@ -67945,7 +65284,6 @@ var paginatingEndpoints = [
"GET /repos/{owner}/{repo}/rules/branches/{branch}", "GET /repos/{owner}/{repo}/rules/branches/{branch}",
"GET /repos/{owner}/{repo}/rulesets", "GET /repos/{owner}/{repo}/rulesets",
"GET /repos/{owner}/{repo}/rulesets/rule-suites", "GET /repos/{owner}/{repo}/rulesets/rule-suites",
"GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history",
"GET /repos/{owner}/{repo}/secret-scanning/alerts", "GET /repos/{owner}/{repo}/secret-scanning/alerts",
"GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations", "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations",
"GET /repos/{owner}/{repo}/security-advisories", "GET /repos/{owner}/{repo}/security-advisories",
@@ -68057,7 +65395,7 @@ __nccwpck_require__.d(__webpack_exports__, {
}); });
;// CONCATENATED MODULE: ./node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/version.js ;// CONCATENATED MODULE: ./node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/version.js
const VERSION = "16.0.0"; const VERSION = "13.3.1";
//# sourceMappingURL=version.js.map //# sourceMappingURL=version.js.map
@@ -68088,7 +65426,6 @@ const Endpoints = {
createEnvironmentVariable: [ createEnvironmentVariable: [
"POST /repos/{owner}/{repo}/environments/{environment_name}/variables" "POST /repos/{owner}/{repo}/environments/{environment_name}/variables"
], ],
createHostedRunnerForOrg: ["POST /orgs/{org}/actions/hosted-runners"],
createOrUpdateEnvironmentSecret: [ createOrUpdateEnvironmentSecret: [
"PUT /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}" "PUT /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}"
], ],
@@ -68126,9 +65463,6 @@ const Endpoints = {
deleteEnvironmentVariable: [ deleteEnvironmentVariable: [
"DELETE /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}" "DELETE /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}"
], ],
deleteHostedRunnerForOrg: [
"DELETE /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"
],
deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"], deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"],
deleteOrgVariable: ["DELETE /orgs/{org}/actions/variables/{name}"], deleteOrgVariable: ["DELETE /orgs/{org}/actions/variables/{name}"],
deleteRepoSecret: [ deleteRepoSecret: [
@@ -68217,24 +65551,6 @@ const Endpoints = {
getGithubActionsPermissionsRepository: [ getGithubActionsPermissionsRepository: [
"GET /repos/{owner}/{repo}/actions/permissions" "GET /repos/{owner}/{repo}/actions/permissions"
], ],
getHostedRunnerForOrg: [
"GET /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"
],
getHostedRunnersGithubOwnedImagesForOrg: [
"GET /orgs/{org}/actions/hosted-runners/images/github-owned"
],
getHostedRunnersLimitsForOrg: [
"GET /orgs/{org}/actions/hosted-runners/limits"
],
getHostedRunnersMachineSpecsForOrg: [
"GET /orgs/{org}/actions/hosted-runners/machine-sizes"
],
getHostedRunnersPartnerImagesForOrg: [
"GET /orgs/{org}/actions/hosted-runners/images/partner"
],
getHostedRunnersPlatformsForOrg: [
"GET /orgs/{org}/actions/hosted-runners/platforms"
],
getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"], getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"],
getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"], getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"],
getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"], getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"],
@@ -68278,10 +65594,6 @@ const Endpoints = {
listEnvironmentVariables: [ listEnvironmentVariables: [
"GET /repos/{owner}/{repo}/environments/{environment_name}/variables" "GET /repos/{owner}/{repo}/environments/{environment_name}/variables"
], ],
listGithubHostedRunnersInGroupForOrg: [
"GET /orgs/{org}/actions/runner-groups/{runner_group_id}/hosted-runners"
],
listHostedRunnersForOrg: ["GET /orgs/{org}/actions/hosted-runners"],
listJobsForWorkflowRun: [ listJobsForWorkflowRun: [
"GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs" "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"
], ],
@@ -68400,9 +65712,6 @@ const Endpoints = {
updateEnvironmentVariable: [ updateEnvironmentVariable: [
"PATCH /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}" "PATCH /repos/{owner}/{repo}/environments/{environment_name}/variables/{name}"
], ],
updateHostedRunnerForOrg: [
"PATCH /orgs/{org}/actions/hosted-runners/{hosted_runner_id}"
],
updateOrgVariable: ["PATCH /orgs/{org}/actions/variables/{name}"], updateOrgVariable: ["PATCH /orgs/{org}/actions/variables/{name}"],
updateRepoVariable: [ updateRepoVariable: [
"PATCH /repos/{owner}/{repo}/actions/variables/{name}" "PATCH /repos/{owner}/{repo}/actions/variables/{name}"
@@ -68533,9 +65842,6 @@ const Endpoints = {
getGithubBillingUsageReportOrg: [ getGithubBillingUsageReportOrg: [
"GET /organizations/{org}/settings/billing/usage" "GET /organizations/{org}/settings/billing/usage"
], ],
getGithubBillingUsageReportUser: [
"GET /users/{username}/settings/billing/usage"
],
getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"], getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"],
getGithubPackagesBillingUser: [ getGithubPackagesBillingUser: [
"GET /users/{username}/settings/billing/packages" "GET /users/{username}/settings/billing/packages"
@@ -68547,13 +65853,6 @@ const Endpoints = {
"GET /users/{username}/settings/billing/shared-storage" "GET /users/{username}/settings/billing/shared-storage"
] ]
}, },
campaigns: {
createCampaign: ["POST /orgs/{org}/campaigns"],
deleteCampaign: ["DELETE /orgs/{org}/campaigns/{campaign_number}"],
getCampaignSummary: ["GET /orgs/{org}/campaigns/{campaign_number}"],
listOrgCampaigns: ["GET /orgs/{org}/campaigns"],
updateCampaign: ["PATCH /orgs/{org}/campaigns/{campaign_number}"]
},
checks: { checks: {
create: ["POST /repos/{owner}/{repo}/check-runs"], create: ["POST /repos/{owner}/{repo}/check-runs"],
createSuite: ["POST /repos/{owner}/{repo}/check-suites"], createSuite: ["POST /repos/{owner}/{repo}/check-suites"],
@@ -68832,9 +66131,10 @@ const Endpoints = {
getCopilotSeatDetailsForUser: [ getCopilotSeatDetailsForUser: [
"GET /orgs/{org}/members/{username}/copilot" "GET /orgs/{org}/members/{username}/copilot"
], ],
listCopilotSeats: ["GET /orgs/{org}/copilot/billing/seats"] listCopilotSeats: ["GET /orgs/{org}/copilot/billing/seats"],
usageMetricsForOrg: ["GET /orgs/{org}/copilot/usage"],
usageMetricsForTeam: ["GET /orgs/{org}/team/{team_slug}/copilot/usage"]
}, },
credentials: { revoke: ["POST /credentials/revoke"] },
dependabot: { dependabot: {
addSelectedRepoToOrgSecret: [ addSelectedRepoToOrgSecret: [
"PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}" "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"
@@ -68929,26 +66229,6 @@ const Endpoints = {
getAllTemplates: ["GET /gitignore/templates"], getAllTemplates: ["GET /gitignore/templates"],
getTemplate: ["GET /gitignore/templates/{name}"] getTemplate: ["GET /gitignore/templates/{name}"]
}, },
hostedCompute: {
createNetworkConfigurationForOrg: [
"POST /orgs/{org}/settings/network-configurations"
],
deleteNetworkConfigurationFromOrg: [
"DELETE /orgs/{org}/settings/network-configurations/{network_configuration_id}"
],
getNetworkConfigurationForOrg: [
"GET /orgs/{org}/settings/network-configurations/{network_configuration_id}"
],
getNetworkSettingsForOrg: [
"GET /orgs/{org}/settings/network-settings/{network_settings_id}"
],
listNetworkConfigurationsForOrg: [
"GET /orgs/{org}/settings/network-configurations"
],
updateNetworkConfigurationForOrg: [
"PATCH /orgs/{org}/settings/network-configurations/{network_configuration_id}"
]
},
interactions: { interactions: {
getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"], getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"],
getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"], getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"],
@@ -69140,7 +66420,6 @@ const Endpoints = {
"PUT /orgs/{org}/outside_collaborators/{username}" "PUT /orgs/{org}/outside_collaborators/{username}"
], ],
createInvitation: ["POST /orgs/{org}/invitations"], createInvitation: ["POST /orgs/{org}/invitations"],
createIssueType: ["POST /orgs/{org}/issue-types"],
createOrUpdateCustomProperties: ["PATCH /orgs/{org}/properties/schema"], createOrUpdateCustomProperties: ["PATCH /orgs/{org}/properties/schema"],
createOrUpdateCustomPropertiesValuesForRepos: [ createOrUpdateCustomPropertiesValuesForRepos: [
"PATCH /orgs/{org}/properties/values" "PATCH /orgs/{org}/properties/values"
@@ -69150,7 +66429,6 @@ const Endpoints = {
], ],
createWebhook: ["POST /orgs/{org}/hooks"], createWebhook: ["POST /orgs/{org}/hooks"],
delete: ["DELETE /orgs/{org}"], delete: ["DELETE /orgs/{org}"],
deleteIssueType: ["DELETE /orgs/{org}/issue-types/{issue_type_id}"],
deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"],
enableOrDisableSecurityProductOnAllOrgRepos: [ enableOrDisableSecurityProductOnAllOrgRepos: [
"POST /orgs/{org}/{security_product}/{enablement}", "POST /orgs/{org}/{security_product}/{enablement}",
@@ -69167,10 +66445,6 @@ const Endpoints = {
getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"],
getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"],
getOrgRole: ["GET /orgs/{org}/organization-roles/{role_id}"], getOrgRole: ["GET /orgs/{org}/organization-roles/{role_id}"],
getOrgRulesetHistory: ["GET /orgs/{org}/rulesets/{ruleset_id}/history"],
getOrgRulesetVersion: [
"GET /orgs/{org}/rulesets/{ruleset_id}/history/{version_id}"
],
getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"],
getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"], getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"],
getWebhookDelivery: [ getWebhookDelivery: [
@@ -69185,7 +66459,6 @@ const Endpoints = {
listForAuthenticatedUser: ["GET /user/orgs"], listForAuthenticatedUser: ["GET /user/orgs"],
listForUser: ["GET /users/{username}/orgs"], listForUser: ["GET /users/{username}/orgs"],
listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"],
listIssueTypes: ["GET /orgs/{org}/issue-types"],
listMembers: ["GET /orgs/{org}/members"], listMembers: ["GET /orgs/{org}/members"],
listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"],
listOrgRoleTeams: ["GET /orgs/{org}/organization-roles/{role_id}/teams"], listOrgRoleTeams: ["GET /orgs/{org}/organization-roles/{role_id}/teams"],
@@ -69260,7 +66533,6 @@ const Endpoints = {
], ],
unblockUser: ["DELETE /orgs/{org}/blocks/{username}"], unblockUser: ["DELETE /orgs/{org}/blocks/{username}"],
update: ["PATCH /orgs/{org}"], update: ["PATCH /orgs/{org}"],
updateIssueType: ["PUT /orgs/{org}/issue-types/{issue_type_id}"],
updateMembershipForAuthenticatedUser: [ updateMembershipForAuthenticatedUser: [
"PATCH /user/memberships/orgs/{org}" "PATCH /user/memberships/orgs/{org}"
], ],
@@ -69373,6 +66645,37 @@ const Endpoints = {
"PATCH /orgs/{org}/private-registries/{secret_name}" "PATCH /orgs/{org}/private-registries/{secret_name}"
] ]
}, },
projects: {
addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"],
createCard: ["POST /projects/columns/{column_id}/cards"],
createColumn: ["POST /projects/{project_id}/columns"],
createForAuthenticatedUser: ["POST /user/projects"],
createForOrg: ["POST /orgs/{org}/projects"],
createForRepo: ["POST /repos/{owner}/{repo}/projects"],
delete: ["DELETE /projects/{project_id}"],
deleteCard: ["DELETE /projects/columns/cards/{card_id}"],
deleteColumn: ["DELETE /projects/columns/{column_id}"],
get: ["GET /projects/{project_id}"],
getCard: ["GET /projects/columns/cards/{card_id}"],
getColumn: ["GET /projects/columns/{column_id}"],
getPermissionForUser: [
"GET /projects/{project_id}/collaborators/{username}/permission"
],
listCards: ["GET /projects/columns/{column_id}/cards"],
listCollaborators: ["GET /projects/{project_id}/collaborators"],
listColumns: ["GET /projects/{project_id}/columns"],
listForOrg: ["GET /orgs/{org}/projects"],
listForRepo: ["GET /repos/{owner}/{repo}/projects"],
listForUser: ["GET /users/{username}/projects"],
moveCard: ["POST /projects/columns/cards/{card_id}/moves"],
moveColumn: ["POST /projects/columns/{column_id}/moves"],
removeCollaborator: [
"DELETE /projects/{project_id}/collaborators/{username}"
],
update: ["PATCH /projects/{project_id}"],
updateCard: ["PATCH /projects/columns/cards/{card_id}"],
updateColumn: ["PATCH /projects/columns/{column_id}"]
},
pulls: { pulls: {
checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"], checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"],
create: ["POST /repos/{owner}/{repo}/pulls"], create: ["POST /repos/{owner}/{repo}/pulls"],
@@ -69744,12 +67047,6 @@ const Endpoints = {
], ],
getRepoRuleSuites: ["GET /repos/{owner}/{repo}/rulesets/rule-suites"], getRepoRuleSuites: ["GET /repos/{owner}/{repo}/rulesets/rule-suites"],
getRepoRuleset: ["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}"], getRepoRuleset: ["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}"],
getRepoRulesetHistory: [
"GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history"
],
getRepoRulesetVersion: [
"GET /repos/{owner}/{repo}/rulesets/{ruleset_id}/history/{version_id}"
],
getRepoRulesets: ["GET /repos/{owner}/{repo}/rulesets"], getRepoRulesets: ["GET /repos/{owner}/{repo}/rulesets"],
getStatusChecksProtection: [ getStatusChecksProtection: [
"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks" "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"
@@ -69923,13 +67220,7 @@ const Endpoints = {
search: { search: {
code: ["GET /search/code"], code: ["GET /search/code"],
commits: ["GET /search/commits"], commits: ["GET /search/commits"],
issuesAndPullRequests: [ issuesAndPullRequests: ["GET /search/issues"],
"GET /search/issues",
{},
{
deprecated: "octokit.rest.search.issuesAndPullRequests() is deprecated, see https://docs.github.com/rest/search/search#search-issues-and-pull-requests"
}
],
labels: ["GET /search/labels"], labels: ["GET /search/labels"],
repos: ["GET /search/repositories"], repos: ["GET /search/repositories"],
topics: ["GET /search/topics"], topics: ["GET /search/topics"],
@@ -69983,9 +67274,15 @@ const Endpoints = {
addOrUpdateMembershipForUserInOrg: [ addOrUpdateMembershipForUserInOrg: [
"PUT /orgs/{org}/teams/{team_slug}/memberships/{username}" "PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"
], ],
addOrUpdateProjectPermissionsInOrg: [
"PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}"
],
addOrUpdateRepoPermissionsInOrg: [ addOrUpdateRepoPermissionsInOrg: [
"PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}" "PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"
], ],
checkPermissionsForProjectInOrg: [
"GET /orgs/{org}/teams/{team_slug}/projects/{project_id}"
],
checkPermissionsForRepoInOrg: [ checkPermissionsForRepoInOrg: [
"GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}" "GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"
], ],
@@ -70022,10 +67319,14 @@ const Endpoints = {
listPendingInvitationsInOrg: [ listPendingInvitationsInOrg: [
"GET /orgs/{org}/teams/{team_slug}/invitations" "GET /orgs/{org}/teams/{team_slug}/invitations"
], ],
listProjectsInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects"],
listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"], listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"],
removeMembershipForUserInOrg: [ removeMembershipForUserInOrg: [
"DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}" "DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"
], ],
removeProjectInOrg: [
"DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}"
],
removeRepoInOrg: [ removeRepoInOrg: [
"DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}" "DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"
], ],
@@ -70400,7 +67701,7 @@ legacyRestEndpointMethods.VERSION = VERSION;
/******/ // startup /******/ // startup
/******/ // Load entry module and return exports /******/ // Load entry module and return exports
/******/ // This entry module is referenced by other modules so it can't be inlined /******/ // This entry module is referenced by other modules so it can't be inlined
/******/ var __webpack_exports__ = __nccwpck_require__(7416); /******/ var __webpack_exports__ = __nccwpck_require__(5653);
/******/ module.exports = __webpack_exports__; /******/ module.exports = __webpack_exports__;
/******/ /******/
/******/ })() /******/ })()
+2725 -4408
View File
File diff suppressed because it is too large Load Diff
+18 -18
View File
@@ -6,12 +6,14 @@
"main": "dist/index.js", "main": "dist/index.js",
"scripts": { "scripts": {
"build": "tsc", "build": "tsc",
"check": "biome check --write", "format": "biome format --fix",
"package": "ncc build -o dist/setup src/setup-uv.ts && ncc build -o dist/save-cache src/save-cache.ts && ncc build -o dist/update-known-versions src/update-known-versions.ts", "format-check": "biome format",
"lint": "biome lint --fix",
"package": "ncc build -o dist/setup src/setup-uv.ts && ncc build -o dist/save-cache src/save-cache.ts && ncc build -o dist/update-known-checksums src/update-known-checksums.ts",
"test": "jest", "test": "jest",
"act": "act pull_request -W .github/workflows/test.yml --container-architecture linux/amd64 -s GITHUB_TOKEN=\"$(gh auth token)\"", "act": "act pull_request -W .github/workflows/test.yml --container-architecture linux/amd64 -s GITHUB_TOKEN=\"$(gh auth token)\"",
"update-known-versions": "RUNNER_TEMP=known_versions node dist/update-known-versions/index.js src/download/checksum/known-versions.ts \"$(gh auth token)\"", "update-known-checksums": "RUNNER_TEMP=known_checksums node dist/update-known-checksums/index.js src/download/checksum/known-checksums.ts \"$(gh auth token)\"",
"all": "npm run build && npm run check && npm run package && npm test" "all": "npm run build && npm run format && npm run lint && npm run package && npm test"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@@ -21,28 +23,26 @@
"author": "@eifinger", "author": "@eifinger",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/cache": "^4.0.3", "@actions/cache": "^4.0.2",
"@actions/core": "^1.11.1", "@actions/core": "^1.11.1",
"@actions/exec": "^1.1.1", "@actions/exec": "^1.1.1",
"@actions/glob": "^0.5.0", "@actions/glob": "^0.5.0",
"@actions/io": "^1.1.3", "@actions/io": "^1.1.3",
"@actions/tool-cache": "^2.0.2", "@actions/tool-cache": "^2.0.2",
"@octokit/core": "^7.0.3", "@octokit/core": "^6.1.4",
"@octokit/plugin-paginate-rest": "^13.1.1", "@octokit/plugin-paginate-rest": "^11.4.3",
"@octokit/plugin-rest-endpoint-methods": "^16.0.0", "@octokit/plugin-rest-endpoint-methods": "^13.3.1",
"@renovatebot/pep440": "^4.2.0", "undici": "^7.5.0",
"smol-toml": "^1.4.2", "smol-toml": "^1.3.1"
"undici": "^7.14.0"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "2.1.4", "@biomejs/biome": "1.9.4",
"@types/js-yaml": "^4.0.9", "@types/node": "^22.13.10",
"@types/node": "^24.3.0", "@types/semver": "^7.5.8",
"@types/semver": "^7.7.0",
"@vercel/ncc": "^0.38.3", "@vercel/ncc": "^0.38.3",
"jest": "^30.0.5", "jest": "^29.7.0",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"ts-jest": "^29.4.1", "ts-jest": "^29.2.6",
"typescript": "^5.9.2" "typescript": "^5.8.2"
} }
} }
+5 -8
View File
@@ -1,16 +1,14 @@
import * as cache from "@actions/cache"; import * as cache from "@actions/cache";
import * as core from "@actions/core"; import * as core from "@actions/core";
import * as exec from "@actions/exec";
import { hashFiles } from "../hash/hash-files";
import { import {
cacheDependencyGlob, cacheDependencyGlob,
cacheLocalPath, cacheLocalPath,
cacheSuffix, cacheSuffix,
pruneCache,
pythonVersion as pythonVersionInput, pythonVersion as pythonVersionInput,
workingDirectory,
} from "../utils/inputs"; } from "../utils/inputs";
import { getArch, getPlatform } from "../utils/platforms"; import { getArch, getPlatform } from "../utils/platforms";
import { hashFiles } from "../hash/hash-files";
import * as exec from "@actions/exec";
export const STATE_CACHE_KEY = "cache-key"; export const STATE_CACHE_KEY = "cache-key";
export const STATE_CACHE_MATCHED_KEY = "cache-matched-key"; export const STATE_CACHE_MATCHED_KEY = "cache-matched-key";
@@ -56,8 +54,7 @@ async function computeKeys(): Promise<string> {
const suffix = cacheSuffix ? `-${cacheSuffix}` : ""; const suffix = cacheSuffix ? `-${cacheSuffix}` : "";
const pythonVersion = await getPythonVersion(); const pythonVersion = await getPythonVersion();
const platform = await getPlatform(); const platform = await getPlatform();
const pruned = pruneCache ? "-pruned" : ""; return `setup-uv-${CACHE_VERSION}-${getArch()}-${platform}-${pythonVersion}${cacheDependencyPathHash}${suffix}`;
return `setup-uv-${CACHE_VERSION}-${getArch()}-${platform}-${pythonVersion}${pruned}${cacheDependencyPathHash}${suffix}`;
} }
async function getPythonVersion(): Promise<string> { async function getPythonVersion(): Promise<string> {
@@ -67,16 +64,16 @@ async function getPythonVersion(): Promise<string> {
let output = ""; let output = "";
const options: exec.ExecOptions = { const options: exec.ExecOptions = {
silent: !core.isDebug(),
listeners: { listeners: {
stdout: (data: Buffer) => { stdout: (data: Buffer) => {
output += data.toString(); output += data.toString();
}, },
}, },
silent: !core.isDebug(),
}; };
try { try {
const execArgs = ["python", "find", "--directory", workingDirectory]; const execArgs = ["python", "find"];
await exec.exec("uv", execArgs, options); await exec.exec("uv", execArgs, options);
const pythonPath = output.trim(); const pythonPath = output.trim();
+3 -3
View File
@@ -1,9 +1,9 @@
import * as crypto from "node:crypto";
import * as fs from "node:fs"; import * as fs from "node:fs";
import * as crypto from "node:crypto";
import * as core from "@actions/core"; import * as core from "@actions/core";
import type { Architecture, Platform } from "../../utils/platforms";
import { KNOWN_CHECKSUMS } from "./known-checksums"; import { KNOWN_CHECKSUMS } from "./known-checksums";
import type { Architecture, Platform } from "../../utils/platforms";
export async function validateChecksum( export async function validateChecksum(
checkSum: string | undefined, checkSum: string | undefined,
@@ -12,7 +12,7 @@ export async function validateChecksum(
platform: Platform, platform: Platform,
version: string, version: string,
): Promise<void> { ): Promise<void> {
let isValid: boolean | undefined; let isValid: boolean | undefined = undefined;
if (checkSum !== undefined && checkSum !== "") { if (checkSum !== undefined && checkSum !== "") {
isValid = await validateFileCheckSum(downloadPath, checkSum); isValid = await validateFileCheckSum(downloadPath, checkSum);
} else { } else {
-1644
View File
@@ -1,1649 +1,5 @@
// AUTOGENERATED_DO_NOT_EDIT // AUTOGENERATED_DO_NOT_EDIT
export const KNOWN_CHECKSUMS: { [key: string]: string } = { export const KNOWN_CHECKSUMS: { [key: string]: string } = {
"aarch64-apple-darwin-0.8.12":
"a3f78d20465c6d18f7072f118ce1c61b164b98698fdc37357e72958c7d1b68fd",
"aarch64-pc-windows-msvc-0.8.12":
"eb0c7e47411d11cbc3990eef51a5e10215a1fc9d5f5058fd8e952da94be16512",
"aarch64-unknown-linux-gnu-0.8.12":
"9a8a53df515bd64d423c85ace7ddca08fb9a91d8a115934c4495b5cf74c60ea6",
"aarch64-unknown-linux-musl-0.8.12":
"de85bafc3e238a4fce87eb6a4e584c9c04721475abb9e5f6fe186bdce650763f",
"arm-unknown-linux-musleabihf-0.8.12":
"5fe2f13d8c62d410278fbd69b0c1f03be5bd2c40168a98dc8fc82bca64c2eaad",
"armv7-unknown-linux-gnueabihf-0.8.12":
"6ddde49d5fcc04a90855f31b5cb500146dac23f31d16f6d7fa7da1ae481eab1e",
"armv7-unknown-linux-musleabihf-0.8.12":
"39b626f438c22a3122546445d581fe02b6fc449649b4890f44791af4f3d3c18b",
"i686-pc-windows-msvc-0.8.12":
"97e0e04648e48cccdd25210f5eaf6fb2d46f1a198983b7de10613faf1629663d",
"i686-unknown-linux-gnu-0.8.12":
"74484899512bb91ed4bd64d117284c20912c39c600cc775d6ef1bf278d6c2a94",
"i686-unknown-linux-musl-0.8.12":
"b1e303c231068a3a419b12d3ba4dc852931740ab3ad691c7a87309327eac732f",
"powerpc64-unknown-linux-gnu-0.8.12":
"455bd841952724bff1f45dad91555ce2a33c837cc8d734ca39afaa0ac3c8385d",
"powerpc64le-unknown-linux-gnu-0.8.12":
"30f1191e997d8d2845b27f57ce30e8d3643994161b7d099caf81fde22d723fa6",
"riscv64gc-unknown-linux-gnu-0.8.12":
"1e9e7ca966999161ef5174d28a18777d2a143c081a63d455f5b7fd5a1513d2e7",
"s390x-unknown-linux-gnu-0.8.12":
"55ec25ef06c1e0c095f2baa1a12ce38879db8db99a4b046286a9573dd3c605d5",
"x86_64-apple-darwin-0.8.12":
"467b462e854bc750fcad8e3ad35e2aca0d301c9287f2365afad8c17b7672b6a8",
"x86_64-pc-windows-msvc-0.8.12":
"3fb92ce0860db7cb094ddeeb1ac521532fdd3e61d0a130f7bbc6be54caca7c2e",
"x86_64-unknown-linux-gnu-0.8.12":
"f976ebdc612e71209f46664ab6c0325fa0090059b4474e047edd39eb9395373b",
"x86_64-unknown-linux-musl-0.8.12":
"fa682c444b8a57a0984129d0989801fb0406f9238a57df76fdde063c6b2339c2",
"aarch64-apple-darwin-0.8.11":
"c9e74f779a65798057bca2ff328d5c9952f458391e220c3d3216d7a03a338d9f",
"aarch64-pc-windows-msvc-0.8.11":
"09c6cc8c511d166dc12c9e56ce06c92de928a2e5bad14fc079654901dc8ea114",
"aarch64-unknown-linux-gnu-0.8.11":
"472dbebd1369049e58d3bbeaae663b212e691676cfd15d799e4faca616d37264",
"aarch64-unknown-linux-musl-0.8.11":
"1c6045bec4d5ca17777dd271401a0407c5acad79f74fd38f35c31ca64c689808",
"arm-unknown-linux-musleabihf-0.8.11":
"84da6bfdf9ee693c7278770e1d16d0d5e3ba5ea8f913d7fed13e9854aad95e31",
"armv7-unknown-linux-gnueabihf-0.8.11":
"a27bb0ae23d0584f1a6a7f851362cb52687bbd22ecce37cc80f3eeca0925dac4",
"armv7-unknown-linux-musleabihf-0.8.11":
"29605e9724eb7c68bc67892b4d8bcc28d03c1cb1125cb3dd783e81dd61cc15b5",
"i686-pc-windows-msvc-0.8.11":
"17e45a6afa19443a9749668540a033e9fedd3d6bec1ad8952d10da1f40ed9e92",
"i686-unknown-linux-gnu-0.8.11":
"85fb818676480ac0cc0f7219e4fd96667d851790c4dd054dc84f304128d88817",
"i686-unknown-linux-musl-0.8.11":
"194bc103af40c2a15b0a2e86e5eaad53a5219243df8e296d98e9c6269f67e0b3",
"powerpc64-unknown-linux-gnu-0.8.11":
"fde3e344ee3ef3eabc4803a27a05f06b082819d09153ec126b09f93882e54082",
"powerpc64le-unknown-linux-gnu-0.8.11":
"a1de2c76674c5566e27f8a5b8868b4f416ec659ad657aa87ccc2d17f9cfeaac5",
"riscv64gc-unknown-linux-gnu-0.8.11":
"c068fe0b27b7b91d79c3505fcca16ea8dc2df499e6420877bd5cf75b26f5304f",
"s390x-unknown-linux-gnu-0.8.11":
"e4d8ee92b9e20a7713cf7a9f7d7b288d9d726e7e96d874aaa20e3acc1d408287",
"x86_64-apple-darwin-0.8.11":
"7ed76b0cc314fa0cb6dd7ae99379efd3cf8fc14d71af8d71b0b5238582c7958d",
"x86_64-pc-windows-msvc-0.8.11":
"3e802b69307b10f228c8f1d096bd5721ac37a133bf33672f9fcc46a58dd5c920",
"x86_64-unknown-linux-gnu-0.8.11":
"0c6078318332c100d7d9988ea99144b534e40adef2958aa314a9f7c7b8516ed7",
"x86_64-unknown-linux-musl-0.8.11":
"0c66f4d06a4f933bddf75d4ad64e0e2d717f015ba1876c51e32ff293c84f57d5",
"aarch64-apple-darwin-0.8.10":
"5200278ae00b5c0822a7db7a99376b2167e8e9391b29c3de22f9e4fdebc9c0e8",
"aarch64-pc-windows-msvc-0.8.10":
"c51b02188c312baef71187273afa625576101e5680739eab83b1b09ca5d2f3a8",
"aarch64-unknown-linux-gnu-0.8.10":
"de60f5e3d69b54e6196fb8937fef4feb15e239f0fd14278e77e44dbb353214ae",
"aarch64-unknown-linux-musl-0.8.10":
"704f202ca92386eaa095706ec7e26c4f052f7e17721767d4ee18c676565c51b1",
"arm-unknown-linux-musleabihf-0.8.10":
"51d1244dd7f23d8aa021fa4d2a662a3727b27241e0ceb6f11820cb495611965f",
"armv7-unknown-linux-gnueabihf-0.8.10":
"ce22ffada0356570f63ad0aae096226f1c45c3d561023b3fb2b1f0936f2b804c",
"armv7-unknown-linux-musleabihf-0.8.10":
"9ee0a14ec4fa263095bae4da329602f7735d914db4ad59079b47d714bfb95409",
"i686-pc-windows-msvc-0.8.10":
"e62a2549135b4b9474c18e7bc9f0937837012dd9039f6b4b2c109a1cf99ad925",
"i686-unknown-linux-gnu-0.8.10":
"cdd36af87ca53ec6b8cc4507e85c9ca54c40fd77613633a1095a1a2f317a0563",
"i686-unknown-linux-musl-0.8.10":
"658f14b093e3bf4ffcad645fe27d7aa2f8f18a6f625a22a246288c6368a4d88f",
"powerpc64-unknown-linux-gnu-0.8.10":
"f16d77cfca0dfca2bcef7cc556e0316ba5fdc61b1c3387d60b7c40e12f6617dd",
"powerpc64le-unknown-linux-gnu-0.8.10":
"00bc1b47078520c588dbd383700d35c786ac2fa3e53c9fca51c5410581f8c87e",
"riscv64gc-unknown-linux-gnu-0.8.10":
"db605bb442563f0494c174be639b9d80fcc4e27e360a31ad2675005ea1a1e3ab",
"s390x-unknown-linux-gnu-0.8.10":
"83ca774828d652ce9dd1d6e2619e66c471e2cb236754783019b9ae0f4da72718",
"x86_64-apple-darwin-0.8.10":
"3b935381af9124a5d5da48235e149f5f0662f2717e75782d1b843d39d9265d6d",
"x86_64-pc-windows-msvc-0.8.10":
"37fcd011fd22b2a569f7e583a924af2d624d99445f669752923a2fd3841f8e3d",
"x86_64-unknown-linux-gnu-0.8.10":
"2c4392591fe9469d006452ef22f32712f35087d87fb1764ec03e23544eb8770d",
"x86_64-unknown-linux-musl-0.8.10":
"4031c6f7ac3890f29c72e0ea655add58b8fa1c678d20afcf57efa51e57751732",
"aarch64-apple-darwin-0.8.9":
"c233bee389c15fdef09a6028db61cc54a12e6171f27d6d9c018eedca5bbbd011",
"aarch64-pc-windows-msvc-0.8.9":
"7dc9b954e236f842c2120bdb50307f23104ca20a52896c7ae0ea0100904b2aed",
"aarch64-unknown-linux-gnu-0.8.9":
"03108a851cb87ce44069767e0ae7907d9a31180bdd64913852fcde25848d84f2",
"aarch64-unknown-linux-musl-0.8.9":
"fb1f2800bfd0bc9a121269e276653899c726d81cd08d6299f0fb34b4b0d61fcf",
"arm-unknown-linux-musleabihf-0.8.9":
"9a73ca16557efd21d4dad17759261c6f93eb4079a95bb39c578998ad787ee871",
"armv7-unknown-linux-gnueabihf-0.8.9":
"a6be2240c8bf070baaed8ee0a9071fe5f33b2fad55f67d39fcdc8ea720ff668a",
"armv7-unknown-linux-musleabihf-0.8.9":
"758bf39e33d3162fe6ec7bd5f359cc78daf8ce46b2300dec6c31f37b705521f9",
"i686-pc-windows-msvc-0.8.9":
"25988dae5e7698de1a6ff4bf08ed336d138710ee52f52de60859b99acf2bc96b",
"i686-unknown-linux-gnu-0.8.9":
"02a140e4d0af8d469ec088eff51ed9b232c76cfa02d4df0b84b7567c2d6ab95e",
"i686-unknown-linux-musl-0.8.9":
"99fa13e9079901365277b9b409a2892afe2efb0260f940388cadb2d56d706766",
"powerpc64-unknown-linux-gnu-0.8.9":
"604102c2bf07fbb3cc26bcb6b95e60cac55d74b4e21f1cee4b2d5f58930aa5cf",
"powerpc64le-unknown-linux-gnu-0.8.9":
"8ab18629d8a71a4188761e4e2b0eca0970690f13c85697ad232fe8b22e8d5a99",
"riscv64gc-unknown-linux-gnu-0.8.9":
"757944803901c5ca4049147e28e429e34c04d5ac5fe78728396ec4b810063b00",
"s390x-unknown-linux-gnu-0.8.9":
"b78f56186edfed8f117ed1fa09fc59ad9932864ae4e655ae61f3e205846c7ced",
"x86_64-apple-darwin-0.8.9":
"27fe8645c2599b672c3a6c865131a3d916eed9a3ba7cff5a0b863e01a473df66",
"x86_64-pc-windows-msvc-0.8.9":
"b08d68a0d86e4d0d1b5fa439ffa73ac90df2305c595f617ba9d9b5e8740a8efb",
"x86_64-unknown-linux-gnu-0.8.9":
"1056ab7c04bf9030dc0623c260fae0b414675775f333f318918000f667da6ee1",
"x86_64-unknown-linux-musl-0.8.9":
"6bb907345f9100978d3529c8a5b2cbb4e831080909c51a5bff714b491251303e",
"aarch64-apple-darwin-0.8.8":
"9de9365997d7579d27cdbc132883343b3c47add16804f11be679375037dec33a",
"aarch64-pc-windows-msvc-0.8.8":
"3029df83f2b40d2fa0cc896aed8a157afd02e8ce767064d80923e166e46b75ce",
"aarch64-unknown-linux-gnu-0.8.8":
"4e144807bef9a3b6f44fd5e4084d5010738787745c07e09dee4f008e8bee17a8",
"aarch64-unknown-linux-musl-0.8.8":
"fb7785d31a64f416ef67292ba3717781ef4eb1d6f93b6e30715d9127e862de2b",
"arm-unknown-linux-musleabihf-0.8.8":
"fb8ea8fa543322b4901b5acc585e1373dafd996d9aadce7d0c00c00ad36f2cdd",
"armv7-unknown-linux-gnueabihf-0.8.8":
"684538c1aa5da718abb86b0f5a3c5d2eb05a11520e5c87a2b75050751adcc8c6",
"armv7-unknown-linux-musleabihf-0.8.8":
"c5eebbf9ae549ca45f563a9a9770c1534854a5c4056acac0ab3779b9e1f24d75",
"i686-pc-windows-msvc-0.8.8":
"9ec9bf63460e0625cd941a5bbe0775b99c33def5a2f1fe6cbc9e99e167fea33e",
"i686-unknown-linux-gnu-0.8.8":
"d934b2f6c892a25d928cdc2dfd42b3e925011992603879d2035bc7b15a236c35",
"i686-unknown-linux-musl-0.8.8":
"a5b258ee1f686bb58f912ce8c5def3531e0e4cd2bcfe3ee332bfaf3b35e674e0",
"powerpc64-unknown-linux-gnu-0.8.8":
"23dc87674b030bf4d7f4f1cd1b903d18ccaec43af0373d62e309ee79cbe2c2f8",
"powerpc64le-unknown-linux-gnu-0.8.8":
"6a72bb057073ca989690882ac0ae70e6825151e0d2d52d37540be2dd41d70b56",
"riscv64gc-unknown-linux-gnu-0.8.8":
"f107450c910336bfc636208d4d0430a8a6581d98824a4deee5715ac72b73c97a",
"s390x-unknown-linux-gnu-0.8.8":
"5aafe51b39dc715c887d6c1960d82659fa18a7505d0050e6eba36ae5956e4c96",
"x86_64-apple-darwin-0.8.8":
"3346a3d4a45d7457dafadcc1715e8e529e5b65c27aaba2417db4b0b32a8cbac6",
"x86_64-pc-windows-msvc-0.8.8":
"ac76b826e5ba70c7a041e9ee344cbcba2919cdd3010fff7f1a83b7864911633e",
"x86_64-unknown-linux-gnu-0.8.8":
"ecc2e39de86afea661c145f33f6a89a45b1d2427d51a22b458e2c64238794180",
"x86_64-unknown-linux-musl-0.8.8":
"80ee2bde42e1cc39c59ae8a3a20f5b73127b90ece009ef7bdd13ab189ff0c353",
"aarch64-apple-darwin-0.8.7":
"d1f056d2d04b07a69d2be6ed7eb07ece12dda26570a9af316309787865eba374",
"aarch64-pc-windows-msvc-0.8.7":
"5e0fdc7ebe4f237fa1b24a95116243e6c5fb52e0601aed3b7ca24b6a76b6c2ec",
"aarch64-unknown-linux-gnu-0.8.7":
"405965165e6c5a782d9b69e1a641a491533cec80390b0bfbe95eedcf5cdc5078",
"aarch64-unknown-linux-musl-0.8.7":
"70fa63fca7c7b1ccb5a96b8b5691f8dee2f2caeb61fcf6a110227e3f55fcf94c",
"arm-unknown-linux-musleabihf-0.8.7":
"172e93344f2aaee552e606150a1d9bd8de2df2716c81ecc332904e4b2713b964",
"armv7-unknown-linux-gnueabihf-0.8.7":
"3277a9db5244767ed6e8848e487377dea69b67e0a196886696263ddbc5681daf",
"armv7-unknown-linux-musleabihf-0.8.7":
"3170d7251d8d2ab40c86a1b20221d6486baf5f52e7069525893cf20481cc8281",
"i686-pc-windows-msvc-0.8.7":
"f97b09e12f10e8e77b1519124f1f16720bbd64bc0436cad0868f4a2927a7a0e0",
"i686-unknown-linux-gnu-0.8.7":
"0e88d6a9f088f6632026d7009559d519598876db8b46540dcc6ff015bbf16b85",
"i686-unknown-linux-musl-0.8.7":
"1ab32b294aa94846ee9d1c2597ea8f617aade1e7faf2c8e460d5414d87dd8a58",
"powerpc64-unknown-linux-gnu-0.8.7":
"52fe0acf3cb57ee33407c1a2d25e66ec08ac6c4a259e016a54ea34cfe749f148",
"powerpc64le-unknown-linux-gnu-0.8.7":
"ad8d7a098c7f1603adb55bf794a6ba952c715d5d05112482a6c9a9b63d04fef8",
"riscv64gc-unknown-linux-gnu-0.8.7":
"f6bea3521a2d5b1593cb8f18d54237d0ae3b388cbd2cce83c1dcd4b512dde1a6",
"s390x-unknown-linux-gnu-0.8.7":
"ee877021eb1862d9d0cc37697267a01cfdae307c6a8bf7ece27ae92b330fd2d9",
"x86_64-apple-darwin-0.8.7":
"dca85ae222d59ddbd83f61355561d3183cce9d23eb5931c41646499f43cb2b93",
"x86_64-pc-windows-msvc-0.8.7":
"0baf6d021ca283df5e5c768ff51281043fefc889ac14aff8ce58189453166eef",
"x86_64-unknown-linux-gnu-0.8.7":
"060f68b7e86fee70ed19b852934ce6f05bb15d42894ce4a26c34a18b4c3cd511",
"x86_64-unknown-linux-musl-0.8.7":
"b1283a1b42f81dc79c2e58eb77a41e21fd4c59344d3d19e72810ab031ba93771",
"aarch64-apple-darwin-0.8.6":
"15269226c753f01137b5a35c79e59ab46d8aab25a242641fdc4003a6d0a831ff",
"aarch64-pc-windows-msvc-0.8.6":
"a2891f1f1c56e717115579da655951007e2e5e498535b473d9f7cbffe7369e1a",
"aarch64-unknown-linux-gnu-0.8.6":
"6fd314ca589788265ff99ec754bd2fa2a5d090ef592ddbbe8ded6b141615a491",
"aarch64-unknown-linux-musl-0.8.6":
"d78076c7e0dfcd3580736c11e009ef856bd13015f00406e3ded1fc895e2104ba",
"arm-unknown-linux-musleabihf-0.8.6":
"87d33a579cc2ee986e3163bb5de1791c6052ef8716d5fb8d8bf73aa2e5f1bf66",
"armv7-unknown-linux-gnueabihf-0.8.6":
"4139d74dfe3192bc71dacd3cf0cdf6a006d121db2c4d841e08f369761baaf00e",
"armv7-unknown-linux-musleabihf-0.8.6":
"5d4d117cebddc7dbdbf6e1410c65868f113a75700acac77eed28dfdc0411c113",
"i686-pc-windows-msvc-0.8.6":
"4eaa185b61f9cfe73ab7534de7282e51cc0f6bf47361429bdcbb6a5f3264f6e4",
"i686-unknown-linux-gnu-0.8.6":
"7fb9324cfb0c57a9b9145e73598794c7bc4df01f50730bd926d4ab10d4fc59ff",
"i686-unknown-linux-musl-0.8.6":
"3c2e2d69e8da093df76ffffa9758669c33ae47624f73d06ec2a83a363f17fbd4",
"powerpc64-unknown-linux-gnu-0.8.6":
"264dbfddd58cdbd35b33ea24dd802a3409eae1d4516d057bdff88df2e257eaa2",
"powerpc64le-unknown-linux-gnu-0.8.6":
"d34c6d7df2ed9e9739bc0313875e602a943b17fccbf1127f824a5ff9a3253bb5",
"riscv64gc-unknown-linux-gnu-0.8.6":
"6bcd5a72977a4362f042cc2568960b5a42c1f13240ada6b1cce6aa2f6d6a3e42",
"s390x-unknown-linux-gnu-0.8.6":
"8b4372280249038ea5824937d6e1ca7e2192061bd38f3362200133ff55cbb9c3",
"x86_64-apple-darwin-0.8.6":
"4b1da363d8913a85a4a40df6620ae800b16c62beb54f60b1d336432644cb12bb",
"x86_64-pc-windows-msvc-0.8.6":
"f7ed402ea1e4d7fb2b2490e1a097e9849bfdaaa689521d290bdce5478db0428f",
"x86_64-unknown-linux-gnu-0.8.6":
"5429c9b96cab65198c2e5bfe83e933329aa16303a0369d5beedc71785a4a2f36",
"x86_64-unknown-linux-musl-0.8.6":
"0d89cffae3ad1c4ae2d4da06f71ad4539974185a31f7c196a6151b400bf84039",
"aarch64-apple-darwin-0.8.5":
"467e875ac84ac2155f048b56e33741d7dee6f02369048d5b6c05b74b745411e2",
"aarch64-pc-windows-msvc-0.8.5":
"8d3dda6ff64065e65b49ecd42018a885c0f20e6967af950ef121f976d73e72db",
"aarch64-unknown-linux-gnu-0.8.5":
"db05450c7c1e9dd51eeaf4b59c3bc3721bd9146e7ad95e87f5736d45c4037ae0",
"aarch64-unknown-linux-musl-0.8.5":
"400771c1136c9d5cf624bb1695b08d46a4e4e0fc2c9b8897e7be950ac5e00ae0",
"arm-unknown-linux-musleabihf-0.8.5":
"7dcd2a34735d2871714ee4993cf0227492c860ab089691a30f6a65d48ec469b6",
"armv7-unknown-linux-gnueabihf-0.8.5":
"0032fa90b0a74559ac965538178499de6b396ec7ff9b8d8134f442d2d3079f8a",
"armv7-unknown-linux-musleabihf-0.8.5":
"daab0e8f9b563dcbd6bc6ac517a5f9ebe1b1dca9671011d40012c73f0cde8cd0",
"i686-pc-windows-msvc-0.8.5":
"2c133809d2839eac93341a14df6fb16bf834ae3c7582f069cf24ccc60cf367f7",
"i686-unknown-linux-gnu-0.8.5":
"6c6b88bf178f5bd508523457a589e09c885deb57983f8d73dfdd43794d6decfb",
"i686-unknown-linux-musl-0.8.5":
"5968f60135941a2bcca742bf44854bbbe8adfba4d0a170f5991d95572c0e4d26",
"powerpc64-unknown-linux-gnu-0.8.5":
"a4e7b7dca6386b8623c12581ecb606b31a9df53ca8acbbb14dec5ceaa23c1603",
"powerpc64le-unknown-linux-gnu-0.8.5":
"1d521c56d8ee83b90f15350f1cebb506e2441e574b27acdbdfce8449ddbfa1c3",
"riscv64gc-unknown-linux-gnu-0.8.5":
"ca7536b206090982e6f90d566bc441598a6aaad4cfc885618f12051c51a0e454",
"s390x-unknown-linux-gnu-0.8.5":
"92fd077879ea943775bebf49d3515b5da8a237bcb9a975b2476183946b6ed017",
"x86_64-apple-darwin-0.8.5":
"9ee5b34975ab4659345fc96cc08098d7ec871cdfa969a5774894bcaebdaf3b58",
"x86_64-pc-windows-msvc-0.8.5":
"898049e2db4a92e59bf1da7e14cad9b5afadb7d0cf9dd55a5274825290f7ba6d",
"x86_64-unknown-linux-gnu-0.8.5":
"9db7e7db3cf98ddb57954bfb72c9ba4b8a4514b910e666e3c57e8b4e83a0d630",
"x86_64-unknown-linux-musl-0.8.5":
"64aec5c2fa8255d19ff20480afb6445e29be94628c58a429c131f5c60bd990b5",
"aarch64-apple-darwin-0.8.4":
"ef6785df8c23232ce6209c04acefd0c0d2ffb3a3ba0eef16422bdfe99a059105",
"aarch64-pc-windows-msvc-0.8.4":
"34cdff9ed7e1ffece93a895e65377a0ea4f186eb6785ead045280be59edabf19",
"aarch64-unknown-linux-gnu-0.8.4":
"d42742a28ce161e72cce45c8c5621ee23317e30d461f595c382acf0f9b331f20",
"aarch64-unknown-linux-musl-0.8.4":
"d194e457ba2c9f4e737ee9919c66465e0297d956b6c7121b61d37b98e15a694c",
"arm-unknown-linux-musleabihf-0.8.4":
"cfd9d5c2d5bc462308c54e4224cb4102819cfc230cd7a75dcf5cd345969ab732",
"armv7-unknown-linux-gnueabihf-0.8.4":
"234358eb9384c6392678d392ab0835daf500a71b6d78b5b33f10793c2c695d05",
"armv7-unknown-linux-musleabihf-0.8.4":
"65408f9aab2895faa1c523a064eef01f2d5cea4686ceb704217d8ece03a69a8c",
"i686-pc-windows-msvc-0.8.4":
"fc4fca95757e78fa4a782ae7f5cba4f52137df49b737cec0a6ad8092ca829151",
"i686-unknown-linux-gnu-0.8.4":
"d43485d5531529c4a57bf9b504e9ac1609a4467d220a268c38464d83d6df08b6",
"i686-unknown-linux-musl-0.8.4":
"cd4e9127d6562f0817060aa9c1b396afc7db31cdf48b73ecc347bd6f4f77f075",
"powerpc64-unknown-linux-gnu-0.8.4":
"3083419366b512e89e53f7e73c48ca15e28daa1ec674f5ef6492d06b0834e62d",
"powerpc64le-unknown-linux-gnu-0.8.4":
"1e1164b8b2bfcd09daf5b32bada5fdc08b81d384bebd9707691cc48561749a27",
"riscv64gc-unknown-linux-gnu-0.8.4":
"0b4e5e41b4c2836e6d8c1b4eb5151a0ea775908bc892ba62a8126fcdd7b06914",
"s390x-unknown-linux-gnu-0.8.4":
"28aefb0bac0349aa3f218cfa43ce50793f81c6948d01e2e4b97ea5421a2734ab",
"x86_64-apple-darwin-0.8.4":
"14e5309f182d1a92cf6c82f5891a0a0dc1cd5d46627171eaa1e84fa2b7e0afc3",
"x86_64-pc-windows-msvc-0.8.4":
"817c50c80229f88de9699626ee3774c0cceed86099663e8fb00c5ffae7ea911c",
"x86_64-unknown-linux-gnu-0.8.4":
"eb61d39fdc6ea21a6d00a24b50376102168240849c5022d3eba331f972ba3934",
"x86_64-unknown-linux-musl-0.8.4":
"4e16694fcc20a94136af70fb1449e8817150896af0339b6b28dfb6d006cd8116",
"aarch64-apple-darwin-0.8.3":
"9ebfe9f3b51187932ef97270b689da48261acacadd6ea7018d2cc62719c86ffe",
"aarch64-pc-windows-msvc-0.8.3":
"6e0692b817c5d6cfddad13ad177e866e36d95e8d32b4a296a49d937fdcda18d3",
"aarch64-unknown-linux-gnu-0.8.3":
"e82b5a3eb19e5087a6ea92800b0402f60378bd395e3483acd0b46124128ab71f",
"aarch64-unknown-linux-musl-0.8.3":
"05707835aadb8d0dfacf64a50dc31eb77fb11d1773b13ddd78d2404d43be3b7f",
"arm-unknown-linux-musleabihf-0.8.3":
"63f09a167470e40f5a7afce7ba726fa31d700042107215a8f46572a617b2ba64",
"armv7-unknown-linux-gnueabihf-0.8.3":
"ca3ab5110a248febf3af56ca8e417add5a164228d8861d2f6439d6c77654ad24",
"armv7-unknown-linux-musleabihf-0.8.3":
"79b9f2f8abf64b93aaf48f87b159bc34e73b92428c6424a9e633f481449bc8be",
"i686-pc-windows-msvc-0.8.3":
"5d272849a94b7ad36711f336d745e08ed3732042fc51f5c7f28bfc4e95463615",
"i686-unknown-linux-gnu-0.8.3":
"5ca9dcdd8aba4c59266536c00453f3815ccf4852a1bef78f181f4ae43726e742",
"i686-unknown-linux-musl-0.8.3":
"7a7eb903b673c0a0fa8282e12d2130fb63c1f0e574b1b8eb24ac63503db5db9e",
"powerpc64-unknown-linux-gnu-0.8.3":
"ad94079c0aa352730e5656246ecb8fd6cb5c7c1bbcc100954020f32128d6b0de",
"powerpc64le-unknown-linux-gnu-0.8.3":
"27ccd00f3c617b59d6977e48612dc5fe49d15c1181bf995863350e78002e54ac",
"riscv64gc-unknown-linux-gnu-0.8.3":
"897257393ca612058bb22691fab3a45480d3f7fc1df5bb968696576d7d98d6c1",
"s390x-unknown-linux-gnu-0.8.3":
"d148aebfc019aa14c686713fb0a391bb700290ecdf2903c2fdab0009182d880b",
"x86_64-apple-darwin-0.8.3":
"77eac9622f76ad89a8c59b31a96277aa61eb290d2949c69ab2061076471aeda2",
"x86_64-pc-windows-msvc-0.8.3":
"4ca84e28b08f48255f95156c5987d61a5e4c51a43372708bc6d84e994eeb7bdb",
"x86_64-unknown-linux-gnu-0.8.3":
"427c27ed5f87bf91aa045cf459ea34d348ed6377c62c3c054f1b4046b2f83fe2",
"x86_64-unknown-linux-musl-0.8.3":
"bfbe34caae328355b720ad0f667be99990b1b93721c8cb726e4a502796eb6d68",
"aarch64-apple-darwin-0.8.2":
"954d24634d5f37fa26c7af75eb79893d11623fc81b4de4b82d60d1ade4bfca22",
"aarch64-pc-windows-msvc-0.8.2":
"0e1e80ca0d6faab2c716ac7b73214c6df7a37dc0a45998d5f7d6e73339db8e48",
"aarch64-unknown-linux-gnu-0.8.2":
"27da35ef54e9131c2e305de67dd59a07c19257882c6b1f3cf4d8d5fbb8eaf4ca",
"aarch64-unknown-linux-musl-0.8.2":
"725237095ea91ad4fe54b1a047138194bdef428002709e0ae9dfea33b66e1c8a",
"arm-unknown-linux-musleabihf-0.8.2":
"ea523b34d5c96b32f1f68a51b690774f7822474a355fd74973a089ba2002e82a",
"armv7-unknown-linux-gnueabihf-0.8.2":
"8fcbdce85af3b62b8625e780c0065ccd35aab830fcd380c2bb5a03e2174861b0",
"armv7-unknown-linux-musleabihf-0.8.2":
"d433a35cd4e0b9ed8163b42b69d050954b77163765e5c25ac21aa08da2117ad3",
"i686-pc-windows-msvc-0.8.2":
"d862eaf046abe9143b3e172137cb50657920d324cb3e00be78d22aba4478d7f8",
"i686-unknown-linux-gnu-0.8.2":
"fc0baebac65fba4865c23f0ec31722750543c5f5320d7c52221b0565065520ce",
"i686-unknown-linux-musl-0.8.2":
"fff6ad20fbcf808089823161a303ab32bfbec31b0af73c3d5717fe8b80aa8a81",
"powerpc64-unknown-linux-gnu-0.8.2":
"d0cfde8f85eeeb7baabbca6ad7e66fba0bfb2e6145a95fb9fc97d82d153d08c8",
"powerpc64le-unknown-linux-gnu-0.8.2":
"f44b3870a323ba5dbd189c46ef10e565f9ba94c1f675b1daf8d1deab7cda92fb",
"riscv64gc-unknown-linux-gnu-0.8.2":
"87e97d546129846a2ee73516fa71770ee787ee62121ebfc5c3db682ae0f54cf1",
"s390x-unknown-linux-gnu-0.8.2":
"de324cd0b04162e25fd1dc2332b05e556978fec4bfcc3fbea6565e8276caac53",
"x86_64-apple-darwin-0.8.2":
"ae755df53c8c2c1f3dfbee6e3d2e00be0dfbc9c9b4bdffdb040b96f43678b7ce",
"x86_64-pc-windows-msvc-0.8.2":
"503a430df36957f851daedaed707a2ab69ed21a48bd499c2f0f7253ad5ba983f",
"x86_64-unknown-linux-gnu-0.8.2":
"6dcb28a541868a455aefb2e8d4a1283dd6bf888605a2db710f0530cec888b0ad",
"x86_64-unknown-linux-musl-0.8.2":
"2df1c90246ac03b237f997dce0a31a757523a6aaa9a15b26996a9851dc08ad3c",
"aarch64-apple-darwin-0.8.1":
"4dd195318b0ca893f9e51bd243441016fcf721dfc2c29f86ab7de74c1c216e53",
"aarch64-pc-windows-msvc-0.8.1":
"759b952f7ee0f2a556f6470ea48a2a87508f9a5cbd3624c881875c93748389af",
"aarch64-unknown-linux-gnu-0.8.1":
"0604abcd1a9232022f1b093874e6303d2725512f2e9fc324f0ac49a30d1b2de6",
"aarch64-unknown-linux-musl-0.8.1":
"4b87748593ca3fd060b96599494d5bad6e172455208c3d6a0f4d36cc89a435f9",
"arm-unknown-linux-musleabihf-0.8.1":
"6903a6c4ac2f00548a0164ff53ba1898be2e48449071c90bdf38811537ef47d2",
"armv7-unknown-linux-gnueabihf-0.8.1":
"179e0c81217d97eecba4c75566404edf947614f72b0be8b5c975b60b7d973282",
"armv7-unknown-linux-musleabihf-0.8.1":
"f62be877927f3a5e6ee99e352e73af8e1735e4251bb8cf11424f79b560616b20",
"i686-pc-windows-msvc-0.8.1":
"87107714fee0e0b137360b8b5f2425d5994655c58f2743fac5203c5d5cbf2f7e",
"i686-unknown-linux-gnu-0.8.1":
"1689bb02d731cd4e0ad6e9fb384c937d5ea38246f80c4a3f86bd9bf30c395490",
"i686-unknown-linux-musl-0.8.1":
"9a39a92210752fb03436eb9e69a52cade45c6fdad92aca209fef5594df2dded1",
"powerpc64-unknown-linux-gnu-0.8.1":
"5a6bb32ba3f0e26d7a2de90987ba285850a8b405eb402484448c927721fb784d",
"powerpc64le-unknown-linux-gnu-0.8.1":
"0e7bb9f5c298b9a55e019809fbc7d4a88e491ea7b606cd6b4bbc9ab648904af0",
"riscv64gc-unknown-linux-gnu-0.8.1":
"5346c2757546b26fc3b738cc021c3c17e372a08b6ee361cde95a88ee1eb87577",
"s390x-unknown-linux-gnu-0.8.1":
"66108f45f1fe81b7b02c3490debf838a90c818de00dd8c17c45ccad65554f8d7",
"x86_64-apple-darwin-0.8.1":
"96b3836b7bf97a24ac13a8854f2da7cd3a44993820935b29be964d776e3a3446",
"x86_64-pc-windows-msvc-0.8.1":
"b161c45b2a7f97400b1005591d782d2c96ea1c4570ac1336cd82a2500dbbed1f",
"x86_64-unknown-linux-gnu-0.8.1":
"abaeb153d85cf57277945c70fe449f813b14aa1913d1caa50daf333a01b2f317",
"x86_64-unknown-linux-musl-0.8.1":
"e54c95d4f1420311b7266d57e36304755b24c956a2928f365bb91215e3554c34",
"aarch64-apple-darwin-0.8.0":
"5a5ca58e3999d4f440632da87a56f7030eaaa3a13d3896561eec5fd51cb9ad45",
"aarch64-pc-windows-msvc-0.8.0":
"2fc83c9e2de30c1de8e9461188ffdac75ad41ac1e2227fd158d46b6cd09501d3",
"aarch64-unknown-linux-gnu-0.8.0":
"61f136a187150624c10ec7025137fdf5391ef083a4cab0eba4fbdb2a928de16b",
"aarch64-unknown-linux-musl-0.8.0":
"c5a7c042e40a9acb693c5ee01f26db047b07e4f3f301470b38ee4a2f3e0e831b",
"arm-unknown-linux-musleabihf-0.8.0":
"94c54815e371c93ce08ba5d4b95e7d847d11bdc1ba5af5e15656e6d1be521f74",
"armv7-unknown-linux-gnueabihf-0.8.0":
"57c891ebe985ef1c4e83bbc60b9d2fce40fd6e383db451ac1fc04d60a415022d",
"armv7-unknown-linux-musleabihf-0.8.0":
"fa8a3f50c1ffeb7013a7fb9d9dbba54ff0a1e5d2c4c758ec6fe785c37426ae7f",
"i686-pc-windows-msvc-0.8.0":
"cd03e12986765e48297228678dbeada0c284c552884910bcb3f0ea3ceeec8ee4",
"i686-unknown-linux-gnu-0.8.0":
"ebb52595b6b5a0b6805a50c5d5dc06fd632bbfcce5854228e1e426784e7813b6",
"i686-unknown-linux-musl-0.8.0":
"b9a44b22bb0605f8413d84a811346696b79e624aed850c0087fbea389074d401",
"powerpc64-unknown-linux-gnu-0.8.0":
"7b65a08c8ac4a2fae9f466d94e29896fb5f49f92d72a7c6ac315031b94d43857",
"powerpc64le-unknown-linux-gnu-0.8.0":
"698bc873422f261ec7e9da3ddb3a1b2b2d96be3f4aa6abe566c9d4a315b9d9d4",
"riscv64gc-unknown-linux-gnu-0.8.0":
"c508d286c64d34933f06e6ce04e2aada129e039692a57f6d8adf0bf9bbb90186",
"s390x-unknown-linux-gnu-0.8.0":
"756f55e2567585f1e62522b3e25bfae8c1b7f8a856d2e7ec85b48fcf5abbe9a8",
"x86_64-apple-darwin-0.8.0":
"828917cad79aae8327811c59fcc625ff3861bfe21d2cbb77c206737d41117ff2",
"x86_64-pc-windows-msvc-0.8.0":
"bad5afed0c18bd7f6c5125f5c7ab89ac830a3db7340c96d50a50527e9880cdfe",
"x86_64-unknown-linux-gnu-0.8.0":
"a7d74ee5c5ff3069b9d88236a05f293cc4e2809bad872f3a88a384489ba3675e",
"x86_64-unknown-linux-musl-0.8.0":
"0208cbcb3850bfc69277c9a16c2b0399218b075dc923aca7e4b576ee4228c570",
"aarch64-apple-darwin-0.7.22":
"707677074a9ae6906d4ccb22089341e3541db78022dc926e985bcc35fbb53a74",
"aarch64-pc-windows-msvc-0.7.22":
"bcbee39a55eca43ea286cbaa467b083888c7811ab8f47458063bc53331224f4d",
"aarch64-unknown-linux-gnu-0.7.22":
"d2ee24524f5ed45baceaddebded48493f7dd2692fad8a1d1796c606134c133b7",
"aarch64-unknown-linux-musl-0.7.22":
"1d524e7d61336ccdc4caa2299df811f318b96d81034ff621b7217d6c440a1702",
"arm-unknown-linux-musleabihf-0.7.22":
"ad458ba424cbd77f8278b634e9e14a2fea0ba1610b7a51b38e611cd8a8072792",
"armv7-unknown-linux-gnueabihf-0.7.22":
"3523c1f0396249bc3eae97f15141921108214e4fdce50f153272c79c91d3e737",
"armv7-unknown-linux-musleabihf-0.7.22":
"b96ec5d9be9527fe3a4e6642e26489cd1b12a8cbd3f2b80145bd61bd4919e188",
"i686-pc-windows-msvc-0.7.22":
"aca18c571d8bd6d370e0440a16544afde421ea01585721a46d3847c11404fb41",
"i686-unknown-linux-gnu-0.7.22":
"ea5f6c1460843bd1c391e06d731278707806666438a9389f957e604f60be3eca",
"i686-unknown-linux-musl-0.7.22":
"e20e7eceb3100bc93ed638d723a5b4f9985dd2650398b3f10b175a93e744c7b7",
"powerpc64-unknown-linux-gnu-0.7.22":
"7e7281c99a62a729483ea0268511bf9416a97f6256cc9123d7910b42d7c27937",
"powerpc64le-unknown-linux-gnu-0.7.22":
"0891f6f9fb7099cf35cc6bf4d3e565504ce793466d0a592056703518cb771dcf",
"riscv64gc-unknown-linux-gnu-0.7.22":
"8bf7e0bff7f1cfa2c8057405c2f5a377c7b864a83dfff8ce045f5773374f7add",
"s390x-unknown-linux-gnu-0.7.22":
"d7aba1fe8783e39f5f05061fc255a28d98eff0b83600915b606903ee1764b674",
"x86_64-apple-darwin-0.7.22":
"af8fb83280a000f5864653ca0c9a1f69bbdbc8b2bbfeb2e1d450ce7fd1518ff1",
"x86_64-pc-windows-msvc-0.7.22":
"ce5c13291643e8306e8d2dbcaf340d36ea985a761a53f2ca0a45e1a8e8936c85",
"x86_64-unknown-linux-gnu-0.7.22":
"8379e040fa1828e662968edaa3856aaeb6e1a0a0ec76ef8583096be1f72f19d4",
"x86_64-unknown-linux-musl-0.7.22":
"0508e73f28fa4024c76c4e0a5e347fea6aeb4bead0234618e6cfb76804237259",
"aarch64-apple-darwin-0.7.21":
"c73af7a4e0bcea9b5b593a0c7e5c025ee78d8be3f7cd60bfeadc8614a16c92ef",
"aarch64-pc-windows-msvc-0.7.21":
"877454562ba2af12a020652fb8f63d14b6c05aa6d1d3497441822c6c0b198541",
"aarch64-unknown-linux-gnu-0.7.21":
"1dae18211605b9d00767d913da5108aea50200a88372bf8a2e1f56abdbe509f0",
"aarch64-unknown-linux-musl-0.7.21":
"6577895c91a6bf6c1fda5f0fdfd07f8ee05f75f24a70a49193f8fb8dcde81fc3",
"arm-unknown-linux-musleabihf-0.7.21":
"cb175698eeb3abf77c00c4d19e9c5e10ed847f6988769f5b18a5c98c1ebd21ad",
"armv7-unknown-linux-gnueabihf-0.7.21":
"9c64218ebc2f96520105fddf3b500026a50d9319c7faf4d2221a7113efd96fd7",
"armv7-unknown-linux-musleabihf-0.7.21":
"9f83f0c4821e572e9289e270e64429495b188e372519ee88524e97b50943e657",
"i686-pc-windows-msvc-0.7.21":
"aaf3f3bc934616214e1f33ccb22432dc59110211b2b15636d66e8e42e9cf2f6f",
"i686-unknown-linux-gnu-0.7.21":
"141a4ecfe0bf08e82fe5834a0fd265cf3c27833c1bfbab69344efb1604c2d964",
"i686-unknown-linux-musl-0.7.21":
"ae1faeda2475f0df8733215133771da58de159d9e7b5a728f30047708e21a724",
"powerpc64-unknown-linux-gnu-0.7.21":
"bef76b3992d21682dfc82e096d18f449d43a757f28a00a62eb7e05002349f287",
"powerpc64le-unknown-linux-gnu-0.7.21":
"107c6c5a444c27bf772b1ec233b5b83dffd79348488cccc832dc9c14ee5ddf56",
"riscv64gc-unknown-linux-gnu-0.7.21":
"c5c160e64809ae29404354e555df7264763f7cf67012ffc1350619cc9d19299b",
"s390x-unknown-linux-gnu-0.7.21":
"77f3472201867a766e6f2a37ceb2e2f2f78343d3460c2313e3643483c80ecf92",
"x86_64-apple-darwin-0.7.21":
"f8a9b4f4a80a44653344d36b53e148134176e8f7cc99f8e823676a57c884595e",
"x86_64-pc-windows-msvc-0.7.21":
"7a4e427ceaf3c7d8437e512cbc25af84796c4079cf842c3349d4b646a9209da5",
"x86_64-unknown-linux-gnu-0.7.21":
"ca3e8898adfce5fcc891d393a079013fa4bd0d9636cef11aded8a7485bcba312",
"x86_64-unknown-linux-musl-0.7.21":
"7400debadcd63e530cf58c3cfc71d43d5a1017d2f699be86c6e91d7dc2073c7c",
"aarch64-apple-darwin-0.7.20":
"69da236af5934209a5c059fff1b2f69068918c423601f42448b1d92336853127",
"aarch64-pc-windows-msvc-0.7.20":
"34f3720cdd736f034f3b0d1b03d6b74b85d3528ccefd3552b3aadf455f191b2f",
"aarch64-unknown-linux-gnu-0.7.20":
"675165f879d6833aa313ecb25ac44781e131933a984727e180b3218d2cd6c1e9",
"aarch64-unknown-linux-musl-0.7.20":
"0f68f4a4583923635e56f7f930526bbbcc14d090f1c1a7ec1d28cc4ddad05279",
"arm-unknown-linux-musleabihf-0.7.20":
"9d3eb7fd1e3580a40e5d3f25db5d8a0719fb77be1d750b4849f6dbc96885e39f",
"armv7-unknown-linux-gnueabihf-0.7.20":
"775c3634a1ed7f0c23e5ce8e418acdb394fe87df1ac21af9f274e1e68df0d9b4",
"armv7-unknown-linux-musleabihf-0.7.20":
"27ac3e7f44c1af5bb9f01560e1848893e09c502a85552521cc9cf0d2cd4322c5",
"i686-pc-windows-msvc-0.7.20":
"90367e9f5adc46d6effd2b2107bee5f900f959c64898ae3ffb1e28b9519b15e5",
"i686-unknown-linux-gnu-0.7.20":
"9b53f988b7024728da39fc3e4217bf8cf233d1aa7afda20599dc3acb2049f328",
"i686-unknown-linux-musl-0.7.20":
"fa3091a175cdba4202367b30bda899bc3ed3b6c2161b7c42500c3bd1b388c3e2",
"powerpc64-unknown-linux-gnu-0.7.20":
"84b76581c50071a87609d340050b2cd0ba7fad7e929106202d4c99f4c5a41243",
"powerpc64le-unknown-linux-gnu-0.7.20":
"25082231ee1b479cc9fc486949e3196affda09b82bf0c6b3c8eacde37f56e9db",
"riscv64gc-unknown-linux-gnu-0.7.20":
"339015c2c934b93355a972c737f649fdf96abb699bebbc1b0955de9e5fff04bb",
"s390x-unknown-linux-gnu-0.7.20":
"16819d631e56438ea2e58b60bfb99feb8b2b8cdbec73e375e21c6dbe1de8c725",
"x86_64-apple-darwin-0.7.20":
"0c0edf17aff045bcb9bf89ffa43fefaec2d6585ff69debdb0ade62608f8ff069",
"x86_64-pc-windows-msvc-0.7.20":
"ddf35e258c32971c00f3f4213cf1b5cf0847a42dac578738cb294d379e4a9f6c",
"x86_64-unknown-linux-gnu-0.7.20":
"10f204426ff188925d22a53c1d0310d190a8d4d24513712e1b8e2ca9873f0666",
"x86_64-unknown-linux-musl-0.7.20":
"c8efa6bacde9154aa705feb35985cbc852d75c7d634e8a6867aa2f5571b27a62",
"aarch64-apple-darwin-0.7.19":
"698d24883fd441960fb4bc153b7030b89517a295502017ff3fdbba2fb0a0aa67",
"aarch64-pc-windows-msvc-0.7.19":
"c843b95d9bad3e364ead2af00b793d42156cb4f8ac0c2e33bfd2b3e50a0efc86",
"aarch64-unknown-linux-gnu-0.7.19":
"31b81b4b4ecd51ee4202f1e710fc22b72666f716ffbb825aa397c8246624d60f",
"aarch64-unknown-linux-musl-0.7.19":
"e83c7c6d86c8e7456078c736a72550ce20222df8083f9317fc58cd49422ce5eb",
"arm-unknown-linux-musleabihf-0.7.19":
"fe9834d5383feccd095cbfdbc290d7379f64bafc894ae8d8eb0724edfa754853",
"armv7-unknown-linux-gnueabihf-0.7.19":
"6678e4d1a91349dacd3405b0efa88656d1c8a16fa7ccea822c368039988f8339",
"armv7-unknown-linux-musleabihf-0.7.19":
"3022a75e757a31978e896e2e3fc2cf2dc966267a8757a270be0b421f541467e4",
"i686-pc-windows-msvc-0.7.19":
"063829d117c2e42322b0e3a59ee91020dcb1d95522889b903ffad392df197a11",
"i686-unknown-linux-gnu-0.7.19":
"1785537fc65a35609dc33063b5f1cc85437a08ade4c0a832071c018481afe515",
"i686-unknown-linux-musl-0.7.19":
"e64bc4f74cee116694ea63ad0722245f62f386de271be1a1c28a6e4fd977326e",
"powerpc64-unknown-linux-gnu-0.7.19":
"fb8a4a0d20dd3e236a88229e15af89fa3144bd06c4087dbfc7ba8ca691b0a953",
"powerpc64le-unknown-linux-gnu-0.7.19":
"b335d0593c165fbfcc51915b3eb056f45c5691d06744a5ded7210d789469870a",
"riscv64gc-unknown-linux-gnu-0.7.19":
"36ccef1387594e8fb212257fbeafa9e260709b363e1b262f43bd5a679134e4ac",
"s390x-unknown-linux-gnu-0.7.19":
"08ac0245d24ba16bbf224b00e8bc8021d081f9dcfdc61881cb6e4ac83954705a",
"x86_64-apple-darwin-0.7.19":
"40667bcb615b5af3e373ad611c4a9b95639b97e19b5924a436df8e69ca9331e2",
"x86_64-pc-windows-msvc-0.7.19":
"3098b38638b271d8b14b81247d6d69bb105807ec9fc5eb85f8cc8b6de5867c86",
"x86_64-unknown-linux-gnu-0.7.19":
"5ad6f11d5a04cb3af2418666031f20b63190f82032ec5a7f3a174385cc5567e4",
"x86_64-unknown-linux-musl-0.7.19":
"6236ed00a7442ab2c0f56f807d5a3331f3fb5c7640a357482fbc8492682641b2",
"aarch64-apple-darwin-0.7.18":
"c33cfaab95da1413a0403f643b7edb1c5af6798d8a2370196a80fc37b894df48",
"aarch64-pc-windows-msvc-0.7.18":
"c9c78de380e459f8424f648d107d4ab5286273ab19622a5d17796dc6689de453",
"aarch64-unknown-linux-gnu-0.7.18":
"2af8d0d963f547deba09c52aca79a26113f0ed5c903c101241fedcac90c2d8f4",
"aarch64-unknown-linux-musl-0.7.18":
"32872da98e5c48945e45406d427b3b4fdc11f04e4b8f297f49f76724894eb61b",
"arm-unknown-linux-musleabihf-0.7.18":
"c6c9e718aee25142139b25bf6bb5f9566c57812abced3efa71b4677ac3ef1275",
"armv7-unknown-linux-gnueabihf-0.7.18":
"00cdc4c898a251ea0c12f5db7b22929ff6f73f87a51fc6f874dfb57aecdcc995",
"armv7-unknown-linux-musleabihf-0.7.18":
"92a07d26943b5e223e941b64fa22e048c13fb6462ccb35f18fe2e212cfdc1c18",
"i686-pc-windows-msvc-0.7.18":
"4293c65f1fce52bd5396ec4419ce1c76412e276e0f292ec2464c319b7f8d59be",
"i686-unknown-linux-gnu-0.7.18":
"e5db36cb7b7edbe405c70211802ffe3b161983027f7644ca9ddc9ed5605dd504",
"i686-unknown-linux-musl-0.7.18":
"5829e240206ca895f8e500e9432dd87553091459a80d2a40c0d144688d443336",
"powerpc64-unknown-linux-gnu-0.7.18":
"927af365bc8388da27d241149a52ee3b9772db87ebace6fec6b00062aedd4a24",
"powerpc64le-unknown-linux-gnu-0.7.18":
"dc7ca0bca11efd40a4f85c40e2d83d830dacb7b0f9626bc40360a6697aa035e6",
"riscv64gc-unknown-linux-gnu-0.7.18":
"2cd75769322d264151e9abc2cf89edd086239afa00c0a1354d52a700657f7deb",
"s390x-unknown-linux-gnu-0.7.18":
"bc63ad2eefe5278b121a78255e8c488eb69ae29784b69012439ef365701393db",
"x86_64-apple-darwin-0.7.18":
"7a4a3350224a3a3904589ea306041af68686d72ec4d4b68e34c15d25dfc5cb4a",
"x86_64-pc-windows-msvc-0.7.18":
"5a5b3ef7c6aee0bb1101ef047f35a0fc7cc82e34eef3286e54c5badd261cb599",
"x86_64-unknown-linux-gnu-0.7.18":
"bcb8093f59eb08539087faf895ea1e794fe3db395de79eb41ddaa41d8c25adf7",
"x86_64-unknown-linux-musl-0.7.18":
"c8b51ed978b5f95a7c34dfe39e1dce966f7497fc12179f27507d507d9f3ff40b",
"aarch64-apple-darwin-0.7.17":
"0777e13ba598ccb9a9f78df209c98922b219a195765b9f1b309457a08cbae43d",
"aarch64-pc-windows-msvc-0.7.17":
"be0e7263e4106ca73ac72b4f84ae1c203db446d42d764b2b6459bf1d84aa1859",
"aarch64-unknown-linux-gnu-0.7.17":
"b88fda8f37769d445dd4b433c83490112afa18fc009b75e3cb28412a1d189c53",
"aarch64-unknown-linux-musl-0.7.17":
"789f3749497181311fbc27d2da322f4f836d814389901e8a7917ee664f500a6b",
"arm-unknown-linux-musleabihf-0.7.17":
"7f39a83f2cd7925aa25020dce70f9d2617213b710aec1c9fd686c3314ee814a2",
"armv7-unknown-linux-gnueabihf-0.7.17":
"9a4ee0fe51b07b8badf7ca874b3a065a0d2cf3b04c69aa2c7618c03d6ddd46ce",
"armv7-unknown-linux-musleabihf-0.7.17":
"6a5d3fa02a7bb5696ac392d6277f29174f27bc38e0100016ee67c55c8a472e3b",
"i686-pc-windows-msvc-0.7.17":
"45ffa8cd52e6a0764c2bde7c97be840b6c7606f976e6ae51bab394a891653f52",
"i686-unknown-linux-gnu-0.7.17":
"043897d13541c11c1221761c768d4234b889ce1fa39f1f27a567e11ca2c86233",
"i686-unknown-linux-musl-0.7.17":
"0d7a846ff1ae9d620243da530adcc468bba4aa317cb3ba4210c724e2ec5734b4",
"powerpc64-unknown-linux-gnu-0.7.17":
"46331c3771dbc8aaaa4c75421b6195edb763bac5ca4b8d551efd2da013351252",
"powerpc64le-unknown-linux-gnu-0.7.17":
"9f7e13304c7f3977c2e1eaa068a6beb36e6974a2abcf8cb1b8e0d8b96c251203",
"riscv64gc-unknown-linux-gnu-0.7.17":
"789fea86b495397c7bd12c92221259f07c78ba738d568757b06500ac94b6ebe8",
"s390x-unknown-linux-gnu-0.7.17":
"208c6609012ca921aa3ca67d49dde34464e405041b1d8b041c15078687456570",
"x86_64-apple-darwin-0.7.17":
"c0aff6481443e7dc38c01dfb3535814db42c00ad3ab374e7b4ed4ebb7f5b2237",
"x86_64-pc-windows-msvc-0.7.17":
"b49d1a02662ac4a490c886fff8a340a4adc32da8d0634fc653a69459d2b5f863",
"x86_64-unknown-linux-gnu-0.7.17":
"e9bf64a66a318a82d3c37a74c31527df0ac7e7c821a10f5e1032415f000d7d43",
"x86_64-unknown-linux-musl-0.7.17":
"ffd877241741df0a6436ba6ed0d8cd6573f1f922ede3a967c32c57d2133c72b0",
"aarch64-apple-darwin-0.7.16":
"a157919a2a615fac5de0fcef5120a63de7e6582fb6e0ae4428238af347ed1054",
"aarch64-pc-windows-msvc-0.7.16":
"a832dd02c44cd8d373b226ca34128982aca5303dd3b477c90c5a1f83efa874b0",
"aarch64-unknown-linux-gnu-0.7.16":
"4ff5b8542514b453073cad1dfba08db751ada21981b869c69a2ac29fd639b586",
"aarch64-unknown-linux-musl-0.7.16":
"c1536a85aa85cae05c51d25b2819c5b9869f67c66c65948aadeb0c38c4bd51b3",
"arm-unknown-linux-musleabihf-0.7.16":
"20902d98f9a309df2a83ffd31ecfda444dfb75249c2779eedaeed7d73274f34b",
"armv7-unknown-linux-gnueabihf-0.7.16":
"72afc7e60eff20a1c2181f88c9d96e06553f854192b3a13069aba0f8b045a839",
"armv7-unknown-linux-musleabihf-0.7.16":
"c0b5300958a489330a9790b701f1491a1bec72e402281cdaf6a2362b51fa4c13",
"i686-pc-windows-msvc-0.7.16":
"6d4c4de0cc8c88fb7d94138c05091dac6746a7bc9d94b3743e804a485546154b",
"i686-unknown-linux-gnu-0.7.16":
"ee03aaf5d736524a8b6e74c273d5877be1bb720933cb8f7f5e70b42c70933418",
"i686-unknown-linux-musl-0.7.16":
"b815f060a689e0fe95ec36498533bb261b92dab5cdb60b02cc19fa30c6cd7e57",
"powerpc64-unknown-linux-gnu-0.7.16":
"a2b78151e50646b26cacef24de87d625d4b100efe69347c88a8a6d340b0e82cb",
"powerpc64le-unknown-linux-gnu-0.7.16":
"c231b3880c6584b6fe411b0c7507ed0c091856a64f84720b732ddd39b21b7e6c",
"riscv64gc-unknown-linux-gnu-0.7.16":
"6be4c3e27989ffd49befc689884b78b55c53c817a27040b8e232edd92185b037",
"s390x-unknown-linux-gnu-0.7.16":
"f4e1814f2326db1eb0d0d2ea96ee36c361a856e8c9d8d82817936aad9baa4299",
"x86_64-apple-darwin-0.7.16":
"414cb3c348b0482bc88fdabbc267973a11401e684a78fd471b2c4553fa8b6965",
"x86_64-pc-windows-msvc-0.7.16":
"409d19c14a9b1ce83bf7331dbda89984802efb3a2fbf9ffdf149b22ab9cf2826",
"x86_64-unknown-linux-gnu-0.7.16":
"c51f5dc9fd33e789992839d2957d6cfe0b6dce1cd7ec641740af456b12e9d468",
"x86_64-unknown-linux-musl-0.7.16":
"34c9da84a673e6c06d2e081d72d953f278fe5bb6aba0437210ba62817b340eb7",
"aarch64-apple-darwin-0.7.15":
"7a20f3d33cbbc75683d66e0562d4bdbd702ca656d7dc1b7be3c592de6a6517b9",
"aarch64-pc-windows-msvc-0.7.15":
"d15770be109fdde45c60a522fcc97bf19e0d9d9de8a0d2f0dadc772786110123",
"aarch64-unknown-linux-gnu-0.7.15":
"a8241809c6efcf5ff649d259276dabd297a2c46e9e2f78891a1f9b8ae858e1e8",
"aarch64-unknown-linux-musl-0.7.15":
"4351c1e2ec13f5eb4da058ac1c39f00ae3042de9d6fdb6480e0170f32813210f",
"arm-unknown-linux-musleabihf-0.7.15":
"26c7f1baf3f14857d8d5d2df86ea47a3ce5a0e6223c1db9af2a32bb3d216d5f1",
"armv7-unknown-linux-gnueabihf-0.7.15":
"6609e0f39c958a2b728ffec99ed53741cee92d5db168fb275448216a9e2f5a63",
"armv7-unknown-linux-musleabihf-0.7.15":
"3a60e3bfc6b927537eff1c6fdb359bdfb5a02a59820bb964e04144d731b12ca9",
"i686-pc-windows-msvc-0.7.15":
"831ac11382c9ae014f6f5d27506c8977bfba5aa6b104e278d3a87ff4d1e311d3",
"i686-unknown-linux-gnu-0.7.15":
"8d11cd225843aa7e7b25a5300721d48519a13bc82fc8b7bf63b063b8520b2db6",
"i686-unknown-linux-musl-0.7.15":
"8640a014e5ef7020b33a8e95fabd5e0c75adf80beeaf265ed50dfe2bee92aeb2",
"powerpc64-unknown-linux-gnu-0.7.15":
"6a4c0fe1075c4f3b9dfb8d0654a58ca547aaa84f829bc9e1b60a096153d18686",
"powerpc64le-unknown-linux-gnu-0.7.15":
"81f6d18b857cc3517f249fd7e321b9cad6e6c17bc7d7ad88cefc0c25cca3e486",
"riscv64gc-unknown-linux-gnu-0.7.15":
"6a0a6ef8fa3d03b6a6cab9185cd84e28c78db1e5736efa711e6f5efa4e6c27e3",
"s390x-unknown-linux-gnu-0.7.15":
"d5a2343934c7fec124fb0a140b12c4dd30e20c5473e67b11d064f5b6e52eead0",
"x86_64-apple-darwin-0.7.15":
"4c7c1fe116566b6f8725a3801a33fa5e066b8687643acd73249e5db1351c2103",
"x86_64-pc-windows-msvc-0.7.15":
"b78c2d265e74b21b1c04b5b4ffd61c5c7b8110f9188e24949ee9f6fd5fbaf0a8",
"x86_64-unknown-linux-gnu-0.7.15":
"b1dc0892749e93382decbd894755be0ba1535587f0bb8333572b072d1b0f652a",
"x86_64-unknown-linux-musl-0.7.15":
"c97afc120614c88bd8c13dac2d35015bc59656289633d61bc438e7e680a38710",
"aarch64-apple-darwin-0.7.14":
"7cb9cb6b3005a16356493887d7e7e297237b754b5753b91e826ada98ab2da172",
"aarch64-pc-windows-msvc-0.7.14":
"f28f27e529e30e96e7b289b724c8229cfc5ca25312c23bdae089d6998ffd0aae",
"aarch64-unknown-linux-gnu-0.7.14":
"c0932f428d24d87aaad6a6b7ad48aa09f260d2da5c69e877acd87c3ac90fbbad",
"aarch64-unknown-linux-musl-0.7.14":
"30e41b1f68b3e57c1375c0b2e7fe932a9eb5487fbcef7c4c7d03def3e05b9f7e",
"arm-unknown-linux-musleabihf-0.7.14":
"3b494d3d6a892d9c03d1fa6dcec8ac6077653939a6645570ab6f1f40adbd0b3c",
"armv7-unknown-linux-gnueabihf-0.7.14":
"d5d1f6c49559914678267ce9f3a57528ab45e26e907a816736306b4f10a7b4b8",
"armv7-unknown-linux-musleabihf-0.7.14":
"0016d3138edc52de9f2f4b0587afb6b579dc3bb3abfe2df151f97cc43a4ab421",
"i686-pc-windows-msvc-0.7.14":
"42391f3a71229342b17d944e956d116aabc5147b0ed28a26c59601feac1f24cd",
"i686-unknown-linux-gnu-0.7.14":
"71c358c315da7ddd2de334fe52a54719f9bdac8d6970e7966e2d080ae73ad028",
"i686-unknown-linux-musl-0.7.14":
"d02de9391fe7b7d7e97dc2fa63a539201a31eb51d2c6a87b7570cf8a5ac22398",
"powerpc64-unknown-linux-gnu-0.7.14":
"a2a43332f860520f7cd3d32f5a4ed5e0d938cc59e025372f8f1bfe47ea64355a",
"powerpc64le-unknown-linux-gnu-0.7.14":
"3c545528b601a75baad5e1cc93cbf973123e9e6df6d905b432d91ba9ca769c0b",
"riscv64gc-unknown-linux-gnu-0.7.14":
"4085fd8d4acb0a50a012fa63ae37e50472bf8742d58f4943529b5b5bda95a1a9",
"s390x-unknown-linux-gnu-0.7.14":
"b20a69092f3171dd99445fe0d71e3ed3e67ff85346cb0723a43a1b8d55ce0f33",
"x86_64-apple-darwin-0.7.14":
"352a56bb3823040f19f936dd5e277340cd304da03e5b00c0959800a72a9f55ac",
"x86_64-pc-windows-msvc-0.7.14":
"f9ac952c69d32b2263ba19ba93d18d9e708dcb9bddb8124555bbda96d6d5168f",
"x86_64-unknown-linux-gnu-0.7.14":
"2b38641d02bf107c5099f09778fda93bbaa4a4a2ee44ba303a4097102254e5e5",
"x86_64-unknown-linux-musl-0.7.14":
"8c62a823744630e6cf3fdf0bf38c4fe4558bfcbe082b076a76446a3aab2af5f5",
"aarch64-apple-darwin-0.7.13":
"721f532b73171586574298d4311a91d5ea2c802ef4db3ebafc434239330090c6",
"aarch64-pc-windows-msvc-0.7.13":
"bb40708ad549ad6a12209cb139dd751bf0ede41deb679ce7513ce197bd9ef234",
"aarch64-unknown-linux-gnu-0.7.13":
"0b2ad9fe4295881615295add8cc5daa02549d29cc9a61f0578e397efcf12f08f",
"aarch64-unknown-linux-musl-0.7.13":
"52baba71881c978d32b7c32216ad0cde4546a4dc62e606c9834ec4616c1610eb",
"arm-unknown-linux-musleabihf-0.7.13":
"ff2b11fff489301f9d55c851b9ebce7ca5530d743d2c0a3861cc45896715ea9b",
"armv7-unknown-linux-gnueabihf-0.7.13":
"903350811ee31b2b758c8afb853490c27a34382a535b236739705b104bc13894",
"armv7-unknown-linux-musleabihf-0.7.13":
"7e3b2aa966c54ced0fcd9febea6b913ee7ea12ee85246513895f199ab13296a8",
"i686-pc-windows-msvc-0.7.13":
"5cf71014fde208ee0833026b3828007f8eaf514ec003784dc1ae92633877179b",
"i686-unknown-linux-gnu-0.7.13":
"ff031258ff08b3aca46648398e21fe9679744501e3c9a928c8e42d596a708bbc",
"i686-unknown-linux-musl-0.7.13":
"41851d695bb5401bce5af81a156d63215087cf8e8e1275e69dd96de4bfa30c26",
"powerpc64-unknown-linux-gnu-0.7.13":
"02a80ce1436bf673b0d7276bb24dea0bbc70958dc91e5fb04ad37ac515be7424",
"powerpc64le-unknown-linux-gnu-0.7.13":
"60c8907cce089de97dcce732ae363eda0620f7196c25e8bd539f168b93f9e34c",
"riscv64gc-unknown-linux-gnu-0.7.13":
"521a5235bc5a053dd7f0221c363544cef6d033064cc9d92dbb4ef19771000052",
"s390x-unknown-linux-gnu-0.7.13":
"41e4b6093dd408b41dffb4c9e08c4aa31424ee4573ce9c95566c2617f7f2d0c6",
"x86_64-apple-darwin-0.7.13":
"d785753ac092e25316180626aa691c5dfe1fb075290457ba4fdb72c7c5661321",
"x86_64-pc-windows-msvc-0.7.13":
"e199b10bef1a7cc540014483e7f60f825a174988f41020e9d2a6b01bd60f0669",
"x86_64-unknown-linux-gnu-0.7.13":
"909278eb197c5ed0e9b5f16317d1255270d1f9ea4196e7179ce934d48c4c2545",
"x86_64-unknown-linux-musl-0.7.13":
"560bb64e060354e45138d7dd47c8dd48a4f7a349af5520d29cd3c704e79f286c",
"aarch64-apple-darwin-0.7.12":
"189108cd026c25d40fb086eaaf320aac52c3f7aab63e185bac51305a1576fc7e",
"aarch64-pc-windows-msvc-0.7.12":
"fbedfb71356d0e63c86b507cf1434a58406afe6eac77aee9d37b8282d4006e14",
"aarch64-unknown-linux-gnu-0.7.12":
"23233d2e950ed8187858350da5c6803b14cbbeaef780382093bb2f2bc4ba1200",
"aarch64-unknown-linux-musl-0.7.12":
"0589f6d27bbbe2e205aa6fc25e4cd28ab97e984cdba20842de8d3a00714e13e9",
"arm-unknown-linux-musleabihf-0.7.12":
"6996e32ac1c37af33a4c6e40ab0126a82d62ccb94edb164b7dae554be4dd8336",
"armv7-unknown-linux-gnueabihf-0.7.12":
"aee2dc202deed7e15984d71eb59803111052fbe8c0fb3ffad27ae0a6d290d74f",
"armv7-unknown-linux-musleabihf-0.7.12":
"87bd7676d31858d9e1937ab69d13e30cc93ebb09fb246dde6a8f183e9570a82c",
"i686-pc-windows-msvc-0.7.12":
"c7ec71ba64d01ef3cdb89553445de94ab4fd7375c8f2a7068353aec7a3a06342",
"i686-unknown-linux-gnu-0.7.12":
"d1def68ff10b30327a5cacab497664aaf8338e192ba277b76f45dad63208f2e2",
"i686-unknown-linux-musl-0.7.12":
"f56a0a9c84b35b7e910c4d628c667b843fb3fa1d9dddb0bbf4bf3f21eeaee07f",
"powerpc64-unknown-linux-gnu-0.7.12":
"6eafb546d1b8642a5c27e4dfda213659fee41b0fd150b4c33ef96c917e595344",
"powerpc64le-unknown-linux-gnu-0.7.12":
"0d550348d7a0f54352824cd751dc7baea0c23b17d744a5a7784b6b825e5fc909",
"s390x-unknown-linux-gnu-0.7.12":
"76f5a2c1c13446233312d140136f3f55fa7c162176327830eb109ccaae6c9cea",
"x86_64-apple-darwin-0.7.12":
"a338354420dba089218c05d4d585e4bcf174a65fe53260592b2af19ceec85835",
"x86_64-pc-windows-msvc-0.7.12":
"2cf29c8ffaa2549aa0f86927b2510008e8ca3dcd2100277d86faf437382a371b",
"x86_64-unknown-linux-gnu-0.7.12":
"735891fb553d0be129f3aa39dc8e9c4c49aaa76ec17f7dfb6a732e79a714873a",
"x86_64-unknown-linux-musl-0.7.12":
"bb493f1e6ae426c06b5a103cb71aa60c678976d2377f0590644538658656c2a7",
"aarch64-apple-darwin-0.7.11":
"b5f4cb27a3002d6590c3681377c6d826db0b52e2a9529c7144fcd53fec89ba79",
"aarch64-pc-windows-msvc-0.7.11":
"856bac93344a6980b2703a4143f26fc042c941b02f11ed21f55ec6be3fdfde87",
"aarch64-unknown-linux-gnu-0.7.11":
"80cf695c4e10b532e9db3c7fbbcfb0f8356f2e70e7a4a5040e005f0fae70923d",
"aarch64-unknown-linux-musl-0.7.11":
"2ad20d143c74d7f63d1c99db3999f239f045b7be041e23f6ac8b269c99fa54fe",
"arm-unknown-linux-musleabihf-0.7.11":
"21fec46f09d96cd9f51378fe01ed050dd2032c1fef823f8bd81fa50a2337bbcc",
"armv7-unknown-linux-gnueabihf-0.7.11":
"1a75aaff4695c07151d5b9abb50232ea9fb6f5ccc82d4b319abd8796605d9db8",
"armv7-unknown-linux-musleabihf-0.7.11":
"431b3115ab8fb5e2210d01f29b7901e6eb1174ff65545ec49318d6d4adf4c802",
"i686-pc-windows-msvc-0.7.11":
"985f5eabf42b8ad0166ae6b9f799564220fa932938a8401c890d5e07321ce7c0",
"i686-unknown-linux-gnu-0.7.11":
"619e205d56594fc530dbde6c6a543dd094c796791a5e2cfcd3bb70fa5767bf9d",
"i686-unknown-linux-musl-0.7.11":
"838c6336ba8e88818459b10c3520e83601b9c0a9850a209accef9782c050faad",
"powerpc64-unknown-linux-gnu-0.7.11":
"769c7f32cbc2ad918ccf9ae661d99a6c0d0fd3a0056691832b4a79049a9d06ec",
"powerpc64le-unknown-linux-gnu-0.7.11":
"c9bbbcc2d4f11c83e0edbff5868d95f07f81455adb6f2f909cdb9b992928101b",
"s390x-unknown-linux-gnu-0.7.11":
"0e7b9b27e9fef1b42aa052173a2a47a2ec33bad82425237dfac402b7f69bd073",
"x86_64-apple-darwin-0.7.11":
"97980b067dc3fea16534371b030eaf38554d701de5058004edcfd542a88a2e84",
"x86_64-pc-windows-msvc-0.7.11":
"0f4ef69fde75bb8bcfba7ecf0a4134d8875578cd2e98c9fcfc21573e746c70ac",
"x86_64-unknown-linux-gnu-0.7.11":
"df54b274e99b7ef26030dc21d105ce115bc21a644fc6a321bde9222cb1616de6",
"x86_64-unknown-linux-musl-0.7.11":
"e4e8948645ebea1950a3c77574ce079dfe1c71547ba5a8a141d6e362fa036684",
"aarch64-apple-darwin-0.7.10":
"316b80c19832ff4085748c3a20a3e05f36e1d19234e8b9399a6fd1c971241bce",
"aarch64-pc-windows-msvc-0.7.10":
"1eed0f11bca79403648195f8ce257763d956e861cb73de98c480dae15358bb26",
"aarch64-unknown-linux-gnu-0.7.10":
"8746acb754807050124c6dbcb05fcad2665a3f0cdb2a0fe9de528bd37b092656",
"aarch64-unknown-linux-musl-0.7.10":
"f9000f08850a5c575d5fe1ddc2ec928ecc9f287ecdcd9fa1ea4e3f405b23d4a3",
"arm-unknown-linux-musleabihf-0.7.10":
"657b1b8a534f7fe78e63aff56aac5bbcb21f6254df79825fe204d5c7c1219653",
"armv7-unknown-linux-gnueabihf-0.7.10":
"1cf4a8f40abbd802a7b44fe9695da356701100d267eb3567c17db27e0a24cf69",
"armv7-unknown-linux-musleabihf-0.7.10":
"5282b825f469295dc2b88c94eccd375a93135a279b0711cb10e615e7a71a0617",
"i686-pc-windows-msvc-0.7.10":
"f3c62ff935685d9d4312b82d01ed386493b97c3d22bd434d943fc99ce9aef83a",
"i686-unknown-linux-gnu-0.7.10":
"24a2a3eb0e89b74de6aac492516303747519439775d22254e838d33410ac27b2",
"i686-unknown-linux-musl-0.7.10":
"e317d35af60b38ad32935390a83d12adc3ed7ffdbc2ccccd3039bf6cef650eb3",
"powerpc64-unknown-linux-gnu-0.7.10":
"c1ab41ec53cd720179f3351b61b4ded73ec520804413b75051736829a125e4fe",
"powerpc64le-unknown-linux-gnu-0.7.10":
"ce2c3fdf177facf6c77c5316bb54b9deaf498bee9f664e01a4030ecf27063ab1",
"s390x-unknown-linux-gnu-0.7.10":
"b7603e3f4494e9093a86ace1103e3fcfa172a952989f0c7dca6eeac7f77be81f",
"x86_64-apple-darwin-0.7.10":
"9123e8aa944654404787f80731ec08850c4e9b9129c0d0445c9e41438828b8b8",
"x86_64-pc-windows-msvc-0.7.10":
"1568a71af55e9d9bc4a050ec79134a342a8a3765a73f6b7ec26490c2814f8797",
"x86_64-unknown-linux-gnu-0.7.10":
"ff2ef46298963fee8104ccb3c0a4ecbc97c057ac6a0bc5fec7636c855384252e",
"x86_64-unknown-linux-musl-0.7.10":
"b2cf1f63e83a873652ffef032681bbbe1469e3bab617f7e715e09529c30f5689",
"aarch64-apple-darwin-0.7.9":
"7a8b716a2b5905fb89512371ce6c6dbc0dd0344185bd1cd93a3fe27516eef7ec",
"aarch64-pc-windows-msvc-0.7.9":
"63c0990b9c49dc9f9a92aaaa27ba627cbf9cf6b2e42766588ef6f880208893de",
"aarch64-unknown-linux-gnu-0.7.9":
"23242a8051e2191ed8d61f71a6792f2fc069ef18e6cdf07dedac3d3f648643c5",
"aarch64-unknown-linux-musl-0.7.9":
"60f30508c9002b2b7af55d70db2741cf7ea24c066ced710ad09681a6d2d19b3a",
"arm-unknown-linux-musleabihf-0.7.9":
"57d8e43e257f0ccd9df2b8581338c5145b9937aba53e9c9bb81b31044b720c61",
"armv7-unknown-linux-gnueabihf-0.7.9":
"83353ee7e1724083ea94d7f488fa34c9159995a3996f87017fdf72e422c93242",
"armv7-unknown-linux-musleabihf-0.7.9":
"b2d8d81bc2abbdd857bad7cd3bf0d36c5155c0681aae8ac9fb8f49d54b95b3f2",
"i686-pc-windows-msvc-0.7.9":
"b5dc0dc10d9dd0dcf5729a94e98538418760d13877d4d4b1bc4efa9926280e78",
"i686-unknown-linux-gnu-0.7.9":
"fb8f1a7cb593c819c0fff71afa2dc480237ca80a3f5d8d433c8b51d2ae90ffdf",
"i686-unknown-linux-musl-0.7.9":
"a77592be13fea81ca42b2b7815784e769e1fd9ff476cfab69f2652823f99c55e",
"powerpc64-unknown-linux-gnu-0.7.9":
"26fee4867c158c04dd3a51ff9a23b4220a9ba69fae2e71be618d2cfa48164d96",
"powerpc64le-unknown-linux-gnu-0.7.9":
"d588fbb01cacccb7fd6e0f101d34282ebb0569381f967d332f8072055e39840e",
"s390x-unknown-linux-gnu-0.7.9":
"d823d68ff662b7e59c6791281427bf1019dae791a964ffae31ae1d2d723dfc08",
"x86_64-apple-darwin-0.7.9":
"a4c084568850588b77e4a34c21b7df5c8cf9e2160b4d614307ed92fa12411742",
"x86_64-pc-windows-msvc-0.7.9":
"f91d8a3322a10caf257fd416807bd8d2801285b80b46ee37f2d0c6e426b8822c",
"x86_64-unknown-linux-gnu-0.7.9":
"b8450a419c0bcc85841bbed8511eb59e2a5683ddd3f813f2b98b97babf6b1b8b",
"x86_64-unknown-linux-musl-0.7.9":
"95918a1e1faf851a39cad402f1a77318e8fc90b7f829833ebaff27de9722d60e",
"aarch64-apple-darwin-0.7.8":
"ad6b3825ba277de70b9d0a37055f7d828f3f37416aee1cde65000f330efd4587",
"aarch64-pc-windows-msvc-0.7.8":
"e43448e5e3267dffb6bbdc30ffa291f8db664d1da9d084c44f99dc568f459e0a",
"aarch64-unknown-linux-gnu-0.7.8":
"da9e1c97f1452b25c8955127c92da7b68be228ad0b43bf50bba4dadb25c8b337",
"aarch64-unknown-linux-musl-0.7.8":
"4d18efb46f93fa942dc4c212dea3b6b07e3db62fe57d0c3d08de6bf5d9f9bb51",
"arm-unknown-linux-musleabihf-0.7.8":
"133b1c3fb850ec496bfb4ef84379bfaeff1d2c322114a0984d8a5c2e10e63028",
"armv7-unknown-linux-gnueabihf-0.7.8":
"7d61c6e18e81447482dc80c090c65a6615a1232512899943566baf2808ca37bb",
"armv7-unknown-linux-musleabihf-0.7.8":
"0b6d6afcdb7c78e5df42cb2ab0929d2bec2654a350a8efacc6f95e830a31eb6e",
"i686-pc-windows-msvc-0.7.8":
"0d4b01372ca972543cd40366bb5480bb457e79dcf45b5f662721d709d6932dbd",
"i686-unknown-linux-gnu-0.7.8":
"db1c60961aea7a7f8c64a098801e0138e761b7556d1c1691fc4f3f771f0e47ae",
"i686-unknown-linux-musl-0.7.8":
"b765eb1817bc1d545f4860eff0adeb0c7907ea66be14536653192e588386b308",
"powerpc64-unknown-linux-gnu-0.7.8":
"2c894b104195ab194af05c6ad756ce8746a349a8620c83888207db5fccf29a8f",
"powerpc64le-unknown-linux-gnu-0.7.8":
"4b0d93385685f756068f76af1871dcb7cc8f427ab6d650afc07493d06dca71db",
"s390x-unknown-linux-gnu-0.7.8":
"e58fc9f6d846ccbf50d9bcf27920ff4bc061541df8a6a3aa6f13be24981e0772",
"x86_64-apple-darwin-0.7.8":
"f046249639014eb70b43cbaf83eb6f56aac724ada354f9b9aad65f9960737920",
"x86_64-pc-windows-msvc-0.7.8":
"355736ddf9a01ab9da918b35470027c12128d7ed1d7f54f54771507d79529679",
"x86_64-unknown-linux-gnu-0.7.8":
"285981409c746508c1fd125f66a1ea654e487bf1e4d9f45371a062338f788adb",
"x86_64-unknown-linux-musl-0.7.8":
"8a707e45e0d1a8bdbc5bd1af0ae7d19ffab55f3722c5e73471039561900e3d48",
"aarch64-apple-darwin-0.7.7":
"6a06eaa8165d5abd89c3dc37ffbe1db60fcf49a87d7c612bfca7e87a1514695d",
"aarch64-pc-windows-msvc-0.7.7":
"e86cd59f2569f4bf475e5ad944910142c0ab107ad12613429ad8873a6f41087f",
"aarch64-unknown-linux-gnu-0.7.7":
"013061d4d33385e9a3fc52df18d22334f20f12616970b0d81583d5125ce8d6fa",
"aarch64-unknown-linux-musl-0.7.7":
"4014dc9dc024bb5a082f16c54adcd5936d47dae664bafa38453b3017ede41aab",
"arm-unknown-linux-musleabihf-0.7.7":
"c1dc010e3ab855391f3a6906fcffbeac873d136df2b20cfd998105385444e45c",
"armv7-unknown-linux-gnueabihf-0.7.7":
"e08406cfcc1ccc0c069d22c91008967f662664abdbf8a15779a1944070e0f5b2",
"armv7-unknown-linux-musleabihf-0.7.7":
"35379428e6d001e63714449c26c9111d1d5ee6f3b6a95559c724ad57df9d8d17",
"i686-pc-windows-msvc-0.7.7":
"5e47a44df7707b58884cdf5d30527857ec1bf186e8f200517fd11a572669cacc",
"i686-unknown-linux-gnu-0.7.7":
"fc782a829cccb0201c4a918d9f5a3a114511d734953f7e5e60aed52951264454",
"i686-unknown-linux-musl-0.7.7":
"10b852326ee48502d6da26c7fe394345b7ce7ca94d76f293dbe4cde9577c3993",
"powerpc64-unknown-linux-gnu-0.7.7":
"4b26663e0c21289bd21c05a3ba344e6b069c600e5a6333e660ae16eb38027bd5",
"powerpc64le-unknown-linux-gnu-0.7.7":
"e691d6a8a8c285cd644cf1f6d47c2568740ddca645c860f9bb23799790b54e56",
"s390x-unknown-linux-gnu-0.7.7":
"b21953a1c6c5475306e64f9ccf721762d2fc6aa572ee5268ed61a3b1531f06c1",
"x86_64-apple-darwin-0.7.7":
"4b337495ced2a9797357ee853873c2f5a45cc52f6ed68c9feba3c997443452b0",
"x86_64-pc-windows-msvc-0.7.7":
"a27a1fdf3f6b850dfb45fb009f7ea0fe3db1a59f692ebdc64c24ff8dbd0467d1",
"x86_64-unknown-linux-gnu-0.7.7":
"d83e2b9c2b251c93985824d9a12d97f5b036b7a9ff0b7d647c9ca7ae5ff2ae1b",
"x86_64-unknown-linux-musl-0.7.7":
"3876cafbb6599287a78778d2c265fd2050acfc247409ed677a8583f20385a3ae",
"aarch64-apple-darwin-0.7.6":
"a0e7c0e44ec4b2743e1c1d1f6edca1418687b05084f48c007c6e1c7d3a35bcd2",
"aarch64-pc-windows-msvc-0.7.6":
"2ada1290e87144726b6a723b38fd34ce64da5a3fe820a21685564924f894408c",
"aarch64-unknown-linux-gnu-0.7.6":
"4eae30038653bbec528257054fe07495f20c5d4bc663b630258e87d159e282b6",
"aarch64-unknown-linux-musl-0.7.6":
"9e59f0753383d6a27404be238360165e415605b1504b209349852a27cc01d48f",
"arm-unknown-linux-musleabihf-0.7.6":
"b81d59deeba1f92aba48aefce2b364530baa1cb8aa4c59fc2a90c9acf98c9a20",
"armv7-unknown-linux-gnueabihf-0.7.6":
"e9d1b7d52def14fb1ab8af2fa52963ff8e4323934ec2e78720a94d92261fa9fc",
"armv7-unknown-linux-musleabihf-0.7.6":
"c525ad0f41c67d944e56362adffcda206aef36f3ed84daf90386fcbfa4a62c66",
"i686-pc-windows-msvc-0.7.6":
"aca45dbdb75cd2c5fdf70bf5ff436306d476352b135fcab544c4a9759d7d1af8",
"i686-unknown-linux-gnu-0.7.6":
"71448fddb93306b1b67f0c2e711eb79b6ea33d027212259abd7546a48d15b49f",
"i686-unknown-linux-musl-0.7.6":
"a641ada8b2ca3ec22c24414c2edef8c01370d7d4ac79998eac091b84f743c476",
"powerpc64-unknown-linux-gnu-0.7.6":
"9f63727933d11b0157ebc3fd640811c1224fe55215acff24e8ec5747fb4f90fc",
"powerpc64le-unknown-linux-gnu-0.7.6":
"da746e6e809f32ab9709e45c7d5e7c37901478cc610119c08ae335c43ac089b2",
"s390x-unknown-linux-gnu-0.7.6":
"a07d4303e97f72312f9db8a1a67bae08f02d883f1879fa917b9ae87aec90d933",
"x86_64-apple-darwin-0.7.6":
"718cfd68b13a1a642fadc53646742785cd33b2e06124a01454ad358617841852",
"x86_64-pc-windows-msvc-0.7.6":
"4c81818cc89d75ca54762e2641deebad69c0af6594212a9fb24b9849df8ac413",
"x86_64-unknown-linux-gnu-0.7.6":
"0c5f0935bba35359150774fc5876d72947b863b8173c94dda776e6d88014a0df",
"x86_64-unknown-linux-musl-0.7.6":
"be755e8503b7e7174f24ad8cdcadab94f0662fe0b60df4fc35e1ddae48b19f35",
"aarch64-apple-darwin-0.7.5":
"8d82c7f6fcfd79b142c8845f694c8225dd5b401cd720e8e1e2a35a1c4150f516",
"aarch64-pc-windows-msvc-0.7.5":
"9ec005bf0b472d47ab730e463cc5a156b18ca9a9a6fe1c72bf18d97384d0b717",
"aarch64-unknown-linux-gnu-0.7.5":
"715bd03f6b2924b8f742b716d0f4b9d31ccbb1ad4a7f8df4ce2f572efff7f2cb",
"aarch64-unknown-linux-musl-0.7.5":
"ce23f5e1d22f1cdfc0db4358d3b2642c115ad99d404aef15030af31e39ef3484",
"arm-unknown-linux-musleabihf-0.7.5":
"2e85c3ba3ba461822940bca197198babcb1a8ce620c3d1c624423e68bba49d43",
"armv7-unknown-linux-gnueabihf-0.7.5":
"cbd7990fb0d06750f7e966a54dc344396e4d605d029aa94a0cf00d695cb283e9",
"armv7-unknown-linux-musleabihf-0.7.5":
"96d5eb1246e654f4e2c37542797196d94c0d72fe44e470050a9fbf67e356fb10",
"i686-pc-windows-msvc-0.7.5":
"84e70b46e0f218db9573b0efce085c13e0e5ce7808b3143b990d1a334e5a8ee6",
"i686-unknown-linux-gnu-0.7.5":
"20efc06bc129d8757e81fdd00cf828a9c1d928a4a30c8c538c6d1ed219b52c5d",
"i686-unknown-linux-musl-0.7.5":
"3cc8dbcdb230a6abbaa3cd6b918d6150f747f45f8f96b7399d6258c54fab5867",
"powerpc64-unknown-linux-gnu-0.7.5":
"dab5571d40ce3347fe295b9afec9f560ad709461883ae604d0de827071b8d2f8",
"powerpc64le-unknown-linux-gnu-0.7.5":
"4c3843068cd0e1bf9e5f68e5487fba28feef3196c025a1b1eaddd533a52b7bd7",
"s390x-unknown-linux-gnu-0.7.5":
"1b286e386a4d66dd9393caf78888a881cf63202522a6a88262e551bc7b8b3995",
"x86_64-apple-darwin-0.7.5":
"751ae339c91a6b8eddb868a64222c2533c722042476e4f28466683ddf96fa488",
"x86_64-pc-windows-msvc-0.7.5":
"e95cb3789b2f80052c80048ff2865e06eae7512d06d304127898c70c4fd3564f",
"x86_64-unknown-linux-gnu-0.7.5":
"a3d1964080a855e1f8806975b5fa943376045a64852c06ba80540813aa333305",
"x86_64-unknown-linux-musl-0.7.5":
"be058167ae65f7a2b56f607b070bd4e93dacd09be52511ccb8ebb10fa132709f",
"aarch64-apple-darwin-0.7.4":
"1af8c353479890b29b75933706890627555bbc07e12a0117ae62da3ec2ee372e",
"aarch64-pc-windows-msvc-0.7.4":
"3800868f3cc1509d6ea16036e3268ff45fd22a85c922cf3de4fb9535dbb0099e",
"aarch64-unknown-linux-gnu-0.7.4":
"c407e4c7431ee6cb28deb842edb49fea1ee3f5674a357f11244bfb0fd57e2ae4",
"aarch64-unknown-linux-musl-0.7.4":
"ff0d9172d2105da526501e01c38ecf0558ea323cfcd25adff9a89cd7fad5c076",
"arm-unknown-linux-musleabihf-0.7.4":
"4e6b7d15444ae58bc196ee4e7e6e11b451b4e994c0c73968254d3d4ff1c89bca",
"armv7-unknown-linux-gnueabihf-0.7.4":
"303bac0f866c450fefe7543297fa87563941f924cb13f007dfe7cc02ac64dcd7",
"armv7-unknown-linux-musleabihf-0.7.4":
"004e22fe946fabec6b5dff668f4bd8f93569dab30efe0f3d4640f266760744bd",
"i686-pc-windows-msvc-0.7.4":
"113070d23ba1498cf9fff9ae634893a2a1dce42a0baa617c4a82009f61c71fbc",
"i686-unknown-linux-gnu-0.7.4":
"19f0f19dfe9d722a2fb89bde4771682cf632182d6204cc4ddb11d700d5b34c07",
"i686-unknown-linux-musl-0.7.4":
"fe281041401b4140a387f6101e64fcf4abb344791c12398c441c7e339510423d",
"powerpc64-unknown-linux-gnu-0.7.4":
"ef2320254e52234750d9745e6dc6e3b3c990aa51e506057d0869d4d18b55e5e3",
"powerpc64le-unknown-linux-gnu-0.7.4":
"e143278764aab89b68c6f55dfdfa4242c8f5d5213880b584880a776a5ca1b0dd",
"s390x-unknown-linux-gnu-0.7.4":
"14dbae76be8999dcc8336fac1f6f86710e7ce4f4c3e1aec01e7ef7f9a3468811",
"x86_64-apple-darwin-0.7.4":
"a6c5fd8aa67db03447934b14703a2d7bb04b5e5f7ff45630a749760393c5610f",
"x86_64-pc-windows-msvc-0.7.4":
"966d0dd8d86f02f94128714180cd5ff42cd2ea9b33b86fc197f25cfa066aaea1",
"x86_64-unknown-linux-gnu-0.7.4":
"5264d9b2bf021fccbaf6edb97bc17ce4863687745f2443460a8ca71e55891614",
"x86_64-unknown-linux-musl-0.7.4":
"70083140d9efaf82cbb7ffa6231d5de3536d6497ec84d708afaf9b7e2fffbac2",
"aarch64-apple-darwin-0.7.3":
"162b328fc63e0075d4267688201de91356e1c1b81db50419fa4466cfe2dfdebc",
"aarch64-pc-windows-msvc-0.7.3":
"542b318c98b0295dd3d620fbcd63388757f382e14c69c569cb3ce793aa75c975",
"aarch64-unknown-linux-gnu-0.7.3":
"2c2be8bbb83e9bc722f2013de8bb7506cfe6521d0e30b4ad046849d036b3eea6",
"aarch64-unknown-linux-musl-0.7.3":
"a3f01c3c993b57fa8d13855c5ba60e3847bda4f8e795a52d52879e242e886604",
"arm-unknown-linux-musleabihf-0.7.3":
"87f72dc1c3b1b598e08c8efc7f9ab8eca23df8549cf4c1fc27a4a6b2524809c1",
"armv7-unknown-linux-gnueabihf-0.7.3":
"69f285d861cd1809a4bad0f08c2ea8a77ec17cbe20524a4ebbee4c5a7c868520",
"armv7-unknown-linux-musleabihf-0.7.3":
"1a0071551cd575bbecef3218fb13bf05ab96ceb71b4b1d13a99b8a4af059f99f",
"i686-pc-windows-msvc-0.7.3":
"1c9becbc63c15dcf43b09c0ba84e0ba6fa533fa799b7baf57a36363ef42fbc52",
"i686-unknown-linux-gnu-0.7.3":
"a2b56cb262337380aa02b6d131e973d54090c3e655d3e55385d02850454c24de",
"i686-unknown-linux-musl-0.7.3":
"d6e846079ef38929206079147448c5683a3018116b2b3e6059cf4c26bcfbb290",
"powerpc64-unknown-linux-gnu-0.7.3":
"a9b94c618a5d5bc992102733a45759e38db9a9e069830c3e94c744d1bfc33c21",
"powerpc64le-unknown-linux-gnu-0.7.3":
"782e9c343cb7c219b5514e64a799a8b9fa82585f6176b53ed095dc030a22d993",
"s390x-unknown-linux-gnu-0.7.3":
"ea803eafd6e3414d3a18aed9257f8ded8f7d1f6f182d2572969c4c487faa1986",
"x86_64-apple-darwin-0.7.3":
"d676940b51bdd5606b218bc2965fed67731f94ad07926045716acbf78626e09b",
"x86_64-pc-windows-msvc-0.7.3":
"20d3a420abbf2af9699cd9a02225d9325344046af8deb15563cc451e3c4fd059",
"x86_64-unknown-linux-gnu-0.7.3":
"17fc118ba4d7e9303f84fcabdc0a593fc3480ba76eb6980668fdbbb96fe88562",
"x86_64-unknown-linux-musl-0.7.3":
"325143825b88e7b0dadd1a8e8d3cbe4791d3cbbb9e2244350d917803fec8b3d1",
"aarch64-apple-darwin-0.7.2":
"8edc0bea8a9e35409f970b352036326393e79a6039577d8cc9ef63872c178a99",
"aarch64-pc-windows-msvc-0.7.2":
"a3d7affcd62e617bd2dd2a91fde679dd8d68a84762c8f3aaac294606ec14ffe5",
"aarch64-unknown-linux-gnu-0.7.2":
"2872fdf4785666575d129ba90590c44e6508e22584735f3e7e8a30d773dfc3db",
"aarch64-unknown-linux-musl-0.7.2":
"d5b31df40da794dab943c55e67d14fc111146e185b14a6de6eb749ee264a641c",
"arm-unknown-linux-musleabihf-0.7.2":
"fd203cef8c6cd775c2a5f7da31f69a72020a6c74b6fb808db3217ab04b70a038",
"armv7-unknown-linux-gnueabihf-0.7.2":
"b69999c29c759f5a47f71c1f328d6e7c489229efa5ce0e84afce026201730abb",
"armv7-unknown-linux-musleabihf-0.7.2":
"f98a827e198de2d0a7224ecad87eb64c18c9c0ed4f0c768456e9b48482015d2f",
"i686-pc-windows-msvc-0.7.2":
"8b06489b2cc8814fc23dae4562c5e7d500e782c2b0d2556529f515a4d1e0b8e3",
"i686-unknown-linux-gnu-0.7.2":
"36f26a496c6dc53703e070761ef96f07acc88eae868f94c4665f5c17a88d8acf",
"i686-unknown-linux-musl-0.7.2":
"763bf7cd2119c40858cbd0892fd9b2c7102c79e5c590800b2f8e9c2f427cb7d1",
"powerpc64-unknown-linux-gnu-0.7.2":
"bd4a42ed0b9ab725f0cb565ae29c338ea6ce0689ddb35da632535a47c891e72f",
"powerpc64le-unknown-linux-gnu-0.7.2":
"9a598869167b7e56ab971614972a2c486c8137681210094009a6fb61ac36699b",
"s390x-unknown-linux-gnu-0.7.2":
"7dd2240d60b1628869a2348ca0901cceee572bc20116ab04f9484ea0b6d40813",
"x86_64-apple-darwin-0.7.2":
"7d30b59d54900c97c492f3c07ff21cc3387a9e5bd8ca6db2d502462eaaeefd68",
"x86_64-pc-windows-msvc-0.7.2":
"35fd793df52fd13773425c9a97cc94cc13c8ee63abec6380b5083c183c688019",
"x86_64-unknown-linux-gnu-0.7.2":
"cfaab1b5166a6439ff66f020333d3a12bbdf622deee3b510718283e8f06c9de7",
"x86_64-unknown-linux-musl-0.7.2":
"dd10babf6c531597d246c97e55e32ca17b44fe251405fe539ec8ea2f22fac2d6",
"aarch64-apple-darwin-0.7.1":
"236d70d7738a5f41b45253d68665fda039fecee579939921e0795680d300f55f",
"aarch64-pc-windows-msvc-0.7.1":
"5fdbc703e6f22696ac053811e9750ff3cf50814aabf1792b9bc49f2647b836c6",
"aarch64-unknown-linux-gnu-0.7.1":
"ee8a98f485a22837be9e95eb55e4cd06db6c8deba94b6a2dd63d828fb5ef4226",
"aarch64-unknown-linux-musl-0.7.1":
"b65409802669913f5fd49ed6656d45c434aa9273fb864aefa0fbbb685b9834b6",
"arm-unknown-linux-musleabihf-0.7.1":
"96cfceb7716a9003750111c7f1a62aebccf02e0288f95bc670c69062d2ec6e61",
"armv7-unknown-linux-gnueabihf-0.7.1":
"f156bdedd8a969dc49a5e01f6b38c7e50a63cf69acf3b5982adfaf232dfcb80f",
"armv7-unknown-linux-musleabihf-0.7.1":
"ae21a9c0b413976a24c51f095603294ca36da9089813022cb9bae0b84f0be6de",
"i686-pc-windows-msvc-0.7.1":
"38a98c532e463169e8c4f1ae3649dd500c168f6db687e3b29570930c55ffedf7",
"i686-unknown-linux-gnu-0.7.1":
"133a41ae763d8474cc4ff8e0c24ab8cdaf422f261cbcc284f4b90b57aa60f3fe",
"i686-unknown-linux-musl-0.7.1":
"6e55fea1ee9a8c5c1d29b3aeb033a8b01d3895a347b27ee108ba94c53d60cfb7",
"powerpc64-unknown-linux-gnu-0.7.1":
"cd6714a55577d6eb0ecad313646a4ade3c7a4407e1a2a4703a2fbb83c88681d5",
"powerpc64le-unknown-linux-gnu-0.7.1":
"a354eda3a43323cf5445cfdf0197ebd4b36e967df9537e97910c47dcd9321aaa",
"s390x-unknown-linux-gnu-0.7.1":
"59d194c544a8a53186c3da6ac26f90ab0f453fae71fd2e0d4d177a8ed8890abb",
"x86_64-apple-darwin-0.7.1":
"a81e655cc0b6a5ccf9197f2dc0df513171e68804e498c17076d6e56b41234c5d",
"x86_64-pc-windows-msvc-0.7.1":
"b4d48072e384014ecd04ec5c544aee523ead1faaebcd428ba5f6abf2836096df",
"x86_64-unknown-linux-gnu-0.7.1":
"cec71afc57276b1857970d6ec96e110989c3e4ed0d81f0c4c11c1231970b7e56",
"x86_64-unknown-linux-musl-0.7.1":
"9b714ddf470795d5f1aa5c8111ea153139ae202216ffbe4105fb92f202e0b02b",
"aarch64-apple-darwin-0.7.0":
"964ebe641b563920e0650a60bf5ac21e6c8c56557704e5ecfaaad7ff62c3a73c",
"aarch64-pc-windows-msvc-0.7.0":
"c00950aa4b243e1043d1ec651fdfd71e5f4e5b80135b30fcf3b70fc201aeb1c4",
"aarch64-unknown-linux-gnu-0.7.0":
"540fcb8f2f972c82260a8063a6a4b496d7ff858edc42aa0e2c733a7b55ef8dd8",
"aarch64-unknown-linux-musl-0.7.0":
"f6367e288617021aba6176945ba20a7f8ea3b22a5f8896314a7d0acb863b533e",
"arm-unknown-linux-musleabihf-0.7.0":
"6fc85b25a4b3cb27b924e1f3181f96197667b7465fe52bf703afb5539d09c09c",
"armv7-unknown-linux-gnueabihf-0.7.0":
"035b46fde90a7ee4b48292ff9d116cc771b10d9e955d1979b1a1cd6b3998f602",
"armv7-unknown-linux-musleabihf-0.7.0":
"5f43390685fbb9f29d6075df1d492f9bf39cabb868bf37e0da3cd925c679b068",
"i686-pc-windows-msvc-0.7.0":
"f045db339b2acecc790d2071598275086978a99262d9c4b0c52189c26cba68a9",
"i686-unknown-linux-gnu-0.7.0":
"9936acd12616548a04ce6875aa125ea34f3b288181f2188bfb72d914965680be",
"i686-unknown-linux-musl-0.7.0":
"bfad15225152d9fa8769731b35dd53e0b39cba045900b6d43f90e655652af5b8",
"powerpc64-unknown-linux-gnu-0.7.0":
"91cfac9b5a9ba844c3ba90944e00bfb79da2983b7c6306bdb054c75ab3fea0fe",
"powerpc64le-unknown-linux-gnu-0.7.0":
"d690793c993a1a03049b7e7f3f0e41c94ba2c45b0155bdde917d550ecd4ee02d",
"s390x-unknown-linux-gnu-0.7.0":
"429ffee0dddd8c0c59e246fb89bef721d1ed22a4c051925d7dfafcfc7dce464f",
"x86_64-apple-darwin-0.7.0":
"dc5037f3ffbf8074b3ee63de7a73aa57421b0da0837a478e26317424dbab16f3",
"x86_64-pc-windows-msvc-0.7.0":
"62836c9d6e3f346d06c45fee4109be21ca9d1df8d087472dcc8d51815f182332",
"x86_64-unknown-linux-gnu-0.7.0":
"ca1e8196672bf04ccb926519f2071208a8d6c0ce02fb65bc7d0a85be1b684b0f",
"x86_64-unknown-linux-musl-0.7.0":
"08e1bb8fdea2c6d5edbe40ab1651de097b884020056c0925a9973582ff669d04",
"aarch64-apple-darwin-0.6.17":
"e686c73b9314c77a36a6a4c9f94b07c001f0c9157c50c63c764941141c0d0088",
"aarch64-pc-windows-msvc-0.6.17":
"3a9468e90df970f75759da6caed7dfde2816e0f3842031235c3835fc0c4e7d09",
"aarch64-unknown-linux-gnu-0.6.17":
"6fb716c36e8ca9cf98b7cb347b0ced41679145837eb22890ee5fa9d8b68ce9f5",
"aarch64-unknown-linux-musl-0.6.17":
"98750f5c0cd9eb520799d10649efb18441b616150f07e6c1125f616a3fd137e8",
"arm-unknown-linux-musleabihf-0.6.17":
"649d8d0f37e8365af5aaa012b09dd083d6e71018e569a4d2e78316d5013f18a7",
"armv7-unknown-linux-gnueabihf-0.6.17":
"efc12955d7a6120ea0be2de5ee03dbb33d0d7d9de9dbe0dce560514f2ee129d3",
"armv7-unknown-linux-musleabihf-0.6.17":
"0661d97df8262ef83ccdc6a55ed101abfe8f1cf1ff1be879d9b0d7d1e894c970",
"i686-pc-windows-msvc-0.6.17":
"56dea6c98e1606e95445e77177d7e3cd49bb3d1a63c81b11fe49bf733adb62a2",
"i686-unknown-linux-gnu-0.6.17":
"4bc37f8303a4a5aae1c309f08166884027f325b6872c418cfbaa2cf20a2b2ac5",
"i686-unknown-linux-musl-0.6.17":
"8ec08cca0806a9205ccf5758258c617b57e413b33275bcd861fca363e0eaddf7",
"powerpc64-unknown-linux-gnu-0.6.17":
"d33b70ab206e1ed0663e755506a11db3776787012bfe9d2b2138a90942f506be",
"powerpc64le-unknown-linux-gnu-0.6.17":
"cd91a579850fc45d3b786a654a2c0343836f007929b2e35de9606082eec5361f",
"s390x-unknown-linux-gnu-0.6.17":
"3c753a9d3485bbac23403a0b41a9e70ceeb586f3b4df891ced7ed27d4c6c542b",
"x86_64-apple-darwin-0.6.17":
"61e9bdc02aacdb994da6ea2a477b11b34c23fc09203237aeee8d3817daab012d",
"x86_64-pc-windows-msvc-0.6.17":
"32882cf98f646cafca003e7a7c471b7ff4ba977b681c9fa3b12cf908ba64af82",
"x86_64-unknown-linux-gnu-0.6.17":
"720ec28f7a94aa8cd91d3d57dec1434d64b9ae13d1dd6a25f4c0cdb837ba9cf6",
"x86_64-unknown-linux-musl-0.6.17":
"28bd6b50be068cc09d8a46b76f8c4b72271d471c6673a5bdb47793622e62224d",
"aarch64-apple-darwin-0.6.16":
"2b1ea0d5cf27375738f5f0f229587bc3590c0f501cb00bc48133a3d122d28364",
"aarch64-pc-windows-msvc-0.6.16":
"5abca187b8aecbdffef7547cb39a527168e4cb93d8d2e4ce14271f5831a4d902",
"aarch64-unknown-linux-gnu-0.6.16":
"a82f96ab5f285825f9acee6ac1563683c4940d80df2f08549cad43d37c7ba4a7",
"aarch64-unknown-linux-musl-0.6.16":
"ae3f793c62fe6ced80483d6c78cb49f06a01088bc5d86f1446a9b5988b2acecc",
"arm-unknown-linux-musleabihf-0.6.16":
"91f7f5a4eb97b7983a8e5421d5bfea8802064422ce2f535055f373726eb0aa9a",
"armv7-unknown-linux-gnueabihf-0.6.16":
"a4ffe043952bf4e757a5ca0f546bb83b055b6ee0646dd5c4f5e5f13dbc5ee8f8",
"armv7-unknown-linux-musleabihf-0.6.16":
"0237c8d9914e0d9fd2f022d6d5f91ce392d13e0ccbb7fa7ebe601296a67c3d6c",
"i686-pc-windows-msvc-0.6.16":
"f5c6400f07db2014b2b0c66770e1125fa70efe4dd99cc8351838bed0045c34f8",
"i686-unknown-linux-gnu-0.6.16":
"f46f89efcc599a6695e8378a1201e62cd4afb9a4438d65a89098ab11201f84ab",
"i686-unknown-linux-musl-0.6.16":
"afe69380a9d3592a87893d6bdc11ff33e4180b98f1e1fd4e626c0307d7598914",
"powerpc64-unknown-linux-gnu-0.6.16":
"bf455747580dbbf76cbcf616f67f825c40bd1bdec20c9ff993e03485f9eaad44",
"powerpc64le-unknown-linux-gnu-0.6.16":
"508ec561b1740a551d2b33e96671e0e8435a1bcc0e97080f3d7ba88a096bd360",
"s390x-unknown-linux-gnu-0.6.16":
"e25c5527826524f51f114388bff47871bf1ca67badbfd72d45427bdba4b46794",
"x86_64-apple-darwin-0.6.16":
"ce512b5e40a8ad2916a46df2bdba729d5541e4b3649a09aaddff6e525be012e4",
"x86_64-pc-windows-msvc-0.6.16":
"f1b4c24ec602b6c0b06b6bc64aa447bbe4cf313e93fbec326741961e80ffa8b7",
"x86_64-unknown-linux-gnu-0.6.16":
"e9ef28b675df68978a60f87192fb8c730b8bfca9bef42b121686b218ea0f6542",
"x86_64-unknown-linux-musl-0.6.16":
"25024557931d04cc34f80b818c7547c9c62b762ec6df807e30cb52f383fa2615",
"aarch64-apple-darwin-0.6.15":
"1c5b25f75c6438b6910dbc4c6903debe53f31ee14aee55d02243dfe7bf7c9f72",
"aarch64-pc-windows-msvc-0.6.15":
"317fe0b29e647aad1e9f02ffe764dcbbc6e2ef189f018c81b673884173ab98ba",
"aarch64-unknown-linux-gnu-0.6.15":
"3bf650aec162157b7e01461f41c2a9797366b6043452c6e7035c6c926d0a585b",
"aarch64-unknown-linux-musl-0.6.15":
"183cebae8c9d91bbd48219f9006a5c0c41c90a075d6724aec53a7ea0503c665a",
"arm-unknown-linux-musleabihf-0.6.15":
"d83c76e130ffb25fb6a4ba8ea5870207d810190733a14ae87084c63a417912f6",
"armv7-unknown-linux-gnueabihf-0.6.15":
"d661ec44e5fc7553cd8dd5ad5f48848c5a4d5279ba0df0036c0e2422ec9f312b",
"armv7-unknown-linux-musleabihf-0.6.15":
"6fc86a829965362f99602c47627b269c9b676731586a60ca5bb9d6069677938d",
"i686-pc-windows-msvc-0.6.15":
"7f15e3377e94fac882b33465cb8cbb24705f5c8d63d9d65c6f1b0816c1d30a0b",
"i686-unknown-linux-gnu-0.6.15":
"bfedd03be9f579a9bc10e6c25176017e514cca0500cfb9bba43794387a577661",
"i686-unknown-linux-musl-0.6.15":
"82bf8666c0a57514af4e5403f162314b710e1682e1065ab71a845ebb5d8db0b7",
"powerpc64-unknown-linux-gnu-0.6.15":
"6e9795344d61ee9ac497d6e03a447d808f2aab13925f30e44c00638abec57deb",
"powerpc64le-unknown-linux-gnu-0.6.15":
"e38f13284ed8b645b87ef07c8b549d1f1a5b746aa0411c2115dcd5cda0da13fc",
"s390x-unknown-linux-gnu-0.6.15":
"416f61249b330ea9735cda0c866c9460f87111bc9d4e040c98916fda6a45be09",
"x86_64-apple-darwin-0.6.15":
"97adf61511c0f6ea42c090443c38d8d71116b78ae626363f9f149924c91ae886",
"x86_64-pc-windows-msvc-0.6.15":
"10c75d566db1447f3bdcbcb31d6598e4b5f4ea638be5d8b73a7350929389512b",
"x86_64-unknown-linux-gnu-0.6.15":
"85d98ef282cdbfcb4020922f0c12421ecca4130f0a4570d3b827a15ffd544acc",
"x86_64-unknown-linux-musl-0.6.15":
"78289c93836cb32b8b24e3216b5b316e7fdf483365de2fc571844d308387e8a4",
"aarch64-apple-darwin-0.6.14":
"4ea4731010fbd1bc8e790e07f199f55a5c7c2c732e9b77f85e302b0bee61b756",
"aarch64-pc-windows-msvc-0.6.14":
"7b0b3367c4060c9b47b961201ceb4252e97496c890ad1bd13c664bf5b0744d57",
"aarch64-unknown-linux-gnu-0.6.14":
"ea25597354af186bdd55aee0de431e16d45d82951a4f41f065a8e4dc27885265",
"aarch64-unknown-linux-musl-0.6.14":
"94e22c4be44d205def456427639ca5ca1c1a9e29acc31808a7b28fdd5dcf7f17",
"arm-unknown-linux-musleabihf-0.6.14":
"de00f51ff804c145f9a0a13ead54e1ed08d317fac690477312cf9430ed43e62e",
"armv7-unknown-linux-gnueabihf-0.6.14":
"d73b09f23c7056b3b5318edf670ebc8d2eac5adfdd4f4ee46796723298f21e18",
"armv7-unknown-linux-musleabihf-0.6.14":
"f7844b89c77d1d57ca28a25b6b2e16a5bb3605ccf1dd9dc17ce641a2fa2d8b29",
"i686-pc-windows-msvc-0.6.14":
"4e9f9ccc229a03d923213b8b4c7b373cd8bb941984f421de17fe9dac3d5491e9",
"i686-unknown-linux-gnu-0.6.14":
"32c967c3dd80ecc9006a30be1a9c8ec77d63aa8080b78787d4ec0f79db12dbe4",
"i686-unknown-linux-musl-0.6.14":
"c5a484d15049fd2b8ea9a7bbf0f968614819a7eda769f35c202e01e1904f6458",
"powerpc64-unknown-linux-gnu-0.6.14":
"79abdc4c6e566e98067dc4b612f1fca5cb384b964553a0b8e0f5c40885ff3db8",
"powerpc64le-unknown-linux-gnu-0.6.14":
"2eae20cf66ba5de1b7ac180458e4f2a889cd705637626e01c400f73f07dd0491",
"s390x-unknown-linux-gnu-0.6.14":
"a51f8319b2b334c1392d3927e925b46c62ac584eb35b944d384f0af227cf0f36",
"x86_64-apple-darwin-0.6.14":
"1d8ecb2eb3b68fb50e4249dc96ac9d2458dc24068848f04f4c5b42af2fd26552",
"x86_64-pc-windows-msvc-0.6.14":
"93b29fc234758e381df461d7638ff73d0f08bdf3a0dc37923b1ee0b9e442ca3f",
"x86_64-unknown-linux-gnu-0.6.14":
"0aaf451c391d3913823bfb8ed354b446dcfd0553a32ed8266611e4181c61fd51",
"x86_64-unknown-linux-musl-0.6.14":
"0cac4df0cb3457b154f2039ae471e89cd4e15f3bd790bbb3cb0b8b40d940b93e",
"aarch64-apple-darwin-0.6.13":
"0ddb8458634cc3a02799b6da839cb546dff9dabc6f3394912c48dd479016683b",
"aarch64-pc-windows-msvc-0.6.13":
"3f3d6aa73b4859469fa3ad7efca3e5d0dba1112292c91d5c5f740983f16a8d8a",
"aarch64-unknown-linux-gnu-0.6.13":
"ac0c723663ff76183077cc9aa91dcd0b5100081d87f93e1ba482930e0a584e90",
"aarch64-unknown-linux-musl-0.6.13":
"379a5c48f6e3eb32c2d16022c0a4fc10cdfcca3543b75e2e9d819d62fead6a75",
"arm-unknown-linux-musleabihf-0.6.13":
"ba1f630a299cfdd456b93a8b41e20bd2ad37a86aac884aca4efd722a62a26bb8",
"armv7-unknown-linux-gnueabihf-0.6.13":
"1d55eb46510db8f169bb9be6fbd3a6ff34aa52340dff5eda0acdcb1b834e8bee",
"armv7-unknown-linux-musleabihf-0.6.13":
"dc86e9d807ac324eed2e4a73fec341618ea288826a27143b8b695565a35f1b70",
"i686-pc-windows-msvc-0.6.13":
"08367c3a04cf4da1c3ac6784431421de1efb8584ba68b8017efcd5e889d4a2a2",
"i686-unknown-linux-gnu-0.6.13":
"2896a75940761a2ce90a8a650da02d6766de0b9990dfa6a99cd94fd3d1e6c530",
"i686-unknown-linux-musl-0.6.13":
"29e64ef33ff2d7dcbbb3167bc7241de3b9d258fb39a6a992dfc847f1b968d32d",
"powerpc64-unknown-linux-gnu-0.6.13":
"cdd2ba090ce9e3ed66a94bfe95b45a584bd5b9e45626836993f1279290b1a95e",
"powerpc64le-unknown-linux-gnu-0.6.13":
"88830c596ef2a875a0c73aefda48e8398fdafe4eb4acecbee0b44a7995e9dc13",
"s390x-unknown-linux-gnu-0.6.13":
"49e494038871006e36b404f0559f1c831b3e68692986b3c67510a675028c9696",
"x86_64-apple-darwin-0.6.13":
"ed240854d97f7b234082f5a0ce734869a4310d86d46a819860bbce6d7df8b2eb",
"x86_64-pc-windows-msvc-0.6.13":
"19bb08768fd3b8664068cc45faa633ee110bfef4215e560bc1e5833b1bc6c30e",
"x86_64-unknown-linux-gnu-0.6.13":
"f6788fd45a25ea1033a671eaa9ece6c9b004ce5c9cf09552effadde567a7d7a5",
"x86_64-unknown-linux-musl-0.6.13":
"779560faf6a21b5a6dbc2664c2dfbde2b9387b1f486c9197a9f4d143a3b66875",
"aarch64-apple-darwin-0.6.12":
"fab8db5b62da1e945524b8d1a9d4946fcc6d9b77ec0cab423d953e82159967ac",
"aarch64-pc-windows-msvc-0.6.12":
"d72d8cf0633dc40198a868e906442bc6bacfa38c3b807c26bcbf3fc364af5d96",
"aarch64-unknown-linux-gnu-0.6.12":
"d867553e5ea19f9cea08e564179d909c69ecfce5e7e382099d1844dbf1c9878c",
"aarch64-unknown-linux-musl-0.6.12":
"e999ae0679bfabe8a1e6343b8b204a531a6c851e315caff9b326f34182884af6",
"arm-unknown-linux-musleabihf-0.6.12":
"da8d0700ec5e0cb0b2f20cc20834b48d5927197042e49bea5eef7fd139d72fe9",
"armv7-unknown-linux-gnueabihf-0.6.12":
"b5dedaca5fbb46f412c5426102eec7c9f10003a67dd41b943232e4a2b6a5cc16",
"armv7-unknown-linux-musleabihf-0.6.12":
"8fb6c1b16f8b3c2aa4073cd02729432f9afd9389f110850aed8228464fa37398",
"i686-pc-windows-msvc-0.6.12":
"23431d1a798aee234bd7b271bce306fbd760c91d98e19a314ddd890a065aff83",
"i686-unknown-linux-gnu-0.6.12":
"d0774e847de6c0fe6a9c3aba44b7d400261d01171ae32da60c472eb410691785",
"i686-unknown-linux-musl-0.6.12":
"02e4503b244cbb18d2fa14b3a7e9433fe437e767ffcbfc39c5f0fdff9b8dd65e",
"powerpc64-unknown-linux-gnu-0.6.12":
"046b43cf8af74d8892e9559e8b3181ec1e4045a4910a4dfdd00b110694c93188",
"powerpc64le-unknown-linux-gnu-0.6.12":
"e61ba76fa6dfd6041c985881c024385c31d544d6a182d1a050da7594438f073f",
"s390x-unknown-linux-gnu-0.6.12":
"6eae67730009eb4f8ad7a4e5733ab69b6c4dcb21b482f4567015e3e6d0729357",
"x86_64-apple-darwin-0.6.12":
"5b6ee08766de11dc49ee9e292333e8b46ef2ceaaa3ebb0388467e114fca2ed8c",
"x86_64-pc-windows-msvc-0.6.12":
"30fdf26c209f0cb7c97d3b08a26ab4e78ce5ae0e031b88798cbaccc0f24f452b",
"x86_64-unknown-linux-gnu-0.6.12":
"eec3ccf53616e00905279a302bc043451bd96ca71a159a2ac3199452ac914c26",
"x86_64-unknown-linux-musl-0.6.12":
"25f055a556576003fefc0f5fd213bf3c6df1824d4c7fc35e6361fbecc420139f",
"aarch64-apple-darwin-0.6.11":
"a5b14a92448b908d1a5415f2a49522010fef8972695e2f7bbb4e5c5f88024573",
"aarch64-pc-windows-msvc-0.6.11":
"858e523d9498a332aab093852c30c524bbd94622137dd6f773d19da14ac920b4",
"aarch64-unknown-linux-gnu-0.6.11":
"5384098938893f060b8b47e606918c271a419b52eedda1546a4d6febae4b0c06",
"aarch64-unknown-linux-musl-0.6.11":
"de20c247ef6a6bc0948e611ace3f3f321c098d7bf75b737f169c1db06b4f4d69",
"arm-unknown-linux-musleabihf-0.6.11":
"76a1558e2cb8d0e5e646a0cf8a204b53d3779221bea3af50b204c8d28532daa7",
"armv7-unknown-linux-gnueabihf-0.6.11":
"5abacc141dabb6071fcc3a19a301874083c6cc4a36d6eb6b0654a276efbfd33b",
"armv7-unknown-linux-musleabihf-0.6.11":
"cf05ab1fe44494cc490ec5c29578e200a3c195b395e67fe62d45be9a4c897d06",
"i686-pc-windows-msvc-0.6.11":
"331e94f1db12fa92266f764f63586d8c18e6cea5d37d430af2eb7673f108e874",
"i686-unknown-linux-gnu-0.6.11":
"b9d193f28736c3166f533c61fc4a2e8e8a4c7961c6bd46e17c3db66f750ef4b6",
"i686-unknown-linux-musl-0.6.11":
"dfa735baacc13ba9962fb9b7167599407aa733bfc7853824a785773769c58ed5",
"powerpc64-unknown-linux-gnu-0.6.11":
"b79060dc0726a1fc8a4458a80fb1ce0489198dd3ad334fe54bb7926e473750ed",
"powerpc64le-unknown-linux-gnu-0.6.11":
"ebd219d0b5f0a60a584ebb88e1379c616e746cabaaf79608d54be5919d742ee3",
"s390x-unknown-linux-gnu-0.6.11":
"3b5563127303c16e0531c1fd13356763decc0ea91b860eb5f63c3108a275aa2c",
"x86_64-apple-darwin-0.6.11":
"099b163ce5098558ccdc1df54bdcf8b02eb11364458095e95f8dd54ff8984d96",
"x86_64-pc-windows-msvc-0.6.11":
"292ade13fc2e1530d0021ec7fd42526df58a8436974b8a5b829685db856e667e",
"x86_64-unknown-linux-gnu-0.6.11":
"c19b3be7ac26f8b211f7a5f07f01a77fd4d2b6205ff257790770a585f7f5bda4",
"x86_64-unknown-linux-musl-0.6.11":
"23aabfa5d0bde26d151eaf31a392595a5c88e74e0bc804351b02fbb0328f8aaa",
"aarch64-apple-darwin-0.6.10":
"82bf2cb3b34ab504eb08486093c9e97cfaf5299da4d4a60e14b6642a2a2e9b8e",
"aarch64-pc-windows-msvc-0.6.10":
"afc3c1ed78273843417b781fd30b263ba417dcfd05ef9a65be50eec7aa500f20",
"aarch64-unknown-linux-gnu-0.6.10":
"527f0adc3bcf841a3a0df0d3fef8db277b8afffac588d80948638719b611a8c2",
"aarch64-unknown-linux-musl-0.6.10":
"36c36aafdf4b2fb8040d0b8db2eaa4b3f44260a689a6e789bc1cd95689e890bc",
"arm-unknown-linux-musleabihf-0.6.10":
"abef3136f0da26055368df298f3379bbd0d6776ba7e7a0c12275e403136408d8",
"armv7-unknown-linux-gnueabihf-0.6.10":
"8b776d606b3b9566ae659ab8b2c767e771f1f3e2e632b4c634ff80b26796795f",
"armv7-unknown-linux-musleabihf-0.6.10":
"d5af6869e1f69753e9ac2b8bacadd6356f84f373b0f6edfda60dc85c194d3a6b",
"i686-pc-windows-msvc-0.6.10":
"ff6c580750d6bdbca1cb7c64601ebf0f079cc6d8ab79df6472e5fd61e4f89cf9",
"i686-unknown-linux-gnu-0.6.10":
"978e8d7b495251d842250045a3f15c59e9fe148d09538aa322d4c045db632cc3",
"i686-unknown-linux-musl-0.6.10":
"432c0609dec5d196f516639de8845fdf9393b4591978a927f6b2bfa92edd0220",
"powerpc64-unknown-linux-gnu-0.6.10":
"ec4285062cc4bec8aa7f95efba227c4ee3301503938735902fdd896c3ef8ec7f",
"powerpc64le-unknown-linux-gnu-0.6.10":
"d1dcbdd11b133bcce003aa48be6710a56f1c938eff496eb021dbeac8c09b5c2d",
"s390x-unknown-linux-gnu-0.6.10":
"4a68f92213c567a8d2bc22ccc10a328f3dd851967f315c517fc1eb52c8f58ed5",
"x86_64-apple-darwin-0.6.10":
"ddd27652b1a4053b848e35c348500841a8fde38e8ac2b37233464ab91e8f7788",
"x86_64-pc-windows-msvc-0.6.10":
"c41c4f34782558d3263f7a51e4efd053bc4d074dc46fefa574c4fdb2ed0a00e1",
"x86_64-unknown-linux-gnu-0.6.10":
"d58885f055fdb726d12cdd1cc54119432a0e4557c8e8ba04ca1d625058b98832",
"x86_64-unknown-linux-musl-0.6.10":
"1bdeaa0396405a30c4bff35b2d7c9df832836da50eec132ccc0d92657a336c4c",
"aarch64-apple-darwin-0.6.9":
"a6841484affb3c123313df98bcd8932208bdfb3d9d90a72aec274e8a696caa88",
"aarch64-pc-windows-msvc-0.6.9":
"bdb7e5eebaa5bb807f2c665b909dbba4bce6f23adf774134924a4a3c6acd4e72",
"aarch64-unknown-linux-gnu-0.6.9":
"f5032ad47151c7906c0fb25f7c3b00a85ab0bfed2170cbc444e79c438799095b",
"aarch64-unknown-linux-musl-0.6.9":
"4de15999c38a0e57a3708eccb1fe3295b3d1c0c69410029b16e5e42452d232a9",
"arm-unknown-linux-musleabihf-0.6.9":
"1a228a1cc86689894c771d0b4635b74708db416c240cfbdc36ddd87c90ae0eb0",
"armv7-unknown-linux-gnueabihf-0.6.9":
"a9a307d6b3e6a3500aa0102ff7b03cccebe2a9af40130df97382688574afc637",
"armv7-unknown-linux-musleabihf-0.6.9":
"2cf77dcd0e73b323c5f10120452f6ef34191cab3bb8061ee01d5e62706af7493",
"i686-pc-windows-msvc-0.6.9":
"709d6d7e6d0e8244b4d51ac9ef0f373d2ac2cb20570e8bdf71c84ccab8c8cba0",
"i686-unknown-linux-gnu-0.6.9":
"4000a6fd98af6ed84c9a7c2f06019cab5f4a8cfa4e5a9c37b6984e4c7cae1df2",
"i686-unknown-linux-musl-0.6.9":
"d227586d574264922f344cf98b0f469335ce52d3443619d15448140b44ff8204",
"powerpc64-unknown-linux-gnu-0.6.9":
"f12b8dbc8ed1ca24dfadbd3969730ab9c2cf797e117cdb508732f49b9fa4b620",
"powerpc64le-unknown-linux-gnu-0.6.9":
"451cd936bd35405c1cf2d0b63c975d5490e2646f1516b9bcb27af66688946903",
"s390x-unknown-linux-gnu-0.6.9":
"e25ec6762b68383abfbecb1ec24c1eda52a64dc67866021280c649ef3813726f",
"x86_64-apple-darwin-0.6.9":
"96eb2bfbe2bb3b74836aa5d6f563ae21bbb9e071148adfda1e67000735a020a3",
"x86_64-pc-windows-msvc-0.6.9":
"4d959abc2517c38b5527e3368b6755d66ecbb85679a9b2b34b7a78796c6cf7f8",
"x86_64-unknown-linux-gnu-0.6.9":
"001b87a0c2ea642a3c75a98c6af3e8528aa473d560e653cf213efcc9aaa4a028",
"x86_64-unknown-linux-musl-0.6.9":
"2b2914da53f9412a1aad7457cee424680da037e6a49c378365c3b5ff5ef0b926",
"aarch64-apple-darwin-0.6.8":
"e4f83fc42d9735512198c2d86a6fc136e2f5a2b59b3ccc4f104018ed07465499",
"aarch64-pc-windows-msvc-0.6.8":
"5619c7fbc026544c8cc77ade994ef79e799fc521a050268172aa47826f364834",
"aarch64-unknown-linux-gnu-0.6.8":
"3ffcaa4f4dba917fa58484a1c3dcb96a958a4baca0204e9c10a4799f81b9ee2f",
"aarch64-unknown-linux-musl-0.6.8":
"c1d4504ee47d8577761989c9daa4bbd1b93e5d04056215584a0415ad8738b0f9",
"arm-unknown-linux-musleabihf-0.6.8":
"7280cb1425787faf335bed8e9f2d575bcb179e1b19489ee7984c546d6ef07fff",
"armv7-unknown-linux-gnueabihf-0.6.8":
"6753d79f3f8e1556a855912f0f859b039b67e591332f6ee794e2c51f2eda1658",
"armv7-unknown-linux-musleabihf-0.6.8":
"ba73e8503d3ded103cc1fd946bd307f5b986e096d673296eb616f2edb6cf23aa",
"i686-pc-windows-msvc-0.6.8":
"c28ab471753368b79887fd5cbd12b002704fa7fb2e96b0f5a98277e4f1d8572a",
"i686-unknown-linux-gnu-0.6.8":
"df60b14b5b6bf29c75c06d8d04b0dd358070bf91f19c6f23afaf738fd05fa271",
"i686-unknown-linux-musl-0.6.8":
"b1e92aabb97fa356e8f0d4b61f698e0f372b6a5582df949ffbcc60565e7a9c7a",
"powerpc64-unknown-linux-gnu-0.6.8":
"a18998d2f8f426b1ccf1f6c7ec279dd35ccc1cbe76d90b185e453e6b199df245",
"powerpc64le-unknown-linux-gnu-0.6.8":
"0d7460fe945a7ed48a9236d50f683a5eb937f22eaa605f4e6eb6a5f9cdf3676e",
"s390x-unknown-linux-gnu-0.6.8":
"127a7d547be5029b29532f937822332fed690e135d0a97ec9574d43904a4622a",
"x86_64-apple-darwin-0.6.8":
"e069e79f6e0c430d7beaca3025b398980357b8b5c6faa7191032e20d5ee75970",
"x86_64-pc-windows-msvc-0.6.8":
"d31c3d01ca3e1a75e15ed9514c135239770b6b40a99cae716661e28e433aa495",
"x86_64-unknown-linux-gnu-0.6.8":
"2378ea0122bd56a11ee7ae2ad6116c1f22f4657c03b9efb78ac150236bf7974c",
"x86_64-unknown-linux-musl-0.6.8":
"58902317e1872994b5e707c3c77f4cbf3010104d4b07990a5110bbc09f3e9b8a",
"aarch64-apple-darwin-0.6.7":
"1a4d04477893c215e3def30149208fabe58a70d031388684d0125f553e3cd74f",
"aarch64-pc-windows-msvc-0.6.7":
"1c6de0c79ad35baadb61f6be7a014f3114a320809868b4ccb09c4d16b7118b48",
"aarch64-unknown-linux-gnu-0.6.7":
"b64c4ec32d55bd8e8b726b3162be0dfb3c117c3ca4cd798862497d33fe68e7b9",
"aarch64-unknown-linux-musl-0.6.7":
"df9e1b9530ad63085b66936e65cca107acc98197856e2ac22b896b1ab3936ac4",
"arm-unknown-linux-musleabihf-0.6.7":
"03a4b36d50fe4f0e50845559a524ed75610762072075c411f7ed84479e6c736d",
"armv7-unknown-linux-gnueabihf-0.6.7":
"a877f7697375f6b19d3b537c5152cbb3d86430120b20d957cfa7c084e6b79d6c",
"armv7-unknown-linux-musleabihf-0.6.7":
"e337a7dd6b86c842dac78041acfa9d9402662d5a8cede1d0ae694c9c17057162",
"i686-pc-windows-msvc-0.6.7":
"33002d9f1dab894f48254f43b4b882f6c88078d70ace883ed29fcde82616bbb0",
"i686-unknown-linux-gnu-0.6.7":
"b5f04a274f96aa41e8094b1c4355632f6caa9dfb7e62a45908950ca1c5d3fb38",
"i686-unknown-linux-musl-0.6.7":
"bd56de94a3ffac99a06fc0d37e7cb45e1c35ba275924b5ed502da833dc712d12",
"powerpc64-unknown-linux-gnu-0.6.7":
"57c668908878e1b12c726efc0439cd609697892a22e1e43c0ebb520ef2995a27",
"powerpc64le-unknown-linux-gnu-0.6.7":
"abe3004c0fc468e89ddcf8490991c7fc83abc9d9f6e6a29c59473541265e8bd5",
"s390x-unknown-linux-gnu-0.6.7":
"b6c60b7b907f871880a9be43294b02f84be5ec3187b1a16d7705f5beb622e01a",
"x86_64-apple-darwin-0.6.7":
"680be39f40bf00a8c3a6776e9ddaa9c3c18ef2efbb0c1a9a854b333660ca8678",
"x86_64-pc-windows-msvc-0.6.7":
"11b902b07e98331cef0d648c182c6aa1f279cde688c4411eb9153dc957d48f90",
"x86_64-unknown-linux-gnu-0.6.7":
"601c2b1147117c4471a154b4cebbdb31c818105f796d5f8115fe42d2526689c8",
"x86_64-unknown-linux-musl-0.6.7":
"a31bd6916eff780a7a44c84c194f4f8b70a8250b9175b3839ce2d4403fd735de",
"aarch64-apple-darwin-0.6.6": "aarch64-apple-darwin-0.6.6":
"d0fb047593122746c7529960f8efd5d7d10d2cb230302f71158e9765ad37727b", "d0fb047593122746c7529960f8efd5d7d10d2cb230302f71158e9765ad37727b",
"aarch64-pc-windows-msvc-0.6.6": "aarch64-pc-windows-msvc-0.6.6":
+36 -133
View File
@@ -1,16 +1,11 @@
import { promises as fs } from "node:fs";
import * as path from "node:path";
import * as core from "@actions/core"; import * as core from "@actions/core";
import * as tc from "@actions/tool-cache"; import * as tc from "@actions/tool-cache";
import * as pep440 from "@renovatebot/pep440"; import * as path from "node:path";
import { promises as fs } from "node:fs";
import { OWNER, REPO, TOOL_CACHE_NAME } from "../utils/constants"; import { OWNER, REPO, TOOL_CACHE_NAME } from "../utils/constants";
import { Octokit } from "../utils/octokit";
import type { Architecture, Platform } from "../utils/platforms"; import type { Architecture, Platform } from "../utils/platforms";
import { validateChecksum } from "./checksum/checksum"; import { validateChecksum } from "./checksum/checksum";
import { import { Octokit } from "../utils/octokit";
getDownloadUrl,
getLatestKnownVersion as getLatestVersionInManifest,
} from "./version-manifest";
export function tryGetFromToolCache( export function tryGetFromToolCache(
arch: Architecture, arch: Architecture,
@@ -24,88 +19,39 @@ export function tryGetFromToolCache(
resolvedVersion = version; resolvedVersion = version;
} }
const installedPath = tc.find(TOOL_CACHE_NAME, resolvedVersion, arch); const installedPath = tc.find(TOOL_CACHE_NAME, resolvedVersion, arch);
return { installedPath, version: resolvedVersion }; return { version: resolvedVersion, installedPath };
} }
export async function downloadVersionFromGithub( export async function downloadVersion(
serverUrl: string,
platform: Platform, platform: Platform,
arch: Architecture, arch: Architecture,
version: string, version: string,
checkSum: string | undefined, checkSum: string | undefined,
githubToken: string, githubToken: string,
): Promise<{ version: string; cachedToolDir: string }> { ): Promise<{ version: string; cachedToolDir: string }> {
const resolvedVersion = await resolveVersion(version, githubToken);
const artifact = `uv-${arch}-${platform}`; const artifact = `uv-${arch}-${platform}`;
const extension = getExtension(platform); let extension = ".tar.gz";
const downloadUrl = `${serverUrl}/${OWNER}/${REPO}/releases/download/${version}/${artifact}${extension}`; if (platform === "pc-windows-msvc") {
return await downloadVersion( extension = ".zip";
downloadUrl,
artifact,
platform,
arch,
version,
checkSum,
githubToken,
);
}
export async function downloadVersionFromManifest(
manifestUrl: string | undefined,
platform: Platform,
arch: Architecture,
version: string,
checkSum: string | undefined,
githubToken: string,
): Promise<{ version: string; cachedToolDir: string }> {
const downloadUrl = await getDownloadUrl(
manifestUrl,
version,
arch,
platform,
);
if (!downloadUrl) {
core.info(
`manifest-file does not contain version ${version}, arch ${arch}, platform ${platform}. Falling back to GitHub releases.`,
);
return await downloadVersionFromGithub(
"https://github.com",
platform,
arch,
version,
checkSum,
githubToken,
);
} }
return await downloadVersion( const downloadUrl = `https://github.com/${OWNER}/${REPO}/releases/download/${resolvedVersion}/${artifact}${extension}`;
downloadUrl,
`uv-${arch}-${platform}`,
platform,
arch,
version,
checkSum,
githubToken,
);
}
async function downloadVersion(
downloadUrl: string,
artifactName: string,
platform: Platform,
arch: Architecture,
version: string,
checkSum: string | undefined,
githubToken: string,
): Promise<{ version: string; cachedToolDir: string }> {
core.info(`Downloading uv from "${downloadUrl}" ...`); core.info(`Downloading uv from "${downloadUrl}" ...`);
const downloadPath = await tc.downloadTool( const downloadPath = await tc.downloadTool(
downloadUrl, downloadUrl,
undefined, undefined,
githubToken, githubToken,
); );
await validateChecksum(checkSum, downloadPath, arch, platform, version); await validateChecksum(
checkSum,
downloadPath,
arch,
platform,
resolvedVersion,
);
let uvDir: string; let uvDir: string;
const extension = getExtension(platform);
if (platform === "pc-windows-msvc") { if (platform === "pc-windows-msvc") {
const fullPathWithExtension = `${downloadPath}${extension}`; const fullPathWithExtension = `${downloadPath}${extension}`;
await fs.copyFile(downloadPath, fullPathWithExtension); await fs.copyFile(downloadPath, fullPathWithExtension);
@@ -113,54 +59,40 @@ async function downloadVersion(
// On windows extracting the zip does not create an intermediate directory // On windows extracting the zip does not create an intermediate directory
} else { } else {
const extractedDir = await tc.extractTar(downloadPath); const extractedDir = await tc.extractTar(downloadPath);
uvDir = path.join(extractedDir, artifactName); uvDir = path.join(extractedDir, artifact);
} }
const cachedToolDir = await tc.cacheDir( const cachedToolDir = await tc.cacheDir(
uvDir, uvDir,
TOOL_CACHE_NAME, TOOL_CACHE_NAME,
version, resolvedVersion,
arch, arch,
); );
return { cachedToolDir, version: version }; return { version: resolvedVersion, cachedToolDir };
}
function getExtension(platform: Platform): string {
return platform === "pc-windows-msvc" ? ".zip" : ".tar.gz";
} }
export async function resolveVersion( export async function resolveVersion(
versionInput: string, versionInput: string,
manifestFile: string | undefined,
githubToken: string, githubToken: string,
): Promise<string> { ): Promise<string> {
core.debug(`Resolving version: ${versionInput}`); core.debug(`Resolving version: ${versionInput}`);
let version: string; const version =
if (manifestFile) { versionInput === "latest"
version = ? await getLatestVersion(githubToken)
versionInput === "latest" : versionInput;
? await getLatestVersionInManifest(manifestFile)
: versionInput;
} else {
version =
versionInput === "latest"
? await getLatestVersion(githubToken)
: versionInput;
}
if (tc.isExplicitVersion(version)) { if (tc.isExplicitVersion(version)) {
core.debug(`Version ${version} is an explicit version.`); core.debug(`Version ${version} is an explicit version.`);
return version; return version;
} }
const availableVersions = await getAvailableVersions(githubToken); const availableVersions = await getAvailableVersions(githubToken);
core.debug(`Available versions: ${availableVersions}`); core.debug(`Available versions: ${availableVersions}`);
const resolvedVersion = maxSatisfying(availableVersions, version); const resolvedVersion = tc.evaluateVersions(availableVersions, version);
if (resolvedVersion === undefined) { if (resolvedVersion === "") {
throw new Error(`No version found for ${version}`); throw new Error(`No version found for ${version}`);
} }
return resolvedVersion; return resolvedVersion;
} }
async function getAvailableVersions(githubToken: string): Promise<string[]> { async function getAvailableVersions(githubToken: string): Promise<string[]> {
core.info("Getting available versions from GitHub API...");
try { try {
const octokit = new Octokit({ const octokit = new Octokit({
auth: githubToken, auth: githubToken,
@@ -185,17 +117,11 @@ async function getReleaseTagNames(
owner: OWNER, owner: OWNER,
repo: REPO, repo: REPO,
}); });
const releaseTagNames = response.map((release) => release.tag_name); return response.map((release) => release.tag_name);
if (releaseTagNames.length === 0) {
throw Error(
"Github API request failed while getting releases. Check the GitHub status page for outages. Try again later.",
);
}
return releaseTagNames;
} }
async function getLatestVersion(githubToken: string) { async function getLatestVersion(githubToken: string) {
core.info("Getting latest version from GitHub API..."); core.debug("Getting latest version...");
const octokit = new Octokit({ const octokit = new Octokit({
auth: githubToken, auth: githubToken,
}); });
@@ -204,18 +130,14 @@ async function getLatestVersion(githubToken: string) {
try { try {
latestRelease = await getLatestRelease(octokit); latestRelease = await getLatestRelease(octokit);
} catch (err) { } catch (err) {
if ((err as Error).message.includes("Bad credentials")) { core.info(
core.info( "No (valid) GitHub token provided. Falling back to anonymous. Requests might be rate limited.",
"No (valid) GitHub token provided. Falling back to anonymous. Requests might be rate limited.", );
); if (err instanceof Error) {
const octokit = new Octokit(); core.debug(err.message);
latestRelease = await getLatestRelease(octokit);
} else {
core.error(
"Github API request failed while getting latest release. Check the GitHub status page for outages. Try again later.",
);
throw err;
} }
const octokit = new Octokit();
latestRelease = await getLatestRelease(octokit);
} }
if (!latestRelease) { if (!latestRelease) {
@@ -232,22 +154,3 @@ async function getLatestRelease(octokit: InstanceType<typeof Octokit>) {
}); });
return latestRelease; return latestRelease;
} }
function maxSatisfying(
versions: string[],
version: string,
): string | undefined {
const maxSemver = tc.evaluateVersions(versions, version);
if (maxSemver !== "") {
core.debug(`Found a version that satisfies the semver range: ${maxSemver}`);
return maxSemver;
}
const maxPep440 = pep440.maxSatisfying(versions, version);
if (maxPep440 !== null) {
core.debug(
`Found a version that satisfies the pep440 specifier: ${maxPep440}`,
);
return maxPep440;
}
return undefined;
}
-91
View File
@@ -1,91 +0,0 @@
import { promises as fs } from "node:fs";
import { join } from "node:path";
import * as core from "@actions/core";
import * as semver from "semver";
import { fetch } from "../utils/fetch";
const localManifestFile = join(__dirname, "..", "..", "version-manifest.json");
interface ManifestEntry {
version: string;
artifactName: string;
arch: string;
platform: string;
downloadUrl: string;
}
export async function getLatestKnownVersion(
manifestUrl: string | undefined,
): Promise<string> {
const manifestEntries = await getManifestEntries(manifestUrl);
return manifestEntries.reduce((a, b) =>
semver.gt(a.version, b.version) ? a : b,
).version;
}
export async function getDownloadUrl(
manifestUrl: string | undefined,
version: string,
arch: string,
platform: string,
): Promise<string | undefined> {
const manifestEntries = await getManifestEntries(manifestUrl);
const entry = manifestEntries.find(
(entry) =>
entry.version === version &&
entry.arch === arch &&
entry.platform === platform,
);
return entry ? entry.downloadUrl : undefined;
}
async function getManifestEntries(
manifestUrl: string | undefined,
): Promise<ManifestEntry[]> {
let data: string;
if (manifestUrl !== undefined) {
core.info(`Fetching manifest-file from: ${manifestUrl}`);
const response = await fetch(manifestUrl, {});
if (!response.ok) {
throw new Error(
`Failed to fetch manifest-file: ${response.status} ${response.statusText}`,
);
}
data = await response.text();
} else {
core.info("manifest-file not provided, reading from local file.");
const fileContent = await fs.readFile(localManifestFile);
data = fileContent.toString();
}
return JSON.parse(data);
}
export async function updateVersionManifest(
manifestUrl: string,
downloadUrls: string[],
): Promise<void> {
const manifest: ManifestEntry[] = [];
for (const downloadUrl of downloadUrls) {
const urlParts = downloadUrl.split("/");
const version = urlParts[urlParts.length - 2];
const artifactName = urlParts[urlParts.length - 1];
if (!artifactName.startsWith("uv-")) {
continue;
}
if (artifactName.startsWith("uv-installer")) {
continue;
}
const artifactParts = artifactName.split(".")[0].split("-");
manifest.push({
arch: artifactParts[1],
artifactName: artifactName,
downloadUrl: downloadUrl,
platform: artifactName.split(`uv-${artifactParts[1]}-`)[1].split(".")[0],
version: version,
});
}
core.debug(`Updating manifest-file: ${JSON.stringify(manifest)}`);
await fs.writeFile(manifestUrl, JSON.stringify(manifest));
}
+1 -1
View File
@@ -1,8 +1,8 @@
import * as crypto from "node:crypto"; import * as crypto from "node:crypto";
import * as core from "@actions/core";
import * as fs from "node:fs"; import * as fs from "node:fs";
import * as stream from "node:stream"; import * as stream from "node:stream";
import * as util from "node:util"; import * as util from "node:util";
import * as core from "@actions/core";
import { create } from "@actions/glob"; import { create } from "@actions/glob";
/** /**
+2 -2
View File
@@ -1,10 +1,10 @@
import * as fs from "node:fs";
import * as cache from "@actions/cache"; import * as cache from "@actions/cache";
import * as core from "@actions/core"; import * as core from "@actions/core";
import * as exec from "@actions/exec"; import * as exec from "@actions/exec";
import * as fs from "node:fs";
import { import {
STATE_CACHE_KEY,
STATE_CACHE_MATCHED_KEY, STATE_CACHE_MATCHED_KEY,
STATE_CACHE_KEY,
} from "./cache/restore-cache"; } from "./cache/restore-cache";
import { import {
cacheLocalPath, cacheLocalPath,
+57 -98
View File
@@ -1,38 +1,34 @@
import fs from "node:fs";
import * as path from "node:path";
import * as core from "@actions/core"; import * as core from "@actions/core";
import * as exec from "@actions/exec"; import * as path from "node:path";
import { restoreCache } from "./cache/restore-cache";
import { import {
downloadVersionFromGithub, downloadVersion,
downloadVersionFromManifest,
resolveVersion,
tryGetFromToolCache, tryGetFromToolCache,
resolveVersion,
} from "./download/download-version"; } from "./download/download-version";
import { import { restoreCache } from "./cache/restore-cache";
activateEnvironment as activateEnvironmentInput,
addProblemMatchers,
cacheLocalPath,
checkSum,
enableCache,
githubToken,
ignoreEmptyWorkdir,
manifestFile,
pythonVersion,
serverUrl,
toolBinDir,
toolDir,
versionFile as versionFileInput,
version as versionInput,
workingDirectory,
} from "./utils/inputs";
import { import {
type Architecture, type Architecture,
getArch, getArch,
getPlatform, getPlatform,
type Platform, type Platform,
} from "./utils/platforms"; } from "./utils/platforms";
import { getUvVersionFromFile } from "./version/resolve"; import {
cacheLocalPath,
checkSum,
ignoreEmptyWorkdir,
enableCache,
githubToken,
pyProjectFile,
pythonVersion,
toolBinDir,
toolDir,
uvFile,
version as versionInput,
} from "./utils/inputs";
import * as exec from "@actions/exec";
import fs from "node:fs";
import { getUvVersionFromConfigFile } from "./utils/pyproject";
async function run(): Promise<void> { async function run(): Promise<void> {
detectEmptyWorkdir(); detectEmptyWorkdir();
@@ -48,11 +44,10 @@ async function run(): Promise<void> {
} }
const setupResult = await setupUv(platform, arch, checkSum, githubToken); const setupResult = await setupUv(platform, arch, checkSum, githubToken);
addUvToPath(setupResult.uvDir);
addToolBinToPath(); addToolBinToPath();
addUvToPathAndOutput(setupResult.uvDir);
setToolDir(); setToolDir();
setupPython(); await setupPython();
await activateEnvironment();
addMatchers(); addMatchers();
setCacheDir(cacheLocalPath); setCacheDir(cacheLocalPath);
@@ -88,7 +83,7 @@ async function setupUv(
checkSum: string | undefined, checkSum: string | undefined,
githubToken: string, githubToken: string,
): Promise<{ uvDir: string; version: string }> { ): Promise<{ uvDir: string; version: string }> {
const resolvedVersion = await determineVersion(manifestFile); const resolvedVersion = await determineVersion();
const toolCacheResult = tryGetFromToolCache(arch, resolvedVersion); const toolCacheResult = tryGetFromToolCache(arch, resolvedVersion);
if (toolCacheResult.installedPath) { if (toolCacheResult.installedPath) {
core.info(`Found uv in tool-cache for ${toolCacheResult.version}`); core.info(`Found uv in tool-cache for ${toolCacheResult.version}`);
@@ -98,29 +93,13 @@ async function setupUv(
}; };
} }
let downloadVersionResult: { version: string; cachedToolDir: string }; const downloadVersionResult = await downloadVersion(
if (serverUrl !== "https://github.com") { platform,
core.warning( arch,
"The input server-url is deprecated. Please use manifest-file instead.", resolvedVersion,
); checkSum,
downloadVersionResult = await downloadVersionFromGithub( githubToken,
serverUrl, );
platform,
arch,
resolvedVersion,
checkSum,
githubToken,
);
} else {
downloadVersionResult = await downloadVersionFromManifest(
manifestFile,
platform,
arch,
resolvedVersion,
checkSum,
githubToken,
);
}
return { return {
uvDir: downloadVersionResult.cachedToolDir, uvDir: downloadVersionResult.cachedToolDir,
@@ -128,42 +107,29 @@ async function setupUv(
}; };
} }
async function determineVersion( async function determineVersion(): Promise<string> {
manifestFile: string | undefined,
): Promise<string> {
if (versionInput !== "") { if (versionInput !== "") {
return await resolveVersion(versionInput, manifestFile, githubToken); return await resolveVersion(versionInput, githubToken);
} }
if (versionFileInput !== "") { const configFile = uvFile !== "" ? uvFile : pyProjectFile;
const versionFromFile = getUvVersionFromFile(versionFileInput); if (configFile !== "") {
if (versionFromFile === undefined) { const versionFromConfigFile = getUvVersionFromConfigFile(configFile);
throw new Error( if (versionFromConfigFile === undefined) {
`Could not determine uv version from file: ${versionFileInput}`, core.warning(
`Could not find required-version under [tool.uv] in ${configFile}. Falling back to latest`,
); );
} }
return await resolveVersion(versionFromFile, manifestFile, githubToken); return await resolveVersion(versionFromConfigFile || "latest", githubToken);
} }
const versionFromUvToml = getUvVersionFromFile( if (!fs.existsSync("uv.toml") && !fs.existsSync("pyproject.toml")) {
`${workingDirectory}${path.sep}uv.toml`, return await resolveVersion("latest", githubToken);
);
const versionFromPyproject = getUvVersionFromFile(
`${workingDirectory}${path.sep}pyproject.toml`,
);
if (versionFromUvToml === undefined && versionFromPyproject === undefined) {
core.info(
"Could not determine uv version from uv.toml or pyproject.toml. Falling back to latest.",
);
} }
return await resolveVersion( const versionFile = fs.existsSync("uv.toml") ? "uv.toml" : "pyproject.toml";
versionFromUvToml || versionFromPyproject || "latest", const versionFromConfigFile = getUvVersionFromConfigFile(versionFile);
manifestFile, return await resolveVersion(versionFromConfigFile || "latest", githubToken);
githubToken,
);
} }
function addUvToPathAndOutput(cachedPath: string): void { function addUvToPath(cachedPath: string): void {
core.setOutput("uv-path", `${cachedPath}${path.sep}uv`);
core.setOutput("uvx-path", `${cachedPath}${path.sep}uvx`);
core.addPath(cachedPath); core.addPath(cachedPath);
core.info(`Added ${cachedPath} to the path`); core.info(`Added ${cachedPath} to the path`);
} }
@@ -195,29 +161,24 @@ function setToolDir(): void {
} }
} }
function setupPython(): void { async function setupPython(): Promise<void> {
if (pythonVersion !== "") { if (pythonVersion !== "") {
core.exportVariable("UV_PYTHON", pythonVersion); core.exportVariable("UV_PYTHON", pythonVersion);
core.info(`Set UV_PYTHON to ${pythonVersion}`); core.info(`Set UV_PYTHON to ${pythonVersion}`);
} const options: exec.ExecOptions = {
} silent: !core.isDebug(),
};
async function activateEnvironment(): Promise<void> { const execArgs = ["venv", "--python", pythonVersion];
if (activateEnvironmentInput) {
const execArgs = ["venv", ".venv", "--directory", workingDirectory];
core.info("Activating python venv..."); core.info("Activating python venv...");
await exec.exec("uv", execArgs); await exec.exec("uv", execArgs, options);
let venvBinPath = `${workingDirectory}${path.sep}.venv${path.sep}bin`; let venvBinPath = ".venv/bin";
if (process.platform === "win32") { if (process.platform === "win32") {
venvBinPath = `${workingDirectory}${path.sep}.venv${path.sep}Scripts`; venvBinPath = ".venv/Scripts";
} }
core.addPath(path.resolve(venvBinPath)); core.addPath(path.resolve(venvBinPath));
core.exportVariable( core.exportVariable("VIRTUAL_ENV", path.resolve(".venv"));
"VIRTUAL_ENV",
path.resolve(`${workingDirectory}${path.sep}.venv`),
);
} }
} }
@@ -227,10 +188,8 @@ function setCacheDir(cacheLocalPath: string): void {
} }
function addMatchers(): void { function addMatchers(): void {
if (addProblemMatchers) { const matchersPath = path.join(__dirname, `..${path.sep}..`, ".github");
const matchersPath = path.join(__dirname, `..${path.sep}..`, ".github"); core.info(`##[add-matcher]${path.join(matchersPath, "python.json")}`);
core.info(`##[add-matcher]${path.join(matchersPath, "python.json")}`);
}
} }
run(); run();
+34
View File
@@ -0,0 +1,34 @@
import * as semver from "semver";
import * as core from "@actions/core";
import { Octokit } from "./utils/octokit";
import { OWNER, REPO } from "./utils/constants";
import { updateChecksums } from "./download/checksum/update-known-checksums";
async function run(): Promise<void> {
const checksumFilePath = process.argv.slice(2)[0];
const github_token = process.argv.slice(2)[1];
const octokit = new Octokit({
auth: github_token,
});
const response = await octokit.paginate(octokit.rest.repos.listReleases, {
owner: OWNER,
repo: REPO,
});
const downloadUrls: string[] = response.flatMap((release) =>
release.assets
.filter((asset) => asset.name.endsWith(".sha256"))
.map((asset) => asset.browser_download_url),
);
await updateChecksums(checksumFilePath, downloadUrls);
const latestVersion = response
.map((release) => release.tag_name)
.sort(semver.rcompare)[0];
core.setOutput("latest-version", latestVersion);
}
run();
-56
View File
@@ -1,56 +0,0 @@
import * as core from "@actions/core";
import * as semver from "semver";
import { updateChecksums } from "./download/checksum/update-known-checksums";
import {
getLatestKnownVersion,
updateVersionManifest,
} from "./download/version-manifest";
import { OWNER, REPO } from "./utils/constants";
import { Octokit } from "./utils/octokit";
async function run(): Promise<void> {
const checksumFilePath = process.argv.slice(2)[0];
const versionsManifestFile = process.argv.slice(2)[1];
const githubToken = process.argv.slice(2)[2];
const octokit = new Octokit({
auth: githubToken,
});
const { data: latestRelease } = await octokit.rest.repos.getLatestRelease({
owner: OWNER,
repo: REPO,
});
const latestKnownVersion = await getLatestKnownVersion(undefined);
if (semver.lte(latestRelease.tag_name, latestKnownVersion)) {
core.info(
`Latest release (${latestRelease.tag_name}) is not newer than the latest known version (${latestKnownVersion}). Skipping update.`,
);
return;
}
const releases = await octokit.paginate(octokit.rest.repos.listReleases, {
owner: OWNER,
repo: REPO,
});
const checksumDownloadUrls: string[] = releases.flatMap((release) =>
release.assets
.filter((asset) => asset.name.endsWith(".sha256"))
.map((asset) => asset.browser_download_url),
);
await updateChecksums(checksumFilePath, checksumDownloadUrls);
const artifactDownloadUrls: string[] = releases.flatMap((release) =>
release.assets
.filter((asset) => !asset.name.endsWith(".sha256"))
.map((asset) => asset.browser_download_url),
);
await updateVersionManifest(versionsManifestFile, artifactDownloadUrls);
core.setOutput("latest-version", latestRelease.tag_name);
}
run();
-21
View File
@@ -1,21 +0,0 @@
import { ProxyAgent, type RequestInit, fetch as undiciFetch } from "undici";
export function getProxyAgent() {
const httpProxy = process.env.HTTP_PROXY || process.env.http_proxy;
if (httpProxy) {
return new ProxyAgent(httpProxy);
}
const httpsProxy = process.env.HTTPS_PROXY || process.env.https_proxy;
if (httpsProxy) {
return new ProxyAgent(httpsProxy);
}
return undefined;
}
export const fetch = async (url: string, opts: RequestInit) =>
await undiciFetch(url, {
dispatcher: getProxyAgent(),
...opts,
});
+12 -69
View File
@@ -1,16 +1,15 @@
import path from "node:path";
import * as core from "@actions/core"; import * as core from "@actions/core";
import path from "node:path";
export const workingDirectory = core.getInput("working-directory");
export const version = core.getInput("version"); export const version = core.getInput("version");
export const versionFile = getVersionFile(); export const pyProjectFile = core.getInput("pyproject-file");
export const uvFile = core.getInput("uv-file");
export const pythonVersion = core.getInput("python-version"); export const pythonVersion = core.getInput("python-version");
export const activateEnvironment = core.getBooleanInput("activate-environment");
export const checkSum = core.getInput("checksum"); export const checkSum = core.getInput("checksum");
export const enableCache = getEnableCache(); export const enableCache = getEnableCache();
export const cacheSuffix = core.getInput("cache-suffix") || ""; export const cacheSuffix = core.getInput("cache-suffix") || "";
export const cacheLocalPath = getCacheLocalPath(); export const cacheLocalPath = getCacheLocalPath();
export const cacheDependencyGlob = getCacheDependencyGlob(); export const cacheDependencyGlob = core.getInput("cache-dependency-glob");
export const pruneCache = core.getInput("prune-cache") === "true"; export const pruneCache = core.getInput("prune-cache") === "true";
export const ignoreNothingToCache = export const ignoreNothingToCache =
core.getInput("ignore-nothing-to-cache") === "true"; core.getInput("ignore-nothing-to-cache") === "true";
@@ -18,20 +17,7 @@ export const ignoreEmptyWorkdir =
core.getInput("ignore-empty-workdir") === "true"; core.getInput("ignore-empty-workdir") === "true";
export const toolBinDir = getToolBinDir(); export const toolBinDir = getToolBinDir();
export const toolDir = getToolDir(); export const toolDir = getToolDir();
export const serverUrl = core.getInput("server-url");
export const githubToken = core.getInput("github-token"); export const githubToken = core.getInput("github-token");
export const manifestFile = getManifestFile();
export const addProblemMatchers =
core.getInput("add-problem-matchers") === "true";
function getVersionFile(): string {
const versionFileInput = core.getInput("version-file");
if (versionFileInput !== "") {
const tildeExpanded = expandTilde(versionFileInput);
return resolveRelativePath(tildeExpanded);
}
return versionFileInput;
}
function getEnableCache(): boolean { function getEnableCache(): boolean {
const enableCacheInput = core.getInput("enable-cache"); const enableCacheInput = core.getInput("enable-cache");
@@ -44,8 +30,7 @@ function getEnableCache(): boolean {
function getToolBinDir(): string | undefined { function getToolBinDir(): string | undefined {
const toolBinDirInput = core.getInput("tool-bin-dir"); const toolBinDirInput = core.getInput("tool-bin-dir");
if (toolBinDirInput !== "") { if (toolBinDirInput !== "") {
const tildeExpanded = expandTilde(toolBinDirInput); return expandTilde(toolBinDirInput);
return resolveRelativePath(tildeExpanded);
} }
if (process.platform === "win32") { if (process.platform === "win32") {
if (process.env.RUNNER_TEMP !== undefined) { if (process.env.RUNNER_TEMP !== undefined) {
@@ -61,8 +46,7 @@ function getToolBinDir(): string | undefined {
function getToolDir(): string | undefined { function getToolDir(): string | undefined {
const toolDirInput = core.getInput("tool-dir"); const toolDirInput = core.getInput("tool-dir");
if (toolDirInput !== "") { if (toolDirInput !== "") {
const tildeExpanded = expandTilde(toolDirInput); return expandTilde(toolDirInput);
return resolveRelativePath(tildeExpanded);
} }
if (process.platform === "win32") { if (process.platform === "win32") {
if (process.env.RUNNER_TEMP !== undefined) { if (process.env.RUNNER_TEMP !== undefined) {
@@ -78,34 +62,14 @@ function getToolDir(): string | undefined {
function getCacheLocalPath(): string { function getCacheLocalPath(): string {
const cacheLocalPathInput = core.getInput("cache-local-path"); const cacheLocalPathInput = core.getInput("cache-local-path");
if (cacheLocalPathInput !== "") { if (cacheLocalPathInput !== "") {
const tildeExpanded = expandTilde(cacheLocalPathInput); return expandTilde(cacheLocalPathInput);
return resolveRelativePath(tildeExpanded);
} }
if (process.env.RUNNER_ENVIRONMENT === "github-hosted") { if (process.env.RUNNER_TEMP !== undefined) {
if (process.env.RUNNER_TEMP !== undefined) { return `${process.env.RUNNER_TEMP}${path.sep}setup-uv-cache`;
return `${process.env.RUNNER_TEMP}${path.sep}setup-uv-cache`;
}
throw Error(
"Could not determine UV_CACHE_DIR. Please make sure RUNNER_TEMP is set or provide the cache-local-path input",
);
} }
if (process.platform === "win32") { throw Error(
return `${process.env.APPDATA}${path.sep}uv${path.sep}cache`; "Could not determine UV_CACHE_DIR. Please make sure RUNNER_TEMP is set or provide the cache-local-path input",
} );
return `${process.env.HOME}${path.sep}.cache${path.sep}uv`;
}
function getCacheDependencyGlob(): string {
const cacheDependencyGlobInput = core.getInput("cache-dependency-glob");
if (cacheDependencyGlobInput !== "") {
return cacheDependencyGlobInput
.split("\n")
.map((part) => part.trim())
.map((part) => expandTilde(part))
.map((part) => resolveRelativePath(part))
.join("\n");
}
return cacheDependencyGlobInput;
} }
function expandTilde(input: string): string { function expandTilde(input: string): string {
@@ -114,24 +78,3 @@ function expandTilde(input: string): string {
} }
return input; return input;
} }
function resolveRelativePath(inputPath: string): string {
if (path.isAbsolute(inputPath)) {
return inputPath;
}
let absolutePath = inputPath;
if (absolutePath.startsWith("./")) {
absolutePath = absolutePath.substring(2);
}
absolutePath = `${workingDirectory}${path.sep}${absolutePath}`;
core.debug(`Resolving relative path ${inputPath} to ${absolutePath}`);
return absolutePath;
}
function getManifestFile(): string | undefined {
const manifestFileInput = core.getInput("manifest-file");
if (manifestFileInput !== "") {
return manifestFileInput;
}
return undefined;
}
+22 -2
View File
@@ -4,11 +4,11 @@ import type {
OctokitOptions, OctokitOptions,
} from "@octokit/core/dist-types/types"; } from "@octokit/core/dist-types/types";
import { import {
type PaginateInterface,
paginateRest, paginateRest,
type PaginateInterface,
} from "@octokit/plugin-paginate-rest"; } from "@octokit/plugin-paginate-rest";
import { legacyRestEndpointMethods } from "@octokit/plugin-rest-endpoint-methods"; import { legacyRestEndpointMethods } from "@octokit/plugin-rest-endpoint-methods";
import { fetch as customFetch } from "./fetch"; import { fetch as undiciFetch, ProxyAgent, type RequestInit } from "undici";
export type { RestEndpointMethodTypes } from "@octokit/plugin-rest-endpoint-methods"; export type { RestEndpointMethodTypes } from "@octokit/plugin-rest-endpoint-methods";
@@ -17,6 +17,26 @@ const DEFAULTS = {
userAgent: "setup-uv", userAgent: "setup-uv",
}; };
export function getProxyAgent() {
const httpProxy = process.env.HTTP_PROXY || process.env.http_prox;
if (httpProxy) {
return new ProxyAgent(httpProxy);
}
const httpsProxy = process.env.HTTPS_PROXY || process.env.https_proxy;
if (httpsProxy) {
return new ProxyAgent(httpsProxy);
}
return undefined;
}
export const customFetch = async (url: string, opts: RequestInit) =>
await undiciFetch(url, {
dispatcher: getProxyAgent(),
...opts,
});
export const Octokit: typeof Core & export const Octokit: typeof Core &
Constructor< Constructor<
{ {
+10 -10
View File
@@ -1,5 +1,5 @@
import * as core from "@actions/core";
import * as exec from "@actions/exec"; import * as exec from "@actions/exec";
import * as core from "@actions/core";
export type Platform = export type Platform =
| "unknown-linux-gnu" | "unknown-linux-gnu"
| "unknown-linux-musl" | "unknown-linux-musl"
@@ -16,11 +16,11 @@ export type Architecture =
export function getArch(): Architecture | undefined { export function getArch(): Architecture | undefined {
const arch = process.arch; const arch = process.arch;
const archMapping: { [key: string]: Architecture } = { const archMapping: { [key: string]: Architecture } = {
arm64: "aarch64",
ia32: "i686", ia32: "i686",
ppc64: "powerpc64le",
s390x: "s390x",
x64: "x86_64", x64: "x86_64",
arm64: "aarch64",
s390x: "s390x",
ppc64: "powerpc64le",
}; };
if (arch in archMapping) { if (arch in archMapping) {
@@ -31,8 +31,8 @@ export function getArch(): Architecture | undefined {
export async function getPlatform(): Promise<Platform | undefined> { export async function getPlatform(): Promise<Platform | undefined> {
const processPlatform = process.platform; const processPlatform = process.platform;
const platformMapping: { [key: string]: Platform } = { const platformMapping: { [key: string]: Platform } = {
darwin: "apple-darwin",
linux: "unknown-linux-gnu", linux: "unknown-linux-gnu",
darwin: "apple-darwin",
win32: "pc-windows-msvc", win32: "pc-windows-msvc",
}; };
@@ -50,16 +50,16 @@ async function isMuslOs(): Promise<boolean> {
let stdOutput = ""; let stdOutput = "";
let errOutput = ""; let errOutput = "";
const options: exec.ExecOptions = { const options: exec.ExecOptions = {
ignoreReturnCode: true, silent: !core.isDebug(),
listeners: { listeners: {
stderr: (data: Buffer) => {
errOutput += data.toString();
},
stdout: (data: Buffer) => { stdout: (data: Buffer) => {
stdOutput += data.toString(); stdOutput += data.toString();
}, },
stderr: (data: Buffer) => {
errOutput += data.toString();
},
}, },
silent: !core.isDebug(), ignoreReturnCode: true,
}; };
try { try {
+46
View File
@@ -0,0 +1,46 @@
import fs from "node:fs";
import * as core from "@actions/core";
import * as toml from "smol-toml";
export function getUvVersionFromConfigFile(
filePath: string,
): string | undefined {
core.debug(`Trying to find required-version for uv in: ${filePath}`);
if (!fs.existsSync(filePath)) {
core.warning(`Could not find file: ${filePath}`);
return undefined;
}
let requiredVersion: string | undefined;
try {
requiredVersion = getRequiredVersion(filePath);
} catch (err) {
const message = (err as Error).message;
core.warning(`Error while parsing ${filePath}: ${message}`);
return undefined;
}
if (requiredVersion?.startsWith("==")) {
requiredVersion = requiredVersion.slice(2);
}
if (requiredVersion !== undefined) {
core.info(
`Found required-version for uv in ${filePath}: ${requiredVersion}`,
);
}
return requiredVersion;
}
function getRequiredVersion(filePath: string): string | undefined {
const fileContent = fs.readFileSync(filePath, "utf-8");
if (filePath.endsWith("pyproject.toml")) {
const tomlContent = toml.parse(fileContent) as {
tool?: { uv?: { "required-version"?: string } };
};
return tomlContent?.tool?.uv?.["required-version"];
}
const tomlContent = toml.parse(fileContent) as {
"required-version"?: string;
};
return tomlContent["required-version"];
}
-22
View File
@@ -1,22 +0,0 @@
import fs from "node:fs";
import * as toml from "smol-toml";
export function getRequiredVersionFromConfigFile(
filePath: string,
): string | undefined {
if (!filePath.endsWith(".toml")) {
return undefined;
}
const fileContent = fs.readFileSync(filePath, "utf-8");
if (filePath.endsWith("pyproject.toml")) {
const tomlContent = toml.parse(fileContent) as {
tool?: { uv?: { "required-version"?: string } };
};
return tomlContent?.tool?.uv?.["required-version"];
}
const tomlContent = toml.parse(fileContent) as {
"required-version"?: string;
};
return tomlContent["required-version"];
}
-43
View File
@@ -1,43 +0,0 @@
import fs from "node:fs";
import * as toml from "smol-toml";
export function getUvVersionFromRequirementsFile(
filePath: string,
): string | undefined {
const fileContent = fs.readFileSync(filePath, "utf-8");
if (filePath.endsWith(".txt")) {
return getUvVersionFromAllDependencies(fileContent.split("\n"));
}
const dependencies = parsePyprojectDependencies(fileContent);
return getUvVersionFromAllDependencies(dependencies);
}
function getUvVersionFromAllDependencies(
allDependencies: string[],
): string | undefined {
return allDependencies
.find((dep: string) => dep.match(/^uv[=<>~!]/))
?.match(/^uv([=<>~!]+\S*)/)?.[1]
.trim();
}
interface Pyproject {
project?: {
dependencies?: string[];
"optional-dependencies"?: Record<string, string[]>;
};
"dependency-groups"?: Record<string, Array<string | object>>;
}
function parsePyprojectDependencies(pyprojectContent: string): string[] {
const pyproject: Pyproject = toml.parse(pyprojectContent);
const dependencies: string[] = pyproject?.project?.dependencies || [];
const optionalDependencies: string[] = Object.values(
pyproject?.project?.["optional-dependencies"] || {},
).flat();
const devDependencies: string[] = Object.values(
pyproject?.["dependency-groups"] || {},
)
.flat()
.filter((item: string | object) => typeof item === "string");
return dependencies.concat(optionalDependencies, devDependencies);
}
-34
View File
@@ -1,34 +0,0 @@
import fs from "node:fs";
import * as core from "@actions/core";
import { getRequiredVersionFromConfigFile } from "./config-file";
import { getUvVersionFromRequirementsFile } from "./requirements-file";
import { getUvVersionFromToolVersions } from "./tool-versions-file";
export function getUvVersionFromFile(filePath: string): string | undefined {
core.info(`Trying to find version for uv in: ${filePath}`);
if (!fs.existsSync(filePath)) {
core.info(`Could not find file: ${filePath}`);
return undefined;
}
let uvVersion: string | undefined;
try {
uvVersion = getUvVersionFromToolVersions(filePath);
if (uvVersion === undefined) {
uvVersion = getRequiredVersionFromConfigFile(filePath);
}
if (uvVersion === undefined) {
uvVersion = getUvVersionFromRequirementsFile(filePath);
}
} catch (err) {
const message = (err as Error).message;
core.warning(`Error while parsing ${filePath}: ${message}`);
return undefined;
}
if (uvVersion?.startsWith("==")) {
uvVersion = uvVersion.slice(2);
}
if (uvVersion !== undefined) {
core.info(`Found version for uv in ${filePath}: ${uvVersion}`);
}
return uvVersion;
}
-31
View File
@@ -1,31 +0,0 @@
import fs from "node:fs";
import * as core from "@actions/core";
export function getUvVersionFromToolVersions(
filePath: string,
): string | undefined {
if (!filePath.endsWith(".tool-versions")) {
return undefined;
}
const fileContents = fs.readFileSync(filePath, "utf8");
const lines = fileContents.split("\n");
for (const line of lines) {
// Skip commented lines
if (line.trim().startsWith("#")) {
continue;
}
const match = line.match(/^\s*uv\s*v?\s*(?<version>[^\s]+)\s*$/);
if (match) {
const matchedVersion = match.groups?.version.trim();
if (matchedVersion?.startsWith("ref")) {
core.warning(
"The ref syntax of .tool-versions is not supported. Please use a released version instead.",
);
return undefined;
}
return matchedVersion;
}
}
return undefined;
}
+3 -3
View File
@@ -1,12 +1,12 @@
{ {
"compilerOptions": { "compilerOptions": {
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, "target": "ES2022" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */,
"module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,
"noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */,
"outDir": "./lib" /* Redirect output structure to the directory. */, "outDir": "./lib" /* Redirect output structure to the directory. */,
"rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, "rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */,
"strict": true /* Enable all strict type-checking options. */, "strict": true /* Enable all strict type-checking options. */,
"target": "ES2022" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */,
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
}, },
"exclude": ["node_modules", "**/*.test.ts"] "exclude": ["node_modules", "**/*.test.ts"]
} }
-24376
View File
File diff suppressed because it is too large Load Diff