Compare commits

..

36 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
60c3d12f39 Add comprehensive Copilot instructions for setup-uv repository
Co-authored-by: eifinger <1481961+eifinger@users.noreply.github.com>
2025-10-11 17:04:06 +00:00
copilot-swe-agent[bot]
4dcb799aa0 Initial plan 2025-10-11 16:54:48 +00:00
Kevin Stillhammer
d18bcc753a Add value of UV_PYTHON_INSTALL_DIR to path (#628)
Closes: #610
2025-10-11 18:42:06 +02:00
Kevin Stillhammer
bd1f875aba Set output venv when activate-environment is used (#627)
Closes: #622
2025-10-11 15:17:25 +02:00
github-actions[bot]
1a91c3851d chore: update known checksums for 0.9.2 (#626)
Co-authored-by: woodruffw <woodruffw@users.noreply.github.com>
2025-10-10 17:11:01 -04:00
github-actions[bot]
c79f606987 chore: update known checksums for 0.9.1 (#625)
chore: update known checksums for 0.9.1

Co-authored-by: eifinger <eifinger@users.noreply.github.com>
2025-10-10 17:24:01 +02:00
Kevin Stillhammer
e0249f1599 Fall back to PR for updating known versions (#623) 2025-10-10 17:23:48 +02:00
Merlin
6d2eb15b49 Cache python installs (#621)
This pull request introduces support for caching Python installs in the
GitHub Action, allowing users to cache not only dependencies but also
the Python interpreter itself.

This works by setting the `UV_PYTHON_INSTALL_DIR` to a subdirectory of
the dependency cache path so that Python installs are directed there.

Fixes #135

---------

Co-authored-by: Kevin Stillhammer <kevin.stillhammer@gmail.com>
2025-10-09 22:47:24 +02:00
dependabot[bot]
3495667518 Bump github/codeql-action from 3.30.6 to 4.30.7 (#614)
Bumps [github/codeql-action](https://github.com/github/codeql-action)
from 3.30.6 to 4.30.7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/github/codeql-action/releases">github/codeql-action's
releases</a>.</em></p>
<blockquote>
<h2>v4.30.7</h2>
<h1>CodeQL Action Changelog</h1>
<p>See the <a
href="https://github.com/github/codeql-action/releases">releases
page</a> for the relevant changes to the CodeQL CLI and language
packs.</p>
<h2>4.30.7 - 06 Oct 2025</h2>
<ul>
<li>[v4+ only] The CodeQL Action now runs on Node.js v24. <a
href="https://redirect.github.com/github/codeql-action/pull/3169">#3169</a></li>
</ul>
<p>See the full <a
href="https://github.com/github/codeql-action/blob/v4.30.7/CHANGELOG.md">CHANGELOG.md</a>
for more information.</p>
<h2>v3.30.7</h2>
<h1>CodeQL Action Changelog</h1>
<p>See the <a
href="https://github.com/github/codeql-action/releases">releases
page</a> for the relevant changes to the CodeQL CLI and language
packs.</p>
<h2>3.30.7 - 06 Oct 2025</h2>
<p>No user facing changes.</p>
<p>See the full <a
href="https://github.com/github/codeql-action/blob/v3.30.7/CHANGELOG.md">CHANGELOG.md</a>
for more information.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/github/codeql-action/blob/main/CHANGELOG.md">github/codeql-action's
changelog</a>.</em></p>
<blockquote>
<h1>CodeQL Action Changelog</h1>
<p>See the <a
href="https://github.com/github/codeql-action/releases">releases
page</a> for the relevant changes to the CodeQL CLI and language
packs.</p>
<h2>[UNRELEASED]</h2>
<p>No user facing changes.</p>
<h2>4.30.7 - 06 Oct 2025</h2>
<ul>
<li>[v4+ only] The CodeQL Action now runs on Node.js v24. <a
href="https://redirect.github.com/github/codeql-action/pull/3169">#3169</a></li>
</ul>
<h2>3.30.6 - 02 Oct 2025</h2>
<ul>
<li>Update default CodeQL bundle version to 2.23.2. <a
href="https://redirect.github.com/github/codeql-action/pull/3168">#3168</a></li>
</ul>
<h2>3.30.5 - 26 Sep 2025</h2>
<ul>
<li>We fixed a bug that was introduced in <code>3.30.4</code> with
<code>upload-sarif</code> which resulted in files without a
<code>.sarif</code> extension not getting uploaded. <a
href="https://redirect.github.com/github/codeql-action/pull/3160">#3160</a></li>
</ul>
<h2>3.30.4 - 25 Sep 2025</h2>
<ul>
<li>We have improved the CodeQL Action's ability to validate that the
workflow it is used in does not use different versions of the CodeQL
Action for different workflow steps. Mixing different versions of the
CodeQL Action in the same workflow is unsupported and can lead to
unpredictable results. A warning will now be emitted from the
<code>codeql-action/init</code> step if different versions of the CodeQL
Action are detected in the workflow file. Additionally, an error will
now be thrown by the other CodeQL Action steps if they load a
configuration file that was generated by a different version of the
<code>codeql-action/init</code> step. <a
href="https://redirect.github.com/github/codeql-action/pull/3099">#3099</a>
and <a
href="https://redirect.github.com/github/codeql-action/pull/3100">#3100</a></li>
<li>We added support for reducing the size of dependency caches for Java
analyses, which will reduce cache usage and speed up workflows. This
will be enabled automatically at a later time. <a
href="https://redirect.github.com/github/codeql-action/pull/3107">#3107</a></li>
<li>You can now run the latest CodeQL nightly bundle by passing
<code>tools: nightly</code> to the <code>init</code> action. In general,
the nightly bundle is unstable and we only recommend running it when
directed by GitHub staff. <a
href="https://redirect.github.com/github/codeql-action/pull/3130">#3130</a></li>
<li>Update default CodeQL bundle version to 2.23.1. <a
href="https://redirect.github.com/github/codeql-action/pull/3118">#3118</a></li>
</ul>
<h2>3.30.3 - 10 Sep 2025</h2>
<p>No user facing changes.</p>
<h2>3.30.2 - 09 Sep 2025</h2>
<ul>
<li>Fixed a bug which could cause language autodetection to fail. <a
href="https://redirect.github.com/github/codeql-action/pull/3084">#3084</a></li>
<li>Experimental: The <code>quality-queries</code> input that was added
in <code>3.29.2</code> as part of an internal experiment is now
deprecated and will be removed in an upcoming version of the CodeQL
Action. It has been superseded by a new <code>analysis-kinds</code>
input, which is part of the same internal experiment. Do not use this in
production as it is subject to change at any time. <a
href="https://redirect.github.com/github/codeql-action/pull/3064">#3064</a></li>
</ul>
<h2>3.30.1 - 05 Sep 2025</h2>
<ul>
<li>Update default CodeQL bundle version to 2.23.0. <a
href="https://redirect.github.com/github/codeql-action/pull/3077">#3077</a></li>
</ul>
<h2>3.30.0 - 01 Sep 2025</h2>
<ul>
<li>Reduce the size of the CodeQL Action, speeding up workflows by
approximately 4 seconds. <a
href="https://redirect.github.com/github/codeql-action/pull/3054">#3054</a></li>
</ul>
<h2>3.29.11 - 21 Aug 2025</h2>
<ul>
<li>Update default CodeQL bundle version to 2.22.4. <a
href="https://redirect.github.com/github/codeql-action/pull/3044">#3044</a></li>
</ul>
<h2>3.29.10 - 18 Aug 2025</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e296a93559"><code>e296a93</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3183">#3183</a>
from github/update-v4.30.7-55283843c</li>
<li><a
href="93c16735fa"><code>93c1673</code></a>
Update changelog for v4.30.7</li>
<li><a
href="55283843ca"><code>5528384</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3169">#3169</a>
from github/mario-campos/node24</li>
<li><a
href="b66db86c84"><code>b66db86</code></a>
Hoist CHANGELOG note back to &quot;UNRELEASED&quot; section.</li>
<li><a
href="b2e22323e2"><code>b2e2232</code></a>
Merge remote-tracking branch 'origin/main' into mario-campos/node24</li>
<li><a
href="065c6cfb78"><code>065c6cf</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3174">#3174</a>
from github/mbg/fix/start-proxy-matrix</li>
<li><a
href="7fb8378d93"><code>7fb8378</code></a>
Re-throw exception in <code>createStatusReportBase</code> when in test
mode</li>
<li><a
href="dddf033776"><code>dddf033</code></a>
Revert changes to build.mjs</li>
<li><a
href="54ae8ba5b1"><code>54ae8ba</code></a>
Simplify PR check by reverting changes to <code>@types/node</code>.</li>
<li><a
href="65e9e640ee"><code>65e9e64</code></a>
Make <code>matrix</code> available to <code>start-proxy</code>
action</li>
<li>Additional commits viewable in <a
href="64d10c1313...e296a93559">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github/codeql-action&package-manager=github_actions&previous-version=3.30.6&new-version=4.30.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-09 07:56:50 +02:00
Kevin Stillhammer
eb1897b8dc Bump dependencies (#613) 2025-10-07 21:44:39 +02:00
dependabot[bot]
d78d791822 Bump github/codeql-action from 3.30.5 to 3.30.6 (#605)
Bumps [github/codeql-action](https://github.com/github/codeql-action)
from 3.30.5 to 3.30.6.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/github/codeql-action/releases">github/codeql-action's
releases</a>.</em></p>
<blockquote>
<h2>v3.30.6</h2>
<h1>CodeQL Action Changelog</h1>
<p>See the <a
href="https://github.com/github/codeql-action/releases">releases
page</a> for the relevant changes to the CodeQL CLI and language
packs.</p>
<h2>3.30.6 - 02 Oct 2025</h2>
<ul>
<li>Update default CodeQL bundle version to 2.23.2. <a
href="https://redirect.github.com/github/codeql-action/pull/3168">#3168</a></li>
</ul>
<p>See the full <a
href="https://github.com/github/codeql-action/blob/v3.30.6/CHANGELOG.md">CHANGELOG.md</a>
for more information.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/github/codeql-action/blob/main/CHANGELOG.md">github/codeql-action's
changelog</a>.</em></p>
<blockquote>
<h1>CodeQL Action Changelog</h1>
<p>See the <a
href="https://github.com/github/codeql-action/releases">releases
page</a> for the relevant changes to the CodeQL CLI and language
packs.</p>
<h2>[UNRELEASED]</h2>
<p>No user facing changes.</p>
<h2>3.30.6 - 02 Oct 2025</h2>
<ul>
<li>Update default CodeQL bundle version to 2.23.2. <a
href="https://redirect.github.com/github/codeql-action/pull/3168">#3168</a></li>
</ul>
<h2>3.30.5 - 26 Sep 2025</h2>
<ul>
<li>We fixed a bug that was introduced in <code>3.30.4</code> with
<code>upload-sarif</code> which resulted in files without a
<code>.sarif</code> extension not getting uploaded. <a
href="https://redirect.github.com/github/codeql-action/pull/3160">#3160</a></li>
</ul>
<h2>3.30.4 - 25 Sep 2025</h2>
<ul>
<li>We have improved the CodeQL Action's ability to validate that the
workflow it is used in does not use different versions of the CodeQL
Action for different workflow steps. Mixing different versions of the
CodeQL Action in the same workflow is unsupported and can lead to
unpredictable results. A warning will now be emitted from the
<code>codeql-action/init</code> step if different versions of the CodeQL
Action are detected in the workflow file. Additionally, an error will
now be thrown by the other CodeQL Action steps if they load a
configuration file that was generated by a different version of the
<code>codeql-action/init</code> step. <a
href="https://redirect.github.com/github/codeql-action/pull/3099">#3099</a>
and <a
href="https://redirect.github.com/github/codeql-action/pull/3100">#3100</a></li>
<li>We added support for reducing the size of dependency caches for Java
analyses, which will reduce cache usage and speed up workflows. This
will be enabled automatically at a later time. <a
href="https://redirect.github.com/github/codeql-action/pull/3107">#3107</a></li>
<li>You can now run the latest CodeQL nightly bundle by passing
<code>tools: nightly</code> to the <code>init</code> action. In general,
the nightly bundle is unstable and we only recommend running it when
directed by GitHub staff. <a
href="https://redirect.github.com/github/codeql-action/pull/3130">#3130</a></li>
<li>Update default CodeQL bundle version to 2.23.1. <a
href="https://redirect.github.com/github/codeql-action/pull/3118">#3118</a></li>
</ul>
<h2>3.30.3 - 10 Sep 2025</h2>
<p>No user facing changes.</p>
<h2>3.30.2 - 09 Sep 2025</h2>
<ul>
<li>Fixed a bug which could cause language autodetection to fail. <a
href="https://redirect.github.com/github/codeql-action/pull/3084">#3084</a></li>
<li>Experimental: The <code>quality-queries</code> input that was added
in <code>3.29.2</code> as part of an internal experiment is now
deprecated and will be removed in an upcoming version of the CodeQL
Action. It has been superseded by a new <code>analysis-kinds</code>
input, which is part of the same internal experiment. Do not use this in
production as it is subject to change at any time. <a
href="https://redirect.github.com/github/codeql-action/pull/3064">#3064</a></li>
</ul>
<h2>3.30.1 - 05 Sep 2025</h2>
<ul>
<li>Update default CodeQL bundle version to 2.23.0. <a
href="https://redirect.github.com/github/codeql-action/pull/3077">#3077</a></li>
</ul>
<h2>3.30.0 - 01 Sep 2025</h2>
<ul>
<li>Reduce the size of the CodeQL Action, speeding up workflows by
approximately 4 seconds. <a
href="https://redirect.github.com/github/codeql-action/pull/3054">#3054</a></li>
</ul>
<h2>3.29.11 - 21 Aug 2025</h2>
<ul>
<li>Update default CodeQL bundle version to 2.22.4. <a
href="https://redirect.github.com/github/codeql-action/pull/3044">#3044</a></li>
</ul>
<h2>3.29.10 - 18 Aug 2025</h2>
<p>No user facing changes.</p>
<h2>3.29.9 - 12 Aug 2025</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="64d10c1313"><code>64d10c1</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3172">#3172</a>
from github/update-v3.30.6-10feb5d2a</li>
<li><a
href="909610e8a8"><code>909610e</code></a>
Update changelog for v3.30.6</li>
<li><a
href="10feb5d2a2"><code>10feb5d</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3167">#3167</a>
from github/mbg/upload-sarif/find-then-filter</li>
<li><a
href="4182ea3d4e"><code>4182ea3</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3168">#3168</a>
from github/update-bundle/codeql-bundle-v2.23.2</li>
<li><a
href="34afe5b7b1"><code>34afe5b</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3171">#3171</a>
from github/mbg/start-proxy/telemetry</li>
<li><a
href="096fe67f97"><code>096fe67</code></a>
Merge branch 'main' into update-bundle/codeql-bundle-v2.23.2</li>
<li><a
href="b4964014ad"><code>b496401</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3170">#3170</a>
from github/mbg/start-proxy/remove-update-workflow</li>
<li><a
href="d573787cca"><code>d573787</code></a>
Report registry types that are configured for CodeQL in
<code>start-proxy</code> telemetry</li>
<li><a
href="15916800df"><code>1591680</code></a>
Send a basic status report in <code>start-proxy</code> Action if it
succeeds</li>
<li><a
href="cb5a2849ac"><code>cb5a284</code></a>
Send status report when <code>start-proxy</code> fails</li>
<li>Additional commits viewable in <a
href="3599b3baa1...64d10c1313">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github/codeql-action&package-manager=github_actions&previous-version=3.30.5&new-version=3.30.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-07 21:28:28 +02:00
Kevin Stillhammer
535dc2664c Respect UV_CACHE_DIR and cache-dir (#612)
Fixes: #583
2025-10-07 16:08:30 +02:00
Kevin Stillhammer
f610be5ff9 Use --force when pruning cache (#611)
To prevent waiting forever on other running uv processes
2025-10-07 09:42:14 +02:00
Kevin Stillhammer
3deccc0075 Use node24 instead of node20 (#608) 2025-10-07 08:44:57 +02:00
Kevin Stillhammer
d9ee7e2f26 Remove deprecated input server-url (#607) 2025-10-03 19:48:56 +02:00
dependabot[bot]
59a0868fea Bump github/codeql-action from 3.30.3 to 3.30.5 (#594)
Bumps [github/codeql-action](https://github.com/github/codeql-action)
from 3.30.3 to 3.30.5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/github/codeql-action/releases">github/codeql-action's
releases</a>.</em></p>
<blockquote>
<h2>v3.30.5</h2>
<h1>CodeQL Action Changelog</h1>
<p>See the <a
href="https://github.com/github/codeql-action/releases">releases
page</a> for the relevant changes to the CodeQL CLI and language
packs.</p>
<h2>3.30.5 - 26 Sep 2025</h2>
<ul>
<li>We fixed a bug that was introduced in <code>3.30.4</code> with
<code>upload-sarif</code> which resulted in files without a
<code>.sarif</code> extension not getting uploaded. <a
href="https://redirect.github.com/github/codeql-action/pull/3160">#3160</a></li>
</ul>
<p>See the full <a
href="https://github.com/github/codeql-action/blob/v3.30.5/CHANGELOG.md">CHANGELOG.md</a>
for more information.</p>
<h2>v3.30.4</h2>
<h1>CodeQL Action Changelog</h1>
<p>See the <a
href="https://github.com/github/codeql-action/releases">releases
page</a> for the relevant changes to the CodeQL CLI and language
packs.</p>
<h2>3.30.4 - 25 Sep 2025</h2>
<ul>
<li>We have improved the CodeQL Action's ability to validate that the
workflow it is used in does not use different versions of the CodeQL
Action for different workflow steps. Mixing different versions of the
CodeQL Action in the same workflow is unsupported and can lead to
unpredictable results. A warning will now be emitted from the
<code>codeql-action/init</code> step if different versions of the CodeQL
Action are detected in the workflow file. Additionally, an error will
now be thrown by the other CodeQL Action steps if they load a
configuration file that was generated by a different version of the
<code>codeql-action/init</code> step. <a
href="https://redirect.github.com/github/codeql-action/pull/3099">#3099</a>
and <a
href="https://redirect.github.com/github/codeql-action/pull/3100">#3100</a></li>
<li>We added support for reducing the size of dependency caches for Java
analyses, which will reduce cache usage and speed up workflows. This
will be enabled automatically at a later time. <a
href="https://redirect.github.com/github/codeql-action/pull/3107">#3107</a></li>
<li>You can now run the latest CodeQL nightly bundle by passing
<code>tools: nightly</code> to the <code>init</code> action. In general,
the nightly bundle is unstable and we only recommend running it when
directed by GitHub staff. <a
href="https://redirect.github.com/github/codeql-action/pull/3130">#3130</a></li>
<li>Update default CodeQL bundle version to 2.23.1. <a
href="https://redirect.github.com/github/codeql-action/pull/3118">#3118</a></li>
</ul>
<p>See the full <a
href="https://github.com/github/codeql-action/blob/v3.30.4/CHANGELOG.md">CHANGELOG.md</a>
for more information.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/github/codeql-action/blob/main/CHANGELOG.md">github/codeql-action's
changelog</a>.</em></p>
<blockquote>
<h1>CodeQL Action Changelog</h1>
<p>See the <a
href="https://github.com/github/codeql-action/releases">releases
page</a> for the relevant changes to the CodeQL CLI and language
packs.</p>
<h2>[UNRELEASED]</h2>
<p>No user facing changes.</p>
<h2>3.30.5 - 26 Sep 2025</h2>
<ul>
<li>We fixed a bug that was introduced in <code>3.30.4</code> with
<code>upload-sarif</code> which resulted in files without a
<code>.sarif</code> extension not getting uploaded. <a
href="https://redirect.github.com/github/codeql-action/pull/3160">#3160</a></li>
</ul>
<h2>3.30.4 - 25 Sep 2025</h2>
<ul>
<li>We have improved the CodeQL Action's ability to validate that the
workflow it is used in does not use different versions of the CodeQL
Action for different workflow steps. Mixing different versions of the
CodeQL Action in the same workflow is unsupported and can lead to
unpredictable results. A warning will now be emitted from the
<code>codeql-action/init</code> step if different versions of the CodeQL
Action are detected in the workflow file. Additionally, an error will
now be thrown by the other CodeQL Action steps if they load a
configuration file that was generated by a different version of the
<code>codeql-action/init</code> step. <a
href="https://redirect.github.com/github/codeql-action/pull/3099">#3099</a>
and <a
href="https://redirect.github.com/github/codeql-action/pull/3100">#3100</a></li>
<li>We added support for reducing the size of dependency caches for Java
analyses, which will reduce cache usage and speed up workflows. This
will be enabled automatically at a later time. <a
href="https://redirect.github.com/github/codeql-action/pull/3107">#3107</a></li>
<li>You can now run the latest CodeQL nightly bundle by passing
<code>tools: nightly</code> to the <code>init</code> action. In general,
the nightly bundle is unstable and we only recommend running it when
directed by GitHub staff. <a
href="https://redirect.github.com/github/codeql-action/pull/3130">#3130</a></li>
<li>Update default CodeQL bundle version to 2.23.1. <a
href="https://redirect.github.com/github/codeql-action/pull/3118">#3118</a></li>
</ul>
<h2>3.30.3 - 10 Sep 2025</h2>
<p>No user facing changes.</p>
<h2>3.30.2 - 09 Sep 2025</h2>
<ul>
<li>Fixed a bug which could cause language autodetection to fail. <a
href="https://redirect.github.com/github/codeql-action/pull/3084">#3084</a></li>
<li>Experimental: The <code>quality-queries</code> input that was added
in <code>3.29.2</code> as part of an internal experiment is now
deprecated and will be removed in an upcoming version of the CodeQL
Action. It has been superseded by a new <code>analysis-kinds</code>
input, which is part of the same internal experiment. Do not use this in
production as it is subject to change at any time. <a
href="https://redirect.github.com/github/codeql-action/pull/3064">#3064</a></li>
</ul>
<h2>3.30.1 - 05 Sep 2025</h2>
<ul>
<li>Update default CodeQL bundle version to 2.23.0. <a
href="https://redirect.github.com/github/codeql-action/pull/3077">#3077</a></li>
</ul>
<h2>3.30.0 - 01 Sep 2025</h2>
<ul>
<li>Reduce the size of the CodeQL Action, speeding up workflows by
approximately 4 seconds. <a
href="https://redirect.github.com/github/codeql-action/pull/3054">#3054</a></li>
</ul>
<h2>3.29.11 - 21 Aug 2025</h2>
<ul>
<li>Update default CodeQL bundle version to 2.22.4. <a
href="https://redirect.github.com/github/codeql-action/pull/3044">#3044</a></li>
</ul>
<h2>3.29.10 - 18 Aug 2025</h2>
<p>No user facing changes.</p>
<h2>3.29.9 - 12 Aug 2025</h2>
<p>No user facing changes.</p>
<h2>3.29.8 - 08 Aug 2025</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="3599b3baa1"><code>3599b3b</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3161">#3161</a>
from github/update-v3.30.5-0a67bd46a</li>
<li><a
href="2ca0085e58"><code>2ca0085</code></a>
Update changelog for v3.30.5</li>
<li><a
href="0a67bd46a0"><code>0a67bd4</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3160">#3160</a>
from github/mbg/fix/upload-sarif</li>
<li><a
href="8e34f2f3bf"><code>8e34f2f</code></a>
Add changelog</li>
<li><a
href="0b7fc56648"><code>0b7fc56</code></a>
Fix <code>upload-sarif</code> not uploading non-<code>.sarif</code>
files</li>
<li><a
href="94a9b7a110"><code>94a9b7a</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3155">#3155</a>
from github/mbg/node/no-install-in-actions</li>
<li><a
href="a0ae9ba202"><code>a0ae9ba</code></a>
Log what the script is doing</li>
<li><a
href="b27a8ef21f"><code>b27a8ef</code></a>
Exit if running in an Actions workflow</li>
<li><a
href="65925679a3"><code>6592567</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3139">#3139</a>
from github/henrymercer/fix-log-message</li>
<li><a
href="fa64a7dee6"><code>fa64a7d</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3154">#3154</a>
from github/mbg/node/check-up-to-date-deps</li>
<li>Additional commits viewable in <a
href="192325c861...3599b3baa1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github/codeql-action&package-manager=github_actions&previous-version=3.30.3&new-version=3.30.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-02 20:53:45 +02:00
dependabot[bot]
c952556164 Bump @renovatebot/pep440 from 4.2.0 to 4.2.1 (#581)
Bumps [@renovatebot/pep440](https://github.com/renovatebot/pep440) from
4.2.0 to 4.2.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/renovatebot/pep440/releases"><code>@​renovatebot/pep440</code>'s
releases</a>.</em></p>
<blockquote>
<h2>4.2.1</h2>
<h2><a
href="https://github.com/renovatebot/pep440/compare/4.2.0...4.2.1">4.2.1</a>
(2025-09-18)</h2>
<h3>Build System</h3>
<ul>
<li>use oidc for publish (<a
href="02515aedb7">02515ae</a>)</li>
</ul>
<h3>Continuous Integration</h3>
<ul>
<li>revert change (<a
href="e41926aecd">e41926a</a>)</li>
<li>Update codecov-action hash to
39a2af19d997be74586469d4062e173ecae614f6 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/960">#960</a>)
(<a
href="43cb5f8f75">43cb5f8</a>)</li>
</ul>
<h3>Miscellaneous Chores</h3>
<ul>
<li><strong>deps:</strong> lock file maintenance (<a
href="https://redirect.github.com/renovatebot/pep440/issues/959">#959</a>)
(<a
href="c6721211ef">c672121</a>)</li>
<li><strong>deps:</strong> lock file maintenance (<a
href="https://redirect.github.com/renovatebot/pep440/issues/965">#965</a>)
(<a
href="424fe8a869">424fe8a</a>)</li>
<li><strong>deps:</strong> lock file maintenance (<a
href="https://redirect.github.com/renovatebot/pep440/issues/969">#969</a>)
(<a
href="1a297fab44">1a297fa</a>)</li>
<li><strong>deps:</strong> lock file maintenance (<a
href="https://redirect.github.com/renovatebot/pep440/issues/972">#972</a>)
(<a
href="8f39aacdd8">8f39aac</a>)</li>
<li><strong>deps:</strong> lock file maintenance (<a
href="https://redirect.github.com/renovatebot/pep440/issues/979">#979</a>)
(<a
href="504fa6f22a">504fa6f</a>)</li>
<li><strong>deps:</strong> update codecov/codecov-action action to
v5.5.0 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/963">#963</a>)
(<a
href="50ee8be556">50ee8be</a>)</li>
<li><strong>deps:</strong> update codecov/codecov-action action to
v5.5.1 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/971">#971</a>)
(<a
href="50b7d0b1aa">50b7d0b</a>)</li>
<li><strong>deps:</strong> update dependency <code>@​eslint/js</code> to
v9.33.0 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/957">#957</a>)
(<a
href="468994c416">468994c</a>)</li>
<li><strong>deps:</strong> update dependency <code>@​eslint/js</code> to
v9.35.0 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/977">#977</a>)
(<a
href="42f5851a14">42f5851</a>)</li>
<li><strong>deps:</strong> update dependency <code>@​types/node</code>
to v20.19.10 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/956">#956</a>)
(<a
href="075fa2f3dd">075fa2f</a>)</li>
<li><strong>deps:</strong> update dependency <code>@​types/node</code>
to v20.19.11 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/964">#964</a>)
(<a
href="a37b049b7d">a37b049</a>)</li>
<li><strong>deps:</strong> update dependency <code>@​types/node</code>
to v20.19.12 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/975">#975</a>)
(<a
href="04979bbeb8">04979bb</a>)</li>
<li><strong>deps:</strong> update dependency <code>@​types/node</code>
to v20.19.13 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/976">#976</a>)
(<a
href="1b7cace42e">1b7cace</a>)</li>
<li><strong>deps:</strong> update dependency eslint to v9.33.0 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/958">#958</a>)
(<a
href="d55913a7fb">d55913a</a>)</li>
<li><strong>deps:</strong> update dependency eslint to v9.35.0 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/978">#978</a>)
(<a
href="a1356fd607">a1356fd</a>)</li>
<li><strong>deps:</strong> update dependency semantic-release to v24.2.8
(<a
href="https://redirect.github.com/renovatebot/pep440/issues/981">#981</a>)
(<a
href="33102f7d33">33102f7</a>)</li>
<li><strong>deps:</strong> update dependency typescript-eslint to
v8.39.1 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/962">#962</a>)
(<a
href="0c01e3be4d">0c01e3b</a>)</li>
<li><strong>deps:</strong> update dependency typescript-eslint to
v8.40.0 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/966">#966</a>)
(<a
href="1577c38d37">1577c38</a>)</li>
<li><strong>deps:</strong> update dependency typescript-eslint to
v8.41.0 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/970">#970</a>)
(<a
href="1336ccae66">1336cca</a>)</li>
<li><strong>deps:</strong> update dependency typescript-eslint to
v8.42.0 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/974">#974</a>)
(<a
href="ef8eb35e02">ef8eb35</a>)</li>
<li><strong>deps:</strong> update dependency typescript-eslint to
v8.43.0 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/980">#980</a>)
(<a
href="230fdf203d">230fdf2</a>)</li>
<li><strong>deps:</strong> update linters to v9.34.0 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/968">#968</a>)
(<a
href="417c499fd3">417c499</a>)</li>
<li><strong>deps:</strong> update pnpm to v10.15.0 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/967">#967</a>)
(<a
href="89e8dd7e31">89e8dd7</a>)</li>
<li><strong>deps:</strong> update pnpm to v10.15.1 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/973">#973</a>)
(<a
href="e288af8bed">e288af8</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e41926aecd"><code>e41926a</code></a>
ci: revert change</li>
<li><a
href="02515aedb7"><code>02515ae</code></a>
build: use oidc for publish</li>
<li><a
href="33102f7d33"><code>33102f7</code></a>
chore(deps): update dependency semantic-release to v24.2.8 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/981">#981</a>)</li>
<li><a
href="230fdf203d"><code>230fdf2</code></a>
chore(deps): update dependency typescript-eslint to v8.43.0 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/980">#980</a>)</li>
<li><a
href="504fa6f22a"><code>504fa6f</code></a>
chore(deps): lock file maintenance (<a
href="https://redirect.github.com/renovatebot/pep440/issues/979">#979</a>)</li>
<li><a
href="a1356fd607"><code>a1356fd</code></a>
chore(deps): update dependency eslint to v9.35.0 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/978">#978</a>)</li>
<li><a
href="42f5851a14"><code>42f5851</code></a>
chore(deps): update dependency <code>@​eslint/js</code> to v9.35.0 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/977">#977</a>)</li>
<li><a
href="1b7cace42e"><code>1b7cace</code></a>
chore(deps): update dependency <code>@​types/node</code> to v20.19.13
(<a
href="https://redirect.github.com/renovatebot/pep440/issues/976">#976</a>)</li>
<li><a
href="04979bbeb8"><code>04979bb</code></a>
chore(deps): update dependency <code>@​types/node</code> to v20.19.12
(<a
href="https://redirect.github.com/renovatebot/pep440/issues/975">#975</a>)</li>
<li><a
href="ef8eb35e02"><code>ef8eb35</code></a>
chore(deps): update dependency typescript-eslint to v8.42.0 (<a
href="https://redirect.github.com/renovatebot/pep440/issues/974">#974</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/renovatebot/pep440/compare/4.2.0...4.2.1">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by [GitHub Actions](<a
href="https://www.npmjs.com/~GitHub">https://www.npmjs.com/~GitHub</a>
Actions), a new releaser for <code>@​renovatebot/pep440</code> since
your current version.</p>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@renovatebot/pep440&package-manager=npm_and_yarn&previous-version=4.2.0&new-version=4.2.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-02 20:53:30 +02:00
Kevin Stillhammer
51c3328db2 Fix test-uv-no-modify-path (#604) 2025-10-02 20:52:56 +02:00
Kevin Stillhammer
f2859da213 Respect UV_NO_MODIFY_PATH (#603)
Fixes: #519
2025-10-02 17:54:15 +02:00
James Braza
f9c6974d8b Warn when UV_CACHE_DIR has changed (#601)
Closes https://github.com/astral-sh/setup-uv/issues/592
2025-10-02 17:50:15 +02:00
Kevin Stillhammer
82f21a54fe Don't assume all test passed if cancelled (#599) 2025-09-30 20:05:38 +02:00
Kevin Stillhammer
d8a37f6566 Shortcut to latest version for minimum version specifier (#598)
This is faster than downloading all available versions from GitHub to
determine the highest matching version.

Fixes: #585
2025-09-30 19:55:27 +02:00
Kevin Stillhammer
d0cc045d04 Always show prune cache output (#597) 2025-09-30 17:05:27 +02:00
dependabot[bot]
2841f9f5c1 Bump zizmorcore/zizmor-action from 0.1.2 to 0.2.0 (#571)
Bumps
[zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action)
from 0.1.2 to 0.2.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/zizmorcore/zizmor-action/releases">zizmorcore/zizmor-action's
releases</a>.</em></p>
<blockquote>
<h2>v0.2.0</h2>
<h2>What's Changed</h2>
<ul>
<li>feat: add support for <code>color</code> input by <a
href="https://github.com/birjj"><code>@​birjj</code></a> in <a
href="https://redirect.github.com/zizmorcore/zizmor-action/pull/37">zizmorcore/zizmor-action#37</a></li>
<li>Adding option for GitHub annotations by <a
href="https://github.com/abdelq"><code>@​abdelq</code></a> in <a
href="https://redirect.github.com/zizmorcore/zizmor-action/pull/45">zizmorcore/zizmor-action#45</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/birjj"><code>@​birjj</code></a> made
their first contribution in <a
href="https://redirect.github.com/zizmorcore/zizmor-action/pull/37">zizmorcore/zizmor-action#37</a></li>
<li><a href="https://github.com/abdelq"><code>@​abdelq</code></a> made
their first contribution in <a
href="https://redirect.github.com/zizmorcore/zizmor-action/pull/45">zizmorcore/zizmor-action#45</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/zizmorcore/zizmor-action/compare/v0.1.2...v0.2.0">https://github.com/zizmorcore/zizmor-action/compare/v0.1.2...v0.2.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e673c3917a"><code>e673c39</code></a>
Adding option for GitHub annotations (<a
href="https://redirect.github.com/zizmorcore/zizmor-action/issues/45">#45</a>)</li>
<li><a
href="2d5a33f24d"><code>2d5a33f</code></a>
chore: add missing license (<a
href="https://redirect.github.com/zizmorcore/zizmor-action/issues/44">#44</a>)</li>
<li><a
href="a016d81e77"><code>a016d81</code></a>
chore(deps): bump github/codeql-action in the github-actions group (<a
href="https://redirect.github.com/zizmorcore/zizmor-action/issues/39">#39</a>)</li>
<li><a
href="a8fb1d7e7d"><code>a8fb1d7</code></a>
feat: add support for <code>color</code> input (<a
href="https://redirect.github.com/zizmorcore/zizmor-action/issues/37">#37</a>)</li>
<li><a
href="09680325f5"><code>0968032</code></a>
chore(deps): bump the github-actions group with 2 updates (<a
href="https://redirect.github.com/zizmorcore/zizmor-action/issues/35">#35</a>)</li>
<li><a
href="7f2abfff74"><code>7f2abff</code></a>
README: bump pins (<a
href="https://redirect.github.com/zizmorcore/zizmor-action/issues/33">#33</a>)</li>
<li>See full diff in <a
href="5ca5fc7a47...e673c3917a">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=zizmorcore/zizmor-action&package-manager=github_actions&previous-version=0.1.2&new-version=0.2.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-26 12:26:17 +02:00
James Duley
e554b93b80 Add **/*.py.lock to cache-dependency-glob (#590)
This means uv scripts will be covered by default

Fixes https://github.com/astral-sh/setup-uv/issues/586
2025-09-26 12:26:03 +02:00
eifinger
c7d85d9988 chore: update known versions for 0.8.20 2025-09-23 06:29:52 +00:00
Kevin Stillhammer
07f2cb5db9 persist credentials for version update (#584) 2025-09-23 08:28:27 +02:00
Christian Clauss
208b0c0ee4 README.md: Fix Python versions and update checkout action (#572) 2025-09-16 09:59:44 +02:00
Kevin Stillhammer
b75a909f75 bump deps (#569) 2025-09-14 13:04:41 +00:00
dependabot[bot]
ffff8aa2b5 Bump github/codeql-action from 3.29.11 to 3.30.3 (#566)
Bumps [github/codeql-action](https://github.com/github/codeql-action)
from 3.29.11 to 3.30.3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/github/codeql-action/releases">github/codeql-action's
releases</a>.</em></p>
<blockquote>
<h2>v3.30.3</h2>
<h1>CodeQL Action Changelog</h1>
<p>See the <a
href="https://github.com/github/codeql-action/releases">releases
page</a> for the relevant changes to the CodeQL CLI and language
packs.</p>
<h2>3.30.3 - 10 Sep 2025</h2>
<p>No user facing changes.</p>
<p>See the full <a
href="https://github.com/github/codeql-action/blob/v3.30.3/CHANGELOG.md">CHANGELOG.md</a>
for more information.</p>
<h2>v3.30.2</h2>
<h1>CodeQL Action Changelog</h1>
<p>See the <a
href="https://github.com/github/codeql-action/releases">releases
page</a> for the relevant changes to the CodeQL CLI and language
packs.</p>
<h2>3.30.2 - 09 Sep 2025</h2>
<ul>
<li>Fixed a bug which could cause language autodetection to fail. <a
href="https://redirect.github.com/github/codeql-action/pull/3084">#3084</a></li>
<li>Experimental: The <code>quality-queries</code> input that was added
in <code>3.29.2</code> as part of an internal experiment is now
deprecated and will be removed in an upcoming version of the CodeQL
Action. It has been superseded by a new <code>analysis-kinds</code>
input, which is part of the same internal experiment. Do not use this in
production as it is subject to change at any time. <a
href="https://redirect.github.com/github/codeql-action/pull/3064">#3064</a></li>
</ul>
<p>See the full <a
href="https://github.com/github/codeql-action/blob/v3.30.2/CHANGELOG.md">CHANGELOG.md</a>
for more information.</p>
<h2>v3.30.1</h2>
<h1>CodeQL Action Changelog</h1>
<p>See the <a
href="https://github.com/github/codeql-action/releases">releases
page</a> for the relevant changes to the CodeQL CLI and language
packs.</p>
<h2>3.30.1 - 05 Sep 2025</h2>
<ul>
<li>Update default CodeQL bundle version to 2.23.0. <a
href="https://redirect.github.com/github/codeql-action/pull/3077">#3077</a></li>
</ul>
<p>See the full <a
href="https://github.com/github/codeql-action/blob/v3.30.1/CHANGELOG.md">CHANGELOG.md</a>
for more information.</p>
<h2>v3.30.0</h2>
<h1>CodeQL Action Changelog</h1>
<p>See the <a
href="https://github.com/github/codeql-action/releases">releases
page</a> for the relevant changes to the CodeQL CLI and language
packs.</p>
<h2>3.30.0 - 01 Sep 2025</h2>
<ul>
<li>Reduce the size of the CodeQL Action, speeding up workflows by
approximately 4 seconds. <a
href="https://redirect.github.com/github/codeql-action/pull/3054">#3054</a></li>
</ul>
<p>See the full <a
href="https://github.com/github/codeql-action/blob/v3.30.0/CHANGELOG.md">CHANGELOG.md</a>
for more information.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/github/codeql-action/blob/main/CHANGELOG.md">github/codeql-action's
changelog</a>.</em></p>
<blockquote>
<h1>CodeQL Action Changelog</h1>
<p>See the <a
href="https://github.com/github/codeql-action/releases">releases
page</a> for the relevant changes to the CodeQL CLI and language
packs.</p>
<h2>[UNRELEASED]</h2>
<p>No user facing changes.</p>
<h2>3.30.3 - 10 Sep 2025</h2>
<p>No user facing changes.</p>
<h2>3.30.2 - 09 Sep 2025</h2>
<ul>
<li>Fixed a bug which could cause language autodetection to fail. <a
href="https://redirect.github.com/github/codeql-action/pull/3084">#3084</a></li>
<li>Experimental: The <code>quality-queries</code> input that was added
in <code>3.29.2</code> as part of an internal experiment is now
deprecated and will be removed in an upcoming version of the CodeQL
Action. It has been superseded by a new <code>analysis-kinds</code>
input, which is part of the same internal experiment. Do not use this in
production as it is subject to change at any time. <a
href="https://redirect.github.com/github/codeql-action/pull/3064">#3064</a></li>
</ul>
<h2>3.30.1 - 05 Sep 2025</h2>
<ul>
<li>Update default CodeQL bundle version to 2.23.0. <a
href="https://redirect.github.com/github/codeql-action/pull/3077">#3077</a></li>
</ul>
<h2>3.30.0 - 01 Sep 2025</h2>
<ul>
<li>Reduce the size of the CodeQL Action, speeding up workflows by
approximately 4 seconds. <a
href="https://redirect.github.com/github/codeql-action/pull/3054">#3054</a></li>
</ul>
<h2>3.29.11 - 21 Aug 2025</h2>
<ul>
<li>Update default CodeQL bundle version to 2.22.4. <a
href="https://redirect.github.com/github/codeql-action/pull/3044">#3044</a></li>
</ul>
<h2>3.29.10 - 18 Aug 2025</h2>
<p>No user facing changes.</p>
<h2>3.29.9 - 12 Aug 2025</h2>
<p>No user facing changes.</p>
<h2>3.29.8 - 08 Aug 2025</h2>
<ul>
<li>Fix an issue where the Action would autodetect unsupported languages
such as HTML. <a
href="https://redirect.github.com/github/codeql-action/pull/3015">#3015</a></li>
</ul>
<h2>3.29.7 - 07 Aug 2025</h2>
<p>This release rolls back 3.29.6 to address issues with language
autodetection. It is identical to 3.29.5.</p>
<h2>3.29.6 - 07 Aug 2025</h2>
<ul>
<li>The <code>cleanup-level</code> input to the <code>analyze</code>
Action is now deprecated. The CodeQL Action has written a limited amount
of intermediate results to the database since version 2.2.5, and now
automatically manages cleanup. <a
href="https://redirect.github.com/github/codeql-action/pull/2999">#2999</a></li>
<li>Update default CodeQL bundle version to 2.22.3. <a
href="https://redirect.github.com/github/codeql-action/pull/3000">#3000</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="192325c861"><code>192325c</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3104">#3104</a>
from github/update-v3.30.3-b660efdcf</li>
<li><a
href="e68956d90b"><code>e68956d</code></a>
Update changelog for v3.30.3</li>
<li><a
href="b660efdcfd"><code>b660efd</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3103">#3103</a>
from github/mbg/fix/category-check</li>
<li><a
href="e49458befe"><code>e49458b</code></a>
Fix <code>runInterpretResultsFor</code> using the wrong
<code>AnalysisConfig</code> for <code>category</code> fix</li>
<li><a
href="f374a62c8b"><code>f374a62</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3098">#3098</a>
from github/kaspersv/increase-overlay-base-size-limit</li>
<li><a
href="5efa438e92"><code>5efa438</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3101">#3101</a>
from github/mbg/public-repo-notice-in-pr-template</li>
<li><a
href="8a84a62542"><code>8a84a62</code></a>
Overlay: Increase size limit for cached overlay base database</li>
<li><a
href="eb50a881d8"><code>eb50a88</code></a>
Merge pull request <a
href="https://redirect.github.com/github/codeql-action/issues/3097">#3097</a>
from github/redsun82/only-dump-sarif</li>
<li><a
href="4c534612bf"><code>4c53461</code></a>
Tweak sarif dump log</li>
<li><a
href="dae3742b0a"><code>dae3742</code></a>
Dump soon to be uploaded SARIF on request</li>
<li>Additional commits viewable in <a
href="3c3833e0f8...192325c861">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github/codeql-action&package-manager=github_actions&previous-version=3.29.11&new-version=3.30.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-14 14:58:58 +02:00
dependabot[bot]
95d0e233fa Bump actions/setup-node from 4.4.0 to 5.0.0 (#551)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from
4.4.0 to 5.0.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/setup-node/releases">actions/setup-node's
releases</a>.</em></p>
<blockquote>
<h2>v5.0.0</h2>
<h2>What's Changed</h2>
<h3>Breaking Changes</h3>
<ul>
<li>Upgrade action to use node24 by <a
href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a> in <a
href="https://redirect.github.com/actions/setup-node/pull/1325">actions/setup-node#1325</a></li>
</ul>
<p>Make sure your runner is updated to this version or newer to use this
release. v2.327.1 <a
href="https://github.com/actions/runner/releases/tag/v2.327.1">Release
Notes</a></p>
<h3>Dependency Upgrades</h3>
<ul>
<li>Upgrade <code>@​octokit/request-error</code> and
<code>@​actions/github</code> by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/setup-node/pull/1227">actions/setup-node#1227</a></li>
<li>Upgrade uuid from 9.0.1 to 11.1.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/setup-node/pull/1273">actions/setup-node#1273</a></li>
<li>Upgrade undici from 5.28.5 to 5.29.0 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/setup-node/pull/1295">actions/setup-node#1295</a></li>
<li>Upgrade form-data to bring in fix for critical vulnerability by <a
href="https://github.com/gowridurgad"><code>@​gowridurgad</code></a> in
<a
href="https://redirect.github.com/actions/setup-node/pull/1332">actions/setup-node#1332</a></li>
<li>Upgrade actions/checkout from 4 to 5 by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/actions/setup-node/pull/1345">actions/setup-node#1345</a></li>
</ul>
<h3>Enhancement:</h3>
<ul>
<li>Enhance caching in setup-node with automatic package manager
detection by <a
href="https://github.com/priya-kinthali"><code>@​priya-kinthali</code></a>
in <a
href="https://redirect.github.com/actions/setup-node/pull/1348">actions/setup-node#1348</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/priya-kinthali"><code>@​priya-kinthali</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/setup-node/pull/1348">actions/setup-node#1348</a></li>
<li><a href="https://github.com/salmanmkc"><code>@​salmanmkc</code></a>
made their first contribution in <a
href="https://redirect.github.com/actions/setup-node/pull/1325">actions/setup-node#1325</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/setup-node/compare/v4...v5.0.0">https://github.com/actions/setup-node/compare/v4...v5.0.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="a0853c2454"><code>a0853c2</code></a>
Bump actions/checkout from 4 to 5 (<a
href="https://redirect.github.com/actions/setup-node/issues/1345">#1345</a>)</li>
<li><a
href="b7234cc9fe"><code>b7234cc</code></a>
Upgrade action to use node24 (<a
href="https://redirect.github.com/actions/setup-node/issues/1325">#1325</a>)</li>
<li><a
href="d7a11313b5"><code>d7a1131</code></a>
Enhance caching in setup-node with automatic package manager detection
(<a
href="https://redirect.github.com/actions/setup-node/issues/1348">#1348</a>)</li>
<li><a
href="5e2628c959"><code>5e2628c</code></a>
Bumps form-data (<a
href="https://redirect.github.com/actions/setup-node/issues/1332">#1332</a>)</li>
<li><a
href="65beceff8e"><code>65becef</code></a>
Bump undici from 5.28.5 to 5.29.0 (<a
href="https://redirect.github.com/actions/setup-node/issues/1295">#1295</a>)</li>
<li><a
href="7e24a656e1"><code>7e24a65</code></a>
Bump uuid from 9.0.1 to 11.1.0 (<a
href="https://redirect.github.com/actions/setup-node/issues/1273">#1273</a>)</li>
<li><a
href="08f58d1471"><code>08f58d1</code></a>
Bump <code>@​octokit/request-error</code> and
<code>@​actions/github</code> (<a
href="https://redirect.github.com/actions/setup-node/issues/1227">#1227</a>)</li>
<li>See full diff in <a
href="49933ea528...a0853c2454">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/setup-node&package-manager=github_actions&previous-version=4.4.0&new-version=5.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-14 14:57:21 +02:00
Kevin Stillhammer
dc724a12b6 Add inputs restore-cache and save-cache (#568)
Closes: #555
2025-09-14 14:55:08 +02:00
Kevin Stillhammer
f67343ac2e Automatically push updated known versions (#565) 2025-09-11 09:12:35 +00:00
github-actions[bot]
4dd9f52a47 chore: update known versions for 0.8.16/0.8.17 (#562)
chore: update known versions for 0.8.17

Co-authored-by: eifinger <1481961+eifinger@users.noreply.github.com>
2025-09-11 05:31:10 +00:00
github-actions[bot]
e1e6fe7910 chore: update known versions for 0.8.15 (#550)
chore: update known versions for 0.8.15

Co-authored-by: eifinger <1481961+eifinger@users.noreply.github.com>
2025-09-04 05:53:47 +00:00
William Woodruff
b1836110f7 chore(ci): address CI lint findings (#545)
This addresses all of zizmor's non-pedantic findings, and adds a
workflow to proactively flag any more that come in.

Key changes:

* I've hash-pinned all actions references. Dependabot will continue to
keep these updated and will update the hash comments as well.
* I've marked every `actions/checkout` with `persist-credentials: false`
except for one that actually needs persisted credentials (which I've
explicitly enabled with an explanatory comment)
* I've dropped some workflow-level permissions in favor of job-level
permissions that were already provisioned.
* I fixed two small template injections caused by expanding output
contexts. I think these were not exploitable in practice, but fixing
them is good for defense in depth (and makes spellcheck work nicely on
these steps).

---------

Signed-off-by: William Woodruff <william@astral.sh>
2025-09-02 13:29:06 +00:00
34 changed files with 9595 additions and 1994 deletions

View File

@@ -7,3 +7,7 @@ self-hosted-runner:
# organization. `null` means disabling configuration variables check.
# Empty array means no configuration variable is allowed.
config-variables: null
paths:
.github/workflows/test.yml:
ignore:
- 'invalid runner name.+'

225
.github/copilot-instructions.md vendored Normal file
View File

@@ -0,0 +1,225 @@
# Copilot Instructions for setup-uv
This document provides essential information for GitHub Copilot coding agents working on the `astral-sh/setup-uv` repository.
## Repository Overview
**setup-uv** is a GitHub Action that sets up the [uv](https://docs.astral.sh/uv/) Python package installer in GitHub Actions workflows. It's a TypeScript-based action that downloads uv binaries, manages caching, handles version resolution, and configures the environment for subsequent workflow steps.
### Key Features
- Downloads and installs specific uv versions from GitHub releases
- Supports version resolution from config files (pyproject.toml, uv.toml, .tool-versions)
- Implements intelligent caching for both uv cache and Python installations
- Provides cross-platform support (Linux, macOS, Windows, including ARM architectures)
- Includes problem matchers for Python error reporting
- Supports environment activation and custom tool directories
## Repository Structure
**Size**: Small-medium repository (~50 source files, ~400 total files including dependencies)
**Languages**: TypeScript (primary), JavaScript (compiled output), JSON (configuration)
**Runtime**: Node.js 24 (GitHub Actions runtime)
**Key Dependencies**: @actions/core, @actions/cache, @actions/tool-cache, @octokit/core
### Core Architecture
```
src/
├── setup-uv.ts # Main entry point and orchestration
├── save-cache.ts # Post-action cache saving logic
├── update-known-versions.ts # Maintenance script for version updates
├── cache/ # Cache management functionality
├── download/ # Version resolution and binary downloading
├── utils/ # Input parsing, platform detection, configuration
└── version/ # Version resolution from various file formats
```
### Key Files and Locations
- **Action Definition**: `action.yml` - Defines all inputs/outputs and entry points
- **Main Source**: `src/setup-uv.ts` - Primary action logic
- **Configuration**: `biome.json` (linting), `tsconfig.json` (TypeScript), `jest.config.js` (testing)
- **Compiled Output**: `dist/` - Contains compiled Node.js bundles (auto-generated, committed)
- **Test Fixtures**: `__tests__/fixtures/` - Sample projects for different configuration scenarios
- **Workflows**: `.github/workflows/test.yml` - Comprehensive CI/CD pipeline
## Build and Development Process
### Prerequisites
- Node.js 24+ (matches GitHub Actions runtime)
- npm (included with Node.js)
### Essential Commands (ALWAYS run in this order)
#### 1. Install Dependencies
```bash
npm install
```
**Timing**: ~20-30 seconds
**Note**: Always run this first after cloning or when package.json changes
#### 2. Build TypeScript
```bash
npm run build
```
**Timing**: ~5-10 seconds
**Purpose**: Compiles TypeScript source to JavaScript in `lib/` directory
#### 3. Lint and Format Code
```bash
npm run check
```
**Timing**: ~2-5 seconds
**Tool**: Biome (replaces ESLint/Prettier)
**Auto-fixes**: Formatting, import organization, basic linting issues
#### 4. Package for Distribution
```bash
npm run package
```
**Timing**: ~20-30 seconds
**Purpose**: Creates bundled distributions in `dist/` using @vercel/ncc
**Critical**: This step MUST be run before committing - the `dist/` files are used by GitHub Actions
#### 5. Run Tests
```bash
npm test
```
**Timing**: ~10-15 seconds
**Framework**: Jest with TypeScript support
**Coverage**: Unit tests for version resolution, input parsing, checksum validation
#### 6. Complete Validation (Recommended)
```bash
npm run all
```
**Timing**: ~60-90 seconds
**Purpose**: Runs build → check → package → test in sequence
**Use**: Before making pull requests or when unsure about build state
### Important Build Notes
**CRITICAL**: Always run `npm run package` after making code changes. The `dist/` directory contains the compiled bundles that GitHub Actions actually executes. Forgetting this step will cause your changes to have no effect.
**TypeScript Warnings**: You may see ts-jest warnings about "isolatedModules" - these are harmless and don't affect functionality.
**Biome**: This project uses Biome instead of ESLint/Prettier. Run `npm run check` to fix formatting and linting issues automatically.
## Testing Strategy
### Unit Tests
- **Location**: `__tests__/` directory
- **Framework**: Jest with ts-jest transformer
- **Coverage**: Version resolution, input parsing, checksum validation, utility functions
### Integration Tests
- **Location**: `.github/workflows/test.yml`
- **Scope**: Full end-to-end testing across multiple platforms and scenarios
- **Key Test Categories**:
- Version installation (specific, latest, semver ranges)
- Cache behavior (setup, restore, invalidation)
- Cross-platform compatibility (Ubuntu, macOS, Windows, ARM)
- Configuration file parsing (pyproject.toml, uv.toml, requirements.txt)
- Error handling and edge cases
### Test Fixtures
Located in `__tests__/fixtures/`, these provide sample projects with different configurations:
- `pyproject-toml-project/` - Standard Python project with uv version specification
- `uv-toml-project/` - Project using uv.toml configuration
- `requirements-txt-project/` - Legacy requirements.txt format
- `cache-dir-defined-project/` - Custom cache directory configuration
## Continuous Integration
### GitHub Workflows
#### Primary Test Suite (`.github/workflows/test.yml`)
- **Triggers**: PRs, pushes to main, manual dispatch
- **Matrix**: Multiple OS (Ubuntu, macOS, Windows), architecture (x64, ARM), and configuration combinations
- **Duration**: ~20-30 minutes for full matrix
- **Key Validations**:
- Cross-platform installation and functionality
- Cache behavior and performance
- Version resolution from various sources
- Tool directory configurations
- Problem matcher functionality
#### Maintenance Workflows
- **CodeQL Analysis**: Security scanning on pushes/PRs
- **Update Known Versions**: Daily job to sync with latest uv releases
- **Dependabot**: Automated dependency updates
### Pre-commit Validation
The CI runs these checks that you should run locally:
1. `npm run all` - Complete build and test suite
2. ActionLint - GitHub Actions workflow validation
3. Change detection - Ensures no uncommitted build artifacts
## Key Configuration Files
### Action Configuration (`action.yml`)
Defines 20+ inputs including version specifications, cache settings, tool directories, and environment options. This file is the authoritative source for understanding available action parameters.
### TypeScript Configuration (`tsconfig.json`)
- Target: ES2024
- Module: nodenext (Node.js modules)
- Strict mode enabled
- Output directory: `lib/`
### Linting Configuration (`biome.json`)
- Formatter and linter combined
- Enforces consistent code style
- Automatically organizes imports and sorts object keys
## Common Development Patterns
### Making Code Changes
1. Edit TypeScript source files in `src/`
2. Run `npm run build` to compile
3. Run `npm run check` to format and lint
4. Run `npm run package` to update distribution bundles
5. Run `npm test` to verify functionality
6. Commit all changes including `dist/` files
### Adding New Features
- Follow existing patterns in `src/utils/inputs.ts` for new action inputs
- Update `action.yml` to declare new inputs/outputs
- Add corresponding tests in `__tests__/`
- Update README.md with usage examples
### Cache-Related Changes
- Cache logic is complex and affects performance significantly
- Test with multiple cache scenarios (hit, miss, invalidation)
- Consider impact on both GitHub-hosted and self-hosted runners
- Validate cache key generation and dependency detection
### Version Resolution Changes
- Version resolution supports multiple file formats and precedence rules
- Test with fixtures in `__tests__/fixtures/`
- Consider backward compatibility with existing projects
- Validate semver and PEP 440 specification handling
## Troubleshooting
### Build Failures
- **"Module not found"**: Run `npm install` to ensure dependencies are installed
- **TypeScript errors**: Check `tsconfig.json` and ensure all imports are valid
- **Test failures**: Check if test fixtures have been modified or if logic changes broke assumptions
### Action Failures in Workflows
- **Changes not taking effect**: Ensure `npm run package` was run and `dist/` files committed
- **Version resolution issues**: Check version specification format and file existence
- **Cache problems**: Verify cache key generation and dependency glob patterns
### Common Gotchas
- **Forgetting to package**: Code changes won't work without running `npm run package`
- **Platform differences**: Windows paths use backslashes, test cross-platform behavior
- **Cache invalidation**: Cache keys are sensitive to dependency file changes
- **Tool directory permissions**: Some platforms require specific directory setups
## Trust These Instructions
These instructions are comprehensive and current. Only search for additional information if:
- You encounter specific error messages not covered here
- You need to understand implementation details of specific functions
- The instructions appear outdated (check repository commit history)
For most development tasks, following the build process and development patterns outlined above will be sufficient.

View File

@@ -0,0 +1,16 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var fs = require("node:fs");
var yaml = require("js-yaml");
var workflow = yaml.load(fs.readFileSync("../workflows/test.yml", "utf8"));
var jobs = Object.keys(workflow.jobs);
var allTestsPassed = workflow.jobs["all-tests-passed"];
var needs = allTestsPassed.needs || [];
var expectedNeeds = jobs.filter(function (j) { return j !== "all-tests-passed"; });
var missing = expectedNeeds.filter(function (j) { return !needs.includes(j); });
if (missing.length > 0) {
console.error("Missing jobs in all-tests-passed needs: ".concat(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.");

View File

@@ -21,6 +21,8 @@ on:
branches:
- main
permissions: {}
jobs:
analyze:
name: Analyze
@@ -39,11 +41,13 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v5
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
uses: github/codeql-action/init@e296a935590eb16afc0c0108289f68c87e2a89a5 # v4.30.7
with:
languages: ${{ matrix.language }}
source-root: src
@@ -55,7 +59,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v3
uses: github/codeql-action/autobuild@e296a935590eb16afc0c0108289f68c87e2a89a5 # v4.30.7
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
@@ -69,4 +73,4 @@ jobs:
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
uses: github/codeql-action/analyze@e296a935590eb16afc0c0108289f68c87e2a89a5 # v4.30.7

View File

@@ -8,6 +8,8 @@ on:
branches:
- main
permissions: {}
jobs:
update_release_draft:
name: ✏️ Draft release
@@ -17,6 +19,6 @@ jobs:
pull-requests: read
steps:
- name: 🚀 Run Release Drafter
uses: release-drafter/release-drafter@v6.1.0
uses: release-drafter/release-drafter@b1476f6e6eb133afa41ed8589daba6dc69b4d3f5 # v6.1.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -18,13 +18,19 @@ permissions:
jobs:
lint:
runs-on: ubuntu-latest
permissions:
security-events: write # for zizmor
steps:
- uses: actions/checkout@v5
- name: Actionlint
uses: eifinger/actionlint-action@23c85443d840cd73bbecb9cddfc933cc21649a38 # v1.9.1
- uses: actions/setup-node@v4
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
node-version: "20"
persist-credentials: false
- name: Actionlint
uses: eifinger/actionlint-action@23c85443d840cd73bbecb9cddfc933cc21649a38 # v1.9.1
- name: Run zizmor
uses: zizmorcore/zizmor-action@e673c3917a1aef3c65c972347ed84ccd013ecda4 # v0.2.0
- uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
node-version: "24"
- run: |
npm install
- run: |
@@ -44,7 +50,9 @@ jobs:
matrix:
os: [ubuntu-latest, macos-latest, macos-14, windows-latest]
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Install latest version
id: setup-uv
uses: ./
@@ -52,78 +60,150 @@ jobs:
working-directory: __tests__/fixtures/uv-project
shell: bash
- name: Check uv-path is set
run: ${{ steps.setup-uv.outputs.uv-path }} --version
run: |
"${UV_PATH}" --version
shell: bash
env:
UV_PATH: ${{ steps.setup-uv.outputs.uv-path }}
- name: Check uvx-path is set
run: ${{ steps.setup-uv.outputs.uvx-path }} --version
run: |
"${UVX_PATH}" --version
shell: bash
env:
UVX_PATH: ${{ steps.setup-uv.outputs.uvx-path }}
test-uv-no-modify-path:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Install with UV_NO_MODIFY_PATH set
id: setup-uv
uses: ./
env:
UV_NO_MODIFY_PATH: 1
- run: |
"${UV_PATH}" sync
working-directory: __tests__/fixtures/uv-project
shell: bash
env:
UV_PATH: ${{ steps.setup-uv.outputs.uv-path }}
- name: uv is not on PATH
run: |
if command -v uv; then
echo "uv should not be on PATH"
exit 1
fi
test-specific-version:
runs-on: ubuntu-latest
strategy:
matrix:
uv-version: ["0.3.0", "0.3.2", "0.3", "0.3.x", ">=0.3.0"]
input:
- version-input: "0.3.0"
expected-version: "0.3.0"
- version-input: "0.3.2"
expected-version: "0.3.2"
- version-input: "0.3"
expected-version: "0.3.5"
- version-input: "0.3.x"
expected-version: "0.3.5"
- version-input: ">=0.4.25,<0.5"
expected-version: "0.4.30"
steps:
- uses: actions/checkout@v5
- name: Install version ${{ matrix.uv-version }}
uses: ./
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
version: ${{ matrix.uv-version }}
- run: uv sync
working-directory: __tests__/fixtures/uv-project
test-semver-range:
strategy:
matrix:
os: [ ubuntu-latest, selfhosted-ubuntu-arm64 ]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v5
- name: Install version 0.3
persist-credentials: false
- name: Install version ${{ matrix.input.version-input }}
id: setup-uv
uses: ./
with:
version: "0.3"
version: ${{ matrix.input.version-input }}
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.3.5" ]; then
if [ "$(uv --version)" != "uv ${{ matrix.input.expected-version }}" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
- name: Output has correct version
run: |
if [ "$UV_VERSION" != "0.3.5" ]; then
if [ "$UV_VERSION" != "${{ matrix.input.expected-version }}" ]; then
exit 1
fi
env:
UV_VERSION: ${{ steps.setup-uv.outputs.uv-version }}
test-pep440-version:
test-latest-version:
runs-on: ubuntu-latest
strategy:
matrix:
version-input: ["latest", ">=0.8"]
steps:
- uses: actions/checkout@v5
- name: Install version 0.4.30
id: setup-uv
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Install version ${{ matrix.version-input }}
uses: ./
with:
version: ">=0.4.25,<0.5"
version: ${{ matrix.version-input }}
- name: Latest version gets installed
run: |
LATEST_VERSION=$(gh api -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" /repos/astral-sh/uv/releases/latest | jq -r '.tag_name')
echo "Latest version is $LATEST_VERSION"
if [ "$(uv --version)" != "uv $LATEST_VERSION" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
env:
GH_TOKEN: ${{ github.token }}
test-from-working-directory-version:
runs-on: ubuntu-latest
strategy:
matrix:
input:
- working-directory: "__tests__/fixtures/pyproject-toml-project"
expected-version: "0.5.14"
- working-directory: "__tests__/fixtures/uv-toml-project"
expected-version: "0.5.15"
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Install version from ${{ matrix.input.working-directory }}
uses: ./
with:
working-directory: ${{ matrix.input.working-directory }}
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.4.30" ]; then
if [ "$(uv --version)" != "uv ${{ matrix.input.expected-version }}" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
test-pyproject-file-version:
test-version-file-version:
runs-on: ubuntu-latest
strategy:
matrix:
input:
- version-file: "__tests__/fixtures/uv-in-requirements-txt-project/requirements.txt"
expected-version: "0.6.17"
- version-file: "__tests__/fixtures/uv-in-requirements-hash-txt-project/requirements.txt"
expected-version: "0.8.3"
- version-file: "__tests__/fixtures/.tool-versions"
expected-version: "0.5.15"
steps:
- uses: actions/checkout@v5
- name: Install version 0.5.14
id: setup-uv
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Install version from ${{ matrix.input.version-file }}
uses: ./
with:
working-directory: "__tests__/fixtures/pyproject-toml-project"
version-file: ${{ matrix.input.version-file }}
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.5.14" ]; then
if [ "$(uv --version)" != "uv ${{ matrix.input.expected-version }}" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
@@ -131,7 +211,9 @@ jobs:
test-malformed-pyproject-file-fallback:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Install using malformed pyproject.toml
id: setup-uv
uses: ./
@@ -139,70 +221,6 @@ jobs:
working-directory: "__tests__/fixtures/malformed-pyproject-toml-project"
- run: uv --help
test-uv-file-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Install version 0.5.15
id: setup-uv
uses: ./
with:
working-directory: "__tests__/fixtures/uv-toml-project"
- name: Correct version gets installed
run: |
if [ "$(uv --version)" != "uv 0.5.15" ]; then
echo "Wrong uv version: $(uv --version)"
exit 1
fi
test-version-file-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:
runs-on: ${{ matrix.inputs.os }}
strategy:
@@ -213,7 +231,9 @@ jobs:
- os: macos-latest
checksum: "a70cbfbf3bb5c08b2f84963b4f12c94e08fbb2468ba418a3bfe1066fbe9e7218"
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Checksum matches expected
uses: ./
with:
@@ -225,7 +245,9 @@ jobs:
test-with-explicit-token:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Install default version
uses: ./
with:
@@ -236,7 +258,9 @@ jobs:
test-uvx:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Install default version
uses: ./
- run: uvx ruff --version
@@ -245,15 +269,11 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os:
[
ubuntu-latest,
macos-latest,
macos-14,
windows-latest,
]
os: [ubuntu-latest, macos-latest, macos-14, windows-latest]
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Install default version
uses: ./
- run: uv tool install ruff
@@ -262,7 +282,9 @@ jobs:
test-tilde-expansion-tool-dirs:
runs-on: selfhosted-ubuntu-arm64
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Setup with cache
uses: ./
with:
@@ -285,7 +307,9 @@ jobs:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Install latest version
uses: ./
with:
@@ -304,10 +328,13 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ ubuntu-latest, macos-latest, windows-latest ]
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Install latest version
id: setup-uv
uses: ./
with:
python-version: 3.13.1t
@@ -322,12 +349,27 @@ jobs:
exit 1
fi
shell: bash
- name: Verify output venv is set
run: |
if [ -z "$UV_VENV" ]; then
echo "output venv is not set"
exit 1
fi
if [ ! -d "$UV_VENV" ]; then
echo "output venv not point to a directory: $UV_VENV"
exit 1
fi
shell: bash
env:
UV_VENV: ${{ steps.setup-uv.outputs.venv }}
test-musl:
runs-on: ubuntu-latest
container: alpine
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Install latest version
uses: ./
- run: uv sync
@@ -337,10 +379,12 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
enable-cache: [ "true", "false", "auto" ]
os: [ "ubuntu-latest", "selfhosted-ubuntu-arm64", "windows-latest" ]
enable-cache: ["true", "false", "auto"]
os: ["ubuntu-latest", "selfhosted-ubuntu-arm64", "windows-latest"]
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Setup with cache
uses: ./
with:
@@ -353,11 +397,13 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
enable-cache: [ "true", "false", "auto" ]
os: [ "ubuntu-latest", "selfhosted-ubuntu-arm64", "windows-latest" ]
enable-cache: ["true", "false", "auto"]
os: ["ubuntu-latest", "selfhosted-ubuntu-arm64", "windows-latest"]
needs: test-setup-cache
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Restore with cache
id: restore
uses: ./
@@ -389,7 +435,9 @@ jobs:
test-setup-cache-requirements-txt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Setup with cache
uses: ./
with:
@@ -401,9 +449,11 @@ jobs:
working-directory: __tests__/fixtures/requirements-txt-project
test-restore-cache-requirements-txt:
runs-on: ubuntu-latest
needs: test-setup-cache
needs: test-setup-cache-requirements-txt
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Restore with cache
id: restore
uses: ./
@@ -425,7 +475,9 @@ jobs:
test-setup-cache-dependency-glob:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Setup with cache
uses: ./
with:
@@ -440,7 +492,9 @@ jobs:
runs-on: ubuntu-latest
needs: test-setup-cache-dependency-glob
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Change pyproject.toml
run: |
echo '[tool.uv]' >> __tests__/fixtures/uv-project/pyproject.toml
@@ -463,6 +517,78 @@ jobs:
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
test-setup-cache-save-cache-false:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Setup with cache
uses: ./
with:
enable-cache: true
save-cache: false
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-save-cache-false
- run: uv sync
working-directory: __tests__/fixtures/uv-project
shell: bash
test-restore-cache-save-cache-false:
runs-on: ubuntu-latest
needs: test-setup-cache-save-cache-false
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-save-cache-false
- 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-restore-cache-false:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-restore-cache-false
- run: uv sync
working-directory: __tests__/fixtures/uv-project
shell: bash
test-restore-cache-restore-cache-false:
runs-on: ubuntu-latest
needs: test-setup-cache-restore-cache-false
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: true
restore-cache: false
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-setup-cache-restore-cache-false
- 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:
@@ -475,10 +601,13 @@ jobs:
expected-cache-dir: "/home/ubuntu/.cache/uv"
runs-on: ${{ matrix.inputs.os }}
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Setup with cache
uses: ./
with:
enable-cache: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-cache-local
- run: |
if [ "$UV_CACHE_DIR" != "${{ matrix.inputs.expected-cache-dir }}" ]; then
@@ -487,10 +616,31 @@ jobs:
fi
shell: bash
test-cache-local-cache-disabled:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Setup without cache
uses: ./
with:
enable-cache: false
- name: Check UV_CACHE_DIR is not set
run: |
if [ -n "$UV_CACHE_DIR" ]; then
echo "UV_CACHE_DIR should not be set when cache is disabled: $UV_CACHE_DIR"
exit 1
fi
shell: bash
test-setup-cache-local:
runs-on: selfhosted-ubuntu-arm64
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Setup with cache
uses: ./
with:
@@ -503,7 +653,9 @@ jobs:
runs-on: selfhosted-ubuntu-arm64
needs: test-setup-cache-local
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Restore with cache
id: restore
uses: ./
@@ -524,7 +676,9 @@ jobs:
test-tilde-expansion-cache-local-path:
runs-on: selfhosted-ubuntu-arm64
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Create cache directory
run: mkdir -p ~/uv-cache
shell: bash
@@ -538,7 +692,9 @@ jobs:
test-tilde-expansion-cache-dependency-glob:
runs-on: selfhosted-ubuntu-arm64
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Create cache directory
run: mkdir -p ~/uv-cache
shell: bash
@@ -571,7 +727,9 @@ jobs:
test-no-python-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Fake pyproject.toml at root
run: cp __tests__/fixtures/old-python-constraint-project/pyproject.toml pyproject.toml
- name: Setup with cache
@@ -584,7 +742,9 @@ jobs:
test-custom-manifest-file:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Install from custom manifest file
uses: ./
with:
@@ -601,7 +761,9 @@ jobs:
test-absolute-path:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Create requirements.txt
run: echo "uv==0.6.17" > /tmp/setup-uv-requirements.txt
- name: Install from requirements file
@@ -619,7 +781,9 @@ jobs:
test-relative-path:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: mkdir
run: mkdir -p /tmp/setup-uv-test-relative-path
- name: Create requirements.txt
@@ -638,20 +802,149 @@ jobs:
exit 1
fi
test-cache-prune-force:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Setup uv
uses: ./
with:
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-cache-prune-force
- name: Create long running python script
run: |
echo 'import time' > __tests__/fixtures/uv-project/long-running.py
echo 'time.sleep(300)' >> __tests__/fixtures/uv-project/long-running.py
- run: uv run long-running.py &
working-directory: __tests__/fixtures/uv-project
test-cache-dir-from-file:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Verify uv cache dir is not populated
run: |
if [ -f "/tmp/pyproject-toml-defined-cache-path/CACHEDIR.TAG" ]; then
echo "Cache dir should not exist"
exit 1
fi
- name: Setup uv
uses: ./
with:
working-directory: __tests__/fixtures/cache-dir-defined-project
- run: uv sync
working-directory: __tests__/fixtures/cache-dir-defined-project
- name: Verify uv cache dir is populated
run: |
if [ ! -f "/tmp/pyproject-toml-defined-cache-path/CACHEDIR.TAG" ]; then
echo "Cache dir should exist"
exit 1
fi
test-cache-python-installs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Verify Python install dir is not populated
run: |
if [ -d /home/runner/work/_temp/uv-python-dir ]; then
echo "Python install dir should not exist"
exit 1
fi
- name: Setup uv with cache
uses: ./
with:
enable-cache: true
cache-python: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-cache-python-installs
- run: uv sync --managed-python
working-directory: __tests__/fixtures/uv-project
- name: Verify Python install dir exists
run: |
if [ ! -d /home/runner/work/_temp/uv-python-dir ]; then
echo "Python install dir should exist"
exit 1
fi
test-restore-python-installs:
runs-on: ubuntu-latest
needs: test-cache-python-installs
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Verify Python install dir does not exist
run: |
if [ -d /home/runner/work/_temp/uv-python-dir ]; then
echo "Python install dir should not exist"
exit 1
fi
- name: Restore with cache
id: restore
uses: ./
with:
enable-cache: true
cache-python: true
cache-suffix: ${{ github.run_id }}-${{ github.run_attempt }}-test-cache-python-installs
- name: Verify Python install dir exists
run: |
if [ ! -d /home/runner/work/_temp/uv-python-dir ]; then
echo "Python install dir should exist"
exit 1
fi
- name: Cache was hit
run: |
if [ "$CACHE_HIT" != "true" ]; then
exit 1
fi
env:
CACHE_HIT: ${{ steps.restore.outputs.cache-hit }}
- run: uv sync --managed-python
working-directory: __tests__/fixtures/uv-project
test-python-install-dir:
strategy:
matrix:
inputs:
- os: ubuntu-latest
expected-python-dir: "/home/runner/work/_temp/uv-python-dir"
- os: windows-latest
expected-python-dir: "D:\\a\\_temp\\uv-python-dir"
- os: selfhosted-ubuntu-arm64
expected-python-dir: "/home/ubuntu/.local/share/uv/python"
runs-on: ${{ matrix.inputs.os }}
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Install latest version
id: setup-uv
uses: ./
- name: Check Python dir is expected dir
run: |
if [ "$UV_PYTHON_INSTALL_DIR" != "${{ matrix.inputs.expected-python-dir }}" ]; then
echo "Wrong UV_PYTHON_INSTALL_DIR: UV_PYTHON_INSTALL_DIR"
exit 1
fi
shell: bash
- name: Install python works
run: uv python install
all-tests-passed:
runs-on: ubuntu-latest
needs:
- lint
- test-default-version
- test-uv-no-modify-path
- test-specific-version
- test-semver-range
- test-pep440-version
- test-pyproject-file-version
- test-latest-version
- test-from-working-directory-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
@@ -661,12 +954,17 @@ jobs:
- test-activate-environment
- test-musl
- test-cache-local
- test-cache-local-cache-disabled
- 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-save-cache-false
- test-restore-cache-save-cache-false
- test-setup-cache-restore-cache-false
- test-restore-cache-restore-cache-false
- test-setup-cache-local
- test-restore-cache-local
- test-tilde-expansion-cache-local-path
@@ -676,10 +974,15 @@ jobs:
- test-custom-manifest-file
- test-absolute-path
- test-relative-path
- test-cache-prune-force
- test-cache-dir-from-file
- test-cache-python-installs
- test-restore-python-installs
- test-python-install-dir
if: always()
steps:
- name: All tests passed
run: |
echo "All jobs passed: ${{ !contains(needs.*.result, 'failure') }}"
echo "All jobs passed: ${{ !(contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')) }}"
# shellcheck disable=SC2242
exit ${{ contains(needs.*.result, 'failure') && 1 || 0 }}
exit ${{ (contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')) && 1 || 0 }}

View File

@@ -3,6 +3,10 @@ on:
workflow_dispatch:
schedule:
- cron: "0 4 * * *" # Run every day at 4am UTC
repository_dispatch:
types: [ pypi_release ]
permissions: {}
jobs:
build:
@@ -11,8 +15,10 @@ jobs:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v4
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: true
- uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
node-version: "20"
- name: Update known versions
@@ -22,16 +28,41 @@ jobs:
src/download/checksum/known-checksums.ts
version-manifest.json
${{ secrets.GITHUB_TOKEN }}
- run: npm install && npm run all
- name: Check for changes
id: changes-exist
run: |
git status --porcelain
if [ -n "$(git status --porcelain)" ]; then
echo "changes-exist=true" >> "$GITHUB_OUTPUT"
else
echo "changes-exist=false" >> "$GITHUB_OUTPUT"
fi
- name: Compile changes
if: ${{ steps.changes-exist.outputs.changes-exist == 'true' }}
run: npm ci && npm run all
- name: Commit and push changes
if: ${{ steps.changes-exist.outputs.changes-exist == 'true' }}
id: commit-and-push
continue-on-error: true
run: |
git config user.name "$GITHUB_ACTOR"
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
git add .
git commit -m "chore: update known versions for $LATEST_VERSION"
git push origin HEAD:refs/heads/main
env:
LATEST_VERSION: ${{ steps.update-known-versions.outputs.latest-version }}
- name: Create Pull Request
if: ${{ steps.changes-exist.outputs.changes-exist == 'true' && steps.commit-and-push.outcome != 'success' }}
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
with:
commit-message: "chore: update known versions"
commit-message: "chore: update known checksums"
title:
"chore: update known versions for ${{
"chore: update known checksums for ${{
steps.update-known-versions.outputs.latest-version }}"
body:
"chore: update known versions for ${{
"chore: update known checksums for ${{
steps.update-known-versions.outputs.latest-version }}"
base: main
labels: "automated-pr,update-known-versions"

View File

@@ -8,6 +8,8 @@ on:
tags:
- "v*.*.*"
permissions: {}
jobs:
update_major_minor_tags:
name: Make sure major and minor tags are up to date on a patch release
@@ -15,7 +17,9 @@ jobs:
permissions:
contents: write
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: true # needed for git push below
- name: Update Major Minor Tags
run: |
set -x

View File

@@ -22,8 +22,11 @@ Set up your GitHub Actions workflow with a specific version of [uv](https://docs
- [Validate checksum](#validate-checksum)
- [Enable Caching](#enable-caching)
- [Cache dependency glob](#cache-dependency-glob)
- [Restore cache](#restore-cache)
- [Save cache](#save-cache)
- [Local cache path](#local-cache-path)
- [Disable cache pruning](#disable-cache-pruning)
- [Cache Python installs](#cache-python-installs)
- [Ignore nothing to cache](#ignore-nothing-to-cache)
- [GitHub authentication token](#github-authentication-token)
- [UV_TOOL_DIR](#uv_tool_dir)
@@ -123,7 +126,7 @@ This will override any python version specifications in `pyproject.toml` and `.p
- run: uv pip install --python=3.13t pip
```
You can combine this with a matrix to test multiple python versions:
You can combine this with a matrix to test multiple Python versions:
```yaml
jobs:
@@ -131,9 +134,9 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12"]
python-version: ["3.10", "3.11", "3.12", "3.13"]
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Install the latest version of uv and set the python version
uses: astral-sh/setup-uv@v6
with:
@@ -248,6 +251,7 @@ changes. If you use relative paths, they are relative to the repository root.
> **/*constraints*.in
> **/pyproject.toml
> **/uv.lock
> **/*.py.lock
> ```
```yaml
@@ -284,13 +288,47 @@ changes. If you use relative paths, they are relative to the repository root.
cache-dependency-glob: ""
```
#### Restore cache
Restoring an existing cache can be enabled or disabled with the `restore-cache` input.
By default, the cache will be restored.
```yaml
- name: Don't restore an existing cache
uses: astral-sh/setup-uv@v6
with:
enable-cache: true
restore-cache: false
```
#### Save cache
You can also disable saving the cache after the run with the `save-cache` input.
This can be useful to save cache storage when you know you will not use the cache of the run again.
By default, the cache will be saved.
```yaml
- name: Don't save the cache after the run
uses: astral-sh/setup-uv@v6
with:
enable-cache: true
save-cache: false
```
### Local cache path
This action controls where uv stores its cache on the runner's filesystem by setting `UV_CACHE_DIR`.
If caching is enabled, this action controls where uv stores its cache on the runner's filesystem
by setting `UV_CACHE_DIR`.
It defaults to `setup-uv-cache` in the `TMP` dir, `D:\a\_temp\uv-tool-dir` on Windows and
`/tmp/setup-uv-cache` on Linux/macOS. You can change the default by specifying the path with the
`cache-local-path` input.
> [!NOTE]
> If the environment variable `UV_CACHE_DIR` is already set this action will not override it.
> If you configured [cache-dir](https://docs.astral.sh/uv/reference/settings/#cache-dir) in your
> config file then it is also respected and this action will not set `UV_CACHE_DIR`.
```yaml
- name: Define a custom uv cache path
uses: astral-sh/setup-uv@v6
@@ -318,6 +356,20 @@ input.
prune-cache: false
```
### Cache Python installs
By default, the Python install dir (`uv python dir` / `UV_PYTHON_INSTALL_DIR`) is not cached,
for the same reason that the dependency cache is pruned.
If you want to cache Python installs along with your dependencies, set the `cache-python` input to `true`.
```yaml
- name: Cache Python installs
uses: astral-sh/setup-uv@v6
with:
enable-cache: true
cache-python: true
```
### Ignore nothing to cache
By default, the action will fail if caching is enabled but there is nothing to upload (the uv cache directory does not exist).

View File

@@ -0,0 +1,16 @@
[project]
name = "uv-project"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"ruff>=0.6.2",
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.uv]
cache-dir = "/tmp/pyproject-toml-defined-cache-path"

View File

@@ -0,0 +1,2 @@
def hello() -> str:
return "Hello from uv-project!"

View File

@@ -0,0 +1,38 @@
version = 1
requires-python = ">=3.12"
[[package]]
name = "ruff"
version = "0.6.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/23/f4/279d044f66b79261fd37df76bf72b64471afab5d3b7906a01499c4451910/ruff-0.6.2.tar.gz", hash = "sha256:239ee6beb9e91feb8e0ec384204a763f36cb53fb895a1a364618c6abb076b3be", size = 2460281 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/72/4b/47dd7a69287afb4069fa42c198e899463605460a58120196711bfcf0446b/ruff-0.6.2-py3-none-linux_armv6l.whl", hash = "sha256:5c8cbc6252deb3ea840ad6a20b0f8583caab0c5ef4f9cca21adc5a92b8f79f3c", size = 9695871 },
{ url = "https://files.pythonhosted.org/packages/ae/c3/8aac62ac4638c14a740ee76a755a925f2d0d04580ab790a9887accb729f6/ruff-0.6.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:17002fe241e76544448a8e1e6118abecbe8cd10cf68fde635dad480dba594570", size = 9459354 },
{ url = "https://files.pythonhosted.org/packages/2f/cf/77fbd8d4617b9b9c503f9bffb8552c4e3ea1a58dc36975e7a9104ffb0f85/ruff-0.6.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3dbeac76ed13456f8158b8f4fe087bf87882e645c8e8b606dd17b0b66c2c1158", size = 9163871 },
{ url = "https://files.pythonhosted.org/packages/05/1c/765192bab32b79efbb498b06f0b9dcb3629112b53b8777ae1d19b8209e09/ruff-0.6.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:094600ee88cda325988d3f54e3588c46de5c18dae09d683ace278b11f9d4d534", size = 10096250 },
{ url = "https://files.pythonhosted.org/packages/08/d0/86f3cb0f6934c99f759c232984a5204d67a26745cad2d9edff6248adf7d2/ruff-0.6.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:316d418fe258c036ba05fbf7dfc1f7d3d4096db63431546163b472285668132b", size = 9475376 },
{ url = "https://files.pythonhosted.org/packages/cd/cc/4c8d0e225b559a3fae6092ec310d7150d3b02b4669e9223f783ef64d82c0/ruff-0.6.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d72b8b3abf8a2d51b7b9944a41307d2f442558ccb3859bbd87e6ae9be1694a5d", size = 10295634 },
{ url = "https://files.pythonhosted.org/packages/db/96/d2699cfb1bb5a01c68122af43454c76c31331e1c8a9bd97d653d7c82524b/ruff-0.6.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2aed7e243be68487aa8982e91c6e260982d00da3f38955873aecd5a9204b1d66", size = 11024941 },
{ url = "https://files.pythonhosted.org/packages/8b/a9/6ecd66af8929e0f2a1ed308a4137f3521789f28f0eb97d32c2ca3aa7000c/ruff-0.6.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d371f7fc9cec83497fe7cf5eaf5b76e22a8efce463de5f775a1826197feb9df8", size = 10606894 },
{ url = "https://files.pythonhosted.org/packages/e4/73/2ee4cd19f44992fedac1cc6db9e3d825966072f6dcbd4032f21cbd063170/ruff-0.6.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8f310d63af08f583363dfb844ba8f9417b558199c58a5999215082036d795a1", size = 11552886 },
{ url = "https://files.pythonhosted.org/packages/60/4c/c0f1cd35ce4a93c54a6bb1ee6934a3a205fa02198dd076678193853ceea1/ruff-0.6.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7db6880c53c56addb8638fe444818183385ec85eeada1d48fc5abe045301b2f1", size = 10264945 },
{ url = "https://files.pythonhosted.org/packages/c4/89/e45c9359b9cdd4245512ea2b9f2bb128a997feaa5f726fc9e8c7a66afadf/ruff-0.6.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1175d39faadd9a50718f478d23bfc1d4da5743f1ab56af81a2b6caf0a2394f23", size = 10100007 },
{ url = "https://files.pythonhosted.org/packages/06/74/0bd4e0a7ed5f6908df87892f9bf60a2356c0fd74102d8097298bd9b4f346/ruff-0.6.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5b939f9c86d51635fe486585389f54582f0d65b8238e08c327c1534844b3bb9a", size = 9559267 },
{ url = "https://files.pythonhosted.org/packages/54/03/3dc6dc9419f276f05805bf888c279e3e0b631284abd548d9e87cebb93aec/ruff-0.6.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d0d62ca91219f906caf9b187dea50d17353f15ec9bb15aae4a606cd697b49b4c", size = 9905304 },
{ url = "https://files.pythonhosted.org/packages/5c/5b/d6a72a6a6bbf097c09de468326ef5fa1c9e7aa5e6e45979bc0d984b0dbe7/ruff-0.6.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7438a7288f9d67ed3c8ce4d059e67f7ed65e9fe3aa2ab6f5b4b3610e57e3cb56", size = 10341480 },
{ url = "https://files.pythonhosted.org/packages/79/a9/0f2f21fe15ba537c46598f96aa9ae4a3d4b9ec64926664617ca6a8c772f4/ruff-0.6.2-py3-none-win32.whl", hash = "sha256:279d5f7d86696df5f9549b56b9b6a7f6c72961b619022b5b7999b15db392a4da", size = 7961901 },
{ url = "https://files.pythonhosted.org/packages/b0/80/fff12ffe11853d9f4ea3e5221e6dd2e93640a161c05c9579833e09ad40a7/ruff-0.6.2-py3-none-win_amd64.whl", hash = "sha256:d9f3469c7dd43cd22eb1c3fc16926fb8258d50cb1b216658a07be95dd117b0f2", size = 8783320 },
{ url = "https://files.pythonhosted.org/packages/56/91/577cdd64cce5e74d3f8b5ecb93f29566def569c741eb008aed4f331ef821/ruff-0.6.2-py3-none-win_arm64.whl", hash = "sha256:f28fcd2cd0e02bdf739297516d5643a945cc7caf09bd9bcb4d932540a5ea4fa9", size = 8225886 },
]
[[package]]
name = "uv-project"
version = "0.1.0"
source = { editable = "." }
dependencies = [
{ name = "ruff" },
]
[package.metadata]
requires-dist = [{ name = "ruff" }]

View File

@@ -21,10 +21,6 @@ inputs:
checksum:
description: "The checksum of the uv version to install"
required: false
server-url:
description: "(Deprecated) The server url to use when downloading uv"
required: false
default: "https://github.com"
github-token:
description:
"Used to increase the rate limit when retrieving versions and downloading uv."
@@ -44,6 +40,13 @@ inputs:
**/*constraints*.in
**/pyproject.toml
**/uv.lock
**/*.py.lock
restore-cache:
description: "Whether to restore the cache if found."
default: "true"
save-cache:
description: "Whether to save the cache after the run."
default: "true"
cache-suffix:
description: "Suffix for the cache key"
required: false
@@ -53,6 +56,9 @@ inputs:
prune-cache:
description: "Prune cache before saving."
default: "true"
cache-python:
description: "Upload managed Python installations to the Github Actions cache."
default: "false"
ignore-nothing-to-cache:
description: "Ignore when nothing is found to cache."
default: "false"
@@ -80,8 +86,10 @@ outputs:
description: "The path to the installed uvx binary."
cache-hit:
description: "A boolean value to indicate a cache entry was found"
venv:
description: "Path to the activated venv if activate-environment is true"
runs:
using: "node20"
using: "node24"
main: "dist/setup/index.js"
post: "dist/save-cache/index.js"
post-if: success()

View File

@@ -1,5 +1,5 @@
{
"$schema": "https://biomejs.dev/schemas/2.2.2/schema.json",
"$schema": "https://biomejs.dev/schemas/2.2.4/schema.json",
"assist": {
"actions": {
"source": {

1871
dist/save-cache/index.js generated vendored
View File

@@ -75775,6 +75775,783 @@ class ReflectionTypeCheck {
exports.ReflectionTypeCheck = ReflectionTypeCheck;
/***/ }),
/***/ 3297:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
const { valid, clean, explain, parse } = __nccwpck_require__(9961);
const { lt, le, eq, ne, ge, gt, compare, rcompare } = __nccwpck_require__(9469);
const {
filter,
maxSatisfying,
minSatisfying,
RANGE_PATTERN,
satisfies,
validRange,
} = __nccwpck_require__(3185);
const { major, minor, patch, inc } = __nccwpck_require__(6829);
module.exports = {
// version
valid,
clean,
explain,
parse,
// operator
lt,
le,
lte: le,
eq,
ne,
neq: ne,
ge,
gte: ge,
gt,
compare,
rcompare,
// range
filter,
maxSatisfying,
minSatisfying,
RANGE_PATTERN,
satisfies,
validRange,
// semantic
major,
minor,
patch,
inc,
};
/***/ }),
/***/ 9469:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
const { parse } = __nccwpck_require__(9961);
module.exports = {
compare,
rcompare,
lt,
le,
eq,
ne,
ge,
gt,
'<': lt,
'<=': le,
'==': eq,
'!=': ne,
'>=': ge,
'>': gt,
'===': arbitrary,
};
function lt(version, other) {
return compare(version, other) < 0;
}
function le(version, other) {
return compare(version, other) <= 0;
}
function eq(version, other) {
return compare(version, other) === 0;
}
function ne(version, other) {
return compare(version, other) !== 0;
}
function ge(version, other) {
return compare(version, other) >= 0;
}
function gt(version, other) {
return compare(version, other) > 0;
}
function arbitrary(version, other) {
return version.toLowerCase() === other.toLowerCase();
}
function compare(version, other) {
const parsedVersion = parse(version);
const parsedOther = parse(other);
const keyVersion = calculateKey(parsedVersion);
const keyOther = calculateKey(parsedOther);
return pyCompare(keyVersion, keyOther);
}
function rcompare(version, other) {
return -compare(version, other);
}
// this logic is buitin in python, but we need to port it to js
// see https://stackoverflow.com/a/5292332/1438522
function pyCompare(elemIn, otherIn) {
let elem = elemIn;
let other = otherIn;
if (elem === other) {
return 0;
}
if (Array.isArray(elem) !== Array.isArray(other)) {
elem = Array.isArray(elem) ? elem : [elem];
other = Array.isArray(other) ? other : [other];
}
if (Array.isArray(elem)) {
const len = Math.min(elem.length, other.length);
for (let i = 0; i < len; i += 1) {
const res = pyCompare(elem[i], other[i]);
if (res !== 0) {
return res;
}
}
return elem.length - other.length;
}
if (elem === -Infinity || other === Infinity) {
return -1;
}
if (elem === Infinity || other === -Infinity) {
return 1;
}
return elem < other ? -1 : 1;
}
function calculateKey(input) {
const { epoch } = input;
let { release, pre, post, local, dev } = input;
// When we compare a release version, we want to compare it with all of the
// trailing zeros removed. So we'll use a reverse the list, drop all the now
// leading zeros until we come to something non zero, then take the rest
// re-reverse it back into the correct order and make it a tuple and use
// that for our sorting key.
release = release.concat();
release.reverse();
while (release.length && release[0] === 0) {
release.shift();
}
release.reverse();
// We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0.
// We'll do this by abusing the pre segment, but we _only_ want to do this
// if there is !a pre or a post segment. If we have one of those then
// the normal sorting rules will handle this case correctly.
if (!pre && !post && dev) pre = -Infinity;
// Versions without a pre-release (except as noted above) should sort after
// those with one.
else if (!pre) pre = Infinity;
// Versions without a post segment should sort before those with one.
if (!post) post = -Infinity;
// Versions without a development segment should sort after those with one.
if (!dev) dev = Infinity;
if (!local) {
// Versions without a local segment should sort before those with one.
local = -Infinity;
} else {
// Versions with a local segment need that segment parsed to implement
// the sorting rules in PEP440.
// - Alpha numeric segments sort before numeric segments
// - Alpha numeric segments sort lexicographically
// - Numeric segments sort numerically
// - Shorter versions sort before longer versions when the prefixes
// match exactly
local = local.map((i) =>
Number.isNaN(Number(i)) ? [-Infinity, i] : [Number(i), ''],
);
}
return [epoch, release, pre, post, dev, local];
}
/***/ }),
/***/ 6829:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
const { explain, parse, stringify } = __nccwpck_require__(9961);
// those notation are borrowed from semver
module.exports = {
major,
minor,
patch,
inc,
};
function major(input) {
const version = explain(input);
if (!version) {
throw new TypeError('Invalid Version: ' + input);
}
return version.release[0];
}
function minor(input) {
const version = explain(input);
if (!version) {
throw new TypeError('Invalid Version: ' + input);
}
if (version.release.length < 2) {
return 0;
}
return version.release[1];
}
function patch(input) {
const version = explain(input);
if (!version) {
throw new TypeError('Invalid Version: ' + input);
}
if (version.release.length < 3) {
return 0;
}
return version.release[2];
}
function inc(input, release, preReleaseIdentifier) {
let identifier = preReleaseIdentifier || `a`;
const version = parse(input);
if (!version) {
return null;
}
if (
!['a', 'b', 'c', 'rc', 'alpha', 'beta', 'pre', 'preview'].includes(
identifier,
)
) {
return null;
}
switch (release) {
case 'premajor':
{
const [majorVersion] = version.release;
version.release.fill(0);
version.release[0] = majorVersion + 1;
}
version.pre = [identifier, 0];
delete version.post;
delete version.dev;
delete version.local;
break;
case 'preminor':
{
const [majorVersion, minorVersion = 0] = version.release;
version.release.fill(0);
version.release[0] = majorVersion;
version.release[1] = minorVersion + 1;
}
version.pre = [identifier, 0];
delete version.post;
delete version.dev;
delete version.local;
break;
case 'prepatch':
{
const [majorVersion, minorVersion = 0, patchVersion = 0] =
version.release;
version.release.fill(0);
version.release[0] = majorVersion;
version.release[1] = minorVersion;
version.release[2] = patchVersion + 1;
}
version.pre = [identifier, 0];
delete version.post;
delete version.dev;
delete version.local;
break;
case 'prerelease':
if (version.pre === null) {
const [majorVersion, minorVersion = 0, patchVersion = 0] =
version.release;
version.release.fill(0);
version.release[0] = majorVersion;
version.release[1] = minorVersion;
version.release[2] = patchVersion + 1;
version.pre = [identifier, 0];
} else {
if (preReleaseIdentifier === undefined && version.pre !== null) {
[identifier] = version.pre;
}
const [letter, number] = version.pre;
if (letter === identifier) {
version.pre = [letter, number + 1];
} else {
version.pre = [identifier, 0];
}
}
delete version.post;
delete version.dev;
delete version.local;
break;
case 'major':
if (
version.release.slice(1).some((value) => value !== 0) ||
version.pre === null
) {
const [majorVersion] = version.release;
version.release.fill(0);
version.release[0] = majorVersion + 1;
}
delete version.pre;
delete version.post;
delete version.dev;
delete version.local;
break;
case 'minor':
if (
version.release.slice(2).some((value) => value !== 0) ||
version.pre === null
) {
const [majorVersion, minorVersion = 0] = version.release;
version.release.fill(0);
version.release[0] = majorVersion;
version.release[1] = minorVersion + 1;
}
delete version.pre;
delete version.post;
delete version.dev;
delete version.local;
break;
case 'patch':
if (
version.release.slice(3).some((value) => value !== 0) ||
version.pre === null
) {
const [majorVersion, minorVersion = 0, patchVersion = 0] =
version.release;
version.release.fill(0);
version.release[0] = majorVersion;
version.release[1] = minorVersion;
version.release[2] = patchVersion + 1;
}
delete version.pre;
delete version.post;
delete version.dev;
delete version.local;
break;
default:
return null;
}
return stringify(version);
}
/***/ }),
/***/ 3185:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
// This file is dual licensed under the terms of the Apache License, Version
// 2.0, and the BSD License. See the LICENSE file in the root of this repository
// for complete details.
const { VERSION_PATTERN, explain: explainVersion } = __nccwpck_require__(9961);
const Operator = __nccwpck_require__(9469);
const RANGE_PATTERN = [
'(?<operator>(===|~=|==|!=|<=|>=|<|>))',
'\\s*',
'(',
/* */ '(?<version>(?:' + VERSION_PATTERN.replace(/\?<\w+>/g, '?:') + '))',
/* */ '(?<prefix>\\.\\*)?',
/* */ '|',
/* */ '(?<legacy>[^,;\\s)]+)',
')',
].join('');
module.exports = {
RANGE_PATTERN,
parse,
satisfies,
filter,
validRange,
maxSatisfying,
minSatisfying,
};
const isEqualityOperator = (op) => ['==', '!=', '==='].includes(op);
const rangeRegex = new RegExp('^' + RANGE_PATTERN + '$', 'i');
function parse(ranges) {
if (!ranges.trim()) {
return [];
}
const specifiers = ranges
.split(',')
.map((range) => rangeRegex.exec(range.trim()) || {})
.map(({ groups }) => {
if (!groups) {
return null;
}
let { ...spec } = groups;
const { operator, version, prefix, legacy } = groups;
if (version) {
spec = { ...spec, ...explainVersion(version) };
if (operator === '~=') {
if (spec.release.length < 2) {
return null;
}
}
if (!isEqualityOperator(operator) && spec.local) {
return null;
}
if (prefix) {
if (!isEqualityOperator(operator) || spec.dev || spec.local) {
return null;
}
}
}
if (legacy && operator !== '===') {
return null;
}
return spec;
});
if (specifiers.filter(Boolean).length !== specifiers.length) {
return null;
}
return specifiers;
}
function filter(versions, specifier, options = {}) {
const filtered = pick(versions, specifier, options);
if (filtered.length === 0 && options.prereleases === undefined) {
return pick(versions, specifier, { prereleases: true });
}
return filtered;
}
function maxSatisfying(versions, range, options) {
const found = filter(versions, range, options).sort(Operator.compare);
return found.length === 0 ? null : found[found.length - 1];
}
function minSatisfying(versions, range, options) {
const found = filter(versions, range, options).sort(Operator.compare);
return found.length === 0 ? null : found[0];
}
function pick(versions, specifier, options) {
const parsed = parse(specifier);
if (!parsed) {
return [];
}
return versions.filter((version) => {
const explained = explainVersion(version);
if (!parsed.length) {
return explained && !(explained.is_prerelease && !options.prereleases);
}
return parsed.reduce((pass, spec) => {
if (!pass) {
return false;
}
return contains({ ...spec, ...options }, { version, explained });
}, true);
});
}
function satisfies(version, specifier, options = {}) {
const filtered = pick([version], specifier, options);
return filtered.length === 1;
}
function arrayStartsWith(array, prefix) {
if (prefix.length > array.length) {
return false;
}
for (let i = 0; i < prefix.length; i += 1) {
if (prefix[i] !== array[i]) {
return false;
}
}
return true;
}
function contains(specifier, input) {
const { explained } = input;
let { version } = input;
const { ...spec } = specifier;
if (spec.prereleases === undefined) {
spec.prereleases = spec.is_prerelease;
}
if (explained && explained.is_prerelease && !spec.prereleases) {
return false;
}
if (spec.operator === '~=') {
let compatiblePrefix = spec.release.slice(0, -1).concat('*').join('.');
if (spec.epoch) {
compatiblePrefix = spec.epoch + '!' + compatiblePrefix;
}
return satisfies(version, `>=${spec.version}, ==${compatiblePrefix}`);
}
if (spec.prefix) {
const isMatching =
explained.epoch === spec.epoch &&
arrayStartsWith(explained.release, spec.release);
const isEquality = spec.operator !== '!=';
return isEquality ? isMatching : !isMatching;
}
if (explained)
if (explained.local && spec.version) {
version = explained.public;
spec.version = explainVersion(spec.version).public;
}
if (spec.operator === '<' || spec.operator === '>') {
// simplified version of https://www.python.org/dev/peps/pep-0440/#exclusive-ordered-comparison
if (Operator.eq(spec.release.join('.'), explained.release.join('.'))) {
return false;
}
}
const op = Operator[spec.operator];
return op(version, spec.version || spec.legacy);
}
function validRange(specifier) {
return Boolean(parse(specifier));
}
/***/ }),
/***/ 9961:
/***/ ((module) => {
const VERSION_PATTERN = [
'v?',
'(?:',
/* */ '(?:(?<epoch>[0-9]+)!)?', // epoch
/* */ '(?<release>[0-9]+(?:\\.[0-9]+)*)', // release segment
/* */ '(?<pre>', // pre-release
/* */ '[-_\\.]?',
/* */ '(?<pre_l>(a|b|c|rc|alpha|beta|pre|preview))',
/* */ '[-_\\.]?',
/* */ '(?<pre_n>[0-9]+)?',
/* */ ')?',
/* */ '(?<post>', // post release
/* */ '(?:-(?<post_n1>[0-9]+))',
/* */ '|',
/* */ '(?:',
/* */ '[-_\\.]?',
/* */ '(?<post_l>post|rev|r)',
/* */ '[-_\\.]?',
/* */ '(?<post_n2>[0-9]+)?',
/* */ ')',
/* */ ')?',
/* */ '(?<dev>', // dev release
/* */ '[-_\\.]?',
/* */ '(?<dev_l>dev)',
/* */ '[-_\\.]?',
/* */ '(?<dev_n>[0-9]+)?',
/* */ ')?',
')',
'(?:\\+(?<local>[a-z0-9]+(?:[-_\\.][a-z0-9]+)*))?', // local version
].join('');
module.exports = {
VERSION_PATTERN,
valid,
clean,
explain,
parse,
stringify,
};
const validRegex = new RegExp('^' + VERSION_PATTERN + '$', 'i');
function valid(version) {
return validRegex.test(version) ? version : null;
}
const cleanRegex = new RegExp('^\\s*' + VERSION_PATTERN + '\\s*$', 'i');
function clean(version) {
return stringify(parse(version, cleanRegex));
}
function parse(version, regex) {
// Validate the version and parse it into pieces
const { groups } = (regex || validRegex).exec(version) || {};
if (!groups) {
return null;
}
// Store the parsed out pieces of the version
const parsed = {
epoch: Number(groups.epoch ? groups.epoch : 0),
release: groups.release.split('.').map(Number),
pre: normalize_letter_version(groups.pre_l, groups.pre_n),
post: normalize_letter_version(
groups.post_l,
groups.post_n1 || groups.post_n2,
),
dev: normalize_letter_version(groups.dev_l, groups.dev_n),
local: parse_local_version(groups.local),
};
return parsed;
}
function stringify(parsed) {
if (!parsed) {
return null;
}
const { epoch, release, pre, post, dev, local } = parsed;
const parts = [];
// Epoch
if (epoch !== 0) {
parts.push(`${epoch}!`);
}
// Release segment
parts.push(release.join('.'));
// Pre-release
if (pre) {
parts.push(pre.join(''));
}
// Post-release
if (post) {
parts.push('.' + post.join(''));
}
// Development release
if (dev) {
parts.push('.' + dev.join(''));
}
// Local version segment
if (local) {
parts.push(`+${local}`);
}
return parts.join('');
}
function normalize_letter_version(letterIn, numberIn) {
let letter = letterIn;
let number = numberIn;
if (letter) {
// We consider there to be an implicit 0 in a pre-release if there is
// not a numeral associated with it.
if (!number) {
number = 0;
}
// We normalize any letters to their lower case form
letter = letter.toLowerCase();
// We consider some words to be alternate spellings of other words and
// in those cases we want to normalize the spellings to our preferred
// spelling.
if (letter === 'alpha') {
letter = 'a';
} else if (letter === 'beta') {
letter = 'b';
} else if (['c', 'pre', 'preview'].includes(letter)) {
letter = 'rc';
} else if (['rev', 'r'].includes(letter)) {
letter = 'post';
}
return [letter, Number(number)];
}
if (!letter && number) {
// We assume if we are given a number, but we are not given a letter
// then this is using the implicit post release syntax (e.g. 1.0-1)
letter = 'post';
return [letter, Number(number)];
}
return null;
}
function parse_local_version(local) {
/*
Takes a string like abc.1.twelve and turns it into("abc", 1, "twelve").
*/
if (local) {
return local
.split(/[._-]/)
.map((part) =>
Number.isNaN(Number(part)) ? part.toLowerCase() : Number(part),
);
}
return null;
}
function explain(version) {
const parsed = parse(version);
if (!parsed) {
return parsed;
}
const { epoch, release, pre, post, dev, local } = parsed;
let base_version = '';
if (epoch !== 0) {
base_version += epoch + '!';
}
base_version += release.join('.');
const is_prerelease = Boolean(dev || pre);
const is_devrelease = Boolean(dev);
const is_postrelease = Boolean(post);
// return
return {
epoch,
release,
pre,
post: post ? post[1] : post,
dev: dev ? dev[1] : dev,
local: local ? local.join('.') : local,
public: stringify(parsed).split('+', 1)[0],
base_version,
is_prerelease,
is_devrelease,
is_postrelease,
};
}
/***/ }),
/***/ 1324:
@@ -89809,10 +90586,19 @@ exports.STATE_CACHE_MATCHED_KEY = "cache-matched-key";
const CACHE_VERSION = "1";
async function restoreCache() {
const cacheKey = await computeKeys();
core.saveState(exports.STATE_CACHE_KEY, cacheKey);
if (!inputs_1.restoreCache) {
core.info("restore-cache is false. Skipping restore cache step.");
return;
}
let matchedKey;
core.info(`Trying to restore uv cache from GitHub Actions cache with key: ${cacheKey}`);
const cachePaths = [inputs_1.cacheLocalPath];
if (inputs_1.cachePython) {
cachePaths.push(inputs_1.pythonDir);
}
try {
matchedKey = await cache.restoreCache([inputs_1.cacheLocalPath], cacheKey);
matchedKey = await cache.restoreCache(cachePaths, cacheKey);
}
catch (err) {
const message = err.message;
@@ -89820,7 +90606,6 @@ async function restoreCache() {
core.setOutput("cache-hit", false);
return;
}
core.saveState(exports.STATE_CACHE_KEY, cacheKey);
handleMatchResult(matchedKey, cacheKey);
}
async function computeKeys() {
@@ -89839,7 +90624,8 @@ async function computeKeys() {
const pythonVersion = await getPythonVersion();
const platform = await (0, platforms_1.getPlatform)();
const pruned = inputs_1.pruneCache ? "-pruned" : "";
return `setup-uv-${CACHE_VERSION}-${(0, platforms_1.getArch)()}-${platform}-${pythonVersion}${pruned}${cacheDependencyPathHash}${suffix}`;
const python = inputs_1.cachePython ? "-py" : "";
return `setup-uv-${CACHE_VERSION}-${(0, platforms_1.getArch)()}-${platform}-${pythonVersion}${pruned}${python}${cacheDependencyPathHash}${suffix}`;
}
async function getPythonVersion() {
if (inputs_1.pythonVersion !== "") {
@@ -90014,12 +90800,19 @@ const fs = __importStar(__nccwpck_require__(3024));
const cache = __importStar(__nccwpck_require__(5116));
const core = __importStar(__nccwpck_require__(7484));
const exec = __importStar(__nccwpck_require__(5236));
const pep440 = __importStar(__nccwpck_require__(3297));
const restore_cache_1 = __nccwpck_require__(5391);
const constants_1 = __nccwpck_require__(6156);
const inputs_1 = __nccwpck_require__(9612);
async function run() {
try {
if (inputs_1.enableCache) {
await saveCache();
if (inputs_1.saveCache) {
await saveCache();
}
else {
core.info("save-cache is false. Skipping save cache step.");
}
// node will stay alive if any promises are not resolved,
// which is a possibility if HTTP requests are dangling
// due to retries or timeouts. We know that if we got here
@@ -90047,12 +90840,26 @@ async function saveCache() {
if (inputs_1.pruneCache) {
await pruneCache();
}
core.info(`Saving cache path: ${inputs_1.cacheLocalPath}`);
if (!fs.existsSync(inputs_1.cacheLocalPath) && !inputs_1.ignoreNothingToCache) {
throw new Error(`Cache path ${inputs_1.cacheLocalPath} does not exist on disk. This likely indicates that there are no dependencies to cache. Consider disabling the cache input if it is not needed.`);
let actualCachePath = inputs_1.cacheLocalPath;
if (process.env.UV_CACHE_DIR && process.env.UV_CACHE_DIR !== inputs_1.cacheLocalPath) {
core.warning(`The environment variable UV_CACHE_DIR has been changed to "${process.env.UV_CACHE_DIR}", by an action or step running after astral-sh/setup-uv. This can lead to unexpected behavior. If you expected this to happen set the cache-local-path input to "${process.env.UV_CACHE_DIR}" instead of "${inputs_1.cacheLocalPath}".`);
actualCachePath = process.env.UV_CACHE_DIR;
}
core.info(`Saving cache path: ${actualCachePath}`);
if (!fs.existsSync(actualCachePath) && !inputs_1.ignoreNothingToCache) {
throw new Error(`Cache path ${actualCachePath} does not exist on disk. This likely indicates that there are no dependencies to cache. Consider disabling the cache input if it is not needed.`);
}
const cachePaths = [actualCachePath];
if (inputs_1.cachePython) {
core.info(`Including Python cache path: ${inputs_1.pythonDir}`);
if (!fs.existsSync(inputs_1.pythonDir) && !inputs_1.ignoreNothingToCache) {
throw new Error(`Python cache path ${inputs_1.pythonDir} does not exist on disk. This likely indicates that there are no dependencies to cache. Consider disabling the cache input if it is not needed.`);
}
cachePaths.push(inputs_1.pythonDir);
}
core.info(`Final cache paths: ${cachePaths.join(", ")}`);
try {
await cache.saveCache([inputs_1.cacheLocalPath], cacheKey);
await cache.saveCache(cachePaths, cacheKey);
core.info(`cache saved with the key: ${cacheKey}`);
}
catch (e) {
@@ -90067,16 +90874,98 @@ async function saveCache() {
}
}
async function pruneCache() {
const forceSupported = pep440.gte(core.getState(constants_1.STATE_UV_VERSION), "0.8.24");
const options = {
silent: !core.isDebug(),
silent: false,
};
const execArgs = ["cache", "prune", "--ci"];
if (forceSupported) {
execArgs.push("--force");
}
core.info("Pruning cache...");
await exec.exec("uv", execArgs, options);
const uvPath = core.getState(constants_1.STATE_UV_PATH);
await exec.exec(uvPath, execArgs, options);
}
run();
/***/ }),
/***/ 5465:
/***/ (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;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getConfigValueFromTomlFile = getConfigValueFromTomlFile;
const node_fs_1 = __importDefault(__nccwpck_require__(3024));
const toml = __importStar(__nccwpck_require__(7106));
function getConfigValueFromTomlFile(filePath, key) {
if (!node_fs_1.default.existsSync(filePath) || !filePath.endsWith(".toml")) {
return undefined;
}
const fileContent = node_fs_1.default.readFileSync(filePath, "utf-8");
if (filePath.endsWith("pyproject.toml")) {
const tomlContent = toml.parse(fileContent);
return tomlContent?.tool?.uv?.[key];
}
const tomlContent = toml.parse(fileContent);
return tomlContent[key];
}
/***/ }),
/***/ 6156:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.STATE_UV_VERSION = exports.STATE_UV_PATH = exports.TOOL_CACHE_NAME = exports.OWNER = exports.REPO = void 0;
exports.REPO = "uv";
exports.OWNER = "astral-sh";
exports.TOOL_CACHE_NAME = "uv";
exports.STATE_UV_PATH = "uv-path";
exports.STATE_UV_VERSION = "uv-version";
/***/ }),
/***/ 9612:
@@ -90121,9 +91010,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
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.addProblemMatchers = exports.manifestFile = exports.githubToken = exports.pythonDir = exports.toolDir = exports.toolBinDir = exports.ignoreEmptyWorkdir = exports.ignoreNothingToCache = exports.cachePython = exports.pruneCache = exports.cacheDependencyGlob = exports.cacheLocalPath = exports.cacheSuffix = exports.saveCache = exports.restoreCache = exports.enableCache = exports.checkSum = exports.activateEnvironment = exports.pythonVersion = exports.versionFile = exports.version = exports.workingDirectory = void 0;
exports.getUvPythonDir = getUvPythonDir;
const node_path_1 = __importDefault(__nccwpck_require__(6760));
const core = __importStar(__nccwpck_require__(7484));
const config_file_1 = __nccwpck_require__(5465);
exports.workingDirectory = core.getInput("working-directory");
exports.version = core.getInput("version");
exports.versionFile = getVersionFile();
@@ -90131,15 +91022,18 @@ exports.pythonVersion = core.getInput("python-version");
exports.activateEnvironment = core.getBooleanInput("activate-environment");
exports.checkSum = core.getInput("checksum");
exports.enableCache = getEnableCache();
exports.restoreCache = core.getInput("restore-cache") === "true";
exports.saveCache = core.getInput("save-cache") === "true";
exports.cacheSuffix = core.getInput("cache-suffix") || "";
exports.cacheLocalPath = getCacheLocalPath();
exports.cacheDependencyGlob = getCacheDependencyGlob();
exports.pruneCache = core.getInput("prune-cache") === "true";
exports.cachePython = core.getInput("cache-python") === "true";
exports.ignoreNothingToCache = core.getInput("ignore-nothing-to-cache") === "true";
exports.ignoreEmptyWorkdir = core.getInput("ignore-empty-workdir") === "true";
exports.toolBinDir = getToolBinDir();
exports.toolDir = getToolDir();
exports.serverUrl = core.getInput("server-url");
exports.pythonDir = getUvPythonDir();
exports.githubToken = core.getInput("github-token");
exports.manifestFile = getManifestFile();
exports.addProblemMatchers = core.getInput("add-problem-matchers") === "true";
@@ -90192,6 +91086,14 @@ function getCacheLocalPath() {
const tildeExpanded = expandTilde(cacheLocalPathInput);
return resolveRelativePath(tildeExpanded);
}
const cacheDirFromConfig = getCacheDirFromConfig();
if (cacheDirFromConfig !== undefined) {
return cacheDirFromConfig;
}
if (process.env.UV_CACHE_DIR !== undefined) {
core.info(`UV_CACHE_DIR is already set to ${process.env.UV_CACHE_DIR}`);
return process.env.UV_CACHE_DIR;
}
if (process.env.RUNNER_ENVIRONMENT === "github-hosted") {
if (process.env.RUNNER_TEMP !== undefined) {
return `${process.env.RUNNER_TEMP}${node_path_1.default.sep}setup-uv-cache`;
@@ -90203,6 +91105,42 @@ function getCacheLocalPath() {
}
return `${process.env.HOME}${node_path_1.default.sep}.cache${node_path_1.default.sep}uv`;
}
function getCacheDirFromConfig() {
for (const filePath of [exports.versionFile, "uv.toml", "pyproject.toml"]) {
const resolvedPath = resolveRelativePath(filePath);
try {
const cacheDir = (0, config_file_1.getConfigValueFromTomlFile)(resolvedPath, "cache-dir");
if (cacheDir !== undefined) {
core.info(`Found cache-dir in ${resolvedPath}: ${cacheDir}`);
return cacheDir;
}
}
catch (err) {
const message = err.message;
core.warning(`Error while parsing ${filePath}: ${message}`);
return undefined;
}
}
return undefined;
}
function getUvPythonDir() {
if (process.env.UV_PYTHON_INSTALL_DIR !== undefined) {
core.info(`UV_PYTHON_INSTALL_DIR is already set to ${process.env.UV_PYTHON_INSTALL_DIR}`);
return process.env.UV_PYTHON_INSTALL_DIR;
}
if (process.env.RUNNER_ENVIRONMENT !== "github-hosted") {
if (process.platform === "win32") {
return `${process.env.APPDATA}${node_path_1.default.sep}uv${node_path_1.default.sep}python`;
}
else {
return `${process.env.HOME}${node_path_1.default.sep}.local${node_path_1.default.sep}share${node_path_1.default.sep}uv${node_path_1.default.sep}python`;
}
}
if (process.env.RUNNER_TEMP !== undefined) {
return `${process.env.RUNNER_TEMP}${node_path_1.default.sep}uv-python-dir`;
}
throw Error("Could not determine UV_PYTHON_INSTALL_DIR. Please make sure RUNNER_TEMP is set or provide the UV_PYTHON_INSTALL_DIR environment variable");
}
function getCacheDependencyGlob() {
const cacheDependencyGlobInput = core.getInput("cache-dependency-glob");
if (cacheDependencyGlobInput !== "") {
@@ -92244,6 +93182,915 @@ function parseParams (str) {
module.exports = parseParams
/***/ }),
/***/ 7106:
/***/ ((module) => {
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// dist/index.js
var index_exports = {};
__export(index_exports, {
TomlDate: () => TomlDate,
TomlError: () => TomlError,
default: () => index_default,
parse: () => parse,
stringify: () => stringify
});
module.exports = __toCommonJS(index_exports);
// dist/error.js
function getLineColFromPtr(string, ptr) {
let lines = string.slice(0, ptr).split(/\r\n|\n|\r/g);
return [lines.length, lines.pop().length + 1];
}
function makeCodeBlock(string, line, column) {
let lines = string.split(/\r\n|\n|\r/g);
let codeblock = "";
let numberLen = (Math.log10(line + 1) | 0) + 1;
for (let i = line - 1; i <= line + 1; i++) {
let l = lines[i - 1];
if (!l)
continue;
codeblock += i.toString().padEnd(numberLen, " ");
codeblock += ": ";
codeblock += l;
codeblock += "\n";
if (i === line) {
codeblock += " ".repeat(numberLen + column + 2);
codeblock += "^\n";
}
}
return codeblock;
}
var TomlError = class extends Error {
line;
column;
codeblock;
constructor(message, options) {
const [line, column] = getLineColFromPtr(options.toml, options.ptr);
const codeblock = makeCodeBlock(options.toml, line, column);
super(`Invalid TOML document: ${message}
${codeblock}`, options);
this.line = line;
this.column = column;
this.codeblock = codeblock;
}
};
// dist/util.js
function isEscaped(str, ptr) {
let i = 0;
while (str[ptr - ++i] === "\\")
;
return --i && i % 2;
}
function indexOfNewline(str, start = 0, end = str.length) {
let idx = str.indexOf("\n", start);
if (str[idx - 1] === "\r")
idx--;
return idx <= end ? idx : -1;
}
function skipComment(str, ptr) {
for (let i = ptr; i < str.length; i++) {
let c = str[i];
if (c === "\n")
return i;
if (c === "\r" && str[i + 1] === "\n")
return i + 1;
if (c < " " && c !== " " || c === "\x7F") {
throw new TomlError("control characters are not allowed in comments", {
toml: str,
ptr
});
}
}
return str.length;
}
function skipVoid(str, ptr, banNewLines, banComments) {
let c;
while ((c = str[ptr]) === " " || c === " " || !banNewLines && (c === "\n" || c === "\r" && str[ptr + 1] === "\n"))
ptr++;
return banComments || c !== "#" ? ptr : skipVoid(str, skipComment(str, ptr), banNewLines);
}
function skipUntil(str, ptr, sep, end, banNewLines = false) {
if (!end) {
ptr = indexOfNewline(str, ptr);
return ptr < 0 ? str.length : ptr;
}
for (let i = ptr; i < str.length; i++) {
let c = str[i];
if (c === "#") {
i = indexOfNewline(str, i);
} else if (c === sep) {
return i + 1;
} else if (c === end || banNewLines && (c === "\n" || c === "\r" && str[i + 1] === "\n")) {
return i;
}
}
throw new TomlError("cannot find end of structure", {
toml: str,
ptr
});
}
function getStringEnd(str, seek) {
let first = str[seek];
let target = first === str[seek + 1] && str[seek + 1] === str[seek + 2] ? str.slice(seek, seek + 3) : first;
seek += target.length - 1;
do
seek = str.indexOf(target, ++seek);
while (seek > -1 && first !== "'" && isEscaped(str, seek));
if (seek > -1) {
seek += target.length;
if (target.length > 1) {
if (str[seek] === first)
seek++;
if (str[seek] === first)
seek++;
}
}
return seek;
}
// dist/date.js
var DATE_TIME_RE = /^(\d{4}-\d{2}-\d{2})?[T ]?(?:(\d{2}):\d{2}:\d{2}(?:\.\d+)?)?(Z|[-+]\d{2}:\d{2})?$/i;
var TomlDate = class _TomlDate extends Date {
#hasDate = false;
#hasTime = false;
#offset = null;
constructor(date) {
let hasDate = true;
let hasTime = true;
let offset = "Z";
if (typeof date === "string") {
let match = date.match(DATE_TIME_RE);
if (match) {
if (!match[1]) {
hasDate = false;
date = `0000-01-01T${date}`;
}
hasTime = !!match[2];
hasTime && date[10] === " " && (date = date.replace(" ", "T"));
if (match[2] && +match[2] > 23) {
date = "";
} else {
offset = match[3] || null;
date = date.toUpperCase();
if (!offset && hasTime)
date += "Z";
}
} else {
date = "";
}
}
super(date);
if (!isNaN(this.getTime())) {
this.#hasDate = hasDate;
this.#hasTime = hasTime;
this.#offset = offset;
}
}
isDateTime() {
return this.#hasDate && this.#hasTime;
}
isLocal() {
return !this.#hasDate || !this.#hasTime || !this.#offset;
}
isDate() {
return this.#hasDate && !this.#hasTime;
}
isTime() {
return this.#hasTime && !this.#hasDate;
}
isValid() {
return this.#hasDate || this.#hasTime;
}
toISOString() {
let iso = super.toISOString();
if (this.isDate())
return iso.slice(0, 10);
if (this.isTime())
return iso.slice(11, 23);
if (this.#offset === null)
return iso.slice(0, -1);
if (this.#offset === "Z")
return iso;
let offset = +this.#offset.slice(1, 3) * 60 + +this.#offset.slice(4, 6);
offset = this.#offset[0] === "-" ? offset : -offset;
let offsetDate = new Date(this.getTime() - offset * 6e4);
return offsetDate.toISOString().slice(0, -1) + this.#offset;
}
static wrapAsOffsetDateTime(jsDate, offset = "Z") {
let date = new _TomlDate(jsDate);
date.#offset = offset;
return date;
}
static wrapAsLocalDateTime(jsDate) {
let date = new _TomlDate(jsDate);
date.#offset = null;
return date;
}
static wrapAsLocalDate(jsDate) {
let date = new _TomlDate(jsDate);
date.#hasTime = false;
date.#offset = null;
return date;
}
static wrapAsLocalTime(jsDate) {
let date = new _TomlDate(jsDate);
date.#hasDate = false;
date.#offset = null;
return date;
}
};
// dist/primitive.js
var INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\d(_?\d)*))$/;
var FLOAT_REGEX = /^[+-]?\d(_?\d)*(\.\d(_?\d)*)?([eE][+-]?\d(_?\d)*)?$/;
var LEADING_ZERO = /^[+-]?0[0-9_]/;
var ESCAPE_REGEX = /^[0-9a-f]{4,8}$/i;
var ESC_MAP = {
b: "\b",
t: " ",
n: "\n",
f: "\f",
r: "\r",
'"': '"',
"\\": "\\"
};
function parseString(str, ptr = 0, endPtr = str.length) {
let isLiteral = str[ptr] === "'";
let isMultiline = str[ptr++] === str[ptr] && str[ptr] === str[ptr + 1];
if (isMultiline) {
endPtr -= 2;
if (str[ptr += 2] === "\r")
ptr++;
if (str[ptr] === "\n")
ptr++;
}
let tmp = 0;
let isEscape;
let parsed = "";
let sliceStart = ptr;
while (ptr < endPtr - 1) {
let c = str[ptr++];
if (c === "\n" || c === "\r" && str[ptr] === "\n") {
if (!isMultiline) {
throw new TomlError("newlines are not allowed in strings", {
toml: str,
ptr: ptr - 1
});
}
} else if (c < " " && c !== " " || c === "\x7F") {
throw new TomlError("control characters are not allowed in strings", {
toml: str,
ptr: ptr - 1
});
}
if (isEscape) {
isEscape = false;
if (c === "u" || c === "U") {
let code = str.slice(ptr, ptr += c === "u" ? 4 : 8);
if (!ESCAPE_REGEX.test(code)) {
throw new TomlError("invalid unicode escape", {
toml: str,
ptr: tmp
});
}
try {
parsed += String.fromCodePoint(parseInt(code, 16));
} catch {
throw new TomlError("invalid unicode escape", {
toml: str,
ptr: tmp
});
}
} else if (isMultiline && (c === "\n" || c === " " || c === " " || c === "\r")) {
ptr = skipVoid(str, ptr - 1, true);
if (str[ptr] !== "\n" && str[ptr] !== "\r") {
throw new TomlError("invalid escape: only line-ending whitespace may be escaped", {
toml: str,
ptr: tmp
});
}
ptr = skipVoid(str, ptr);
} else if (c in ESC_MAP) {
parsed += ESC_MAP[c];
} else {
throw new TomlError("unrecognized escape sequence", {
toml: str,
ptr: tmp
});
}
sliceStart = ptr;
} else if (!isLiteral && c === "\\") {
tmp = ptr - 1;
isEscape = true;
parsed += str.slice(sliceStart, tmp);
}
}
return parsed + str.slice(sliceStart, endPtr - 1);
}
function parseValue(value, toml, ptr, integersAsBigInt) {
if (value === "true")
return true;
if (value === "false")
return false;
if (value === "-inf")
return -Infinity;
if (value === "inf" || value === "+inf")
return Infinity;
if (value === "nan" || value === "+nan" || value === "-nan")
return NaN;
if (value === "-0")
return integersAsBigInt ? 0n : 0;
let isInt = INT_REGEX.test(value);
if (isInt || FLOAT_REGEX.test(value)) {
if (LEADING_ZERO.test(value)) {
throw new TomlError("leading zeroes are not allowed", {
toml,
ptr
});
}
value = value.replace(/_/g, "");
let numeric = +value;
if (isNaN(numeric)) {
throw new TomlError("invalid number", {
toml,
ptr
});
}
if (isInt) {
if ((isInt = !Number.isSafeInteger(numeric)) && !integersAsBigInt) {
throw new TomlError("integer value cannot be represented losslessly", {
toml,
ptr
});
}
if (isInt || integersAsBigInt === true)
numeric = BigInt(value);
}
return numeric;
}
const date = new TomlDate(value);
if (!date.isValid()) {
throw new TomlError("invalid value", {
toml,
ptr
});
}
return date;
}
// dist/extract.js
function sliceAndTrimEndOf(str, startPtr, endPtr, allowNewLines) {
let value = str.slice(startPtr, endPtr);
let commentIdx = value.indexOf("#");
if (commentIdx > -1) {
skipComment(str, commentIdx);
value = value.slice(0, commentIdx);
}
let trimmed = value.trimEnd();
if (!allowNewLines) {
let newlineIdx = value.indexOf("\n", trimmed.length);
if (newlineIdx > -1) {
throw new TomlError("newlines are not allowed in inline tables", {
toml: str,
ptr: startPtr + newlineIdx
});
}
}
return [trimmed, commentIdx];
}
function extractValue(str, ptr, end, depth, integersAsBigInt) {
if (depth === 0) {
throw new TomlError("document contains excessively nested structures. aborting.", {
toml: str,
ptr
});
}
let c = str[ptr];
if (c === "[" || c === "{") {
let [value, endPtr2] = c === "[" ? parseArray(str, ptr, depth, integersAsBigInt) : parseInlineTable(str, ptr, depth, integersAsBigInt);
let newPtr = end ? skipUntil(str, endPtr2, ",", end) : endPtr2;
if (endPtr2 - newPtr && end === "}") {
let nextNewLine = indexOfNewline(str, endPtr2, newPtr);
if (nextNewLine > -1) {
throw new TomlError("newlines are not allowed in inline tables", {
toml: str,
ptr: nextNewLine
});
}
}
return [value, newPtr];
}
let endPtr;
if (c === '"' || c === "'") {
endPtr = getStringEnd(str, ptr);
let parsed = parseString(str, ptr, endPtr);
if (end) {
endPtr = skipVoid(str, endPtr, end !== "]");
if (str[endPtr] && str[endPtr] !== "," && str[endPtr] !== end && str[endPtr] !== "\n" && str[endPtr] !== "\r") {
throw new TomlError("unexpected character encountered", {
toml: str,
ptr: endPtr
});
}
endPtr += +(str[endPtr] === ",");
}
return [parsed, endPtr];
}
endPtr = skipUntil(str, ptr, ",", end);
let slice = sliceAndTrimEndOf(str, ptr, endPtr - +(str[endPtr - 1] === ","), end === "]");
if (!slice[0]) {
throw new TomlError("incomplete key-value declaration: no value specified", {
toml: str,
ptr
});
}
if (end && slice[1] > -1) {
endPtr = skipVoid(str, ptr + slice[1]);
endPtr += +(str[endPtr] === ",");
}
return [
parseValue(slice[0], str, ptr, integersAsBigInt),
endPtr
];
}
// dist/struct.js
var KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \t]*$/;
function parseKey(str, ptr, end = "=") {
let dot = ptr - 1;
let parsed = [];
let endPtr = str.indexOf(end, ptr);
if (endPtr < 0) {
throw new TomlError("incomplete key-value: cannot find end of key", {
toml: str,
ptr
});
}
do {
let c = str[ptr = ++dot];
if (c !== " " && c !== " ") {
if (c === '"' || c === "'") {
if (c === str[ptr + 1] && c === str[ptr + 2]) {
throw new TomlError("multiline strings are not allowed in keys", {
toml: str,
ptr
});
}
let eos = getStringEnd(str, ptr);
if (eos < 0) {
throw new TomlError("unfinished string encountered", {
toml: str,
ptr
});
}
dot = str.indexOf(".", eos);
let strEnd = str.slice(eos, dot < 0 || dot > endPtr ? endPtr : dot);
let newLine = indexOfNewline(strEnd);
if (newLine > -1) {
throw new TomlError("newlines are not allowed in keys", {
toml: str,
ptr: ptr + dot + newLine
});
}
if (strEnd.trimStart()) {
throw new TomlError("found extra tokens after the string part", {
toml: str,
ptr: eos
});
}
if (endPtr < eos) {
endPtr = str.indexOf(end, eos);
if (endPtr < 0) {
throw new TomlError("incomplete key-value: cannot find end of key", {
toml: str,
ptr
});
}
}
parsed.push(parseString(str, ptr, eos));
} else {
dot = str.indexOf(".", ptr);
let part = str.slice(ptr, dot < 0 || dot > endPtr ? endPtr : dot);
if (!KEY_PART_RE.test(part)) {
throw new TomlError("only letter, numbers, dashes and underscores are allowed in keys", {
toml: str,
ptr
});
}
parsed.push(part.trimEnd());
}
}
} while (dot + 1 && dot < endPtr);
return [parsed, skipVoid(str, endPtr + 1, true, true)];
}
function parseInlineTable(str, ptr, depth, integersAsBigInt) {
let res = {};
let seen = /* @__PURE__ */ new Set();
let c;
let comma = 0;
ptr++;
while ((c = str[ptr++]) !== "}" && c) {
let err = { toml: str, ptr: ptr - 1 };
if (c === "\n") {
throw new TomlError("newlines are not allowed in inline tables", err);
} else if (c === "#") {
throw new TomlError("inline tables cannot contain comments", err);
} else if (c === ",") {
throw new TomlError("expected key-value, found comma", err);
} else if (c !== " " && c !== " ") {
let k;
let t = res;
let hasOwn = false;
let [key, keyEndPtr] = parseKey(str, ptr - 1);
for (let i = 0; i < key.length; i++) {
if (i)
t = hasOwn ? t[k] : t[k] = {};
k = key[i];
if ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== "object" || seen.has(t[k]))) {
throw new TomlError("trying to redefine an already defined value", {
toml: str,
ptr
});
}
if (!hasOwn && k === "__proto__") {
Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });
}
}
if (hasOwn) {
throw new TomlError("trying to redefine an already defined value", {
toml: str,
ptr
});
}
let [value, valueEndPtr] = extractValue(str, keyEndPtr, "}", depth - 1, integersAsBigInt);
seen.add(value);
t[k] = value;
ptr = valueEndPtr;
comma = str[ptr - 1] === "," ? ptr - 1 : 0;
}
}
if (comma) {
throw new TomlError("trailing commas are not allowed in inline tables", {
toml: str,
ptr: comma
});
}
if (!c) {
throw new TomlError("unfinished table encountered", {
toml: str,
ptr
});
}
return [res, ptr];
}
function parseArray(str, ptr, depth, integersAsBigInt) {
let res = [];
let c;
ptr++;
while ((c = str[ptr++]) !== "]" && c) {
if (c === ",") {
throw new TomlError("expected value, found comma", {
toml: str,
ptr: ptr - 1
});
} else if (c === "#")
ptr = skipComment(str, ptr);
else if (c !== " " && c !== " " && c !== "\n" && c !== "\r") {
let e = extractValue(str, ptr - 1, "]", depth - 1, integersAsBigInt);
res.push(e[0]);
ptr = e[1];
}
}
if (!c) {
throw new TomlError("unfinished array encountered", {
toml: str,
ptr
});
}
return [res, ptr];
}
// dist/parse.js
function peekTable(key, table, meta, type) {
let t = table;
let m = meta;
let k;
let hasOwn = false;
let state;
for (let i = 0; i < key.length; i++) {
if (i) {
t = hasOwn ? t[k] : t[k] = {};
m = (state = m[k]).c;
if (type === 0 && (state.t === 1 || state.t === 2)) {
return null;
}
if (state.t === 2) {
let l = t.length - 1;
t = t[l];
m = m[l].c;
}
}
k = key[i];
if ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === 0 && m[k]?.d) {
return null;
}
if (!hasOwn) {
if (k === "__proto__") {
Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });
Object.defineProperty(m, k, { enumerable: true, configurable: true, writable: true });
}
m[k] = {
t: i < key.length - 1 && type === 2 ? 3 : type,
d: false,
i: 0,
c: {}
};
}
}
state = m[k];
if (state.t !== type && !(type === 1 && state.t === 3)) {
return null;
}
if (type === 2) {
if (!state.d) {
state.d = true;
t[k] = [];
}
t[k].push(t = {});
state.c[state.i++] = state = { t: 1, d: false, i: 0, c: {} };
}
if (state.d) {
return null;
}
state.d = true;
if (type === 1) {
t = hasOwn ? t[k] : t[k] = {};
} else if (type === 0 && hasOwn) {
return null;
}
return [k, t, state.c];
}
function parse(toml, { maxDepth = 1e3, integersAsBigInt } = {}) {
let res = {};
let meta = {};
let tbl = res;
let m = meta;
for (let ptr = skipVoid(toml, 0); ptr < toml.length; ) {
if (toml[ptr] === "[") {
let isTableArray = toml[++ptr] === "[";
let k = parseKey(toml, ptr += +isTableArray, "]");
if (isTableArray) {
if (toml[k[1] - 1] !== "]") {
throw new TomlError("expected end of table declaration", {
toml,
ptr: k[1] - 1
});
}
k[1]++;
}
let p = peekTable(
k[0],
res,
meta,
isTableArray ? 2 : 1
/* Type.EXPLICIT */
);
if (!p) {
throw new TomlError("trying to redefine an already defined table or value", {
toml,
ptr
});
}
m = p[2];
tbl = p[1];
ptr = k[1];
} else {
let k = parseKey(toml, ptr);
let p = peekTable(
k[0],
tbl,
m,
0
/* Type.DOTTED */
);
if (!p) {
throw new TomlError("trying to redefine an already defined table or value", {
toml,
ptr
});
}
let v = extractValue(toml, k[1], void 0, maxDepth, integersAsBigInt);
p[1][p[0]] = v[0];
ptr = v[1];
}
ptr = skipVoid(toml, ptr, true);
if (toml[ptr] && toml[ptr] !== "\n" && toml[ptr] !== "\r") {
throw new TomlError("each key-value declaration must be followed by an end-of-line", {
toml,
ptr
});
}
ptr = skipVoid(toml, ptr);
}
return res;
}
// dist/stringify.js
var BARE_KEY = /^[a-z0-9-_]+$/i;
function extendedTypeOf(obj) {
let type = typeof obj;
if (type === "object") {
if (Array.isArray(obj))
return "array";
if (obj instanceof Date)
return "date";
}
return type;
}
function isArrayOfTables(obj) {
for (let i = 0; i < obj.length; i++) {
if (extendedTypeOf(obj[i]) !== "object")
return false;
}
return obj.length != 0;
}
function formatString(s) {
return JSON.stringify(s).replace(/\x7f/g, "\\u007f");
}
function stringifyValue(val, type, depth, numberAsFloat) {
if (depth === 0) {
throw new Error("Could not stringify the object: maximum object depth exceeded");
}
if (type === "number") {
if (isNaN(val))
return "nan";
if (val === Infinity)
return "inf";
if (val === -Infinity)
return "-inf";
if (numberAsFloat && Number.isInteger(val))
return val.toFixed(1);
return val.toString();
}
if (type === "bigint" || type === "boolean") {
return val.toString();
}
if (type === "string") {
return formatString(val);
}
if (type === "date") {
if (isNaN(val.getTime())) {
throw new TypeError("cannot serialize invalid date");
}
return val.toISOString();
}
if (type === "object") {
return stringifyInlineTable(val, depth, numberAsFloat);
}
if (type === "array") {
return stringifyArray(val, depth, numberAsFloat);
}
}
function stringifyInlineTable(obj, depth, numberAsFloat) {
let keys = Object.keys(obj);
if (keys.length === 0)
return "{}";
let res = "{ ";
for (let i = 0; i < keys.length; i++) {
let k = keys[i];
if (i)
res += ", ";
res += BARE_KEY.test(k) ? k : formatString(k);
res += " = ";
res += stringifyValue(obj[k], extendedTypeOf(obj[k]), depth - 1, numberAsFloat);
}
return res + " }";
}
function stringifyArray(array, depth, numberAsFloat) {
if (array.length === 0)
return "[]";
let res = "[ ";
for (let i = 0; i < array.length; i++) {
if (i)
res += ", ";
if (array[i] === null || array[i] === void 0) {
throw new TypeError("arrays cannot contain null or undefined values");
}
res += stringifyValue(array[i], extendedTypeOf(array[i]), depth - 1, numberAsFloat);
}
return res + " ]";
}
function stringifyArrayTable(array, key, depth, numberAsFloat) {
if (depth === 0) {
throw new Error("Could not stringify the object: maximum object depth exceeded");
}
let res = "";
for (let i = 0; i < array.length; i++) {
res += `[[${key}]]
`;
res += stringifyTable(array[i], key, depth, numberAsFloat);
res += "\n\n";
}
return res;
}
function stringifyTable(obj, prefix, depth, numberAsFloat) {
if (depth === 0) {
throw new Error("Could not stringify the object: maximum object depth exceeded");
}
let preamble = "";
let tables = "";
let keys = Object.keys(obj);
for (let i = 0; i < keys.length; i++) {
let k = keys[i];
if (obj[k] !== null && obj[k] !== void 0) {
let type = extendedTypeOf(obj[k]);
if (type === "symbol" || type === "function") {
throw new TypeError(`cannot serialize values of type '${type}'`);
}
let key = BARE_KEY.test(k) ? k : formatString(k);
if (type === "array" && isArrayOfTables(obj[k])) {
tables += stringifyArrayTable(obj[k], prefix ? `${prefix}.${key}` : key, depth - 1, numberAsFloat);
} else if (type === "object") {
let tblKey = prefix ? `${prefix}.${key}` : key;
tables += `[${tblKey}]
`;
tables += stringifyTable(obj[k], tblKey, depth - 1, numberAsFloat);
tables += "\n\n";
} else {
preamble += key;
preamble += " = ";
preamble += stringifyValue(obj[k], type, depth, numberAsFloat);
preamble += "\n";
}
}
}
return `${preamble}
${tables}`.trim();
}
function stringify(obj, { maxDepth = 1e3, numbersAsFloat = false } = {}) {
if (extendedTypeOf(obj) !== "object") {
throw new TypeError("stringify can only be called with an object");
}
return stringifyTable(obj, "", maxDepth, numbersAsFloat);
}
// dist/index.js
var index_default = { parse, stringify, TomlDate, TomlError };
// Annotate the CommonJS export names for ESM import in node:
0 && (0);
/*!
* Copyright (c) Squirrel Chat et al., All rights reserved.
* SPDX-License-Identifier: BSD-3-Clause
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/***/ }),
/***/ 4012:

2777
dist/setup/index.js generated vendored
View File

@@ -84592,16 +84592,14 @@ module.exports.setGlobalDispatcher = setGlobalDispatcher
module.exports.getGlobalDispatcher = getGlobalDispatcher
const fetchImpl = (__nccwpck_require__(54398).fetch)
module.exports.fetch = async function fetch (init, options = undefined) {
try {
return await fetchImpl(init, options)
} catch (err) {
module.exports.fetch = function fetch (init, options = undefined) {
return fetchImpl(init, options).catch(err => {
if (err && typeof err === 'object') {
Error.captureStackTrace(err)
}
throw err
}
})
}
module.exports.Headers = __nccwpck_require__(60660).Headers
module.exports.Response = __nccwpck_require__(99051).Response
@@ -84616,8 +84614,6 @@ module.exports.getGlobalOrigin = getGlobalOrigin
const { CacheStorage } = __nccwpck_require__(3245)
const { kConstruct } = __nccwpck_require__(36443)
// Cache & CacheStorage are tightly coupled with fetch. Even if it may run
// in an older version of Node, it doesn't have any use without fetch.
module.exports.caches = new CacheStorage(kConstruct)
const { deleteCookie, getCookies, getSetCookies, setCookie, parseCookie } = __nccwpck_require__(79061)
@@ -85249,14 +85245,28 @@ class RequestHandler extends AsyncResource {
this.callback = null
this.res = res
if (callback !== null) {
this.runInAsyncScope(callback, null, null, {
statusCode,
headers,
trailers: this.trailers,
opaque,
body: res,
context
})
try {
this.runInAsyncScope(callback, null, null, {
statusCode,
headers,
trailers: this.trailers,
opaque,
body: res,
context
})
} catch (err) {
// If the callback throws synchronously, we need to handle it
// Remove reference to res to allow res being garbage collected
this.res = null
// Destroy the response stream
util.destroy(res.on('error', noop), err)
// Use queueMicrotask to re-throw the error so it reaches uncaughtException
queueMicrotask(() => {
throw err
})
}
}
}
@@ -85950,24 +85960,26 @@ class BodyReadable extends Readable {
* @param {AbortSignal} [opts.signal] An AbortSignal to cancel the dump.
* @returns {Promise<null>}
*/
async dump (opts) {
dump (opts) {
const signal = opts?.signal
if (signal != null && (typeof signal !== 'object' || !('aborted' in signal))) {
throw new InvalidArgumentError('signal must be an AbortSignal')
return Promise.reject(new InvalidArgumentError('signal must be an AbortSignal'))
}
const limit = opts?.limit && Number.isFinite(opts.limit)
? opts.limit
: 128 * 1024
signal?.throwIfAborted()
if (this._readableState.closeEmitted) {
return null
if (signal?.aborted) {
return Promise.reject(signal.reason ?? new AbortError())
}
return await new Promise((resolve, reject) => {
if (this._readableState.closeEmitted) {
return Promise.resolve(null)
}
return new Promise((resolve, reject) => {
if (
(this[kContentLength] && (this[kContentLength] > limit)) ||
this[kBytesRead] > limit
@@ -87484,14 +87496,24 @@ module.exports = {
"use strict";
const kUndiciError = Symbol.for('undici.error.UND_ERR')
class UndiciError extends Error {
constructor (message, options) {
super(message, options)
this.name = 'UndiciError'
this.code = 'UND_ERR'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kUndiciError] === true
}
get [kUndiciError] () {
return true
}
}
const kConnectTimeoutError = Symbol.for('undici.error.UND_ERR_CONNECT_TIMEOUT')
class ConnectTimeoutError extends UndiciError {
constructor (message) {
super(message)
@@ -87499,8 +87521,17 @@ class ConnectTimeoutError extends UndiciError {
this.message = message || 'Connect Timeout Error'
this.code = 'UND_ERR_CONNECT_TIMEOUT'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kConnectTimeoutError] === true
}
get [kConnectTimeoutError] () {
return true
}
}
const kHeadersTimeoutError = Symbol.for('undici.error.UND_ERR_HEADERS_TIMEOUT')
class HeadersTimeoutError extends UndiciError {
constructor (message) {
super(message)
@@ -87508,8 +87539,17 @@ class HeadersTimeoutError extends UndiciError {
this.message = message || 'Headers Timeout Error'
this.code = 'UND_ERR_HEADERS_TIMEOUT'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kHeadersTimeoutError] === true
}
get [kHeadersTimeoutError] () {
return true
}
}
const kHeadersOverflowError = Symbol.for('undici.error.UND_ERR_HEADERS_OVERFLOW')
class HeadersOverflowError extends UndiciError {
constructor (message) {
super(message)
@@ -87517,8 +87557,17 @@ class HeadersOverflowError extends UndiciError {
this.message = message || 'Headers Overflow Error'
this.code = 'UND_ERR_HEADERS_OVERFLOW'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kHeadersOverflowError] === true
}
get [kHeadersOverflowError] () {
return true
}
}
const kBodyTimeoutError = Symbol.for('undici.error.UND_ERR_BODY_TIMEOUT')
class BodyTimeoutError extends UndiciError {
constructor (message) {
super(message)
@@ -87526,21 +87575,17 @@ class BodyTimeoutError extends UndiciError {
this.message = message || 'Body Timeout Error'
this.code = 'UND_ERR_BODY_TIMEOUT'
}
}
class ResponseStatusCodeError extends UndiciError {
constructor (message, statusCode, headers, body) {
super(message)
this.name = 'ResponseStatusCodeError'
this.message = message || 'Response Status Code Error'
this.code = 'UND_ERR_RESPONSE_STATUS_CODE'
this.body = body
this.status = statusCode
this.statusCode = statusCode
this.headers = headers
static [Symbol.hasInstance] (instance) {
return instance && instance[kBodyTimeoutError] === true
}
get [kBodyTimeoutError] () {
return true
}
}
const kInvalidArgumentError = Symbol.for('undici.error.UND_ERR_INVALID_ARG')
class InvalidArgumentError extends UndiciError {
constructor (message) {
super(message)
@@ -87548,8 +87593,17 @@ class InvalidArgumentError extends UndiciError {
this.message = message || 'Invalid Argument Error'
this.code = 'UND_ERR_INVALID_ARG'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kInvalidArgumentError] === true
}
get [kInvalidArgumentError] () {
return true
}
}
const kInvalidReturnValueError = Symbol.for('undici.error.UND_ERR_INVALID_RETURN_VALUE')
class InvalidReturnValueError extends UndiciError {
constructor (message) {
super(message)
@@ -87557,16 +87611,35 @@ class InvalidReturnValueError extends UndiciError {
this.message = message || 'Invalid Return Value Error'
this.code = 'UND_ERR_INVALID_RETURN_VALUE'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kInvalidReturnValueError] === true
}
get [kInvalidReturnValueError] () {
return true
}
}
const kAbortError = Symbol.for('undici.error.UND_ERR_ABORT')
class AbortError extends UndiciError {
constructor (message) {
super(message)
this.name = 'AbortError'
this.message = message || 'The operation was aborted'
this.code = 'UND_ERR_ABORT'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kAbortError] === true
}
get [kAbortError] () {
return true
}
}
const kRequestAbortedError = Symbol.for('undici.error.UND_ERR_ABORTED')
class RequestAbortedError extends AbortError {
constructor (message) {
super(message)
@@ -87574,8 +87647,17 @@ class RequestAbortedError extends AbortError {
this.message = message || 'Request aborted'
this.code = 'UND_ERR_ABORTED'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kRequestAbortedError] === true
}
get [kRequestAbortedError] () {
return true
}
}
const kInformationalError = Symbol.for('undici.error.UND_ERR_INFO')
class InformationalError extends UndiciError {
constructor (message) {
super(message)
@@ -87583,8 +87665,17 @@ class InformationalError extends UndiciError {
this.message = message || 'Request information'
this.code = 'UND_ERR_INFO'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kInformationalError] === true
}
get [kInformationalError] () {
return true
}
}
const kRequestContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH')
class RequestContentLengthMismatchError extends UndiciError {
constructor (message) {
super(message)
@@ -87592,8 +87683,17 @@ class RequestContentLengthMismatchError extends UndiciError {
this.message = message || 'Request body length does not match content-length header'
this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kRequestContentLengthMismatchError] === true
}
get [kRequestContentLengthMismatchError] () {
return true
}
}
const kResponseContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH')
class ResponseContentLengthMismatchError extends UndiciError {
constructor (message) {
super(message)
@@ -87601,8 +87701,17 @@ class ResponseContentLengthMismatchError extends UndiciError {
this.message = message || 'Response body length does not match content-length header'
this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kResponseContentLengthMismatchError] === true
}
get [kResponseContentLengthMismatchError] () {
return true
}
}
const kClientDestroyedError = Symbol.for('undici.error.UND_ERR_DESTROYED')
class ClientDestroyedError extends UndiciError {
constructor (message) {
super(message)
@@ -87610,8 +87719,17 @@ class ClientDestroyedError extends UndiciError {
this.message = message || 'The client is destroyed'
this.code = 'UND_ERR_DESTROYED'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kClientDestroyedError] === true
}
get [kClientDestroyedError] () {
return true
}
}
const kClientClosedError = Symbol.for('undici.error.UND_ERR_CLOSED')
class ClientClosedError extends UndiciError {
constructor (message) {
super(message)
@@ -87619,8 +87737,17 @@ class ClientClosedError extends UndiciError {
this.message = message || 'The client is closed'
this.code = 'UND_ERR_CLOSED'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kClientClosedError] === true
}
get [kClientClosedError] () {
return true
}
}
const kSocketError = Symbol.for('undici.error.UND_ERR_SOCKET')
class SocketError extends UndiciError {
constructor (message, socket) {
super(message)
@@ -87629,8 +87756,17 @@ class SocketError extends UndiciError {
this.code = 'UND_ERR_SOCKET'
this.socket = socket
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kSocketError] === true
}
get [kSocketError] () {
return true
}
}
const kNotSupportedError = Symbol.for('undici.error.UND_ERR_NOT_SUPPORTED')
class NotSupportedError extends UndiciError {
constructor (message) {
super(message)
@@ -87638,8 +87774,17 @@ class NotSupportedError extends UndiciError {
this.message = message || 'Not supported error'
this.code = 'UND_ERR_NOT_SUPPORTED'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kNotSupportedError] === true
}
get [kNotSupportedError] () {
return true
}
}
const kBalancedPoolMissingUpstreamError = Symbol.for('undici.error.UND_ERR_BPL_MISSING_UPSTREAM')
class BalancedPoolMissingUpstreamError extends UndiciError {
constructor (message) {
super(message)
@@ -87647,8 +87792,17 @@ class BalancedPoolMissingUpstreamError extends UndiciError {
this.message = message || 'No upstream has been added to the BalancedPool'
this.code = 'UND_ERR_BPL_MISSING_UPSTREAM'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kBalancedPoolMissingUpstreamError] === true
}
get [kBalancedPoolMissingUpstreamError] () {
return true
}
}
const kHTTPParserError = Symbol.for('undici.error.UND_ERR_HTTP_PARSER')
class HTTPParserError extends Error {
constructor (message, code, data) {
super(message)
@@ -87656,8 +87810,17 @@ class HTTPParserError extends Error {
this.code = code ? `HPE_${code}` : undefined
this.data = data ? data.toString() : undefined
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kHTTPParserError] === true
}
get [kHTTPParserError] () {
return true
}
}
const kResponseExceededMaxSizeError = Symbol.for('undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE')
class ResponseExceededMaxSizeError extends UndiciError {
constructor (message) {
super(message)
@@ -87665,8 +87828,17 @@ class ResponseExceededMaxSizeError extends UndiciError {
this.message = message || 'Response content exceeded max size'
this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kResponseExceededMaxSizeError] === true
}
get [kResponseExceededMaxSizeError] () {
return true
}
}
const kRequestRetryError = Symbol.for('undici.error.UND_ERR_REQ_RETRY')
class RequestRetryError extends UndiciError {
constructor (message, code, { headers, data }) {
super(message)
@@ -87677,8 +87849,17 @@ class RequestRetryError extends UndiciError {
this.data = data
this.headers = headers
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kRequestRetryError] === true
}
get [kRequestRetryError] () {
return true
}
}
const kResponseError = Symbol.for('undici.error.UND_ERR_RESPONSE')
class ResponseError extends UndiciError {
constructor (message, code, { headers, body }) {
super(message)
@@ -87689,8 +87870,17 @@ class ResponseError extends UndiciError {
this.body = body
this.headers = headers
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kResponseError] === true
}
get [kResponseError] () {
return true
}
}
const kSecureProxyConnectionError = Symbol.for('undici.error.UND_ERR_PRX_TLS')
class SecureProxyConnectionError extends UndiciError {
constructor (cause, message, options = {}) {
super(message, { cause, ...options })
@@ -87699,6 +87889,32 @@ class SecureProxyConnectionError extends UndiciError {
this.code = 'UND_ERR_PRX_TLS'
this.cause = cause
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kSecureProxyConnectionError] === true
}
get [kSecureProxyConnectionError] () {
return true
}
}
const kMaxOriginsReachedError = Symbol.for('undici.error.UND_ERR_MAX_ORIGINS_REACHED')
class MaxOriginsReachedError extends UndiciError {
constructor (message) {
super(message)
this.name = 'MaxOriginsReachedError'
this.message = message || 'Maximum allowed origins reached'
this.code = 'UND_ERR_MAX_ORIGINS_REACHED'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kMaxOriginsReachedError] === true
}
get [kMaxOriginsReachedError] () {
return true
}
}
module.exports = {
@@ -87710,7 +87926,6 @@ module.exports = {
BodyTimeoutError,
RequestContentLengthMismatchError,
ConnectTimeoutError,
ResponseStatusCodeError,
InvalidArgumentError,
InvalidReturnValueError,
RequestAbortedError,
@@ -87724,7 +87939,8 @@ module.exports = {
ResponseExceededMaxSizeError,
RequestRetryError,
ResponseError,
SecureProxyConnectionError
SecureProxyConnectionError,
MaxOriginsReachedError
}
@@ -87753,7 +87969,8 @@ const {
serializePathWithQuery,
assertRequestHandler,
getServerName,
normalizedMethodRecords
normalizedMethodRecords,
getProtocolFromUrlString
} = __nccwpck_require__(3440)
const { channels } = __nccwpck_require__(42414)
const { headerNameLowerCasedRecord } = __nccwpck_require__(10735)
@@ -87877,8 +88094,11 @@ class Request {
this.path = query ? serializePathWithQuery(path, query) : path
// TODO: shall we maybe standardize it to an URL object?
this.origin = origin
this.protocol = getProtocolFromUrlString(origin)
this.idempotent = idempotent == null
? method === 'HEAD' || method === 'GET'
: idempotent
@@ -89005,12 +89225,11 @@ function ReadableStreamFrom (iterable) {
let iterator
return new ReadableStream(
{
async start () {
start () {
iterator = iterable[Symbol.asyncIterator]()
},
pull (controller) {
async function pull () {
const { done, value } = await iterator.next()
return iterator.next().then(({ done, value }) => {
if (done) {
queueMicrotask(() => {
controller.close()
@@ -89021,15 +89240,13 @@ function ReadableStreamFrom (iterable) {
if (buf.byteLength) {
controller.enqueue(new Uint8Array(buf))
} else {
return await pull()
return this.pull(controller)
}
}
}
return pull()
})
},
async cancel () {
await iterator.return()
cancel () {
return iterator.return()
},
type: 'bytes'
}
@@ -89275,6 +89492,30 @@ function onConnectTimeout (socket, opts) {
destroy(socket, new ConnectTimeoutError(message))
}
/**
* @param {string} urlString
* @returns {string}
*/
function getProtocolFromUrlString (urlString) {
if (
urlString[0] === 'h' &&
urlString[1] === 't' &&
urlString[2] === 't' &&
urlString[3] === 'p'
) {
switch (urlString[4]) {
case ':':
return 'http:'
case 's':
if (urlString[5] === ':') {
return 'https:'
}
}
}
// fallback if none of the usual suspects
return urlString.slice(0, urlString.indexOf(':') + 1)
}
const kEnumerableProperty = Object.create(null)
kEnumerableProperty.enumerable = true
@@ -89346,7 +89587,8 @@ module.exports = {
nodeMinor,
safeHTTPMethods: Object.freeze(['GET', 'HEAD', 'OPTIONS', 'TRACE']),
wrapRequestBody,
setupConnectTimeout
setupConnectTimeout,
getProtocolFromUrlString
}
@@ -89358,7 +89600,7 @@ module.exports = {
"use strict";
const { InvalidArgumentError } = __nccwpck_require__(68707)
const { InvalidArgumentError, MaxOriginsReachedError } = __nccwpck_require__(68707)
const { kClients, kRunning, kClose, kDestroy, kDispatch, kUrl } = __nccwpck_require__(36443)
const DispatcherBase = __nccwpck_require__(21841)
const Pool = __nccwpck_require__(30628)
@@ -89371,6 +89613,7 @@ const kOnConnectionError = Symbol('onConnectionError')
const kOnDrain = Symbol('onDrain')
const kFactory = Symbol('factory')
const kOptions = Symbol('options')
const kOrigins = Symbol('origins')
function defaultFactory (origin, opts) {
return opts && opts.connections === 1
@@ -89379,7 +89622,7 @@ function defaultFactory (origin, opts) {
}
class Agent extends DispatcherBase {
constructor ({ factory = defaultFactory, connect, ...options } = {}) {
constructor ({ factory = defaultFactory, maxOrigins = Infinity, connect, ...options } = {}) {
if (typeof factory !== 'function') {
throw new InvalidArgumentError('factory must be a function.')
}
@@ -89388,15 +89631,20 @@ class Agent extends DispatcherBase {
throw new InvalidArgumentError('connect must be a function or an object')
}
if (typeof maxOrigins !== 'number' || Number.isNaN(maxOrigins) || maxOrigins <= 0) {
throw new InvalidArgumentError('maxOrigins must be a number greater than 0')
}
super()
if (connect && typeof connect !== 'function') {
connect = { ...connect }
}
this[kOptions] = { ...util.deepClone(options), connect }
this[kOptions] = { ...util.deepClone(options), maxOrigins, connect }
this[kFactory] = factory
this[kClients] = new Map()
this[kOrigins] = new Set()
this[kOnDrain] = (origin, targets) => {
this.emit('drain', origin, [this, ...targets])
@@ -89431,6 +89679,10 @@ class Agent extends DispatcherBase {
throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.')
}
if (this[kOrigins].size >= this[kOptions].maxOrigins && !this[kOrigins].has(key)) {
throw new MaxOriginsReachedError()
}
const result = this[kClients].get(key)
let dispatcher = result && result.dispatcher
if (!dispatcher) {
@@ -89442,6 +89694,7 @@ class Agent extends DispatcherBase {
this[kClients].delete(key)
result.dispatcher.close()
}
this[kOrigins].delete(key)
}
}
dispatcher = this[kFactory](opts.origin, this[kOptions])
@@ -89463,29 +89716,30 @@ class Agent extends DispatcherBase {
})
this[kClients].set(key, { count: 0, dispatcher })
this[kOrigins].add(key)
}
return dispatcher.dispatch(opts, handler)
}
async [kClose] () {
[kClose] () {
const closePromises = []
for (const { dispatcher } of this[kClients].values()) {
closePromises.push(dispatcher.close())
}
this[kClients].clear()
await Promise.all(closePromises)
return Promise.all(closePromises)
}
async [kDestroy] (err) {
[kDestroy] (err) {
const destroyPromises = []
for (const { dispatcher } of this[kClients].values()) {
destroyPromises.push(dispatcher.destroy(err))
}
this[kClients].clear()
await Promise.all(destroyPromises)
return Promise.all(destroyPromises)
}
get stats () {
@@ -89788,11 +90042,26 @@ function lazyllhttp () {
const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(63870) : undefined
let mod
try {
mod = new WebAssembly.Module(__nccwpck_require__(53434))
} catch {
/* istanbul ignore next */
// We disable wasm SIMD on ppc64 as it seems to be broken on Power 9 architectures.
let useWasmSIMD = process.arch !== 'ppc64'
// The Env Variable UNDICI_NO_WASM_SIMD allows explicitly overriding the default behavior
if (process.env.UNDICI_NO_WASM_SIMD === '1') {
useWasmSIMD = true
} else if (process.env.UNDICI_NO_WASM_SIMD === '0') {
useWasmSIMD = false
}
if (useWasmSIMD) {
try {
mod = new WebAssembly.Module(__nccwpck_require__(53434))
/* istanbul ignore next */
} catch {
}
}
/* istanbul ignore next */
if (!mod) {
// We could check if the error was caused by the simd option not
// being enabled, but the occurring of this other error
// * https://github.com/emscripten-core/emscripten/issues/11495
@@ -90049,10 +90318,6 @@ class Parser {
currentBufferRef = chunk
currentParser = this
ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, chunk.length)
/* eslint-disable-next-line no-useless-catch */
} catch (err) {
/* istanbul ignore next: difficult to make a test case for */
throw err
} finally {
currentParser = null
currentBufferRef = null
@@ -90484,7 +90749,7 @@ function onParserTimeout (parser) {
* @param {import('net').Socket} socket
* @returns
*/
async function connectH1 (client, socket) {
function connectH1 (client, socket) {
client[kSocket] = socket
if (!llhttpInstance) {
@@ -91415,7 +91680,7 @@ function parseH2Headers (headers) {
return result
}
async function connectH2 (client, socket) {
function connectH2 (client, socket) {
client[kSocket] = socket
const session = http2.connect(client[kUrl], {
@@ -91617,7 +91882,7 @@ function shouldSendContentLength (method) {
function writeH2 (client, request) {
const requestTimeout = request.bodyTimeout ?? client[kBodyTimeout]
const session = client[kHTTP2Session]
const { method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request
const { method, path, host, upgrade, expectContinue, signal, protocol, headers: reqHeaders } = request
let { body } = request
if (upgrade) {
@@ -91630,6 +91895,16 @@ function writeH2 (client, request) {
const key = reqHeaders[n + 0]
const val = reqHeaders[n + 1]
if (key === 'cookie') {
if (headers[key] != null) {
headers[key] = Array.isArray(headers[key]) ? (headers[key].push(val), headers[key]) : [headers[key], val]
} else {
headers[key] = val
}
continue
}
if (Array.isArray(val)) {
for (let i = 0; i < val.length; i++) {
if (headers[key]) {
@@ -91725,7 +92000,7 @@ function writeH2 (client, request) {
// :path and :scheme headers must be omitted when sending CONNECT
headers[HTTP2_HEADER_PATH] = path
headers[HTTP2_HEADER_SCHEME] = 'https'
headers[HTTP2_HEADER_SCHEME] = protocol === 'http:' ? 'http' : 'https'
// https://tools.ietf.org/html/rfc7231#section-4.3.1
// https://tools.ietf.org/html/rfc7231#section-4.3.2
@@ -92440,8 +92715,7 @@ class Client extends DispatcherBase {
}
[kDispatch] (opts, handler) {
const origin = opts.origin || this[kUrl].origin
const request = new Request(origin, opts, handler)
const request = new Request(this[kUrl].origin, opts, handler)
this[kQueue].push(request)
if (this[kResuming]) {
@@ -92461,7 +92735,7 @@ class Client extends DispatcherBase {
return this[kNeedDrain] < 2
}
async [kClose] () {
[kClose] () {
// TODO: for H2 we need to gracefully flush the remaining enqueued
// request and close each stream.
return new Promise((resolve) => {
@@ -92473,7 +92747,7 @@ class Client extends DispatcherBase {
})
}
async [kDestroy] (err) {
[kDestroy] (err) {
return new Promise((resolve) => {
const requests = this[kQueue].splice(this[kPendingIdx])
for (let i = 0; i < requests.length; i++) {
@@ -92525,9 +92799,9 @@ function onError (client, err) {
/**
* @param {Client} client
* @returns
* @returns {void}
*/
async function connect (client) {
function connect (client) {
assert(!client[kConnecting])
assert(!client[kHTTPContext])
@@ -92561,26 +92835,23 @@ async function connect (client) {
})
}
try {
const socket = await new Promise((resolve, reject) => {
client[kConnector]({
host,
hostname,
protocol,
port,
servername: client[kServerName],
localAddress: client[kLocalAddress]
}, (err, socket) => {
if (err) {
reject(err)
} else {
resolve(socket)
}
})
})
client[kConnector]({
host,
hostname,
protocol,
port,
servername: client[kServerName],
localAddress: client[kLocalAddress]
}, (err, socket) => {
if (err) {
handleConnectError(client, err, { host, hostname, protocol, port })
client[kResume]()
return
}
if (client.destroyed) {
util.destroy(socket.on('error', noop), new ClientDestroyedError())
client[kResume]()
return
}
@@ -92588,11 +92859,13 @@ async function connect (client) {
try {
client[kHTTPContext] = socket.alpnProtocol === 'h2'
? await connectH2(client, socket)
: await connectH1(client, socket)
? connectH2(client, socket)
: connectH1(client, socket)
} catch (err) {
socket.destroy().on('error', noop)
throw err
handleConnectError(client, err, { host, hostname, protocol, port })
client[kResume]()
return
}
client[kConnecting] = false
@@ -92617,44 +92890,46 @@ async function connect (client) {
socket
})
}
client.emit('connect', client[kUrl], [client])
} catch (err) {
if (client.destroyed) {
return
}
client[kResume]()
})
}
client[kConnecting] = false
if (channels.connectError.hasSubscribers) {
channels.connectError.publish({
connectParams: {
host,
hostname,
protocol,
port,
version: client[kHTTPContext]?.version,
servername: client[kServerName],
localAddress: client[kLocalAddress]
},
connector: client[kConnector],
error: err
})
}
if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {
assert(client[kRunning] === 0)
while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) {
const request = client[kQueue][client[kPendingIdx]++]
util.errorRequest(client, request, err)
}
} else {
onError(client, err)
}
client.emit('connectionError', client[kUrl], [client], err)
function handleConnectError (client, err, { host, hostname, protocol, port }) {
if (client.destroyed) {
return
}
client[kResume]()
client[kConnecting] = false
if (channels.connectError.hasSubscribers) {
channels.connectError.publish({
connectParams: {
host,
hostname,
protocol,
port,
version: client[kHTTPContext]?.version,
servername: client[kServerName],
localAddress: client[kLocalAddress]
},
connector: client[kConnector],
error: err
})
}
if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {
assert(client[kRunning] === 0)
while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) {
const request = client[kQueue][client[kPendingIdx]++]
util.errorRequest(client, request, err)
}
} else {
onError(client, err)
}
client.emit('connectionError', client[kUrl], [client], err)
}
function emitDrain (client) {
@@ -92779,19 +93054,24 @@ const kOnDestroyed = Symbol('onDestroyed')
const kOnClosed = Symbol('onClosed')
class DispatcherBase extends Dispatcher {
constructor () {
super()
/** @type {boolean} */
[kDestroyed] = false;
this[kDestroyed] = false
this[kOnDestroyed] = null
this[kClosed] = false
this[kOnClosed] = []
}
/** @type {Array|null} */
[kOnDestroyed] = null;
/** @type {boolean} */
[kClosed] = false;
/** @type {Array} */
[kOnClosed] = []
/** @returns {boolean} */
get destroyed () {
return this[kDestroyed]
}
/** @returns {boolean} */
get closed () {
return this[kClosed]
}
@@ -93037,24 +93317,20 @@ class EnvHttpProxyAgent extends DispatcherBase {
return agent.dispatch(opts, handler)
}
async [kClose] () {
await this[kNoProxyAgent].close()
if (!this[kHttpProxyAgent][kClosed]) {
await this[kHttpProxyAgent].close()
}
if (!this[kHttpsProxyAgent][kClosed]) {
await this[kHttpsProxyAgent].close()
}
[kClose] () {
return Promise.all([
this[kNoProxyAgent].close(),
!this[kHttpProxyAgent][kClosed] && this[kHttpProxyAgent].close(),
!this[kHttpsProxyAgent][kClosed] && this[kHttpsProxyAgent].close()
])
}
async [kDestroy] (err) {
await this[kNoProxyAgent].destroy(err)
if (!this[kHttpProxyAgent][kDestroyed]) {
await this[kHttpProxyAgent].destroy(err)
}
if (!this[kHttpsProxyAgent][kDestroyed]) {
await this[kHttpsProxyAgent].destroy(err)
}
[kDestroy] (err) {
return Promise.all([
this[kNoProxyAgent].destroy(err),
!this[kHttpProxyAgent][kDestroyed] && this[kHttpProxyAgent].destroy(err),
!this[kHttpsProxyAgent][kDestroyed] && this[kHttpsProxyAgent].destroy(err)
])
}
#getProxyAgentForUrl (url) {
@@ -93209,35 +93485,21 @@ const kMask = kSize - 1
* @template T
*/
class FixedCircularBuffer {
constructor () {
/**
* @type {number}
*/
this.bottom = 0
/**
* @type {number}
*/
this.top = 0
/**
* @type {Array<T|undefined>}
*/
this.list = new Array(kSize).fill(undefined)
/**
* @type {T|null}
*/
this.next = null
}
/** @type {number} */
bottom = 0
/** @type {number} */
top = 0
/** @type {Array<T|undefined>} */
list = new Array(kSize).fill(undefined)
/** @type {T|null} */
next = null
/**
* @returns {boolean}
*/
/** @returns {boolean} */
isEmpty () {
return this.top === this.bottom
}
/**
* @returns {boolean}
*/
/** @returns {boolean} */
isFull () {
return ((this.top + 1) & kMask) === this.bottom
}
@@ -93251,9 +93513,7 @@ class FixedCircularBuffer {
this.top = (this.top + 1) & kMask
}
/**
* @returns {T|null}
*/
/** @returns {T|null} */
shift () {
const nextItem = this.list[this.bottom]
if (nextItem === undefined) { return null }
@@ -93268,22 +93528,16 @@ class FixedCircularBuffer {
*/
module.exports = class FixedQueue {
constructor () {
/**
* @type {FixedCircularBuffer<T>}
*/
/** @type {FixedCircularBuffer<T>} */
this.head = this.tail = new FixedCircularBuffer()
}
/**
* @returns {boolean}
*/
/** @returns {boolean} */
isEmpty () {
return this.head.isEmpty()
}
/**
* @param {T} data
*/
/** @param {T} data */
push (data) {
if (this.head.isFull()) {
// Head is full: Creates a new queue, sets the old queue's `.next` to it,
@@ -93293,9 +93547,7 @@ module.exports = class FixedQueue {
this.head.push(data)
}
/**
* @returns {T|null}
*/
/** @returns {T|null} */
shift () {
const tail = this.tail
const next = tail.shift()
@@ -93329,8 +93581,6 @@ class H2CClient extends DispatcherBase {
#client = null
constructor (origin, clientOpts) {
super()
if (typeof origin === 'string') {
origin = new URL(origin)
}
@@ -93364,6 +93614,8 @@ class H2CClient extends DispatcherBase {
)
}
super()
this.#client = new Client(origin, {
...opts,
connect: this.#buildConnector(connect),
@@ -93427,12 +93679,12 @@ class H2CClient extends DispatcherBase {
return this.#client.dispatch(opts, handler)
}
async [kClose] () {
await this.#client.close()
[kClose] () {
return this.#client.close()
}
async [kDestroy] () {
await this.#client.destroy()
[kDestroy] () {
return this.#client.destroy()
}
}
@@ -93465,54 +93717,55 @@ const kAddClient = Symbol('add client')
const kRemoveClient = Symbol('remove client')
class PoolBase extends DispatcherBase {
constructor () {
super()
[kQueue] = new FixedQueue();
this[kQueue] = new FixedQueue()
this[kClients] = []
this[kQueued] = 0
[kQueued] = 0;
const pool = this
[kClients] = [];
this[kOnDrain] = function onDrain (origin, targets) {
const queue = pool[kQueue]
[kNeedDrain] = false;
let needDrain = false
[kOnDrain] (client, origin, targets) {
const queue = this[kQueue]
while (!needDrain) {
const item = queue.shift()
if (!item) {
break
}
pool[kQueued]--
needDrain = !this.dispatch(item.opts, item.handler)
let needDrain = false
while (!needDrain) {
const item = queue.shift()
if (!item) {
break
}
this[kQueued]--
needDrain = !client.dispatch(item.opts, item.handler)
}
this[kNeedDrain] = needDrain
client[kNeedDrain] = needDrain
if (!this[kNeedDrain] && pool[kNeedDrain]) {
pool[kNeedDrain] = false
pool.emit('drain', origin, [pool, ...targets])
}
if (pool[kClosedResolve] && queue.isEmpty()) {
Promise
.all(pool[kClients].map(c => c.close()))
.then(pool[kClosedResolve])
if (!needDrain && this[kNeedDrain]) {
this[kNeedDrain] = false
this.emit('drain', origin, [this, ...targets])
}
if (this[kClosedResolve] && queue.isEmpty()) {
const closeAll = new Array(this[kClients].length)
for (let i = 0; i < this[kClients].length; i++) {
closeAll[i] = this[kClients][i].close()
}
Promise.all(closeAll)
.then(this[kClosedResolve])
}
}
this[kOnConnect] = (origin, targets) => {
pool.emit('connect', origin, [pool, ...targets])
}
[kOnConnect] = (origin, targets) => {
this.emit('connect', origin, [this, ...targets])
};
this[kOnDisconnect] = (origin, targets, err) => {
pool.emit('disconnect', origin, [pool, ...targets], err)
}
[kOnDisconnect] = (origin, targets, err) => {
this.emit('disconnect', origin, [this, ...targets], err)
};
this[kOnConnectionError] = (origin, targets, err) => {
pool.emit('connectionError', origin, [pool, ...targets], err)
}
[kOnConnectionError] = (origin, targets, err) => {
this.emit('connectionError', origin, [this, ...targets], err)
}
get [kBusy] () {
@@ -93520,11 +93773,19 @@ class PoolBase extends DispatcherBase {
}
get [kConnected] () {
return this[kClients].filter(client => client[kConnected]).length
let ret = 0
for (const { [kConnected]: connected } of this[kClients]) {
ret += connected
}
return ret
}
get [kFree] () {
return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length
let ret = 0
for (const { [kConnected]: connected, [kNeedDrain]: needDrain } of this[kClients]) {
ret += connected && !needDrain
}
return ret
}
get [kPending] () {
@@ -93555,17 +93816,21 @@ class PoolBase extends DispatcherBase {
return new PoolStats(this)
}
async [kClose] () {
[kClose] () {
if (this[kQueue].isEmpty()) {
await Promise.all(this[kClients].map(c => c.close()))
const closeAll = new Array(this[kClients].length)
for (let i = 0; i < this[kClients].length; i++) {
closeAll[i] = this[kClients][i].close()
}
return Promise.all(closeAll)
} else {
await new Promise((resolve) => {
return new Promise((resolve) => {
this[kClosedResolve] = resolve
})
}
}
async [kDestroy] (err) {
[kDestroy] (err) {
while (true) {
const item = this[kQueue].shift()
if (!item) {
@@ -93574,7 +93839,11 @@ class PoolBase extends DispatcherBase {
item.handler.onError(err)
}
await Promise.all(this[kClients].map(c => c.destroy(err)))
const destroyAll = new Array(this[kClients].length)
for (let i = 0; i < this[kClients].length; i++) {
destroyAll[i] = this[kClients][i].destroy(err)
}
return Promise.all(destroyAll)
}
[kDispatch] (opts, handler) {
@@ -93594,7 +93863,7 @@ class PoolBase extends DispatcherBase {
[kAddClient] (client) {
client
.on('drain', this[kOnDrain])
.on('drain', this[kOnDrain].bind(this, client))
.on('connect', this[kOnConnect])
.on('disconnect', this[kOnDisconnect])
.on('connectionError', this[kOnConnectionError])
@@ -93604,7 +93873,7 @@ class PoolBase extends DispatcherBase {
if (this[kNeedDrain]) {
queueMicrotask(() => {
if (this[kNeedDrain]) {
this[kOnDrain](client[kUrl], [this, client])
this[kOnDrain](client, client[kUrl], [client, this])
}
})
}
@@ -93697,8 +93966,6 @@ class Pool extends PoolBase {
throw new InvalidArgumentError('connect must be a function or an object')
}
super()
if (typeof connect !== 'function') {
connect = buildConnector({
...tls,
@@ -93711,6 +93978,8 @@ class Pool extends PoolBase {
})
}
super()
this[kConnections] = connections || null
this[kUrl] = util.parseOrigin(origin)
this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl }
@@ -93809,11 +94078,12 @@ class Http1ProxyWrapper extends DispatcherBase {
#client
constructor (proxyUrl, { headers = {}, connect, factory }) {
super()
if (!proxyUrl) {
throw new InvalidArgumentError('Proxy URL is mandatory')
}
super()
this[kProxyHeaders] = headers
if (factory) {
this.#client = factory(proxyUrl, { connect })
@@ -93852,11 +94122,11 @@ class Http1ProxyWrapper extends DispatcherBase {
return this.#client[kDispatch](opts, handler)
}
async [kClose] () {
[kClose] () {
return this.#client.close()
}
async [kDestroy] (err) {
[kDestroy] (err) {
return this.#client.destroy(err)
}
}
@@ -93992,14 +94262,18 @@ class ProxyAgent extends DispatcherBase {
}
}
async [kClose] () {
await this[kAgent].close()
await this[kClient].close()
[kClose] () {
return Promise.all([
this[kAgent].close(),
this[kClient].close()
])
}
async [kDestroy] () {
await this[kAgent].destroy()
await this[kClient].destroy()
[kDestroy] () {
return Promise.all([
this[kAgent].destroy(),
this[kClient].destroy()
])
}
}
@@ -94120,9 +94394,27 @@ function getGlobalDispatcher () {
return globalThis[globalDispatcher]
}
// These are the globals that can be installed by undici.install().
// Not exported by index.js to avoid use outside of this module.
const installedExports = /** @type {const} */ (
[
'fetch',
'Headers',
'Response',
'Request',
'FormData',
'WebSocket',
'CloseEvent',
'ErrorEvent',
'MessageEvent',
'EventSource'
]
)
module.exports = {
setGlobalDispatcher,
getGlobalDispatcher
getGlobalDispatcher,
installedExports
}
@@ -95730,6 +96022,22 @@ function needsRevalidation (result, cacheControlDirectives) {
return false
}
/**
* Check if we're within the stale-while-revalidate window for a stale response
* @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result
* @returns {boolean}
*/
function withinStaleWhileRevalidateWindow (result) {
const staleWhileRevalidate = result.cacheControlDirectives?.['stale-while-revalidate']
if (!staleWhileRevalidate) {
return false
}
const now = Date.now()
const staleWhileRevalidateExpiry = result.staleAt + (staleWhileRevalidate * 1000)
return now <= staleWhileRevalidateExpiry
}
/**
* @param {DispatchFn} dispatch
* @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} globalOpts
@@ -95905,6 +96213,51 @@ function handleResult (
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))
}
// RFC 5861: If we're within stale-while-revalidate window, serve stale immediately
// and revalidate in background
if (withinStaleWhileRevalidateWindow(result)) {
// Serve stale response immediately
sendCachedValue(handler, opts, result, age, null, true)
// Start background revalidation (fire-and-forget)
queueMicrotask(() => {
let headers = {
...opts.headers,
'if-modified-since': new Date(result.cachedAt).toUTCString()
}
if (result.etag) {
headers['if-none-match'] = result.etag
}
if (result.vary) {
headers = {
...headers,
...result.vary
}
}
// Background revalidation - update cache if we get new data
dispatch(
{
...opts,
headers
},
new CacheHandler(globalOpts, cacheKey, {
// Silent handler that just updates the cache
onRequestStart () {},
onRequestUpgrade () {},
onResponseStart () {},
onResponseData () {},
onResponseEnd () {},
onResponseError () {}
})
)
})
return true
}
let withinStaleIfErrorThreshold = false
const staleIfErrorExpiry = result.cacheControlDirectives['stale-if-error'] ?? reqCacheControl?.['stale-if-error']
if (staleIfErrorExpiry) {
@@ -97670,16 +98023,16 @@ const PendingInterceptorsFormatter = __nccwpck_require__(56142)
const { MockCallHistory } = __nccwpck_require__(30431)
class MockAgent extends Dispatcher {
constructor (opts) {
constructor (opts = {}) {
super(opts)
const mockOptions = buildAndValidateMockOptions(opts)
this[kNetConnect] = true
this[kIsMockActive] = true
this[kMockAgentIsCallHistoryEnabled] = mockOptions?.enableCallHistory ?? false
this[kMockAgentAcceptsNonStandardSearchParameters] = mockOptions?.acceptNonStandardSearchParameters ?? false
this[kIgnoreTrailingSlash] = mockOptions?.ignoreTrailingSlash ?? false
this[kMockAgentIsCallHistoryEnabled] = mockOptions.enableCallHistory ?? false
this[kMockAgentAcceptsNonStandardSearchParameters] = mockOptions.acceptNonStandardSearchParameters ?? false
this[kIgnoreTrailingSlash] = mockOptions.ignoreTrailingSlash ?? false
// Instantiate Agent and encapsulate
if (opts?.agent && typeof opts.agent.dispatch !== 'function') {
@@ -98213,6 +98566,8 @@ module.exports = MockClient
const { UndiciError } = __nccwpck_require__(68707)
const kMockNotMatchedError = Symbol.for('undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED')
/**
* The request does not match any registered mock dispatches.
*/
@@ -98223,6 +98578,14 @@ class MockNotMatchedError extends UndiciError {
this.message = message || 'The request does not match any registered mock dispatches'
this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kMockNotMatchedError] === true
}
get [kMockNotMatchedError] () {
return true
}
}
module.exports = {
@@ -98937,7 +99300,7 @@ function buildMockDispatch () {
try {
mockDispatch.call(this, opts, handler)
} catch (error) {
if (error instanceof MockNotMatchedError) {
if (error.code === 'UND_MOCK_ERR_MOCK_NOT_MATCHED') {
const netConnect = agent[kGetNetConnect]()
if (netConnect === false) {
throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`)
@@ -98968,19 +99331,21 @@ function checkNetConnect (netConnect, origin) {
}
function buildAndValidateMockOptions (opts) {
if (opts) {
const { agent, ...mockOptions } = opts
const { agent, ...mockOptions } = opts
if ('enableCallHistory' in mockOptions && typeof mockOptions.enableCallHistory !== '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
if ('enableCallHistory' in mockOptions && typeof mockOptions.enableCallHistory !== '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')
}
if ('ignoreTrailingSlash' in mockOptions && typeof mockOptions.ignoreTrailingSlash !== 'boolean') {
throw new InvalidArgumentError('options.ignoreTrailingSlash must to be a boolean')
}
return mockOptions
}
module.exports = {
@@ -100556,33 +100921,21 @@ module.exports = {
"use strict";
const IMF_DAYS = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
const IMF_SPACES = [4, 7, 11, 16, 25]
const IMF_MONTHS = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec']
const IMF_COLONS = [19, 22]
const ASCTIME_SPACES = [3, 7, 10, 19]
const RFC850_DAYS = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']
/**
* @see https://www.rfc-editor.org/rfc/rfc9110.html#name-date-time-formats
*
* @param {string} date
* @param {Date} [now]
* @returns {Date | undefined}
*/
function parseHttpDate (date, now) {
function parseHttpDate (date) {
// Sun, 06 Nov 1994 08:49:37 GMT ; IMF-fixdate
// Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
// Sunday, 06-Nov-94 08:49:37 GMT ; obsolete RFC 850 format
date = date.toLowerCase()
switch (date[3]) {
case ',': return parseImfDate(date)
case ' ': return parseAscTimeDate(date)
default: return parseRfc850Date(date, now)
default: return parseRfc850Date(date)
}
}
@@ -100593,69 +100946,207 @@ function parseHttpDate (date, now) {
* @returns {Date | undefined}
*/
function parseImfDate (date) {
if (date.length !== 29) {
if (
date.length !== 29 ||
date[4] !== ' ' ||
date[7] !== ' ' ||
date[11] !== ' ' ||
date[16] !== ' ' ||
date[19] !== ':' ||
date[22] !== ':' ||
date[25] !== ' ' ||
date[26] !== 'G' ||
date[27] !== 'M' ||
date[28] !== 'T'
) {
return undefined
}
if (!date.endsWith('gmt')) {
// Unsupported timezone
return undefined
let weekday = -1
if (date[0] === 'S' && date[1] === 'u' && date[2] === 'n') { // Sunday
weekday = 0
} else if (date[0] === 'M' && date[1] === 'o' && date[2] === 'n') { // Monday
weekday = 1
} else if (date[0] === 'T' && date[1] === 'u' && date[2] === 'e') { // Tuesday
weekday = 2
} else if (date[0] === 'W' && date[1] === 'e' && date[2] === 'd') { // Wednesday
weekday = 3
} else if (date[0] === 'T' && date[1] === 'h' && date[2] === 'u') { // Thursday
weekday = 4
} else if (date[0] === 'F' && date[1] === 'r' && date[2] === 'i') { // Friday
weekday = 5
} else if (date[0] === 'S' && date[1] === 'a' && date[2] === 't') { // Saturday
weekday = 6
} else {
return undefined // Not a valid day of the week
}
for (const spaceInx of IMF_SPACES) {
if (date[spaceInx] !== ' ') {
return undefined
let day = 0
if (date[5] === '0') {
// Single digit day, e.g. "Sun Nov 6 08:49:37 1994"
const code = date.charCodeAt(6)
if (code < 49 || code > 57) {
return undefined // Not a digit
}
}
for (const colonIdx of IMF_COLONS) {
if (date[colonIdx] !== ':') {
return undefined
day = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(5)
if (code1 < 49 || code1 > 51) {
return undefined // Not a digit between 1 and 3
}
const code2 = date.charCodeAt(6)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
day = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const dayName = date.substring(0, 3)
if (!IMF_DAYS.includes(dayName)) {
let monthIdx = -1
if (
(date[8] === 'J' && date[9] === 'a' && date[10] === 'n')
) {
monthIdx = 0 // Jan
} else if (
(date[8] === 'F' && date[9] === 'e' && date[10] === 'b')
) {
monthIdx = 1 // Feb
} else if (
(date[8] === 'M' && date[9] === 'a')
) {
if (date[10] === 'r') {
monthIdx = 2 // Mar
} else if (date[10] === 'y') {
monthIdx = 4 // May
} else {
return undefined // Invalid month
}
} else if (
(date[8] === 'J')
) {
if (date[9] === 'a' && date[10] === 'n') {
monthIdx = 0 // Jan
} else if (date[9] === 'u') {
if (date[10] === 'n') {
monthIdx = 5 // Jun
} else if (date[10] === 'l') {
monthIdx = 6 // Jul
} else {
return undefined // Invalid month
}
} else {
return undefined // Invalid month
}
} else if (
(date[8] === 'A')
) {
if (date[9] === 'p' && date[10] === 'r') {
monthIdx = 3 // Apr
} else if (date[9] === 'u' && date[10] === 'g') {
monthIdx = 7 // Aug
} else {
return undefined // Invalid month
}
} else if (
(date[8] === 'S' && date[9] === 'e' && date[10] === 'p')
) {
monthIdx = 8 // Sep
} else if (
(date[8] === 'O' && date[9] === 'c' && date[10] === 't')
) {
monthIdx = 9 // Oct
} else if (
(date[8] === 'N' && date[9] === 'o' && date[10] === 'v')
) {
monthIdx = 10 // Nov
} else if (
(date[8] === 'D' && date[9] === 'e' && date[10] === 'c')
) {
monthIdx = 11 // Dec
} else {
// Not a valid month
return undefined
}
const dayString = date.substring(5, 7)
const day = Number.parseInt(dayString)
if (isNaN(day) || (day < 10 && dayString[0] !== '0')) {
// Not a number, 0, or it's less than 10 and didn't start with a 0
return undefined
const yearDigit1 = date.charCodeAt(12)
if (yearDigit1 < 48 || yearDigit1 > 57) {
return undefined // Not a digit
}
const yearDigit2 = date.charCodeAt(13)
if (yearDigit2 < 48 || yearDigit2 > 57) {
return undefined // Not a digit
}
const yearDigit3 = date.charCodeAt(14)
if (yearDigit3 < 48 || yearDigit3 > 57) {
return undefined // Not a digit
}
const yearDigit4 = date.charCodeAt(15)
if (yearDigit4 < 48 || yearDigit4 > 57) {
return undefined // Not a digit
}
const year = (yearDigit1 - 48) * 1000 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48)
let hour = 0
if (date[17] === '0') {
const code = date.charCodeAt(18)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
hour = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(17)
if (code1 < 48 || code1 > 50) {
return undefined // Not a digit between 0 and 2
}
const code2 = date.charCodeAt(18)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
if (code1 === 50 && code2 > 51) {
return undefined // Hour cannot be greater than 23
}
hour = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const month = date.substring(8, 11)
const monthIdx = IMF_MONTHS.indexOf(month)
if (monthIdx === -1) {
return undefined
let minute = 0
if (date[20] === '0') {
const code = date.charCodeAt(21)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
minute = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(20)
if (code1 < 48 || code1 > 53) {
return undefined // Not a digit between 0 and 5
}
const code2 = date.charCodeAt(21)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
minute = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const year = Number.parseInt(date.substring(12, 16))
if (isNaN(year)) {
return undefined
let second = 0
if (date[23] === '0') {
const code = date.charCodeAt(24)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
second = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(23)
if (code1 < 48 || code1 > 53) {
return undefined // Not a digit between 0 and 5
}
const code2 = date.charCodeAt(24)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
second = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const hourString = date.substring(17, 19)
const hour = Number.parseInt(hourString)
if (isNaN(hour) || (hour < 10 && hourString[0] !== '0')) {
return undefined
}
const minuteString = date.substring(20, 22)
const minute = Number.parseInt(minuteString)
if (isNaN(minute) || (minute < 10 && minuteString[0] !== '0')) {
return undefined
}
const secondString = date.substring(23, 25)
const second = Number.parseInt(secondString)
if (isNaN(second) || (second < 10 && secondString[0] !== '0')) {
return undefined
}
return new Date(Date.UTC(year, monthIdx, day, hour, minute, second))
const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second))
return result.getUTCDay() === weekday ? result : undefined
}
/**
@@ -100667,147 +101158,415 @@ function parseImfDate (date) {
function parseAscTimeDate (date) {
// This is assumed to be in UTC
if (date.length !== 24) {
if (
date.length !== 24 ||
date[7] !== ' ' ||
date[10] !== ' ' ||
date[19] !== ' '
) {
return undefined
}
for (const spaceIdx of ASCTIME_SPACES) {
if (date[spaceIdx] !== ' ') {
return undefined
let weekday = -1
if (date[0] === 'S' && date[1] === 'u' && date[2] === 'n') { // Sunday
weekday = 0
} else if (date[0] === 'M' && date[1] === 'o' && date[2] === 'n') { // Monday
weekday = 1
} else if (date[0] === 'T' && date[1] === 'u' && date[2] === 'e') { // Tuesday
weekday = 2
} else if (date[0] === 'W' && date[1] === 'e' && date[2] === 'd') { // Wednesday
weekday = 3
} else if (date[0] === 'T' && date[1] === 'h' && date[2] === 'u') { // Thursday
weekday = 4
} else if (date[0] === 'F' && date[1] === 'r' && date[2] === 'i') { // Friday
weekday = 5
} else if (date[0] === 'S' && date[1] === 'a' && date[2] === 't') { // Saturday
weekday = 6
} else {
return undefined // Not a valid day of the week
}
let monthIdx = -1
if (
(date[4] === 'J' && date[5] === 'a' && date[6] === 'n')
) {
monthIdx = 0 // Jan
} else if (
(date[4] === 'F' && date[5] === 'e' && date[6] === 'b')
) {
monthIdx = 1 // Feb
} else if (
(date[4] === 'M' && date[5] === 'a')
) {
if (date[6] === 'r') {
monthIdx = 2 // Mar
} else if (date[6] === 'y') {
monthIdx = 4 // May
} else {
return undefined // Invalid month
}
}
const dayName = date.substring(0, 3)
if (!IMF_DAYS.includes(dayName)) {
} else if (
(date[4] === 'J')
) {
if (date[5] === 'a' && date[6] === 'n') {
monthIdx = 0 // Jan
} else if (date[5] === 'u') {
if (date[6] === 'n') {
monthIdx = 5 // Jun
} else if (date[6] === 'l') {
monthIdx = 6 // Jul
} else {
return undefined // Invalid month
}
} else {
return undefined // Invalid month
}
} else if (
(date[4] === 'A')
) {
if (date[5] === 'p' && date[6] === 'r') {
monthIdx = 3 // Apr
} else if (date[5] === 'u' && date[6] === 'g') {
monthIdx = 7 // Aug
} else {
return undefined // Invalid month
}
} else if (
(date[4] === 'S' && date[5] === 'e' && date[6] === 'p')
) {
monthIdx = 8 // Sep
} else if (
(date[4] === 'O' && date[5] === 'c' && date[6] === 't')
) {
monthIdx = 9 // Oct
} else if (
(date[4] === 'N' && date[5] === 'o' && date[6] === 'v')
) {
monthIdx = 10 // Nov
} else if (
(date[4] === 'D' && date[5] === 'e' && date[6] === 'c')
) {
monthIdx = 11 // Dec
} else {
// Not a valid month
return undefined
}
const month = date.substring(4, 7)
const monthIdx = IMF_MONTHS.indexOf(month)
if (monthIdx === -1) {
return undefined
let day = 0
if (date[8] === ' ') {
// Single digit day, e.g. "Sun Nov 6 08:49:37 1994"
const code = date.charCodeAt(9)
if (code < 49 || code > 57) {
return undefined // Not a digit
}
day = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(8)
if (code1 < 49 || code1 > 51) {
return undefined // Not a digit between 1 and 3
}
const code2 = date.charCodeAt(9)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
day = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const dayString = date.substring(8, 10)
const day = Number.parseInt(dayString)
if (isNaN(day) || (day < 10 && dayString[0] !== ' ')) {
return undefined
let hour = 0
if (date[11] === '0') {
const code = date.charCodeAt(12)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
hour = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(11)
if (code1 < 48 || code1 > 50) {
return undefined // Not a digit between 0 and 2
}
const code2 = date.charCodeAt(12)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
if (code1 === 50 && code2 > 51) {
return undefined // Hour cannot be greater than 23
}
hour = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const hourString = date.substring(11, 13)
const hour = Number.parseInt(hourString)
if (isNaN(hour) || (hour < 10 && hourString[0] !== '0')) {
return undefined
let minute = 0
if (date[14] === '0') {
const code = date.charCodeAt(15)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
minute = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(14)
if (code1 < 48 || code1 > 53) {
return undefined // Not a digit between 0 and 5
}
const code2 = date.charCodeAt(15)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
minute = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const minuteString = date.substring(14, 16)
const minute = Number.parseInt(minuteString)
if (isNaN(minute) || (minute < 10 && minuteString[0] !== '0')) {
return undefined
let second = 0
if (date[17] === '0') {
const code = date.charCodeAt(18)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
second = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(17)
if (code1 < 48 || code1 > 53) {
return undefined // Not a digit between 0 and 5
}
const code2 = date.charCodeAt(18)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
second = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const secondString = date.substring(17, 19)
const second = Number.parseInt(secondString)
if (isNaN(second) || (second < 10 && secondString[0] !== '0')) {
return undefined
const yearDigit1 = date.charCodeAt(20)
if (yearDigit1 < 48 || yearDigit1 > 57) {
return undefined // Not a digit
}
const year = Number.parseInt(date.substring(20, 24))
if (isNaN(year)) {
return undefined
const yearDigit2 = date.charCodeAt(21)
if (yearDigit2 < 48 || yearDigit2 > 57) {
return undefined // Not a digit
}
const yearDigit3 = date.charCodeAt(22)
if (yearDigit3 < 48 || yearDigit3 > 57) {
return undefined // Not a digit
}
const yearDigit4 = date.charCodeAt(23)
if (yearDigit4 < 48 || yearDigit4 > 57) {
return undefined // Not a digit
}
const year = (yearDigit1 - 48) * 1000 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48)
return new Date(Date.UTC(year, monthIdx, day, hour, minute, second))
const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second))
return result.getUTCDay() === weekday ? result : undefined
}
/**
* @see https://httpwg.org/specs/rfc9110.html#obsolete.date.formats
*
* @param {string} date
* @param {Date} [now]
* @returns {Date | undefined}
*/
function parseRfc850Date (date, now = new Date()) {
if (!date.endsWith('gmt')) {
// Unsupported timezone
return undefined
}
function parseRfc850Date (date) {
let commaIndex = -1
const commaIndex = date.indexOf(',')
if (commaIndex === -1) {
return undefined
}
if ((date.length - commaIndex - 1) !== 23) {
return undefined
}
const dayName = date.substring(0, commaIndex)
if (!RFC850_DAYS.includes(dayName)) {
let weekday = -1
if (date[0] === 'S') {
if (date[1] === 'u' && date[2] === 'n' && date[3] === 'd' && date[4] === 'a' && date[5] === 'y') {
weekday = 0 // Sunday
commaIndex = 6
} else if (date[1] === 'a' && date[2] === 't' && date[3] === 'u' && date[4] === 'r' && date[5] === 'd' && date[6] === 'a' && date[7] === 'y') {
weekday = 6 // Saturday
commaIndex = 8
}
} else if (date[0] === 'M' && date[1] === 'o' && date[2] === 'n' && date[3] === 'd' && date[4] === 'a' && date[5] === 'y') {
weekday = 1 // Monday
commaIndex = 6
} else if (date[0] === 'T') {
if (date[1] === 'u' && date[2] === 'e' && date[3] === 's' && date[4] === 'd' && date[5] === 'a' && date[6] === 'y') {
weekday = 2 // Tuesday
commaIndex = 7
} else if (date[1] === 'h' && date[2] === 'u' && date[3] === 'r' && date[4] === 's' && date[5] === 'd' && date[6] === 'a' && date[7] === 'y') {
weekday = 4 // Thursday
commaIndex = 8
}
} else if (date[0] === 'W' && date[1] === 'e' && date[2] === 'd' && date[3] === 'n' && date[4] === 'e' && date[5] === 's' && date[6] === 'd' && date[7] === 'a' && date[8] === 'y') {
weekday = 3 // Wednesday
commaIndex = 9
} else if (date[0] === 'F' && date[1] === 'r' && date[2] === 'i' && date[3] === 'd' && date[4] === 'a' && date[5] === 'y') {
weekday = 5 // Friday
commaIndex = 6
} else {
// Not a valid day name
return undefined
}
if (
date[commaIndex] !== ',' ||
(date.length - commaIndex - 1) !== 23 ||
date[commaIndex + 1] !== ' ' ||
date[commaIndex + 4] !== '-' ||
date[commaIndex + 8] !== '-' ||
date[commaIndex + 11] !== ' ' ||
date[commaIndex + 14] !== ':' ||
date[commaIndex + 17] !== ':' ||
date[commaIndex + 20] !== ' '
date[commaIndex + 20] !== ' ' ||
date[commaIndex + 21] !== 'G' ||
date[commaIndex + 22] !== 'M' ||
date[commaIndex + 23] !== 'T'
) {
return undefined
}
const dayString = date.substring(commaIndex + 2, commaIndex + 4)
const day = Number.parseInt(dayString)
if (isNaN(day) || (day < 10 && dayString[0] !== '0')) {
// Not a number, or it's less than 10 and didn't start with a 0
return undefined
}
const month = date.substring(commaIndex + 5, commaIndex + 8)
const monthIdx = IMF_MONTHS.indexOf(month)
if (monthIdx === -1) {
return undefined
}
// As of this point year is just the decade (i.e. 94)
let year = Number.parseInt(date.substring(commaIndex + 9, commaIndex + 11))
if (isNaN(year)) {
return undefined
}
const currentYear = now.getUTCFullYear()
const currentDecade = currentYear % 100
const currentCentury = Math.floor(currentYear / 100)
if (year > currentDecade && year - currentDecade >= 50) {
// Over 50 years in future, go to previous century
year += (currentCentury - 1) * 100
let day = 0
if (date[commaIndex + 2] === '0') {
// Single digit day, e.g. "Sun Nov 6 08:49:37 1994"
const code = date.charCodeAt(commaIndex + 3)
if (code < 49 || code > 57) {
return undefined // Not a digit
}
day = code - 48 // Convert ASCII code to number
} else {
year += currentCentury * 100
const code1 = date.charCodeAt(commaIndex + 2)
if (code1 < 49 || code1 > 51) {
return undefined // Not a digit between 1 and 3
}
const code2 = date.charCodeAt(commaIndex + 3)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
day = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const hourString = date.substring(commaIndex + 12, commaIndex + 14)
const hour = Number.parseInt(hourString)
if (isNaN(hour) || (hour < 10 && hourString[0] !== '0')) {
let monthIdx = -1
if (
(date[commaIndex + 5] === 'J' && date[commaIndex + 6] === 'a' && date[commaIndex + 7] === 'n')
) {
monthIdx = 0 // Jan
} else if (
(date[commaIndex + 5] === 'F' && date[commaIndex + 6] === 'e' && date[commaIndex + 7] === 'b')
) {
monthIdx = 1 // Feb
} else if (
(date[commaIndex + 5] === 'M' && date[commaIndex + 6] === 'a' && date[commaIndex + 7] === 'r')
) {
monthIdx = 2 // Mar
} else if (
(date[commaIndex + 5] === 'A' && date[commaIndex + 6] === 'p' && date[commaIndex + 7] === 'r')
) {
monthIdx = 3 // Apr
} else if (
(date[commaIndex + 5] === 'M' && date[commaIndex + 6] === 'a' && date[commaIndex + 7] === 'y')
) {
monthIdx = 4 // May
} else if (
(date[commaIndex + 5] === 'J' && date[commaIndex + 6] === 'u' && date[commaIndex + 7] === 'n')
) {
monthIdx = 5 // Jun
} else if (
(date[commaIndex + 5] === 'J' && date[commaIndex + 6] === 'u' && date[commaIndex + 7] === 'l')
) {
monthIdx = 6 // Jul
} else if (
(date[commaIndex + 5] === 'A' && date[commaIndex + 6] === 'u' && date[commaIndex + 7] === 'g')
) {
monthIdx = 7 // Aug
} else if (
(date[commaIndex + 5] === 'S' && date[commaIndex + 6] === 'e' && date[commaIndex + 7] === 'p')
) {
monthIdx = 8 // Sep
} else if (
(date[commaIndex + 5] === 'O' && date[commaIndex + 6] === 'c' && date[commaIndex + 7] === 't')
) {
monthIdx = 9 // Oct
} else if (
(date[commaIndex + 5] === 'N' && date[commaIndex + 6] === 'o' && date[commaIndex + 7] === 'v')
) {
monthIdx = 10 // Nov
} else if (
(date[commaIndex + 5] === 'D' && date[commaIndex + 6] === 'e' && date[commaIndex + 7] === 'c')
) {
monthIdx = 11 // Dec
} else {
// Not a valid month
return undefined
}
const minuteString = date.substring(commaIndex + 15, commaIndex + 17)
const minute = Number.parseInt(minuteString)
if (isNaN(minute) || (minute < 10 && minuteString[0] !== '0')) {
return undefined
const yearDigit1 = date.charCodeAt(commaIndex + 9)
if (yearDigit1 < 48 || yearDigit1 > 57) {
return undefined // Not a digit
}
const yearDigit2 = date.charCodeAt(commaIndex + 10)
if (yearDigit2 < 48 || yearDigit2 > 57) {
return undefined // Not a digit
}
const secondString = date.substring(commaIndex + 18, commaIndex + 20)
const second = Number.parseInt(secondString)
if (isNaN(second) || (second < 10 && secondString[0] !== '0')) {
return undefined
let year = (yearDigit1 - 48) * 10 + (yearDigit2 - 48) // Convert ASCII codes to number
// RFC 6265 states that the year is in the range 1970-2069.
// @see https://datatracker.ietf.org/doc/html/rfc6265#section-5.1.1
//
// 3. If the year-value is greater than or equal to 70 and less than or
// equal to 99, increment the year-value by 1900.
// 4. If the year-value is greater than or equal to 0 and less than or
// equal to 69, increment the year-value by 2000.
year += year < 70 ? 2000 : 1900
let hour = 0
if (date[commaIndex + 12] === '0') {
const code = date.charCodeAt(commaIndex + 13)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
hour = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(commaIndex + 12)
if (code1 < 48 || code1 > 50) {
return undefined // Not a digit between 0 and 2
}
const code2 = date.charCodeAt(commaIndex + 13)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
if (code1 === 50 && code2 > 51) {
return undefined // Hour cannot be greater than 23
}
hour = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
return new Date(Date.UTC(year, monthIdx, day, hour, minute, second))
let minute = 0
if (date[commaIndex + 15] === '0') {
const code = date.charCodeAt(commaIndex + 16)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
minute = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(commaIndex + 15)
if (code1 < 48 || code1 > 53) {
return undefined // Not a digit between 0 and 5
}
const code2 = date.charCodeAt(commaIndex + 16)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
minute = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
let second = 0
if (date[commaIndex + 18] === '0') {
const code = date.charCodeAt(commaIndex + 19)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
second = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(commaIndex + 18)
if (code1 < 48 || code1 > 53) {
return undefined // Not a digit between 0 and 5
}
const code2 = date.charCodeAt(commaIndex + 19)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
second = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second))
return result.getUTCDay() === weekday ? result : undefined
}
module.exports = {
@@ -102623,7 +103382,7 @@ webidl.converters.Cookie = webidl.dictionaryConverter([
{
converter: webidl.sequenceConverter(webidl.converters.DOMString),
key: 'unparsed',
defaultValue: () => new Array(0)
defaultValue: () => []
}
])
@@ -103500,7 +104259,7 @@ class EventSourceStream extends Transform {
this.buffer = this.buffer.subarray(this.pos + 1)
this.pos = 0
if (
this.event.data !== undefined || this.event.event || this.event.id || this.event.retry) {
this.event.data !== undefined || this.event.event || this.event.id !== undefined || this.event.retry) {
this.processEvent(this.event)
}
this.clearEvent()
@@ -103631,7 +104390,7 @@ class EventSourceStream extends Transform {
this.state.reconnectionTime = parseInt(event.retry, 10)
}
if (event.id && isValidLastEventId(event.id)) {
if (event.id !== undefined && isValidLastEventId(event.id)) {
this.state.lastEventId = event.id
}
@@ -103679,7 +104438,6 @@ const { EventSourceStream } = __nccwpck_require__(24031)
const { parseMIMEType } = __nccwpck_require__(51900)
const { createFastMessageEvent } = __nccwpck_require__(15188)
const { isNetworkError } = __nccwpck_require__(99051)
const { delay } = __nccwpck_require__(94811)
const { kEnumerableProperty } = __nccwpck_require__(3440)
const { environmentSettingsObject } = __nccwpck_require__(73168)
@@ -103989,9 +104747,9 @@ class EventSource extends EventTarget {
/**
* @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model
* @returns {Promise<void>}
* @returns {void}
*/
async #reconnect () {
#reconnect () {
// When a user agent is to reestablish the connection, the user agent must
// run the following steps. These steps are run in parallel, not as part of
// a task. (The tasks that it queues, of course, are run like normal tasks
@@ -104009,27 +104767,27 @@ class EventSource extends EventTarget {
this.dispatchEvent(new Event('error'))
// 2. Wait a delay equal to the reconnection time of the event source.
await delay(this.#state.reconnectionTime)
setTimeout(() => {
// 5. Queue a task to run the following steps:
// 5. Queue a task to run the following steps:
// 1. If the EventSource object's readyState attribute is not set to
// CONNECTING, then return.
if (this.#readyState !== CONNECTING) return
// 1. If the EventSource object's readyState attribute is not set to
// CONNECTING, then return.
if (this.#readyState !== CONNECTING) return
// 2. Let request be the EventSource object's request.
// 3. If the EventSource object's last event ID string is not the empty
// string, then:
// 1. Let lastEventIDValue be the EventSource object's last event ID
// string, encoded as UTF-8.
// 2. Set (`Last-Event-ID`, lastEventIDValue) in request's header
// list.
if (this.#state.lastEventId.length) {
this.#request.headersList.set('last-event-id', this.#state.lastEventId, true)
}
// 2. Let request be the EventSource object's request.
// 3. If the EventSource object's last event ID string is not the empty
// string, then:
// 1. Let lastEventIDValue be the EventSource object's last event ID
// string, encoded as UTF-8.
// 2. Set (`Last-Event-ID`, lastEventIDValue) in request's header
// list.
if (this.#state.lastEventId.length) {
this.#request.headersList.set('last-event-id', this.#state.lastEventId, true)
}
// 4. Fetch request and process the response obtained in this fashion, if any, as described earlier in this section.
this.#connect()
// 4. Fetch request and process the response obtained in this fashion, if any, as described earlier in this section.
this.#connect()
}, this.#state.reconnectionTime)?.unref()
}
/**
@@ -104054,9 +104812,11 @@ class EventSource extends EventTarget {
this.removeEventListener('open', this.#events.open)
}
if (typeof fn === 'function') {
const listener = webidl.converters.EventHandlerNonNull(fn)
if (listener !== null) {
this.addEventListener('open', listener)
this.#events.open = fn
this.addEventListener('open', fn)
} else {
this.#events.open = null
}
@@ -104071,9 +104831,11 @@ class EventSource extends EventTarget {
this.removeEventListener('message', this.#events.message)
}
if (typeof fn === 'function') {
const listener = webidl.converters.EventHandlerNonNull(fn)
if (listener !== null) {
this.addEventListener('message', listener)
this.#events.message = fn
this.addEventListener('message', fn)
} else {
this.#events.message = null
}
@@ -104088,9 +104850,11 @@ class EventSource extends EventTarget {
this.removeEventListener('error', this.#events.error)
}
if (typeof fn === 'function') {
const listener = webidl.converters.EventHandlerNonNull(fn)
if (listener !== null) {
this.addEventListener('error', listener)
this.#events.error = fn
this.addEventListener('error', fn)
} else {
this.#events.error = null
}
@@ -104198,17 +104962,9 @@ function isASCIINumber (value) {
return true
}
// https://github.com/nodejs/undici/issues/2664
function delay (ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms)
})
}
module.exports = {
isValidLastEventId,
isASCIINumber,
delay
isASCIINumber
}
@@ -104280,7 +105036,7 @@ function extractBody (object, keepalive = false) {
// 4. Otherwise, set stream to a new ReadableStream object, and set
// up stream with byte reading support.
stream = new ReadableStream({
async pull (controller) {
pull (controller) {
const buffer = typeof source === 'string' ? textEncoder.encode(source) : source
if (buffer.byteLength) {
@@ -104330,16 +105086,10 @@ function extractBody (object, keepalive = false) {
// Set type to `application/x-www-form-urlencoded;charset=UTF-8`.
type = 'application/x-www-form-urlencoded;charset=UTF-8'
} else if (isArrayBuffer(object)) {
// BufferSource/ArrayBuffer
// Set source to a copy of the bytes held by object.
source = new Uint8Array(object.slice())
} else if (ArrayBuffer.isView(object)) {
// BufferSource/ArrayBufferView
// Set source to a copy of the bytes held by object.
source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength))
} else if (webidl.is.BufferSource(object)) {
source = isArrayBuffer(object)
? new Uint8Array(object.slice())
: new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength))
} else if (webidl.is.FormData(object)) {
const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, '0')}`
const prefix = `--${boundary}\r\nContent-Disposition: form-data`
@@ -104540,12 +105290,6 @@ function cloneBody (body) {
}
}
function throwIfAborted (state) {
if (state.aborted) {
throw new DOMException('The operation was aborted.', 'AbortError')
}
}
function bodyMixinMethods (instance, getInternalState) {
const methods = {
blob () {
@@ -104663,24 +105407,30 @@ function mixinBody (prototype, getInternalState) {
* @param {any} instance
* @param {(target: any) => any} getInternalState
*/
async function consumeBody (object, convertBytesToJSValue, instance, getInternalState) {
webidl.brandCheck(object, instance)
function consumeBody (object, convertBytesToJSValue, instance, getInternalState) {
try {
webidl.brandCheck(object, instance)
} catch (e) {
return Promise.reject(e)
}
const state = getInternalState(object)
// 1. If object is unusable, then return a promise rejected
// with a TypeError.
if (bodyUnusable(state)) {
throw new TypeError('Body is unusable: Body has already been read')
return Promise.reject(new TypeError('Body is unusable: Body has already been read'))
}
throwIfAborted(state)
if (state.aborted) {
return Promise.reject(new DOMException('The operation was aborted.', 'AbortError'))
}
// 2. Let promise be a new promise.
const promise = createDeferredPromise()
// 3. Let errorSteps given error be to reject promise with error.
const errorSteps = (error) => promise.reject(error)
const errorSteps = promise.reject
// 4. Let successSteps given a byte sequence data be to resolve
// promise with the result of running convertBytesToJSValue
@@ -107273,6 +108023,9 @@ const { webidl } = __nccwpck_require__(47879)
const { STATUS_CODES } = __nccwpck_require__(37067)
const { bytesMatch } = __nccwpck_require__(45082)
const { createDeferredPromise } = __nccwpck_require__(56436)
const hasZstd = typeof zlib.createZstdDecompress === 'function'
const GET_OR_HEAD = ['GET', 'HEAD']
const defaultUserAgent = typeof __UNDICI_IS_NODE__ !== 'undefined' || typeof esbuildDetection !== 'undefined'
@@ -109314,33 +110067,29 @@ async function httpNetworkFetch (
return false
}
/** @type {string[]} */
let codings = []
const headersList = new HeadersList()
for (let i = 0; i < rawHeaders.length; i += 2) {
headersList.append(bufferToLowerCasedHeaderName(rawHeaders[i]), rawHeaders[i + 1].toString('latin1'), true)
}
const contentEncoding = headersList.get('content-encoding', true)
if (contentEncoding) {
// https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1
// "All content-coding values are case-insensitive..."
codings = contentEncoding.toLowerCase().split(',').map((x) => x.trim())
}
const location = headersList.get('location', true)
this.body = new Readable({ read: resume })
const decoders = []
const willFollow = location && request.redirect === 'follow' &&
redirectStatusSet.has(status)
const decoders = []
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding
if (codings.length !== 0 && request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) {
if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) {
// https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1
const contentEncoding = headersList.get('content-encoding', true)
// "All content-coding values are case-insensitive..."
/** @type {string[]} */
const codings = contentEncoding ? contentEncoding.toLowerCase().split(',') : []
for (let i = codings.length - 1; i >= 0; --i) {
const coding = codings[i]
const coding = codings[i].trim()
// https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2
if (coding === 'x-gzip' || coding === 'gzip') {
decoders.push(zlib.createGunzip({
@@ -109361,8 +110110,8 @@ async function httpNetworkFetch (
flush: 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
} else if (coding === 'zstd' && hasZstd) {
// 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
@@ -110616,8 +111365,6 @@ const { URLSerializer } = __nccwpck_require__(51900)
const { kConstruct } = __nccwpck_require__(36443)
const assert = __nccwpck_require__(34589)
const { isArrayBuffer } = nodeUtil.types
const textEncoder = new TextEncoder('utf-8')
// https://fetch.spec.whatwg.org/#response-class
@@ -110713,7 +111460,7 @@ class Response {
}
if (body !== null) {
body = webidl.converters.BodyInit(body)
body = webidl.converters.BodyInit(body, 'Response', 'body')
}
init = webidl.converters.ResponseInit(init)
@@ -111173,7 +111920,7 @@ webidl.converters.XMLHttpRequestBodyInit = function (V, prefix, name) {
return V
}
if (ArrayBuffer.isView(V) || isArrayBuffer(V)) {
if (webidl.is.BufferSource(V)) {
return V
}
@@ -111745,8 +112492,8 @@ function determineRequestsReferrer (request) {
if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {
return 'no-referrer'
}
// 2. Return referrerOrigin
return referrerOrigin
// 2. Return referrerURL.
return referrerURL
}
}
}
@@ -111797,17 +112544,11 @@ function stripURLForReferrer (url, originOnly = false) {
return url
}
const potentialleTrustworthyIPv4RegExp = new RegExp('^(?:' +
'(?:127\\.)' +
'(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){2}' +
'(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])' +
')$')
const isPotentialleTrustworthyIPv4 = RegExp.prototype.test
.bind(/^127\.(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){2}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)$/)
const potentialleTrustworthyIPv6RegExp = new RegExp('^(?:' +
'(?:(?:0{1,4}):){7}(?:(?:0{0,3}1))|' +
'(?:(?:0{1,4}):){1,6}(?::(?:0{0,3}1))|' +
'(?:::(?:0{0,3}1))|' +
')$')
const isPotentiallyTrustworthyIPv6 = RegExp.prototype.test
.bind(/^(?:(?:0{1,4}:){7}|(?:0{1,4}:){1,6}:|::)0{0,3}1$/)
/**
* Check if host matches one of the CIDR notations 127.0.0.0/8 or ::1/128.
@@ -111822,11 +112563,11 @@ function isOriginIPPotentiallyTrustworthy (origin) {
if (origin[0] === '[' && origin[origin.length - 1] === ']') {
origin = origin.slice(1, -1)
}
return potentialleTrustworthyIPv6RegExp.test(origin)
return isPotentiallyTrustworthyIPv6(origin)
}
// IPv4
return potentialleTrustworthyIPv4RegExp.test(origin)
return isPotentialleTrustworthyIPv4(origin)
}
/**
@@ -113289,7 +114030,7 @@ webidl.util.TypeValueToString = function (o) {
webidl.util.markAsUncloneable = markAsUncloneable || (() => {})
// https://webidl.spec.whatwg.org/#abstract-opdef-converttoint
webidl.util.ConvertToInt = function (V, bitLength, signedness, opts) {
webidl.util.ConvertToInt = function (V, bitLength, signedness, flags) {
let upperBound
let lowerBound
@@ -113333,7 +114074,7 @@ webidl.util.ConvertToInt = function (V, bitLength, signedness, opts) {
// 6. If the conversion is to an IDL type associated
// with the [EnforceRange] extended attribute, then:
if (opts?.enforceRange === true) {
if (webidl.util.HasFlag(flags, webidl.attributes.EnforceRange)) {
// 1. If x is NaN, +∞, or −∞, then throw a TypeError.
if (
Number.isNaN(x) ||
@@ -113365,7 +114106,7 @@ webidl.util.ConvertToInt = function (V, bitLength, signedness, opts) {
// 7. If x is not NaN and the conversion is to an IDL
// type associated with the [Clamp] extended
// attribute, then:
if (!Number.isNaN(x) && opts?.clamp === true) {
if (!Number.isNaN(x) && webidl.util.HasFlag(flags, webidl.attributes.Clamp)) {
// 1. Set x to min(max(x, lowerBound), upperBound).
x = Math.min(Math.max(x, lowerBound), upperBound)
@@ -113439,6 +114180,25 @@ webidl.util.Stringify = function (V) {
}
}
webidl.util.IsResizableArrayBuffer = function (V) {
if (types.isArrayBuffer(V)) {
return V.resizable
}
if (types.isSharedArrayBuffer(V)) {
return V.growable
}
throw webidl.errors.exception({
header: 'IsResizableArrayBuffer',
message: `"${webidl.util.Stringify(V)}" is not an array buffer.`
})
}
webidl.util.HasFlag = function (flags, attributes) {
return typeof flags === 'number' && (flags & attributes) === attributes
}
// https://webidl.spec.whatwg.org/#es-sequence
webidl.sequenceConverter = function (converter) {
return (V, prefix, argument, Iterable) => {
@@ -113643,13 +114403,20 @@ webidl.is.URL = webidl.util.MakeTypeAssertion(URL)
webidl.is.AbortSignal = webidl.util.MakeTypeAssertion(AbortSignal)
webidl.is.MessagePort = webidl.util.MakeTypeAssertion(MessagePort)
webidl.is.BufferSource = function (V) {
return types.isArrayBuffer(V) || (
ArrayBuffer.isView(V) &&
types.isArrayBuffer(V.buffer)
)
}
// https://webidl.spec.whatwg.org/#es-DOMString
webidl.converters.DOMString = function (V, prefix, argument, opts) {
webidl.converters.DOMString = function (V, prefix, argument, flags) {
// 1. If V is null and the conversion is to an IDL type
// associated with the [LegacyNullToEmptyString]
// extended attribute, then return the DOMString value
// that represents the empty string.
if (V === null && opts?.legacyNullToEmptyString) {
if (V === null && webidl.util.HasFlag(flags, webidl.attributes.LegacyNullToEmptyString)) {
return ''
}
@@ -113728,7 +114495,7 @@ webidl.converters.any = function (V) {
// https://webidl.spec.whatwg.org/#es-long-long
webidl.converters['long long'] = function (V, prefix, argument) {
// 1. Let x be ? ConvertToInt(V, 64, "signed").
const x = webidl.util.ConvertToInt(V, 64, 'signed', undefined, prefix, argument)
const x = webidl.util.ConvertToInt(V, 64, 'signed', 0, prefix, argument)
// 2. Return the IDL long long value that represents
// the same numeric value as x.
@@ -113738,7 +114505,7 @@ webidl.converters['long long'] = function (V, prefix, argument) {
// https://webidl.spec.whatwg.org/#es-unsigned-long-long
webidl.converters['unsigned long long'] = function (V, prefix, argument) {
// 1. Let x be ? ConvertToInt(V, 64, "unsigned").
const x = webidl.util.ConvertToInt(V, 64, 'unsigned', undefined, prefix, argument)
const x = webidl.util.ConvertToInt(V, 64, 'unsigned', 0, prefix, argument)
// 2. Return the IDL unsigned long long value that
// represents the same numeric value as x.
@@ -113748,7 +114515,7 @@ webidl.converters['unsigned long long'] = function (V, prefix, argument) {
// https://webidl.spec.whatwg.org/#es-unsigned-long
webidl.converters['unsigned long'] = function (V, prefix, argument) {
// 1. Let x be ? ConvertToInt(V, 32, "unsigned").
const x = webidl.util.ConvertToInt(V, 32, 'unsigned', undefined, prefix, argument)
const x = webidl.util.ConvertToInt(V, 32, 'unsigned', 0, prefix, argument)
// 2. Return the IDL unsigned long value that
// represents the same numeric value as x.
@@ -113756,9 +114523,9 @@ webidl.converters['unsigned long'] = function (V, prefix, argument) {
}
// https://webidl.spec.whatwg.org/#es-unsigned-short
webidl.converters['unsigned short'] = function (V, prefix, argument, opts) {
webidl.converters['unsigned short'] = function (V, prefix, argument, flags) {
// 1. Let x be ? ConvertToInt(V, 16, "unsigned").
const x = webidl.util.ConvertToInt(V, 16, 'unsigned', opts, prefix, argument)
const x = webidl.util.ConvertToInt(V, 16, 'unsigned', flags, prefix, argument)
// 2. Return the IDL unsigned short value that represents
// the same numeric value as x.
@@ -113766,15 +114533,16 @@ webidl.converters['unsigned short'] = function (V, prefix, argument, opts) {
}
// https://webidl.spec.whatwg.org/#idl-ArrayBuffer
webidl.converters.ArrayBuffer = function (V, prefix, argument, opts) {
// 1. If Type(V) is not Object, or V does not have an
webidl.converters.ArrayBuffer = function (V, prefix, argument, flags) {
// 1. If V is not an Object, or V does not have an
// [[ArrayBufferData]] internal slot, then throw a
// TypeError.
// 2. If IsSharedArrayBuffer(V) is true, then throw a
// TypeError.
// see: https://tc39.es/ecma262/#sec-properties-of-the-arraybuffer-instances
// see: https://tc39.es/ecma262/#sec-properties-of-the-sharedarraybuffer-instances
if (
webidl.util.Type(V) !== OBJECT ||
!types.isAnyArrayBuffer(V)
!types.isArrayBuffer(V)
) {
throw webidl.errors.conversionFailed({
prefix,
@@ -113783,25 +114551,14 @@ webidl.converters.ArrayBuffer = function (V, prefix, argument, opts) {
})
}
// 2. If the conversion is not to an IDL type associated
// with the [AllowShared] extended attribute, and
// IsSharedArrayBuffer(V) is true, then throw a
// TypeError.
if (opts?.allowShared === false && types.isSharedArrayBuffer(V)) {
throw webidl.errors.exception({
header: 'ArrayBuffer',
message: 'SharedArrayBuffer is not allowed.'
})
}
// 3. If the conversion is not to an IDL type associated
// with the [AllowResizable] extended attribute, and
// IsResizableArrayBuffer(V) is true, then throw a
// TypeError.
if (V.resizable || V.growable) {
if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V)) {
throw webidl.errors.exception({
header: 'ArrayBuffer',
message: 'Received a resizable ArrayBuffer.'
header: prefix,
message: `${argument} cannot be a resizable ArrayBuffer.`
})
}
@@ -113810,7 +114567,43 @@ webidl.converters.ArrayBuffer = function (V, prefix, argument, opts) {
return V
}
webidl.converters.TypedArray = function (V, T, prefix, name, opts) {
// https://webidl.spec.whatwg.org/#idl-SharedArrayBuffer
webidl.converters.SharedArrayBuffer = function (V, prefix, argument, flags) {
// 1. If V is not an Object, or V does not have an
// [[ArrayBufferData]] internal slot, then throw a
// TypeError.
// 2. If IsSharedArrayBuffer(V) is false, then throw a
// TypeError.
// see: https://tc39.es/ecma262/#sec-properties-of-the-sharedarraybuffer-instances
if (
webidl.util.Type(V) !== OBJECT ||
!types.isSharedArrayBuffer(V)
) {
throw webidl.errors.conversionFailed({
prefix,
argument: `${argument} ("${webidl.util.Stringify(V)}")`,
types: ['SharedArrayBuffer']
})
}
// 3. If the conversion is not to an IDL type associated
// with the [AllowResizable] extended attribute, and
// IsResizableArrayBuffer(V) is true, then throw a
// TypeError.
if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V)) {
throw webidl.errors.exception({
header: prefix,
message: `${argument} cannot be a resizable SharedArrayBuffer.`
})
}
// 4. Return the IDL SharedArrayBuffer value that is a
// reference to the same object as V.
return V
}
// https://webidl.spec.whatwg.org/#dfn-typed-array-type
webidl.converters.TypedArray = function (V, T, prefix, argument, flags) {
// 1. Let T be the IDL type V is being converted to.
// 2. If Type(V) is not Object, or V does not have a
@@ -113823,7 +114616,7 @@ webidl.converters.TypedArray = function (V, T, prefix, name, opts) {
) {
throw webidl.errors.conversionFailed({
prefix,
argument: `${name} ("${webidl.util.Stringify(V)}")`,
argument: `${argument} ("${webidl.util.Stringify(V)}")`,
types: [T.name]
})
}
@@ -113832,10 +114625,10 @@ webidl.converters.TypedArray = function (V, T, prefix, name, opts) {
// with the [AllowShared] extended attribute, and
// IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is
// true, then throw a TypeError.
if (opts?.allowShared === false && types.isSharedArrayBuffer(V.buffer)) {
if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) {
throw webidl.errors.exception({
header: 'ArrayBuffer',
message: 'SharedArrayBuffer is not allowed.'
header: prefix,
message: `${argument} cannot be a view on a shared array buffer.`
})
}
@@ -113843,10 +114636,10 @@ webidl.converters.TypedArray = function (V, T, prefix, name, opts) {
// with the [AllowResizable] extended attribute, and
// IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is
// true, then throw a TypeError.
if (V.buffer.resizable || V.buffer.growable) {
if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) {
throw webidl.errors.exception({
header: 'ArrayBuffer',
message: 'Received a resizable ArrayBuffer.'
header: prefix,
message: `${argument} cannot be a view on a resizable array buffer.`
})
}
@@ -113855,13 +114648,15 @@ webidl.converters.TypedArray = function (V, T, prefix, name, opts) {
return V
}
webidl.converters.DataView = function (V, prefix, name, opts) {
// https://webidl.spec.whatwg.org/#idl-DataView
webidl.converters.DataView = function (V, prefix, argument, flags) {
// 1. If Type(V) is not Object, or V does not have a
// [[DataView]] internal slot, then throw a TypeError.
if (webidl.util.Type(V) !== OBJECT || !types.isDataView(V)) {
throw webidl.errors.exception({
header: prefix,
message: `${name} is not a DataView.`
throw webidl.errors.conversionFailed({
prefix,
argument: `${argument} ("${webidl.util.Stringify(V)}")`,
types: ['DataView']
})
}
@@ -113869,10 +114664,10 @@ webidl.converters.DataView = function (V, prefix, name, opts) {
// with the [AllowShared] extended attribute, and
// IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true,
// then throw a TypeError.
if (opts?.allowShared === false && types.isSharedArrayBuffer(V.buffer)) {
if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) {
throw webidl.errors.exception({
header: 'ArrayBuffer',
message: 'SharedArrayBuffer is not allowed.'
header: prefix,
message: `${argument} cannot be a view on a shared array buffer.`
})
}
@@ -113880,10 +114675,10 @@ webidl.converters.DataView = function (V, prefix, name, opts) {
// with the [AllowResizable] extended attribute, and
// IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is
// true, then throw a TypeError.
if (V.buffer.resizable || V.buffer.growable) {
if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) {
throw webidl.errors.exception({
header: 'ArrayBuffer',
message: 'Received a resizable ArrayBuffer.'
header: prefix,
message: `${argument} cannot be a view on a resizable array buffer.`
})
}
@@ -113892,6 +114687,85 @@ webidl.converters.DataView = function (V, prefix, name, opts) {
return V
}
// https://webidl.spec.whatwg.org/#ArrayBufferView
webidl.converters.ArrayBufferView = function (V, prefix, argument, flags) {
if (
webidl.util.Type(V) !== OBJECT ||
!types.isArrayBufferView(V)
) {
throw webidl.errors.conversionFailed({
prefix,
argument: `${argument} ("${webidl.util.Stringify(V)}")`,
types: ['ArrayBufferView']
})
}
if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) {
throw webidl.errors.exception({
header: prefix,
message: `${argument} cannot be a view on a shared array buffer.`
})
}
if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) {
throw webidl.errors.exception({
header: prefix,
message: `${argument} cannot be a view on a resizable array buffer.`
})
}
return V
}
// https://webidl.spec.whatwg.org/#BufferSource
webidl.converters.BufferSource = function (V, prefix, argument, flags) {
if (types.isArrayBuffer(V)) {
return webidl.converters.ArrayBuffer(V, prefix, argument, flags)
}
if (types.isArrayBufferView(V)) {
flags &= ~webidl.attributes.AllowShared
return webidl.converters.ArrayBufferView(V, prefix, argument, flags)
}
// Make this explicit for easier debugging
if (types.isSharedArrayBuffer(V)) {
throw webidl.errors.exception({
header: prefix,
message: `${argument} cannot be a SharedArrayBuffer.`
})
}
throw webidl.errors.conversionFailed({
prefix,
argument: `${argument} ("${webidl.util.Stringify(V)}")`,
types: ['ArrayBuffer', 'ArrayBufferView']
})
}
// https://webidl.spec.whatwg.org/#AllowSharedBufferSource
webidl.converters.AllowSharedBufferSource = function (V, prefix, argument, flags) {
if (types.isArrayBuffer(V)) {
return webidl.converters.ArrayBuffer(V, prefix, argument, flags)
}
if (types.isSharedArrayBuffer(V)) {
return webidl.converters.SharedArrayBuffer(V, prefix, argument, flags)
}
if (types.isArrayBufferView(V)) {
flags |= webidl.attributes.AllowShared
return webidl.converters.ArrayBufferView(V, prefix, argument, flags)
}
throw webidl.errors.conversionFailed({
prefix,
argument: `${argument} ("${webidl.util.Stringify(V)}")`,
types: ['ArrayBuffer', 'SharedArrayBuffer', 'ArrayBufferView']
})
}
webidl.converters['sequence<ByteString>'] = webidl.sequenceConverter(
webidl.converters.ByteString
)
@@ -113912,6 +114786,34 @@ webidl.converters.AbortSignal = webidl.interfaceConverter(
'AbortSignal'
)
/**
* [LegacyTreatNonObjectAsNull]
* callback EventHandlerNonNull = any (Event event);
* typedef EventHandlerNonNull? EventHandler;
* @param {*} V
*/
webidl.converters.EventHandlerNonNull = function (V) {
if (webidl.util.Type(V) !== OBJECT) {
return null
}
// [I]f the value is not an object, it will be converted to null, and if the value is not callable,
// it will be converted to a callback function value that does nothing when called.
if (typeof V === 'function') {
return V
}
return () => {}
}
webidl.attributes = {
Clamp: 1 << 0,
EnforceRange: 1 << 1,
AllowShared: 1 << 2,
AllowResizable: 1 << 3,
LegacyNullToEmptyString: 1 << 4
}
module.exports = {
webidl
}
@@ -114228,11 +115130,12 @@ function failWebsocketConnection (handler, code, reason, cause) {
handler.controller.abort()
if (handler.socket?.destroyed === false) {
if (!handler.socket) {
// If the connection was not established, we must still emit an 'error' and 'close' events
handler.onSocketClose()
} else if (handler.socket.destroyed === false) {
handler.socket.destroy()
}
handler.onFail(code, reason, cause)
}
module.exports = {
@@ -114656,7 +115559,7 @@ webidl.converters.MessageEventInit = webidl.dictionaryConverter([
{
key: 'ports',
converter: webidl.converters['sequence<MessagePort>'],
defaultValue: () => new Array(0)
defaultValue: () => []
}
])
@@ -115522,7 +116425,28 @@ const { validateCloseCodeAndReason } = __nccwpck_require__(98625)
const { kConstruct } = __nccwpck_require__(36443)
const { kEnumerableProperty } = __nccwpck_require__(3440)
class WebSocketError extends DOMException {
function createInheritableDOMException () {
// https://github.com/nodejs/node/issues/59677
class Test extends DOMException {
get reason () {
return ''
}
}
if (new Test().reason !== undefined) {
return DOMException
}
return new Proxy(DOMException, {
construct (target, args, newTarget) {
const instance = Reflect.construct(target, args, target)
Object.setPrototypeOf(instance, newTarget.prototype)
return instance
}
})
}
class WebSocketError extends createInheritableDOMException() {
#closeCode
#reason
@@ -115614,7 +116538,6 @@ const { states, opcodes, sentCloseFrameState } = __nccwpck_require__(20736)
const { webidl } = __nccwpck_require__(47879)
const { getURLRecord, isValidSubprotocol, isEstablished, utf8Decode } = __nccwpck_require__(98625)
const { establishWebSocketConnection, failWebsocketConnection, closeWebSocketConnection } = __nccwpck_require__(86897)
const { isArrayBuffer } = __nccwpck_require__(73429)
const { channels } = __nccwpck_require__(42414)
const { WebsocketFrameSend } = __nccwpck_require__(3264)
const { ByteParser } = __nccwpck_require__(81652)
@@ -115654,7 +116577,6 @@ class WebSocketStream {
#handler = {
// https://whatpr.org/websockets/48/7b748d3...d5570f3.html#feedback-to-websocket-stream-from-the-protocol
onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions),
onFail: (_code, _reason) => {},
onMessage: (opcode, data) => this.#onMessage(opcode, data),
onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message),
onParserDrain: () => this.#handler.socket.resume(),
@@ -115808,6 +116730,9 @@ class WebSocketStream {
}
#write (chunk) {
// See /websockets/stream/tentative/write.any.html
chunk = webidl.converters.WebSocketStreamWrite(chunk)
// 1. Let promise be a new promise created in stream s relevant realm .
const promise = createDeferredPromise()
@@ -115818,9 +116743,9 @@ class WebSocketStream {
let opcode = null
// 4. If chunk is a BufferSource ,
if (ArrayBuffer.isView(chunk) || isArrayBuffer(chunk)) {
if (webidl.is.BufferSource(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.slice())
// 4.2. Set opcode to a binary frame opcode.
opcode = opcodes.BINARY
@@ -115835,7 +116760,7 @@ class WebSocketStream {
string = webidl.converters.DOMString(chunk)
} catch (e) {
promise.reject(e)
return
return promise.promise
}
// 5.2. Set data to the result of UTF-8 encoding string .
@@ -115858,7 +116783,7 @@ class WebSocketStream {
}
// 6.3. Queue a global task on the WebSocket task source given stream s relevant global object to resolve promise with undefined.
return promise
return promise.promise
}
/** @type {import('../websocket').Handler['onConnectionEstablished']} */
@@ -116084,7 +117009,7 @@ webidl.converters.WebSocketStreamOptions = webidl.dictionaryConverter([
webidl.converters.WebSocketCloseInfo = webidl.dictionaryConverter([
{
key: 'closeCode',
converter: (V) => webidl.converters['unsigned short'](V, { enforceRange: true })
converter: (V) => webidl.converters['unsigned short'](V, webidl.attributes.EnforceRange)
},
{
key: 'reason',
@@ -116093,6 +117018,14 @@ webidl.converters.WebSocketCloseInfo = webidl.dictionaryConverter([
}
])
webidl.converters.WebSocketStreamWrite = function (V) {
if (typeof V === 'string') {
return webidl.converters.USVString(V)
}
return webidl.converters.BufferSource(V)
}
module.exports = { WebSocketStream }
@@ -116478,7 +117411,6 @@ const { channels } = __nccwpck_require__(42414)
/**
* @typedef {object} Handler
* @property {(response: any, extensions?: string[]) => void} onConnectionEstablished
* @property {(code: number, reason: any) => void} onFail
* @property {(opcode: number, data: Buffer) => void} onMessage
* @property {(error: Error) => void} onParserError
* @property {() => void} onParserDrain
@@ -116514,7 +117446,6 @@ class WebSocket extends EventTarget {
/** @type {Handler} */
#handler = {
onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions),
onFail: (code, reason, cause) => this.#onFail(code, reason, cause),
onMessage: (opcode, data) => this.#onMessage(opcode, data),
onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message),
onParserDrain: () => this.#onParserDrain(),
@@ -116645,7 +117576,7 @@ class WebSocket extends EventTarget {
const prefix = 'WebSocket.close'
if (code !== undefined) {
code = webidl.converters['unsigned short'](code, prefix, 'code', { clamp: true })
code = webidl.converters['unsigned short'](code, prefix, 'code', webidl.attributes.Clamp)
}
if (reason !== undefined) {
@@ -116805,9 +117736,11 @@ class WebSocket extends EventTarget {
this.removeEventListener('open', this.#events.open)
}
if (typeof fn === 'function') {
const listener = webidl.converters.EventHandlerNonNull(fn)
if (listener !== null) {
this.addEventListener('open', listener)
this.#events.open = fn
this.addEventListener('open', fn)
} else {
this.#events.open = null
}
@@ -116826,9 +117759,11 @@ class WebSocket extends EventTarget {
this.removeEventListener('error', this.#events.error)
}
if (typeof fn === 'function') {
const listener = webidl.converters.EventHandlerNonNull(fn)
if (listener !== null) {
this.addEventListener('error', listener)
this.#events.error = fn
this.addEventListener('error', fn)
} else {
this.#events.error = null
}
@@ -116847,9 +117782,11 @@ class WebSocket extends EventTarget {
this.removeEventListener('close', this.#events.close)
}
if (typeof fn === 'function') {
const listener = webidl.converters.EventHandlerNonNull(fn)
if (listener !== null) {
this.addEventListener('close', listener)
this.#events.close = fn
this.addEventListener('close', fn)
} else {
this.#events.close = null
}
@@ -116868,9 +117805,11 @@ class WebSocket extends EventTarget {
this.removeEventListener('message', this.#events.message)
}
if (typeof fn === 'function') {
const listener = webidl.converters.EventHandlerNonNull(fn)
if (listener !== null) {
this.addEventListener('message', listener)
this.#events.message = fn
this.addEventListener('message', fn)
} else {
this.#events.message = null
}
@@ -116948,26 +117887,6 @@ class WebSocket extends EventTarget {
}
}
#onFail (code, reason, cause) {
if (reason) {
// TODO: process.nextTick
fireEvent('error', this, (type, init) => new ErrorEvent(type, init), {
error: new Error(reason, cause ? { cause } : undefined),
message: reason
})
}
if (!this.#handler.wasEverConnected) {
this.#handler.readyState = states.CLOSED
// If the WebSocket connection could not be established, it is also said
// that _The WebSocket Connection is Closed_, but not _cleanly_.
fireEvent('close', this, (type, init) => new CloseEvent(type, init), {
wasClean: false, code, reason
})
}
}
#onMessage (type, data) {
// 1. If ready state is not OPEN (1), then return.
if (this.#handler.readyState !== states.OPEN) {
@@ -117028,18 +117947,11 @@ class WebSocket extends EventTarget {
let code = 1005
let reason = ''
const result = this.#parser.closingInfo
const result = this.#parser?.closingInfo
if (result && !result.error) {
code = result.code ?? 1005
reason = result.reason
} else if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {
// If _The WebSocket
// Connection is Closed_ and no Close control frame was received by the
// endpoint (such as could occur if the underlying transport connection
// is lost), _The WebSocket Connection Close Code_ is considered to be
// 1006.
code = 1006
}
// 1. Change the ready state to CLOSED (3).
@@ -117049,7 +117961,18 @@ class WebSocket extends EventTarget {
// connection, or if the WebSocket connection was closed
// after being flagged as full, fire an event named error
// at the WebSocket object.
// TODO
if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {
// If _The WebSocket
// Connection is Closed_ and no Close control frame was received by the
// endpoint (such as could occur if the underlying transport connection
// is lost), _The WebSocket Connection Close Code_ is considered to be
// 1006.
code = 1006
fireEvent('error', this, (type, init) => new ErrorEvent(type, init), {
error: new TypeError(reason)
})
}
// 3. Fire an event named close at the WebSocket object,
// using CloseEvent, with the wasClean attribute
@@ -117158,7 +118081,7 @@ webidl.converters.WebSocketInit = webidl.dictionaryConverter([
{
key: 'protocols',
converter: webidl.converters['DOMString or sequence<DOMString>'],
defaultValue: () => new Array(0)
defaultValue: () => []
},
{
key: 'dispatcher',
@@ -117185,7 +118108,7 @@ webidl.converters.WebSocketSendData = function (V) {
return V
}
if (ArrayBuffer.isView(V) || isArrayBuffer(V)) {
if (webidl.is.BufferSource(V)) {
return V
}
}
@@ -124221,10 +125144,19 @@ exports.STATE_CACHE_MATCHED_KEY = "cache-matched-key";
const CACHE_VERSION = "1";
async function restoreCache() {
const cacheKey = await computeKeys();
core.saveState(exports.STATE_CACHE_KEY, cacheKey);
if (!inputs_1.restoreCache) {
core.info("restore-cache is false. Skipping restore cache step.");
return;
}
let matchedKey;
core.info(`Trying to restore uv cache from GitHub Actions cache with key: ${cacheKey}`);
const cachePaths = [inputs_1.cacheLocalPath];
if (inputs_1.cachePython) {
cachePaths.push(inputs_1.pythonDir);
}
try {
matchedKey = await cache.restoreCache([inputs_1.cacheLocalPath], cacheKey);
matchedKey = await cache.restoreCache(cachePaths, cacheKey);
}
catch (err) {
const message = err.message;
@@ -124232,7 +125164,6 @@ async function restoreCache() {
core.setOutput("cache-hit", false);
return;
}
core.saveState(exports.STATE_CACHE_KEY, cacheKey);
handleMatchResult(matchedKey, cacheKey);
}
async function computeKeys() {
@@ -124251,7 +125182,8 @@ async function computeKeys() {
const pythonVersion = await getPythonVersion();
const platform = await (0, platforms_1.getPlatform)();
const pruned = inputs_1.pruneCache ? "-pruned" : "";
return `setup-uv-${CACHE_VERSION}-${(0, platforms_1.getArch)()}-${platform}-${pythonVersion}${pruned}${cacheDependencyPathHash}${suffix}`;
const python = inputs_1.cachePython ? "-py" : "";
return `setup-uv-${CACHE_VERSION}-${(0, platforms_1.getArch)()}-${platform}-${pythonVersion}${pruned}${python}${cacheDependencyPathHash}${suffix}`;
}
async function getPythonVersion() {
if (inputs_1.pythonVersion !== "") {
@@ -124393,6 +125325,242 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.KNOWN_CHECKSUMS = void 0;
// AUTOGENERATED_DO_NOT_EDIT
exports.KNOWN_CHECKSUMS = {
"aarch64-apple-darwin-0.9.2": "90b1e69da3d04772565dd556ae8e72c86bdb7da85a8dfc2c6b50c400b0e6aa97",
"aarch64-pc-windows-msvc-0.9.2": "b28ae90188f00c6d9e6f32fe252ace25a3698eeca1458d435ac1ca55049607ff",
"aarch64-unknown-linux-gnu-0.9.2": "0f0ecf2abcb50f8fb5d2b52c8095af4c133897086e3f2e0259f4fcb3d8ddf273",
"aarch64-unknown-linux-musl-0.9.2": "1456894c855d38a56d541b201abae306780d8494c3a3497aff2815abd3eba12f",
"arm-unknown-linux-musleabihf-0.9.2": "f6a969f0506b4d9e1d73d223243457825a2544ef9cd8dabc0a8e7e7bea697a62",
"armv7-unknown-linux-gnueabihf-0.9.2": "93bbf2c8612174548822086487eef982bb19d95b569d3df83328cff6f5bf7660",
"armv7-unknown-linux-musleabihf-0.9.2": "0f96d45eb4edfff26faaac58d9d5761b3f2628519557534e6969ec2777f35984",
"i686-pc-windows-msvc-0.9.2": "f0cc299f9cfd9850d30f073794cda9523ac7fa2b90de3d1ed47e3fdcbda69ab6",
"i686-unknown-linux-gnu-0.9.2": "5623618c4a99694b24eb3388577495873847ccae716c0827fdb03035ddd4d441",
"i686-unknown-linux-musl-0.9.2": "c9d60b1e09611e3b36d91d5b520687ac15d765fe2a06a47dae068c6ebf23ada1",
"powerpc64-unknown-linux-gnu-0.9.2": "d2c92ae4df26b4f62181b3e8840f85f5a9474cfac707f0f8fdbef03f573836ae",
"powerpc64le-unknown-linux-gnu-0.9.2": "216e11a9001d7985990b0c4b6efd734b27e5e96222f9815d23c6fc8a5a406718",
"riscv64gc-unknown-linux-gnu-0.9.2": "3fdbc9dc623a992c39ea4c126d4ebe1f78dc2013e9056f2ec93f42b0deb154eb",
"s390x-unknown-linux-gnu-0.9.2": "4e4aa34554891bcfb92d50fc2067e99cbbc5bec473ce4b8e3dedad0d42017c85",
"x86_64-apple-darwin-0.9.2": "c887d2c4f629eee99b80a347880870f3bc77f7746db81923efe520f609f80857",
"x86_64-pc-windows-msvc-0.9.2": "ba61d01b7470b282e09e7c82a053472723c2a737fb3d137bd0f111e420cc1d9f",
"x86_64-unknown-linux-gnu-0.9.2": "b775bb84c72210c6c0b9670cfaad0ac2e3953f12a2947d52b57603b4fbae3798",
"x86_64-unknown-linux-musl-0.9.2": "42e4ac8e9dab04d560a9d44be2091cae994d14653238e779177c026e0dbf5779",
"aarch64-apple-darwin-0.9.1": "cc84b5c86fbde176c0e1908abd65cec6e989ff755b6e68a912652beb1311de31",
"aarch64-pc-windows-msvc-0.9.1": "862e0fef8e68f229c99ce05de70a712221bc552403f480379d03f5b05a6886fe",
"aarch64-unknown-linux-gnu-0.9.1": "450cf31a80cf1335b0169b82310ea589e51b12711ca84b1f5b322b87d26b16c5",
"aarch64-unknown-linux-musl-0.9.1": "a171e7335fc2e05767fe0d151db5a6af7d1ba93debfc8c91721763eff457d0a3",
"arm-unknown-linux-musleabihf-0.9.1": "cc290a14f3ffa286b8c5a437f50d5c9bb76e1d27f3d51dd701b0487e62987ea0",
"armv7-unknown-linux-gnueabihf-0.9.1": "1f0d511f7776deaf40bae03102020f939c96c3d12eec741edf81f581546d2232",
"armv7-unknown-linux-musleabihf-0.9.1": "790728d01dd0d252e3151b57b5a716f84d851d0802962144ea822118ae61b2f6",
"i686-pc-windows-msvc-0.9.1": "8880c92097c5410c3bbad5e72cf7d38b57523ed374bcd7462d309b9a11b6df33",
"i686-unknown-linux-gnu-0.9.1": "4eccf96c57c30edf6c11477351f536b1a6191d13854c8ffa6d8eee58637d82e6",
"i686-unknown-linux-musl-0.9.1": "9763ef30957011ce61c56117ef3078c40960c7521c9ee7cbb3ce8aed5b6207a4",
"powerpc64-unknown-linux-gnu-0.9.1": "4a0965091073115314f9fc935cfa3eed43c3f46a48dfa370583a019b052a950c",
"powerpc64le-unknown-linux-gnu-0.9.1": "cd9e06feaccd26dce79fd6930afbe1210edf69b4181304b4c7143871e8fadbe2",
"riscv64gc-unknown-linux-gnu-0.9.1": "394edca0f59b6cf31ee6e3d252442e1e2708483265199d390ac1fc4161f97510",
"s390x-unknown-linux-gnu-0.9.1": "8f4eedabfe57cf1d3ef29633be444ad9fd1c1ce9db89450a548e50ac88436cf0",
"x86_64-apple-darwin-0.9.1": "df530fc06d2fd51ed2efeb75b1ea5eeb77a631eb945efe5f9d90ef5969cd3672",
"x86_64-pc-windows-msvc-0.9.1": "8dba20107ebcd38f3a8e4acfeb7b209d594e112a3be8d1cea69fe6d501a69fdf",
"x86_64-unknown-linux-gnu-0.9.1": "da55e00c6399a34a47c1f10973d8618b425a530e149836305bcca7ff68d955ff",
"x86_64-unknown-linux-musl-0.9.1": "104bbd393104f09f84db474310b0fc0327c5f6566bd903c9a9cac00d137208b7",
"aarch64-apple-darwin-0.9.0": "136e70984e3fd359f4119ef445bfd67d6e0d50f15400226ef8db7b738ebef6d0",
"aarch64-pc-windows-msvc-0.9.0": "a816625eae0117c8ca0cd618716ddc11c68522d1ecfa7d2738f1c670099fef10",
"aarch64-unknown-linux-gnu-0.9.0": "ca410766024d2d726c937bda2e9441823e2848894ac5a2f8b608902384fc391f",
"aarch64-unknown-linux-musl-0.9.0": "041d8f56ffe82cbbc0f63f187f4e1935ac8b32531cf071bf5fa7abcb0441b147",
"arm-unknown-linux-musleabihf-0.9.0": "ec1ec28a7cc584a8a06632b717f89747fa8b8ba58277ad68c8f289aaeac35a0d",
"armv7-unknown-linux-gnueabihf-0.9.0": "3063c9adb4786ed49d699de9cf24c721ff2cb96bd2bb39465cab3e42d4e4efcc",
"armv7-unknown-linux-musleabihf-0.9.0": "b425603d3ef20c579b94681a587eaa3f8a2198a86473c7cd5f687a93f8a0fdb0",
"i686-pc-windows-msvc-0.9.0": "fd1dc1c9f7f9bc66186188894e24864e3def2232e1de0d49416037161932bdd7",
"i686-unknown-linux-gnu-0.9.0": "02f4b4070af6e0c591d676543b97f7f5d2c0ebf5b1d01d9e116391289f44afc0",
"i686-unknown-linux-musl-0.9.0": "41fc684a948ec2ff9255b484e11b99a0b504a4fc19d466b549e51b690a6325d5",
"powerpc64-unknown-linux-gnu-0.9.0": "122b9216414a8a89b0a716dd7bf5995d03cded62747deef68dacca6a9839f96f",
"powerpc64le-unknown-linux-gnu-0.9.0": "affbf883bfe4ae0204943b7d936fc2269e806a2534d65da0e75da713ac71ce4e",
"riscv64gc-unknown-linux-gnu-0.9.0": "86c9596204fecdacf038f498553a7e8be81aabebe430a1eb08f8ae8215610b10",
"s390x-unknown-linux-gnu-0.9.0": "8f41968e5eceda304d9cd70d83a9dc7e205e221c651572862b74845d045203ee",
"x86_64-apple-darwin-0.9.0": "8fce2fe15b227ca38c706acda7cf0ebc43d5ec4be537f1badd58d5e938c7ed89",
"x86_64-pc-windows-msvc-0.9.0": "4bad2c47dafb52ad774072fb7a260e5c9f3dbf73441658db1128eb2aec5818eb",
"x86_64-unknown-linux-gnu-0.9.0": "4dadaa5ff5009ccd6a0a43f6ccfa32bf36ed2eff18df7011275a9b1d81950e7b",
"x86_64-unknown-linux-musl-0.9.0": "8b045dceb6f13f2ce36285c72ed2d6a51241aea9da5636637c020bcecea205c8",
"aarch64-apple-darwin-0.8.24": "5f0d9d14b17ba3f0af4602a7a5a2e4faececf0a9463736cf8e6269c49569b2fa",
"aarch64-pc-windows-msvc-0.8.24": "349e5f26ea4db6459578db210bb8d676e5b2acc13962877637a95f3e951a6899",
"aarch64-unknown-linux-gnu-0.8.24": "9526f8b0eddd13f5162c18df5ecf35c21e4f96567d21849750356b60121882df",
"aarch64-unknown-linux-musl-0.8.24": "2b8f7383b19d408c680a74a6dbd41c70976516922234eb0075fd2de67413cf29",
"arm-unknown-linux-musleabihf-0.8.24": "e25ead24c0809fd81c67b72a30c81f2e76eff0d702d341c468326e3e374559f5",
"armv7-unknown-linux-gnueabihf-0.8.24": "3c0d984f55bcde6c16c8b4b749d2249b6a61125418dd6b333f249d846e759c71",
"armv7-unknown-linux-musleabihf-0.8.24": "3e980197c242f36cf93cba0ebdad8f772ebf442ee856ba694daab624affab146",
"i686-pc-windows-msvc-0.8.24": "7a8b3cdd8c02a662a19c426fbae99809d83dbedf172e52d30ba4c266ccd9a8b9",
"i686-unknown-linux-gnu-0.8.24": "7957fbdc4538d706440173d14e91b6a2098b95701654125ebc2d05824aa233e6",
"i686-unknown-linux-musl-0.8.24": "1a2b59dddc206106fb19a66dd665bfe85411281ace07825ba60988a00e230afd",
"powerpc64-unknown-linux-gnu-0.8.24": "22dfcf44c1e8b273640e13aa41c72856654da650d58e0b39d1143dbdb4ee7997",
"powerpc64le-unknown-linux-gnu-0.8.24": "0e757a7109aecbe5b6759470164d466e2a2a234808d84095e6db52a13a62f399",
"riscv64gc-unknown-linux-gnu-0.8.24": "45342e4477dfde1f1d50a8c223706377ddb861cf5c4e1a323a936401472ed2da",
"s390x-unknown-linux-gnu-0.8.24": "8167af20bf336179f5ffb96421d38cc7cb5d54dfa9b90820154cffbb456032de",
"x86_64-apple-darwin-0.8.24": "b75ccf924654ad168efac2ec6934704b3d6b9cbff1650b35e17fa3d26d2bea1f",
"x86_64-pc-windows-msvc-0.8.24": "5055be7909a844f703c54e8846d14ab676c34be6ea0d969ee74c5747feaedda0",
"x86_64-unknown-linux-gnu-0.8.24": "db8179fffd97b7557b9a519bae82eaa4f499b02ef546f738a35e74e26c47e6b7",
"x86_64-unknown-linux-musl-0.8.24": "b38ce629a8653a6b444b7c1bff2d8b99bdafd274e66a4900c5838051e3d99d26",
"aarch64-apple-darwin-0.8.23": "e9128449ea08a3c953f0e08dabc78c7588361a898e6bd8163e7e8f8c96adeb66",
"aarch64-pc-windows-msvc-0.8.23": "b4720ff1e3dcab3f41ce8135ae6c87d27682428088ce9e9b6802f2645e189a9e",
"aarch64-unknown-linux-gnu-0.8.23": "503d1df80abe76c1f30264de817c9c847ff5fa457d4085517aecde1f5749ed66",
"aarch64-unknown-linux-musl-0.8.23": "d745f61cdd3a845da6484785995bc6d19ceb3117dc3fa609bd304ecbedb87fea",
"arm-unknown-linux-musleabihf-0.8.23": "55fd7161d526080dc07fec87aed63734cf18a20f4ef2fa9b870dd99cfb4e1b07",
"armv7-unknown-linux-gnueabihf-0.8.23": "160e9522965702a31bfcb86ee28318f7d83f3ffdf330739670703fa0a85ce012",
"armv7-unknown-linux-musleabihf-0.8.23": "8cc14b0b7b5118a13c80d9245f0aa540c2596c757d7cbfab622b4f798ce90dd5",
"i686-pc-windows-msvc-0.8.23": "9ca7cc83d6730762bb811ec96aff9c95c5c9a131d4305229348df61bbfc9241a",
"i686-unknown-linux-gnu-0.8.23": "bd578dc12e1170bf14cecd17b343e308edaaee5b44f0cb066076366353567856",
"i686-unknown-linux-musl-0.8.23": "3237b711f1c313b328be0d42395319a2ffdab5f67cd2338fbf77155b6bf425f5",
"powerpc64-unknown-linux-gnu-0.8.23": "92f30e2adc8c4ec75b8dc85a82df7b74a617346c7748c41cb4672a61e42791d6",
"powerpc64le-unknown-linux-gnu-0.8.23": "b3f9b147022053b792fd82f7722b527323378c5130a227b7ec667c08b600d1be",
"riscv64gc-unknown-linux-gnu-0.8.23": "a4925b51f0810e44075d336c3fa5b7534c086111dce0d0d9d92a2e2270aea0a8",
"s390x-unknown-linux-gnu-0.8.23": "6bafdbed0e750930a2af123e3cf8b782228aef88d24bf25dc6b0f280bc8ad461",
"x86_64-apple-darwin-0.8.23": "bbb1db369de63d85334e2c43bb925fce63261cefa8c1a8569a6bd4c520f03c0d",
"x86_64-pc-windows-msvc-0.8.23": "454c727fe05ec3763cae9436bb409a6bc5156e9c8ee55a09218191faf8c32445",
"x86_64-unknown-linux-gnu-0.8.23": "b8d378bf1cbdefa6fd18570c3d5e7ea85066f75549cf3840212f505ed37522ed",
"x86_64-unknown-linux-musl-0.8.23": "598f7939cae516de105075d55eb20d906787de307a0011904e301346a13de2ff",
"aarch64-apple-darwin-0.8.22": "3f61099e261e449527141dbf125629fab33ad696468c8c90cebbac40185a306c",
"aarch64-pc-windows-msvc-0.8.22": "dbb3a5bd06d20c9ab8bb9a79c7c4fb5832ca1c7ba5f231a020bc92e5a3c6dcf4",
"aarch64-unknown-linux-gnu-0.8.22": "726b72a137fda33565143325f7d31c42cd30ff9ccdf067e00d124d37b4081cb2",
"aarch64-unknown-linux-musl-0.8.22": "3cb3c891f56891f0027f0287980014930b18875c9396c1d8a19d607b0a6049d9",
"arm-unknown-linux-musleabihf-0.8.22": "78c4898abb5285cbcb53bc2544d93158a705bf2024393d203b7df89406ffd5d7",
"armv7-unknown-linux-gnueabihf-0.8.22": "96f7e526b7cac851f4448ca773ee82216d3d8564161486f5c0ab0d84418cc3bc",
"armv7-unknown-linux-musleabihf-0.8.22": "763bd2b60642c68e2d2d5ce43f741fe9cdb77b6fa771cd8b45971e4a380411d7",
"i686-pc-windows-msvc-0.8.22": "e84c697e29afc76223e020edb3786acebed34779a9cc2ab88e570ff93d69a617",
"i686-unknown-linux-gnu-0.8.22": "f6cfe03095b9cafdbf530cf228803e9ec329511d45e5901e3baa355f96ba37f3",
"i686-unknown-linux-musl-0.8.22": "6ea34f5e656ee0f2085436513e9b6a2caeae7ff14d14871f177a7797f79db20e",
"powerpc64-unknown-linux-gnu-0.8.22": "87b1f9b6452540d1b3e3286e9209fcae39a692c323544c10f6b4f096bfc04673",
"powerpc64le-unknown-linux-gnu-0.8.22": "2f639a402031e62dabd6ca534635d73b26e8b72afeb063f8abc9abc6ba97a8e3",
"riscv64gc-unknown-linux-gnu-0.8.22": "75c83abe161c6e673f7d21e46cd27df539081a9ccf74e4d053e90ba8d2d715e0",
"s390x-unknown-linux-gnu-0.8.22": "a0f671106b8b4c128aad3b52becc34691d7669c3d40bbd5a18df2c60b4d67971",
"x86_64-apple-darwin-0.8.22": "76638fdcfa91357858771551a1c88de1f7c3b270b33ab1866f8a0618d9e442d8",
"x86_64-pc-windows-msvc-0.8.22": "5049375aa2a5162f132b2c1cb992e25d42d47d934cab8c174dbe6f60973dcc12",
"x86_64-unknown-linux-gnu-0.8.22": "741ff1f5742c5a4a25d2f829e8395355e43f7a5ae2ebc6368e9ae2df0efb69cf",
"x86_64-unknown-linux-musl-0.8.22": "06b891ef144bd8390fecb150838f0ff8a34ccaeecf9d744d97945d02ec7389c0",
"aarch64-apple-darwin-0.8.21": "51a10a0ba94139911266779e61296b07fffc98eedf3d8f6e206f86375ac7fb31",
"aarch64-pc-windows-msvc-0.8.21": "ad60ed2fd2c95957c55041d2e61146f0f41aedc7afe87f3f79a8648802713fb5",
"aarch64-unknown-linux-gnu-0.8.21": "5ebc05755ee1688434993d3bf346b6fbdbcbd2f17f1a8339f175e76af18de50c",
"aarch64-unknown-linux-musl-0.8.21": "2afeee16b09d40cbe4de445fe82e1ecc00ed51dd8e118ed7800ca537ee4cf0c2",
"arm-unknown-linux-musleabihf-0.8.21": "f45daacdd988284b011137ba017e5b151252922eec52b457d50770f0cde18387",
"armv7-unknown-linux-gnueabihf-0.8.21": "f6b5fa5a6cfad7fd9fa80c11b24cef18acb8d99c137a6144a4bb1c50dbfb5b1b",
"armv7-unknown-linux-musleabihf-0.8.21": "d53ad3c1c5b549654c2da6f9369df7a68b961f18fcaf847cb8242dc48fe17e20",
"i686-pc-windows-msvc-0.8.21": "8ee8cd0cc5d49a9e3c6f176bdc9d09ece03144dbc0914c20b27e67ff72c0570e",
"i686-unknown-linux-gnu-0.8.21": "327ef2b81967cb2e8407255d3580dd67ddf15fdb18fd3d6e945dc13f76462b0c",
"i686-unknown-linux-musl-0.8.21": "18b7a77c37155ea15166a3a212e69b53f0e6b8d1d399b87c1b3ac4cc646e9b4f",
"powerpc64-unknown-linux-gnu-0.8.21": "1fae8052ce8a9663438ba332f930062b14621adb395eff2950928d7cf8323d16",
"powerpc64le-unknown-linux-gnu-0.8.21": "cca5f83f59251fced9056ecf8ae90e89a83252dda1eb53eab96a76e484776e0d",
"riscv64gc-unknown-linux-gnu-0.8.21": "485f2654720d9fca3c85b147e837f0dc32bb869113bde58e979fc76f0c37547e",
"s390x-unknown-linux-gnu-0.8.21": "5757570db02d2ed3ef5742a1a484b921e716d8412daf45e85c4c79c0a75bf0c1",
"x86_64-apple-darwin-0.8.21": "df0fae941f83f796ea8100958f5d31a185dacc34777f346019123b6cb5571101",
"x86_64-pc-windows-msvc-0.8.21": "ed4f66aacea41026675bca18699958cda13112c77ef5eff3a2f3d376bd1f9177",
"x86_64-unknown-linux-gnu-0.8.21": "166bfa522cc836a3b68bdcef78e40b263ea62f12bb80a8d9c6fda4ce5f2a3994",
"x86_64-unknown-linux-musl-0.8.21": "ff6f6ffca9a026cc99bc43df46e70e33df09bcb544b43e8ef97a5176dd68b516",
"aarch64-apple-darwin-0.8.20": "a87008d013efd78d94102e5268a24990c409bfb39b80df4de32d1c97f093e7ef",
"aarch64-pc-windows-msvc-0.8.20": "ac33f921e0d48d14a106a6cc84b146da7a1f4a3c329c7fb0e1a8e6ff4cf541e6",
"aarch64-unknown-linux-gnu-0.8.20": "b434851cd94e9e2083bc9a5851f1d13748771726bd2ac30027f820fc134b2104",
"aarch64-unknown-linux-musl-0.8.20": "60ad9b7fb846c2051e0113077b1e9510b4b1a73b9a1816a03e82406deedff08d",
"arm-unknown-linux-musleabihf-0.8.20": "72fa919115f5a7c4557c1adb55ac77154f3fb0272b95ff0270d4eaf98bc814c2",
"armv7-unknown-linux-gnueabihf-0.8.20": "87a993df182a2abb5581421d6c76b0cbccb311cfca625d8c827f2cfcf1c78fed",
"armv7-unknown-linux-musleabihf-0.8.20": "3a3c1b2370824f3129c89bf3def5b2b703813152cf0be0ec3c04dead21077cd0",
"i686-pc-windows-msvc-0.8.20": "62fd821f330f469cce6e02eded6f63ba51a9461acc9e0e16794e05da08fe16be",
"i686-unknown-linux-gnu-0.8.20": "a7bfa2c07183f2fd44ef4d6c910971796a980ebb3c52e9620e6b741cc6fe45c0",
"i686-unknown-linux-musl-0.8.20": "67eec91d7ca5a8dc8d95149be52bcf459efb4caeacbacf8586f371f8192a0ec7",
"powerpc64-unknown-linux-gnu-0.8.20": "b96d6a4907ab4c26d7061e43f6993aa47c76a01af6f3cb871d9c48b7b250fbca",
"powerpc64le-unknown-linux-gnu-0.8.20": "1c13fbcd13214e93300749cb14cb5c1425d6a4095f2e406a80b34ab10d269b5b",
"riscv64gc-unknown-linux-gnu-0.8.20": "a14f8297bae6dc3993a9367e0fcf6061281f5f3f0da7c46a6a2a5fd47467f56c",
"s390x-unknown-linux-gnu-0.8.20": "8e59db8d1cb791897237982e369fea0217a12ffe3527cf6f1d30fea32d20a509",
"x86_64-apple-darwin-0.8.20": "ec47686e5e1499b9ea53aa61181fa3f08d4113bc7628105dc299c092d4debf44",
"x86_64-pc-windows-msvc-0.8.20": "e2aa89b78f0a0fa7cbf9d42508c7a962bda803425d8ec3e9cf7a69fb00cf6791",
"x86_64-unknown-linux-gnu-0.8.20": "dc67aa1a5b6b16a8cc4a5fdf5697f354fbf9e45f77a3da6d9e71db6ec213c082",
"x86_64-unknown-linux-musl-0.8.20": "a29e1854ee3ce1ccc5ba1d27783c4f34e99605e16c886a71446a90bad40a38c9",
"aarch64-apple-darwin-0.8.19": "bb63d43c40a301d889a985223ee8ce540be199e98b3f27ed8477823869a0a605",
"aarch64-pc-windows-msvc-0.8.19": "3bfe2db4bccf95e05d2685bcbfad7e49e7cd2177a20aebe81a5e5348cbdfc0a3",
"aarch64-unknown-linux-gnu-0.8.19": "ffd29feed13cdd30b27def8e80e64223325fbe4f7cfc4d4c906ec2531f746bde",
"aarch64-unknown-linux-musl-0.8.19": "87925376fa1e59de23582e1cbd81d6aabd16611e871ad085e09be2c2fa12689d",
"arm-unknown-linux-musleabihf-0.8.19": "00d4835ba20e2e4a3bfed6fe4f6fbf4982c5a0e6a3105c7bde93fb9377e61dea",
"armv7-unknown-linux-gnueabihf-0.8.19": "7a58efdb9c6e3f320759f9f074306e34f03ccfb535b306cbace92e9ad414efd5",
"armv7-unknown-linux-musleabihf-0.8.19": "c8f8a244009f3ad01b23772c936c5c5a95871a87b0add90b85a55d3913d1fae0",
"i686-pc-windows-msvc-0.8.19": "32c7176e49f5fa1c7480b32e325a631431212904b1020427e62afef46fddddb9",
"i686-unknown-linux-gnu-0.8.19": "94a5f944d1cba4db2e7fc6831bf9c78c291c5c1e5e079b4095e9fcdcbc15bc71",
"i686-unknown-linux-musl-0.8.19": "491b282b50e078fac4ced99e69359ac6cecc3f43f585f812d52515e6b081261a",
"powerpc64-unknown-linux-gnu-0.8.19": "3c7c7ecb8d5b61acee3914984f1025af1707a987a51285aba44d968420139f2c",
"powerpc64le-unknown-linux-gnu-0.8.19": "711e39050b528b0860d868c98057eebbd181befbe6a6f24e0f6fd571eab5520f",
"riscv64gc-unknown-linux-gnu-0.8.19": "5dd8e1ec8bf8722e08d9853953ed0ef12318d0f5e82d06a8dd98815666f99186",
"s390x-unknown-linux-gnu-0.8.19": "5b3af341a39364f147d7286e40f55dd92ac8a142110e29ff1b4825afb96e1b27",
"x86_64-apple-darwin-0.8.19": "b5f91770e55761b32c9618757ef23ded6671bb9ca0ddf5737eea60dddd493fe9",
"x86_64-pc-windows-msvc-0.8.19": "945b07182de7de279ba5ae5c746785dfd55cf9b17481d3535b0b03efd6e64567",
"x86_64-unknown-linux-gnu-0.8.19": "cfc674e9b83d1becfca4d70386e5f7ace4c1fa8c47c518abeebb8ef2b30da4b8",
"x86_64-unknown-linux-musl-0.8.19": "6a37f712ae90c7b8cf364fe751144d7acc2479d6b336378111e74cc7fb14fa7b",
"aarch64-apple-darwin-0.8.18": "ce660d5cdf0ed83d1a045bbe9792b93d06725b8c9e9b88960a503d42192be445",
"aarch64-pc-windows-msvc-0.8.18": "f49a25f1a89c76d750e2179f40f9302310504f40c89283ca4522b13363c7bdc9",
"aarch64-unknown-linux-gnu-0.8.18": "164363f88618f4e8e175faf9fcf5172321c221fce93d64cec8e9ab3339511dad",
"aarch64-unknown-linux-musl-0.8.18": "1d7e3bfc3b5ec9d747bc3f42a6a3362249f30560966512b172e8967b11046144",
"arm-unknown-linux-musleabihf-0.8.18": "3c356156c074eb21f731116501992aa6ad6079231f37c75ea7a15c22d1c41cf6",
"armv7-unknown-linux-gnueabihf-0.8.18": "15e12cfba5fb7b20b4eb45887b78fe157d29bd28b38bbc03a19224ad6766a641",
"armv7-unknown-linux-musleabihf-0.8.18": "008cd8225fd8b6b4bb3293d1d7520023f8e432141f256320c034dc5a1a15c7ab",
"i686-pc-windows-msvc-0.8.18": "55f0d91f766ca141e166fe74b8a81da667b5d703ca1b5f2671677f0b2bfdd901",
"i686-unknown-linux-gnu-0.8.18": "3b42e3b58650cde6fa0d03dfdb8528573cf679ac9809191b3976913cdec13b6f",
"i686-unknown-linux-musl-0.8.18": "e2dae897955f666eb2f83af12d9a566bc42c26c17413d1480124cef6b30dc0fd",
"powerpc64-unknown-linux-gnu-0.8.18": "88cd4ad593e6dd915c69dee02b56cbf1b6d16cb7c8129a5ad1fa8ac02bd755ab",
"powerpc64le-unknown-linux-gnu-0.8.18": "50b418096f4d82df5d22cb23e650754ca92bca7be657113dcd53631f0e0cec77",
"riscv64gc-unknown-linux-gnu-0.8.18": "b696be9a2ef0808f230227477b8e23acedba0b90933978c760ea2a748e8c30fa",
"s390x-unknown-linux-gnu-0.8.18": "3b106572a8574f58e3df591cdaef915bdb38fdff11e5de0ec53bfe1b857267e8",
"x86_64-apple-darwin-0.8.18": "a08c3a6c50f49e68216ac133bd0aaae952db2cd8d19a3cd5be782f8f4becf135",
"x86_64-pc-windows-msvc-0.8.18": "3e42d63c8323839d50b11959ec558ad3954a2c16aab1ad52c0521bd055442a3f",
"x86_64-unknown-linux-gnu-0.8.18": "59ad1a1809fa47019b86cf339fff161cb7b00ad3d8d42354eea57d0d91aeb44c",
"x86_64-unknown-linux-musl-0.8.18": "3a93bc3597ab73c9c31d8ad709b4d0b788961cbb508c5a4dcf21636fd7e3e8ce",
"aarch64-apple-darwin-0.8.17": "e4d4859d7726298daa4c12e114f269ff282b2cfc2b415dc0b2ca44ae2dbd358e",
"aarch64-pc-windows-msvc-0.8.17": "2396749de576e45a40efa35fe94b3f953c3224c21f75c05772593e085d78e77d",
"aarch64-unknown-linux-gnu-0.8.17": "9a20d65b110770bbaa2ee89ed76eb963d8c6a480b9ebef584ea9df2ae85b4f0f",
"aarch64-unknown-linux-musl-0.8.17": "bd141b7e263935d14f5725f2a5c1c942fd89642e37683cb904f1984ce7e365f4",
"arm-unknown-linux-musleabihf-0.8.17": "9d4ffb6751d65a52f8daf3fd88e331ab989d490a6e336d6a96cac668fce17a65",
"armv7-unknown-linux-gnueabihf-0.8.17": "014afffa5621986aefbe8a6d71597eb45b8cd3d4e94f825f34ec49ba4cd0c382",
"armv7-unknown-linux-musleabihf-0.8.17": "fb976e7482c4550f38c51c5c23b9dae0322c3173f56436bf9a81252e4b74fcfb",
"i686-pc-windows-msvc-0.8.17": "f528893452ca512b555b63267292977d237bd6fbdd967c9be6941a65ebf256f4",
"i686-unknown-linux-gnu-0.8.17": "d52438a1588ea7c2332dc4aa8c93eedae344fc435c95491037237c7b4b36eae4",
"i686-unknown-linux-musl-0.8.17": "9e10f4c57034e6e98dea48b0f4250a7eff983f1b2947d99ed6605a4eb0ec8d22",
"loongarch64-unknown-linux-gnu-0.8.17": "1d02e45dbbcbbaa867afe59fd62b294cba47abf1a76e151e19db03b5dbf1c9c8",
"powerpc64-unknown-linux-gnu-0.8.17": "6f448735dfd72e2d5c3e3bb541b388c58cdfcf3a562128d5ac1a5f2be47f95d6",
"powerpc64le-unknown-linux-gnu-0.8.17": "e4b28cab21eb990e2bea768bc9f43b61e4fd554552cea8868c855027decef69d",
"riscv64gc-unknown-linux-gnu-0.8.17": "f653caa34479d405d290b825a2fe782bb26c55a7bfaa870911b4e18792312d45",
"s390x-unknown-linux-gnu-0.8.17": "8fae8182704b4b11316c87d897c3e64f2d3f55ac8c58c482d9bbef9ad611f90c",
"x86_64-apple-darwin-0.8.17": "31ed353cfd8e6c962e7c60617bd8a9d6b97b704c1ecb5b5eceaff8c6121b54ac",
"x86_64-pc-windows-msvc-0.8.17": "0d051779fbcb173b183efeae1c3e96148764fd82709bbbf0966df3efe48b67c5",
"x86_64-unknown-linux-gnu-0.8.17": "920cbcaad514cc185634f6f0dcd71df5e8f4ee4456d440a22e0f8c0f142a8203",
"x86_64-unknown-linux-musl-0.8.17": "4057052999a210fe78d93599d2165da9e24c8bbb23370cdd26b66a98ab479203",
"aarch64-apple-darwin-0.8.16": "87e4b51b735e8445f6c445c7b4c0398273e40d34cd192bad8158736653600cd6",
"aarch64-pc-windows-msvc-0.8.16": "392acca957d8d7cccafbb68ce6c4ba29b2ff00c8b0d4744a2136918d3a7bf765",
"aarch64-unknown-linux-gnu-0.8.16": "22a3cbaf87776b73c2657ba5d63f8565c1235b65eaf57dffda66061f7a09913b",
"aarch64-unknown-linux-musl-0.8.16": "6bd6a11c384f07353c3c7eec9bde094f89b92a12dc09caea9df40c424afebea5",
"arm-unknown-linux-musleabihf-0.8.16": "53c31a6559dc4fb22ce8c56640b00a8404b7e4d55f68b6bb3aa188864e2c3084",
"armv7-unknown-linux-gnueabihf-0.8.16": "ada6f393d5e5d9cba5445832ba61e8222859e915e5d77a37f5dd35979f3f18e4",
"armv7-unknown-linux-musleabihf-0.8.16": "55690f70f9c61963c0069558e205acda9ff0604a44028226b9a0ec3b847c9125",
"i686-pc-windows-msvc-0.8.16": "1e727b8af6c0781bc6eb9a2c34e7ee704070b7a2f122544443418e8be13019ee",
"i686-unknown-linux-gnu-0.8.16": "4eaf39134663ef184f684be6f6aa83e971fb36ef7d1c67a5f2196268b61c0579",
"i686-unknown-linux-musl-0.8.16": "a179ceba9f2fcca7b46a86b12715e28fb3429ff8193ae839700d534e35e95a45",
"loongarch64-unknown-linux-gnu-0.8.16": "600a8be6d2621d654b6665d9a8df9370f4af9c0b6ceb851d1ae0d4b895e8e546",
"powerpc64-unknown-linux-gnu-0.8.16": "c86008ef8a3e3730b0e58a168542331960c90a3b043e3853c1941457748595f3",
"powerpc64le-unknown-linux-gnu-0.8.16": "91645092447a14c23b47d0f434a787a9555b29e061607d9e60d2d556b831f5aa",
"riscv64gc-unknown-linux-gnu-0.8.16": "dbaeff3f0baad73c264c35abd937a231fb6b9d1201b6763d82e39e7516358115",
"s390x-unknown-linux-gnu-0.8.16": "e29c330a8956c13acb0f2af7aa650dd5d9ebba6aefdceaea77f689953d140780",
"x86_64-apple-darwin-0.8.16": "07491a998fd741090501df9bbfe538f85568901a3a66c9e0368636509158727a",
"x86_64-pc-windows-msvc-0.8.16": "97fb93678eca3b4f731ea3879ae2e78787976e03f38c9c6fb744ab28bc3aec1b",
"x86_64-unknown-linux-gnu-0.8.16": "fc94e50e8ef93a97d723b83faa42888e7710c4443a5b8a1af3aac2cda5390f3a",
"x86_64-unknown-linux-musl-0.8.16": "ee220f112b91b23f641d169ba7a3652c6ab7104e7c666d26104ebd6a2f76be43",
"aarch64-apple-darwin-0.8.15": "103367962c5cb00bf7370d84cbaa3fec5a9807be9cc833ea9d8eea400c119fa2",
"aarch64-pc-windows-msvc-0.8.15": "16d92f21508c5dbd3374466c2cdad2909959a6d3bd06672b9db023f2a5d7a014",
"aarch64-unknown-linux-gnu-0.8.15": "6ede0fefa7db7be3d5d9eda8784a8e43b1cf5410720eb3da60ab1d2f66678e82",
"aarch64-unknown-linux-musl-0.8.15": "23ea21a05c62c4c307ce691f29bff2f15c94c4f07f2b83d9b356f0664bc8b3a2",
"arm-unknown-linux-musleabihf-0.8.15": "deeac755224244b535c9f654b29aad8a165c94840a520d41e5c697235edd0576",
"armv7-unknown-linux-gnueabihf-0.8.15": "07ad33bc28ed276944d069eb714322b24167bfe106b4bded01e272fe245934ba",
"armv7-unknown-linux-musleabihf-0.8.15": "0b4f73e084a04828f2431c887c2e3eea590ff06a1dc279e473dd1d94cdc8f25d",
"i686-pc-windows-msvc-0.8.15": "34425e7dc7323b98fc844d9223596e9a1d2347e6f85a512221428a455dcbea78",
"i686-unknown-linux-gnu-0.8.15": "16230e9b785fccb628e920d0fa1ca59b50b0515b838b2bb80f997bcb7a35f2bb",
"i686-unknown-linux-musl-0.8.15": "43d554953beac56a8d8ba23aeb2b0e0e5c43020b074071c15df5d492e46a81f3",
"powerpc64-unknown-linux-gnu-0.8.15": "71465b1d08e0a4cb3fcfe02e127104400a85ed00c30ec5f53f8705e71567fb6a",
"powerpc64le-unknown-linux-gnu-0.8.15": "54157ee5e01b02b8c89131391d62228787750b556bbdb7d3428a3cdfd1698102",
"riscv64gc-unknown-linux-gnu-0.8.15": "faa4a470a26ad0db0dbefc510fac91fa0da4d9cd06ca4f229933f7aac21e46b2",
"s390x-unknown-linux-gnu-0.8.15": "0bb022274375745352a748b8332bb170941fe01915a1670c2c6d06d182783437",
"x86_64-apple-darwin-0.8.15": "2bbef70982e97dfc36454de173f35ec1a5e83ae11e3885df6a50db3fd76171cb",
"x86_64-pc-windows-msvc-0.8.15": "459d95892a5cc5c21779532f4f41b9238594b79e312a5142da2148ecfa10e705",
"x86_64-unknown-linux-gnu-0.8.15": "be9878e9d08ebcb621a683aba52e7fb8bbf92b2532e0d759026ffcc067673042",
"x86_64-unknown-linux-musl-0.8.15": "d0fec58f3124e05e0a1af0f6541abfce4333253cdaf23c7b6bb2e6128bf138ea",
"aarch64-apple-darwin-0.8.14": "281ea18a5778099f7edeee0a7b20671d14918782de153604c939486f2b8a2791",
"aarch64-pc-windows-msvc-0.8.14": "d7fef1d1d0b0f8e0aa94391376fe5fb95f0e213ef7ee1c498c287fe0ea76f886",
"aarch64-unknown-linux-gnu-0.8.14": "69616218470b2ad053617efb9e7027b1518ea38918d933c2791e113d99cec507",
@@ -127961,17 +129129,17 @@ function tryGetFromToolCache(arch, version) {
const installedPath = tc.find(constants_1.TOOL_CACHE_NAME, resolvedVersion, arch);
return { installedPath, version: resolvedVersion };
}
async function downloadVersionFromGithub(serverUrl, platform, arch, version, checkSum, githubToken) {
async function downloadVersionFromGithub(platform, arch, version, checkSum, githubToken) {
const artifact = `uv-${arch}-${platform}`;
const extension = getExtension(platform);
const downloadUrl = `${serverUrl}/${constants_1.OWNER}/${constants_1.REPO}/releases/download/${version}/${artifact}${extension}`;
const downloadUrl = `https://github.com/${constants_1.OWNER}/${constants_1.REPO}/releases/download/${version}/${artifact}${extension}`;
return await downloadVersion(downloadUrl, artifact, platform, arch, version, checkSum, githubToken);
}
async function downloadVersionFromManifest(manifestUrl, platform, arch, version, checkSum, githubToken) {
const downloadUrl = await (0, version_manifest_1.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 downloadVersionFromGithub(platform, arch, version, checkSum, githubToken);
}
return await downloadVersion(downloadUrl, `uv-${arch}-${platform}`, platform, arch, version, checkSum, githubToken);
}
@@ -128000,20 +129168,29 @@ function getExtension(platform) {
async function resolveVersion(versionInput, manifestFile, githubToken) {
core.debug(`Resolving version: ${versionInput}`);
let version;
const isSimpleMinimumVersionSpecifier = versionInput.includes(">") && !versionInput.includes(",");
if (isSimpleMinimumVersionSpecifier) {
core.info("Found minimum version specifier, using latest version");
}
if (manifestFile) {
version =
versionInput === "latest"
versionInput === "latest" || isSimpleMinimumVersionSpecifier
? await (0, version_manifest_1.getLatestKnownVersion)(manifestFile)
: versionInput;
}
else {
version =
versionInput === "latest"
versionInput === "latest" || isSimpleMinimumVersionSpecifier
? await getLatestVersion(githubToken)
: versionInput;
}
if (tc.isExplicitVersion(version)) {
core.debug(`Version ${version} is an explicit version.`);
if (isSimpleMinimumVersionSpecifier) {
if (!pep440.satisfies(version, versionInput)) {
throw new Error(`No version found for ${versionInput}`);
}
}
return version;
}
const availableVersions = await getAvailableVersions(githubToken);
@@ -128341,6 +129518,8 @@ const core = __importStar(__nccwpck_require__(37484));
const exec = __importStar(__nccwpck_require__(95236));
const restore_cache_1 = __nccwpck_require__(95391);
const download_version_1 = __nccwpck_require__(28255);
const config_file_1 = __nccwpck_require__(27846);
const constants_1 = __nccwpck_require__(56156);
const inputs_1 = __nccwpck_require__(9612);
const platforms_1 = __nccwpck_require__(98361);
const resolve_1 = __nccwpck_require__(36772);
@@ -128359,11 +129538,13 @@ async function run() {
addToolBinToPath();
addUvToPathAndOutput(setupResult.uvDir);
setToolDir();
addPythonDirToPath();
setupPython();
await activateEnvironment();
addMatchers();
setCacheDir(inputs_1.cacheLocalPath);
setCacheDir();
core.setOutput("uv-version", setupResult.version);
core.saveState(constants_1.STATE_UV_VERSION, setupResult.version);
core.info(`Successfully installed uv version ${setupResult.version}`);
if (inputs_1.enableCache) {
await (0, restore_cache_1.restoreCache)();
@@ -128394,14 +129575,7 @@ async function setupUv(platform, arch, checkSum, githubToken) {
version: toolCacheResult.version,
};
}
let downloadVersionResult;
if (inputs_1.serverUrl !== "https://github.com") {
core.warning("The input server-url is deprecated. Please use manifest-file instead.");
downloadVersionResult = await (0, download_version_1.downloadVersionFromGithub)(inputs_1.serverUrl, platform, arch, resolvedVersion, checkSum, githubToken);
}
else {
downloadVersionResult = await (0, download_version_1.downloadVersionFromManifest)(inputs_1.manifestFile, platform, arch, resolvedVersion, checkSum, githubToken);
}
const downloadVersionResult = await (0, download_version_1.downloadVersionFromManifest)(inputs_1.manifestFile, platform, arch, resolvedVersion, checkSum, githubToken);
return {
uvDir: downloadVersionResult.cachedToolDir,
version: downloadVersionResult.version,
@@ -128427,18 +129601,33 @@ async function determineVersion(manifestFile) {
}
function addUvToPathAndOutput(cachedPath) {
core.setOutput("uv-path", `${cachedPath}${path.sep}uv`);
core.saveState(constants_1.STATE_UV_PATH, `${cachedPath}${path.sep}uv`);
core.setOutput("uvx-path", `${cachedPath}${path.sep}uvx`);
core.addPath(cachedPath);
core.info(`Added ${cachedPath} to the path`);
if (process.env.UV_NO_MODIFY_PATH !== undefined) {
core.info("UV_NO_MODIFY_PATH is set, not modifying PATH");
}
else {
core.addPath(cachedPath);
core.info(`Added ${cachedPath} to the path`);
}
}
function addToolBinToPath() {
if (inputs_1.toolBinDir !== undefined) {
core.exportVariable("UV_TOOL_BIN_DIR", inputs_1.toolBinDir);
core.info(`Set UV_TOOL_BIN_DIR to ${inputs_1.toolBinDir}`);
core.addPath(inputs_1.toolBinDir);
core.info(`Added ${inputs_1.toolBinDir} to the path`);
if (process.env.UV_NO_MODIFY_PATH !== undefined) {
core.info(`UV_NO_MODIFY_PATH is set, not adding ${inputs_1.toolBinDir} to path`);
}
else {
core.addPath(inputs_1.toolBinDir);
core.info(`Added ${inputs_1.toolBinDir} to the path`);
}
}
else {
if (process.env.UV_NO_MODIFY_PATH !== undefined) {
core.info("UV_NO_MODIFY_PATH is set, not adding user local bin to path");
return;
}
if (process.env.XDG_BIN_HOME !== undefined) {
core.addPath(process.env.XDG_BIN_HOME);
core.info(`Added ${process.env.XDG_BIN_HOME} to the path`);
@@ -128459,6 +129648,17 @@ function setToolDir() {
core.info(`Set UV_TOOL_DIR to ${inputs_1.toolDir}`);
}
}
function addPythonDirToPath() {
core.exportVariable("UV_PYTHON_INSTALL_DIR", inputs_1.pythonDir);
core.info(`Set UV_PYTHON_INSTALL_DIR to ${inputs_1.pythonDir}`);
if (process.env.UV_NO_MODIFY_PATH !== undefined) {
core.info("UV_NO_MODIFY_PATH is set, not adding python dir to path");
}
else {
core.addPath(inputs_1.pythonDir);
core.info(`Added ${inputs_1.pythonDir} to the path`);
}
}
function setupPython() {
if (inputs_1.pythonVersion !== "") {
core.exportVariable("UV_PYTHON", inputs_1.pythonVersion);
@@ -128467,20 +129667,32 @@ function setupPython() {
}
async function activateEnvironment() {
if (inputs_1.activateEnvironment) {
if (process.env.UV_NO_MODIFY_PATH !== undefined) {
throw new Error("UV_NO_MODIFY_PATH and activate-environment cannot be used together.");
}
const execArgs = ["venv", ".venv", "--directory", inputs_1.workingDirectory];
core.info("Activating python venv...");
await exec.exec("uv", execArgs);
let venvBinPath = `${inputs_1.workingDirectory}${path.sep}.venv${path.sep}bin`;
const venvPath = path.resolve(`${inputs_1.workingDirectory}${path.sep}.venv`);
let venvBinPath = `${venvPath}${path.sep}bin`;
if (process.platform === "win32") {
venvBinPath = `${inputs_1.workingDirectory}${path.sep}.venv${path.sep}Scripts`;
venvBinPath = `${venvPath}${path.sep}Scripts`;
}
core.addPath(path.resolve(venvBinPath));
core.exportVariable("VIRTUAL_ENV", path.resolve(`${inputs_1.workingDirectory}${path.sep}.venv`));
core.exportVariable("VIRTUAL_ENV", venvPath);
core.setOutput("venv", venvPath);
}
}
function setCacheDir(cacheLocalPath) {
core.exportVariable("UV_CACHE_DIR", cacheLocalPath);
core.info(`Set UV_CACHE_DIR to ${cacheLocalPath}`);
function setCacheDir() {
if (inputs_1.enableCache) {
const cacheDirFromConfig = (0, config_file_1.getConfigValueFromTomlFile)("", "cache-dir");
if (cacheDirFromConfig !== undefined) {
core.info("Using cache-dir from uv config file, not modifying UV_CACHE_DIR");
return;
}
core.exportVariable("UV_CACHE_DIR", inputs_1.cacheLocalPath);
core.info(`Set UV_CACHE_DIR to ${inputs_1.cacheLocalPath}`);
}
}
function addMatchers() {
if (inputs_1.addProblemMatchers) {
@@ -128491,6 +129703,67 @@ function addMatchers() {
run();
/***/ }),
/***/ 27846:
/***/ (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;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getConfigValueFromTomlFile = getConfigValueFromTomlFile;
const node_fs_1 = __importDefault(__nccwpck_require__(73024));
const toml = __importStar(__nccwpck_require__(27106));
function getConfigValueFromTomlFile(filePath, key) {
if (!node_fs_1.default.existsSync(filePath) || !filePath.endsWith(".toml")) {
return undefined;
}
const fileContent = node_fs_1.default.readFileSync(filePath, "utf-8");
if (filePath.endsWith("pyproject.toml")) {
const tomlContent = toml.parse(fileContent);
return tomlContent?.tool?.uv?.[key];
}
const tomlContent = toml.parse(fileContent);
return tomlContent[key];
}
/***/ }),
/***/ 56156:
@@ -128499,10 +129772,12 @@ run();
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.TOOL_CACHE_NAME = exports.OWNER = exports.REPO = void 0;
exports.STATE_UV_VERSION = exports.STATE_UV_PATH = exports.TOOL_CACHE_NAME = exports.OWNER = exports.REPO = void 0;
exports.REPO = "uv";
exports.OWNER = "astral-sh";
exports.TOOL_CACHE_NAME = "uv";
exports.STATE_UV_PATH = "uv-path";
exports.STATE_UV_VERSION = "uv-version";
/***/ }),
@@ -128578,9 +129853,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
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.addProblemMatchers = exports.manifestFile = exports.githubToken = exports.pythonDir = exports.toolDir = exports.toolBinDir = exports.ignoreEmptyWorkdir = exports.ignoreNothingToCache = exports.cachePython = exports.pruneCache = exports.cacheDependencyGlob = exports.cacheLocalPath = exports.cacheSuffix = exports.saveCache = exports.restoreCache = exports.enableCache = exports.checkSum = exports.activateEnvironment = exports.pythonVersion = exports.versionFile = exports.version = exports.workingDirectory = void 0;
exports.getUvPythonDir = getUvPythonDir;
const node_path_1 = __importDefault(__nccwpck_require__(76760));
const core = __importStar(__nccwpck_require__(37484));
const config_file_1 = __nccwpck_require__(27846);
exports.workingDirectory = core.getInput("working-directory");
exports.version = core.getInput("version");
exports.versionFile = getVersionFile();
@@ -128588,15 +129865,18 @@ exports.pythonVersion = core.getInput("python-version");
exports.activateEnvironment = core.getBooleanInput("activate-environment");
exports.checkSum = core.getInput("checksum");
exports.enableCache = getEnableCache();
exports.restoreCache = core.getInput("restore-cache") === "true";
exports.saveCache = core.getInput("save-cache") === "true";
exports.cacheSuffix = core.getInput("cache-suffix") || "";
exports.cacheLocalPath = getCacheLocalPath();
exports.cacheDependencyGlob = getCacheDependencyGlob();
exports.pruneCache = core.getInput("prune-cache") === "true";
exports.cachePython = core.getInput("cache-python") === "true";
exports.ignoreNothingToCache = core.getInput("ignore-nothing-to-cache") === "true";
exports.ignoreEmptyWorkdir = core.getInput("ignore-empty-workdir") === "true";
exports.toolBinDir = getToolBinDir();
exports.toolDir = getToolDir();
exports.serverUrl = core.getInput("server-url");
exports.pythonDir = getUvPythonDir();
exports.githubToken = core.getInput("github-token");
exports.manifestFile = getManifestFile();
exports.addProblemMatchers = core.getInput("add-problem-matchers") === "true";
@@ -128649,6 +129929,14 @@ function getCacheLocalPath() {
const tildeExpanded = expandTilde(cacheLocalPathInput);
return resolveRelativePath(tildeExpanded);
}
const cacheDirFromConfig = getCacheDirFromConfig();
if (cacheDirFromConfig !== undefined) {
return cacheDirFromConfig;
}
if (process.env.UV_CACHE_DIR !== undefined) {
core.info(`UV_CACHE_DIR is already set to ${process.env.UV_CACHE_DIR}`);
return process.env.UV_CACHE_DIR;
}
if (process.env.RUNNER_ENVIRONMENT === "github-hosted") {
if (process.env.RUNNER_TEMP !== undefined) {
return `${process.env.RUNNER_TEMP}${node_path_1.default.sep}setup-uv-cache`;
@@ -128660,6 +129948,42 @@ function getCacheLocalPath() {
}
return `${process.env.HOME}${node_path_1.default.sep}.cache${node_path_1.default.sep}uv`;
}
function getCacheDirFromConfig() {
for (const filePath of [exports.versionFile, "uv.toml", "pyproject.toml"]) {
const resolvedPath = resolveRelativePath(filePath);
try {
const cacheDir = (0, config_file_1.getConfigValueFromTomlFile)(resolvedPath, "cache-dir");
if (cacheDir !== undefined) {
core.info(`Found cache-dir in ${resolvedPath}: ${cacheDir}`);
return cacheDir;
}
}
catch (err) {
const message = err.message;
core.warning(`Error while parsing ${filePath}: ${message}`);
return undefined;
}
}
return undefined;
}
function getUvPythonDir() {
if (process.env.UV_PYTHON_INSTALL_DIR !== undefined) {
core.info(`UV_PYTHON_INSTALL_DIR is already set to ${process.env.UV_PYTHON_INSTALL_DIR}`);
return process.env.UV_PYTHON_INSTALL_DIR;
}
if (process.env.RUNNER_ENVIRONMENT !== "github-hosted") {
if (process.platform === "win32") {
return `${process.env.APPDATA}${node_path_1.default.sep}uv${node_path_1.default.sep}python`;
}
else {
return `${process.env.HOME}${node_path_1.default.sep}.local${node_path_1.default.sep}share${node_path_1.default.sep}uv${node_path_1.default.sep}python`;
}
}
if (process.env.RUNNER_TEMP !== undefined) {
return `${process.env.RUNNER_TEMP}${node_path_1.default.sep}uv-python-dir`;
}
throw Error("Could not determine UV_PYTHON_INSTALL_DIR. Please make sure RUNNER_TEMP is set or provide the UV_PYTHON_INSTALL_DIR environment variable");
}
function getCacheDependencyGlob() {
const cacheDependencyGlobInput = core.getInput("cache-dependency-glob");
if (cacheDependencyGlobInput !== "") {
@@ -128711,7 +130035,8 @@ 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) {
const OctokitWithPlugins = core_1.Octokit.plugin(plugin_paginate_rest_1.paginateRest, plugin_rest_endpoint_methods_1.legacyRestEndpointMethods);
exports.Octokit = OctokitWithPlugins.defaults(function buildDefaults(options) {
return {
...DEFAULTS,
...options,
@@ -128825,67 +130150,6 @@ async function isMuslOs() {
}
/***/ }),
/***/ 9931:
/***/ (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;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getRequiredVersionFromConfigFile = getRequiredVersionFromConfigFile;
const node_fs_1 = __importDefault(__nccwpck_require__(73024));
const toml = __importStar(__nccwpck_require__(27106));
function getRequiredVersionFromConfigFile(filePath) {
if (!filePath.endsWith(".toml")) {
return undefined;
}
const fileContent = node_fs_1.default.readFileSync(filePath, "utf-8");
if (filePath.endsWith("pyproject.toml")) {
const tomlContent = toml.parse(fileContent);
return tomlContent?.tool?.uv?.["required-version"];
}
const tomlContent = toml.parse(fileContent);
return tomlContent["required-version"];
}
/***/ }),
/***/ 4569:
@@ -129005,7 +130269,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getUvVersionFromFile = getUvVersionFromFile;
const node_fs_1 = __importDefault(__nccwpck_require__(73024));
const core = __importStar(__nccwpck_require__(37484));
const config_file_1 = __nccwpck_require__(9931);
const config_file_1 = __nccwpck_require__(27846);
const requirements_file_1 = __nccwpck_require__(4569);
const tool_versions_file_1 = __nccwpck_require__(4895);
function getUvVersionFromFile(filePath) {
@@ -129018,7 +130282,7 @@ function getUvVersionFromFile(filePath) {
try {
uvVersion = (0, tool_versions_file_1.getUvVersionFromToolVersions)(filePath);
if (uvVersion === undefined) {
uvVersion = (0, config_file_1.getRequiredVersionFromConfigFile)(filePath);
uvVersion = (0, config_file_1.getConfigValueFromTomlFile)(filePath, "required-version");
}
if (uvVersion === undefined) {
uvVersion = (0, requirements_file_1.getUvVersionFromRequirementsFile)(filePath);
@@ -132817,7 +134081,7 @@ class RequestError extends Error {
// pkg/dist-src/version.js
var dist_bundle_VERSION = "0.0.0-development";
var dist_bundle_VERSION = "10.0.5";
// pkg/dist-src/defaults.js
var defaults_default = {
@@ -133188,7 +134452,7 @@ var createTokenAuth = function createTokenAuth2(token) {
;// CONCATENATED MODULE: ./node_modules/@octokit/core/dist-src/version.js
const version_VERSION = "7.0.3";
const version_VERSION = "7.0.5";
;// CONCATENATED MODULE: ./node_modules/@octokit/core/dist-src/index.js
@@ -133762,7 +135026,7 @@ __nccwpck_require__.d(__webpack_exports__, {
});
;// CONCATENATED MODULE: ./node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/version.js
const VERSION = "16.0.0";
const VERSION = "16.1.0";
//# sourceMappingURL=version.js.map
@@ -134576,11 +135840,20 @@ const Endpoints = {
removeSelectedRepoFromOrgSecret: [
"DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"
],
repositoryAccessForOrg: [
"GET /organizations/{org}/dependabot/repository-access"
],
setRepositoryAccessDefaultLevel: [
"PUT /organizations/{org}/dependabot/repository-access/default-level"
],
setSelectedReposForOrgSecret: [
"PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"
],
updateAlert: [
"PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"
],
updateRepositoryAccessForOrg: [
"PATCH /organizations/{org}/dependabot/repository-access"
]
},
dependencyGraph: {
@@ -134686,6 +135959,9 @@ const Endpoints = {
addAssignees: [
"POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"
],
addBlockedByDependency: [
"POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by"
],
addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"],
addSubIssue: [
"POST /repos/{owner}/{repo}/issues/{issue_number}/sub_issues"
@@ -134712,10 +135988,17 @@ const Endpoints = {
getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"],
getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"],
getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"],
getParent: ["GET /repos/{owner}/{repo}/issues/{issue_number}/parent"],
list: ["GET /issues"],
listAssignees: ["GET /repos/{owner}/{repo}/assignees"],
listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"],
listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"],
listDependenciesBlockedBy: [
"GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by"
],
listDependenciesBlocking: [
"GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocking"
],
listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"],
listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"],
listEventsForTimeline: [
@@ -134742,6 +136025,9 @@ const Endpoints = {
removeAssignees: [
"DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"
],
removeDependencyBlockedBy: [
"DELETE /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by/{issue_id}"
],
removeLabel: [
"DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"
],
@@ -134844,6 +136130,9 @@ const Endpoints = {
convertMemberToOutsideCollaborator: [
"PUT /orgs/{org}/outside_collaborators/{username}"
],
createArtifactStorageRecord: [
"POST /orgs/{org}/artifacts/metadata/storage-record"
],
createInvitation: ["POST /orgs/{org}/invitations"],
createIssueType: ["POST /orgs/{org}/issue-types"],
createOrUpdateCustomProperties: ["PATCH /orgs/{org}/properties/schema"],
@@ -134855,15 +136144,15 @@ const Endpoints = {
],
createWebhook: ["POST /orgs/{org}/hooks"],
delete: ["DELETE /orgs/{org}"],
deleteAttestationsBulk: ["POST /orgs/{org}/attestations/delete-request"],
deleteAttestationsById: [
"DELETE /orgs/{org}/attestations/{attestation_id}"
],
deleteAttestationsBySubjectDigest: [
"DELETE /orgs/{org}/attestations/digest/{subject_digest}"
],
deleteIssueType: ["DELETE /orgs/{org}/issue-types/{issue_type_id}"],
deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"],
enableOrDisableSecurityProductOnAllOrgRepos: [
"POST /orgs/{org}/{security_product}/{enablement}",
{},
{
deprecated: "octokit.rest.orgs.enableOrDisableSecurityProductOnAllOrgRepos() is deprecated, see https://docs.github.com/rest/orgs/orgs#enable-or-disable-a-security-feature-for-an-organization"
}
],
get: ["GET /orgs/{org}"],
getAllCustomProperties: ["GET /orgs/{org}/properties/schema"],
getCustomProperty: [
@@ -134883,7 +136172,13 @@ const Endpoints = {
],
list: ["GET /organizations"],
listAppInstallations: ["GET /orgs/{org}/installations"],
listArtifactStorageRecords: [
"GET /orgs/{org}/artifacts/{subject_digest}/metadata/storage-records"
],
listAttestations: ["GET /orgs/{org}/attestations/{subject_digest}"],
listAttestationsBulk: [
"POST /orgs/{org}/attestations/bulk-list{?per_page,before,after}"
],
listBlockedUsers: ["GET /orgs/{org}/blocks"],
listCustomPropertiesValuesForRepos: ["GET /orgs/{org}/properties/values"],
listFailedInvitations: ["GET /orgs/{org}/failed_invitations"],
@@ -135078,6 +136373,44 @@ const Endpoints = {
"PATCH /orgs/{org}/private-registries/{secret_name}"
]
},
projects: {
addItemForOrg: ["POST /orgs/{org}/projectsV2/{project_number}/items"],
addItemForUser: ["POST /users/{user_id}/projectsV2/{project_number}/items"],
deleteItemForOrg: [
"DELETE /orgs/{org}/projectsV2/{project_number}/items/{item_id}"
],
deleteItemForUser: [
"DELETE /users/{user_id}/projectsV2/{project_number}/items/{item_id}"
],
getFieldForOrg: [
"GET /orgs/{org}/projectsV2/{project_number}/fields/{field_id}"
],
getFieldForUser: [
"GET /users/{user_id}/projectsV2/{project_number}/fields/{field_id}"
],
getForOrg: ["GET /orgs/{org}/projectsV2/{project_number}"],
getForUser: ["GET /users/{user_id}/projectsV2/{project_number}"],
getOrgItem: ["GET /orgs/{org}/projectsV2/{project_number}/items/{item_id}"],
getUserItem: [
"GET /users/{user_id}/projectsV2/{project_number}/items/{item_id}"
],
listFieldsForOrg: ["GET /orgs/{org}/projectsV2/{project_number}/fields"],
listFieldsForUser: [
"GET /users/{user_id}/projectsV2/{project_number}/fields"
],
listForOrg: ["GET /orgs/{org}/projectsV2"],
listForUser: ["GET /users/{username}/projectsV2"],
listItemsForOrg: ["GET /orgs/{org}/projectsV2/{project_number}/items"],
listItemsForUser: [
"GET /users/{user_id}/projectsV2/{project_number}/items"
],
updateItemForOrg: [
"PATCH /orgs/{org}/projectsV2/{project_number}/items/{item_id}"
],
updateItemForUser: [
"PATCH /users/{user_id}/projectsV2/{project_number}/items/{item_id}"
]
},
pulls: {
checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"],
create: ["POST /repos/{owner}/{repo}/pulls"],
@@ -135656,8 +136989,14 @@ const Endpoints = {
listLocationsForAlert: [
"GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"
],
listOrgPatternConfigs: [
"GET /orgs/{org}/secret-scanning/pattern-configurations"
],
updateAlert: [
"PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"
],
updateOrgPatternConfigs: [
"PATCH /orgs/{org}/secret-scanning/pattern-configurations"
]
},
securityAdvisories: {
@@ -135767,6 +137106,15 @@ const Endpoints = {
],
createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"],
createSshSigningKeyForAuthenticatedUser: ["POST /user/ssh_signing_keys"],
deleteAttestationsBulk: [
"POST /users/{username}/attestations/delete-request"
],
deleteAttestationsById: [
"DELETE /users/{username}/attestations/{attestation_id}"
],
deleteAttestationsBySubjectDigest: [
"DELETE /users/{username}/attestations/digest/{subject_digest}"
],
deleteEmailForAuthenticated: [
"DELETE /user/emails",
{},
@@ -135811,6 +137159,9 @@ const Endpoints = {
],
list: ["GET /users"],
listAttestations: ["GET /users/{username}/attestations/{subject_digest}"],
listAttestationsBulk: [
"POST /users/{username}/attestations/bulk-list{?per_page,before,after}"
],
listBlockedByAuthenticated: [
"GET /user/blocks",
{},

2491
dist/update-known-versions/index.js generated vendored
View File

@@ -28310,16 +28310,14 @@ module.exports.setGlobalDispatcher = setGlobalDispatcher
module.exports.getGlobalDispatcher = getGlobalDispatcher
const fetchImpl = (__nccwpck_require__(4398).fetch)
module.exports.fetch = async function fetch (init, options = undefined) {
try {
return await fetchImpl(init, options)
} catch (err) {
module.exports.fetch = function fetch (init, options = undefined) {
return fetchImpl(init, options).catch(err => {
if (err && typeof err === 'object') {
Error.captureStackTrace(err)
}
throw err
}
})
}
module.exports.Headers = __nccwpck_require__(660).Headers
module.exports.Response = __nccwpck_require__(9051).Response
@@ -28334,8 +28332,6 @@ module.exports.getGlobalOrigin = getGlobalOrigin
const { CacheStorage } = __nccwpck_require__(3245)
const { kConstruct } = __nccwpck_require__(6443)
// Cache & CacheStorage are tightly coupled with fetch. Even if it may run
// in an older version of Node, it doesn't have any use without fetch.
module.exports.caches = new CacheStorage(kConstruct)
const { deleteCookie, getCookies, getSetCookies, setCookie, parseCookie } = __nccwpck_require__(5090)
@@ -28967,14 +28963,28 @@ class RequestHandler extends AsyncResource {
this.callback = null
this.res = res
if (callback !== null) {
this.runInAsyncScope(callback, null, null, {
statusCode,
headers,
trailers: this.trailers,
opaque,
body: res,
context
})
try {
this.runInAsyncScope(callback, null, null, {
statusCode,
headers,
trailers: this.trailers,
opaque,
body: res,
context
})
} catch (err) {
// If the callback throws synchronously, we need to handle it
// Remove reference to res to allow res being garbage collected
this.res = null
// Destroy the response stream
util.destroy(res.on('error', noop), err)
// Use queueMicrotask to re-throw the error so it reaches uncaughtException
queueMicrotask(() => {
throw err
})
}
}
}
@@ -29668,24 +29678,26 @@ class BodyReadable extends Readable {
* @param {AbortSignal} [opts.signal] An AbortSignal to cancel the dump.
* @returns {Promise<null>}
*/
async dump (opts) {
dump (opts) {
const signal = opts?.signal
if (signal != null && (typeof signal !== 'object' || !('aborted' in signal))) {
throw new InvalidArgumentError('signal must be an AbortSignal')
return Promise.reject(new InvalidArgumentError('signal must be an AbortSignal'))
}
const limit = opts?.limit && Number.isFinite(opts.limit)
? opts.limit
: 128 * 1024
signal?.throwIfAborted()
if (this._readableState.closeEmitted) {
return null
if (signal?.aborted) {
return Promise.reject(signal.reason ?? new AbortError())
}
return await new Promise((resolve, reject) => {
if (this._readableState.closeEmitted) {
return Promise.resolve(null)
}
return new Promise((resolve, reject) => {
if (
(this[kContentLength] && (this[kContentLength] > limit)) ||
this[kBytesRead] > limit
@@ -31202,14 +31214,24 @@ module.exports = {
"use strict";
const kUndiciError = Symbol.for('undici.error.UND_ERR')
class UndiciError extends Error {
constructor (message, options) {
super(message, options)
this.name = 'UndiciError'
this.code = 'UND_ERR'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kUndiciError] === true
}
get [kUndiciError] () {
return true
}
}
const kConnectTimeoutError = Symbol.for('undici.error.UND_ERR_CONNECT_TIMEOUT')
class ConnectTimeoutError extends UndiciError {
constructor (message) {
super(message)
@@ -31217,8 +31239,17 @@ class ConnectTimeoutError extends UndiciError {
this.message = message || 'Connect Timeout Error'
this.code = 'UND_ERR_CONNECT_TIMEOUT'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kConnectTimeoutError] === true
}
get [kConnectTimeoutError] () {
return true
}
}
const kHeadersTimeoutError = Symbol.for('undici.error.UND_ERR_HEADERS_TIMEOUT')
class HeadersTimeoutError extends UndiciError {
constructor (message) {
super(message)
@@ -31226,8 +31257,17 @@ class HeadersTimeoutError extends UndiciError {
this.message = message || 'Headers Timeout Error'
this.code = 'UND_ERR_HEADERS_TIMEOUT'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kHeadersTimeoutError] === true
}
get [kHeadersTimeoutError] () {
return true
}
}
const kHeadersOverflowError = Symbol.for('undici.error.UND_ERR_HEADERS_OVERFLOW')
class HeadersOverflowError extends UndiciError {
constructor (message) {
super(message)
@@ -31235,8 +31275,17 @@ class HeadersOverflowError extends UndiciError {
this.message = message || 'Headers Overflow Error'
this.code = 'UND_ERR_HEADERS_OVERFLOW'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kHeadersOverflowError] === true
}
get [kHeadersOverflowError] () {
return true
}
}
const kBodyTimeoutError = Symbol.for('undici.error.UND_ERR_BODY_TIMEOUT')
class BodyTimeoutError extends UndiciError {
constructor (message) {
super(message)
@@ -31244,21 +31293,17 @@ class BodyTimeoutError extends UndiciError {
this.message = message || 'Body Timeout Error'
this.code = 'UND_ERR_BODY_TIMEOUT'
}
}
class ResponseStatusCodeError extends UndiciError {
constructor (message, statusCode, headers, body) {
super(message)
this.name = 'ResponseStatusCodeError'
this.message = message || 'Response Status Code Error'
this.code = 'UND_ERR_RESPONSE_STATUS_CODE'
this.body = body
this.status = statusCode
this.statusCode = statusCode
this.headers = headers
static [Symbol.hasInstance] (instance) {
return instance && instance[kBodyTimeoutError] === true
}
get [kBodyTimeoutError] () {
return true
}
}
const kInvalidArgumentError = Symbol.for('undici.error.UND_ERR_INVALID_ARG')
class InvalidArgumentError extends UndiciError {
constructor (message) {
super(message)
@@ -31266,8 +31311,17 @@ class InvalidArgumentError extends UndiciError {
this.message = message || 'Invalid Argument Error'
this.code = 'UND_ERR_INVALID_ARG'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kInvalidArgumentError] === true
}
get [kInvalidArgumentError] () {
return true
}
}
const kInvalidReturnValueError = Symbol.for('undici.error.UND_ERR_INVALID_RETURN_VALUE')
class InvalidReturnValueError extends UndiciError {
constructor (message) {
super(message)
@@ -31275,16 +31329,35 @@ class InvalidReturnValueError extends UndiciError {
this.message = message || 'Invalid Return Value Error'
this.code = 'UND_ERR_INVALID_RETURN_VALUE'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kInvalidReturnValueError] === true
}
get [kInvalidReturnValueError] () {
return true
}
}
const kAbortError = Symbol.for('undici.error.UND_ERR_ABORT')
class AbortError extends UndiciError {
constructor (message) {
super(message)
this.name = 'AbortError'
this.message = message || 'The operation was aborted'
this.code = 'UND_ERR_ABORT'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kAbortError] === true
}
get [kAbortError] () {
return true
}
}
const kRequestAbortedError = Symbol.for('undici.error.UND_ERR_ABORTED')
class RequestAbortedError extends AbortError {
constructor (message) {
super(message)
@@ -31292,8 +31365,17 @@ class RequestAbortedError extends AbortError {
this.message = message || 'Request aborted'
this.code = 'UND_ERR_ABORTED'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kRequestAbortedError] === true
}
get [kRequestAbortedError] () {
return true
}
}
const kInformationalError = Symbol.for('undici.error.UND_ERR_INFO')
class InformationalError extends UndiciError {
constructor (message) {
super(message)
@@ -31301,8 +31383,17 @@ class InformationalError extends UndiciError {
this.message = message || 'Request information'
this.code = 'UND_ERR_INFO'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kInformationalError] === true
}
get [kInformationalError] () {
return true
}
}
const kRequestContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH')
class RequestContentLengthMismatchError extends UndiciError {
constructor (message) {
super(message)
@@ -31310,8 +31401,17 @@ class RequestContentLengthMismatchError extends UndiciError {
this.message = message || 'Request body length does not match content-length header'
this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kRequestContentLengthMismatchError] === true
}
get [kRequestContentLengthMismatchError] () {
return true
}
}
const kResponseContentLengthMismatchError = Symbol.for('undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH')
class ResponseContentLengthMismatchError extends UndiciError {
constructor (message) {
super(message)
@@ -31319,8 +31419,17 @@ class ResponseContentLengthMismatchError extends UndiciError {
this.message = message || 'Response body length does not match content-length header'
this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kResponseContentLengthMismatchError] === true
}
get [kResponseContentLengthMismatchError] () {
return true
}
}
const kClientDestroyedError = Symbol.for('undici.error.UND_ERR_DESTROYED')
class ClientDestroyedError extends UndiciError {
constructor (message) {
super(message)
@@ -31328,8 +31437,17 @@ class ClientDestroyedError extends UndiciError {
this.message = message || 'The client is destroyed'
this.code = 'UND_ERR_DESTROYED'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kClientDestroyedError] === true
}
get [kClientDestroyedError] () {
return true
}
}
const kClientClosedError = Symbol.for('undici.error.UND_ERR_CLOSED')
class ClientClosedError extends UndiciError {
constructor (message) {
super(message)
@@ -31337,8 +31455,17 @@ class ClientClosedError extends UndiciError {
this.message = message || 'The client is closed'
this.code = 'UND_ERR_CLOSED'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kClientClosedError] === true
}
get [kClientClosedError] () {
return true
}
}
const kSocketError = Symbol.for('undici.error.UND_ERR_SOCKET')
class SocketError extends UndiciError {
constructor (message, socket) {
super(message)
@@ -31347,8 +31474,17 @@ class SocketError extends UndiciError {
this.code = 'UND_ERR_SOCKET'
this.socket = socket
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kSocketError] === true
}
get [kSocketError] () {
return true
}
}
const kNotSupportedError = Symbol.for('undici.error.UND_ERR_NOT_SUPPORTED')
class NotSupportedError extends UndiciError {
constructor (message) {
super(message)
@@ -31356,8 +31492,17 @@ class NotSupportedError extends UndiciError {
this.message = message || 'Not supported error'
this.code = 'UND_ERR_NOT_SUPPORTED'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kNotSupportedError] === true
}
get [kNotSupportedError] () {
return true
}
}
const kBalancedPoolMissingUpstreamError = Symbol.for('undici.error.UND_ERR_BPL_MISSING_UPSTREAM')
class BalancedPoolMissingUpstreamError extends UndiciError {
constructor (message) {
super(message)
@@ -31365,8 +31510,17 @@ class BalancedPoolMissingUpstreamError extends UndiciError {
this.message = message || 'No upstream has been added to the BalancedPool'
this.code = 'UND_ERR_BPL_MISSING_UPSTREAM'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kBalancedPoolMissingUpstreamError] === true
}
get [kBalancedPoolMissingUpstreamError] () {
return true
}
}
const kHTTPParserError = Symbol.for('undici.error.UND_ERR_HTTP_PARSER')
class HTTPParserError extends Error {
constructor (message, code, data) {
super(message)
@@ -31374,8 +31528,17 @@ class HTTPParserError extends Error {
this.code = code ? `HPE_${code}` : undefined
this.data = data ? data.toString() : undefined
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kHTTPParserError] === true
}
get [kHTTPParserError] () {
return true
}
}
const kResponseExceededMaxSizeError = Symbol.for('undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE')
class ResponseExceededMaxSizeError extends UndiciError {
constructor (message) {
super(message)
@@ -31383,8 +31546,17 @@ class ResponseExceededMaxSizeError extends UndiciError {
this.message = message || 'Response content exceeded max size'
this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kResponseExceededMaxSizeError] === true
}
get [kResponseExceededMaxSizeError] () {
return true
}
}
const kRequestRetryError = Symbol.for('undici.error.UND_ERR_REQ_RETRY')
class RequestRetryError extends UndiciError {
constructor (message, code, { headers, data }) {
super(message)
@@ -31395,8 +31567,17 @@ class RequestRetryError extends UndiciError {
this.data = data
this.headers = headers
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kRequestRetryError] === true
}
get [kRequestRetryError] () {
return true
}
}
const kResponseError = Symbol.for('undici.error.UND_ERR_RESPONSE')
class ResponseError extends UndiciError {
constructor (message, code, { headers, body }) {
super(message)
@@ -31407,8 +31588,17 @@ class ResponseError extends UndiciError {
this.body = body
this.headers = headers
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kResponseError] === true
}
get [kResponseError] () {
return true
}
}
const kSecureProxyConnectionError = Symbol.for('undici.error.UND_ERR_PRX_TLS')
class SecureProxyConnectionError extends UndiciError {
constructor (cause, message, options = {}) {
super(message, { cause, ...options })
@@ -31417,6 +31607,32 @@ class SecureProxyConnectionError extends UndiciError {
this.code = 'UND_ERR_PRX_TLS'
this.cause = cause
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kSecureProxyConnectionError] === true
}
get [kSecureProxyConnectionError] () {
return true
}
}
const kMaxOriginsReachedError = Symbol.for('undici.error.UND_ERR_MAX_ORIGINS_REACHED')
class MaxOriginsReachedError extends UndiciError {
constructor (message) {
super(message)
this.name = 'MaxOriginsReachedError'
this.message = message || 'Maximum allowed origins reached'
this.code = 'UND_ERR_MAX_ORIGINS_REACHED'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kMaxOriginsReachedError] === true
}
get [kMaxOriginsReachedError] () {
return true
}
}
module.exports = {
@@ -31428,7 +31644,6 @@ module.exports = {
BodyTimeoutError,
RequestContentLengthMismatchError,
ConnectTimeoutError,
ResponseStatusCodeError,
InvalidArgumentError,
InvalidReturnValueError,
RequestAbortedError,
@@ -31442,7 +31657,8 @@ module.exports = {
ResponseExceededMaxSizeError,
RequestRetryError,
ResponseError,
SecureProxyConnectionError
SecureProxyConnectionError,
MaxOriginsReachedError
}
@@ -31471,7 +31687,8 @@ const {
serializePathWithQuery,
assertRequestHandler,
getServerName,
normalizedMethodRecords
normalizedMethodRecords,
getProtocolFromUrlString
} = __nccwpck_require__(3440)
const { channels } = __nccwpck_require__(2414)
const { headerNameLowerCasedRecord } = __nccwpck_require__(735)
@@ -31595,8 +31812,11 @@ class Request {
this.path = query ? serializePathWithQuery(path, query) : path
// TODO: shall we maybe standardize it to an URL object?
this.origin = origin
this.protocol = getProtocolFromUrlString(origin)
this.idempotent = idempotent == null
? method === 'HEAD' || method === 'GET'
: idempotent
@@ -32723,12 +32943,11 @@ function ReadableStreamFrom (iterable) {
let iterator
return new ReadableStream(
{
async start () {
start () {
iterator = iterable[Symbol.asyncIterator]()
},
pull (controller) {
async function pull () {
const { done, value } = await iterator.next()
return iterator.next().then(({ done, value }) => {
if (done) {
queueMicrotask(() => {
controller.close()
@@ -32739,15 +32958,13 @@ function ReadableStreamFrom (iterable) {
if (buf.byteLength) {
controller.enqueue(new Uint8Array(buf))
} else {
return await pull()
return this.pull(controller)
}
}
}
return pull()
})
},
async cancel () {
await iterator.return()
cancel () {
return iterator.return()
},
type: 'bytes'
}
@@ -32993,6 +33210,30 @@ function onConnectTimeout (socket, opts) {
destroy(socket, new ConnectTimeoutError(message))
}
/**
* @param {string} urlString
* @returns {string}
*/
function getProtocolFromUrlString (urlString) {
if (
urlString[0] === 'h' &&
urlString[1] === 't' &&
urlString[2] === 't' &&
urlString[3] === 'p'
) {
switch (urlString[4]) {
case ':':
return 'http:'
case 's':
if (urlString[5] === ':') {
return 'https:'
}
}
}
// fallback if none of the usual suspects
return urlString.slice(0, urlString.indexOf(':') + 1)
}
const kEnumerableProperty = Object.create(null)
kEnumerableProperty.enumerable = true
@@ -33064,7 +33305,8 @@ module.exports = {
nodeMinor,
safeHTTPMethods: Object.freeze(['GET', 'HEAD', 'OPTIONS', 'TRACE']),
wrapRequestBody,
setupConnectTimeout
setupConnectTimeout,
getProtocolFromUrlString
}
@@ -33076,7 +33318,7 @@ module.exports = {
"use strict";
const { InvalidArgumentError } = __nccwpck_require__(8707)
const { InvalidArgumentError, MaxOriginsReachedError } = __nccwpck_require__(8707)
const { kClients, kRunning, kClose, kDestroy, kDispatch, kUrl } = __nccwpck_require__(6443)
const DispatcherBase = __nccwpck_require__(1841)
const Pool = __nccwpck_require__(628)
@@ -33089,6 +33331,7 @@ const kOnConnectionError = Symbol('onConnectionError')
const kOnDrain = Symbol('onDrain')
const kFactory = Symbol('factory')
const kOptions = Symbol('options')
const kOrigins = Symbol('origins')
function defaultFactory (origin, opts) {
return opts && opts.connections === 1
@@ -33097,7 +33340,7 @@ function defaultFactory (origin, opts) {
}
class Agent extends DispatcherBase {
constructor ({ factory = defaultFactory, connect, ...options } = {}) {
constructor ({ factory = defaultFactory, maxOrigins = Infinity, connect, ...options } = {}) {
if (typeof factory !== 'function') {
throw new InvalidArgumentError('factory must be a function.')
}
@@ -33106,15 +33349,20 @@ class Agent extends DispatcherBase {
throw new InvalidArgumentError('connect must be a function or an object')
}
if (typeof maxOrigins !== 'number' || Number.isNaN(maxOrigins) || maxOrigins <= 0) {
throw new InvalidArgumentError('maxOrigins must be a number greater than 0')
}
super()
if (connect && typeof connect !== 'function') {
connect = { ...connect }
}
this[kOptions] = { ...util.deepClone(options), connect }
this[kOptions] = { ...util.deepClone(options), maxOrigins, connect }
this[kFactory] = factory
this[kClients] = new Map()
this[kOrigins] = new Set()
this[kOnDrain] = (origin, targets) => {
this.emit('drain', origin, [this, ...targets])
@@ -33149,6 +33397,10 @@ class Agent extends DispatcherBase {
throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.')
}
if (this[kOrigins].size >= this[kOptions].maxOrigins && !this[kOrigins].has(key)) {
throw new MaxOriginsReachedError()
}
const result = this[kClients].get(key)
let dispatcher = result && result.dispatcher
if (!dispatcher) {
@@ -33160,6 +33412,7 @@ class Agent extends DispatcherBase {
this[kClients].delete(key)
result.dispatcher.close()
}
this[kOrigins].delete(key)
}
}
dispatcher = this[kFactory](opts.origin, this[kOptions])
@@ -33181,29 +33434,30 @@ class Agent extends DispatcherBase {
})
this[kClients].set(key, { count: 0, dispatcher })
this[kOrigins].add(key)
}
return dispatcher.dispatch(opts, handler)
}
async [kClose] () {
[kClose] () {
const closePromises = []
for (const { dispatcher } of this[kClients].values()) {
closePromises.push(dispatcher.close())
}
this[kClients].clear()
await Promise.all(closePromises)
return Promise.all(closePromises)
}
async [kDestroy] (err) {
[kDestroy] (err) {
const destroyPromises = []
for (const { dispatcher } of this[kClients].values()) {
destroyPromises.push(dispatcher.destroy(err))
}
this[kClients].clear()
await Promise.all(destroyPromises)
return Promise.all(destroyPromises)
}
get stats () {
@@ -33506,11 +33760,26 @@ function lazyllhttp () {
const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(3870) : undefined
let mod
try {
mod = new WebAssembly.Module(__nccwpck_require__(3434))
} catch {
/* istanbul ignore next */
// We disable wasm SIMD on ppc64 as it seems to be broken on Power 9 architectures.
let useWasmSIMD = process.arch !== 'ppc64'
// The Env Variable UNDICI_NO_WASM_SIMD allows explicitly overriding the default behavior
if (process.env.UNDICI_NO_WASM_SIMD === '1') {
useWasmSIMD = true
} else if (process.env.UNDICI_NO_WASM_SIMD === '0') {
useWasmSIMD = false
}
if (useWasmSIMD) {
try {
mod = new WebAssembly.Module(__nccwpck_require__(3434))
/* istanbul ignore next */
} catch {
}
}
/* istanbul ignore next */
if (!mod) {
// We could check if the error was caused by the simd option not
// being enabled, but the occurring of this other error
// * https://github.com/emscripten-core/emscripten/issues/11495
@@ -33767,10 +34036,6 @@ class Parser {
currentBufferRef = chunk
currentParser = this
ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, chunk.length)
/* eslint-disable-next-line no-useless-catch */
} catch (err) {
/* istanbul ignore next: difficult to make a test case for */
throw err
} finally {
currentParser = null
currentBufferRef = null
@@ -34202,7 +34467,7 @@ function onParserTimeout (parser) {
* @param {import('net').Socket} socket
* @returns
*/
async function connectH1 (client, socket) {
function connectH1 (client, socket) {
client[kSocket] = socket
if (!llhttpInstance) {
@@ -35133,7 +35398,7 @@ function parseH2Headers (headers) {
return result
}
async function connectH2 (client, socket) {
function connectH2 (client, socket) {
client[kSocket] = socket
const session = http2.connect(client[kUrl], {
@@ -35335,7 +35600,7 @@ function shouldSendContentLength (method) {
function writeH2 (client, request) {
const requestTimeout = request.bodyTimeout ?? client[kBodyTimeout]
const session = client[kHTTP2Session]
const { method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request
const { method, path, host, upgrade, expectContinue, signal, protocol, headers: reqHeaders } = request
let { body } = request
if (upgrade) {
@@ -35348,6 +35613,16 @@ function writeH2 (client, request) {
const key = reqHeaders[n + 0]
const val = reqHeaders[n + 1]
if (key === 'cookie') {
if (headers[key] != null) {
headers[key] = Array.isArray(headers[key]) ? (headers[key].push(val), headers[key]) : [headers[key], val]
} else {
headers[key] = val
}
continue
}
if (Array.isArray(val)) {
for (let i = 0; i < val.length; i++) {
if (headers[key]) {
@@ -35443,7 +35718,7 @@ function writeH2 (client, request) {
// :path and :scheme headers must be omitted when sending CONNECT
headers[HTTP2_HEADER_PATH] = path
headers[HTTP2_HEADER_SCHEME] = 'https'
headers[HTTP2_HEADER_SCHEME] = protocol === 'http:' ? 'http' : 'https'
// https://tools.ietf.org/html/rfc7231#section-4.3.1
// https://tools.ietf.org/html/rfc7231#section-4.3.2
@@ -36158,8 +36433,7 @@ class Client extends DispatcherBase {
}
[kDispatch] (opts, handler) {
const origin = opts.origin || this[kUrl].origin
const request = new Request(origin, opts, handler)
const request = new Request(this[kUrl].origin, opts, handler)
this[kQueue].push(request)
if (this[kResuming]) {
@@ -36179,7 +36453,7 @@ class Client extends DispatcherBase {
return this[kNeedDrain] < 2
}
async [kClose] () {
[kClose] () {
// TODO: for H2 we need to gracefully flush the remaining enqueued
// request and close each stream.
return new Promise((resolve) => {
@@ -36191,7 +36465,7 @@ class Client extends DispatcherBase {
})
}
async [kDestroy] (err) {
[kDestroy] (err) {
return new Promise((resolve) => {
const requests = this[kQueue].splice(this[kPendingIdx])
for (let i = 0; i < requests.length; i++) {
@@ -36243,9 +36517,9 @@ function onError (client, err) {
/**
* @param {Client} client
* @returns
* @returns {void}
*/
async function connect (client) {
function connect (client) {
assert(!client[kConnecting])
assert(!client[kHTTPContext])
@@ -36279,26 +36553,23 @@ async function connect (client) {
})
}
try {
const socket = await new Promise((resolve, reject) => {
client[kConnector]({
host,
hostname,
protocol,
port,
servername: client[kServerName],
localAddress: client[kLocalAddress]
}, (err, socket) => {
if (err) {
reject(err)
} else {
resolve(socket)
}
})
})
client[kConnector]({
host,
hostname,
protocol,
port,
servername: client[kServerName],
localAddress: client[kLocalAddress]
}, (err, socket) => {
if (err) {
handleConnectError(client, err, { host, hostname, protocol, port })
client[kResume]()
return
}
if (client.destroyed) {
util.destroy(socket.on('error', noop), new ClientDestroyedError())
client[kResume]()
return
}
@@ -36306,11 +36577,13 @@ async function connect (client) {
try {
client[kHTTPContext] = socket.alpnProtocol === 'h2'
? await connectH2(client, socket)
: await connectH1(client, socket)
? connectH2(client, socket)
: connectH1(client, socket)
} catch (err) {
socket.destroy().on('error', noop)
throw err
handleConnectError(client, err, { host, hostname, protocol, port })
client[kResume]()
return
}
client[kConnecting] = false
@@ -36335,44 +36608,46 @@ async function connect (client) {
socket
})
}
client.emit('connect', client[kUrl], [client])
} catch (err) {
if (client.destroyed) {
return
}
client[kResume]()
})
}
client[kConnecting] = false
if (channels.connectError.hasSubscribers) {
channels.connectError.publish({
connectParams: {
host,
hostname,
protocol,
port,
version: client[kHTTPContext]?.version,
servername: client[kServerName],
localAddress: client[kLocalAddress]
},
connector: client[kConnector],
error: err
})
}
if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {
assert(client[kRunning] === 0)
while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) {
const request = client[kQueue][client[kPendingIdx]++]
util.errorRequest(client, request, err)
}
} else {
onError(client, err)
}
client.emit('connectionError', client[kUrl], [client], err)
function handleConnectError (client, err, { host, hostname, protocol, port }) {
if (client.destroyed) {
return
}
client[kResume]()
client[kConnecting] = false
if (channels.connectError.hasSubscribers) {
channels.connectError.publish({
connectParams: {
host,
hostname,
protocol,
port,
version: client[kHTTPContext]?.version,
servername: client[kServerName],
localAddress: client[kLocalAddress]
},
connector: client[kConnector],
error: err
})
}
if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {
assert(client[kRunning] === 0)
while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) {
const request = client[kQueue][client[kPendingIdx]++]
util.errorRequest(client, request, err)
}
} else {
onError(client, err)
}
client.emit('connectionError', client[kUrl], [client], err)
}
function emitDrain (client) {
@@ -36497,19 +36772,24 @@ const kOnDestroyed = Symbol('onDestroyed')
const kOnClosed = Symbol('onClosed')
class DispatcherBase extends Dispatcher {
constructor () {
super()
/** @type {boolean} */
[kDestroyed] = false;
this[kDestroyed] = false
this[kOnDestroyed] = null
this[kClosed] = false
this[kOnClosed] = []
}
/** @type {Array|null} */
[kOnDestroyed] = null;
/** @type {boolean} */
[kClosed] = false;
/** @type {Array} */
[kOnClosed] = []
/** @returns {boolean} */
get destroyed () {
return this[kDestroyed]
}
/** @returns {boolean} */
get closed () {
return this[kClosed]
}
@@ -36755,24 +37035,20 @@ class EnvHttpProxyAgent extends DispatcherBase {
return agent.dispatch(opts, handler)
}
async [kClose] () {
await this[kNoProxyAgent].close()
if (!this[kHttpProxyAgent][kClosed]) {
await this[kHttpProxyAgent].close()
}
if (!this[kHttpsProxyAgent][kClosed]) {
await this[kHttpsProxyAgent].close()
}
[kClose] () {
return Promise.all([
this[kNoProxyAgent].close(),
!this[kHttpProxyAgent][kClosed] && this[kHttpProxyAgent].close(),
!this[kHttpsProxyAgent][kClosed] && this[kHttpsProxyAgent].close()
])
}
async [kDestroy] (err) {
await this[kNoProxyAgent].destroy(err)
if (!this[kHttpProxyAgent][kDestroyed]) {
await this[kHttpProxyAgent].destroy(err)
}
if (!this[kHttpsProxyAgent][kDestroyed]) {
await this[kHttpsProxyAgent].destroy(err)
}
[kDestroy] (err) {
return Promise.all([
this[kNoProxyAgent].destroy(err),
!this[kHttpProxyAgent][kDestroyed] && this[kHttpProxyAgent].destroy(err),
!this[kHttpsProxyAgent][kDestroyed] && this[kHttpsProxyAgent].destroy(err)
])
}
#getProxyAgentForUrl (url) {
@@ -36927,35 +37203,21 @@ const kMask = kSize - 1
* @template T
*/
class FixedCircularBuffer {
constructor () {
/**
* @type {number}
*/
this.bottom = 0
/**
* @type {number}
*/
this.top = 0
/**
* @type {Array<T|undefined>}
*/
this.list = new Array(kSize).fill(undefined)
/**
* @type {T|null}
*/
this.next = null
}
/** @type {number} */
bottom = 0
/** @type {number} */
top = 0
/** @type {Array<T|undefined>} */
list = new Array(kSize).fill(undefined)
/** @type {T|null} */
next = null
/**
* @returns {boolean}
*/
/** @returns {boolean} */
isEmpty () {
return this.top === this.bottom
}
/**
* @returns {boolean}
*/
/** @returns {boolean} */
isFull () {
return ((this.top + 1) & kMask) === this.bottom
}
@@ -36969,9 +37231,7 @@ class FixedCircularBuffer {
this.top = (this.top + 1) & kMask
}
/**
* @returns {T|null}
*/
/** @returns {T|null} */
shift () {
const nextItem = this.list[this.bottom]
if (nextItem === undefined) { return null }
@@ -36986,22 +37246,16 @@ class FixedCircularBuffer {
*/
module.exports = class FixedQueue {
constructor () {
/**
* @type {FixedCircularBuffer<T>}
*/
/** @type {FixedCircularBuffer<T>} */
this.head = this.tail = new FixedCircularBuffer()
}
/**
* @returns {boolean}
*/
/** @returns {boolean} */
isEmpty () {
return this.head.isEmpty()
}
/**
* @param {T} data
*/
/** @param {T} data */
push (data) {
if (this.head.isFull()) {
// Head is full: Creates a new queue, sets the old queue's `.next` to it,
@@ -37011,9 +37265,7 @@ module.exports = class FixedQueue {
this.head.push(data)
}
/**
* @returns {T|null}
*/
/** @returns {T|null} */
shift () {
const tail = this.tail
const next = tail.shift()
@@ -37047,8 +37299,6 @@ class H2CClient extends DispatcherBase {
#client = null
constructor (origin, clientOpts) {
super()
if (typeof origin === 'string') {
origin = new URL(origin)
}
@@ -37082,6 +37332,8 @@ class H2CClient extends DispatcherBase {
)
}
super()
this.#client = new Client(origin, {
...opts,
connect: this.#buildConnector(connect),
@@ -37145,12 +37397,12 @@ class H2CClient extends DispatcherBase {
return this.#client.dispatch(opts, handler)
}
async [kClose] () {
await this.#client.close()
[kClose] () {
return this.#client.close()
}
async [kDestroy] () {
await this.#client.destroy()
[kDestroy] () {
return this.#client.destroy()
}
}
@@ -37183,54 +37435,55 @@ const kAddClient = Symbol('add client')
const kRemoveClient = Symbol('remove client')
class PoolBase extends DispatcherBase {
constructor () {
super()
[kQueue] = new FixedQueue();
this[kQueue] = new FixedQueue()
this[kClients] = []
this[kQueued] = 0
[kQueued] = 0;
const pool = this
[kClients] = [];
this[kOnDrain] = function onDrain (origin, targets) {
const queue = pool[kQueue]
[kNeedDrain] = false;
let needDrain = false
[kOnDrain] (client, origin, targets) {
const queue = this[kQueue]
while (!needDrain) {
const item = queue.shift()
if (!item) {
break
}
pool[kQueued]--
needDrain = !this.dispatch(item.opts, item.handler)
let needDrain = false
while (!needDrain) {
const item = queue.shift()
if (!item) {
break
}
this[kQueued]--
needDrain = !client.dispatch(item.opts, item.handler)
}
this[kNeedDrain] = needDrain
client[kNeedDrain] = needDrain
if (!this[kNeedDrain] && pool[kNeedDrain]) {
pool[kNeedDrain] = false
pool.emit('drain', origin, [pool, ...targets])
}
if (pool[kClosedResolve] && queue.isEmpty()) {
Promise
.all(pool[kClients].map(c => c.close()))
.then(pool[kClosedResolve])
if (!needDrain && this[kNeedDrain]) {
this[kNeedDrain] = false
this.emit('drain', origin, [this, ...targets])
}
if (this[kClosedResolve] && queue.isEmpty()) {
const closeAll = new Array(this[kClients].length)
for (let i = 0; i < this[kClients].length; i++) {
closeAll[i] = this[kClients][i].close()
}
Promise.all(closeAll)
.then(this[kClosedResolve])
}
}
this[kOnConnect] = (origin, targets) => {
pool.emit('connect', origin, [pool, ...targets])
}
[kOnConnect] = (origin, targets) => {
this.emit('connect', origin, [this, ...targets])
};
this[kOnDisconnect] = (origin, targets, err) => {
pool.emit('disconnect', origin, [pool, ...targets], err)
}
[kOnDisconnect] = (origin, targets, err) => {
this.emit('disconnect', origin, [this, ...targets], err)
};
this[kOnConnectionError] = (origin, targets, err) => {
pool.emit('connectionError', origin, [pool, ...targets], err)
}
[kOnConnectionError] = (origin, targets, err) => {
this.emit('connectionError', origin, [this, ...targets], err)
}
get [kBusy] () {
@@ -37238,11 +37491,19 @@ class PoolBase extends DispatcherBase {
}
get [kConnected] () {
return this[kClients].filter(client => client[kConnected]).length
let ret = 0
for (const { [kConnected]: connected } of this[kClients]) {
ret += connected
}
return ret
}
get [kFree] () {
return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length
let ret = 0
for (const { [kConnected]: connected, [kNeedDrain]: needDrain } of this[kClients]) {
ret += connected && !needDrain
}
return ret
}
get [kPending] () {
@@ -37273,17 +37534,21 @@ class PoolBase extends DispatcherBase {
return new PoolStats(this)
}
async [kClose] () {
[kClose] () {
if (this[kQueue].isEmpty()) {
await Promise.all(this[kClients].map(c => c.close()))
const closeAll = new Array(this[kClients].length)
for (let i = 0; i < this[kClients].length; i++) {
closeAll[i] = this[kClients][i].close()
}
return Promise.all(closeAll)
} else {
await new Promise((resolve) => {
return new Promise((resolve) => {
this[kClosedResolve] = resolve
})
}
}
async [kDestroy] (err) {
[kDestroy] (err) {
while (true) {
const item = this[kQueue].shift()
if (!item) {
@@ -37292,7 +37557,11 @@ class PoolBase extends DispatcherBase {
item.handler.onError(err)
}
await Promise.all(this[kClients].map(c => c.destroy(err)))
const destroyAll = new Array(this[kClients].length)
for (let i = 0; i < this[kClients].length; i++) {
destroyAll[i] = this[kClients][i].destroy(err)
}
return Promise.all(destroyAll)
}
[kDispatch] (opts, handler) {
@@ -37312,7 +37581,7 @@ class PoolBase extends DispatcherBase {
[kAddClient] (client) {
client
.on('drain', this[kOnDrain])
.on('drain', this[kOnDrain].bind(this, client))
.on('connect', this[kOnConnect])
.on('disconnect', this[kOnDisconnect])
.on('connectionError', this[kOnConnectionError])
@@ -37322,7 +37591,7 @@ class PoolBase extends DispatcherBase {
if (this[kNeedDrain]) {
queueMicrotask(() => {
if (this[kNeedDrain]) {
this[kOnDrain](client[kUrl], [this, client])
this[kOnDrain](client, client[kUrl], [client, this])
}
})
}
@@ -37415,8 +37684,6 @@ class Pool extends PoolBase {
throw new InvalidArgumentError('connect must be a function or an object')
}
super()
if (typeof connect !== 'function') {
connect = buildConnector({
...tls,
@@ -37429,6 +37696,8 @@ class Pool extends PoolBase {
})
}
super()
this[kConnections] = connections || null
this[kUrl] = util.parseOrigin(origin)
this[kOptions] = { ...util.deepClone(options), connect, allowH2, clientTtl }
@@ -37527,11 +37796,12 @@ class Http1ProxyWrapper extends DispatcherBase {
#client
constructor (proxyUrl, { headers = {}, connect, factory }) {
super()
if (!proxyUrl) {
throw new InvalidArgumentError('Proxy URL is mandatory')
}
super()
this[kProxyHeaders] = headers
if (factory) {
this.#client = factory(proxyUrl, { connect })
@@ -37570,11 +37840,11 @@ class Http1ProxyWrapper extends DispatcherBase {
return this.#client[kDispatch](opts, handler)
}
async [kClose] () {
[kClose] () {
return this.#client.close()
}
async [kDestroy] (err) {
[kDestroy] (err) {
return this.#client.destroy(err)
}
}
@@ -37710,14 +37980,18 @@ class ProxyAgent extends DispatcherBase {
}
}
async [kClose] () {
await this[kAgent].close()
await this[kClient].close()
[kClose] () {
return Promise.all([
this[kAgent].close(),
this[kClient].close()
])
}
async [kDestroy] () {
await this[kAgent].destroy()
await this[kClient].destroy()
[kDestroy] () {
return Promise.all([
this[kAgent].destroy(),
this[kClient].destroy()
])
}
}
@@ -37838,9 +38112,27 @@ function getGlobalDispatcher () {
return globalThis[globalDispatcher]
}
// These are the globals that can be installed by undici.install().
// Not exported by index.js to avoid use outside of this module.
const installedExports = /** @type {const} */ (
[
'fetch',
'Headers',
'Response',
'Request',
'FormData',
'WebSocket',
'CloseEvent',
'ErrorEvent',
'MessageEvent',
'EventSource'
]
)
module.exports = {
setGlobalDispatcher,
getGlobalDispatcher
getGlobalDispatcher,
installedExports
}
@@ -39448,6 +39740,22 @@ function needsRevalidation (result, cacheControlDirectives) {
return false
}
/**
* Check if we're within the stale-while-revalidate window for a stale response
* @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result
* @returns {boolean}
*/
function withinStaleWhileRevalidateWindow (result) {
const staleWhileRevalidate = result.cacheControlDirectives?.['stale-while-revalidate']
if (!staleWhileRevalidate) {
return false
}
const now = Date.now()
const staleWhileRevalidateExpiry = result.staleAt + (staleWhileRevalidate * 1000)
return now <= staleWhileRevalidateExpiry
}
/**
* @param {DispatchFn} dispatch
* @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} globalOpts
@@ -39623,6 +39931,51 @@ function handleResult (
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))
}
// RFC 5861: If we're within stale-while-revalidate window, serve stale immediately
// and revalidate in background
if (withinStaleWhileRevalidateWindow(result)) {
// Serve stale response immediately
sendCachedValue(handler, opts, result, age, null, true)
// Start background revalidation (fire-and-forget)
queueMicrotask(() => {
let headers = {
...opts.headers,
'if-modified-since': new Date(result.cachedAt).toUTCString()
}
if (result.etag) {
headers['if-none-match'] = result.etag
}
if (result.vary) {
headers = {
...headers,
...result.vary
}
}
// Background revalidation - update cache if we get new data
dispatch(
{
...opts,
headers
},
new CacheHandler(globalOpts, cacheKey, {
// Silent handler that just updates the cache
onRequestStart () {},
onRequestUpgrade () {},
onResponseStart () {},
onResponseData () {},
onResponseEnd () {},
onResponseError () {}
})
)
})
return true
}
let withinStaleIfErrorThreshold = false
const staleIfErrorExpiry = result.cacheControlDirectives['stale-if-error'] ?? reqCacheControl?.['stale-if-error']
if (staleIfErrorExpiry) {
@@ -41388,16 +41741,16 @@ const PendingInterceptorsFormatter = __nccwpck_require__(6142)
const { MockCallHistory } = __nccwpck_require__(431)
class MockAgent extends Dispatcher {
constructor (opts) {
constructor (opts = {}) {
super(opts)
const mockOptions = buildAndValidateMockOptions(opts)
this[kNetConnect] = true
this[kIsMockActive] = true
this[kMockAgentIsCallHistoryEnabled] = mockOptions?.enableCallHistory ?? false
this[kMockAgentAcceptsNonStandardSearchParameters] = mockOptions?.acceptNonStandardSearchParameters ?? false
this[kIgnoreTrailingSlash] = mockOptions?.ignoreTrailingSlash ?? false
this[kMockAgentIsCallHistoryEnabled] = mockOptions.enableCallHistory ?? false
this[kMockAgentAcceptsNonStandardSearchParameters] = mockOptions.acceptNonStandardSearchParameters ?? false
this[kIgnoreTrailingSlash] = mockOptions.ignoreTrailingSlash ?? false
// Instantiate Agent and encapsulate
if (opts?.agent && typeof opts.agent.dispatch !== 'function') {
@@ -41931,6 +42284,8 @@ module.exports = MockClient
const { UndiciError } = __nccwpck_require__(8707)
const kMockNotMatchedError = Symbol.for('undici.error.UND_MOCK_ERR_MOCK_NOT_MATCHED')
/**
* The request does not match any registered mock dispatches.
*/
@@ -41941,6 +42296,14 @@ class MockNotMatchedError extends UndiciError {
this.message = message || 'The request does not match any registered mock dispatches'
this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED'
}
static [Symbol.hasInstance] (instance) {
return instance && instance[kMockNotMatchedError] === true
}
get [kMockNotMatchedError] () {
return true
}
}
module.exports = {
@@ -42655,7 +43018,7 @@ function buildMockDispatch () {
try {
mockDispatch.call(this, opts, handler)
} catch (error) {
if (error instanceof MockNotMatchedError) {
if (error.code === 'UND_MOCK_ERR_MOCK_NOT_MATCHED') {
const netConnect = agent[kGetNetConnect]()
if (netConnect === false) {
throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`)
@@ -42686,19 +43049,21 @@ function checkNetConnect (netConnect, origin) {
}
function buildAndValidateMockOptions (opts) {
if (opts) {
const { agent, ...mockOptions } = opts
const { agent, ...mockOptions } = opts
if ('enableCallHistory' in mockOptions && typeof mockOptions.enableCallHistory !== '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
if ('enableCallHistory' in mockOptions && typeof mockOptions.enableCallHistory !== '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')
}
if ('ignoreTrailingSlash' in mockOptions && typeof mockOptions.ignoreTrailingSlash !== 'boolean') {
throw new InvalidArgumentError('options.ignoreTrailingSlash must to be a boolean')
}
return mockOptions
}
module.exports = {
@@ -44274,33 +44639,21 @@ module.exports = {
"use strict";
const IMF_DAYS = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
const IMF_SPACES = [4, 7, 11, 16, 25]
const IMF_MONTHS = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec']
const IMF_COLONS = [19, 22]
const ASCTIME_SPACES = [3, 7, 10, 19]
const RFC850_DAYS = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']
/**
* @see https://www.rfc-editor.org/rfc/rfc9110.html#name-date-time-formats
*
* @param {string} date
* @param {Date} [now]
* @returns {Date | undefined}
*/
function parseHttpDate (date, now) {
function parseHttpDate (date) {
// Sun, 06 Nov 1994 08:49:37 GMT ; IMF-fixdate
// Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
// Sunday, 06-Nov-94 08:49:37 GMT ; obsolete RFC 850 format
date = date.toLowerCase()
switch (date[3]) {
case ',': return parseImfDate(date)
case ' ': return parseAscTimeDate(date)
default: return parseRfc850Date(date, now)
default: return parseRfc850Date(date)
}
}
@@ -44311,69 +44664,207 @@ function parseHttpDate (date, now) {
* @returns {Date | undefined}
*/
function parseImfDate (date) {
if (date.length !== 29) {
if (
date.length !== 29 ||
date[4] !== ' ' ||
date[7] !== ' ' ||
date[11] !== ' ' ||
date[16] !== ' ' ||
date[19] !== ':' ||
date[22] !== ':' ||
date[25] !== ' ' ||
date[26] !== 'G' ||
date[27] !== 'M' ||
date[28] !== 'T'
) {
return undefined
}
if (!date.endsWith('gmt')) {
// Unsupported timezone
return undefined
let weekday = -1
if (date[0] === 'S' && date[1] === 'u' && date[2] === 'n') { // Sunday
weekday = 0
} else if (date[0] === 'M' && date[1] === 'o' && date[2] === 'n') { // Monday
weekday = 1
} else if (date[0] === 'T' && date[1] === 'u' && date[2] === 'e') { // Tuesday
weekday = 2
} else if (date[0] === 'W' && date[1] === 'e' && date[2] === 'd') { // Wednesday
weekday = 3
} else if (date[0] === 'T' && date[1] === 'h' && date[2] === 'u') { // Thursday
weekday = 4
} else if (date[0] === 'F' && date[1] === 'r' && date[2] === 'i') { // Friday
weekday = 5
} else if (date[0] === 'S' && date[1] === 'a' && date[2] === 't') { // Saturday
weekday = 6
} else {
return undefined // Not a valid day of the week
}
for (const spaceInx of IMF_SPACES) {
if (date[spaceInx] !== ' ') {
return undefined
let day = 0
if (date[5] === '0') {
// Single digit day, e.g. "Sun Nov 6 08:49:37 1994"
const code = date.charCodeAt(6)
if (code < 49 || code > 57) {
return undefined // Not a digit
}
}
for (const colonIdx of IMF_COLONS) {
if (date[colonIdx] !== ':') {
return undefined
day = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(5)
if (code1 < 49 || code1 > 51) {
return undefined // Not a digit between 1 and 3
}
const code2 = date.charCodeAt(6)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
day = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const dayName = date.substring(0, 3)
if (!IMF_DAYS.includes(dayName)) {
let monthIdx = -1
if (
(date[8] === 'J' && date[9] === 'a' && date[10] === 'n')
) {
monthIdx = 0 // Jan
} else if (
(date[8] === 'F' && date[9] === 'e' && date[10] === 'b')
) {
monthIdx = 1 // Feb
} else if (
(date[8] === 'M' && date[9] === 'a')
) {
if (date[10] === 'r') {
monthIdx = 2 // Mar
} else if (date[10] === 'y') {
monthIdx = 4 // May
} else {
return undefined // Invalid month
}
} else if (
(date[8] === 'J')
) {
if (date[9] === 'a' && date[10] === 'n') {
monthIdx = 0 // Jan
} else if (date[9] === 'u') {
if (date[10] === 'n') {
monthIdx = 5 // Jun
} else if (date[10] === 'l') {
monthIdx = 6 // Jul
} else {
return undefined // Invalid month
}
} else {
return undefined // Invalid month
}
} else if (
(date[8] === 'A')
) {
if (date[9] === 'p' && date[10] === 'r') {
monthIdx = 3 // Apr
} else if (date[9] === 'u' && date[10] === 'g') {
monthIdx = 7 // Aug
} else {
return undefined // Invalid month
}
} else if (
(date[8] === 'S' && date[9] === 'e' && date[10] === 'p')
) {
monthIdx = 8 // Sep
} else if (
(date[8] === 'O' && date[9] === 'c' && date[10] === 't')
) {
monthIdx = 9 // Oct
} else if (
(date[8] === 'N' && date[9] === 'o' && date[10] === 'v')
) {
monthIdx = 10 // Nov
} else if (
(date[8] === 'D' && date[9] === 'e' && date[10] === 'c')
) {
monthIdx = 11 // Dec
} else {
// Not a valid month
return undefined
}
const dayString = date.substring(5, 7)
const day = Number.parseInt(dayString)
if (isNaN(day) || (day < 10 && dayString[0] !== '0')) {
// Not a number, 0, or it's less than 10 and didn't start with a 0
return undefined
const yearDigit1 = date.charCodeAt(12)
if (yearDigit1 < 48 || yearDigit1 > 57) {
return undefined // Not a digit
}
const yearDigit2 = date.charCodeAt(13)
if (yearDigit2 < 48 || yearDigit2 > 57) {
return undefined // Not a digit
}
const yearDigit3 = date.charCodeAt(14)
if (yearDigit3 < 48 || yearDigit3 > 57) {
return undefined // Not a digit
}
const yearDigit4 = date.charCodeAt(15)
if (yearDigit4 < 48 || yearDigit4 > 57) {
return undefined // Not a digit
}
const year = (yearDigit1 - 48) * 1000 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48)
let hour = 0
if (date[17] === '0') {
const code = date.charCodeAt(18)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
hour = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(17)
if (code1 < 48 || code1 > 50) {
return undefined // Not a digit between 0 and 2
}
const code2 = date.charCodeAt(18)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
if (code1 === 50 && code2 > 51) {
return undefined // Hour cannot be greater than 23
}
hour = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const month = date.substring(8, 11)
const monthIdx = IMF_MONTHS.indexOf(month)
if (monthIdx === -1) {
return undefined
let minute = 0
if (date[20] === '0') {
const code = date.charCodeAt(21)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
minute = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(20)
if (code1 < 48 || code1 > 53) {
return undefined // Not a digit between 0 and 5
}
const code2 = date.charCodeAt(21)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
minute = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const year = Number.parseInt(date.substring(12, 16))
if (isNaN(year)) {
return undefined
let second = 0
if (date[23] === '0') {
const code = date.charCodeAt(24)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
second = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(23)
if (code1 < 48 || code1 > 53) {
return undefined // Not a digit between 0 and 5
}
const code2 = date.charCodeAt(24)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
second = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const hourString = date.substring(17, 19)
const hour = Number.parseInt(hourString)
if (isNaN(hour) || (hour < 10 && hourString[0] !== '0')) {
return undefined
}
const minuteString = date.substring(20, 22)
const minute = Number.parseInt(minuteString)
if (isNaN(minute) || (minute < 10 && minuteString[0] !== '0')) {
return undefined
}
const secondString = date.substring(23, 25)
const second = Number.parseInt(secondString)
if (isNaN(second) || (second < 10 && secondString[0] !== '0')) {
return undefined
}
return new Date(Date.UTC(year, monthIdx, day, hour, minute, second))
const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second))
return result.getUTCDay() === weekday ? result : undefined
}
/**
@@ -44385,147 +44876,415 @@ function parseImfDate (date) {
function parseAscTimeDate (date) {
// This is assumed to be in UTC
if (date.length !== 24) {
if (
date.length !== 24 ||
date[7] !== ' ' ||
date[10] !== ' ' ||
date[19] !== ' '
) {
return undefined
}
for (const spaceIdx of ASCTIME_SPACES) {
if (date[spaceIdx] !== ' ') {
return undefined
let weekday = -1
if (date[0] === 'S' && date[1] === 'u' && date[2] === 'n') { // Sunday
weekday = 0
} else if (date[0] === 'M' && date[1] === 'o' && date[2] === 'n') { // Monday
weekday = 1
} else if (date[0] === 'T' && date[1] === 'u' && date[2] === 'e') { // Tuesday
weekday = 2
} else if (date[0] === 'W' && date[1] === 'e' && date[2] === 'd') { // Wednesday
weekday = 3
} else if (date[0] === 'T' && date[1] === 'h' && date[2] === 'u') { // Thursday
weekday = 4
} else if (date[0] === 'F' && date[1] === 'r' && date[2] === 'i') { // Friday
weekday = 5
} else if (date[0] === 'S' && date[1] === 'a' && date[2] === 't') { // Saturday
weekday = 6
} else {
return undefined // Not a valid day of the week
}
let monthIdx = -1
if (
(date[4] === 'J' && date[5] === 'a' && date[6] === 'n')
) {
monthIdx = 0 // Jan
} else if (
(date[4] === 'F' && date[5] === 'e' && date[6] === 'b')
) {
monthIdx = 1 // Feb
} else if (
(date[4] === 'M' && date[5] === 'a')
) {
if (date[6] === 'r') {
monthIdx = 2 // Mar
} else if (date[6] === 'y') {
monthIdx = 4 // May
} else {
return undefined // Invalid month
}
}
const dayName = date.substring(0, 3)
if (!IMF_DAYS.includes(dayName)) {
} else if (
(date[4] === 'J')
) {
if (date[5] === 'a' && date[6] === 'n') {
monthIdx = 0 // Jan
} else if (date[5] === 'u') {
if (date[6] === 'n') {
monthIdx = 5 // Jun
} else if (date[6] === 'l') {
monthIdx = 6 // Jul
} else {
return undefined // Invalid month
}
} else {
return undefined // Invalid month
}
} else if (
(date[4] === 'A')
) {
if (date[5] === 'p' && date[6] === 'r') {
monthIdx = 3 // Apr
} else if (date[5] === 'u' && date[6] === 'g') {
monthIdx = 7 // Aug
} else {
return undefined // Invalid month
}
} else if (
(date[4] === 'S' && date[5] === 'e' && date[6] === 'p')
) {
monthIdx = 8 // Sep
} else if (
(date[4] === 'O' && date[5] === 'c' && date[6] === 't')
) {
monthIdx = 9 // Oct
} else if (
(date[4] === 'N' && date[5] === 'o' && date[6] === 'v')
) {
monthIdx = 10 // Nov
} else if (
(date[4] === 'D' && date[5] === 'e' && date[6] === 'c')
) {
monthIdx = 11 // Dec
} else {
// Not a valid month
return undefined
}
const month = date.substring(4, 7)
const monthIdx = IMF_MONTHS.indexOf(month)
if (monthIdx === -1) {
return undefined
let day = 0
if (date[8] === ' ') {
// Single digit day, e.g. "Sun Nov 6 08:49:37 1994"
const code = date.charCodeAt(9)
if (code < 49 || code > 57) {
return undefined // Not a digit
}
day = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(8)
if (code1 < 49 || code1 > 51) {
return undefined // Not a digit between 1 and 3
}
const code2 = date.charCodeAt(9)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
day = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const dayString = date.substring(8, 10)
const day = Number.parseInt(dayString)
if (isNaN(day) || (day < 10 && dayString[0] !== ' ')) {
return undefined
let hour = 0
if (date[11] === '0') {
const code = date.charCodeAt(12)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
hour = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(11)
if (code1 < 48 || code1 > 50) {
return undefined // Not a digit between 0 and 2
}
const code2 = date.charCodeAt(12)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
if (code1 === 50 && code2 > 51) {
return undefined // Hour cannot be greater than 23
}
hour = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const hourString = date.substring(11, 13)
const hour = Number.parseInt(hourString)
if (isNaN(hour) || (hour < 10 && hourString[0] !== '0')) {
return undefined
let minute = 0
if (date[14] === '0') {
const code = date.charCodeAt(15)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
minute = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(14)
if (code1 < 48 || code1 > 53) {
return undefined // Not a digit between 0 and 5
}
const code2 = date.charCodeAt(15)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
minute = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const minuteString = date.substring(14, 16)
const minute = Number.parseInt(minuteString)
if (isNaN(minute) || (minute < 10 && minuteString[0] !== '0')) {
return undefined
let second = 0
if (date[17] === '0') {
const code = date.charCodeAt(18)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
second = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(17)
if (code1 < 48 || code1 > 53) {
return undefined // Not a digit between 0 and 5
}
const code2 = date.charCodeAt(18)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
second = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const secondString = date.substring(17, 19)
const second = Number.parseInt(secondString)
if (isNaN(second) || (second < 10 && secondString[0] !== '0')) {
return undefined
const yearDigit1 = date.charCodeAt(20)
if (yearDigit1 < 48 || yearDigit1 > 57) {
return undefined // Not a digit
}
const year = Number.parseInt(date.substring(20, 24))
if (isNaN(year)) {
return undefined
const yearDigit2 = date.charCodeAt(21)
if (yearDigit2 < 48 || yearDigit2 > 57) {
return undefined // Not a digit
}
const yearDigit3 = date.charCodeAt(22)
if (yearDigit3 < 48 || yearDigit3 > 57) {
return undefined // Not a digit
}
const yearDigit4 = date.charCodeAt(23)
if (yearDigit4 < 48 || yearDigit4 > 57) {
return undefined // Not a digit
}
const year = (yearDigit1 - 48) * 1000 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48)
return new Date(Date.UTC(year, monthIdx, day, hour, minute, second))
const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second))
return result.getUTCDay() === weekday ? result : undefined
}
/**
* @see https://httpwg.org/specs/rfc9110.html#obsolete.date.formats
*
* @param {string} date
* @param {Date} [now]
* @returns {Date | undefined}
*/
function parseRfc850Date (date, now = new Date()) {
if (!date.endsWith('gmt')) {
// Unsupported timezone
return undefined
}
function parseRfc850Date (date) {
let commaIndex = -1
const commaIndex = date.indexOf(',')
if (commaIndex === -1) {
return undefined
}
if ((date.length - commaIndex - 1) !== 23) {
return undefined
}
const dayName = date.substring(0, commaIndex)
if (!RFC850_DAYS.includes(dayName)) {
let weekday = -1
if (date[0] === 'S') {
if (date[1] === 'u' && date[2] === 'n' && date[3] === 'd' && date[4] === 'a' && date[5] === 'y') {
weekday = 0 // Sunday
commaIndex = 6
} else if (date[1] === 'a' && date[2] === 't' && date[3] === 'u' && date[4] === 'r' && date[5] === 'd' && date[6] === 'a' && date[7] === 'y') {
weekday = 6 // Saturday
commaIndex = 8
}
} else if (date[0] === 'M' && date[1] === 'o' && date[2] === 'n' && date[3] === 'd' && date[4] === 'a' && date[5] === 'y') {
weekday = 1 // Monday
commaIndex = 6
} else if (date[0] === 'T') {
if (date[1] === 'u' && date[2] === 'e' && date[3] === 's' && date[4] === 'd' && date[5] === 'a' && date[6] === 'y') {
weekday = 2 // Tuesday
commaIndex = 7
} else if (date[1] === 'h' && date[2] === 'u' && date[3] === 'r' && date[4] === 's' && date[5] === 'd' && date[6] === 'a' && date[7] === 'y') {
weekday = 4 // Thursday
commaIndex = 8
}
} else if (date[0] === 'W' && date[1] === 'e' && date[2] === 'd' && date[3] === 'n' && date[4] === 'e' && date[5] === 's' && date[6] === 'd' && date[7] === 'a' && date[8] === 'y') {
weekday = 3 // Wednesday
commaIndex = 9
} else if (date[0] === 'F' && date[1] === 'r' && date[2] === 'i' && date[3] === 'd' && date[4] === 'a' && date[5] === 'y') {
weekday = 5 // Friday
commaIndex = 6
} else {
// Not a valid day name
return undefined
}
if (
date[commaIndex] !== ',' ||
(date.length - commaIndex - 1) !== 23 ||
date[commaIndex + 1] !== ' ' ||
date[commaIndex + 4] !== '-' ||
date[commaIndex + 8] !== '-' ||
date[commaIndex + 11] !== ' ' ||
date[commaIndex + 14] !== ':' ||
date[commaIndex + 17] !== ':' ||
date[commaIndex + 20] !== ' '
date[commaIndex + 20] !== ' ' ||
date[commaIndex + 21] !== 'G' ||
date[commaIndex + 22] !== 'M' ||
date[commaIndex + 23] !== 'T'
) {
return undefined
}
const dayString = date.substring(commaIndex + 2, commaIndex + 4)
const day = Number.parseInt(dayString)
if (isNaN(day) || (day < 10 && dayString[0] !== '0')) {
// Not a number, or it's less than 10 and didn't start with a 0
return undefined
}
const month = date.substring(commaIndex + 5, commaIndex + 8)
const monthIdx = IMF_MONTHS.indexOf(month)
if (monthIdx === -1) {
return undefined
}
// As of this point year is just the decade (i.e. 94)
let year = Number.parseInt(date.substring(commaIndex + 9, commaIndex + 11))
if (isNaN(year)) {
return undefined
}
const currentYear = now.getUTCFullYear()
const currentDecade = currentYear % 100
const currentCentury = Math.floor(currentYear / 100)
if (year > currentDecade && year - currentDecade >= 50) {
// Over 50 years in future, go to previous century
year += (currentCentury - 1) * 100
let day = 0
if (date[commaIndex + 2] === '0') {
// Single digit day, e.g. "Sun Nov 6 08:49:37 1994"
const code = date.charCodeAt(commaIndex + 3)
if (code < 49 || code > 57) {
return undefined // Not a digit
}
day = code - 48 // Convert ASCII code to number
} else {
year += currentCentury * 100
const code1 = date.charCodeAt(commaIndex + 2)
if (code1 < 49 || code1 > 51) {
return undefined // Not a digit between 1 and 3
}
const code2 = date.charCodeAt(commaIndex + 3)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
day = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const hourString = date.substring(commaIndex + 12, commaIndex + 14)
const hour = Number.parseInt(hourString)
if (isNaN(hour) || (hour < 10 && hourString[0] !== '0')) {
let monthIdx = -1
if (
(date[commaIndex + 5] === 'J' && date[commaIndex + 6] === 'a' && date[commaIndex + 7] === 'n')
) {
monthIdx = 0 // Jan
} else if (
(date[commaIndex + 5] === 'F' && date[commaIndex + 6] === 'e' && date[commaIndex + 7] === 'b')
) {
monthIdx = 1 // Feb
} else if (
(date[commaIndex + 5] === 'M' && date[commaIndex + 6] === 'a' && date[commaIndex + 7] === 'r')
) {
monthIdx = 2 // Mar
} else if (
(date[commaIndex + 5] === 'A' && date[commaIndex + 6] === 'p' && date[commaIndex + 7] === 'r')
) {
monthIdx = 3 // Apr
} else if (
(date[commaIndex + 5] === 'M' && date[commaIndex + 6] === 'a' && date[commaIndex + 7] === 'y')
) {
monthIdx = 4 // May
} else if (
(date[commaIndex + 5] === 'J' && date[commaIndex + 6] === 'u' && date[commaIndex + 7] === 'n')
) {
monthIdx = 5 // Jun
} else if (
(date[commaIndex + 5] === 'J' && date[commaIndex + 6] === 'u' && date[commaIndex + 7] === 'l')
) {
monthIdx = 6 // Jul
} else if (
(date[commaIndex + 5] === 'A' && date[commaIndex + 6] === 'u' && date[commaIndex + 7] === 'g')
) {
monthIdx = 7 // Aug
} else if (
(date[commaIndex + 5] === 'S' && date[commaIndex + 6] === 'e' && date[commaIndex + 7] === 'p')
) {
monthIdx = 8 // Sep
} else if (
(date[commaIndex + 5] === 'O' && date[commaIndex + 6] === 'c' && date[commaIndex + 7] === 't')
) {
monthIdx = 9 // Oct
} else if (
(date[commaIndex + 5] === 'N' && date[commaIndex + 6] === 'o' && date[commaIndex + 7] === 'v')
) {
monthIdx = 10 // Nov
} else if (
(date[commaIndex + 5] === 'D' && date[commaIndex + 6] === 'e' && date[commaIndex + 7] === 'c')
) {
monthIdx = 11 // Dec
} else {
// Not a valid month
return undefined
}
const minuteString = date.substring(commaIndex + 15, commaIndex + 17)
const minute = Number.parseInt(minuteString)
if (isNaN(minute) || (minute < 10 && minuteString[0] !== '0')) {
return undefined
const yearDigit1 = date.charCodeAt(commaIndex + 9)
if (yearDigit1 < 48 || yearDigit1 > 57) {
return undefined // Not a digit
}
const yearDigit2 = date.charCodeAt(commaIndex + 10)
if (yearDigit2 < 48 || yearDigit2 > 57) {
return undefined // Not a digit
}
const secondString = date.substring(commaIndex + 18, commaIndex + 20)
const second = Number.parseInt(secondString)
if (isNaN(second) || (second < 10 && secondString[0] !== '0')) {
return undefined
let year = (yearDigit1 - 48) * 10 + (yearDigit2 - 48) // Convert ASCII codes to number
// RFC 6265 states that the year is in the range 1970-2069.
// @see https://datatracker.ietf.org/doc/html/rfc6265#section-5.1.1
//
// 3. If the year-value is greater than or equal to 70 and less than or
// equal to 99, increment the year-value by 1900.
// 4. If the year-value is greater than or equal to 0 and less than or
// equal to 69, increment the year-value by 2000.
year += year < 70 ? 2000 : 1900
let hour = 0
if (date[commaIndex + 12] === '0') {
const code = date.charCodeAt(commaIndex + 13)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
hour = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(commaIndex + 12)
if (code1 < 48 || code1 > 50) {
return undefined // Not a digit between 0 and 2
}
const code2 = date.charCodeAt(commaIndex + 13)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
if (code1 === 50 && code2 > 51) {
return undefined // Hour cannot be greater than 23
}
hour = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
return new Date(Date.UTC(year, monthIdx, day, hour, minute, second))
let minute = 0
if (date[commaIndex + 15] === '0') {
const code = date.charCodeAt(commaIndex + 16)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
minute = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(commaIndex + 15)
if (code1 < 48 || code1 > 53) {
return undefined // Not a digit between 0 and 5
}
const code2 = date.charCodeAt(commaIndex + 16)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
minute = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
let second = 0
if (date[commaIndex + 18] === '0') {
const code = date.charCodeAt(commaIndex + 19)
if (code < 48 || code > 57) {
return undefined // Not a digit
}
second = code - 48 // Convert ASCII code to number
} else {
const code1 = date.charCodeAt(commaIndex + 18)
if (code1 < 48 || code1 > 53) {
return undefined // Not a digit between 0 and 5
}
const code2 = date.charCodeAt(commaIndex + 19)
if (code2 < 48 || code2 > 57) {
return undefined // Not a digit
}
second = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number
}
const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second))
return result.getUTCDay() === weekday ? result : undefined
}
module.exports = {
@@ -46341,7 +47100,7 @@ webidl.converters.Cookie = webidl.dictionaryConverter([
{
converter: webidl.sequenceConverter(webidl.converters.DOMString),
key: 'unparsed',
defaultValue: () => new Array(0)
defaultValue: () => []
}
])
@@ -47218,7 +47977,7 @@ class EventSourceStream extends Transform {
this.buffer = this.buffer.subarray(this.pos + 1)
this.pos = 0
if (
this.event.data !== undefined || this.event.event || this.event.id || this.event.retry) {
this.event.data !== undefined || this.event.event || this.event.id !== undefined || this.event.retry) {
this.processEvent(this.event)
}
this.clearEvent()
@@ -47349,7 +48108,7 @@ class EventSourceStream extends Transform {
this.state.reconnectionTime = parseInt(event.retry, 10)
}
if (event.id && isValidLastEventId(event.id)) {
if (event.id !== undefined && isValidLastEventId(event.id)) {
this.state.lastEventId = event.id
}
@@ -47397,7 +48156,6 @@ const { EventSourceStream } = __nccwpck_require__(4031)
const { parseMIMEType } = __nccwpck_require__(1900)
const { createFastMessageEvent } = __nccwpck_require__(5188)
const { isNetworkError } = __nccwpck_require__(9051)
const { delay } = __nccwpck_require__(4811)
const { kEnumerableProperty } = __nccwpck_require__(3440)
const { environmentSettingsObject } = __nccwpck_require__(3168)
@@ -47707,9 +48465,9 @@ class EventSource extends EventTarget {
/**
* @see https://html.spec.whatwg.org/multipage/server-sent-events.html#sse-processing-model
* @returns {Promise<void>}
* @returns {void}
*/
async #reconnect () {
#reconnect () {
// When a user agent is to reestablish the connection, the user agent must
// run the following steps. These steps are run in parallel, not as part of
// a task. (The tasks that it queues, of course, are run like normal tasks
@@ -47727,27 +48485,27 @@ class EventSource extends EventTarget {
this.dispatchEvent(new Event('error'))
// 2. Wait a delay equal to the reconnection time of the event source.
await delay(this.#state.reconnectionTime)
setTimeout(() => {
// 5. Queue a task to run the following steps:
// 5. Queue a task to run the following steps:
// 1. If the EventSource object's readyState attribute is not set to
// CONNECTING, then return.
if (this.#readyState !== CONNECTING) return
// 1. If the EventSource object's readyState attribute is not set to
// CONNECTING, then return.
if (this.#readyState !== CONNECTING) return
// 2. Let request be the EventSource object's request.
// 3. If the EventSource object's last event ID string is not the empty
// string, then:
// 1. Let lastEventIDValue be the EventSource object's last event ID
// string, encoded as UTF-8.
// 2. Set (`Last-Event-ID`, lastEventIDValue) in request's header
// list.
if (this.#state.lastEventId.length) {
this.#request.headersList.set('last-event-id', this.#state.lastEventId, true)
}
// 2. Let request be the EventSource object's request.
// 3. If the EventSource object's last event ID string is not the empty
// string, then:
// 1. Let lastEventIDValue be the EventSource object's last event ID
// string, encoded as UTF-8.
// 2. Set (`Last-Event-ID`, lastEventIDValue) in request's header
// list.
if (this.#state.lastEventId.length) {
this.#request.headersList.set('last-event-id', this.#state.lastEventId, true)
}
// 4. Fetch request and process the response obtained in this fashion, if any, as described earlier in this section.
this.#connect()
// 4. Fetch request and process the response obtained in this fashion, if any, as described earlier in this section.
this.#connect()
}, this.#state.reconnectionTime)?.unref()
}
/**
@@ -47772,9 +48530,11 @@ class EventSource extends EventTarget {
this.removeEventListener('open', this.#events.open)
}
if (typeof fn === 'function') {
const listener = webidl.converters.EventHandlerNonNull(fn)
if (listener !== null) {
this.addEventListener('open', listener)
this.#events.open = fn
this.addEventListener('open', fn)
} else {
this.#events.open = null
}
@@ -47789,9 +48549,11 @@ class EventSource extends EventTarget {
this.removeEventListener('message', this.#events.message)
}
if (typeof fn === 'function') {
const listener = webidl.converters.EventHandlerNonNull(fn)
if (listener !== null) {
this.addEventListener('message', listener)
this.#events.message = fn
this.addEventListener('message', fn)
} else {
this.#events.message = null
}
@@ -47806,9 +48568,11 @@ class EventSource extends EventTarget {
this.removeEventListener('error', this.#events.error)
}
if (typeof fn === 'function') {
const listener = webidl.converters.EventHandlerNonNull(fn)
if (listener !== null) {
this.addEventListener('error', listener)
this.#events.error = fn
this.addEventListener('error', fn)
} else {
this.#events.error = null
}
@@ -47916,17 +48680,9 @@ function isASCIINumber (value) {
return true
}
// https://github.com/nodejs/undici/issues/2664
function delay (ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms)
})
}
module.exports = {
isValidLastEventId,
isASCIINumber,
delay
isASCIINumber
}
@@ -47998,7 +48754,7 @@ function extractBody (object, keepalive = false) {
// 4. Otherwise, set stream to a new ReadableStream object, and set
// up stream with byte reading support.
stream = new ReadableStream({
async pull (controller) {
pull (controller) {
const buffer = typeof source === 'string' ? textEncoder.encode(source) : source
if (buffer.byteLength) {
@@ -48048,16 +48804,10 @@ function extractBody (object, keepalive = false) {
// Set type to `application/x-www-form-urlencoded;charset=UTF-8`.
type = 'application/x-www-form-urlencoded;charset=UTF-8'
} else if (isArrayBuffer(object)) {
// BufferSource/ArrayBuffer
// Set source to a copy of the bytes held by object.
source = new Uint8Array(object.slice())
} else if (ArrayBuffer.isView(object)) {
// BufferSource/ArrayBufferView
// Set source to a copy of the bytes held by object.
source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength))
} else if (webidl.is.BufferSource(object)) {
source = isArrayBuffer(object)
? new Uint8Array(object.slice())
: new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength))
} else if (webidl.is.FormData(object)) {
const boundary = `----formdata-undici-0${`${random(1e11)}`.padStart(11, '0')}`
const prefix = `--${boundary}\r\nContent-Disposition: form-data`
@@ -48258,12 +49008,6 @@ function cloneBody (body) {
}
}
function throwIfAborted (state) {
if (state.aborted) {
throw new DOMException('The operation was aborted.', 'AbortError')
}
}
function bodyMixinMethods (instance, getInternalState) {
const methods = {
blob () {
@@ -48381,24 +49125,30 @@ function mixinBody (prototype, getInternalState) {
* @param {any} instance
* @param {(target: any) => any} getInternalState
*/
async function consumeBody (object, convertBytesToJSValue, instance, getInternalState) {
webidl.brandCheck(object, instance)
function consumeBody (object, convertBytesToJSValue, instance, getInternalState) {
try {
webidl.brandCheck(object, instance)
} catch (e) {
return Promise.reject(e)
}
const state = getInternalState(object)
// 1. If object is unusable, then return a promise rejected
// with a TypeError.
if (bodyUnusable(state)) {
throw new TypeError('Body is unusable: Body has already been read')
return Promise.reject(new TypeError('Body is unusable: Body has already been read'))
}
throwIfAborted(state)
if (state.aborted) {
return Promise.reject(new DOMException('The operation was aborted.', 'AbortError'))
}
// 2. Let promise be a new promise.
const promise = createDeferredPromise()
// 3. Let errorSteps given error be to reject promise with error.
const errorSteps = (error) => promise.reject(error)
const errorSteps = promise.reject
// 4. Let successSteps given a byte sequence data be to resolve
// promise with the result of running convertBytesToJSValue
@@ -50991,6 +51741,9 @@ const { webidl } = __nccwpck_require__(7879)
const { STATUS_CODES } = __nccwpck_require__(7067)
const { bytesMatch } = __nccwpck_require__(5082)
const { createDeferredPromise } = __nccwpck_require__(6436)
const hasZstd = typeof zlib.createZstdDecompress === 'function'
const GET_OR_HEAD = ['GET', 'HEAD']
const defaultUserAgent = typeof __UNDICI_IS_NODE__ !== 'undefined' || typeof esbuildDetection !== 'undefined'
@@ -53032,33 +53785,29 @@ async function httpNetworkFetch (
return false
}
/** @type {string[]} */
let codings = []
const headersList = new HeadersList()
for (let i = 0; i < rawHeaders.length; i += 2) {
headersList.append(bufferToLowerCasedHeaderName(rawHeaders[i]), rawHeaders[i + 1].toString('latin1'), true)
}
const contentEncoding = headersList.get('content-encoding', true)
if (contentEncoding) {
// https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1
// "All content-coding values are case-insensitive..."
codings = contentEncoding.toLowerCase().split(',').map((x) => x.trim())
}
const location = headersList.get('location', true)
this.body = new Readable({ read: resume })
const decoders = []
const willFollow = location && request.redirect === 'follow' &&
redirectStatusSet.has(status)
const decoders = []
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding
if (codings.length !== 0 && request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) {
if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) {
// https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1
const contentEncoding = headersList.get('content-encoding', true)
// "All content-coding values are case-insensitive..."
/** @type {string[]} */
const codings = contentEncoding ? contentEncoding.toLowerCase().split(',') : []
for (let i = codings.length - 1; i >= 0; --i) {
const coding = codings[i]
const coding = codings[i].trim()
// https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2
if (coding === 'x-gzip' || coding === 'gzip') {
decoders.push(zlib.createGunzip({
@@ -53079,8 +53828,8 @@ async function httpNetworkFetch (
flush: 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
} else if (coding === 'zstd' && hasZstd) {
// 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
@@ -54334,8 +55083,6 @@ const { URLSerializer } = __nccwpck_require__(1900)
const { kConstruct } = __nccwpck_require__(6443)
const assert = __nccwpck_require__(4589)
const { isArrayBuffer } = nodeUtil.types
const textEncoder = new TextEncoder('utf-8')
// https://fetch.spec.whatwg.org/#response-class
@@ -54431,7 +55178,7 @@ class Response {
}
if (body !== null) {
body = webidl.converters.BodyInit(body)
body = webidl.converters.BodyInit(body, 'Response', 'body')
}
init = webidl.converters.ResponseInit(init)
@@ -54891,7 +55638,7 @@ webidl.converters.XMLHttpRequestBodyInit = function (V, prefix, name) {
return V
}
if (ArrayBuffer.isView(V) || isArrayBuffer(V)) {
if (webidl.is.BufferSource(V)) {
return V
}
@@ -55463,8 +56210,8 @@ function determineRequestsReferrer (request) {
if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {
return 'no-referrer'
}
// 2. Return referrerOrigin
return referrerOrigin
// 2. Return referrerURL.
return referrerURL
}
}
}
@@ -55515,17 +56262,11 @@ function stripURLForReferrer (url, originOnly = false) {
return url
}
const potentialleTrustworthyIPv4RegExp = new RegExp('^(?:' +
'(?:127\\.)' +
'(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){2}' +
'(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])' +
')$')
const isPotentialleTrustworthyIPv4 = RegExp.prototype.test
.bind(/^127\.(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){2}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)$/)
const potentialleTrustworthyIPv6RegExp = new RegExp('^(?:' +
'(?:(?:0{1,4}):){7}(?:(?:0{0,3}1))|' +
'(?:(?:0{1,4}):){1,6}(?::(?:0{0,3}1))|' +
'(?:::(?:0{0,3}1))|' +
')$')
const isPotentiallyTrustworthyIPv6 = RegExp.prototype.test
.bind(/^(?:(?:0{1,4}:){7}|(?:0{1,4}:){1,6}:|::)0{0,3}1$/)
/**
* Check if host matches one of the CIDR notations 127.0.0.0/8 or ::1/128.
@@ -55540,11 +56281,11 @@ function isOriginIPPotentiallyTrustworthy (origin) {
if (origin[0] === '[' && origin[origin.length - 1] === ']') {
origin = origin.slice(1, -1)
}
return potentialleTrustworthyIPv6RegExp.test(origin)
return isPotentiallyTrustworthyIPv6(origin)
}
// IPv4
return potentialleTrustworthyIPv4RegExp.test(origin)
return isPotentialleTrustworthyIPv4(origin)
}
/**
@@ -57007,7 +57748,7 @@ webidl.util.TypeValueToString = function (o) {
webidl.util.markAsUncloneable = markAsUncloneable || (() => {})
// https://webidl.spec.whatwg.org/#abstract-opdef-converttoint
webidl.util.ConvertToInt = function (V, bitLength, signedness, opts) {
webidl.util.ConvertToInt = function (V, bitLength, signedness, flags) {
let upperBound
let lowerBound
@@ -57051,7 +57792,7 @@ webidl.util.ConvertToInt = function (V, bitLength, signedness, opts) {
// 6. If the conversion is to an IDL type associated
// with the [EnforceRange] extended attribute, then:
if (opts?.enforceRange === true) {
if (webidl.util.HasFlag(flags, webidl.attributes.EnforceRange)) {
// 1. If x is NaN, +∞, or −∞, then throw a TypeError.
if (
Number.isNaN(x) ||
@@ -57083,7 +57824,7 @@ webidl.util.ConvertToInt = function (V, bitLength, signedness, opts) {
// 7. If x is not NaN and the conversion is to an IDL
// type associated with the [Clamp] extended
// attribute, then:
if (!Number.isNaN(x) && opts?.clamp === true) {
if (!Number.isNaN(x) && webidl.util.HasFlag(flags, webidl.attributes.Clamp)) {
// 1. Set x to min(max(x, lowerBound), upperBound).
x = Math.min(Math.max(x, lowerBound), upperBound)
@@ -57157,6 +57898,25 @@ webidl.util.Stringify = function (V) {
}
}
webidl.util.IsResizableArrayBuffer = function (V) {
if (types.isArrayBuffer(V)) {
return V.resizable
}
if (types.isSharedArrayBuffer(V)) {
return V.growable
}
throw webidl.errors.exception({
header: 'IsResizableArrayBuffer',
message: `"${webidl.util.Stringify(V)}" is not an array buffer.`
})
}
webidl.util.HasFlag = function (flags, attributes) {
return typeof flags === 'number' && (flags & attributes) === attributes
}
// https://webidl.spec.whatwg.org/#es-sequence
webidl.sequenceConverter = function (converter) {
return (V, prefix, argument, Iterable) => {
@@ -57361,13 +58121,20 @@ webidl.is.URL = webidl.util.MakeTypeAssertion(URL)
webidl.is.AbortSignal = webidl.util.MakeTypeAssertion(AbortSignal)
webidl.is.MessagePort = webidl.util.MakeTypeAssertion(MessagePort)
webidl.is.BufferSource = function (V) {
return types.isArrayBuffer(V) || (
ArrayBuffer.isView(V) &&
types.isArrayBuffer(V.buffer)
)
}
// https://webidl.spec.whatwg.org/#es-DOMString
webidl.converters.DOMString = function (V, prefix, argument, opts) {
webidl.converters.DOMString = function (V, prefix, argument, flags) {
// 1. If V is null and the conversion is to an IDL type
// associated with the [LegacyNullToEmptyString]
// extended attribute, then return the DOMString value
// that represents the empty string.
if (V === null && opts?.legacyNullToEmptyString) {
if (V === null && webidl.util.HasFlag(flags, webidl.attributes.LegacyNullToEmptyString)) {
return ''
}
@@ -57446,7 +58213,7 @@ webidl.converters.any = function (V) {
// https://webidl.spec.whatwg.org/#es-long-long
webidl.converters['long long'] = function (V, prefix, argument) {
// 1. Let x be ? ConvertToInt(V, 64, "signed").
const x = webidl.util.ConvertToInt(V, 64, 'signed', undefined, prefix, argument)
const x = webidl.util.ConvertToInt(V, 64, 'signed', 0, prefix, argument)
// 2. Return the IDL long long value that represents
// the same numeric value as x.
@@ -57456,7 +58223,7 @@ webidl.converters['long long'] = function (V, prefix, argument) {
// https://webidl.spec.whatwg.org/#es-unsigned-long-long
webidl.converters['unsigned long long'] = function (V, prefix, argument) {
// 1. Let x be ? ConvertToInt(V, 64, "unsigned").
const x = webidl.util.ConvertToInt(V, 64, 'unsigned', undefined, prefix, argument)
const x = webidl.util.ConvertToInt(V, 64, 'unsigned', 0, prefix, argument)
// 2. Return the IDL unsigned long long value that
// represents the same numeric value as x.
@@ -57466,7 +58233,7 @@ webidl.converters['unsigned long long'] = function (V, prefix, argument) {
// https://webidl.spec.whatwg.org/#es-unsigned-long
webidl.converters['unsigned long'] = function (V, prefix, argument) {
// 1. Let x be ? ConvertToInt(V, 32, "unsigned").
const x = webidl.util.ConvertToInt(V, 32, 'unsigned', undefined, prefix, argument)
const x = webidl.util.ConvertToInt(V, 32, 'unsigned', 0, prefix, argument)
// 2. Return the IDL unsigned long value that
// represents the same numeric value as x.
@@ -57474,9 +58241,9 @@ webidl.converters['unsigned long'] = function (V, prefix, argument) {
}
// https://webidl.spec.whatwg.org/#es-unsigned-short
webidl.converters['unsigned short'] = function (V, prefix, argument, opts) {
webidl.converters['unsigned short'] = function (V, prefix, argument, flags) {
// 1. Let x be ? ConvertToInt(V, 16, "unsigned").
const x = webidl.util.ConvertToInt(V, 16, 'unsigned', opts, prefix, argument)
const x = webidl.util.ConvertToInt(V, 16, 'unsigned', flags, prefix, argument)
// 2. Return the IDL unsigned short value that represents
// the same numeric value as x.
@@ -57484,15 +58251,16 @@ webidl.converters['unsigned short'] = function (V, prefix, argument, opts) {
}
// https://webidl.spec.whatwg.org/#idl-ArrayBuffer
webidl.converters.ArrayBuffer = function (V, prefix, argument, opts) {
// 1. If Type(V) is not Object, or V does not have an
webidl.converters.ArrayBuffer = function (V, prefix, argument, flags) {
// 1. If V is not an Object, or V does not have an
// [[ArrayBufferData]] internal slot, then throw a
// TypeError.
// 2. If IsSharedArrayBuffer(V) is true, then throw a
// TypeError.
// see: https://tc39.es/ecma262/#sec-properties-of-the-arraybuffer-instances
// see: https://tc39.es/ecma262/#sec-properties-of-the-sharedarraybuffer-instances
if (
webidl.util.Type(V) !== OBJECT ||
!types.isAnyArrayBuffer(V)
!types.isArrayBuffer(V)
) {
throw webidl.errors.conversionFailed({
prefix,
@@ -57501,25 +58269,14 @@ webidl.converters.ArrayBuffer = function (V, prefix, argument, opts) {
})
}
// 2. If the conversion is not to an IDL type associated
// with the [AllowShared] extended attribute, and
// IsSharedArrayBuffer(V) is true, then throw a
// TypeError.
if (opts?.allowShared === false && types.isSharedArrayBuffer(V)) {
throw webidl.errors.exception({
header: 'ArrayBuffer',
message: 'SharedArrayBuffer is not allowed.'
})
}
// 3. If the conversion is not to an IDL type associated
// with the [AllowResizable] extended attribute, and
// IsResizableArrayBuffer(V) is true, then throw a
// TypeError.
if (V.resizable || V.growable) {
if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V)) {
throw webidl.errors.exception({
header: 'ArrayBuffer',
message: 'Received a resizable ArrayBuffer.'
header: prefix,
message: `${argument} cannot be a resizable ArrayBuffer.`
})
}
@@ -57528,7 +58285,43 @@ webidl.converters.ArrayBuffer = function (V, prefix, argument, opts) {
return V
}
webidl.converters.TypedArray = function (V, T, prefix, name, opts) {
// https://webidl.spec.whatwg.org/#idl-SharedArrayBuffer
webidl.converters.SharedArrayBuffer = function (V, prefix, argument, flags) {
// 1. If V is not an Object, or V does not have an
// [[ArrayBufferData]] internal slot, then throw a
// TypeError.
// 2. If IsSharedArrayBuffer(V) is false, then throw a
// TypeError.
// see: https://tc39.es/ecma262/#sec-properties-of-the-sharedarraybuffer-instances
if (
webidl.util.Type(V) !== OBJECT ||
!types.isSharedArrayBuffer(V)
) {
throw webidl.errors.conversionFailed({
prefix,
argument: `${argument} ("${webidl.util.Stringify(V)}")`,
types: ['SharedArrayBuffer']
})
}
// 3. If the conversion is not to an IDL type associated
// with the [AllowResizable] extended attribute, and
// IsResizableArrayBuffer(V) is true, then throw a
// TypeError.
if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V)) {
throw webidl.errors.exception({
header: prefix,
message: `${argument} cannot be a resizable SharedArrayBuffer.`
})
}
// 4. Return the IDL SharedArrayBuffer value that is a
// reference to the same object as V.
return V
}
// https://webidl.spec.whatwg.org/#dfn-typed-array-type
webidl.converters.TypedArray = function (V, T, prefix, argument, flags) {
// 1. Let T be the IDL type V is being converted to.
// 2. If Type(V) is not Object, or V does not have a
@@ -57541,7 +58334,7 @@ webidl.converters.TypedArray = function (V, T, prefix, name, opts) {
) {
throw webidl.errors.conversionFailed({
prefix,
argument: `${name} ("${webidl.util.Stringify(V)}")`,
argument: `${argument} ("${webidl.util.Stringify(V)}")`,
types: [T.name]
})
}
@@ -57550,10 +58343,10 @@ webidl.converters.TypedArray = function (V, T, prefix, name, opts) {
// with the [AllowShared] extended attribute, and
// IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is
// true, then throw a TypeError.
if (opts?.allowShared === false && types.isSharedArrayBuffer(V.buffer)) {
if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) {
throw webidl.errors.exception({
header: 'ArrayBuffer',
message: 'SharedArrayBuffer is not allowed.'
header: prefix,
message: `${argument} cannot be a view on a shared array buffer.`
})
}
@@ -57561,10 +58354,10 @@ webidl.converters.TypedArray = function (V, T, prefix, name, opts) {
// with the [AllowResizable] extended attribute, and
// IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is
// true, then throw a TypeError.
if (V.buffer.resizable || V.buffer.growable) {
if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) {
throw webidl.errors.exception({
header: 'ArrayBuffer',
message: 'Received a resizable ArrayBuffer.'
header: prefix,
message: `${argument} cannot be a view on a resizable array buffer.`
})
}
@@ -57573,13 +58366,15 @@ webidl.converters.TypedArray = function (V, T, prefix, name, opts) {
return V
}
webidl.converters.DataView = function (V, prefix, name, opts) {
// https://webidl.spec.whatwg.org/#idl-DataView
webidl.converters.DataView = function (V, prefix, argument, flags) {
// 1. If Type(V) is not Object, or V does not have a
// [[DataView]] internal slot, then throw a TypeError.
if (webidl.util.Type(V) !== OBJECT || !types.isDataView(V)) {
throw webidl.errors.exception({
header: prefix,
message: `${name} is not a DataView.`
throw webidl.errors.conversionFailed({
prefix,
argument: `${argument} ("${webidl.util.Stringify(V)}")`,
types: ['DataView']
})
}
@@ -57587,10 +58382,10 @@ webidl.converters.DataView = function (V, prefix, name, opts) {
// with the [AllowShared] extended attribute, and
// IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true,
// then throw a TypeError.
if (opts?.allowShared === false && types.isSharedArrayBuffer(V.buffer)) {
if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) {
throw webidl.errors.exception({
header: 'ArrayBuffer',
message: 'SharedArrayBuffer is not allowed.'
header: prefix,
message: `${argument} cannot be a view on a shared array buffer.`
})
}
@@ -57598,10 +58393,10 @@ webidl.converters.DataView = function (V, prefix, name, opts) {
// with the [AllowResizable] extended attribute, and
// IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is
// true, then throw a TypeError.
if (V.buffer.resizable || V.buffer.growable) {
if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) {
throw webidl.errors.exception({
header: 'ArrayBuffer',
message: 'Received a resizable ArrayBuffer.'
header: prefix,
message: `${argument} cannot be a view on a resizable array buffer.`
})
}
@@ -57610,6 +58405,85 @@ webidl.converters.DataView = function (V, prefix, name, opts) {
return V
}
// https://webidl.spec.whatwg.org/#ArrayBufferView
webidl.converters.ArrayBufferView = function (V, prefix, argument, flags) {
if (
webidl.util.Type(V) !== OBJECT ||
!types.isArrayBufferView(V)
) {
throw webidl.errors.conversionFailed({
prefix,
argument: `${argument} ("${webidl.util.Stringify(V)}")`,
types: ['ArrayBufferView']
})
}
if (!webidl.util.HasFlag(flags, webidl.attributes.AllowShared) && types.isSharedArrayBuffer(V.buffer)) {
throw webidl.errors.exception({
header: prefix,
message: `${argument} cannot be a view on a shared array buffer.`
})
}
if (!webidl.util.HasFlag(flags, webidl.attributes.AllowResizable) && webidl.util.IsResizableArrayBuffer(V.buffer)) {
throw webidl.errors.exception({
header: prefix,
message: `${argument} cannot be a view on a resizable array buffer.`
})
}
return V
}
// https://webidl.spec.whatwg.org/#BufferSource
webidl.converters.BufferSource = function (V, prefix, argument, flags) {
if (types.isArrayBuffer(V)) {
return webidl.converters.ArrayBuffer(V, prefix, argument, flags)
}
if (types.isArrayBufferView(V)) {
flags &= ~webidl.attributes.AllowShared
return webidl.converters.ArrayBufferView(V, prefix, argument, flags)
}
// Make this explicit for easier debugging
if (types.isSharedArrayBuffer(V)) {
throw webidl.errors.exception({
header: prefix,
message: `${argument} cannot be a SharedArrayBuffer.`
})
}
throw webidl.errors.conversionFailed({
prefix,
argument: `${argument} ("${webidl.util.Stringify(V)}")`,
types: ['ArrayBuffer', 'ArrayBufferView']
})
}
// https://webidl.spec.whatwg.org/#AllowSharedBufferSource
webidl.converters.AllowSharedBufferSource = function (V, prefix, argument, flags) {
if (types.isArrayBuffer(V)) {
return webidl.converters.ArrayBuffer(V, prefix, argument, flags)
}
if (types.isSharedArrayBuffer(V)) {
return webidl.converters.SharedArrayBuffer(V, prefix, argument, flags)
}
if (types.isArrayBufferView(V)) {
flags |= webidl.attributes.AllowShared
return webidl.converters.ArrayBufferView(V, prefix, argument, flags)
}
throw webidl.errors.conversionFailed({
prefix,
argument: `${argument} ("${webidl.util.Stringify(V)}")`,
types: ['ArrayBuffer', 'SharedArrayBuffer', 'ArrayBufferView']
})
}
webidl.converters['sequence<ByteString>'] = webidl.sequenceConverter(
webidl.converters.ByteString
)
@@ -57630,6 +58504,34 @@ webidl.converters.AbortSignal = webidl.interfaceConverter(
'AbortSignal'
)
/**
* [LegacyTreatNonObjectAsNull]
* callback EventHandlerNonNull = any (Event event);
* typedef EventHandlerNonNull? EventHandler;
* @param {*} V
*/
webidl.converters.EventHandlerNonNull = function (V) {
if (webidl.util.Type(V) !== OBJECT) {
return null
}
// [I]f the value is not an object, it will be converted to null, and if the value is not callable,
// it will be converted to a callback function value that does nothing when called.
if (typeof V === 'function') {
return V
}
return () => {}
}
webidl.attributes = {
Clamp: 1 << 0,
EnforceRange: 1 << 1,
AllowShared: 1 << 2,
AllowResizable: 1 << 3,
LegacyNullToEmptyString: 1 << 4
}
module.exports = {
webidl
}
@@ -57946,11 +58848,12 @@ function failWebsocketConnection (handler, code, reason, cause) {
handler.controller.abort()
if (handler.socket?.destroyed === false) {
if (!handler.socket) {
// If the connection was not established, we must still emit an 'error' and 'close' events
handler.onSocketClose()
} else if (handler.socket.destroyed === false) {
handler.socket.destroy()
}
handler.onFail(code, reason, cause)
}
module.exports = {
@@ -58374,7 +59277,7 @@ webidl.converters.MessageEventInit = webidl.dictionaryConverter([
{
key: 'ports',
converter: webidl.converters['sequence<MessagePort>'],
defaultValue: () => new Array(0)
defaultValue: () => []
}
])
@@ -59240,7 +60143,28 @@ const { validateCloseCodeAndReason } = __nccwpck_require__(8625)
const { kConstruct } = __nccwpck_require__(6443)
const { kEnumerableProperty } = __nccwpck_require__(3440)
class WebSocketError extends DOMException {
function createInheritableDOMException () {
// https://github.com/nodejs/node/issues/59677
class Test extends DOMException {
get reason () {
return ''
}
}
if (new Test().reason !== undefined) {
return DOMException
}
return new Proxy(DOMException, {
construct (target, args, newTarget) {
const instance = Reflect.construct(target, args, target)
Object.setPrototypeOf(instance, newTarget.prototype)
return instance
}
})
}
class WebSocketError extends createInheritableDOMException() {
#closeCode
#reason
@@ -59332,7 +60256,6 @@ const { states, opcodes, sentCloseFrameState } = __nccwpck_require__(736)
const { webidl } = __nccwpck_require__(7879)
const { getURLRecord, isValidSubprotocol, isEstablished, utf8Decode } = __nccwpck_require__(8625)
const { establishWebSocketConnection, failWebsocketConnection, closeWebSocketConnection } = __nccwpck_require__(6897)
const { isArrayBuffer } = __nccwpck_require__(3429)
const { channels } = __nccwpck_require__(2414)
const { WebsocketFrameSend } = __nccwpck_require__(3264)
const { ByteParser } = __nccwpck_require__(1652)
@@ -59372,7 +60295,6 @@ class WebSocketStream {
#handler = {
// https://whatpr.org/websockets/48/7b748d3...d5570f3.html#feedback-to-websocket-stream-from-the-protocol
onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions),
onFail: (_code, _reason) => {},
onMessage: (opcode, data) => this.#onMessage(opcode, data),
onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message),
onParserDrain: () => this.#handler.socket.resume(),
@@ -59526,6 +60448,9 @@ class WebSocketStream {
}
#write (chunk) {
// See /websockets/stream/tentative/write.any.html
chunk = webidl.converters.WebSocketStreamWrite(chunk)
// 1. Let promise be a new promise created in stream s relevant realm .
const promise = createDeferredPromise()
@@ -59536,9 +60461,9 @@ class WebSocketStream {
let opcode = null
// 4. If chunk is a BufferSource ,
if (ArrayBuffer.isView(chunk) || isArrayBuffer(chunk)) {
if (webidl.is.BufferSource(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.slice())
// 4.2. Set opcode to a binary frame opcode.
opcode = opcodes.BINARY
@@ -59553,7 +60478,7 @@ class WebSocketStream {
string = webidl.converters.DOMString(chunk)
} catch (e) {
promise.reject(e)
return
return promise.promise
}
// 5.2. Set data to the result of UTF-8 encoding string .
@@ -59576,7 +60501,7 @@ class WebSocketStream {
}
// 6.3. Queue a global task on the WebSocket task source given stream s relevant global object to resolve promise with undefined.
return promise
return promise.promise
}
/** @type {import('../websocket').Handler['onConnectionEstablished']} */
@@ -59802,7 +60727,7 @@ webidl.converters.WebSocketStreamOptions = webidl.dictionaryConverter([
webidl.converters.WebSocketCloseInfo = webidl.dictionaryConverter([
{
key: 'closeCode',
converter: (V) => webidl.converters['unsigned short'](V, { enforceRange: true })
converter: (V) => webidl.converters['unsigned short'](V, webidl.attributes.EnforceRange)
},
{
key: 'reason',
@@ -59811,6 +60736,14 @@ webidl.converters.WebSocketCloseInfo = webidl.dictionaryConverter([
}
])
webidl.converters.WebSocketStreamWrite = function (V) {
if (typeof V === 'string') {
return webidl.converters.USVString(V)
}
return webidl.converters.BufferSource(V)
}
module.exports = { WebSocketStream }
@@ -60196,7 +61129,6 @@ const { channels } = __nccwpck_require__(2414)
/**
* @typedef {object} Handler
* @property {(response: any, extensions?: string[]) => void} onConnectionEstablished
* @property {(code: number, reason: any) => void} onFail
* @property {(opcode: number, data: Buffer) => void} onMessage
* @property {(error: Error) => void} onParserError
* @property {() => void} onParserDrain
@@ -60232,7 +61164,6 @@ class WebSocket extends EventTarget {
/** @type {Handler} */
#handler = {
onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions),
onFail: (code, reason, cause) => this.#onFail(code, reason, cause),
onMessage: (opcode, data) => this.#onMessage(opcode, data),
onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message),
onParserDrain: () => this.#onParserDrain(),
@@ -60363,7 +61294,7 @@ class WebSocket extends EventTarget {
const prefix = 'WebSocket.close'
if (code !== undefined) {
code = webidl.converters['unsigned short'](code, prefix, 'code', { clamp: true })
code = webidl.converters['unsigned short'](code, prefix, 'code', webidl.attributes.Clamp)
}
if (reason !== undefined) {
@@ -60523,9 +61454,11 @@ class WebSocket extends EventTarget {
this.removeEventListener('open', this.#events.open)
}
if (typeof fn === 'function') {
const listener = webidl.converters.EventHandlerNonNull(fn)
if (listener !== null) {
this.addEventListener('open', listener)
this.#events.open = fn
this.addEventListener('open', fn)
} else {
this.#events.open = null
}
@@ -60544,9 +61477,11 @@ class WebSocket extends EventTarget {
this.removeEventListener('error', this.#events.error)
}
if (typeof fn === 'function') {
const listener = webidl.converters.EventHandlerNonNull(fn)
if (listener !== null) {
this.addEventListener('error', listener)
this.#events.error = fn
this.addEventListener('error', fn)
} else {
this.#events.error = null
}
@@ -60565,9 +61500,11 @@ class WebSocket extends EventTarget {
this.removeEventListener('close', this.#events.close)
}
if (typeof fn === 'function') {
const listener = webidl.converters.EventHandlerNonNull(fn)
if (listener !== null) {
this.addEventListener('close', listener)
this.#events.close = fn
this.addEventListener('close', fn)
} else {
this.#events.close = null
}
@@ -60586,9 +61523,11 @@ class WebSocket extends EventTarget {
this.removeEventListener('message', this.#events.message)
}
if (typeof fn === 'function') {
const listener = webidl.converters.EventHandlerNonNull(fn)
if (listener !== null) {
this.addEventListener('message', listener)
this.#events.message = fn
this.addEventListener('message', fn)
} else {
this.#events.message = null
}
@@ -60666,26 +61605,6 @@ class WebSocket extends EventTarget {
}
}
#onFail (code, reason, cause) {
if (reason) {
// TODO: process.nextTick
fireEvent('error', this, (type, init) => new ErrorEvent(type, init), {
error: new Error(reason, cause ? { cause } : undefined),
message: reason
})
}
if (!this.#handler.wasEverConnected) {
this.#handler.readyState = states.CLOSED
// If the WebSocket connection could not be established, it is also said
// that _The WebSocket Connection is Closed_, but not _cleanly_.
fireEvent('close', this, (type, init) => new CloseEvent(type, init), {
wasClean: false, code, reason
})
}
}
#onMessage (type, data) {
// 1. If ready state is not OPEN (1), then return.
if (this.#handler.readyState !== states.OPEN) {
@@ -60746,18 +61665,11 @@ class WebSocket extends EventTarget {
let code = 1005
let reason = ''
const result = this.#parser.closingInfo
const result = this.#parser?.closingInfo
if (result && !result.error) {
code = result.code ?? 1005
reason = result.reason
} else if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {
// If _The WebSocket
// Connection is Closed_ and no Close control frame was received by the
// endpoint (such as could occur if the underlying transport connection
// is lost), _The WebSocket Connection Close Code_ is considered to be
// 1006.
code = 1006
}
// 1. Change the ready state to CLOSED (3).
@@ -60767,7 +61679,18 @@ class WebSocket extends EventTarget {
// connection, or if the WebSocket connection was closed
// after being flagged as full, fire an event named error
// at the WebSocket object.
// TODO
if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) {
// If _The WebSocket
// Connection is Closed_ and no Close control frame was received by the
// endpoint (such as could occur if the underlying transport connection
// is lost), _The WebSocket Connection Close Code_ is considered to be
// 1006.
code = 1006
fireEvent('error', this, (type, init) => new ErrorEvent(type, init), {
error: new TypeError(reason)
})
}
// 3. Fire an event named close at the WebSocket object,
// using CloseEvent, with the wasClean attribute
@@ -60876,7 +61799,7 @@ webidl.converters.WebSocketInit = webidl.dictionaryConverter([
{
key: 'protocols',
converter: webidl.converters['DOMString or sequence<DOMString>'],
defaultValue: () => new Array(0)
defaultValue: () => []
},
{
key: 'dispatcher',
@@ -60903,7 +61826,7 @@ webidl.converters.WebSocketSendData = function (V) {
return V
}
if (ArrayBuffer.isView(V) || isArrayBuffer(V)) {
if (webidl.is.BufferSource(V)) {
return V
}
}
@@ -60928,6 +61851,242 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.KNOWN_CHECKSUMS = void 0;
// AUTOGENERATED_DO_NOT_EDIT
exports.KNOWN_CHECKSUMS = {
"aarch64-apple-darwin-0.9.2": "90b1e69da3d04772565dd556ae8e72c86bdb7da85a8dfc2c6b50c400b0e6aa97",
"aarch64-pc-windows-msvc-0.9.2": "b28ae90188f00c6d9e6f32fe252ace25a3698eeca1458d435ac1ca55049607ff",
"aarch64-unknown-linux-gnu-0.9.2": "0f0ecf2abcb50f8fb5d2b52c8095af4c133897086e3f2e0259f4fcb3d8ddf273",
"aarch64-unknown-linux-musl-0.9.2": "1456894c855d38a56d541b201abae306780d8494c3a3497aff2815abd3eba12f",
"arm-unknown-linux-musleabihf-0.9.2": "f6a969f0506b4d9e1d73d223243457825a2544ef9cd8dabc0a8e7e7bea697a62",
"armv7-unknown-linux-gnueabihf-0.9.2": "93bbf2c8612174548822086487eef982bb19d95b569d3df83328cff6f5bf7660",
"armv7-unknown-linux-musleabihf-0.9.2": "0f96d45eb4edfff26faaac58d9d5761b3f2628519557534e6969ec2777f35984",
"i686-pc-windows-msvc-0.9.2": "f0cc299f9cfd9850d30f073794cda9523ac7fa2b90de3d1ed47e3fdcbda69ab6",
"i686-unknown-linux-gnu-0.9.2": "5623618c4a99694b24eb3388577495873847ccae716c0827fdb03035ddd4d441",
"i686-unknown-linux-musl-0.9.2": "c9d60b1e09611e3b36d91d5b520687ac15d765fe2a06a47dae068c6ebf23ada1",
"powerpc64-unknown-linux-gnu-0.9.2": "d2c92ae4df26b4f62181b3e8840f85f5a9474cfac707f0f8fdbef03f573836ae",
"powerpc64le-unknown-linux-gnu-0.9.2": "216e11a9001d7985990b0c4b6efd734b27e5e96222f9815d23c6fc8a5a406718",
"riscv64gc-unknown-linux-gnu-0.9.2": "3fdbc9dc623a992c39ea4c126d4ebe1f78dc2013e9056f2ec93f42b0deb154eb",
"s390x-unknown-linux-gnu-0.9.2": "4e4aa34554891bcfb92d50fc2067e99cbbc5bec473ce4b8e3dedad0d42017c85",
"x86_64-apple-darwin-0.9.2": "c887d2c4f629eee99b80a347880870f3bc77f7746db81923efe520f609f80857",
"x86_64-pc-windows-msvc-0.9.2": "ba61d01b7470b282e09e7c82a053472723c2a737fb3d137bd0f111e420cc1d9f",
"x86_64-unknown-linux-gnu-0.9.2": "b775bb84c72210c6c0b9670cfaad0ac2e3953f12a2947d52b57603b4fbae3798",
"x86_64-unknown-linux-musl-0.9.2": "42e4ac8e9dab04d560a9d44be2091cae994d14653238e779177c026e0dbf5779",
"aarch64-apple-darwin-0.9.1": "cc84b5c86fbde176c0e1908abd65cec6e989ff755b6e68a912652beb1311de31",
"aarch64-pc-windows-msvc-0.9.1": "862e0fef8e68f229c99ce05de70a712221bc552403f480379d03f5b05a6886fe",
"aarch64-unknown-linux-gnu-0.9.1": "450cf31a80cf1335b0169b82310ea589e51b12711ca84b1f5b322b87d26b16c5",
"aarch64-unknown-linux-musl-0.9.1": "a171e7335fc2e05767fe0d151db5a6af7d1ba93debfc8c91721763eff457d0a3",
"arm-unknown-linux-musleabihf-0.9.1": "cc290a14f3ffa286b8c5a437f50d5c9bb76e1d27f3d51dd701b0487e62987ea0",
"armv7-unknown-linux-gnueabihf-0.9.1": "1f0d511f7776deaf40bae03102020f939c96c3d12eec741edf81f581546d2232",
"armv7-unknown-linux-musleabihf-0.9.1": "790728d01dd0d252e3151b57b5a716f84d851d0802962144ea822118ae61b2f6",
"i686-pc-windows-msvc-0.9.1": "8880c92097c5410c3bbad5e72cf7d38b57523ed374bcd7462d309b9a11b6df33",
"i686-unknown-linux-gnu-0.9.1": "4eccf96c57c30edf6c11477351f536b1a6191d13854c8ffa6d8eee58637d82e6",
"i686-unknown-linux-musl-0.9.1": "9763ef30957011ce61c56117ef3078c40960c7521c9ee7cbb3ce8aed5b6207a4",
"powerpc64-unknown-linux-gnu-0.9.1": "4a0965091073115314f9fc935cfa3eed43c3f46a48dfa370583a019b052a950c",
"powerpc64le-unknown-linux-gnu-0.9.1": "cd9e06feaccd26dce79fd6930afbe1210edf69b4181304b4c7143871e8fadbe2",
"riscv64gc-unknown-linux-gnu-0.9.1": "394edca0f59b6cf31ee6e3d252442e1e2708483265199d390ac1fc4161f97510",
"s390x-unknown-linux-gnu-0.9.1": "8f4eedabfe57cf1d3ef29633be444ad9fd1c1ce9db89450a548e50ac88436cf0",
"x86_64-apple-darwin-0.9.1": "df530fc06d2fd51ed2efeb75b1ea5eeb77a631eb945efe5f9d90ef5969cd3672",
"x86_64-pc-windows-msvc-0.9.1": "8dba20107ebcd38f3a8e4acfeb7b209d594e112a3be8d1cea69fe6d501a69fdf",
"x86_64-unknown-linux-gnu-0.9.1": "da55e00c6399a34a47c1f10973d8618b425a530e149836305bcca7ff68d955ff",
"x86_64-unknown-linux-musl-0.9.1": "104bbd393104f09f84db474310b0fc0327c5f6566bd903c9a9cac00d137208b7",
"aarch64-apple-darwin-0.9.0": "136e70984e3fd359f4119ef445bfd67d6e0d50f15400226ef8db7b738ebef6d0",
"aarch64-pc-windows-msvc-0.9.0": "a816625eae0117c8ca0cd618716ddc11c68522d1ecfa7d2738f1c670099fef10",
"aarch64-unknown-linux-gnu-0.9.0": "ca410766024d2d726c937bda2e9441823e2848894ac5a2f8b608902384fc391f",
"aarch64-unknown-linux-musl-0.9.0": "041d8f56ffe82cbbc0f63f187f4e1935ac8b32531cf071bf5fa7abcb0441b147",
"arm-unknown-linux-musleabihf-0.9.0": "ec1ec28a7cc584a8a06632b717f89747fa8b8ba58277ad68c8f289aaeac35a0d",
"armv7-unknown-linux-gnueabihf-0.9.0": "3063c9adb4786ed49d699de9cf24c721ff2cb96bd2bb39465cab3e42d4e4efcc",
"armv7-unknown-linux-musleabihf-0.9.0": "b425603d3ef20c579b94681a587eaa3f8a2198a86473c7cd5f687a93f8a0fdb0",
"i686-pc-windows-msvc-0.9.0": "fd1dc1c9f7f9bc66186188894e24864e3def2232e1de0d49416037161932bdd7",
"i686-unknown-linux-gnu-0.9.0": "02f4b4070af6e0c591d676543b97f7f5d2c0ebf5b1d01d9e116391289f44afc0",
"i686-unknown-linux-musl-0.9.0": "41fc684a948ec2ff9255b484e11b99a0b504a4fc19d466b549e51b690a6325d5",
"powerpc64-unknown-linux-gnu-0.9.0": "122b9216414a8a89b0a716dd7bf5995d03cded62747deef68dacca6a9839f96f",
"powerpc64le-unknown-linux-gnu-0.9.0": "affbf883bfe4ae0204943b7d936fc2269e806a2534d65da0e75da713ac71ce4e",
"riscv64gc-unknown-linux-gnu-0.9.0": "86c9596204fecdacf038f498553a7e8be81aabebe430a1eb08f8ae8215610b10",
"s390x-unknown-linux-gnu-0.9.0": "8f41968e5eceda304d9cd70d83a9dc7e205e221c651572862b74845d045203ee",
"x86_64-apple-darwin-0.9.0": "8fce2fe15b227ca38c706acda7cf0ebc43d5ec4be537f1badd58d5e938c7ed89",
"x86_64-pc-windows-msvc-0.9.0": "4bad2c47dafb52ad774072fb7a260e5c9f3dbf73441658db1128eb2aec5818eb",
"x86_64-unknown-linux-gnu-0.9.0": "4dadaa5ff5009ccd6a0a43f6ccfa32bf36ed2eff18df7011275a9b1d81950e7b",
"x86_64-unknown-linux-musl-0.9.0": "8b045dceb6f13f2ce36285c72ed2d6a51241aea9da5636637c020bcecea205c8",
"aarch64-apple-darwin-0.8.24": "5f0d9d14b17ba3f0af4602a7a5a2e4faececf0a9463736cf8e6269c49569b2fa",
"aarch64-pc-windows-msvc-0.8.24": "349e5f26ea4db6459578db210bb8d676e5b2acc13962877637a95f3e951a6899",
"aarch64-unknown-linux-gnu-0.8.24": "9526f8b0eddd13f5162c18df5ecf35c21e4f96567d21849750356b60121882df",
"aarch64-unknown-linux-musl-0.8.24": "2b8f7383b19d408c680a74a6dbd41c70976516922234eb0075fd2de67413cf29",
"arm-unknown-linux-musleabihf-0.8.24": "e25ead24c0809fd81c67b72a30c81f2e76eff0d702d341c468326e3e374559f5",
"armv7-unknown-linux-gnueabihf-0.8.24": "3c0d984f55bcde6c16c8b4b749d2249b6a61125418dd6b333f249d846e759c71",
"armv7-unknown-linux-musleabihf-0.8.24": "3e980197c242f36cf93cba0ebdad8f772ebf442ee856ba694daab624affab146",
"i686-pc-windows-msvc-0.8.24": "7a8b3cdd8c02a662a19c426fbae99809d83dbedf172e52d30ba4c266ccd9a8b9",
"i686-unknown-linux-gnu-0.8.24": "7957fbdc4538d706440173d14e91b6a2098b95701654125ebc2d05824aa233e6",
"i686-unknown-linux-musl-0.8.24": "1a2b59dddc206106fb19a66dd665bfe85411281ace07825ba60988a00e230afd",
"powerpc64-unknown-linux-gnu-0.8.24": "22dfcf44c1e8b273640e13aa41c72856654da650d58e0b39d1143dbdb4ee7997",
"powerpc64le-unknown-linux-gnu-0.8.24": "0e757a7109aecbe5b6759470164d466e2a2a234808d84095e6db52a13a62f399",
"riscv64gc-unknown-linux-gnu-0.8.24": "45342e4477dfde1f1d50a8c223706377ddb861cf5c4e1a323a936401472ed2da",
"s390x-unknown-linux-gnu-0.8.24": "8167af20bf336179f5ffb96421d38cc7cb5d54dfa9b90820154cffbb456032de",
"x86_64-apple-darwin-0.8.24": "b75ccf924654ad168efac2ec6934704b3d6b9cbff1650b35e17fa3d26d2bea1f",
"x86_64-pc-windows-msvc-0.8.24": "5055be7909a844f703c54e8846d14ab676c34be6ea0d969ee74c5747feaedda0",
"x86_64-unknown-linux-gnu-0.8.24": "db8179fffd97b7557b9a519bae82eaa4f499b02ef546f738a35e74e26c47e6b7",
"x86_64-unknown-linux-musl-0.8.24": "b38ce629a8653a6b444b7c1bff2d8b99bdafd274e66a4900c5838051e3d99d26",
"aarch64-apple-darwin-0.8.23": "e9128449ea08a3c953f0e08dabc78c7588361a898e6bd8163e7e8f8c96adeb66",
"aarch64-pc-windows-msvc-0.8.23": "b4720ff1e3dcab3f41ce8135ae6c87d27682428088ce9e9b6802f2645e189a9e",
"aarch64-unknown-linux-gnu-0.8.23": "503d1df80abe76c1f30264de817c9c847ff5fa457d4085517aecde1f5749ed66",
"aarch64-unknown-linux-musl-0.8.23": "d745f61cdd3a845da6484785995bc6d19ceb3117dc3fa609bd304ecbedb87fea",
"arm-unknown-linux-musleabihf-0.8.23": "55fd7161d526080dc07fec87aed63734cf18a20f4ef2fa9b870dd99cfb4e1b07",
"armv7-unknown-linux-gnueabihf-0.8.23": "160e9522965702a31bfcb86ee28318f7d83f3ffdf330739670703fa0a85ce012",
"armv7-unknown-linux-musleabihf-0.8.23": "8cc14b0b7b5118a13c80d9245f0aa540c2596c757d7cbfab622b4f798ce90dd5",
"i686-pc-windows-msvc-0.8.23": "9ca7cc83d6730762bb811ec96aff9c95c5c9a131d4305229348df61bbfc9241a",
"i686-unknown-linux-gnu-0.8.23": "bd578dc12e1170bf14cecd17b343e308edaaee5b44f0cb066076366353567856",
"i686-unknown-linux-musl-0.8.23": "3237b711f1c313b328be0d42395319a2ffdab5f67cd2338fbf77155b6bf425f5",
"powerpc64-unknown-linux-gnu-0.8.23": "92f30e2adc8c4ec75b8dc85a82df7b74a617346c7748c41cb4672a61e42791d6",
"powerpc64le-unknown-linux-gnu-0.8.23": "b3f9b147022053b792fd82f7722b527323378c5130a227b7ec667c08b600d1be",
"riscv64gc-unknown-linux-gnu-0.8.23": "a4925b51f0810e44075d336c3fa5b7534c086111dce0d0d9d92a2e2270aea0a8",
"s390x-unknown-linux-gnu-0.8.23": "6bafdbed0e750930a2af123e3cf8b782228aef88d24bf25dc6b0f280bc8ad461",
"x86_64-apple-darwin-0.8.23": "bbb1db369de63d85334e2c43bb925fce63261cefa8c1a8569a6bd4c520f03c0d",
"x86_64-pc-windows-msvc-0.8.23": "454c727fe05ec3763cae9436bb409a6bc5156e9c8ee55a09218191faf8c32445",
"x86_64-unknown-linux-gnu-0.8.23": "b8d378bf1cbdefa6fd18570c3d5e7ea85066f75549cf3840212f505ed37522ed",
"x86_64-unknown-linux-musl-0.8.23": "598f7939cae516de105075d55eb20d906787de307a0011904e301346a13de2ff",
"aarch64-apple-darwin-0.8.22": "3f61099e261e449527141dbf125629fab33ad696468c8c90cebbac40185a306c",
"aarch64-pc-windows-msvc-0.8.22": "dbb3a5bd06d20c9ab8bb9a79c7c4fb5832ca1c7ba5f231a020bc92e5a3c6dcf4",
"aarch64-unknown-linux-gnu-0.8.22": "726b72a137fda33565143325f7d31c42cd30ff9ccdf067e00d124d37b4081cb2",
"aarch64-unknown-linux-musl-0.8.22": "3cb3c891f56891f0027f0287980014930b18875c9396c1d8a19d607b0a6049d9",
"arm-unknown-linux-musleabihf-0.8.22": "78c4898abb5285cbcb53bc2544d93158a705bf2024393d203b7df89406ffd5d7",
"armv7-unknown-linux-gnueabihf-0.8.22": "96f7e526b7cac851f4448ca773ee82216d3d8564161486f5c0ab0d84418cc3bc",
"armv7-unknown-linux-musleabihf-0.8.22": "763bd2b60642c68e2d2d5ce43f741fe9cdb77b6fa771cd8b45971e4a380411d7",
"i686-pc-windows-msvc-0.8.22": "e84c697e29afc76223e020edb3786acebed34779a9cc2ab88e570ff93d69a617",
"i686-unknown-linux-gnu-0.8.22": "f6cfe03095b9cafdbf530cf228803e9ec329511d45e5901e3baa355f96ba37f3",
"i686-unknown-linux-musl-0.8.22": "6ea34f5e656ee0f2085436513e9b6a2caeae7ff14d14871f177a7797f79db20e",
"powerpc64-unknown-linux-gnu-0.8.22": "87b1f9b6452540d1b3e3286e9209fcae39a692c323544c10f6b4f096bfc04673",
"powerpc64le-unknown-linux-gnu-0.8.22": "2f639a402031e62dabd6ca534635d73b26e8b72afeb063f8abc9abc6ba97a8e3",
"riscv64gc-unknown-linux-gnu-0.8.22": "75c83abe161c6e673f7d21e46cd27df539081a9ccf74e4d053e90ba8d2d715e0",
"s390x-unknown-linux-gnu-0.8.22": "a0f671106b8b4c128aad3b52becc34691d7669c3d40bbd5a18df2c60b4d67971",
"x86_64-apple-darwin-0.8.22": "76638fdcfa91357858771551a1c88de1f7c3b270b33ab1866f8a0618d9e442d8",
"x86_64-pc-windows-msvc-0.8.22": "5049375aa2a5162f132b2c1cb992e25d42d47d934cab8c174dbe6f60973dcc12",
"x86_64-unknown-linux-gnu-0.8.22": "741ff1f5742c5a4a25d2f829e8395355e43f7a5ae2ebc6368e9ae2df0efb69cf",
"x86_64-unknown-linux-musl-0.8.22": "06b891ef144bd8390fecb150838f0ff8a34ccaeecf9d744d97945d02ec7389c0",
"aarch64-apple-darwin-0.8.21": "51a10a0ba94139911266779e61296b07fffc98eedf3d8f6e206f86375ac7fb31",
"aarch64-pc-windows-msvc-0.8.21": "ad60ed2fd2c95957c55041d2e61146f0f41aedc7afe87f3f79a8648802713fb5",
"aarch64-unknown-linux-gnu-0.8.21": "5ebc05755ee1688434993d3bf346b6fbdbcbd2f17f1a8339f175e76af18de50c",
"aarch64-unknown-linux-musl-0.8.21": "2afeee16b09d40cbe4de445fe82e1ecc00ed51dd8e118ed7800ca537ee4cf0c2",
"arm-unknown-linux-musleabihf-0.8.21": "f45daacdd988284b011137ba017e5b151252922eec52b457d50770f0cde18387",
"armv7-unknown-linux-gnueabihf-0.8.21": "f6b5fa5a6cfad7fd9fa80c11b24cef18acb8d99c137a6144a4bb1c50dbfb5b1b",
"armv7-unknown-linux-musleabihf-0.8.21": "d53ad3c1c5b549654c2da6f9369df7a68b961f18fcaf847cb8242dc48fe17e20",
"i686-pc-windows-msvc-0.8.21": "8ee8cd0cc5d49a9e3c6f176bdc9d09ece03144dbc0914c20b27e67ff72c0570e",
"i686-unknown-linux-gnu-0.8.21": "327ef2b81967cb2e8407255d3580dd67ddf15fdb18fd3d6e945dc13f76462b0c",
"i686-unknown-linux-musl-0.8.21": "18b7a77c37155ea15166a3a212e69b53f0e6b8d1d399b87c1b3ac4cc646e9b4f",
"powerpc64-unknown-linux-gnu-0.8.21": "1fae8052ce8a9663438ba332f930062b14621adb395eff2950928d7cf8323d16",
"powerpc64le-unknown-linux-gnu-0.8.21": "cca5f83f59251fced9056ecf8ae90e89a83252dda1eb53eab96a76e484776e0d",
"riscv64gc-unknown-linux-gnu-0.8.21": "485f2654720d9fca3c85b147e837f0dc32bb869113bde58e979fc76f0c37547e",
"s390x-unknown-linux-gnu-0.8.21": "5757570db02d2ed3ef5742a1a484b921e716d8412daf45e85c4c79c0a75bf0c1",
"x86_64-apple-darwin-0.8.21": "df0fae941f83f796ea8100958f5d31a185dacc34777f346019123b6cb5571101",
"x86_64-pc-windows-msvc-0.8.21": "ed4f66aacea41026675bca18699958cda13112c77ef5eff3a2f3d376bd1f9177",
"x86_64-unknown-linux-gnu-0.8.21": "166bfa522cc836a3b68bdcef78e40b263ea62f12bb80a8d9c6fda4ce5f2a3994",
"x86_64-unknown-linux-musl-0.8.21": "ff6f6ffca9a026cc99bc43df46e70e33df09bcb544b43e8ef97a5176dd68b516",
"aarch64-apple-darwin-0.8.20": "a87008d013efd78d94102e5268a24990c409bfb39b80df4de32d1c97f093e7ef",
"aarch64-pc-windows-msvc-0.8.20": "ac33f921e0d48d14a106a6cc84b146da7a1f4a3c329c7fb0e1a8e6ff4cf541e6",
"aarch64-unknown-linux-gnu-0.8.20": "b434851cd94e9e2083bc9a5851f1d13748771726bd2ac30027f820fc134b2104",
"aarch64-unknown-linux-musl-0.8.20": "60ad9b7fb846c2051e0113077b1e9510b4b1a73b9a1816a03e82406deedff08d",
"arm-unknown-linux-musleabihf-0.8.20": "72fa919115f5a7c4557c1adb55ac77154f3fb0272b95ff0270d4eaf98bc814c2",
"armv7-unknown-linux-gnueabihf-0.8.20": "87a993df182a2abb5581421d6c76b0cbccb311cfca625d8c827f2cfcf1c78fed",
"armv7-unknown-linux-musleabihf-0.8.20": "3a3c1b2370824f3129c89bf3def5b2b703813152cf0be0ec3c04dead21077cd0",
"i686-pc-windows-msvc-0.8.20": "62fd821f330f469cce6e02eded6f63ba51a9461acc9e0e16794e05da08fe16be",
"i686-unknown-linux-gnu-0.8.20": "a7bfa2c07183f2fd44ef4d6c910971796a980ebb3c52e9620e6b741cc6fe45c0",
"i686-unknown-linux-musl-0.8.20": "67eec91d7ca5a8dc8d95149be52bcf459efb4caeacbacf8586f371f8192a0ec7",
"powerpc64-unknown-linux-gnu-0.8.20": "b96d6a4907ab4c26d7061e43f6993aa47c76a01af6f3cb871d9c48b7b250fbca",
"powerpc64le-unknown-linux-gnu-0.8.20": "1c13fbcd13214e93300749cb14cb5c1425d6a4095f2e406a80b34ab10d269b5b",
"riscv64gc-unknown-linux-gnu-0.8.20": "a14f8297bae6dc3993a9367e0fcf6061281f5f3f0da7c46a6a2a5fd47467f56c",
"s390x-unknown-linux-gnu-0.8.20": "8e59db8d1cb791897237982e369fea0217a12ffe3527cf6f1d30fea32d20a509",
"x86_64-apple-darwin-0.8.20": "ec47686e5e1499b9ea53aa61181fa3f08d4113bc7628105dc299c092d4debf44",
"x86_64-pc-windows-msvc-0.8.20": "e2aa89b78f0a0fa7cbf9d42508c7a962bda803425d8ec3e9cf7a69fb00cf6791",
"x86_64-unknown-linux-gnu-0.8.20": "dc67aa1a5b6b16a8cc4a5fdf5697f354fbf9e45f77a3da6d9e71db6ec213c082",
"x86_64-unknown-linux-musl-0.8.20": "a29e1854ee3ce1ccc5ba1d27783c4f34e99605e16c886a71446a90bad40a38c9",
"aarch64-apple-darwin-0.8.19": "bb63d43c40a301d889a985223ee8ce540be199e98b3f27ed8477823869a0a605",
"aarch64-pc-windows-msvc-0.8.19": "3bfe2db4bccf95e05d2685bcbfad7e49e7cd2177a20aebe81a5e5348cbdfc0a3",
"aarch64-unknown-linux-gnu-0.8.19": "ffd29feed13cdd30b27def8e80e64223325fbe4f7cfc4d4c906ec2531f746bde",
"aarch64-unknown-linux-musl-0.8.19": "87925376fa1e59de23582e1cbd81d6aabd16611e871ad085e09be2c2fa12689d",
"arm-unknown-linux-musleabihf-0.8.19": "00d4835ba20e2e4a3bfed6fe4f6fbf4982c5a0e6a3105c7bde93fb9377e61dea",
"armv7-unknown-linux-gnueabihf-0.8.19": "7a58efdb9c6e3f320759f9f074306e34f03ccfb535b306cbace92e9ad414efd5",
"armv7-unknown-linux-musleabihf-0.8.19": "c8f8a244009f3ad01b23772c936c5c5a95871a87b0add90b85a55d3913d1fae0",
"i686-pc-windows-msvc-0.8.19": "32c7176e49f5fa1c7480b32e325a631431212904b1020427e62afef46fddddb9",
"i686-unknown-linux-gnu-0.8.19": "94a5f944d1cba4db2e7fc6831bf9c78c291c5c1e5e079b4095e9fcdcbc15bc71",
"i686-unknown-linux-musl-0.8.19": "491b282b50e078fac4ced99e69359ac6cecc3f43f585f812d52515e6b081261a",
"powerpc64-unknown-linux-gnu-0.8.19": "3c7c7ecb8d5b61acee3914984f1025af1707a987a51285aba44d968420139f2c",
"powerpc64le-unknown-linux-gnu-0.8.19": "711e39050b528b0860d868c98057eebbd181befbe6a6f24e0f6fd571eab5520f",
"riscv64gc-unknown-linux-gnu-0.8.19": "5dd8e1ec8bf8722e08d9853953ed0ef12318d0f5e82d06a8dd98815666f99186",
"s390x-unknown-linux-gnu-0.8.19": "5b3af341a39364f147d7286e40f55dd92ac8a142110e29ff1b4825afb96e1b27",
"x86_64-apple-darwin-0.8.19": "b5f91770e55761b32c9618757ef23ded6671bb9ca0ddf5737eea60dddd493fe9",
"x86_64-pc-windows-msvc-0.8.19": "945b07182de7de279ba5ae5c746785dfd55cf9b17481d3535b0b03efd6e64567",
"x86_64-unknown-linux-gnu-0.8.19": "cfc674e9b83d1becfca4d70386e5f7ace4c1fa8c47c518abeebb8ef2b30da4b8",
"x86_64-unknown-linux-musl-0.8.19": "6a37f712ae90c7b8cf364fe751144d7acc2479d6b336378111e74cc7fb14fa7b",
"aarch64-apple-darwin-0.8.18": "ce660d5cdf0ed83d1a045bbe9792b93d06725b8c9e9b88960a503d42192be445",
"aarch64-pc-windows-msvc-0.8.18": "f49a25f1a89c76d750e2179f40f9302310504f40c89283ca4522b13363c7bdc9",
"aarch64-unknown-linux-gnu-0.8.18": "164363f88618f4e8e175faf9fcf5172321c221fce93d64cec8e9ab3339511dad",
"aarch64-unknown-linux-musl-0.8.18": "1d7e3bfc3b5ec9d747bc3f42a6a3362249f30560966512b172e8967b11046144",
"arm-unknown-linux-musleabihf-0.8.18": "3c356156c074eb21f731116501992aa6ad6079231f37c75ea7a15c22d1c41cf6",
"armv7-unknown-linux-gnueabihf-0.8.18": "15e12cfba5fb7b20b4eb45887b78fe157d29bd28b38bbc03a19224ad6766a641",
"armv7-unknown-linux-musleabihf-0.8.18": "008cd8225fd8b6b4bb3293d1d7520023f8e432141f256320c034dc5a1a15c7ab",
"i686-pc-windows-msvc-0.8.18": "55f0d91f766ca141e166fe74b8a81da667b5d703ca1b5f2671677f0b2bfdd901",
"i686-unknown-linux-gnu-0.8.18": "3b42e3b58650cde6fa0d03dfdb8528573cf679ac9809191b3976913cdec13b6f",
"i686-unknown-linux-musl-0.8.18": "e2dae897955f666eb2f83af12d9a566bc42c26c17413d1480124cef6b30dc0fd",
"powerpc64-unknown-linux-gnu-0.8.18": "88cd4ad593e6dd915c69dee02b56cbf1b6d16cb7c8129a5ad1fa8ac02bd755ab",
"powerpc64le-unknown-linux-gnu-0.8.18": "50b418096f4d82df5d22cb23e650754ca92bca7be657113dcd53631f0e0cec77",
"riscv64gc-unknown-linux-gnu-0.8.18": "b696be9a2ef0808f230227477b8e23acedba0b90933978c760ea2a748e8c30fa",
"s390x-unknown-linux-gnu-0.8.18": "3b106572a8574f58e3df591cdaef915bdb38fdff11e5de0ec53bfe1b857267e8",
"x86_64-apple-darwin-0.8.18": "a08c3a6c50f49e68216ac133bd0aaae952db2cd8d19a3cd5be782f8f4becf135",
"x86_64-pc-windows-msvc-0.8.18": "3e42d63c8323839d50b11959ec558ad3954a2c16aab1ad52c0521bd055442a3f",
"x86_64-unknown-linux-gnu-0.8.18": "59ad1a1809fa47019b86cf339fff161cb7b00ad3d8d42354eea57d0d91aeb44c",
"x86_64-unknown-linux-musl-0.8.18": "3a93bc3597ab73c9c31d8ad709b4d0b788961cbb508c5a4dcf21636fd7e3e8ce",
"aarch64-apple-darwin-0.8.17": "e4d4859d7726298daa4c12e114f269ff282b2cfc2b415dc0b2ca44ae2dbd358e",
"aarch64-pc-windows-msvc-0.8.17": "2396749de576e45a40efa35fe94b3f953c3224c21f75c05772593e085d78e77d",
"aarch64-unknown-linux-gnu-0.8.17": "9a20d65b110770bbaa2ee89ed76eb963d8c6a480b9ebef584ea9df2ae85b4f0f",
"aarch64-unknown-linux-musl-0.8.17": "bd141b7e263935d14f5725f2a5c1c942fd89642e37683cb904f1984ce7e365f4",
"arm-unknown-linux-musleabihf-0.8.17": "9d4ffb6751d65a52f8daf3fd88e331ab989d490a6e336d6a96cac668fce17a65",
"armv7-unknown-linux-gnueabihf-0.8.17": "014afffa5621986aefbe8a6d71597eb45b8cd3d4e94f825f34ec49ba4cd0c382",
"armv7-unknown-linux-musleabihf-0.8.17": "fb976e7482c4550f38c51c5c23b9dae0322c3173f56436bf9a81252e4b74fcfb",
"i686-pc-windows-msvc-0.8.17": "f528893452ca512b555b63267292977d237bd6fbdd967c9be6941a65ebf256f4",
"i686-unknown-linux-gnu-0.8.17": "d52438a1588ea7c2332dc4aa8c93eedae344fc435c95491037237c7b4b36eae4",
"i686-unknown-linux-musl-0.8.17": "9e10f4c57034e6e98dea48b0f4250a7eff983f1b2947d99ed6605a4eb0ec8d22",
"loongarch64-unknown-linux-gnu-0.8.17": "1d02e45dbbcbbaa867afe59fd62b294cba47abf1a76e151e19db03b5dbf1c9c8",
"powerpc64-unknown-linux-gnu-0.8.17": "6f448735dfd72e2d5c3e3bb541b388c58cdfcf3a562128d5ac1a5f2be47f95d6",
"powerpc64le-unknown-linux-gnu-0.8.17": "e4b28cab21eb990e2bea768bc9f43b61e4fd554552cea8868c855027decef69d",
"riscv64gc-unknown-linux-gnu-0.8.17": "f653caa34479d405d290b825a2fe782bb26c55a7bfaa870911b4e18792312d45",
"s390x-unknown-linux-gnu-0.8.17": "8fae8182704b4b11316c87d897c3e64f2d3f55ac8c58c482d9bbef9ad611f90c",
"x86_64-apple-darwin-0.8.17": "31ed353cfd8e6c962e7c60617bd8a9d6b97b704c1ecb5b5eceaff8c6121b54ac",
"x86_64-pc-windows-msvc-0.8.17": "0d051779fbcb173b183efeae1c3e96148764fd82709bbbf0966df3efe48b67c5",
"x86_64-unknown-linux-gnu-0.8.17": "920cbcaad514cc185634f6f0dcd71df5e8f4ee4456d440a22e0f8c0f142a8203",
"x86_64-unknown-linux-musl-0.8.17": "4057052999a210fe78d93599d2165da9e24c8bbb23370cdd26b66a98ab479203",
"aarch64-apple-darwin-0.8.16": "87e4b51b735e8445f6c445c7b4c0398273e40d34cd192bad8158736653600cd6",
"aarch64-pc-windows-msvc-0.8.16": "392acca957d8d7cccafbb68ce6c4ba29b2ff00c8b0d4744a2136918d3a7bf765",
"aarch64-unknown-linux-gnu-0.8.16": "22a3cbaf87776b73c2657ba5d63f8565c1235b65eaf57dffda66061f7a09913b",
"aarch64-unknown-linux-musl-0.8.16": "6bd6a11c384f07353c3c7eec9bde094f89b92a12dc09caea9df40c424afebea5",
"arm-unknown-linux-musleabihf-0.8.16": "53c31a6559dc4fb22ce8c56640b00a8404b7e4d55f68b6bb3aa188864e2c3084",
"armv7-unknown-linux-gnueabihf-0.8.16": "ada6f393d5e5d9cba5445832ba61e8222859e915e5d77a37f5dd35979f3f18e4",
"armv7-unknown-linux-musleabihf-0.8.16": "55690f70f9c61963c0069558e205acda9ff0604a44028226b9a0ec3b847c9125",
"i686-pc-windows-msvc-0.8.16": "1e727b8af6c0781bc6eb9a2c34e7ee704070b7a2f122544443418e8be13019ee",
"i686-unknown-linux-gnu-0.8.16": "4eaf39134663ef184f684be6f6aa83e971fb36ef7d1c67a5f2196268b61c0579",
"i686-unknown-linux-musl-0.8.16": "a179ceba9f2fcca7b46a86b12715e28fb3429ff8193ae839700d534e35e95a45",
"loongarch64-unknown-linux-gnu-0.8.16": "600a8be6d2621d654b6665d9a8df9370f4af9c0b6ceb851d1ae0d4b895e8e546",
"powerpc64-unknown-linux-gnu-0.8.16": "c86008ef8a3e3730b0e58a168542331960c90a3b043e3853c1941457748595f3",
"powerpc64le-unknown-linux-gnu-0.8.16": "91645092447a14c23b47d0f434a787a9555b29e061607d9e60d2d556b831f5aa",
"riscv64gc-unknown-linux-gnu-0.8.16": "dbaeff3f0baad73c264c35abd937a231fb6b9d1201b6763d82e39e7516358115",
"s390x-unknown-linux-gnu-0.8.16": "e29c330a8956c13acb0f2af7aa650dd5d9ebba6aefdceaea77f689953d140780",
"x86_64-apple-darwin-0.8.16": "07491a998fd741090501df9bbfe538f85568901a3a66c9e0368636509158727a",
"x86_64-pc-windows-msvc-0.8.16": "97fb93678eca3b4f731ea3879ae2e78787976e03f38c9c6fb744ab28bc3aec1b",
"x86_64-unknown-linux-gnu-0.8.16": "fc94e50e8ef93a97d723b83faa42888e7710c4443a5b8a1af3aac2cda5390f3a",
"x86_64-unknown-linux-musl-0.8.16": "ee220f112b91b23f641d169ba7a3652c6ab7104e7c666d26104ebd6a2f76be43",
"aarch64-apple-darwin-0.8.15": "103367962c5cb00bf7370d84cbaa3fec5a9807be9cc833ea9d8eea400c119fa2",
"aarch64-pc-windows-msvc-0.8.15": "16d92f21508c5dbd3374466c2cdad2909959a6d3bd06672b9db023f2a5d7a014",
"aarch64-unknown-linux-gnu-0.8.15": "6ede0fefa7db7be3d5d9eda8784a8e43b1cf5410720eb3da60ab1d2f66678e82",
"aarch64-unknown-linux-musl-0.8.15": "23ea21a05c62c4c307ce691f29bff2f15c94c4f07f2b83d9b356f0664bc8b3a2",
"arm-unknown-linux-musleabihf-0.8.15": "deeac755224244b535c9f654b29aad8a165c94840a520d41e5c697235edd0576",
"armv7-unknown-linux-gnueabihf-0.8.15": "07ad33bc28ed276944d069eb714322b24167bfe106b4bded01e272fe245934ba",
"armv7-unknown-linux-musleabihf-0.8.15": "0b4f73e084a04828f2431c887c2e3eea590ff06a1dc279e473dd1d94cdc8f25d",
"i686-pc-windows-msvc-0.8.15": "34425e7dc7323b98fc844d9223596e9a1d2347e6f85a512221428a455dcbea78",
"i686-unknown-linux-gnu-0.8.15": "16230e9b785fccb628e920d0fa1ca59b50b0515b838b2bb80f997bcb7a35f2bb",
"i686-unknown-linux-musl-0.8.15": "43d554953beac56a8d8ba23aeb2b0e0e5c43020b074071c15df5d492e46a81f3",
"powerpc64-unknown-linux-gnu-0.8.15": "71465b1d08e0a4cb3fcfe02e127104400a85ed00c30ec5f53f8705e71567fb6a",
"powerpc64le-unknown-linux-gnu-0.8.15": "54157ee5e01b02b8c89131391d62228787750b556bbdb7d3428a3cdfd1698102",
"riscv64gc-unknown-linux-gnu-0.8.15": "faa4a470a26ad0db0dbefc510fac91fa0da4d9cd06ca4f229933f7aac21e46b2",
"s390x-unknown-linux-gnu-0.8.15": "0bb022274375745352a748b8332bb170941fe01915a1670c2c6d06d182783437",
"x86_64-apple-darwin-0.8.15": "2bbef70982e97dfc36454de173f35ec1a5e83ae11e3885df6a50db3fd76171cb",
"x86_64-pc-windows-msvc-0.8.15": "459d95892a5cc5c21779532f4f41b9238594b79e312a5142da2148ecfa10e705",
"x86_64-unknown-linux-gnu-0.8.15": "be9878e9d08ebcb621a683aba52e7fb8bbf92b2532e0d759026ffcc067673042",
"x86_64-unknown-linux-musl-0.8.15": "d0fec58f3124e05e0a1af0f6541abfce4333253cdaf23c7b6bb2e6128bf138ea",
"aarch64-apple-darwin-0.8.14": "281ea18a5778099f7edeee0a7b20671d14918782de153604c939486f2b8a2791",
"aarch64-pc-windows-msvc-0.8.14": "d7fef1d1d0b0f8e0aa94391376fe5fb95f0e213ef7ee1c498c287fe0ea76f886",
"aarch64-unknown-linux-gnu-0.8.14": "69616218470b2ad053617efb9e7027b1518ea38918d933c2791e113d99cec507",
@@ -64715,10 +65874,12 @@ run();
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.TOOL_CACHE_NAME = exports.OWNER = exports.REPO = void 0;
exports.STATE_UV_VERSION = exports.STATE_UV_PATH = exports.TOOL_CACHE_NAME = exports.OWNER = exports.REPO = void 0;
exports.REPO = "uv";
exports.OWNER = "astral-sh";
exports.TOOL_CACHE_NAME = "uv";
exports.STATE_UV_PATH = "uv-path";
exports.STATE_UV_VERSION = "uv-version";
/***/ }),
@@ -64767,7 +65928,8 @@ 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) {
const OctokitWithPlugins = core_1.Octokit.plugin(plugin_paginate_rest_1.paginateRest, plugin_rest_endpoint_methods_1.legacyRestEndpointMethods);
exports.Octokit = OctokitWithPlugins.defaults(function buildDefaults(options) {
return {
...DEFAULTS,
...options,
@@ -67560,7 +68722,7 @@ class RequestError extends Error {
// pkg/dist-src/version.js
var dist_bundle_VERSION = "0.0.0-development";
var dist_bundle_VERSION = "10.0.5";
// pkg/dist-src/defaults.js
var defaults_default = {
@@ -67931,7 +69093,7 @@ var createTokenAuth = function createTokenAuth2(token) {
;// CONCATENATED MODULE: ./node_modules/@octokit/core/dist-src/version.js
const version_VERSION = "7.0.3";
const version_VERSION = "7.0.5";
;// CONCATENATED MODULE: ./node_modules/@octokit/core/dist-src/index.js
@@ -68505,7 +69667,7 @@ __nccwpck_require__.d(__webpack_exports__, {
});
;// CONCATENATED MODULE: ./node_modules/@octokit/plugin-rest-endpoint-methods/dist-src/version.js
const VERSION = "16.0.0";
const VERSION = "16.1.0";
//# sourceMappingURL=version.js.map
@@ -69319,11 +70481,20 @@ const Endpoints = {
removeSelectedRepoFromOrgSecret: [
"DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"
],
repositoryAccessForOrg: [
"GET /organizations/{org}/dependabot/repository-access"
],
setRepositoryAccessDefaultLevel: [
"PUT /organizations/{org}/dependabot/repository-access/default-level"
],
setSelectedReposForOrgSecret: [
"PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"
],
updateAlert: [
"PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"
],
updateRepositoryAccessForOrg: [
"PATCH /organizations/{org}/dependabot/repository-access"
]
},
dependencyGraph: {
@@ -69429,6 +70600,9 @@ const Endpoints = {
addAssignees: [
"POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"
],
addBlockedByDependency: [
"POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by"
],
addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"],
addSubIssue: [
"POST /repos/{owner}/{repo}/issues/{issue_number}/sub_issues"
@@ -69455,10 +70629,17 @@ const Endpoints = {
getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"],
getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"],
getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"],
getParent: ["GET /repos/{owner}/{repo}/issues/{issue_number}/parent"],
list: ["GET /issues"],
listAssignees: ["GET /repos/{owner}/{repo}/assignees"],
listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"],
listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"],
listDependenciesBlockedBy: [
"GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by"
],
listDependenciesBlocking: [
"GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocking"
],
listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"],
listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"],
listEventsForTimeline: [
@@ -69485,6 +70666,9 @@ const Endpoints = {
removeAssignees: [
"DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"
],
removeDependencyBlockedBy: [
"DELETE /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by/{issue_id}"
],
removeLabel: [
"DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"
],
@@ -69587,6 +70771,9 @@ const Endpoints = {
convertMemberToOutsideCollaborator: [
"PUT /orgs/{org}/outside_collaborators/{username}"
],
createArtifactStorageRecord: [
"POST /orgs/{org}/artifacts/metadata/storage-record"
],
createInvitation: ["POST /orgs/{org}/invitations"],
createIssueType: ["POST /orgs/{org}/issue-types"],
createOrUpdateCustomProperties: ["PATCH /orgs/{org}/properties/schema"],
@@ -69598,15 +70785,15 @@ const Endpoints = {
],
createWebhook: ["POST /orgs/{org}/hooks"],
delete: ["DELETE /orgs/{org}"],
deleteAttestationsBulk: ["POST /orgs/{org}/attestations/delete-request"],
deleteAttestationsById: [
"DELETE /orgs/{org}/attestations/{attestation_id}"
],
deleteAttestationsBySubjectDigest: [
"DELETE /orgs/{org}/attestations/digest/{subject_digest}"
],
deleteIssueType: ["DELETE /orgs/{org}/issue-types/{issue_type_id}"],
deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"],
enableOrDisableSecurityProductOnAllOrgRepos: [
"POST /orgs/{org}/{security_product}/{enablement}",
{},
{
deprecated: "octokit.rest.orgs.enableOrDisableSecurityProductOnAllOrgRepos() is deprecated, see https://docs.github.com/rest/orgs/orgs#enable-or-disable-a-security-feature-for-an-organization"
}
],
get: ["GET /orgs/{org}"],
getAllCustomProperties: ["GET /orgs/{org}/properties/schema"],
getCustomProperty: [
@@ -69626,7 +70813,13 @@ const Endpoints = {
],
list: ["GET /organizations"],
listAppInstallations: ["GET /orgs/{org}/installations"],
listArtifactStorageRecords: [
"GET /orgs/{org}/artifacts/{subject_digest}/metadata/storage-records"
],
listAttestations: ["GET /orgs/{org}/attestations/{subject_digest}"],
listAttestationsBulk: [
"POST /orgs/{org}/attestations/bulk-list{?per_page,before,after}"
],
listBlockedUsers: ["GET /orgs/{org}/blocks"],
listCustomPropertiesValuesForRepos: ["GET /orgs/{org}/properties/values"],
listFailedInvitations: ["GET /orgs/{org}/failed_invitations"],
@@ -69821,6 +71014,44 @@ const Endpoints = {
"PATCH /orgs/{org}/private-registries/{secret_name}"
]
},
projects: {
addItemForOrg: ["POST /orgs/{org}/projectsV2/{project_number}/items"],
addItemForUser: ["POST /users/{user_id}/projectsV2/{project_number}/items"],
deleteItemForOrg: [
"DELETE /orgs/{org}/projectsV2/{project_number}/items/{item_id}"
],
deleteItemForUser: [
"DELETE /users/{user_id}/projectsV2/{project_number}/items/{item_id}"
],
getFieldForOrg: [
"GET /orgs/{org}/projectsV2/{project_number}/fields/{field_id}"
],
getFieldForUser: [
"GET /users/{user_id}/projectsV2/{project_number}/fields/{field_id}"
],
getForOrg: ["GET /orgs/{org}/projectsV2/{project_number}"],
getForUser: ["GET /users/{user_id}/projectsV2/{project_number}"],
getOrgItem: ["GET /orgs/{org}/projectsV2/{project_number}/items/{item_id}"],
getUserItem: [
"GET /users/{user_id}/projectsV2/{project_number}/items/{item_id}"
],
listFieldsForOrg: ["GET /orgs/{org}/projectsV2/{project_number}/fields"],
listFieldsForUser: [
"GET /users/{user_id}/projectsV2/{project_number}/fields"
],
listForOrg: ["GET /orgs/{org}/projectsV2"],
listForUser: ["GET /users/{username}/projectsV2"],
listItemsForOrg: ["GET /orgs/{org}/projectsV2/{project_number}/items"],
listItemsForUser: [
"GET /users/{user_id}/projectsV2/{project_number}/items"
],
updateItemForOrg: [
"PATCH /orgs/{org}/projectsV2/{project_number}/items/{item_id}"
],
updateItemForUser: [
"PATCH /users/{user_id}/projectsV2/{project_number}/items/{item_id}"
]
},
pulls: {
checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"],
create: ["POST /repos/{owner}/{repo}/pulls"],
@@ -70399,8 +71630,14 @@ const Endpoints = {
listLocationsForAlert: [
"GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"
],
listOrgPatternConfigs: [
"GET /orgs/{org}/secret-scanning/pattern-configurations"
],
updateAlert: [
"PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"
],
updateOrgPatternConfigs: [
"PATCH /orgs/{org}/secret-scanning/pattern-configurations"
]
},
securityAdvisories: {
@@ -70510,6 +71747,15 @@ const Endpoints = {
],
createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"],
createSshSigningKeyForAuthenticatedUser: ["POST /user/ssh_signing_keys"],
deleteAttestationsBulk: [
"POST /users/{username}/attestations/delete-request"
],
deleteAttestationsById: [
"DELETE /users/{username}/attestations/{attestation_id}"
],
deleteAttestationsBySubjectDigest: [
"DELETE /users/{username}/attestations/digest/{subject_digest}"
],
deleteEmailForAuthenticated: [
"DELETE /user/emails",
{},
@@ -70554,6 +71800,9 @@ const Endpoints = {
],
list: ["GET /users"],
listAttestations: ["GET /users/{username}/attestations/{subject_digest}"],
listAttestationsBulk: [
"POST /users/{username}/attestations/bulk-list{?per_page,before,after}"
],
listBlockedByAuthenticated: [
"GET /user/blocks",
{},

884
package-lock.json generated
View File

@@ -15,22 +15,22 @@
"@actions/glob": "^0.5.0",
"@actions/io": "^1.1.3",
"@actions/tool-cache": "^2.0.2",
"@octokit/core": "^7.0.3",
"@octokit/core": "^7.0.5",
"@octokit/plugin-paginate-rest": "^13.1.1",
"@octokit/plugin-rest-endpoint-methods": "^16.0.0",
"@renovatebot/pep440": "^4.2.0",
"@octokit/plugin-rest-endpoint-methods": "^16.1.0",
"@renovatebot/pep440": "^4.2.1",
"smol-toml": "^1.4.2",
"undici": "^7.15.0"
"undici": "^7.16.0"
},
"devDependencies": {
"@biomejs/biome": "2.2.2",
"@biomejs/biome": "2.2.4",
"@types/js-yaml": "^4.0.9",
"@types/node": "^24.3.0",
"@types/semver": "^7.7.0",
"@vercel/ncc": "^0.38.3",
"jest": "^30.1.1",
"@types/node": "^24.7.0",
"@types/semver": "^7.7.1",
"@vercel/ncc": "^0.38.4",
"jest": "^30.1.3",
"js-yaml": "^4.1.0",
"ts-jest": "^29.4.1",
"ts-jest": "^29.4.4",
"typescript": "^5.9.2"
}
},
@@ -901,9 +901,9 @@
"license": "MIT"
},
"node_modules/@biomejs/biome": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.2.tgz",
"integrity": "sha512-j1omAiQWCkhuLgwpMKisNKnsM6W8Xtt1l0WZmqY/dFj8QPNkIoTvk4tSsi40FaAAkBE1PU0AFG2RWFBWenAn+w==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.4.tgz",
"integrity": "sha512-TBHU5bUy/Ok6m8c0y3pZiuO/BZoY/OcGxoLlrfQof5s8ISVwbVBdFINPQZyFfKwil8XibYWb7JMwnT8wT4WVPg==",
"dev": true,
"license": "MIT OR Apache-2.0",
"bin": {
@@ -917,20 +917,20 @@
"url": "https://opencollective.com/biome"
},
"optionalDependencies": {
"@biomejs/cli-darwin-arm64": "2.2.2",
"@biomejs/cli-darwin-x64": "2.2.2",
"@biomejs/cli-linux-arm64": "2.2.2",
"@biomejs/cli-linux-arm64-musl": "2.2.2",
"@biomejs/cli-linux-x64": "2.2.2",
"@biomejs/cli-linux-x64-musl": "2.2.2",
"@biomejs/cli-win32-arm64": "2.2.2",
"@biomejs/cli-win32-x64": "2.2.2"
"@biomejs/cli-darwin-arm64": "2.2.4",
"@biomejs/cli-darwin-x64": "2.2.4",
"@biomejs/cli-linux-arm64": "2.2.4",
"@biomejs/cli-linux-arm64-musl": "2.2.4",
"@biomejs/cli-linux-x64": "2.2.4",
"@biomejs/cli-linux-x64-musl": "2.2.4",
"@biomejs/cli-win32-arm64": "2.2.4",
"@biomejs/cli-win32-x64": "2.2.4"
}
},
"node_modules/@biomejs/cli-darwin-arm64": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.2.tgz",
"integrity": "sha512-6ePfbCeCPryWu0CXlzsWNZgVz/kBEvHiPyNpmViSt6A2eoDf4kXs3YnwQPzGjy8oBgQulrHcLnJL0nkCh80mlQ==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.4.tgz",
"integrity": "sha512-RJe2uiyaloN4hne4d2+qVj3d3gFJFbmrr5PYtkkjei1O9c+BjGXgpUPVbi8Pl8syumhzJjFsSIYkcLt2VlVLMA==",
"cpu": [
"arm64"
],
@@ -945,9 +945,9 @@
}
},
"node_modules/@biomejs/cli-darwin-x64": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.2.tgz",
"integrity": "sha512-Tn4JmVO+rXsbRslml7FvKaNrlgUeJot++FkvYIhl1OkslVCofAtS35MPlBMhXgKWF9RNr9cwHanrPTUUXcYGag==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.4.tgz",
"integrity": "sha512-cFsdB4ePanVWfTnPVaUX+yr8qV8ifxjBKMkZwN7gKb20qXPxd/PmwqUH8mY5wnM9+U0QwM76CxFyBRJhC9tQwg==",
"cpu": [
"x64"
],
@@ -962,9 +962,9 @@
}
},
"node_modules/@biomejs/cli-linux-arm64": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.2.tgz",
"integrity": "sha512-JfrK3gdmWWTh2J5tq/rcWCOsImVyzUnOS2fkjhiYKCQ+v8PqM+du5cfB7G1kXas+7KQeKSWALv18iQqdtIMvzw==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.4.tgz",
"integrity": "sha512-M/Iz48p4NAzMXOuH+tsn5BvG/Jb07KOMTdSVwJpicmhN309BeEyRyQX+n1XDF0JVSlu28+hiTQ2L4rZPvu7nMw==",
"cpu": [
"arm64"
],
@@ -979,9 +979,9 @@
}
},
"node_modules/@biomejs/cli-linux-arm64-musl": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.2.tgz",
"integrity": "sha512-/MhYg+Bd6renn6i1ylGFL5snYUn/Ct7zoGVKhxnro3bwekiZYE8Kl39BSb0MeuqM+72sThkQv4TnNubU9njQRw==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.4.tgz",
"integrity": "sha512-7TNPkMQEWfjvJDaZRSkDCPT/2r5ESFPKx+TEev+I2BXDGIjfCZk2+b88FOhnJNHtksbOZv8ZWnxrA5gyTYhSsQ==",
"cpu": [
"arm64"
],
@@ -996,9 +996,9 @@
}
},
"node_modules/@biomejs/cli-linux-x64": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.2.tgz",
"integrity": "sha512-Ogb+77edO5LEP/xbNicACOWVLt8mgC+E1wmpUakr+O4nKwLt9vXe74YNuT3T1dUBxC/SnrVmlzZFC7kQJEfquQ==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.4.tgz",
"integrity": "sha512-orr3nnf2Dpb2ssl6aihQtvcKtLySLta4E2UcXdp7+RTa7mfJjBgIsbS0B9GC8gVu0hjOu021aU8b3/I1tn+pVQ==",
"cpu": [
"x64"
],
@@ -1013,9 +1013,9 @@
}
},
"node_modules/@biomejs/cli-linux-x64-musl": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.2.tgz",
"integrity": "sha512-ZCLXcZvjZKSiRY/cFANKg+z6Fhsf9MHOzj+NrDQcM+LbqYRT97LyCLWy2AS+W2vP+i89RyRM+kbGpUzbRTYWig==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.4.tgz",
"integrity": "sha512-m41nFDS0ksXK2gwXL6W6yZTYPMH0LughqbsxInSKetoH6morVj43szqKx79Iudkp8WRT5SxSh7qVb8KCUiewGg==",
"cpu": [
"x64"
],
@@ -1030,9 +1030,9 @@
}
},
"node_modules/@biomejs/cli-win32-arm64": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.2.tgz",
"integrity": "sha512-wBe2wItayw1zvtXysmHJQoQqXlTzHSpQRyPpJKiNIR21HzH/CrZRDFic1C1jDdp+zAPtqhNExa0owKMbNwW9cQ==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.4.tgz",
"integrity": "sha512-NXnfTeKHDFUWfxAefa57DiGmu9VyKi0cDqFpdI+1hJWQjGJhJutHPX0b5m+eXvTKOaf+brU+P0JrQAZMb5yYaQ==",
"cpu": [
"arm64"
],
@@ -1047,9 +1047,9 @@
}
},
"node_modules/@biomejs/cli-win32-x64": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.2.tgz",
"integrity": "sha512-DAuHhHekGfiGb6lCcsT4UyxQmVwQiBCBUMwVra/dcOSs9q8OhfaZgey51MlekT3p8UwRqtXQfFuEJBhJNdLZwg==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.4.tgz",
"integrity": "sha512-3Y4V4zVRarVh/B/eSHczR4LYoSVyv3Dfuvm3cWs5w/HScccS0+Wt/lHOcDTRYeHjQmMYVC3rIRWqyN2EI52+zg==",
"cpu": [
"x64"
],
@@ -1216,16 +1216,16 @@
}
},
"node_modules/@jest/core": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/@jest/core/-/core-30.1.2.tgz",
"integrity": "sha512-iSLOojkYgM7Lw0FF5egecZh+CiLWe4xICM3WOMjFbewhbWn+ixEoPwY7oK9jSCnLLphMFAjussXp7CE3tHa5EA==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/@jest/core/-/core-30.1.3.tgz",
"integrity": "sha512-LIQz7NEDDO1+eyOA2ZmkiAyYvZuo6s1UxD/e2IHldR6D7UYogVq3arTmli07MkENLq6/3JEQjp0mA8rrHHJ8KQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/console": "30.1.2",
"@jest/pattern": "30.0.1",
"@jest/reporters": "30.1.2",
"@jest/test-result": "30.1.2",
"@jest/reporters": "30.1.3",
"@jest/test-result": "30.1.3",
"@jest/transform": "30.1.2",
"@jest/types": "30.0.5",
"@types/node": "*",
@@ -1235,18 +1235,18 @@
"exit-x": "^0.2.2",
"graceful-fs": "^4.2.11",
"jest-changed-files": "30.0.5",
"jest-config": "30.1.2",
"jest-config": "30.1.3",
"jest-haste-map": "30.1.0",
"jest-message-util": "30.1.0",
"jest-regex-util": "30.0.1",
"jest-resolve": "30.1.0",
"jest-resolve-dependencies": "30.1.2",
"jest-runner": "30.1.2",
"jest-runtime": "30.1.2",
"jest-resolve": "30.1.3",
"jest-resolve-dependencies": "30.1.3",
"jest-runner": "30.1.3",
"jest-runtime": "30.1.3",
"jest-snapshot": "30.1.2",
"jest-util": "30.0.5",
"jest-validate": "30.1.0",
"jest-watcher": "30.1.2",
"jest-watcher": "30.1.3",
"micromatch": "^4.0.8",
"pretty-format": "30.0.5",
"slash": "^3.0.0"
@@ -1375,15 +1375,15 @@
}
},
"node_modules/@jest/reporters": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.1.2.tgz",
"integrity": "sha512-8Jd7y3DUFBn8dG/bNJ2blmaJmT2Up74WAXkUJsbL0OuEZHDRRMnS4JmRtLArW2d0H5k8RDdhNN7j70Ki16Zr5g==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.1.3.tgz",
"integrity": "sha512-VWEQmJWfXMOrzdFEOyGjUEOuVXllgZsoPtEHZzfdNz18RmzJ5nlR6kp8hDdY8dDS1yGOXAY7DHT+AOHIPSBV0w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@bcoe/v8-coverage": "^0.2.3",
"@jest/console": "30.1.2",
"@jest/test-result": "30.1.2",
"@jest/test-result": "30.1.3",
"@jest/transform": "30.1.2",
"@jest/types": "30.0.5",
"@jridgewell/trace-mapping": "^0.3.25",
@@ -1462,9 +1462,9 @@
}
},
"node_modules/@jest/test-result": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.1.2.tgz",
"integrity": "sha512-mpKFr8DEpfG5aAfQYA5+3KneAsRBXhF7zwtwqT4UeYBckoOPD1MzVxU6gDHwx4gRB7I1MKL6owyJzr8QRq402Q==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.1.3.tgz",
"integrity": "sha512-P9IV8T24D43cNRANPPokn7tZh0FAFnYS2HIfi5vK18CjRkTDR9Y3e1BoEcAJnl4ghZZF4Ecda4M/k41QkvurEQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1478,13 +1478,13 @@
}
},
"node_modules/@jest/test-sequencer": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.1.2.tgz",
"integrity": "sha512-v3vawuj2LC0XjpzF4q0pI0ZlQvMBDNqfRZZ2yHqcsGt7JEYsDK2L1WwrybEGlnOaEvnDFML/Y9xWLiW47Dda8A==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.1.3.tgz",
"integrity": "sha512-82J+hzC0qeQIiiZDThh+YUadvshdBswi5nuyXlEmXzrhw5ZQSRHeQ5LpVMD/xc8B3wPePvs6VMzHnntxL+4E3w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/test-result": "30.1.2",
"@jest/test-result": "30.1.3",
"graceful-fs": "^4.2.11",
"jest-haste-map": "30.1.0",
"slash": "^3.0.0"
@@ -1611,16 +1611,16 @@
}
},
"node_modules/@octokit/core": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.3.tgz",
"integrity": "sha512-oNXsh2ywth5aowwIa7RKtawnkdH6LgU1ztfP9AIUCQCvzysB+WeU8o2kyyosDPwBZutPpjZDKPQGIzzrfTWweQ==",
"version": "7.0.5",
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.5.tgz",
"integrity": "sha512-t54CUOsFMappY1Jbzb7fetWeO0n6K0k/4+/ZpkS+3Joz8I4VcvY9OiEBFRYISqaI2fq5sCiPtAjRDOzVYG8m+Q==",
"license": "MIT",
"dependencies": {
"@octokit/auth-token": "^6.0.0",
"@octokit/graphql": "^9.0.1",
"@octokit/request": "^10.0.2",
"@octokit/request-error": "^7.0.0",
"@octokit/types": "^14.0.0",
"@octokit/graphql": "^9.0.2",
"@octokit/request": "^10.0.4",
"@octokit/request-error": "^7.0.1",
"@octokit/types": "^15.0.0",
"before-after-hook": "^4.0.0",
"universal-user-agent": "^7.0.0"
},
@@ -1628,33 +1628,78 @@
"node": ">= 20"
}
},
"node_modules/@octokit/endpoint": {
"version": "11.0.0",
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.0.tgz",
"integrity": "sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ==",
"node_modules/@octokit/core/node_modules/@octokit/openapi-types": {
"version": "26.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz",
"integrity": "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA==",
"license": "MIT"
},
"node_modules/@octokit/core/node_modules/@octokit/types": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-15.0.0.tgz",
"integrity": "sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ==",
"license": "MIT",
"dependencies": {
"@octokit/types": "^14.0.0",
"@octokit/openapi-types": "^26.0.0"
}
},
"node_modules/@octokit/endpoint": {
"version": "11.0.1",
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.1.tgz",
"integrity": "sha512-7P1dRAZxuWAOPI7kXfio88trNi/MegQ0IJD3vfgC3b+LZo1Qe6gRJc2v0mz2USWWJOKrB2h5spXCzGbw+fAdqA==",
"license": "MIT",
"dependencies": {
"@octokit/types": "^15.0.0",
"universal-user-agent": "^7.0.2"
},
"engines": {
"node": ">= 20"
}
},
"node_modules/@octokit/graphql": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.1.tgz",
"integrity": "sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg==",
"node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": {
"version": "26.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz",
"integrity": "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA==",
"license": "MIT"
},
"node_modules/@octokit/endpoint/node_modules/@octokit/types": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-15.0.0.tgz",
"integrity": "sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ==",
"license": "MIT",
"dependencies": {
"@octokit/request": "^10.0.2",
"@octokit/types": "^14.0.0",
"@octokit/openapi-types": "^26.0.0"
}
},
"node_modules/@octokit/graphql": {
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.2.tgz",
"integrity": "sha512-iz6KzZ7u95Fzy9Nt2L8cG88lGRMr/qy1Q36ih/XVzMIlPDMYwaNLE/ENhqmIzgPrlNWiYJkwmveEetvxAgFBJw==",
"license": "MIT",
"dependencies": {
"@octokit/request": "^10.0.4",
"@octokit/types": "^15.0.0",
"universal-user-agent": "^7.0.0"
},
"engines": {
"node": ">= 20"
}
},
"node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": {
"version": "26.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz",
"integrity": "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA==",
"license": "MIT"
},
"node_modules/@octokit/graphql/node_modules/@octokit/types": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-15.0.0.tgz",
"integrity": "sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ==",
"license": "MIT",
"dependencies": {
"@octokit/openapi-types": "^26.0.0"
}
},
"node_modules/@octokit/openapi-types": {
"version": "25.1.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz",
@@ -1677,12 +1722,12 @@
}
},
"node_modules/@octokit/plugin-rest-endpoint-methods": {
"version": "16.0.0",
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-16.0.0.tgz",
"integrity": "sha512-kJVUQk6/dx/gRNLWUnAWKFs1kVPn5O5CYZyssyEoNYaFedqZxsfYs7DwI3d67hGz4qOwaJ1dpm07hOAD1BXx6g==",
"version": "16.1.0",
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-16.1.0.tgz",
"integrity": "sha512-nCsyiKoGRnhH5LkH8hJEZb9swpqOcsW+VXv1QoyUNQXJeVODG4+xM6UICEqyqe9XFr6LkL8BIiFCPev8zMDXPw==",
"license": "MIT",
"dependencies": {
"@octokit/types": "^14.1.0"
"@octokit/types": "^15.0.0"
},
"engines": {
"node": ">= 20"
@@ -1691,15 +1736,30 @@
"@octokit/core": ">=6"
}
},
"node_modules/@octokit/request": {
"version": "10.0.2",
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.2.tgz",
"integrity": "sha512-iYj4SJG/2bbhh+iIpFmG5u49DtJ4lipQ+aPakjL9OKpsGY93wM8w06gvFbEQxcMsZcCvk5th5KkIm2m8o14aWA==",
"node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": {
"version": "26.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz",
"integrity": "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA==",
"license": "MIT"
},
"node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-15.0.0.tgz",
"integrity": "sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ==",
"license": "MIT",
"dependencies": {
"@octokit/endpoint": "^11.0.0",
"@octokit/request-error": "^7.0.0",
"@octokit/types": "^14.0.0",
"@octokit/openapi-types": "^26.0.0"
}
},
"node_modules/@octokit/request": {
"version": "10.0.5",
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.5.tgz",
"integrity": "sha512-TXnouHIYLtgDhKo+N6mXATnDBkV05VwbR0TtMWpgTHIoQdRQfCSzmy/LGqR1AbRMbijq/EckC/E3/ZNcU92NaQ==",
"license": "MIT",
"dependencies": {
"@octokit/endpoint": "^11.0.1",
"@octokit/request-error": "^7.0.1",
"@octokit/types": "^15.0.0",
"fast-content-type-parse": "^3.0.0",
"universal-user-agent": "^7.0.2"
},
@@ -1708,17 +1768,47 @@
}
},
"node_modules/@octokit/request-error": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.0.0.tgz",
"integrity": "sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg==",
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.0.1.tgz",
"integrity": "sha512-CZpFwV4+1uBrxu7Cw8E5NCXDWFNf18MSY23TdxCBgjw1tXXHvTrZVsXlW8hgFTOLw8RQR1BBrMvYRtuyaijHMA==",
"license": "MIT",
"dependencies": {
"@octokit/types": "^14.0.0"
"@octokit/types": "^15.0.0"
},
"engines": {
"node": ">= 20"
}
},
"node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": {
"version": "26.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz",
"integrity": "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA==",
"license": "MIT"
},
"node_modules/@octokit/request-error/node_modules/@octokit/types": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-15.0.0.tgz",
"integrity": "sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ==",
"license": "MIT",
"dependencies": {
"@octokit/openapi-types": "^26.0.0"
}
},
"node_modules/@octokit/request/node_modules/@octokit/openapi-types": {
"version": "26.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz",
"integrity": "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA==",
"license": "MIT"
},
"node_modules/@octokit/request/node_modules/@octokit/types": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-15.0.0.tgz",
"integrity": "sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ==",
"license": "MIT",
"dependencies": {
"@octokit/openapi-types": "^26.0.0"
}
},
"node_modules/@octokit/types": {
"version": "14.1.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz",
@@ -1776,10 +1866,9 @@
}
},
"node_modules/@renovatebot/pep440": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@renovatebot/pep440/-/pep440-4.2.0.tgz",
"integrity": "sha512-hT7WcjHbZdx3U9iRKuGwgm1l2wFS+FrWEdX+EQ5i+VAI6tWdcktFtdwDTNIqSwklOW1Vng55om8c4RrPHCmiIQ==",
"license": "Apache-2.0",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@renovatebot/pep440/-/pep440-4.2.1.tgz",
"integrity": "sha512-2FK1hF93Fuf1laSdfiEmJvSJPVIDHEUTz68D3Fi9s0IZrrpaEcj6pTFBTbYvsgC5du4ogrtf5re7yMMvrKNgkw==",
"engines": {
"node": "^20.9.0 || ^22.11.0 || ^24",
"pnpm": "^10.0.0"
@@ -1813,9 +1902,9 @@
}
},
"node_modules/@tybys/wasm-util": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz",
"integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==",
"version": "0.10.1",
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
"integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
"dev": true,
"license": "MIT",
"optional": true,
@@ -1911,12 +2000,12 @@
"license": "MIT"
},
"node_modules/@types/node": {
"version": "24.3.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz",
"integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==",
"version": "24.7.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz",
"integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==",
"license": "MIT",
"dependencies": {
"undici-types": "~7.10.0"
"undici-types": "~7.14.0"
}
},
"node_modules/@types/node-fetch": {
@@ -1945,9 +2034,9 @@
}
},
"node_modules/@types/semver": {
"version": "7.7.0",
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz",
"integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==",
"version": "7.7.1",
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz",
"integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==",
"dev": true,
"license": "MIT"
},
@@ -2260,10 +2349,11 @@
]
},
"node_modules/@vercel/ncc": {
"version": "0.38.3",
"resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.3.tgz",
"integrity": "sha512-rnK6hJBS6mwc+Bkab+PGPs9OiS0i/3kdTO+CkI8V0/VrW3vmz7O2Pxjw/owOlmo6PKEIxRSeZKv/kuL9itnpYA==",
"version": "0.38.4",
"resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.4.tgz",
"integrity": "sha512-8LwjnlP39s08C08J5NstzriPvW1SP8Zfpp1BvC2sI35kPeZnHfxVkCwu4/+Wodgnd60UtT1n8K8zw+Mp7J9JmQ==",
"dev": true,
"license": "MIT",
"bin": {
"ncc": "dist/ncc/cli.js"
}
@@ -2309,9 +2399,9 @@
}
},
"node_modules/ansi-regex": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz",
"integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==",
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
"integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2824,9 +2914,9 @@
}
},
"node_modules/dedent": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz",
"integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==",
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz",
"integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==",
"dev": true,
"license": "MIT",
"peerDependencies": {
@@ -3633,16 +3723,16 @@
}
},
"node_modules/jest": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/jest/-/jest-30.1.2.tgz",
"integrity": "sha512-iLreJmUWdANLD2UIbebrXxQqU9jIxv2ahvrBNfff55deL9DtVxm8ZJBLk/kmn0AQ+FyCTrNSlGbMdTgSasldYA==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest/-/jest-30.1.3.tgz",
"integrity": "sha512-Ry+p2+NLk6u8Agh5yVqELfUJvRfV51hhVBRIB5yZPY7mU0DGBmOuFG5GebZbMbm86cdQNK0fhJuDX8/1YorISQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/core": "30.1.2",
"@jest/core": "30.1.3",
"@jest/types": "30.0.5",
"import-local": "^3.2.0",
"jest-cli": "30.1.2"
"jest-cli": "30.1.3"
},
"bin": {
"jest": "bin/jest.js"
@@ -3675,15 +3765,15 @@
}
},
"node_modules/jest-circus": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.1.2.tgz",
"integrity": "sha512-pyqgRv00fPbU3QBjN9I5QRd77eCWA19NA7BLgI1veFvbUIFpeDCKbnG1oyRr6q5/jPEW2zDfqZ/r6fvfE85vrA==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.1.3.tgz",
"integrity": "sha512-Yf3dnhRON2GJT4RYzM89t/EXIWNxKTpWTL9BfF3+geFetWP4XSvJjiU1vrWplOiUkmq8cHLiwuhz+XuUp9DscA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/environment": "30.1.2",
"@jest/expect": "30.1.2",
"@jest/test-result": "30.1.2",
"@jest/test-result": "30.1.3",
"@jest/types": "30.0.5",
"@types/node": "*",
"chalk": "^4.1.2",
@@ -3693,7 +3783,7 @@
"jest-each": "30.1.0",
"jest-matcher-utils": "30.1.2",
"jest-message-util": "30.1.0",
"jest-runtime": "30.1.2",
"jest-runtime": "30.1.3",
"jest-snapshot": "30.1.2",
"jest-util": "30.0.5",
"p-limit": "^3.1.0",
@@ -3707,19 +3797,19 @@
}
},
"node_modules/jest-cli": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.1.2.tgz",
"integrity": "sha512-Q7H6GGo/0TBB8Mhm3Ab7KKJHn6GeMVff+/8PVCQ7vXXahvr5sRERnNbxuVJAMiVY2JQm5roA7CHYOYlH+gzmUg==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.1.3.tgz",
"integrity": "sha512-G8E2Ol3OKch1DEeIBl41NP7OiC6LBhfg25Btv+idcusmoUSpqUkbrneMqbW9lVpI/rCKb/uETidb7DNteheuAQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/core": "30.1.2",
"@jest/test-result": "30.1.2",
"@jest/core": "30.1.3",
"@jest/test-result": "30.1.3",
"@jest/types": "30.0.5",
"chalk": "^4.1.2",
"exit-x": "^0.2.2",
"import-local": "^3.2.0",
"jest-config": "30.1.2",
"jest-config": "30.1.3",
"jest-util": "30.0.5",
"jest-validate": "30.1.0",
"yargs": "^17.7.2"
@@ -3740,16 +3830,16 @@
}
},
"node_modules/jest-config": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.1.2.tgz",
"integrity": "sha512-gCuBeE/cksjQ3e1a8H4YglZJuVPcnLZQK9jC70E6GbkHNQKPasnOO+r9IYdsUbAekb6c7eVRR8laGLMF06gMqg==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.1.3.tgz",
"integrity": "sha512-M/f7gqdQEPgZNA181Myz+GXCe8jXcJsGjCMXUzRj22FIXsZOyHNte84e0exntOvdPaeh9tA0w+B8qlP2fAezfw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.27.4",
"@jest/get-type": "30.1.0",
"@jest/pattern": "30.0.1",
"@jest/test-sequencer": "30.1.2",
"@jest/test-sequencer": "30.1.3",
"@jest/types": "30.0.5",
"babel-jest": "30.1.2",
"chalk": "^4.1.2",
@@ -3757,12 +3847,12 @@
"deepmerge": "^4.3.1",
"glob": "^10.3.10",
"graceful-fs": "^4.2.11",
"jest-circus": "30.1.2",
"jest-circus": "30.1.3",
"jest-docblock": "30.0.1",
"jest-environment-node": "30.1.2",
"jest-regex-util": "30.0.1",
"jest-resolve": "30.1.0",
"jest-runner": "30.1.2",
"jest-resolve": "30.1.3",
"jest-runner": "30.1.3",
"jest-util": "30.0.5",
"jest-validate": "30.1.0",
"micromatch": "^4.0.8",
@@ -3976,9 +4066,9 @@
}
},
"node_modules/jest-resolve": {
"version": "30.1.0",
"resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.1.0.tgz",
"integrity": "sha512-hASe7D/wRtZw8Cm607NrlF7fi3HWC5wmA5jCVc2QjQAB2pTwP9eVZILGEi6OeSLNUtE1zb04sXRowsdh5CUjwA==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.1.3.tgz",
"integrity": "sha512-DI4PtTqzw9GwELFS41sdMK32Ajp3XZQ8iygeDMWkxlRhm7uUTOFSZFVZABFuxr0jvspn8MAYy54NxZCsuCTSOw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3996,9 +4086,9 @@
}
},
"node_modules/jest-resolve-dependencies": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.1.2.tgz",
"integrity": "sha512-HJjyoaedY4wrwda+eqvgjbwFykrAnQEmhuT0bMyOV3GQIyLPcunZcjfkm77Zr11ujwl34ySdc4qYnm7SG75TjA==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.1.3.tgz",
"integrity": "sha512-DNfq3WGmuRyHRHfEet+Zm3QOmVFtIarUOQHHryKPc0YL9ROfgWZxl4+aZq/VAzok2SS3gZdniP+dO4zgo59hBg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4010,15 +4100,15 @@
}
},
"node_modules/jest-runner": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.1.2.tgz",
"integrity": "sha512-eu9AzpDY/QV+7NuMg6fZMpQ7M24cBkl5dyS1Xj7iwDPDriOmLUXR8rLojESibcIX+sCDTO4KvUeaxWCH1fbTvg==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.1.3.tgz",
"integrity": "sha512-dd1ORcxQraW44Uz029TtXj85W11yvLpDuIzNOlofrC8GN+SgDlgY4BvyxJiVeuabA1t6idjNbX59jLd2oplOGQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/console": "30.1.2",
"@jest/environment": "30.1.2",
"@jest/test-result": "30.1.2",
"@jest/test-result": "30.1.3",
"@jest/transform": "30.1.2",
"@jest/types": "30.0.5",
"@types/node": "*",
@@ -4031,10 +4121,10 @@
"jest-haste-map": "30.1.0",
"jest-leak-detector": "30.1.0",
"jest-message-util": "30.1.0",
"jest-resolve": "30.1.0",
"jest-runtime": "30.1.2",
"jest-resolve": "30.1.3",
"jest-runtime": "30.1.3",
"jest-util": "30.0.5",
"jest-watcher": "30.1.2",
"jest-watcher": "30.1.3",
"jest-worker": "30.1.0",
"p-limit": "^3.1.0",
"source-map-support": "0.5.13"
@@ -4044,9 +4134,9 @@
}
},
"node_modules/jest-runtime": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.1.2.tgz",
"integrity": "sha512-zU02si+lAITgyRmVRgJn/AB4cnakq8+o7bP+5Z+N1A4r2mq40zGbmrg3UpYQWCkeim17tx8w1Tnmt6tQ6y9PGA==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.1.3.tgz",
"integrity": "sha512-WS8xgjuNSphdIGnleQcJ3AKE4tBKOVP+tKhCD0u+Tb2sBmsU8DxfbBpZX7//+XOz81zVs4eFpJQwBNji2Y07DA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4054,7 +4144,7 @@
"@jest/fake-timers": "30.1.2",
"@jest/globals": "30.1.2",
"@jest/source-map": "30.0.1",
"@jest/test-result": "30.1.2",
"@jest/test-result": "30.1.3",
"@jest/transform": "30.1.2",
"@jest/types": "30.0.5",
"@types/node": "*",
@@ -4067,7 +4157,7 @@
"jest-message-util": "30.1.0",
"jest-mock": "30.0.5",
"jest-regex-util": "30.0.1",
"jest-resolve": "30.1.0",
"jest-resolve": "30.1.3",
"jest-snapshot": "30.1.2",
"jest-util": "30.0.5",
"slash": "^3.0.0",
@@ -4186,13 +4276,13 @@
}
},
"node_modules/jest-watcher": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.1.2.tgz",
"integrity": "sha512-MtoGuEgqsBM8Jkn52oEj+mXLtF94+njPlHI5ydfduZL5MHrTFr14ZG1CUX1xAbY23dbSZCCEkEPhBM3cQd12Jg==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.1.3.tgz",
"integrity": "sha512-6jQUZCP1BTL2gvG9E4YF06Ytq4yMb4If6YoQGRR6PpjtqOXSP3sKe2kqwB6SQ+H9DezOfZaSLnmka1NtGm3fCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/test-result": "30.1.2",
"@jest/test-result": "30.1.3",
"@jest/types": "30.0.5",
"@types/node": "*",
"ansi-escapes": "^4.3.2",
@@ -5067,9 +5157,9 @@
}
},
"node_modules/strip-ansi": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
"integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5228,9 +5318,9 @@
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
"node_modules/ts-jest": {
"version": "29.4.1",
"resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.1.tgz",
"integrity": "sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==",
"version": "29.4.4",
"resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.4.tgz",
"integrity": "sha512-ccVcRABct5ZELCT5U0+DZwkXMCcOCLi2doHRrKy1nK/s7J7bch6TzJMsrY09WxgUUIP/ITfmcDS8D2yl63rnXw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5358,18 +5448,18 @@
}
},
"node_modules/undici": {
"version": "7.15.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.15.0.tgz",
"integrity": "sha512-7oZJCPvvMvTd0OlqWsIxTuItTpJBpU1tcbVl24FMn3xt3+VSunwUasmfPJRE57oNO1KsZ4PgA1xTdAX4hq8NyQ==",
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz",
"integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==",
"license": "MIT",
"engines": {
"node": ">=20.18.1"
}
},
"node_modules/undici-types": {
"version": "7.10.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz",
"integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
"version": "7.14.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz",
"integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==",
"license": "MIT"
},
"node_modules/universal-user-agent": {
@@ -5588,9 +5678,9 @@
}
},
"node_modules/wrap-ansi/node_modules/ansi-styles": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
"version": "6.2.3",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
"integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -6406,74 +6496,74 @@
"dev": true
},
"@biomejs/biome": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.2.tgz",
"integrity": "sha512-j1omAiQWCkhuLgwpMKisNKnsM6W8Xtt1l0WZmqY/dFj8QPNkIoTvk4tSsi40FaAAkBE1PU0AFG2RWFBWenAn+w==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.4.tgz",
"integrity": "sha512-TBHU5bUy/Ok6m8c0y3pZiuO/BZoY/OcGxoLlrfQof5s8ISVwbVBdFINPQZyFfKwil8XibYWb7JMwnT8wT4WVPg==",
"dev": true,
"requires": {
"@biomejs/cli-darwin-arm64": "2.2.2",
"@biomejs/cli-darwin-x64": "2.2.2",
"@biomejs/cli-linux-arm64": "2.2.2",
"@biomejs/cli-linux-arm64-musl": "2.2.2",
"@biomejs/cli-linux-x64": "2.2.2",
"@biomejs/cli-linux-x64-musl": "2.2.2",
"@biomejs/cli-win32-arm64": "2.2.2",
"@biomejs/cli-win32-x64": "2.2.2"
"@biomejs/cli-darwin-arm64": "2.2.4",
"@biomejs/cli-darwin-x64": "2.2.4",
"@biomejs/cli-linux-arm64": "2.2.4",
"@biomejs/cli-linux-arm64-musl": "2.2.4",
"@biomejs/cli-linux-x64": "2.2.4",
"@biomejs/cli-linux-x64-musl": "2.2.4",
"@biomejs/cli-win32-arm64": "2.2.4",
"@biomejs/cli-win32-x64": "2.2.4"
}
},
"@biomejs/cli-darwin-arm64": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.2.tgz",
"integrity": "sha512-6ePfbCeCPryWu0CXlzsWNZgVz/kBEvHiPyNpmViSt6A2eoDf4kXs3YnwQPzGjy8oBgQulrHcLnJL0nkCh80mlQ==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.4.tgz",
"integrity": "sha512-RJe2uiyaloN4hne4d2+qVj3d3gFJFbmrr5PYtkkjei1O9c+BjGXgpUPVbi8Pl8syumhzJjFsSIYkcLt2VlVLMA==",
"dev": true,
"optional": true
},
"@biomejs/cli-darwin-x64": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.2.tgz",
"integrity": "sha512-Tn4JmVO+rXsbRslml7FvKaNrlgUeJot++FkvYIhl1OkslVCofAtS35MPlBMhXgKWF9RNr9cwHanrPTUUXcYGag==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.4.tgz",
"integrity": "sha512-cFsdB4ePanVWfTnPVaUX+yr8qV8ifxjBKMkZwN7gKb20qXPxd/PmwqUH8mY5wnM9+U0QwM76CxFyBRJhC9tQwg==",
"dev": true,
"optional": true
},
"@biomejs/cli-linux-arm64": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.2.tgz",
"integrity": "sha512-JfrK3gdmWWTh2J5tq/rcWCOsImVyzUnOS2fkjhiYKCQ+v8PqM+du5cfB7G1kXas+7KQeKSWALv18iQqdtIMvzw==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.4.tgz",
"integrity": "sha512-M/Iz48p4NAzMXOuH+tsn5BvG/Jb07KOMTdSVwJpicmhN309BeEyRyQX+n1XDF0JVSlu28+hiTQ2L4rZPvu7nMw==",
"dev": true,
"optional": true
},
"@biomejs/cli-linux-arm64-musl": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.2.tgz",
"integrity": "sha512-/MhYg+Bd6renn6i1ylGFL5snYUn/Ct7zoGVKhxnro3bwekiZYE8Kl39BSb0MeuqM+72sThkQv4TnNubU9njQRw==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.4.tgz",
"integrity": "sha512-7TNPkMQEWfjvJDaZRSkDCPT/2r5ESFPKx+TEev+I2BXDGIjfCZk2+b88FOhnJNHtksbOZv8ZWnxrA5gyTYhSsQ==",
"dev": true,
"optional": true
},
"@biomejs/cli-linux-x64": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.2.tgz",
"integrity": "sha512-Ogb+77edO5LEP/xbNicACOWVLt8mgC+E1wmpUakr+O4nKwLt9vXe74YNuT3T1dUBxC/SnrVmlzZFC7kQJEfquQ==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.4.tgz",
"integrity": "sha512-orr3nnf2Dpb2ssl6aihQtvcKtLySLta4E2UcXdp7+RTa7mfJjBgIsbS0B9GC8gVu0hjOu021aU8b3/I1tn+pVQ==",
"dev": true,
"optional": true
},
"@biomejs/cli-linux-x64-musl": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.2.tgz",
"integrity": "sha512-ZCLXcZvjZKSiRY/cFANKg+z6Fhsf9MHOzj+NrDQcM+LbqYRT97LyCLWy2AS+W2vP+i89RyRM+kbGpUzbRTYWig==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.4.tgz",
"integrity": "sha512-m41nFDS0ksXK2gwXL6W6yZTYPMH0LughqbsxInSKetoH6morVj43szqKx79Iudkp8WRT5SxSh7qVb8KCUiewGg==",
"dev": true,
"optional": true
},
"@biomejs/cli-win32-arm64": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.2.tgz",
"integrity": "sha512-wBe2wItayw1zvtXysmHJQoQqXlTzHSpQRyPpJKiNIR21HzH/CrZRDFic1C1jDdp+zAPtqhNExa0owKMbNwW9cQ==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.4.tgz",
"integrity": "sha512-NXnfTeKHDFUWfxAefa57DiGmu9VyKi0cDqFpdI+1hJWQjGJhJutHPX0b5m+eXvTKOaf+brU+P0JrQAZMb5yYaQ==",
"dev": true,
"optional": true
},
"@biomejs/cli-win32-x64": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.2.tgz",
"integrity": "sha512-DAuHhHekGfiGb6lCcsT4UyxQmVwQiBCBUMwVra/dcOSs9q8OhfaZgey51MlekT3p8UwRqtXQfFuEJBhJNdLZwg==",
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.4.tgz",
"integrity": "sha512-3Y4V4zVRarVh/B/eSHczR4LYoSVyv3Dfuvm3cWs5w/HScccS0+Wt/lHOcDTRYeHjQmMYVC3rIRWqyN2EI52+zg==",
"dev": true,
"optional": true
},
@@ -6609,15 +6699,15 @@
}
},
"@jest/core": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/@jest/core/-/core-30.1.2.tgz",
"integrity": "sha512-iSLOojkYgM7Lw0FF5egecZh+CiLWe4xICM3WOMjFbewhbWn+ixEoPwY7oK9jSCnLLphMFAjussXp7CE3tHa5EA==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/@jest/core/-/core-30.1.3.tgz",
"integrity": "sha512-LIQz7NEDDO1+eyOA2ZmkiAyYvZuo6s1UxD/e2IHldR6D7UYogVq3arTmli07MkENLq6/3JEQjp0mA8rrHHJ8KQ==",
"dev": true,
"requires": {
"@jest/console": "30.1.2",
"@jest/pattern": "30.0.1",
"@jest/reporters": "30.1.2",
"@jest/test-result": "30.1.2",
"@jest/reporters": "30.1.3",
"@jest/test-result": "30.1.3",
"@jest/transform": "30.1.2",
"@jest/types": "30.0.5",
"@types/node": "*",
@@ -6627,18 +6717,18 @@
"exit-x": "^0.2.2",
"graceful-fs": "^4.2.11",
"jest-changed-files": "30.0.5",
"jest-config": "30.1.2",
"jest-config": "30.1.3",
"jest-haste-map": "30.1.0",
"jest-message-util": "30.1.0",
"jest-regex-util": "30.0.1",
"jest-resolve": "30.1.0",
"jest-resolve-dependencies": "30.1.2",
"jest-runner": "30.1.2",
"jest-runtime": "30.1.2",
"jest-resolve": "30.1.3",
"jest-resolve-dependencies": "30.1.3",
"jest-runner": "30.1.3",
"jest-runtime": "30.1.3",
"jest-snapshot": "30.1.2",
"jest-util": "30.0.5",
"jest-validate": "30.1.0",
"jest-watcher": "30.1.2",
"jest-watcher": "30.1.3",
"micromatch": "^4.0.8",
"pretty-format": "30.0.5",
"slash": "^3.0.0"
@@ -6724,14 +6814,14 @@
}
},
"@jest/reporters": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.1.2.tgz",
"integrity": "sha512-8Jd7y3DUFBn8dG/bNJ2blmaJmT2Up74WAXkUJsbL0OuEZHDRRMnS4JmRtLArW2d0H5k8RDdhNN7j70Ki16Zr5g==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.1.3.tgz",
"integrity": "sha512-VWEQmJWfXMOrzdFEOyGjUEOuVXllgZsoPtEHZzfdNz18RmzJ5nlR6kp8hDdY8dDS1yGOXAY7DHT+AOHIPSBV0w==",
"dev": true,
"requires": {
"@bcoe/v8-coverage": "^0.2.3",
"@jest/console": "30.1.2",
"@jest/test-result": "30.1.2",
"@jest/test-result": "30.1.3",
"@jest/transform": "30.1.2",
"@jest/types": "30.0.5",
"@jridgewell/trace-mapping": "^0.3.25",
@@ -6787,9 +6877,9 @@
}
},
"@jest/test-result": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.1.2.tgz",
"integrity": "sha512-mpKFr8DEpfG5aAfQYA5+3KneAsRBXhF7zwtwqT4UeYBckoOPD1MzVxU6gDHwx4gRB7I1MKL6owyJzr8QRq402Q==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.1.3.tgz",
"integrity": "sha512-P9IV8T24D43cNRANPPokn7tZh0FAFnYS2HIfi5vK18CjRkTDR9Y3e1BoEcAJnl4ghZZF4Ecda4M/k41QkvurEQ==",
"dev": true,
"requires": {
"@jest/console": "30.1.2",
@@ -6799,12 +6889,12 @@
}
},
"@jest/test-sequencer": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.1.2.tgz",
"integrity": "sha512-v3vawuj2LC0XjpzF4q0pI0ZlQvMBDNqfRZZ2yHqcsGt7JEYsDK2L1WwrybEGlnOaEvnDFML/Y9xWLiW47Dda8A==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.1.3.tgz",
"integrity": "sha512-82J+hzC0qeQIiiZDThh+YUadvshdBswi5nuyXlEmXzrhw5ZQSRHeQ5LpVMD/xc8B3wPePvs6VMzHnntxL+4E3w==",
"dev": true,
"requires": {
"@jest/test-result": "30.1.2",
"@jest/test-result": "30.1.3",
"graceful-fs": "^4.2.11",
"jest-haste-map": "30.1.0",
"slash": "^3.0.0"
@@ -6904,36 +6994,81 @@
"integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w=="
},
"@octokit/core": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.3.tgz",
"integrity": "sha512-oNXsh2ywth5aowwIa7RKtawnkdH6LgU1ztfP9AIUCQCvzysB+WeU8o2kyyosDPwBZutPpjZDKPQGIzzrfTWweQ==",
"version": "7.0.5",
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.5.tgz",
"integrity": "sha512-t54CUOsFMappY1Jbzb7fetWeO0n6K0k/4+/ZpkS+3Joz8I4VcvY9OiEBFRYISqaI2fq5sCiPtAjRDOzVYG8m+Q==",
"requires": {
"@octokit/auth-token": "^6.0.0",
"@octokit/graphql": "^9.0.1",
"@octokit/request": "^10.0.2",
"@octokit/request-error": "^7.0.0",
"@octokit/types": "^14.0.0",
"@octokit/graphql": "^9.0.2",
"@octokit/request": "^10.0.4",
"@octokit/request-error": "^7.0.1",
"@octokit/types": "^15.0.0",
"before-after-hook": "^4.0.0",
"universal-user-agent": "^7.0.0"
},
"dependencies": {
"@octokit/openapi-types": {
"version": "26.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz",
"integrity": "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA=="
},
"@octokit/types": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-15.0.0.tgz",
"integrity": "sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ==",
"requires": {
"@octokit/openapi-types": "^26.0.0"
}
}
}
},
"@octokit/endpoint": {
"version": "11.0.0",
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.0.tgz",
"integrity": "sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ==",
"version": "11.0.1",
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.1.tgz",
"integrity": "sha512-7P1dRAZxuWAOPI7kXfio88trNi/MegQ0IJD3vfgC3b+LZo1Qe6gRJc2v0mz2USWWJOKrB2h5spXCzGbw+fAdqA==",
"requires": {
"@octokit/types": "^14.0.0",
"@octokit/types": "^15.0.0",
"universal-user-agent": "^7.0.2"
},
"dependencies": {
"@octokit/openapi-types": {
"version": "26.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz",
"integrity": "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA=="
},
"@octokit/types": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-15.0.0.tgz",
"integrity": "sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ==",
"requires": {
"@octokit/openapi-types": "^26.0.0"
}
}
}
},
"@octokit/graphql": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.1.tgz",
"integrity": "sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg==",
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.2.tgz",
"integrity": "sha512-iz6KzZ7u95Fzy9Nt2L8cG88lGRMr/qy1Q36ih/XVzMIlPDMYwaNLE/ENhqmIzgPrlNWiYJkwmveEetvxAgFBJw==",
"requires": {
"@octokit/request": "^10.0.2",
"@octokit/types": "^14.0.0",
"@octokit/request": "^10.0.4",
"@octokit/types": "^15.0.0",
"universal-user-agent": "^7.0.0"
},
"dependencies": {
"@octokit/openapi-types": {
"version": "26.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz",
"integrity": "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA=="
},
"@octokit/types": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-15.0.0.tgz",
"integrity": "sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ==",
"requires": {
"@octokit/openapi-types": "^26.0.0"
}
}
}
},
"@octokit/openapi-types": {
@@ -6950,31 +7085,76 @@
}
},
"@octokit/plugin-rest-endpoint-methods": {
"version": "16.0.0",
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-16.0.0.tgz",
"integrity": "sha512-kJVUQk6/dx/gRNLWUnAWKFs1kVPn5O5CYZyssyEoNYaFedqZxsfYs7DwI3d67hGz4qOwaJ1dpm07hOAD1BXx6g==",
"version": "16.1.0",
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-16.1.0.tgz",
"integrity": "sha512-nCsyiKoGRnhH5LkH8hJEZb9swpqOcsW+VXv1QoyUNQXJeVODG4+xM6UICEqyqe9XFr6LkL8BIiFCPev8zMDXPw==",
"requires": {
"@octokit/types": "^14.1.0"
"@octokit/types": "^15.0.0"
},
"dependencies": {
"@octokit/openapi-types": {
"version": "26.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz",
"integrity": "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA=="
},
"@octokit/types": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-15.0.0.tgz",
"integrity": "sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ==",
"requires": {
"@octokit/openapi-types": "^26.0.0"
}
}
}
},
"@octokit/request": {
"version": "10.0.2",
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.2.tgz",
"integrity": "sha512-iYj4SJG/2bbhh+iIpFmG5u49DtJ4lipQ+aPakjL9OKpsGY93wM8w06gvFbEQxcMsZcCvk5th5KkIm2m8o14aWA==",
"version": "10.0.5",
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.5.tgz",
"integrity": "sha512-TXnouHIYLtgDhKo+N6mXATnDBkV05VwbR0TtMWpgTHIoQdRQfCSzmy/LGqR1AbRMbijq/EckC/E3/ZNcU92NaQ==",
"requires": {
"@octokit/endpoint": "^11.0.0",
"@octokit/request-error": "^7.0.0",
"@octokit/types": "^14.0.0",
"@octokit/endpoint": "^11.0.1",
"@octokit/request-error": "^7.0.1",
"@octokit/types": "^15.0.0",
"fast-content-type-parse": "^3.0.0",
"universal-user-agent": "^7.0.2"
},
"dependencies": {
"@octokit/openapi-types": {
"version": "26.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz",
"integrity": "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA=="
},
"@octokit/types": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-15.0.0.tgz",
"integrity": "sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ==",
"requires": {
"@octokit/openapi-types": "^26.0.0"
}
}
}
},
"@octokit/request-error": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.0.0.tgz",
"integrity": "sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg==",
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.0.1.tgz",
"integrity": "sha512-CZpFwV4+1uBrxu7Cw8E5NCXDWFNf18MSY23TdxCBgjw1tXXHvTrZVsXlW8hgFTOLw8RQR1BBrMvYRtuyaijHMA==",
"requires": {
"@octokit/types": "^14.0.0"
"@octokit/types": "^15.0.0"
},
"dependencies": {
"@octokit/openapi-types": {
"version": "26.0.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz",
"integrity": "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA=="
},
"@octokit/types": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-15.0.0.tgz",
"integrity": "sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ==",
"requires": {
"@octokit/openapi-types": "^26.0.0"
}
}
}
},
"@octokit/types": {
@@ -7017,9 +7197,9 @@
}
},
"@renovatebot/pep440": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/@renovatebot/pep440/-/pep440-4.2.0.tgz",
"integrity": "sha512-hT7WcjHbZdx3U9iRKuGwgm1l2wFS+FrWEdX+EQ5i+VAI6tWdcktFtdwDTNIqSwklOW1Vng55om8c4RrPHCmiIQ=="
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@renovatebot/pep440/-/pep440-4.2.1.tgz",
"integrity": "sha512-2FK1hF93Fuf1laSdfiEmJvSJPVIDHEUTz68D3Fi9s0IZrrpaEcj6pTFBTbYvsgC5du4ogrtf5re7yMMvrKNgkw=="
},
"@sinclair/typebox": {
"version": "0.34.38",
@@ -7046,9 +7226,9 @@
}
},
"@tybys/wasm-util": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz",
"integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==",
"version": "0.10.1",
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
"integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
"dev": true,
"optional": true,
"requires": {
@@ -7136,11 +7316,11 @@
"dev": true
},
"@types/node": {
"version": "24.3.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz",
"integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==",
"version": "24.7.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz",
"integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==",
"requires": {
"undici-types": "~7.10.0"
"undici-types": "~7.14.0"
}
},
"@types/node-fetch": {
@@ -7167,9 +7347,9 @@
}
},
"@types/semver": {
"version": "7.7.0",
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz",
"integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==",
"version": "7.7.1",
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz",
"integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==",
"dev": true
},
"@types/stack-utils": {
@@ -7344,9 +7524,9 @@
"optional": true
},
"@vercel/ncc": {
"version": "0.38.3",
"resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.3.tgz",
"integrity": "sha512-rnK6hJBS6mwc+Bkab+PGPs9OiS0i/3kdTO+CkI8V0/VrW3vmz7O2Pxjw/owOlmo6PKEIxRSeZKv/kuL9itnpYA==",
"version": "0.38.4",
"resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.4.tgz",
"integrity": "sha512-8LwjnlP39s08C08J5NstzriPvW1SP8Zfpp1BvC2sI35kPeZnHfxVkCwu4/+Wodgnd60UtT1n8K8zw+Mp7J9JmQ==",
"dev": true
},
"abort-controller": {
@@ -7375,9 +7555,9 @@
}
},
"ansi-regex": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz",
"integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==",
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
"integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true
},
"ansi-styles": {
@@ -7724,9 +7904,9 @@
}
},
"dedent": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz",
"integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==",
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz",
"integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==",
"dev": true,
"requires": {}
},
@@ -8257,15 +8437,15 @@
}
},
"jest": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/jest/-/jest-30.1.2.tgz",
"integrity": "sha512-iLreJmUWdANLD2UIbebrXxQqU9jIxv2ahvrBNfff55deL9DtVxm8ZJBLk/kmn0AQ+FyCTrNSlGbMdTgSasldYA==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest/-/jest-30.1.3.tgz",
"integrity": "sha512-Ry+p2+NLk6u8Agh5yVqELfUJvRfV51hhVBRIB5yZPY7mU0DGBmOuFG5GebZbMbm86cdQNK0fhJuDX8/1YorISQ==",
"dev": true,
"requires": {
"@jest/core": "30.1.2",
"@jest/core": "30.1.3",
"@jest/types": "30.0.5",
"import-local": "^3.2.0",
"jest-cli": "30.1.2"
"jest-cli": "30.1.3"
}
},
"jest-changed-files": {
@@ -8280,14 +8460,14 @@
}
},
"jest-circus": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.1.2.tgz",
"integrity": "sha512-pyqgRv00fPbU3QBjN9I5QRd77eCWA19NA7BLgI1veFvbUIFpeDCKbnG1oyRr6q5/jPEW2zDfqZ/r6fvfE85vrA==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.1.3.tgz",
"integrity": "sha512-Yf3dnhRON2GJT4RYzM89t/EXIWNxKTpWTL9BfF3+geFetWP4XSvJjiU1vrWplOiUkmq8cHLiwuhz+XuUp9DscA==",
"dev": true,
"requires": {
"@jest/environment": "30.1.2",
"@jest/expect": "30.1.2",
"@jest/test-result": "30.1.2",
"@jest/test-result": "30.1.3",
"@jest/types": "30.0.5",
"@types/node": "*",
"chalk": "^4.1.2",
@@ -8297,7 +8477,7 @@
"jest-each": "30.1.0",
"jest-matcher-utils": "30.1.2",
"jest-message-util": "30.1.0",
"jest-runtime": "30.1.2",
"jest-runtime": "30.1.3",
"jest-snapshot": "30.1.2",
"jest-util": "30.0.5",
"p-limit": "^3.1.0",
@@ -8308,33 +8488,33 @@
}
},
"jest-cli": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.1.2.tgz",
"integrity": "sha512-Q7H6GGo/0TBB8Mhm3Ab7KKJHn6GeMVff+/8PVCQ7vXXahvr5sRERnNbxuVJAMiVY2JQm5roA7CHYOYlH+gzmUg==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.1.3.tgz",
"integrity": "sha512-G8E2Ol3OKch1DEeIBl41NP7OiC6LBhfg25Btv+idcusmoUSpqUkbrneMqbW9lVpI/rCKb/uETidb7DNteheuAQ==",
"dev": true,
"requires": {
"@jest/core": "30.1.2",
"@jest/test-result": "30.1.2",
"@jest/core": "30.1.3",
"@jest/test-result": "30.1.3",
"@jest/types": "30.0.5",
"chalk": "^4.1.2",
"exit-x": "^0.2.2",
"import-local": "^3.2.0",
"jest-config": "30.1.2",
"jest-config": "30.1.3",
"jest-util": "30.0.5",
"jest-validate": "30.1.0",
"yargs": "^17.7.2"
}
},
"jest-config": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.1.2.tgz",
"integrity": "sha512-gCuBeE/cksjQ3e1a8H4YglZJuVPcnLZQK9jC70E6GbkHNQKPasnOO+r9IYdsUbAekb6c7eVRR8laGLMF06gMqg==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.1.3.tgz",
"integrity": "sha512-M/f7gqdQEPgZNA181Myz+GXCe8jXcJsGjCMXUzRj22FIXsZOyHNte84e0exntOvdPaeh9tA0w+B8qlP2fAezfw==",
"dev": true,
"requires": {
"@babel/core": "^7.27.4",
"@jest/get-type": "30.1.0",
"@jest/pattern": "30.0.1",
"@jest/test-sequencer": "30.1.2",
"@jest/test-sequencer": "30.1.3",
"@jest/types": "30.0.5",
"babel-jest": "30.1.2",
"chalk": "^4.1.2",
@@ -8342,12 +8522,12 @@
"deepmerge": "^4.3.1",
"glob": "^10.3.10",
"graceful-fs": "^4.2.11",
"jest-circus": "30.1.2",
"jest-circus": "30.1.3",
"jest-docblock": "30.0.1",
"jest-environment-node": "30.1.2",
"jest-regex-util": "30.0.1",
"jest-resolve": "30.1.0",
"jest-runner": "30.1.2",
"jest-resolve": "30.1.3",
"jest-runner": "30.1.3",
"jest-util": "30.0.5",
"jest-validate": "30.1.0",
"micromatch": "^4.0.8",
@@ -8489,9 +8669,9 @@
"dev": true
},
"jest-resolve": {
"version": "30.1.0",
"resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.1.0.tgz",
"integrity": "sha512-hASe7D/wRtZw8Cm607NrlF7fi3HWC5wmA5jCVc2QjQAB2pTwP9eVZILGEi6OeSLNUtE1zb04sXRowsdh5CUjwA==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.1.3.tgz",
"integrity": "sha512-DI4PtTqzw9GwELFS41sdMK32Ajp3XZQ8iygeDMWkxlRhm7uUTOFSZFVZABFuxr0jvspn8MAYy54NxZCsuCTSOw==",
"dev": true,
"requires": {
"chalk": "^4.1.2",
@@ -8505,9 +8685,9 @@
}
},
"jest-resolve-dependencies": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.1.2.tgz",
"integrity": "sha512-HJjyoaedY4wrwda+eqvgjbwFykrAnQEmhuT0bMyOV3GQIyLPcunZcjfkm77Zr11ujwl34ySdc4qYnm7SG75TjA==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.1.3.tgz",
"integrity": "sha512-DNfq3WGmuRyHRHfEet+Zm3QOmVFtIarUOQHHryKPc0YL9ROfgWZxl4+aZq/VAzok2SS3gZdniP+dO4zgo59hBg==",
"dev": true,
"requires": {
"jest-regex-util": "30.0.1",
@@ -8515,14 +8695,14 @@
}
},
"jest-runner": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.1.2.tgz",
"integrity": "sha512-eu9AzpDY/QV+7NuMg6fZMpQ7M24cBkl5dyS1Xj7iwDPDriOmLUXR8rLojESibcIX+sCDTO4KvUeaxWCH1fbTvg==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.1.3.tgz",
"integrity": "sha512-dd1ORcxQraW44Uz029TtXj85W11yvLpDuIzNOlofrC8GN+SgDlgY4BvyxJiVeuabA1t6idjNbX59jLd2oplOGQ==",
"dev": true,
"requires": {
"@jest/console": "30.1.2",
"@jest/environment": "30.1.2",
"@jest/test-result": "30.1.2",
"@jest/test-result": "30.1.3",
"@jest/transform": "30.1.2",
"@jest/types": "30.0.5",
"@types/node": "*",
@@ -8535,26 +8715,26 @@
"jest-haste-map": "30.1.0",
"jest-leak-detector": "30.1.0",
"jest-message-util": "30.1.0",
"jest-resolve": "30.1.0",
"jest-runtime": "30.1.2",
"jest-resolve": "30.1.3",
"jest-runtime": "30.1.3",
"jest-util": "30.0.5",
"jest-watcher": "30.1.2",
"jest-watcher": "30.1.3",
"jest-worker": "30.1.0",
"p-limit": "^3.1.0",
"source-map-support": "0.5.13"
}
},
"jest-runtime": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.1.2.tgz",
"integrity": "sha512-zU02si+lAITgyRmVRgJn/AB4cnakq8+o7bP+5Z+N1A4r2mq40zGbmrg3UpYQWCkeim17tx8w1Tnmt6tQ6y9PGA==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.1.3.tgz",
"integrity": "sha512-WS8xgjuNSphdIGnleQcJ3AKE4tBKOVP+tKhCD0u+Tb2sBmsU8DxfbBpZX7//+XOz81zVs4eFpJQwBNji2Y07DA==",
"dev": true,
"requires": {
"@jest/environment": "30.1.2",
"@jest/fake-timers": "30.1.2",
"@jest/globals": "30.1.2",
"@jest/source-map": "30.0.1",
"@jest/test-result": "30.1.2",
"@jest/test-result": "30.1.3",
"@jest/transform": "30.1.2",
"@jest/types": "30.0.5",
"@types/node": "*",
@@ -8567,7 +8747,7 @@
"jest-message-util": "30.1.0",
"jest-mock": "30.0.5",
"jest-regex-util": "30.0.1",
"jest-resolve": "30.1.0",
"jest-resolve": "30.1.3",
"jest-snapshot": "30.1.2",
"jest-util": "30.0.5",
"slash": "^3.0.0",
@@ -8656,12 +8836,12 @@
}
},
"jest-watcher": {
"version": "30.1.2",
"resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.1.2.tgz",
"integrity": "sha512-MtoGuEgqsBM8Jkn52oEj+mXLtF94+njPlHI5ydfduZL5MHrTFr14ZG1CUX1xAbY23dbSZCCEkEPhBM3cQd12Jg==",
"version": "30.1.3",
"resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.1.3.tgz",
"integrity": "sha512-6jQUZCP1BTL2gvG9E4YF06Ytq4yMb4If6YoQGRR6PpjtqOXSP3sKe2kqwB6SQ+H9DezOfZaSLnmka1NtGm3fCQ==",
"dev": true,
"requires": {
"@jest/test-result": "30.1.2",
"@jest/test-result": "30.1.3",
"@jest/types": "30.0.5",
"@types/node": "*",
"ansi-escapes": "^4.3.2",
@@ -9249,9 +9429,9 @@
}
},
"strip-ansi": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
"integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
"dev": true,
"requires": {
"ansi-regex": "^6.0.1"
@@ -9358,9 +9538,9 @@
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
"ts-jest": {
"version": "29.4.1",
"resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.1.tgz",
"integrity": "sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==",
"version": "29.4.4",
"resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.4.tgz",
"integrity": "sha512-ccVcRABct5ZELCT5U0+DZwkXMCcOCLi2doHRrKy1nK/s7J7bch6TzJMsrY09WxgUUIP/ITfmcDS8D2yl63rnXw==",
"dev": true,
"requires": {
"bs-logger": "^0.2.6",
@@ -9418,14 +9598,14 @@
"optional": true
},
"undici": {
"version": "7.15.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.15.0.tgz",
"integrity": "sha512-7oZJCPvvMvTd0OlqWsIxTuItTpJBpU1tcbVl24FMn3xt3+VSunwUasmfPJRE57oNO1KsZ4PgA1xTdAX4hq8NyQ=="
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz",
"integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g=="
},
"undici-types": {
"version": "7.10.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz",
"integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag=="
"version": "7.14.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz",
"integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA=="
},
"universal-user-agent": {
"version": "7.0.3",
@@ -9531,9 +9711,9 @@
},
"dependencies": {
"ansi-styles": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
"version": "6.2.3",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
"integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"dev": true
}
}

View File

@@ -27,22 +27,22 @@
"@actions/glob": "^0.5.0",
"@actions/io": "^1.1.3",
"@actions/tool-cache": "^2.0.2",
"@octokit/core": "^7.0.3",
"@octokit/core": "^7.0.5",
"@octokit/plugin-paginate-rest": "^13.1.1",
"@octokit/plugin-rest-endpoint-methods": "^16.0.0",
"@renovatebot/pep440": "^4.2.0",
"@octokit/plugin-rest-endpoint-methods": "^16.1.0",
"@renovatebot/pep440": "^4.2.1",
"smol-toml": "^1.4.2",
"undici": "^7.15.0"
"undici": "^7.16.0"
},
"devDependencies": {
"@biomejs/biome": "2.2.2",
"@biomejs/biome": "2.2.4",
"@types/js-yaml": "^4.0.9",
"@types/node": "^24.3.0",
"@types/semver": "^7.7.0",
"@vercel/ncc": "^0.38.3",
"jest": "^30.1.1",
"@types/node": "^24.7.0",
"@types/semver": "^7.7.1",
"@vercel/ncc": "^0.38.4",
"jest": "^30.1.3",
"js-yaml": "^4.1.0",
"ts-jest": "^29.4.1",
"ts-jest": "^29.4.4",
"typescript": "^5.9.2"
}
}

View File

@@ -5,9 +5,12 @@ import { hashFiles } from "../hash/hash-files";
import {
cacheDependencyGlob,
cacheLocalPath,
cachePython,
cacheSuffix,
pruneCache,
pythonDir,
pythonVersion as pythonVersionInput,
restoreCache as shouldRestoreCache,
workingDirectory,
} from "../utils/inputs";
import { getArch, getPlatform } from "../utils/platforms";
@@ -18,13 +21,23 @@ const CACHE_VERSION = "1";
export async function restoreCache(): Promise<void> {
const cacheKey = await computeKeys();
core.saveState(STATE_CACHE_KEY, cacheKey);
if (!shouldRestoreCache) {
core.info("restore-cache is false. Skipping restore cache step.");
return;
}
let matchedKey: string | undefined;
core.info(
`Trying to restore uv cache from GitHub Actions cache with key: ${cacheKey}`,
);
const cachePaths = [cacheLocalPath];
if (cachePython) {
cachePaths.push(pythonDir);
}
try {
matchedKey = await cache.restoreCache([cacheLocalPath], cacheKey);
matchedKey = await cache.restoreCache(cachePaths, cacheKey);
} catch (err) {
const message = (err as Error).message;
core.warning(message);
@@ -32,8 +45,6 @@ export async function restoreCache(): Promise<void> {
return;
}
core.saveState(STATE_CACHE_KEY, cacheKey);
handleMatchResult(matchedKey, cacheKey);
}
@@ -57,7 +68,8 @@ async function computeKeys(): Promise<string> {
const pythonVersion = await getPythonVersion();
const platform = await getPlatform();
const pruned = pruneCache ? "-pruned" : "";
return `setup-uv-${CACHE_VERSION}-${getArch()}-${platform}-${pythonVersion}${pruned}${cacheDependencyPathHash}${suffix}`;
const python = cachePython ? "-py" : "";
return `setup-uv-${CACHE_VERSION}-${getArch()}-${platform}-${pythonVersion}${pruned}${python}${cacheDependencyPathHash}${suffix}`;
}
async function getPythonVersion(): Promise<string> {

View File

@@ -1,5 +1,477 @@
// AUTOGENERATED_DO_NOT_EDIT
export const KNOWN_CHECKSUMS: { [key: string]: string } = {
"aarch64-apple-darwin-0.9.2":
"90b1e69da3d04772565dd556ae8e72c86bdb7da85a8dfc2c6b50c400b0e6aa97",
"aarch64-pc-windows-msvc-0.9.2":
"b28ae90188f00c6d9e6f32fe252ace25a3698eeca1458d435ac1ca55049607ff",
"aarch64-unknown-linux-gnu-0.9.2":
"0f0ecf2abcb50f8fb5d2b52c8095af4c133897086e3f2e0259f4fcb3d8ddf273",
"aarch64-unknown-linux-musl-0.9.2":
"1456894c855d38a56d541b201abae306780d8494c3a3497aff2815abd3eba12f",
"arm-unknown-linux-musleabihf-0.9.2":
"f6a969f0506b4d9e1d73d223243457825a2544ef9cd8dabc0a8e7e7bea697a62",
"armv7-unknown-linux-gnueabihf-0.9.2":
"93bbf2c8612174548822086487eef982bb19d95b569d3df83328cff6f5bf7660",
"armv7-unknown-linux-musleabihf-0.9.2":
"0f96d45eb4edfff26faaac58d9d5761b3f2628519557534e6969ec2777f35984",
"i686-pc-windows-msvc-0.9.2":
"f0cc299f9cfd9850d30f073794cda9523ac7fa2b90de3d1ed47e3fdcbda69ab6",
"i686-unknown-linux-gnu-0.9.2":
"5623618c4a99694b24eb3388577495873847ccae716c0827fdb03035ddd4d441",
"i686-unknown-linux-musl-0.9.2":
"c9d60b1e09611e3b36d91d5b520687ac15d765fe2a06a47dae068c6ebf23ada1",
"powerpc64-unknown-linux-gnu-0.9.2":
"d2c92ae4df26b4f62181b3e8840f85f5a9474cfac707f0f8fdbef03f573836ae",
"powerpc64le-unknown-linux-gnu-0.9.2":
"216e11a9001d7985990b0c4b6efd734b27e5e96222f9815d23c6fc8a5a406718",
"riscv64gc-unknown-linux-gnu-0.9.2":
"3fdbc9dc623a992c39ea4c126d4ebe1f78dc2013e9056f2ec93f42b0deb154eb",
"s390x-unknown-linux-gnu-0.9.2":
"4e4aa34554891bcfb92d50fc2067e99cbbc5bec473ce4b8e3dedad0d42017c85",
"x86_64-apple-darwin-0.9.2":
"c887d2c4f629eee99b80a347880870f3bc77f7746db81923efe520f609f80857",
"x86_64-pc-windows-msvc-0.9.2":
"ba61d01b7470b282e09e7c82a053472723c2a737fb3d137bd0f111e420cc1d9f",
"x86_64-unknown-linux-gnu-0.9.2":
"b775bb84c72210c6c0b9670cfaad0ac2e3953f12a2947d52b57603b4fbae3798",
"x86_64-unknown-linux-musl-0.9.2":
"42e4ac8e9dab04d560a9d44be2091cae994d14653238e779177c026e0dbf5779",
"aarch64-apple-darwin-0.9.1":
"cc84b5c86fbde176c0e1908abd65cec6e989ff755b6e68a912652beb1311de31",
"aarch64-pc-windows-msvc-0.9.1":
"862e0fef8e68f229c99ce05de70a712221bc552403f480379d03f5b05a6886fe",
"aarch64-unknown-linux-gnu-0.9.1":
"450cf31a80cf1335b0169b82310ea589e51b12711ca84b1f5b322b87d26b16c5",
"aarch64-unknown-linux-musl-0.9.1":
"a171e7335fc2e05767fe0d151db5a6af7d1ba93debfc8c91721763eff457d0a3",
"arm-unknown-linux-musleabihf-0.9.1":
"cc290a14f3ffa286b8c5a437f50d5c9bb76e1d27f3d51dd701b0487e62987ea0",
"armv7-unknown-linux-gnueabihf-0.9.1":
"1f0d511f7776deaf40bae03102020f939c96c3d12eec741edf81f581546d2232",
"armv7-unknown-linux-musleabihf-0.9.1":
"790728d01dd0d252e3151b57b5a716f84d851d0802962144ea822118ae61b2f6",
"i686-pc-windows-msvc-0.9.1":
"8880c92097c5410c3bbad5e72cf7d38b57523ed374bcd7462d309b9a11b6df33",
"i686-unknown-linux-gnu-0.9.1":
"4eccf96c57c30edf6c11477351f536b1a6191d13854c8ffa6d8eee58637d82e6",
"i686-unknown-linux-musl-0.9.1":
"9763ef30957011ce61c56117ef3078c40960c7521c9ee7cbb3ce8aed5b6207a4",
"powerpc64-unknown-linux-gnu-0.9.1":
"4a0965091073115314f9fc935cfa3eed43c3f46a48dfa370583a019b052a950c",
"powerpc64le-unknown-linux-gnu-0.9.1":
"cd9e06feaccd26dce79fd6930afbe1210edf69b4181304b4c7143871e8fadbe2",
"riscv64gc-unknown-linux-gnu-0.9.1":
"394edca0f59b6cf31ee6e3d252442e1e2708483265199d390ac1fc4161f97510",
"s390x-unknown-linux-gnu-0.9.1":
"8f4eedabfe57cf1d3ef29633be444ad9fd1c1ce9db89450a548e50ac88436cf0",
"x86_64-apple-darwin-0.9.1":
"df530fc06d2fd51ed2efeb75b1ea5eeb77a631eb945efe5f9d90ef5969cd3672",
"x86_64-pc-windows-msvc-0.9.1":
"8dba20107ebcd38f3a8e4acfeb7b209d594e112a3be8d1cea69fe6d501a69fdf",
"x86_64-unknown-linux-gnu-0.9.1":
"da55e00c6399a34a47c1f10973d8618b425a530e149836305bcca7ff68d955ff",
"x86_64-unknown-linux-musl-0.9.1":
"104bbd393104f09f84db474310b0fc0327c5f6566bd903c9a9cac00d137208b7",
"aarch64-apple-darwin-0.9.0":
"136e70984e3fd359f4119ef445bfd67d6e0d50f15400226ef8db7b738ebef6d0",
"aarch64-pc-windows-msvc-0.9.0":
"a816625eae0117c8ca0cd618716ddc11c68522d1ecfa7d2738f1c670099fef10",
"aarch64-unknown-linux-gnu-0.9.0":
"ca410766024d2d726c937bda2e9441823e2848894ac5a2f8b608902384fc391f",
"aarch64-unknown-linux-musl-0.9.0":
"041d8f56ffe82cbbc0f63f187f4e1935ac8b32531cf071bf5fa7abcb0441b147",
"arm-unknown-linux-musleabihf-0.9.0":
"ec1ec28a7cc584a8a06632b717f89747fa8b8ba58277ad68c8f289aaeac35a0d",
"armv7-unknown-linux-gnueabihf-0.9.0":
"3063c9adb4786ed49d699de9cf24c721ff2cb96bd2bb39465cab3e42d4e4efcc",
"armv7-unknown-linux-musleabihf-0.9.0":
"b425603d3ef20c579b94681a587eaa3f8a2198a86473c7cd5f687a93f8a0fdb0",
"i686-pc-windows-msvc-0.9.0":
"fd1dc1c9f7f9bc66186188894e24864e3def2232e1de0d49416037161932bdd7",
"i686-unknown-linux-gnu-0.9.0":
"02f4b4070af6e0c591d676543b97f7f5d2c0ebf5b1d01d9e116391289f44afc0",
"i686-unknown-linux-musl-0.9.0":
"41fc684a948ec2ff9255b484e11b99a0b504a4fc19d466b549e51b690a6325d5",
"powerpc64-unknown-linux-gnu-0.9.0":
"122b9216414a8a89b0a716dd7bf5995d03cded62747deef68dacca6a9839f96f",
"powerpc64le-unknown-linux-gnu-0.9.0":
"affbf883bfe4ae0204943b7d936fc2269e806a2534d65da0e75da713ac71ce4e",
"riscv64gc-unknown-linux-gnu-0.9.0":
"86c9596204fecdacf038f498553a7e8be81aabebe430a1eb08f8ae8215610b10",
"s390x-unknown-linux-gnu-0.9.0":
"8f41968e5eceda304d9cd70d83a9dc7e205e221c651572862b74845d045203ee",
"x86_64-apple-darwin-0.9.0":
"8fce2fe15b227ca38c706acda7cf0ebc43d5ec4be537f1badd58d5e938c7ed89",
"x86_64-pc-windows-msvc-0.9.0":
"4bad2c47dafb52ad774072fb7a260e5c9f3dbf73441658db1128eb2aec5818eb",
"x86_64-unknown-linux-gnu-0.9.0":
"4dadaa5ff5009ccd6a0a43f6ccfa32bf36ed2eff18df7011275a9b1d81950e7b",
"x86_64-unknown-linux-musl-0.9.0":
"8b045dceb6f13f2ce36285c72ed2d6a51241aea9da5636637c020bcecea205c8",
"aarch64-apple-darwin-0.8.24":
"5f0d9d14b17ba3f0af4602a7a5a2e4faececf0a9463736cf8e6269c49569b2fa",
"aarch64-pc-windows-msvc-0.8.24":
"349e5f26ea4db6459578db210bb8d676e5b2acc13962877637a95f3e951a6899",
"aarch64-unknown-linux-gnu-0.8.24":
"9526f8b0eddd13f5162c18df5ecf35c21e4f96567d21849750356b60121882df",
"aarch64-unknown-linux-musl-0.8.24":
"2b8f7383b19d408c680a74a6dbd41c70976516922234eb0075fd2de67413cf29",
"arm-unknown-linux-musleabihf-0.8.24":
"e25ead24c0809fd81c67b72a30c81f2e76eff0d702d341c468326e3e374559f5",
"armv7-unknown-linux-gnueabihf-0.8.24":
"3c0d984f55bcde6c16c8b4b749d2249b6a61125418dd6b333f249d846e759c71",
"armv7-unknown-linux-musleabihf-0.8.24":
"3e980197c242f36cf93cba0ebdad8f772ebf442ee856ba694daab624affab146",
"i686-pc-windows-msvc-0.8.24":
"7a8b3cdd8c02a662a19c426fbae99809d83dbedf172e52d30ba4c266ccd9a8b9",
"i686-unknown-linux-gnu-0.8.24":
"7957fbdc4538d706440173d14e91b6a2098b95701654125ebc2d05824aa233e6",
"i686-unknown-linux-musl-0.8.24":
"1a2b59dddc206106fb19a66dd665bfe85411281ace07825ba60988a00e230afd",
"powerpc64-unknown-linux-gnu-0.8.24":
"22dfcf44c1e8b273640e13aa41c72856654da650d58e0b39d1143dbdb4ee7997",
"powerpc64le-unknown-linux-gnu-0.8.24":
"0e757a7109aecbe5b6759470164d466e2a2a234808d84095e6db52a13a62f399",
"riscv64gc-unknown-linux-gnu-0.8.24":
"45342e4477dfde1f1d50a8c223706377ddb861cf5c4e1a323a936401472ed2da",
"s390x-unknown-linux-gnu-0.8.24":
"8167af20bf336179f5ffb96421d38cc7cb5d54dfa9b90820154cffbb456032de",
"x86_64-apple-darwin-0.8.24":
"b75ccf924654ad168efac2ec6934704b3d6b9cbff1650b35e17fa3d26d2bea1f",
"x86_64-pc-windows-msvc-0.8.24":
"5055be7909a844f703c54e8846d14ab676c34be6ea0d969ee74c5747feaedda0",
"x86_64-unknown-linux-gnu-0.8.24":
"db8179fffd97b7557b9a519bae82eaa4f499b02ef546f738a35e74e26c47e6b7",
"x86_64-unknown-linux-musl-0.8.24":
"b38ce629a8653a6b444b7c1bff2d8b99bdafd274e66a4900c5838051e3d99d26",
"aarch64-apple-darwin-0.8.23":
"e9128449ea08a3c953f0e08dabc78c7588361a898e6bd8163e7e8f8c96adeb66",
"aarch64-pc-windows-msvc-0.8.23":
"b4720ff1e3dcab3f41ce8135ae6c87d27682428088ce9e9b6802f2645e189a9e",
"aarch64-unknown-linux-gnu-0.8.23":
"503d1df80abe76c1f30264de817c9c847ff5fa457d4085517aecde1f5749ed66",
"aarch64-unknown-linux-musl-0.8.23":
"d745f61cdd3a845da6484785995bc6d19ceb3117dc3fa609bd304ecbedb87fea",
"arm-unknown-linux-musleabihf-0.8.23":
"55fd7161d526080dc07fec87aed63734cf18a20f4ef2fa9b870dd99cfb4e1b07",
"armv7-unknown-linux-gnueabihf-0.8.23":
"160e9522965702a31bfcb86ee28318f7d83f3ffdf330739670703fa0a85ce012",
"armv7-unknown-linux-musleabihf-0.8.23":
"8cc14b0b7b5118a13c80d9245f0aa540c2596c757d7cbfab622b4f798ce90dd5",
"i686-pc-windows-msvc-0.8.23":
"9ca7cc83d6730762bb811ec96aff9c95c5c9a131d4305229348df61bbfc9241a",
"i686-unknown-linux-gnu-0.8.23":
"bd578dc12e1170bf14cecd17b343e308edaaee5b44f0cb066076366353567856",
"i686-unknown-linux-musl-0.8.23":
"3237b711f1c313b328be0d42395319a2ffdab5f67cd2338fbf77155b6bf425f5",
"powerpc64-unknown-linux-gnu-0.8.23":
"92f30e2adc8c4ec75b8dc85a82df7b74a617346c7748c41cb4672a61e42791d6",
"powerpc64le-unknown-linux-gnu-0.8.23":
"b3f9b147022053b792fd82f7722b527323378c5130a227b7ec667c08b600d1be",
"riscv64gc-unknown-linux-gnu-0.8.23":
"a4925b51f0810e44075d336c3fa5b7534c086111dce0d0d9d92a2e2270aea0a8",
"s390x-unknown-linux-gnu-0.8.23":
"6bafdbed0e750930a2af123e3cf8b782228aef88d24bf25dc6b0f280bc8ad461",
"x86_64-apple-darwin-0.8.23":
"bbb1db369de63d85334e2c43bb925fce63261cefa8c1a8569a6bd4c520f03c0d",
"x86_64-pc-windows-msvc-0.8.23":
"454c727fe05ec3763cae9436bb409a6bc5156e9c8ee55a09218191faf8c32445",
"x86_64-unknown-linux-gnu-0.8.23":
"b8d378bf1cbdefa6fd18570c3d5e7ea85066f75549cf3840212f505ed37522ed",
"x86_64-unknown-linux-musl-0.8.23":
"598f7939cae516de105075d55eb20d906787de307a0011904e301346a13de2ff",
"aarch64-apple-darwin-0.8.22":
"3f61099e261e449527141dbf125629fab33ad696468c8c90cebbac40185a306c",
"aarch64-pc-windows-msvc-0.8.22":
"dbb3a5bd06d20c9ab8bb9a79c7c4fb5832ca1c7ba5f231a020bc92e5a3c6dcf4",
"aarch64-unknown-linux-gnu-0.8.22":
"726b72a137fda33565143325f7d31c42cd30ff9ccdf067e00d124d37b4081cb2",
"aarch64-unknown-linux-musl-0.8.22":
"3cb3c891f56891f0027f0287980014930b18875c9396c1d8a19d607b0a6049d9",
"arm-unknown-linux-musleabihf-0.8.22":
"78c4898abb5285cbcb53bc2544d93158a705bf2024393d203b7df89406ffd5d7",
"armv7-unknown-linux-gnueabihf-0.8.22":
"96f7e526b7cac851f4448ca773ee82216d3d8564161486f5c0ab0d84418cc3bc",
"armv7-unknown-linux-musleabihf-0.8.22":
"763bd2b60642c68e2d2d5ce43f741fe9cdb77b6fa771cd8b45971e4a380411d7",
"i686-pc-windows-msvc-0.8.22":
"e84c697e29afc76223e020edb3786acebed34779a9cc2ab88e570ff93d69a617",
"i686-unknown-linux-gnu-0.8.22":
"f6cfe03095b9cafdbf530cf228803e9ec329511d45e5901e3baa355f96ba37f3",
"i686-unknown-linux-musl-0.8.22":
"6ea34f5e656ee0f2085436513e9b6a2caeae7ff14d14871f177a7797f79db20e",
"powerpc64-unknown-linux-gnu-0.8.22":
"87b1f9b6452540d1b3e3286e9209fcae39a692c323544c10f6b4f096bfc04673",
"powerpc64le-unknown-linux-gnu-0.8.22":
"2f639a402031e62dabd6ca534635d73b26e8b72afeb063f8abc9abc6ba97a8e3",
"riscv64gc-unknown-linux-gnu-0.8.22":
"75c83abe161c6e673f7d21e46cd27df539081a9ccf74e4d053e90ba8d2d715e0",
"s390x-unknown-linux-gnu-0.8.22":
"a0f671106b8b4c128aad3b52becc34691d7669c3d40bbd5a18df2c60b4d67971",
"x86_64-apple-darwin-0.8.22":
"76638fdcfa91357858771551a1c88de1f7c3b270b33ab1866f8a0618d9e442d8",
"x86_64-pc-windows-msvc-0.8.22":
"5049375aa2a5162f132b2c1cb992e25d42d47d934cab8c174dbe6f60973dcc12",
"x86_64-unknown-linux-gnu-0.8.22":
"741ff1f5742c5a4a25d2f829e8395355e43f7a5ae2ebc6368e9ae2df0efb69cf",
"x86_64-unknown-linux-musl-0.8.22":
"06b891ef144bd8390fecb150838f0ff8a34ccaeecf9d744d97945d02ec7389c0",
"aarch64-apple-darwin-0.8.21":
"51a10a0ba94139911266779e61296b07fffc98eedf3d8f6e206f86375ac7fb31",
"aarch64-pc-windows-msvc-0.8.21":
"ad60ed2fd2c95957c55041d2e61146f0f41aedc7afe87f3f79a8648802713fb5",
"aarch64-unknown-linux-gnu-0.8.21":
"5ebc05755ee1688434993d3bf346b6fbdbcbd2f17f1a8339f175e76af18de50c",
"aarch64-unknown-linux-musl-0.8.21":
"2afeee16b09d40cbe4de445fe82e1ecc00ed51dd8e118ed7800ca537ee4cf0c2",
"arm-unknown-linux-musleabihf-0.8.21":
"f45daacdd988284b011137ba017e5b151252922eec52b457d50770f0cde18387",
"armv7-unknown-linux-gnueabihf-0.8.21":
"f6b5fa5a6cfad7fd9fa80c11b24cef18acb8d99c137a6144a4bb1c50dbfb5b1b",
"armv7-unknown-linux-musleabihf-0.8.21":
"d53ad3c1c5b549654c2da6f9369df7a68b961f18fcaf847cb8242dc48fe17e20",
"i686-pc-windows-msvc-0.8.21":
"8ee8cd0cc5d49a9e3c6f176bdc9d09ece03144dbc0914c20b27e67ff72c0570e",
"i686-unknown-linux-gnu-0.8.21":
"327ef2b81967cb2e8407255d3580dd67ddf15fdb18fd3d6e945dc13f76462b0c",
"i686-unknown-linux-musl-0.8.21":
"18b7a77c37155ea15166a3a212e69b53f0e6b8d1d399b87c1b3ac4cc646e9b4f",
"powerpc64-unknown-linux-gnu-0.8.21":
"1fae8052ce8a9663438ba332f930062b14621adb395eff2950928d7cf8323d16",
"powerpc64le-unknown-linux-gnu-0.8.21":
"cca5f83f59251fced9056ecf8ae90e89a83252dda1eb53eab96a76e484776e0d",
"riscv64gc-unknown-linux-gnu-0.8.21":
"485f2654720d9fca3c85b147e837f0dc32bb869113bde58e979fc76f0c37547e",
"s390x-unknown-linux-gnu-0.8.21":
"5757570db02d2ed3ef5742a1a484b921e716d8412daf45e85c4c79c0a75bf0c1",
"x86_64-apple-darwin-0.8.21":
"df0fae941f83f796ea8100958f5d31a185dacc34777f346019123b6cb5571101",
"x86_64-pc-windows-msvc-0.8.21":
"ed4f66aacea41026675bca18699958cda13112c77ef5eff3a2f3d376bd1f9177",
"x86_64-unknown-linux-gnu-0.8.21":
"166bfa522cc836a3b68bdcef78e40b263ea62f12bb80a8d9c6fda4ce5f2a3994",
"x86_64-unknown-linux-musl-0.8.21":
"ff6f6ffca9a026cc99bc43df46e70e33df09bcb544b43e8ef97a5176dd68b516",
"aarch64-apple-darwin-0.8.20":
"a87008d013efd78d94102e5268a24990c409bfb39b80df4de32d1c97f093e7ef",
"aarch64-pc-windows-msvc-0.8.20":
"ac33f921e0d48d14a106a6cc84b146da7a1f4a3c329c7fb0e1a8e6ff4cf541e6",
"aarch64-unknown-linux-gnu-0.8.20":
"b434851cd94e9e2083bc9a5851f1d13748771726bd2ac30027f820fc134b2104",
"aarch64-unknown-linux-musl-0.8.20":
"60ad9b7fb846c2051e0113077b1e9510b4b1a73b9a1816a03e82406deedff08d",
"arm-unknown-linux-musleabihf-0.8.20":
"72fa919115f5a7c4557c1adb55ac77154f3fb0272b95ff0270d4eaf98bc814c2",
"armv7-unknown-linux-gnueabihf-0.8.20":
"87a993df182a2abb5581421d6c76b0cbccb311cfca625d8c827f2cfcf1c78fed",
"armv7-unknown-linux-musleabihf-0.8.20":
"3a3c1b2370824f3129c89bf3def5b2b703813152cf0be0ec3c04dead21077cd0",
"i686-pc-windows-msvc-0.8.20":
"62fd821f330f469cce6e02eded6f63ba51a9461acc9e0e16794e05da08fe16be",
"i686-unknown-linux-gnu-0.8.20":
"a7bfa2c07183f2fd44ef4d6c910971796a980ebb3c52e9620e6b741cc6fe45c0",
"i686-unknown-linux-musl-0.8.20":
"67eec91d7ca5a8dc8d95149be52bcf459efb4caeacbacf8586f371f8192a0ec7",
"powerpc64-unknown-linux-gnu-0.8.20":
"b96d6a4907ab4c26d7061e43f6993aa47c76a01af6f3cb871d9c48b7b250fbca",
"powerpc64le-unknown-linux-gnu-0.8.20":
"1c13fbcd13214e93300749cb14cb5c1425d6a4095f2e406a80b34ab10d269b5b",
"riscv64gc-unknown-linux-gnu-0.8.20":
"a14f8297bae6dc3993a9367e0fcf6061281f5f3f0da7c46a6a2a5fd47467f56c",
"s390x-unknown-linux-gnu-0.8.20":
"8e59db8d1cb791897237982e369fea0217a12ffe3527cf6f1d30fea32d20a509",
"x86_64-apple-darwin-0.8.20":
"ec47686e5e1499b9ea53aa61181fa3f08d4113bc7628105dc299c092d4debf44",
"x86_64-pc-windows-msvc-0.8.20":
"e2aa89b78f0a0fa7cbf9d42508c7a962bda803425d8ec3e9cf7a69fb00cf6791",
"x86_64-unknown-linux-gnu-0.8.20":
"dc67aa1a5b6b16a8cc4a5fdf5697f354fbf9e45f77a3da6d9e71db6ec213c082",
"x86_64-unknown-linux-musl-0.8.20":
"a29e1854ee3ce1ccc5ba1d27783c4f34e99605e16c886a71446a90bad40a38c9",
"aarch64-apple-darwin-0.8.19":
"bb63d43c40a301d889a985223ee8ce540be199e98b3f27ed8477823869a0a605",
"aarch64-pc-windows-msvc-0.8.19":
"3bfe2db4bccf95e05d2685bcbfad7e49e7cd2177a20aebe81a5e5348cbdfc0a3",
"aarch64-unknown-linux-gnu-0.8.19":
"ffd29feed13cdd30b27def8e80e64223325fbe4f7cfc4d4c906ec2531f746bde",
"aarch64-unknown-linux-musl-0.8.19":
"87925376fa1e59de23582e1cbd81d6aabd16611e871ad085e09be2c2fa12689d",
"arm-unknown-linux-musleabihf-0.8.19":
"00d4835ba20e2e4a3bfed6fe4f6fbf4982c5a0e6a3105c7bde93fb9377e61dea",
"armv7-unknown-linux-gnueabihf-0.8.19":
"7a58efdb9c6e3f320759f9f074306e34f03ccfb535b306cbace92e9ad414efd5",
"armv7-unknown-linux-musleabihf-0.8.19":
"c8f8a244009f3ad01b23772c936c5c5a95871a87b0add90b85a55d3913d1fae0",
"i686-pc-windows-msvc-0.8.19":
"32c7176e49f5fa1c7480b32e325a631431212904b1020427e62afef46fddddb9",
"i686-unknown-linux-gnu-0.8.19":
"94a5f944d1cba4db2e7fc6831bf9c78c291c5c1e5e079b4095e9fcdcbc15bc71",
"i686-unknown-linux-musl-0.8.19":
"491b282b50e078fac4ced99e69359ac6cecc3f43f585f812d52515e6b081261a",
"powerpc64-unknown-linux-gnu-0.8.19":
"3c7c7ecb8d5b61acee3914984f1025af1707a987a51285aba44d968420139f2c",
"powerpc64le-unknown-linux-gnu-0.8.19":
"711e39050b528b0860d868c98057eebbd181befbe6a6f24e0f6fd571eab5520f",
"riscv64gc-unknown-linux-gnu-0.8.19":
"5dd8e1ec8bf8722e08d9853953ed0ef12318d0f5e82d06a8dd98815666f99186",
"s390x-unknown-linux-gnu-0.8.19":
"5b3af341a39364f147d7286e40f55dd92ac8a142110e29ff1b4825afb96e1b27",
"x86_64-apple-darwin-0.8.19":
"b5f91770e55761b32c9618757ef23ded6671bb9ca0ddf5737eea60dddd493fe9",
"x86_64-pc-windows-msvc-0.8.19":
"945b07182de7de279ba5ae5c746785dfd55cf9b17481d3535b0b03efd6e64567",
"x86_64-unknown-linux-gnu-0.8.19":
"cfc674e9b83d1becfca4d70386e5f7ace4c1fa8c47c518abeebb8ef2b30da4b8",
"x86_64-unknown-linux-musl-0.8.19":
"6a37f712ae90c7b8cf364fe751144d7acc2479d6b336378111e74cc7fb14fa7b",
"aarch64-apple-darwin-0.8.18":
"ce660d5cdf0ed83d1a045bbe9792b93d06725b8c9e9b88960a503d42192be445",
"aarch64-pc-windows-msvc-0.8.18":
"f49a25f1a89c76d750e2179f40f9302310504f40c89283ca4522b13363c7bdc9",
"aarch64-unknown-linux-gnu-0.8.18":
"164363f88618f4e8e175faf9fcf5172321c221fce93d64cec8e9ab3339511dad",
"aarch64-unknown-linux-musl-0.8.18":
"1d7e3bfc3b5ec9d747bc3f42a6a3362249f30560966512b172e8967b11046144",
"arm-unknown-linux-musleabihf-0.8.18":
"3c356156c074eb21f731116501992aa6ad6079231f37c75ea7a15c22d1c41cf6",
"armv7-unknown-linux-gnueabihf-0.8.18":
"15e12cfba5fb7b20b4eb45887b78fe157d29bd28b38bbc03a19224ad6766a641",
"armv7-unknown-linux-musleabihf-0.8.18":
"008cd8225fd8b6b4bb3293d1d7520023f8e432141f256320c034dc5a1a15c7ab",
"i686-pc-windows-msvc-0.8.18":
"55f0d91f766ca141e166fe74b8a81da667b5d703ca1b5f2671677f0b2bfdd901",
"i686-unknown-linux-gnu-0.8.18":
"3b42e3b58650cde6fa0d03dfdb8528573cf679ac9809191b3976913cdec13b6f",
"i686-unknown-linux-musl-0.8.18":
"e2dae897955f666eb2f83af12d9a566bc42c26c17413d1480124cef6b30dc0fd",
"powerpc64-unknown-linux-gnu-0.8.18":
"88cd4ad593e6dd915c69dee02b56cbf1b6d16cb7c8129a5ad1fa8ac02bd755ab",
"powerpc64le-unknown-linux-gnu-0.8.18":
"50b418096f4d82df5d22cb23e650754ca92bca7be657113dcd53631f0e0cec77",
"riscv64gc-unknown-linux-gnu-0.8.18":
"b696be9a2ef0808f230227477b8e23acedba0b90933978c760ea2a748e8c30fa",
"s390x-unknown-linux-gnu-0.8.18":
"3b106572a8574f58e3df591cdaef915bdb38fdff11e5de0ec53bfe1b857267e8",
"x86_64-apple-darwin-0.8.18":
"a08c3a6c50f49e68216ac133bd0aaae952db2cd8d19a3cd5be782f8f4becf135",
"x86_64-pc-windows-msvc-0.8.18":
"3e42d63c8323839d50b11959ec558ad3954a2c16aab1ad52c0521bd055442a3f",
"x86_64-unknown-linux-gnu-0.8.18":
"59ad1a1809fa47019b86cf339fff161cb7b00ad3d8d42354eea57d0d91aeb44c",
"x86_64-unknown-linux-musl-0.8.18":
"3a93bc3597ab73c9c31d8ad709b4d0b788961cbb508c5a4dcf21636fd7e3e8ce",
"aarch64-apple-darwin-0.8.17":
"e4d4859d7726298daa4c12e114f269ff282b2cfc2b415dc0b2ca44ae2dbd358e",
"aarch64-pc-windows-msvc-0.8.17":
"2396749de576e45a40efa35fe94b3f953c3224c21f75c05772593e085d78e77d",
"aarch64-unknown-linux-gnu-0.8.17":
"9a20d65b110770bbaa2ee89ed76eb963d8c6a480b9ebef584ea9df2ae85b4f0f",
"aarch64-unknown-linux-musl-0.8.17":
"bd141b7e263935d14f5725f2a5c1c942fd89642e37683cb904f1984ce7e365f4",
"arm-unknown-linux-musleabihf-0.8.17":
"9d4ffb6751d65a52f8daf3fd88e331ab989d490a6e336d6a96cac668fce17a65",
"armv7-unknown-linux-gnueabihf-0.8.17":
"014afffa5621986aefbe8a6d71597eb45b8cd3d4e94f825f34ec49ba4cd0c382",
"armv7-unknown-linux-musleabihf-0.8.17":
"fb976e7482c4550f38c51c5c23b9dae0322c3173f56436bf9a81252e4b74fcfb",
"i686-pc-windows-msvc-0.8.17":
"f528893452ca512b555b63267292977d237bd6fbdd967c9be6941a65ebf256f4",
"i686-unknown-linux-gnu-0.8.17":
"d52438a1588ea7c2332dc4aa8c93eedae344fc435c95491037237c7b4b36eae4",
"i686-unknown-linux-musl-0.8.17":
"9e10f4c57034e6e98dea48b0f4250a7eff983f1b2947d99ed6605a4eb0ec8d22",
"loongarch64-unknown-linux-gnu-0.8.17":
"1d02e45dbbcbbaa867afe59fd62b294cba47abf1a76e151e19db03b5dbf1c9c8",
"powerpc64-unknown-linux-gnu-0.8.17":
"6f448735dfd72e2d5c3e3bb541b388c58cdfcf3a562128d5ac1a5f2be47f95d6",
"powerpc64le-unknown-linux-gnu-0.8.17":
"e4b28cab21eb990e2bea768bc9f43b61e4fd554552cea8868c855027decef69d",
"riscv64gc-unknown-linux-gnu-0.8.17":
"f653caa34479d405d290b825a2fe782bb26c55a7bfaa870911b4e18792312d45",
"s390x-unknown-linux-gnu-0.8.17":
"8fae8182704b4b11316c87d897c3e64f2d3f55ac8c58c482d9bbef9ad611f90c",
"x86_64-apple-darwin-0.8.17":
"31ed353cfd8e6c962e7c60617bd8a9d6b97b704c1ecb5b5eceaff8c6121b54ac",
"x86_64-pc-windows-msvc-0.8.17":
"0d051779fbcb173b183efeae1c3e96148764fd82709bbbf0966df3efe48b67c5",
"x86_64-unknown-linux-gnu-0.8.17":
"920cbcaad514cc185634f6f0dcd71df5e8f4ee4456d440a22e0f8c0f142a8203",
"x86_64-unknown-linux-musl-0.8.17":
"4057052999a210fe78d93599d2165da9e24c8bbb23370cdd26b66a98ab479203",
"aarch64-apple-darwin-0.8.16":
"87e4b51b735e8445f6c445c7b4c0398273e40d34cd192bad8158736653600cd6",
"aarch64-pc-windows-msvc-0.8.16":
"392acca957d8d7cccafbb68ce6c4ba29b2ff00c8b0d4744a2136918d3a7bf765",
"aarch64-unknown-linux-gnu-0.8.16":
"22a3cbaf87776b73c2657ba5d63f8565c1235b65eaf57dffda66061f7a09913b",
"aarch64-unknown-linux-musl-0.8.16":
"6bd6a11c384f07353c3c7eec9bde094f89b92a12dc09caea9df40c424afebea5",
"arm-unknown-linux-musleabihf-0.8.16":
"53c31a6559dc4fb22ce8c56640b00a8404b7e4d55f68b6bb3aa188864e2c3084",
"armv7-unknown-linux-gnueabihf-0.8.16":
"ada6f393d5e5d9cba5445832ba61e8222859e915e5d77a37f5dd35979f3f18e4",
"armv7-unknown-linux-musleabihf-0.8.16":
"55690f70f9c61963c0069558e205acda9ff0604a44028226b9a0ec3b847c9125",
"i686-pc-windows-msvc-0.8.16":
"1e727b8af6c0781bc6eb9a2c34e7ee704070b7a2f122544443418e8be13019ee",
"i686-unknown-linux-gnu-0.8.16":
"4eaf39134663ef184f684be6f6aa83e971fb36ef7d1c67a5f2196268b61c0579",
"i686-unknown-linux-musl-0.8.16":
"a179ceba9f2fcca7b46a86b12715e28fb3429ff8193ae839700d534e35e95a45",
"loongarch64-unknown-linux-gnu-0.8.16":
"600a8be6d2621d654b6665d9a8df9370f4af9c0b6ceb851d1ae0d4b895e8e546",
"powerpc64-unknown-linux-gnu-0.8.16":
"c86008ef8a3e3730b0e58a168542331960c90a3b043e3853c1941457748595f3",
"powerpc64le-unknown-linux-gnu-0.8.16":
"91645092447a14c23b47d0f434a787a9555b29e061607d9e60d2d556b831f5aa",
"riscv64gc-unknown-linux-gnu-0.8.16":
"dbaeff3f0baad73c264c35abd937a231fb6b9d1201b6763d82e39e7516358115",
"s390x-unknown-linux-gnu-0.8.16":
"e29c330a8956c13acb0f2af7aa650dd5d9ebba6aefdceaea77f689953d140780",
"x86_64-apple-darwin-0.8.16":
"07491a998fd741090501df9bbfe538f85568901a3a66c9e0368636509158727a",
"x86_64-pc-windows-msvc-0.8.16":
"97fb93678eca3b4f731ea3879ae2e78787976e03f38c9c6fb744ab28bc3aec1b",
"x86_64-unknown-linux-gnu-0.8.16":
"fc94e50e8ef93a97d723b83faa42888e7710c4443a5b8a1af3aac2cda5390f3a",
"x86_64-unknown-linux-musl-0.8.16":
"ee220f112b91b23f641d169ba7a3652c6ab7104e7c666d26104ebd6a2f76be43",
"aarch64-apple-darwin-0.8.15":
"103367962c5cb00bf7370d84cbaa3fec5a9807be9cc833ea9d8eea400c119fa2",
"aarch64-pc-windows-msvc-0.8.15":
"16d92f21508c5dbd3374466c2cdad2909959a6d3bd06672b9db023f2a5d7a014",
"aarch64-unknown-linux-gnu-0.8.15":
"6ede0fefa7db7be3d5d9eda8784a8e43b1cf5410720eb3da60ab1d2f66678e82",
"aarch64-unknown-linux-musl-0.8.15":
"23ea21a05c62c4c307ce691f29bff2f15c94c4f07f2b83d9b356f0664bc8b3a2",
"arm-unknown-linux-musleabihf-0.8.15":
"deeac755224244b535c9f654b29aad8a165c94840a520d41e5c697235edd0576",
"armv7-unknown-linux-gnueabihf-0.8.15":
"07ad33bc28ed276944d069eb714322b24167bfe106b4bded01e272fe245934ba",
"armv7-unknown-linux-musleabihf-0.8.15":
"0b4f73e084a04828f2431c887c2e3eea590ff06a1dc279e473dd1d94cdc8f25d",
"i686-pc-windows-msvc-0.8.15":
"34425e7dc7323b98fc844d9223596e9a1d2347e6f85a512221428a455dcbea78",
"i686-unknown-linux-gnu-0.8.15":
"16230e9b785fccb628e920d0fa1ca59b50b0515b838b2bb80f997bcb7a35f2bb",
"i686-unknown-linux-musl-0.8.15":
"43d554953beac56a8d8ba23aeb2b0e0e5c43020b074071c15df5d492e46a81f3",
"powerpc64-unknown-linux-gnu-0.8.15":
"71465b1d08e0a4cb3fcfe02e127104400a85ed00c30ec5f53f8705e71567fb6a",
"powerpc64le-unknown-linux-gnu-0.8.15":
"54157ee5e01b02b8c89131391d62228787750b556bbdb7d3428a3cdfd1698102",
"riscv64gc-unknown-linux-gnu-0.8.15":
"faa4a470a26ad0db0dbefc510fac91fa0da4d9cd06ca4f229933f7aac21e46b2",
"s390x-unknown-linux-gnu-0.8.15":
"0bb022274375745352a748b8332bb170941fe01915a1670c2c6d06d182783437",
"x86_64-apple-darwin-0.8.15":
"2bbef70982e97dfc36454de173f35ec1a5e83ae11e3885df6a50db3fd76171cb",
"x86_64-pc-windows-msvc-0.8.15":
"459d95892a5cc5c21779532f4f41b9238594b79e312a5142da2148ecfa10e705",
"x86_64-unknown-linux-gnu-0.8.15":
"be9878e9d08ebcb621a683aba52e7fb8bbf92b2532e0d759026ffcc067673042",
"x86_64-unknown-linux-musl-0.8.15":
"d0fec58f3124e05e0a1af0f6541abfce4333253cdaf23c7b6bb2e6128bf138ea",
"aarch64-apple-darwin-0.8.14":
"281ea18a5778099f7edeee0a7b20671d14918782de153604c939486f2b8a2791",
"aarch64-pc-windows-msvc-0.8.14":

View File

@@ -2,6 +2,7 @@ import { promises as fs } from "node:fs";
import * as path from "node:path";
import * as core from "@actions/core";
import * as tc from "@actions/tool-cache";
import type { Endpoints } from "@octokit/types";
import * as pep440 from "@renovatebot/pep440";
import { OWNER, REPO, TOOL_CACHE_NAME } from "../utils/constants";
import { Octokit } from "../utils/octokit";
@@ -12,6 +13,9 @@ import {
getLatestKnownVersion as getLatestVersionInManifest,
} from "./version-manifest";
type Release =
Endpoints["GET /repos/{owner}/{repo}/releases"]["response"]["data"][number];
export function tryGetFromToolCache(
arch: Architecture,
version: string,
@@ -28,7 +32,6 @@ export function tryGetFromToolCache(
}
export async function downloadVersionFromGithub(
serverUrl: string,
platform: Platform,
arch: Architecture,
version: string,
@@ -37,7 +40,7 @@ export async function downloadVersionFromGithub(
): Promise<{ version: string; cachedToolDir: string }> {
const artifact = `uv-${arch}-${platform}`;
const extension = getExtension(platform);
const downloadUrl = `${serverUrl}/${OWNER}/${REPO}/releases/download/${version}/${artifact}${extension}`;
const downloadUrl = `https://github.com/${OWNER}/${REPO}/releases/download/${version}/${artifact}${extension}`;
return await downloadVersion(
downloadUrl,
artifact,
@@ -68,7 +71,6 @@ export async function downloadVersionFromManifest(
`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,
@@ -135,19 +137,29 @@ export async function resolveVersion(
): Promise<string> {
core.debug(`Resolving version: ${versionInput}`);
let version: string;
const isSimpleMinimumVersionSpecifier =
versionInput.includes(">") && !versionInput.includes(",");
if (isSimpleMinimumVersionSpecifier) {
core.info("Found minimum version specifier, using latest version");
}
if (manifestFile) {
version =
versionInput === "latest"
versionInput === "latest" || isSimpleMinimumVersionSpecifier
? await getLatestVersionInManifest(manifestFile)
: versionInput;
} else {
version =
versionInput === "latest"
versionInput === "latest" || isSimpleMinimumVersionSpecifier
? await getLatestVersion(githubToken)
: versionInput;
}
if (tc.isExplicitVersion(version)) {
core.debug(`Version ${version} is an explicit version.`);
if (isSimpleMinimumVersionSpecifier) {
if (!pep440.satisfies(version, versionInput)) {
throw new Error(`No version found for ${versionInput}`);
}
}
return version;
}
const availableVersions = await getAvailableVersions(githubToken);
@@ -178,13 +190,14 @@ async function getAvailableVersions(githubToken: string): Promise<string[]> {
}
}
async function getReleaseTagNames(
octokit: InstanceType<typeof Octokit>,
): Promise<string[]> {
const response = await octokit.paginate(octokit.rest.repos.listReleases, {
owner: OWNER,
repo: REPO,
});
async function getReleaseTagNames(octokit: Octokit): Promise<string[]> {
const response: Release[] = await octokit.paginate(
octokit.rest.repos.listReleases,
{
owner: OWNER,
repo: REPO,
},
);
const releaseTagNames = response.map((release) => release.tag_name);
if (releaseTagNames.length === 0) {
throw Error(
@@ -225,7 +238,7 @@ async function getLatestVersion(githubToken: string) {
return latestRelease.tag_name;
}
async function getLatestRelease(octokit: InstanceType<typeof Octokit>) {
async function getLatestRelease(octokit: Octokit) {
const { data: latestRelease } = await octokit.rest.repos.getLatestRelease({
owner: OWNER,
repo: REPO,

View File

@@ -2,21 +2,30 @@ import * as fs from "node:fs";
import * as cache from "@actions/cache";
import * as core from "@actions/core";
import * as exec from "@actions/exec";
import * as pep440 from "@renovatebot/pep440";
import {
STATE_CACHE_KEY,
STATE_CACHE_MATCHED_KEY,
} from "./cache/restore-cache";
import { STATE_UV_PATH, STATE_UV_VERSION } from "./utils/constants";
import {
cacheLocalPath,
cachePython,
enableCache,
ignoreNothingToCache,
pythonDir,
pruneCache as shouldPruneCache,
saveCache as shouldSaveCache,
} from "./utils/inputs";
export async function run(): Promise<void> {
try {
if (enableCache) {
await saveCache();
if (shouldSaveCache) {
await saveCache();
} else {
core.info("save-cache is false. Skipping save cache step.");
}
// node will stay alive if any promises are not resolved,
// which is a possibility if HTTP requests are dangling
// due to retries or timeouts. We know that if we got here
@@ -47,14 +56,35 @@ async function saveCache(): Promise<void> {
await pruneCache();
}
core.info(`Saving cache path: ${cacheLocalPath}`);
if (!fs.existsSync(cacheLocalPath) && !ignoreNothingToCache) {
let actualCachePath = cacheLocalPath;
if (process.env.UV_CACHE_DIR && process.env.UV_CACHE_DIR !== cacheLocalPath) {
core.warning(
`The environment variable UV_CACHE_DIR has been changed to "${process.env.UV_CACHE_DIR}", by an action or step running after astral-sh/setup-uv. This can lead to unexpected behavior. If you expected this to happen set the cache-local-path input to "${process.env.UV_CACHE_DIR}" instead of "${cacheLocalPath}".`,
);
actualCachePath = process.env.UV_CACHE_DIR;
}
core.info(`Saving cache path: ${actualCachePath}`);
if (!fs.existsSync(actualCachePath) && !ignoreNothingToCache) {
throw new Error(
`Cache path ${cacheLocalPath} does not exist on disk. This likely indicates that there are no dependencies to cache. Consider disabling the cache input if it is not needed.`,
`Cache path ${actualCachePath} does not exist on disk. This likely indicates that there are no dependencies to cache. Consider disabling the cache input if it is not needed.`,
);
}
const cachePaths = [actualCachePath];
if (cachePython) {
core.info(`Including Python cache path: ${pythonDir}`);
if (!fs.existsSync(pythonDir) && !ignoreNothingToCache) {
throw new Error(
`Python cache path ${pythonDir} does not exist on disk. This likely indicates that there are no dependencies to cache. Consider disabling the cache input if it is not needed.`,
);
}
cachePaths.push(pythonDir);
}
core.info(`Final cache paths: ${cachePaths.join(", ")}`);
try {
await cache.saveCache([cacheLocalPath], cacheKey);
await cache.saveCache(cachePaths, cacheKey);
core.info(`cache saved with the key: ${cacheKey}`);
} catch (e) {
if (
@@ -72,13 +102,19 @@ async function saveCache(): Promise<void> {
}
async function pruneCache(): Promise<void> {
const forceSupported = pep440.gte(core.getState(STATE_UV_VERSION), "0.8.24");
const options: exec.ExecOptions = {
silent: !core.isDebug(),
silent: false,
};
const execArgs = ["cache", "prune", "--ci"];
if (forceSupported) {
execArgs.push("--force");
}
core.info("Pruning cache...");
await exec.exec("uv", execArgs, options);
const uvPath = core.getState(STATE_UV_PATH);
await exec.exec(uvPath, execArgs, options);
}
run();

View File

@@ -4,11 +4,12 @@ import * as core from "@actions/core";
import * as exec from "@actions/exec";
import { restoreCache } from "./cache/restore-cache";
import {
downloadVersionFromGithub,
downloadVersionFromManifest,
resolveVersion,
tryGetFromToolCache,
} from "./download/download-version";
import { getConfigValueFromTomlFile } from "./utils/config-file";
import { STATE_UV_PATH, STATE_UV_VERSION } from "./utils/constants";
import {
activateEnvironment as activateEnvironmentInput,
addProblemMatchers,
@@ -18,8 +19,8 @@ import {
githubToken,
ignoreEmptyWorkdir,
manifestFile,
pythonDir,
pythonVersion,
serverUrl,
toolBinDir,
toolDir,
versionFile as versionFileInput,
@@ -51,12 +52,14 @@ async function run(): Promise<void> {
addToolBinToPath();
addUvToPathAndOutput(setupResult.uvDir);
setToolDir();
addPythonDirToPath();
setupPython();
await activateEnvironment();
addMatchers();
setCacheDir(cacheLocalPath);
setCacheDir();
core.setOutput("uv-version", setupResult.version);
core.saveState(STATE_UV_VERSION, setupResult.version);
core.info(`Successfully installed uv version ${setupResult.version}`);
if (enableCache) {
@@ -98,29 +101,14 @@ async function setupUv(
};
}
let downloadVersionResult: { version: string; cachedToolDir: string };
if (serverUrl !== "https://github.com") {
core.warning(
"The input server-url is deprecated. Please use manifest-file instead.",
);
downloadVersionResult = await downloadVersionFromGithub(
serverUrl,
platform,
arch,
resolvedVersion,
checkSum,
githubToken,
);
} else {
downloadVersionResult = await downloadVersionFromManifest(
manifestFile,
platform,
arch,
resolvedVersion,
checkSum,
githubToken,
);
}
const downloadVersionResult = await downloadVersionFromManifest(
manifestFile,
platform,
arch,
resolvedVersion,
checkSum,
githubToken,
);
return {
uvDir: downloadVersionResult.cachedToolDir,
@@ -163,18 +151,31 @@ async function determineVersion(
function addUvToPathAndOutput(cachedPath: string): void {
core.setOutput("uv-path", `${cachedPath}${path.sep}uv`);
core.saveState(STATE_UV_PATH, `${cachedPath}${path.sep}uv`);
core.setOutput("uvx-path", `${cachedPath}${path.sep}uvx`);
core.addPath(cachedPath);
core.info(`Added ${cachedPath} to the path`);
if (process.env.UV_NO_MODIFY_PATH !== undefined) {
core.info("UV_NO_MODIFY_PATH is set, not modifying PATH");
} else {
core.addPath(cachedPath);
core.info(`Added ${cachedPath} to the path`);
}
}
function addToolBinToPath(): void {
if (toolBinDir !== undefined) {
core.exportVariable("UV_TOOL_BIN_DIR", toolBinDir);
core.info(`Set UV_TOOL_BIN_DIR to ${toolBinDir}`);
core.addPath(toolBinDir);
core.info(`Added ${toolBinDir} to the path`);
if (process.env.UV_NO_MODIFY_PATH !== undefined) {
core.info(`UV_NO_MODIFY_PATH is set, not adding ${toolBinDir} to path`);
} else {
core.addPath(toolBinDir);
core.info(`Added ${toolBinDir} to the path`);
}
} else {
if (process.env.UV_NO_MODIFY_PATH !== undefined) {
core.info("UV_NO_MODIFY_PATH is set, not adding user local bin to path");
return;
}
if (process.env.XDG_BIN_HOME !== undefined) {
core.addPath(process.env.XDG_BIN_HOME);
core.info(`Added ${process.env.XDG_BIN_HOME} to the path`);
@@ -195,6 +196,17 @@ function setToolDir(): void {
}
}
function addPythonDirToPath(): void {
core.exportVariable("UV_PYTHON_INSTALL_DIR", pythonDir);
core.info(`Set UV_PYTHON_INSTALL_DIR to ${pythonDir}`);
if (process.env.UV_NO_MODIFY_PATH !== undefined) {
core.info("UV_NO_MODIFY_PATH is set, not adding python dir to path");
} else {
core.addPath(pythonDir);
core.info(`Added ${pythonDir} to the path`);
}
}
function setupPython(): void {
if (pythonVersion !== "") {
core.exportVariable("UV_PYTHON", pythonVersion);
@@ -204,26 +216,39 @@ function setupPython(): void {
async function activateEnvironment(): Promise<void> {
if (activateEnvironmentInput) {
if (process.env.UV_NO_MODIFY_PATH !== undefined) {
throw new Error(
"UV_NO_MODIFY_PATH and activate-environment cannot be used together.",
);
}
const execArgs = ["venv", ".venv", "--directory", workingDirectory];
core.info("Activating python venv...");
await exec.exec("uv", execArgs);
let venvBinPath = `${workingDirectory}${path.sep}.venv${path.sep}bin`;
const venvPath = path.resolve(`${workingDirectory}${path.sep}.venv`);
let venvBinPath = `${venvPath}${path.sep}bin`;
if (process.platform === "win32") {
venvBinPath = `${workingDirectory}${path.sep}.venv${path.sep}Scripts`;
venvBinPath = `${venvPath}${path.sep}Scripts`;
}
core.addPath(path.resolve(venvBinPath));
core.exportVariable(
"VIRTUAL_ENV",
path.resolve(`${workingDirectory}${path.sep}.venv`),
);
core.exportVariable("VIRTUAL_ENV", venvPath);
core.setOutput("venv", venvPath);
}
}
function setCacheDir(cacheLocalPath: string): void {
core.exportVariable("UV_CACHE_DIR", cacheLocalPath);
core.info(`Set UV_CACHE_DIR to ${cacheLocalPath}`);
function setCacheDir(): void {
if (enableCache) {
const cacheDirFromConfig = getConfigValueFromTomlFile("", "cache-dir");
if (cacheDirFromConfig !== undefined) {
core.info(
"Using cache-dir from uv config file, not modifying UV_CACHE_DIR",
);
return;
}
core.exportVariable("UV_CACHE_DIR", cacheLocalPath);
core.info(`Set UV_CACHE_DIR to ${cacheLocalPath}`);
}
}
function addMatchers(): void {

View File

@@ -1,4 +1,5 @@
import * as core from "@actions/core";
import type { Endpoints } from "@octokit/types";
import * as semver from "semver";
import { updateChecksums } from "./download/checksum/update-known-checksums";
import {
@@ -8,6 +9,9 @@ import {
import { OWNER, REPO } from "./utils/constants";
import { Octokit } from "./utils/octokit";
type Release =
Endpoints["GET /repos/{owner}/{repo}/releases"]["response"]["data"][number];
async function run(): Promise<void> {
const checksumFilePath = process.argv.slice(2)[0];
const versionsManifestFile = process.argv.slice(2)[1];
@@ -31,10 +35,13 @@ async function run(): Promise<void> {
return;
}
const releases = await octokit.paginate(octokit.rest.repos.listReleases, {
owner: OWNER,
repo: REPO,
});
const releases: Release[] = 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"))

24
src/utils/config-file.ts Normal file
View File

@@ -0,0 +1,24 @@
import fs from "node:fs";
import * as toml from "smol-toml";
export function getConfigValueFromTomlFile(
filePath: string,
key: string,
): string | undefined {
if (!fs.existsSync(filePath) || !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?: Record<string, string | undefined> };
};
return tomlContent?.tool?.uv?.[key];
}
const tomlContent = toml.parse(fileContent) as Record<
string,
string | undefined
>;
return tomlContent[key];
}

View File

@@ -1,3 +1,5 @@
export const REPO = "uv";
export const OWNER = "astral-sh";
export const TOOL_CACHE_NAME = "uv";
export const STATE_UV_PATH = "uv-path";
export const STATE_UV_VERSION = "uv-version";

View File

@@ -1,5 +1,6 @@
import path from "node:path";
import * as core from "@actions/core";
import { getConfigValueFromTomlFile } from "./config-file";
export const workingDirectory = core.getInput("working-directory");
export const version = core.getInput("version");
@@ -8,17 +9,20 @@ export const pythonVersion = core.getInput("python-version");
export const activateEnvironment = core.getBooleanInput("activate-environment");
export const checkSum = core.getInput("checksum");
export const enableCache = getEnableCache();
export const restoreCache = core.getInput("restore-cache") === "true";
export const saveCache = core.getInput("save-cache") === "true";
export const cacheSuffix = core.getInput("cache-suffix") || "";
export const cacheLocalPath = getCacheLocalPath();
export const cacheDependencyGlob = getCacheDependencyGlob();
export const pruneCache = core.getInput("prune-cache") === "true";
export const cachePython = core.getInput("cache-python") === "true";
export const ignoreNothingToCache =
core.getInput("ignore-nothing-to-cache") === "true";
export const ignoreEmptyWorkdir =
core.getInput("ignore-empty-workdir") === "true";
export const toolBinDir = getToolBinDir();
export const toolDir = getToolDir();
export const serverUrl = core.getInput("server-url");
export const pythonDir = getUvPythonDir();
export const githubToken = core.getInput("github-token");
export const manifestFile = getManifestFile();
export const addProblemMatchers =
@@ -81,6 +85,14 @@ function getCacheLocalPath(): string {
const tildeExpanded = expandTilde(cacheLocalPathInput);
return resolveRelativePath(tildeExpanded);
}
const cacheDirFromConfig = getCacheDirFromConfig();
if (cacheDirFromConfig !== undefined) {
return cacheDirFromConfig;
}
if (process.env.UV_CACHE_DIR !== undefined) {
core.info(`UV_CACHE_DIR is already set to ${process.env.UV_CACHE_DIR}`);
return process.env.UV_CACHE_DIR;
}
if (process.env.RUNNER_ENVIRONMENT === "github-hosted") {
if (process.env.RUNNER_TEMP !== undefined) {
return `${process.env.RUNNER_TEMP}${path.sep}setup-uv-cache`;
@@ -95,6 +107,46 @@ function getCacheLocalPath(): string {
return `${process.env.HOME}${path.sep}.cache${path.sep}uv`;
}
function getCacheDirFromConfig(): string | undefined {
for (const filePath of [versionFile, "uv.toml", "pyproject.toml"]) {
const resolvedPath = resolveRelativePath(filePath);
try {
const cacheDir = getConfigValueFromTomlFile(resolvedPath, "cache-dir");
if (cacheDir !== undefined) {
core.info(`Found cache-dir in ${resolvedPath}: ${cacheDir}`);
return cacheDir;
}
} catch (err) {
const message = (err as Error).message;
core.warning(`Error while parsing ${filePath}: ${message}`);
return undefined;
}
}
return undefined;
}
export function getUvPythonDir(): string {
if (process.env.UV_PYTHON_INSTALL_DIR !== undefined) {
core.info(
`UV_PYTHON_INSTALL_DIR is already set to ${process.env.UV_PYTHON_INSTALL_DIR}`,
);
return process.env.UV_PYTHON_INSTALL_DIR;
}
if (process.env.RUNNER_ENVIRONMENT !== "github-hosted") {
if (process.platform === "win32") {
return `${process.env.APPDATA}${path.sep}uv${path.sep}python`;
} else {
return `${process.env.HOME}${path.sep}.local${path.sep}share${path.sep}uv${path.sep}python`;
}
}
if (process.env.RUNNER_TEMP !== undefined) {
return `${process.env.RUNNER_TEMP}${path.sep}uv-python-dir`;
}
throw Error(
"Could not determine UV_PYTHON_INSTALL_DIR. Please make sure RUNNER_TEMP is set or provide the UV_PYTHON_INSTALL_DIR environment variable",
);
}
function getCacheDependencyGlob(): string {
const cacheDependencyGlobInput = core.getInput("cache-dependency-glob");
if (cacheDependencyGlobInput !== "") {

View File

@@ -1,8 +1,5 @@
import type { OctokitOptions } from "@octokit/core";
import { Octokit as Core } from "@octokit/core";
import type {
Constructor,
OctokitOptions,
} from "@octokit/core/dist-types/types";
import {
type PaginateInterface,
paginateRest,
@@ -17,22 +14,21 @@ const DEFAULTS = {
userAgent: "setup-uv",
};
export const Octokit: typeof Core &
Constructor<
{
paginate: PaginateInterface;
} & ReturnType<typeof legacyRestEndpointMethods>
> = Core.plugin(paginateRest, legacyRestEndpointMethods).defaults(
function buildDefaults(options: OctokitOptions): OctokitOptions {
return {
...DEFAULTS,
...options,
request: {
fetch: customFetch,
...options.request,
},
};
},
);
const OctokitWithPlugins = Core.plugin(paginateRest, legacyRestEndpointMethods);
export type Octokit = InstanceType<typeof Octokit>;
export const Octokit = OctokitWithPlugins.defaults(function buildDefaults(
options: OctokitOptions,
): OctokitOptions {
return {
...DEFAULTS,
...options,
request: {
fetch: customFetch,
...options.request,
},
};
});
export type Octokit = InstanceType<typeof OctokitWithPlugins> & {
paginate: PaginateInterface;
};

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"];
}

View File

@@ -1,6 +1,6 @@
import fs from "node:fs";
import * as core from "@actions/core";
import { getRequiredVersionFromConfigFile } from "./config-file";
import { getConfigValueFromTomlFile } from "../utils/config-file";
import { getUvVersionFromRequirementsFile } from "./requirements-file";
import { getUvVersionFromToolVersions } from "./tool-versions-file";
@@ -14,7 +14,7 @@ export function getUvVersionFromFile(filePath: string): string | undefined {
try {
uvVersion = getUvVersionFromToolVersions(filePath);
if (uvVersion === undefined) {
uvVersion = getRequiredVersionFromConfigFile(filePath);
uvVersion = getConfigValueFromTomlFile(filePath, "required-version");
}
if (uvVersion === undefined) {
uvVersion = getUvVersionFromRequirementsFile(filePath);

View File

@@ -1,12 +1,12 @@
{
"compilerOptions": {
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
"module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,
"module": "nodenext" /* 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. */,
"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. */,
"target": "ES2022" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
"target": "ES2024" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
},
"exclude": ["node_modules", "**/*.test.ts"]
}

View File

@@ -1,4 +1,1656 @@
[
{
"arch": "aarch64",
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-aarch64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.9.2"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-aarch64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.9.2"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-aarch64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.2"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-aarch64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.9.2"
},
{
"arch": "arm",
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-arm-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.9.2"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-armv7-unknown-linux-gnueabihf.tar.gz",
"platform": "unknown-linux-gnueabihf",
"version": "0.9.2"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-armv7-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.9.2"
},
{
"arch": "i686",
"artifactName": "uv-i686-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-i686-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.9.2"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-i686-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.2"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-i686-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.9.2"
},
{
"arch": "powerpc64",
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-powerpc64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.2"
},
{
"arch": "powerpc64le",
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-powerpc64le-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.2"
},
{
"arch": "riscv64gc",
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-riscv64gc-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.2"
},
{
"arch": "s390x",
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-s390x-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.2"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-x86_64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.9.2"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-x86_64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.9.2"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-x86_64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.2"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.2/uv-x86_64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.9.2"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-aarch64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.9.1"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-aarch64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.9.1"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-aarch64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.1"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-aarch64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.9.1"
},
{
"arch": "arm",
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-arm-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.9.1"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-armv7-unknown-linux-gnueabihf.tar.gz",
"platform": "unknown-linux-gnueabihf",
"version": "0.9.1"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-armv7-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.9.1"
},
{
"arch": "i686",
"artifactName": "uv-i686-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-i686-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.9.1"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-i686-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.1"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-i686-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.9.1"
},
{
"arch": "powerpc64",
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-powerpc64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.1"
},
{
"arch": "powerpc64le",
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-powerpc64le-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.1"
},
{
"arch": "riscv64gc",
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-riscv64gc-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.1"
},
{
"arch": "s390x",
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-s390x-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.1"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-x86_64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.9.1"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-x86_64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.9.1"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-x86_64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.1"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.1/uv-x86_64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.9.1"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-aarch64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.9.0"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-aarch64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.9.0"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-aarch64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.0"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-aarch64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.9.0"
},
{
"arch": "arm",
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-arm-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.9.0"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-armv7-unknown-linux-gnueabihf.tar.gz",
"platform": "unknown-linux-gnueabihf",
"version": "0.9.0"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-armv7-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.9.0"
},
{
"arch": "i686",
"artifactName": "uv-i686-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-i686-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.9.0"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-i686-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.0"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-i686-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.9.0"
},
{
"arch": "powerpc64",
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-powerpc64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.0"
},
{
"arch": "powerpc64le",
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-powerpc64le-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.0"
},
{
"arch": "riscv64gc",
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-riscv64gc-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.0"
},
{
"arch": "s390x",
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-s390x-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.0"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-x86_64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.9.0"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-x86_64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.9.0"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-x86_64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.9.0"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.0/uv-x86_64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.9.0"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-aarch64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.24"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-aarch64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.24"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-aarch64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.24"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-aarch64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.24"
},
{
"arch": "arm",
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-arm-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.24"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-armv7-unknown-linux-gnueabihf.tar.gz",
"platform": "unknown-linux-gnueabihf",
"version": "0.8.24"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-armv7-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.24"
},
{
"arch": "i686",
"artifactName": "uv-i686-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-i686-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.24"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-i686-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.24"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-i686-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.24"
},
{
"arch": "powerpc64",
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-powerpc64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.24"
},
{
"arch": "powerpc64le",
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-powerpc64le-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.24"
},
{
"arch": "riscv64gc",
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-riscv64gc-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.24"
},
{
"arch": "s390x",
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-s390x-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.24"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-x86_64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.24"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-x86_64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.24"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-x86_64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.24"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.24/uv-x86_64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.24"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-aarch64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.23"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-aarch64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.23"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-aarch64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.23"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-aarch64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.23"
},
{
"arch": "arm",
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-arm-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.23"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-armv7-unknown-linux-gnueabihf.tar.gz",
"platform": "unknown-linux-gnueabihf",
"version": "0.8.23"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-armv7-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.23"
},
{
"arch": "i686",
"artifactName": "uv-i686-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-i686-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.23"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-i686-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.23"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-i686-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.23"
},
{
"arch": "powerpc64",
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-powerpc64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.23"
},
{
"arch": "powerpc64le",
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-powerpc64le-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.23"
},
{
"arch": "riscv64gc",
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-riscv64gc-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.23"
},
{
"arch": "s390x",
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-s390x-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.23"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-x86_64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.23"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-x86_64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.23"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-x86_64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.23"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.23/uv-x86_64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.23"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-aarch64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.22"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-aarch64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.22"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-aarch64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.22"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-aarch64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.22"
},
{
"arch": "arm",
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-arm-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.22"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-armv7-unknown-linux-gnueabihf.tar.gz",
"platform": "unknown-linux-gnueabihf",
"version": "0.8.22"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-armv7-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.22"
},
{
"arch": "i686",
"artifactName": "uv-i686-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-i686-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.22"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-i686-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.22"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-i686-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.22"
},
{
"arch": "powerpc64",
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-powerpc64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.22"
},
{
"arch": "powerpc64le",
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-powerpc64le-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.22"
},
{
"arch": "riscv64gc",
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-riscv64gc-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.22"
},
{
"arch": "s390x",
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-s390x-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.22"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-x86_64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.22"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-x86_64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.22"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-x86_64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.22"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.22/uv-x86_64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.22"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-aarch64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.21"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-aarch64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.21"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-aarch64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.21"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-aarch64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.21"
},
{
"arch": "arm",
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-arm-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.21"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-armv7-unknown-linux-gnueabihf.tar.gz",
"platform": "unknown-linux-gnueabihf",
"version": "0.8.21"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-armv7-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.21"
},
{
"arch": "i686",
"artifactName": "uv-i686-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-i686-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.21"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-i686-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.21"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-i686-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.21"
},
{
"arch": "powerpc64",
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-powerpc64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.21"
},
{
"arch": "powerpc64le",
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-powerpc64le-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.21"
},
{
"arch": "riscv64gc",
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-riscv64gc-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.21"
},
{
"arch": "s390x",
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-s390x-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.21"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-x86_64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.21"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-x86_64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.21"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-x86_64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.21"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.21/uv-x86_64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.21"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-aarch64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.20"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-aarch64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.20"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-aarch64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.20"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-aarch64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.20"
},
{
"arch": "arm",
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-arm-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.20"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-armv7-unknown-linux-gnueabihf.tar.gz",
"platform": "unknown-linux-gnueabihf",
"version": "0.8.20"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-armv7-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.20"
},
{
"arch": "i686",
"artifactName": "uv-i686-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-i686-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.20"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-i686-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.20"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-i686-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.20"
},
{
"arch": "powerpc64",
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-powerpc64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.20"
},
{
"arch": "powerpc64le",
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-powerpc64le-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.20"
},
{
"arch": "riscv64gc",
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-riscv64gc-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.20"
},
{
"arch": "s390x",
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-s390x-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.20"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-x86_64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.20"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-x86_64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.20"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-x86_64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.20"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.20/uv-x86_64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.20"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-aarch64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.19"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-aarch64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.19"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-aarch64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.19"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-aarch64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.19"
},
{
"arch": "arm",
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-arm-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.19"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-armv7-unknown-linux-gnueabihf.tar.gz",
"platform": "unknown-linux-gnueabihf",
"version": "0.8.19"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-armv7-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.19"
},
{
"arch": "i686",
"artifactName": "uv-i686-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-i686-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.19"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-i686-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.19"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-i686-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.19"
},
{
"arch": "powerpc64",
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-powerpc64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.19"
},
{
"arch": "powerpc64le",
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-powerpc64le-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.19"
},
{
"arch": "riscv64gc",
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-riscv64gc-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.19"
},
{
"arch": "s390x",
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-s390x-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.19"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-x86_64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.19"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-x86_64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.19"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-x86_64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.19"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-x86_64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.19"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-aarch64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.18"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-aarch64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.18"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-aarch64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.18"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-aarch64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.18"
},
{
"arch": "arm",
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-arm-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.18"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-armv7-unknown-linux-gnueabihf.tar.gz",
"platform": "unknown-linux-gnueabihf",
"version": "0.8.18"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-armv7-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.18"
},
{
"arch": "i686",
"artifactName": "uv-i686-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-i686-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.18"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-i686-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.18"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-i686-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.18"
},
{
"arch": "powerpc64",
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-powerpc64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.18"
},
{
"arch": "powerpc64le",
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-powerpc64le-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.18"
},
{
"arch": "riscv64gc",
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-riscv64gc-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.18"
},
{
"arch": "s390x",
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-s390x-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.18"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-x86_64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.18"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-x86_64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.18"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-x86_64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.18"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.18/uv-x86_64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.18"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-aarch64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.17"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-aarch64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.17"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-aarch64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.17"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-aarch64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.17"
},
{
"arch": "arm",
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-arm-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.17"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-armv7-unknown-linux-gnueabihf.tar.gz",
"platform": "unknown-linux-gnueabihf",
"version": "0.8.17"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-armv7-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.17"
},
{
"arch": "i686",
"artifactName": "uv-i686-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-i686-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.17"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-i686-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.17"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-i686-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.17"
},
{
"arch": "loongarch64",
"artifactName": "uv-loongarch64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-loongarch64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.17"
},
{
"arch": "powerpc64",
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-powerpc64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.17"
},
{
"arch": "powerpc64le",
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-powerpc64le-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.17"
},
{
"arch": "riscv64gc",
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-riscv64gc-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.17"
},
{
"arch": "s390x",
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-s390x-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.17"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-x86_64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.17"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-x86_64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.17"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-x86_64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.17"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.17/uv-x86_64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.17"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-aarch64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.16"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-aarch64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.16"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-aarch64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.16"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-aarch64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.16"
},
{
"arch": "arm",
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-arm-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.16"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-armv7-unknown-linux-gnueabihf.tar.gz",
"platform": "unknown-linux-gnueabihf",
"version": "0.8.16"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-armv7-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.16"
},
{
"arch": "i686",
"artifactName": "uv-i686-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-i686-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.16"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-i686-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.16"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-i686-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.16"
},
{
"arch": "loongarch64",
"artifactName": "uv-loongarch64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-loongarch64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.16"
},
{
"arch": "powerpc64",
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-powerpc64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.16"
},
{
"arch": "powerpc64le",
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-powerpc64le-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.16"
},
{
"arch": "riscv64gc",
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-riscv64gc-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.16"
},
{
"arch": "s390x",
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-s390x-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.16"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-x86_64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.16"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-x86_64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.16"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-x86_64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.16"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.16/uv-x86_64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.16"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-aarch64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.15"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-aarch64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.15"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-aarch64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.15"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-aarch64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.15"
},
{
"arch": "arm",
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-arm-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.15"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-armv7-unknown-linux-gnueabihf.tar.gz",
"platform": "unknown-linux-gnueabihf",
"version": "0.8.15"
},
{
"arch": "armv7",
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-armv7-unknown-linux-musleabihf.tar.gz",
"platform": "unknown-linux-musleabihf",
"version": "0.8.15"
},
{
"arch": "i686",
"artifactName": "uv-i686-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-i686-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.15"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-i686-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.15"
},
{
"arch": "i686",
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-i686-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.15"
},
{
"arch": "powerpc64",
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-powerpc64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.15"
},
{
"arch": "powerpc64le",
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-powerpc64le-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.15"
},
{
"arch": "riscv64gc",
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-riscv64gc-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.15"
},
{
"arch": "s390x",
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-s390x-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.15"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-x86_64-apple-darwin.tar.gz",
"platform": "apple-darwin",
"version": "0.8.15"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-x86_64-pc-windows-msvc.zip",
"platform": "pc-windows-msvc",
"version": "0.8.15"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-x86_64-unknown-linux-gnu.tar.gz",
"platform": "unknown-linux-gnu",
"version": "0.8.15"
},
{
"arch": "x86_64",
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.8.15/uv-x86_64-unknown-linux-musl.tar.gz",
"platform": "unknown-linux-musl",
"version": "0.8.15"
},
{
"arch": "aarch64",
"artifactName": "uv-aarch64-apple-darwin.tar.gz",