Compare commits

...
10 Commits
Author SHA1 Message Date
Yannik Tausch b1ab8f237b feat: Add Support for Handlebars Templates in pixi-url (#213) 2025-07-23 11:58:57 +02:00
Yannik Tausch d7951c27cd test: Skip tests with secrets on fork PRs (#216) 2025-07-22 17:39:23 +02:00
Yannik Tausch 4522f6409d feat: Allow specifying inputs as environment variables (#214) 2025-07-22 12:53:59 +02:00
Yannik Tausch a8c5cac0eb test: Enable failure tests (#215) 2025-07-22 11:14:53 +02:00
Pavel Zwerschke 307e5e5842 fix: Multiple invokations of setup-pixi (#211) 2025-07-18 09:43:49 +02:00
Yannik TauschandPavel Zwerschke 273e4808c8 feat: Add pixi-url-bearer-token to authenticate when downloading from pixi-url (#210)
Co-authored-by: Pavel Zwerschke <pavelzw@gmail.com>
2025-07-11 18:38:08 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> c690703e5f Bump softprops/action-gh-release from 2.2.2 to 2.3.2 in the gh-actions group (#209)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-08 13:28:17 +02:00
dependabot[bot]dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Pavel Zwerschke
29045c2e67 Bump the nodejs group with 7 updates (#208)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Pavel Zwerschke <pavelzw@gmail.com>
2025-07-01 07:41:26 +00:00
github-actions[bot] 2fd23d90b5 Reference latest Pixi version in README (#207) 2025-07-01 07:03:47 +00:00
Daniel Elsner 14c8aabd75 fix: Forcefully remove empty parents directory on post-cleanup (#205) 2025-06-12 17:01:57 +02:00
16 changed files with 12737 additions and 670 deletions
@@ -0,0 +1,7 @@
:8080 {
@unauthorized not header Authorization "Bearer s3cr3tT0k3nABC123"
respond @unauthorized "Unauthorized: Invalid token" 401
root * ./assets
file_server
}
+1 -1
View File
@@ -47,7 +47,7 @@ jobs:
run: | run: |
set -euo pipefail set -euo pipefail
latest_version="$(jq -r '.version' package.json)" latest_version="$(jq -r '.version' package.json)"
count_expected=17 count_expected=19
count_actual="$(grep -c "setup-pixi@v$latest_version" README.md || true)" count_actual="$(grep -c "setup-pixi@v$latest_version" README.md || true)"
if [ "$count_actual" -ne "$count_expected" ]; then if [ "$count_actual" -ne "$count_expected" ]; then
echo "::error file=README.md::Expected $count_expected mentions of \`setup-pixi@v$latest_version\` in README.md, but found $count_actual." echo "::error file=README.md::Expected $count_expected mentions of \`setup-pixi@v$latest_version\` in README.md, but found $count_actual."
+1 -1
View File
@@ -24,7 +24,7 @@ jobs:
TAG_NAME: v${{ steps.version-metadata.outputs.newVersion }} TAG_NAME: v${{ steps.version-metadata.outputs.newVersion }}
- name: Create release - name: Create release
if: steps.version-metadata.outputs.changed == 'true' if: steps.version-metadata.outputs.changed == 'true'
uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631 # v2.2.2 uses: softprops/action-gh-release@72f2c25fcb47643c292f7107632f7a47c1df5cd8 # v2.3.2
with: with:
generate_release_notes: true generate_release_notes: true
tag_name: v${{ steps.version-metadata.outputs.newVersion }} tag_name: v${{ steps.version-metadata.outputs.newVersion }}
+299 -109
View File
@@ -190,6 +190,94 @@ jobs:
pixi-url: https://github.com/prefix-dev/pixi/releases/download/v0.14.0/pixi-x86_64-unknown-linux-musl pixi-url: https://github.com/prefix-dev/pixi/releases/download/v0.14.0/pixi-x86_64-unknown-linux-musl
- run: pixi --version | grep -q "pixi 0.14.0" - run: pixi --version | grep -q "pixi 0.14.0"
pixi-url-bearer-token:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Move pixi.toml
run: mv test/old-pixi-lockfiles/* .
- name: Setup caddy
run: |
set -euo pipefail
curl -Ls -o caddy.tar.gz https://github.com/caddyserver/caddy/releases/download/v2.10.0/caddy_2.10.0_linux_amd64.tar.gz
tar -xzf caddy.tar.gz
chmod +x caddy
mkdir -p assets
curl -Ls -o assets/pixi https://github.com/prefix-dev/pixi/releases/download/v0.14.0/pixi-x86_64-unknown-linux-musl
cp .github/assets/pixi-url-auth-test/Caddyfile .
./caddy run --config Caddyfile &
- run: ps -aux | grep caddy
- name: Run with wrong token
uses: ./
id: wrongtoken
with:
cache: false
pixi-url: http://localhost:8080/pixi
pixi-url-bearer-token: wrongtoken
continue-on-error: true
- name: Fail if wrong token did not fail
run: |
echo "Unexpected success!"
exit 1
if: ${{ steps.wrongtoken.outcome != 'failure' }}
- name: Run with correct token
uses: ./
with:
cache: false
pixi-url: http://localhost:8080/pixi
pixi-url-bearer-token: s3cr3tT0k3nABC123
- run: pixi --version | grep -q "pixi 0.14.0"
pixi-url-custom-template-no-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: ./
with:
pixi-url: |
{{#if latest ~}}
https://github.com/prefix-dev/pixi/releases/download/v0.14.0/{{pixiFile}}
{{~else~}}
https://github.com/prefix-dev/pixi/releases/download/{{version}}/{{pixiFile}}
{{~/if}}
run-install: false
- run: pixi --version | grep -q "pixi 0.14.0"
pixi-url-custom-template-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: ./
with:
pixi-url: |
{{#if latest ~}}
https://github.com/prefix-dev/pixi/releases/download/v0.14.0/{{pixiFile}}
{{~else~}}
https://github.com/prefix-dev/pixi/releases/download/{{version}}/{{pixiFile}}
{{~/if}}
run-install: false
pixi-version: v0.15.1
- run: pixi --version | grep -q "pixi 0.15.1"
pixi-url-custom-template-version-latest:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: ./
with:
pixi-url: |
{{#if latest ~}}
https://github.com/prefix-dev/pixi/releases/download/v0.14.0/{{pixiFile}}
{{~else~}}
https://github.com/prefix-dev/pixi/releases/download/{{version}}/{{pixiFile}}
{{~/if}}
run-install: false
pixi-version: latest
- run: pixi --version | grep -q "pixi 0.14.0"
custom-manifest-path: custom-manifest-path:
strategy: strategy:
matrix: matrix:
@@ -426,6 +514,7 @@ jobs:
matrix: matrix:
os: [ubuntu-latest, macos-latest, windows-latest] os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Move pixi.toml - name: Move pixi.toml
@@ -444,6 +533,7 @@ jobs:
matrix: matrix:
os: [ubuntu-latest, macos-latest, windows-latest] os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Move pixi.toml - name: Move pixi.toml
@@ -884,118 +974,218 @@ jobs:
- run: which python | grep '.pixi/envs/py311/bin/python' - run: which python | grep '.pixi/envs/py311/bin/python'
- run: '[[ $PIXI_ENVIRONMENT_NAME = "py311" ]]' - run: '[[ $PIXI_ENVIRONMENT_NAME = "py311" ]]'
# not properly testable multiple-invokations:
# https://github.com/actions/runner/issues/2347 runs-on: ${{ matrix.os }}
# https://github.com/orgs/community/discussions/15452 strategy:
# test-cache-fail-no-lockfile: matrix:
# runs-on: ${{ matrix.os }} os: [windows-latest, ubuntu-latest, macos-latest]
# strategy: steps:
# fail-fast: false - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# matrix: - name: Move pixi.toml
# os: [windows-latest, ubuntu-latest, macos-latest] run: mv test/multiple-environments/* .
# steps: - uses: ./
# - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with:
# - name: Move pixi files run-install: false
# run: mv test/no-lockfile/* . - uses: ./
# - uses: ./ with:
# with: environments: >-
# cache: true py311 py312
# cache-key: test-cache-no-lockfile-${{ github.sha }}-${{ github.run_attempt }}- activate-environment: py311
# - run: exit 1
# if: success()
# test-incorrect-version: env-variable-input-custom-bin-path:
# runs-on: ${{ matrix.os }} strategy:
# strategy: matrix:
# fail-fast: false os: [ubuntu-latest, macos-latest, windows-latest]
# matrix: runs-on: ${{ matrix.os }}
# os: [windows-latest, ubuntu-latest, macos-latest] steps:
# steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Move pixi.toml
# - name: Move pixi files run: mv test/default/* .
# run: mv test/default/* . - uses: ./
# - uses: ./ env:
# with: SETUP_PIXI_PIXI_BIN_PATH: custom-bin/pixi${{ matrix.os == 'windows-latest' && '.exe' || '' }}
# pixi-version: 0.1.0 with:
# - run: exit 1 cache: false
# if: success() - run: |
test -f custom-bin/pixi${{ matrix.os == 'windows-latest' && '.exe' || '' }}
pixi --help
which pixi | grep -q custom-bin/pixi
# which pixi should be absolute
which pixi | grep -q "^/"
# test-frozen-and-locked: env-variable-input-custom-pixi-url:
# runs-on: ${{ matrix.os }} runs-on: ubuntu-latest
# strategy: steps:
# fail-fast: false - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# matrix: - name: Move pixi.toml
# os: [windows-latest, ubuntu-latest, macos-latest] run: mv test/old-pixi-lockfiles/* .
# steps: - uses: ./
# - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 env:
# - name: Move pixi files SETUP_PIXI_PIXI_URL: https://github.com/prefix-dev/pixi/releases/download/v0.14.0/pixi-x86_64-unknown-linux-musl
# run: mv test/default/* . with:
# - uses: ./ cache: false
# with: - run: pixi --version | grep -q "pixi 0.14.0"
# pixi-version: v0.5.0
# frozen: true
# locked: true
# - run: exit 1
# if: success()
# test-frozen-no-lockfile: env-variable-input-precendence:
# runs-on: ${{ matrix.os }} runs-on: ubuntu-latest
# strategy: steps:
# fail-fast: false - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# matrix: - name: Move pixi.toml
# os: [windows-latest, ubuntu-latest, macos-latest] run: mv test/old-pixi-lockfiles/* .
# steps: - uses: ./
# - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 env:
# - name: Move pixi files SETUP_PIXI_PIXI_URL: https://github.com/prefix-dev/pixi/releases/download/v0.14.0/pixi-x86_64-unknown-linux-musl
# run: mv test/no-lockfile/* . with:
# - uses: ./ cache: false
# with: pixi-url: https://github.com/prefix-dev/pixi/releases/download/v0.49.0/pixi-x86_64-unknown-linux-musl
# frozen: true - run: pixi --version | grep -q "pixi 0.49.0"
# - run: exit 1
# if: success()
# test-locked-no-lockfile: test-cache-fail-no-lockfile:
# runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
# strategy: strategy:
# fail-fast: false fail-fast: false
# matrix: matrix:
# os: [windows-latest, ubuntu-latest, macos-latest] os: [windows-latest, ubuntu-latest, macos-latest]
# steps: steps:
# - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# - name: Move pixi files - name: Move pixi files
# run: mv test/no-lockfile/* . run: mv test/no-lockfile/* .
# - uses: ./ - uses: ./
# with: id: test
# locked: true with:
# - run: exit 1 cache: true
# if: success() cache-key: test-cache-no-lockfile-${{ github.sha }}-${{ github.run_attempt }}-
continue-on-error: true
- name: Fail on unexpected success
run: |
echo "Unexpected success!"
exit 1
if: ${{ steps.test.outcome != 'failure' }}
# test-lockfile-not-up-to-date: test-incorrect-version:
# runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
# strategy: strategy:
# fail-fast: false fail-fast: false
# matrix: matrix:
# os: [windows-latest, ubuntu-latest, macos-latest] os: [windows-latest, ubuntu-latest, macos-latest]
# steps: steps:
# - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# - name: Move pixi files - name: Move pixi files
# run: mv test/lockfile-not-up-to-date/* . run: mv test/default/* .
# - uses: ./ - uses: ./
# # locked: true is implicit id: test
# - run: exit 1 with:
# if: success() pixi-version: 0.1.0
continue-on-error: true
- name: Fail on unexpected success
run: |
echo "Unexpected success!"
exit 1
if: ${{ steps.test.outcome != 'failure' }}
# cache-write-true-no-lockfile: test-frozen-and-locked:
# timeout-minutes: 10 runs-on: ${{ matrix.os }}
# runs-on: ${{ matrix.os }} strategy:
# strategy: fail-fast: false
# fail-fast: false matrix:
# matrix: os: [windows-latest, ubuntu-latest, macos-latest]
# os: [windows-latest, ubuntu-latest, macos-latest] steps:
# steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Move pixi files
# - name: Move pixi files run: mv test/default/* .
# run: mv test/no-lockfile/* . - uses: ./
# - uses: ./ id: test
# with: with:
# cache-write: true pixi-version: v0.5.0
frozen: true
locked: true
continue-on-error: true
- name: Fail on unexpected success
run: |
echo "Unexpected success!"
exit 1
if: ${{ steps.test.outcome != 'failure' }}
test-frozen-no-lockfile:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Move pixi files
run: mv test/no-lockfile/* .
- uses: ./
id: test
with:
frozen: true
continue-on-error: true
- name: Fail on unexpected success
run: |
echo "Unexpected success!"
exit 1
if: ${{ steps.test.outcome != 'failure' }}
test-locked-no-lockfile:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Move pixi files
run: mv test/no-lockfile/* .
- uses: ./
id: test
with:
locked: true
continue-on-error: true
- name: Fail on unexpected success
run: |
echo "Unexpected success!"
exit 1
if: ${{ steps.test.outcome != 'failure' }}
test-lockfile-not-up-to-date:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Move pixi files
run: mv test/lockfile-not-up-to-date/* .
- uses: ./
id: test
# locked: true is implicit
continue-on-error: true
- name: Fail on unexpected success
run: |
echo "Unexpected success!"
exit 1
if: ${{ steps.test.outcome != 'failure' }}
cache-write-true-no-lockfile:
timeout-minutes: 10
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Move pixi files
run: mv test/no-lockfile/* .
- uses: ./
id: test
with:
cache-write: true
continue-on-error: true
- name: Fail on unexpected success
run: |
echo "Unexpected success!"
exit 1
if: ${{ steps.test.outcome != 'failure' }}
+1
View File
@@ -1,2 +1,3 @@
dist dist
pnpm-lock.yaml pnpm-lock.yaml
pixi.lock
+61 -18
View File
@@ -23,9 +23,9 @@ GitHub Action to set up the [pixi](https://github.com/prefix-dev/pixi) package m
## Usage ## Usage
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.9 - uses: prefix-dev/setup-pixi@v0.8.13
with: with:
pixi-version: v0.44.0 pixi-version: v0.49.0
cache: true cache: true
auth-host: prefix.dev auth-host: prefix.dev
@@ -35,7 +35,7 @@ GitHub Action to set up the [pixi](https://github.com/prefix-dev/pixi) package m
> [!WARNING] > [!WARNING]
> Since pixi is not yet stable, the API of this action may change between minor versions. > Since pixi is not yet stable, the API of this action may change between minor versions.
> Please pin the versions of this action to a specific version (i.e., `prefix-dev/setup-pixi@v0.8.9`) to avoid breaking changes. > Please pin the versions of this action to a specific version (i.e., `prefix-dev/setup-pixi@v0.8.13`) to avoid breaking changes.
> You can automatically update the version of this action by using [Dependabot](https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot). > You can automatically update the version of this action by using [Dependabot](https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot).
> >
> Put the following in your `.github/dependabot.yml` file to enable Dependabot for your GitHub Actions: > Put the following in your `.github/dependabot.yml` file to enable Dependabot for your GitHub Actions:
@@ -74,7 +74,7 @@ In order to not exceed the [10 GB cache size limit](https://docs.github.com/en/a
This can be done by setting the `cache-write` argument. This can be done by setting the `cache-write` argument.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.9 - uses: prefix-dev/setup-pixi@v0.8.13
with: with:
cache: true cache: true
cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }} cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }}
@@ -119,7 +119,7 @@ test:
environment: [py311, py312] environment: [py311, py312]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: prefix-dev/setup-pixi@v0.8.9 - uses: prefix-dev/setup-pixi@v0.8.13
with: with:
environments: ${{ matrix.environment }} environments: ${{ matrix.environment }}
``` ```
@@ -129,7 +129,7 @@ test:
The following example will install both the `py311` and the `py312` environment on the runner. The following example will install both the `py311` and the `py312` environment on the runner.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.9 - uses: prefix-dev/setup-pixi@v0.8.13
with: with:
# separated by spaces # separated by spaces
environments: >- environments: >-
@@ -165,7 +165,7 @@ Specify the token using the `auth-token` input argument.
This form of authentication (bearer token in the request headers) is mainly used at [prefix.dev](https://prefix.dev). This form of authentication (bearer token in the request headers) is mainly used at [prefix.dev](https://prefix.dev).
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.9 - uses: prefix-dev/setup-pixi@v0.8.13
with: with:
auth-host: prefix.dev auth-host: prefix.dev
auth-token: ${{ secrets.PREFIX_DEV_TOKEN }} auth-token: ${{ secrets.PREFIX_DEV_TOKEN }}
@@ -177,7 +177,7 @@ Specify the username and password using the `auth-username` and `auth-password`
This form of authentication (HTTP Basic Auth) is used in some enterprise environments with [artifactory](https://jfrog.com/artifactory) for example. This form of authentication (HTTP Basic Auth) is used in some enterprise environments with [artifactory](https://jfrog.com/artifactory) for example.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.9 - uses: prefix-dev/setup-pixi@v0.8.13
with: with:
auth-host: custom-artifactory.com auth-host: custom-artifactory.com
auth-username: ${{ secrets.PIXI_USERNAME }} auth-username: ${{ secrets.PIXI_USERNAME }}
@@ -190,7 +190,7 @@ Specify the conda-token using the `auth-conda-token` input argument.
This form of authentication (token is encoded in URL: `https://my-quetz-instance.com/t/<token>/get/custom-channel`) is used at [anaconda.org](https://anaconda.org) or with [quetz instances](https://github.com/mamba-org/quetz). This form of authentication (token is encoded in URL: `https://my-quetz-instance.com/t/<token>/get/custom-channel`) is used at [anaconda.org](https://anaconda.org) or with [quetz instances](https://github.com/mamba-org/quetz).
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.9 - uses: prefix-dev/setup-pixi@v0.8.13
with: with:
auth-host: anaconda.org # or my-quetz-instance.com auth-host: anaconda.org # or my-quetz-instance.com
auth-conda-token: ${{ secrets.CONDA_TOKEN }} auth-conda-token: ${{ secrets.CONDA_TOKEN }}
@@ -202,7 +202,7 @@ Specify the S3 key pair using the `auth-access-key-id` and `auth-secret-access-k
You can also specify the session token using the `auth-session-token` input argument. You can also specify the session token using the `auth-session-token` input argument.
```yaml ```yaml
- uses: prefix-dev/setup-pixi@v0.8.9 - uses: prefix-dev/setup-pixi@v0.8.13
with: with:
auth-host: s3://my-s3-bucket auth-host: s3://my-s3-bucket
auth-s3-access-key-id: ${{ secrets.ACCESS_KEY_ID }} auth-s3-access-key-id: ${{ secrets.ACCESS_KEY_ID }}
@@ -274,7 +274,7 @@ To this end, `setup-pixi` adds all environment variables set when executing `pix
As a result, all installed binaries can be accessed without having to call `pixi run`. As a result, all installed binaries can be accessed without having to call `pixi run`.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.9 - uses: prefix-dev/setup-pixi@v0.8.13
with: with:
activate-environment: true activate-environment: true
``` ```
@@ -282,7 +282,7 @@ As a result, all installed binaries can be accessed without having to call `pixi
If you are installing multiple environments, you will need to specify the name of the environment that you want to be activated. If you are installing multiple environments, you will need to specify the name of the environment that you want to be activated.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.9 - uses: prefix-dev/setup-pixi@v0.8.13
with: with:
environments: >- environments: >-
py311 py311
@@ -299,7 +299,7 @@ You can specify whether `setup-pixi` should run `pixi install --frozen` or `pixi
See the [official documentation](https://prefix.dev/docs/pixi/cli#install) for more information about the `--frozen` and `--locked` flags. See the [official documentation](https://prefix.dev/docs/pixi/cli#install) for more information about the `--frozen` and `--locked` flags.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.9 - uses: prefix-dev/setup-pixi@v0.8.13
with: with:
locked: true locked: true
# or # or
@@ -318,7 +318,7 @@ The first one is the debug logging of the action itself.
This can be enabled by running the action with the `RUNNER_DEBUG` environment variable set to `true`. This can be enabled by running the action with the `RUNNER_DEBUG` environment variable set to `true`.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.9 - uses: prefix-dev/setup-pixi@v0.8.13
env: env:
RUNNER_DEBUG: true RUNNER_DEBUG: true
``` ```
@@ -336,7 +336,7 @@ The second type is the debug logging of the pixi executable.
This can be specified by setting the `log-level` input. This can be specified by setting the `log-level` input.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.9 - uses: prefix-dev/setup-pixi@v0.8.13
with: with:
# one of `q`, `default`, `v`, `vv`, or `vvv`. # one of `q`, `default`, `v`, `vv`, or `vvv`.
log-level: vvv log-level: vvv
@@ -362,7 +362,7 @@ If nothing is specified, `post-cleanup` will default to `true`.
On self-hosted runners, you also might want to alter the default pixi install location to a temporary location. You can use `pixi-bin-path: ${{ runner.temp }}/bin/pixi` to do this. On self-hosted runners, you also might want to alter the default pixi install location to a temporary location. You can use `pixi-bin-path: ${{ runner.temp }}/bin/pixi` to do this.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.9 - uses: prefix-dev/setup-pixi@v0.8.13
with: with:
post-cleanup: true post-cleanup: true
# ${{ runner.temp }}\Scripts\pixi.exe on Windows # ${{ runner.temp }}\Scripts\pixi.exe on Windows
@@ -378,7 +378,7 @@ You can also use a preinstalled local version of pixi on the runner by not setti
This can be overwritten by setting the `manifest-path` input argument. This can be overwritten by setting the `manifest-path` input argument.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.9 - uses: prefix-dev/setup-pixi@v0.8.13
with: with:
manifest-path: pyproject.toml manifest-path: pyproject.toml
``` ```
@@ -388,11 +388,54 @@ This can be overwritten by setting the `manifest-path` input argument.
If you only want to install pixi and not install the current project, you can use the `run-install` option. If you only want to install pixi and not install the current project, you can use the `run-install` option.
```yml ```yml
- uses: prefix-dev/setup-pixi@v0.8.9 - uses: prefix-dev/setup-pixi@v0.8.13
with: with:
run-install: false run-install: false
``` ```
### Download pixi from a custom URL
You can also download pixi from a custom URL by setting the `pixi-url` input argument.
Optionally, you can combine this with the `pixi-url-bearer-token` input argument to authenticate the download request.
```yml
- uses: prefix-dev/setup-pixi@v0.8.13
with:
pixi-url: https://pixi-mirror.example.com/releases/download/v0.48.0/pixi-x86_64-unknown-linux-musl
pixi-url-bearer-token: ${{ secrets.PIXI_MIRROR_BEARER_TOKEN }}
```
The `pixi-url` input argument can also be a [Handlebars](https://handlebarsjs.com/) template string.
It will be rendered with the following variables:
- `version`: The version of pixi that is being installed (`latest` or a version like `v0.48.0`).
- `latest`: A boolean indicating if the version is `latest`.
- `pixiFile`: The name of the pixi binary to download, as determined by the system of the runner (e.g., `pixi-x86_64-unknown-linux-musl`).
By default, `pixi-url` is equivalent to the following template:
```yml
- uses: prefix-dev/setup-pixi@v0.8.13
with:
pixi-url: |
{{#if latest~}}
https://github.com/prefix-dev/pixi/releases/latest/download/{{pixiFile}}
{{~else~}}
https://github.com/prefix-dev/pixi/releases/download/{{version}}/{{pixiFile}}
{{~/if}}
```
### Setting inputs from environment variables
Alternatively to setting the inputs in the `with` section, you can also set each of them using environment variables.
The corresponding environment variable names are derived from the input names by converting them to uppercase, replacing hyphens with underscores, and prefixing them with `SETUP_PIXI_`.
For example, the `pixi-bin-path` input can be set using the `SETUP_PIXI_PIXI_BIN_PATH` environment variable.
This is particularly useful if executing the action on a self-hosted runner.
Inputs always take precedence over environment variables.
## More examples ## More examples
If you want to see more examples, you can take a look at the [GitHub Workflows of this repository](.github/workflows/test.yml). If you want to see more examples, you can take a look at the [GitHub Workflows of this repository](.github/workflows/test.yml).
+3 -1
View File
@@ -9,7 +9,9 @@ inputs:
pixi-version: pixi-version:
description: Version of pixi to install description: Version of pixi to install
pixi-url: pixi-url:
description: URL of pixi to install description: URL of pixi to install. Can be a Handlebars template receiving `version`, `latest`, and `pixiFile` as variables.
pixi-url-bearer-token:
description: Bearer token to use for authentication when downloading pixi from a URL.
log-level: log-level:
description: | description: |
Log level for the pixi CLI. Log level for the pixi CLI.
Generated Vendored
+6050 -172
View File
File diff suppressed because one or more lines are too long
Generated Vendored
+5998 -119
View File
File diff suppressed because one or more lines are too long
+9 -9
View File
@@ -1,6 +1,6 @@
{ {
"name": "setup-pixi", "name": "setup-pixi",
"version": "0.8.9", "version": "0.8.13",
"private": true, "private": true,
"description": "Action to set up the pixi package manager.", "description": "Action to set up the pixi package manager.",
"scripts": { "scripts": {
@@ -27,20 +27,20 @@
"@actions/exec": "^1.1.1", "@actions/exec": "^1.1.1",
"@actions/io": "^1.1.3", "@actions/io": "^1.1.3",
"@actions/tool-cache": "^2.0.2", "@actions/tool-cache": "^2.0.2",
"smol-toml": "^1.3.4", "handlebars": "^4.7.8",
"smol-toml": "^1.4.0",
"untildify": "^5.0.0", "untildify": "^5.0.0",
"which": "^5.0.0", "which": "^5.0.0",
"zod": "^3.24.2" "zod": "^3.25.67"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.23.0", "@eslint/js": "^9.30.0",
"@types/eslint__js": "^9.14.0", "@types/node": "^24.0.8",
"@types/node": "^22.13.14",
"@types/which": "^3.0.4", "@types/which": "^3.0.4",
"eslint": "^9.23.0", "eslint": "^9.30.0",
"prettier": "^3.5.3", "prettier": "^3.6.2",
"tsup": "^8.4.0", "tsup": "^8.4.0",
"typescript": "^5.8.2", "typescript": "^5.8.2",
"typescript-eslint": "^8.29.0" "typescript-eslint": "^8.35.1"
} }
} }
+222 -188
View File
@@ -23,9 +23,12 @@ importers:
'@actions/tool-cache': '@actions/tool-cache':
specifier: ^2.0.2 specifier: ^2.0.2
version: 2.0.2 version: 2.0.2
handlebars:
specifier: ^4.7.8
version: 4.7.8
smol-toml: smol-toml:
specifier: ^1.3.4 specifier: ^1.4.0
version: 1.3.4 version: 1.4.0
untildify: untildify:
specifier: ^5.0.0 specifier: ^5.0.0
version: 5.0.0 version: 5.0.0
@@ -33,27 +36,24 @@ importers:
specifier: ^5.0.0 specifier: ^5.0.0
version: 5.0.0 version: 5.0.0
zod: zod:
specifier: ^3.24.2 specifier: ^3.25.67
version: 3.25.45 version: 3.25.67
devDependencies: devDependencies:
'@eslint/js': '@eslint/js':
specifier: ^9.23.0 specifier: ^9.30.0
version: 9.28.0 version: 9.30.0
'@types/eslint__js':
specifier: ^9.14.0
version: 9.14.0
'@types/node': '@types/node':
specifier: ^22.13.14 specifier: ^24.0.8
version: 22.15.29 version: 24.0.8
'@types/which': '@types/which':
specifier: ^3.0.4 specifier: ^3.0.4
version: 3.0.4 version: 3.0.4
eslint: eslint:
specifier: ^9.23.0 specifier: ^9.30.0
version: 9.28.0 version: 9.30.0
prettier: prettier:
specifier: ^3.5.3 specifier: ^3.6.2
version: 3.5.3 version: 3.6.2
tsup: tsup:
specifier: ^8.4.0 specifier: ^8.4.0
version: 8.5.0(typescript@5.8.3) version: 8.5.0(typescript@5.8.3)
@@ -61,8 +61,8 @@ importers:
specifier: ^5.8.2 specifier: ^5.8.2
version: 5.8.3 version: 5.8.3
typescript-eslint: typescript-eslint:
specifier: ^8.29.0 specifier: ^8.35.1
version: 8.33.0(eslint@9.28.0)(typescript@5.8.3) version: 8.35.1(eslint@9.30.0)(typescript@5.8.3)
packages: packages:
@@ -292,12 +292,6 @@ packages:
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@eslint-community/eslint-utils@4.5.1':
resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
'@eslint-community/eslint-utils@4.7.0': '@eslint-community/eslint-utils@4.7.0':
resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -308,32 +302,36 @@ packages:
resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
'@eslint/config-array@0.20.0': '@eslint/config-array@0.21.0':
resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/config-helpers@0.2.2': '@eslint/config-helpers@0.3.0':
resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/core@0.14.0': '@eslint/core@0.14.0':
resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/core@0.15.1':
resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/eslintrc@3.3.1': '@eslint/eslintrc@3.3.1':
resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/js@9.28.0': '@eslint/js@9.30.0':
resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==} resolution: {integrity: sha512-Wzw3wQwPvc9sHM+NjakWTcPx11mbZyiYHuwWa/QfZ7cIRX7WK54PSk7bdyXDaoaopUcMatv1zaQvOAAO8hCdww==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/object-schema@2.1.6': '@eslint/object-schema@2.1.6':
resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/plugin-kit@0.3.1': '@eslint/plugin-kit@0.3.3':
resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@fastify/busboy@2.1.1': '@fastify/busboy@2.1.1':
@@ -356,8 +354,8 @@ packages:
resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
engines: {node: '>=18.18'} engines: {node: '>=18.18'}
'@humanwhocodes/retry@0.4.2': '@humanwhocodes/retry@0.4.3':
resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
engines: {node: '>=18.18'} engines: {node: '>=18.18'}
'@isaacs/cliui@8.0.2': '@isaacs/cliui@8.0.2':
@@ -510,80 +508,78 @@ packages:
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@types/eslint__js@9.14.0':
resolution: {integrity: sha512-s0jepCjOJWB/GKcuba4jISaVpBudw3ClXJ3fUK4tugChUMQsp6kSwuA8Dcx6wFd/JsJqcY8n4rEpa5RTHs5ypA==}
deprecated: This is a stub types definition. @eslint/js provides its own type definitions, so you do not need this installed.
'@types/estree@1.0.6': '@types/estree@1.0.6':
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
'@types/estree@1.0.7': '@types/estree@1.0.8':
resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
'@types/json-schema@7.0.15': '@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
'@types/node@22.15.29': '@types/node@24.0.8':
resolution: {integrity: sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==} resolution: {integrity: sha512-WytNrFSgWO/esSH9NbpWUfTMGQwCGIKfCmNlmFDNiI5gGhgMmEA+V1AEvKLeBNvvtBnailJtkrEa2OIISwrVAA==}
'@types/which@3.0.4': '@types/which@3.0.4':
resolution: {integrity: sha512-liyfuo/106JdlgSchJzXEQCVArk0CvevqPote8F8HgWgJ3dRCcTHgJIsLDuee0kxk/mhbInzIZk3QWSZJ8R+2w==} resolution: {integrity: sha512-liyfuo/106JdlgSchJzXEQCVArk0CvevqPote8F8HgWgJ3dRCcTHgJIsLDuee0kxk/mhbInzIZk3QWSZJ8R+2w==}
'@typescript-eslint/eslint-plugin@8.33.0': '@typescript-eslint/eslint-plugin@8.35.1':
resolution: {integrity: sha512-CACyQuqSHt7ma3Ns601xykeBK/rDeZa3w6IS6UtMQbixO5DWy+8TilKkviGDH6jtWCo8FGRKEK5cLLkPvEammQ==} resolution: {integrity: sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': ^8.33.0 '@typescript-eslint/parser': ^8.35.1
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.9.0' typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/parser@8.33.0': '@typescript-eslint/parser@8.35.1':
resolution: {integrity: sha512-JaehZvf6m0yqYp34+RVnihBAChkqeH+tqqhS0GuX1qgPpwLvmTPheKEs6OeCK6hVJgXZHJ2vbjnC9j119auStQ==} resolution: {integrity: sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.9.0' typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/project-service@8.33.0': '@typescript-eslint/project-service@8.35.1':
resolution: {integrity: sha512-d1hz0u9l6N+u/gcrk6s6gYdl7/+pp8yHheRTqP6X5hVDKALEaTn8WfGiit7G511yueBEL3OpOEpD+3/MBdoN+A==} resolution: {integrity: sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/scope-manager@8.33.0':
resolution: {integrity: sha512-LMi/oqrzpqxyO72ltP+dBSP6V0xiUb4saY7WLtxSfiNEBI8m321LLVFU9/QDJxjDQG9/tjSqKz/E3380TEqSTw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/tsconfig-utils@8.33.0':
resolution: {integrity: sha512-sTkETlbqhEoiFmGr1gsdq5HyVbSOF0145SYDJ/EQmXHtKViCaGvnyLqWFFHtEXoS0J1yU8Wyou2UGmgW88fEug==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <5.9.0' typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/type-utils@8.33.0': '@typescript-eslint/scope-manager@8.35.1':
resolution: {integrity: sha512-lScnHNCBqL1QayuSrWeqAL5GmqNdVUQAAMTaCwdYEdWfIrSrOGzyLGRCHXcCixa5NK6i5l0AfSO2oBSjCjf4XQ==} resolution: {integrity: sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/tsconfig-utils@8.35.1':
resolution: {integrity: sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/type-utils@8.35.1':
resolution: {integrity: sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.9.0' typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/types@8.33.0': '@typescript-eslint/types@8.35.1':
resolution: {integrity: sha512-DKuXOKpM5IDT1FA2g9x9x1Ug81YuKrzf4mYX8FAVSNu5Wo/LELHWQyM1pQaDkI42bX15PWl0vNPt1uGiIFUOpg==} resolution: {integrity: sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@8.33.0': '@typescript-eslint/typescript-estree@8.35.1':
resolution: {integrity: sha512-vegY4FQoB6jL97Tu/lWRsAiUUp8qJTqzAmENH2k59SJhw0Th1oszb9Idq/FyyONLuNqT1OADJPXfyUNOR8SzAQ==} resolution: {integrity: sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <5.9.0' typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/utils@8.33.0': '@typescript-eslint/utils@8.35.1':
resolution: {integrity: sha512-lPFuQaLA9aSNa7D5u2EpRiqdAUhzShwGg/nhpBlc4GR6kcTABttCuyjFs8BcEZ8VWrjCBof/bePhP3Q3fS+Yrw==} resolution: {integrity: sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.9.0' typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/visitor-keys@8.33.0': '@typescript-eslint/visitor-keys@8.35.1':
resolution: {integrity: sha512-7RW7CMYoskiz5OOGAWjJFxgb7c5UNjTG292gYhWeOAcFmYCtVCSqjqSBj5zMhxbXo2JOW95YYrUWJfU0zrpaGQ==} resolution: {integrity: sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
abort-controller@3.0.0: abort-controller@3.0.0:
@@ -595,8 +591,8 @@ packages:
peerDependencies: peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
acorn@8.14.1: acorn@8.15.0:
resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
hasBin: true hasBin: true
@@ -635,11 +631,11 @@ packages:
balanced-match@1.0.2: balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
brace-expansion@1.1.11: brace-expansion@1.1.12:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
brace-expansion@2.0.1: brace-expansion@2.0.2:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
braces@3.0.3: braces@3.0.3:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
@@ -763,20 +759,20 @@ packages:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'} engines: {node: '>=10'}
eslint-scope@8.3.0: eslint-scope@8.4.0:
resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint-visitor-keys@3.4.3: eslint-visitor-keys@3.4.3:
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
eslint-visitor-keys@4.2.0: eslint-visitor-keys@4.2.1:
resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint@9.28.0: eslint@9.30.0:
resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==} resolution: {integrity: sha512-iN/SiPxmQu6EVkf+m1qpBxzUhE12YqFLOSySuOyVLJLEF9nzTf+h/1AJYc1JWzCnktggeNrjvQGLngDzXirU6g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@@ -785,8 +781,8 @@ packages:
jiti: jiti:
optional: true optional: true
espree@10.3.0: espree@10.4.0:
resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
esquery@1.6.0: esquery@1.6.0:
@@ -910,6 +906,11 @@ packages:
graphemer@1.4.0: graphemer@1.4.0:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
handlebars@4.7.8:
resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==}
engines: {node: '>=0.4.7'}
hasBin: true
has-flag@4.0.0: has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -1054,6 +1055,9 @@ packages:
resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
engines: {node: '>=16 || 14 >=14.17'} engines: {node: '>=16 || 14 >=14.17'}
minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
minipass@7.1.2: minipass@7.1.2:
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
engines: {node: '>=16 || 14 >=14.17'} engines: {node: '>=16 || 14 >=14.17'}
@@ -1070,6 +1074,9 @@ packages:
natural-compare@1.4.0: natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
neo-async@2.6.2:
resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
node-fetch@2.7.0: node-fetch@2.7.0:
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
engines: {node: 4.x || >=6.0.0} engines: {node: 4.x || >=6.0.0}
@@ -1157,8 +1164,8 @@ packages:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
prettier@3.5.3: prettier@3.6.2:
resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
engines: {node: '>=14'} engines: {node: '>=14'}
hasBin: true hasBin: true
@@ -1220,10 +1227,14 @@ packages:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'} engines: {node: '>=14'}
smol-toml@1.3.4: smol-toml@1.4.0:
resolution: {integrity: sha512-UOPtVuYkzYGee0Bd2Szz8d2G3RfMfJ2t3qVdZUAozZyAk+a0Sxa+QKix0YCwjL/A1RR0ar44nCxaoN9FxdJGwA==} resolution: {integrity: sha512-IMxaDA/58wBvkvX77ykQ6e9r6fjs8xbxpz8bMCyVQ/fEFWbA5uJrnaVwDuhLrrANGdd7apRyTPDBvI893Bxu9g==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
source-map@0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
source-map@0.8.0-beta.0: source-map@0.8.0-beta.0:
resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
@@ -1330,8 +1341,8 @@ packages:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
typescript-eslint@8.33.0: typescript-eslint@8.35.1:
resolution: {integrity: sha512-5YmNhF24ylCsvdNW2oJwMzTbaeO4bg90KeGtMjUw0AGtHksgEPLRTUil+coHwCfiu4QjVJFnjp94DmU6zV7DhQ==} resolution: {integrity: sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
@@ -1350,8 +1361,13 @@ packages:
ufo@1.6.1: ufo@1.6.1:
resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
undici-types@6.21.0: uglify-js@3.19.3:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==}
engines: {node: '>=0.8.0'}
hasBin: true
undici-types@7.8.0:
resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==}
undici@5.29.0: undici@5.29.0:
resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==}
@@ -1394,6 +1410,9 @@ packages:
resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
wordwrap@1.0.0:
resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
wrap-ansi@7.0.0: wrap-ansi@7.0.0:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'} engines: {node: '>=10'}
@@ -1414,8 +1433,8 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'} engines: {node: '>=10'}
zod@3.25.45: zod@3.25.67:
resolution: {integrity: sha512-kv1swJBZqv98NQibL0oVvkQE8rXT+6qGNM1FpZkFcJG2jnz4vbtu48bgaitp85CaBPLSKXibrEsU7MzJoVoZAA==} resolution: {integrity: sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==}
snapshots: snapshots:
@@ -1646,37 +1665,36 @@ snapshots:
'@esbuild/win32-x64@0.25.0': '@esbuild/win32-x64@0.25.0':
optional: true optional: true
'@eslint-community/eslint-utils@4.5.1(eslint@9.28.0)': '@eslint-community/eslint-utils@4.7.0(eslint@9.30.0)':
dependencies: dependencies:
eslint: 9.28.0 eslint: 9.30.0
eslint-visitor-keys: 3.4.3
'@eslint-community/eslint-utils@4.7.0(eslint@9.28.0)':
dependencies:
eslint: 9.28.0
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.1': {} '@eslint-community/regexpp@4.12.1': {}
'@eslint/config-array@0.20.0': '@eslint/config-array@0.21.0':
dependencies: dependencies:
'@eslint/object-schema': 2.1.6 '@eslint/object-schema': 2.1.6
debug: 4.4.0 debug: 4.4.1
minimatch: 3.1.2 minimatch: 3.1.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@eslint/config-helpers@0.2.2': {} '@eslint/config-helpers@0.3.0': {}
'@eslint/core@0.14.0': '@eslint/core@0.14.0':
dependencies: dependencies:
'@types/json-schema': 7.0.15 '@types/json-schema': 7.0.15
'@eslint/core@0.15.1':
dependencies:
'@types/json-schema': 7.0.15
'@eslint/eslintrc@3.3.1': '@eslint/eslintrc@3.3.1':
dependencies: dependencies:
ajv: 6.12.6 ajv: 6.12.6
debug: 4.4.0 debug: 4.4.1
espree: 10.3.0 espree: 10.4.0
globals: 14.0.0 globals: 14.0.0
ignore: 5.3.2 ignore: 5.3.2
import-fresh: 3.3.1 import-fresh: 3.3.1
@@ -1686,13 +1704,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@eslint/js@9.28.0': {} '@eslint/js@9.30.0': {}
'@eslint/object-schema@2.1.6': {} '@eslint/object-schema@2.1.6': {}
'@eslint/plugin-kit@0.3.1': '@eslint/plugin-kit@0.3.3':
dependencies: dependencies:
'@eslint/core': 0.14.0 '@eslint/core': 0.15.1
levn: 0.4.1 levn: 0.4.1
'@fastify/busboy@2.1.1': {} '@fastify/busboy@2.1.1': {}
@@ -1708,7 +1726,7 @@ snapshots:
'@humanwhocodes/retry@0.3.1': {} '@humanwhocodes/retry@0.3.1': {}
'@humanwhocodes/retry@0.4.2': {} '@humanwhocodes/retry@0.4.3': {}
'@isaacs/cliui@8.0.2': '@isaacs/cliui@8.0.2':
dependencies: dependencies:
@@ -1829,31 +1847,27 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.34.8': '@rollup/rollup-win32-x64-msvc@4.34.8':
optional: true optional: true
'@types/eslint__js@9.14.0':
dependencies:
'@eslint/js': 9.28.0
'@types/estree@1.0.6': {} '@types/estree@1.0.6': {}
'@types/estree@1.0.7': {} '@types/estree@1.0.8': {}
'@types/json-schema@7.0.15': {} '@types/json-schema@7.0.15': {}
'@types/node@22.15.29': '@types/node@24.0.8':
dependencies: dependencies:
undici-types: 6.21.0 undici-types: 7.8.0
'@types/which@3.0.4': {} '@types/which@3.0.4': {}
'@typescript-eslint/eslint-plugin@8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0)(typescript@5.8.3))(eslint@9.28.0)(typescript@5.8.3)': '@typescript-eslint/eslint-plugin@8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0)(typescript@5.8.3)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.12.1 '@eslint-community/regexpp': 4.12.1
'@typescript-eslint/parser': 8.33.0(eslint@9.28.0)(typescript@5.8.3) '@typescript-eslint/parser': 8.35.1(eslint@9.30.0)(typescript@5.8.3)
'@typescript-eslint/scope-manager': 8.33.0 '@typescript-eslint/scope-manager': 8.35.1
'@typescript-eslint/type-utils': 8.33.0(eslint@9.28.0)(typescript@5.8.3) '@typescript-eslint/type-utils': 8.35.1(eslint@9.30.0)(typescript@5.8.3)
'@typescript-eslint/utils': 8.33.0(eslint@9.28.0)(typescript@5.8.3) '@typescript-eslint/utils': 8.35.1(eslint@9.30.0)(typescript@5.8.3)
'@typescript-eslint/visitor-keys': 8.33.0 '@typescript-eslint/visitor-keys': 8.35.1
eslint: 9.28.0 eslint: 9.30.0
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 7.0.5 ignore: 7.0.5
natural-compare: 1.4.0 natural-compare: 1.4.0
@@ -1862,55 +1876,55 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@8.33.0(eslint@9.28.0)(typescript@5.8.3)': '@typescript-eslint/parser@8.35.1(eslint@9.30.0)(typescript@5.8.3)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 8.33.0 '@typescript-eslint/scope-manager': 8.35.1
'@typescript-eslint/types': 8.33.0 '@typescript-eslint/types': 8.35.1
'@typescript-eslint/typescript-estree': 8.33.0(typescript@5.8.3) '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3)
'@typescript-eslint/visitor-keys': 8.33.0 '@typescript-eslint/visitor-keys': 8.35.1
debug: 4.4.1 debug: 4.4.1
eslint: 9.28.0 eslint: 9.30.0
typescript: 5.8.3 typescript: 5.8.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/project-service@8.33.0(typescript@5.8.3)': '@typescript-eslint/project-service@8.35.1(typescript@5.8.3)':
dependencies: dependencies:
'@typescript-eslint/tsconfig-utils': 8.33.0(typescript@5.8.3) '@typescript-eslint/tsconfig-utils': 8.35.1(typescript@5.8.3)
'@typescript-eslint/types': 8.33.0 '@typescript-eslint/types': 8.35.1
debug: 4.4.1 debug: 4.4.1
typescript: 5.8.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
- typescript
'@typescript-eslint/scope-manager@8.33.0': '@typescript-eslint/scope-manager@8.35.1':
dependencies: dependencies:
'@typescript-eslint/types': 8.33.0 '@typescript-eslint/types': 8.35.1
'@typescript-eslint/visitor-keys': 8.33.0 '@typescript-eslint/visitor-keys': 8.35.1
'@typescript-eslint/tsconfig-utils@8.33.0(typescript@5.8.3)': '@typescript-eslint/tsconfig-utils@8.35.1(typescript@5.8.3)':
dependencies: dependencies:
typescript: 5.8.3 typescript: 5.8.3
'@typescript-eslint/type-utils@8.33.0(eslint@9.28.0)(typescript@5.8.3)': '@typescript-eslint/type-utils@8.35.1(eslint@9.30.0)(typescript@5.8.3)':
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 8.33.0(typescript@5.8.3) '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3)
'@typescript-eslint/utils': 8.33.0(eslint@9.28.0)(typescript@5.8.3) '@typescript-eslint/utils': 8.35.1(eslint@9.30.0)(typescript@5.8.3)
debug: 4.4.1 debug: 4.4.1
eslint: 9.28.0 eslint: 9.30.0
ts-api-utils: 2.1.0(typescript@5.8.3) ts-api-utils: 2.1.0(typescript@5.8.3)
typescript: 5.8.3 typescript: 5.8.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/types@8.33.0': {} '@typescript-eslint/types@8.35.1': {}
'@typescript-eslint/typescript-estree@8.33.0(typescript@5.8.3)': '@typescript-eslint/typescript-estree@8.35.1(typescript@5.8.3)':
dependencies: dependencies:
'@typescript-eslint/project-service': 8.33.0(typescript@5.8.3) '@typescript-eslint/project-service': 8.35.1(typescript@5.8.3)
'@typescript-eslint/tsconfig-utils': 8.33.0(typescript@5.8.3) '@typescript-eslint/tsconfig-utils': 8.35.1(typescript@5.8.3)
'@typescript-eslint/types': 8.33.0 '@typescript-eslint/types': 8.35.1
'@typescript-eslint/visitor-keys': 8.33.0 '@typescript-eslint/visitor-keys': 8.35.1
debug: 4.4.1 debug: 4.4.1
fast-glob: 3.3.3 fast-glob: 3.3.3
is-glob: 4.0.3 is-glob: 4.0.3
@@ -1921,31 +1935,31 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@8.33.0(eslint@9.28.0)(typescript@5.8.3)': '@typescript-eslint/utils@8.35.1(eslint@9.30.0)(typescript@5.8.3)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0) '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.0)
'@typescript-eslint/scope-manager': 8.33.0 '@typescript-eslint/scope-manager': 8.35.1
'@typescript-eslint/types': 8.33.0 '@typescript-eslint/types': 8.35.1
'@typescript-eslint/typescript-estree': 8.33.0(typescript@5.8.3) '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3)
eslint: 9.28.0 eslint: 9.30.0
typescript: 5.8.3 typescript: 5.8.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/visitor-keys@8.33.0': '@typescript-eslint/visitor-keys@8.35.1':
dependencies: dependencies:
'@typescript-eslint/types': 8.33.0 '@typescript-eslint/types': 8.35.1
eslint-visitor-keys: 4.2.0 eslint-visitor-keys: 4.2.1
abort-controller@3.0.0: abort-controller@3.0.0:
dependencies: dependencies:
event-target-shim: 5.0.1 event-target-shim: 5.0.1
acorn-jsx@5.3.2(acorn@8.14.1): acorn-jsx@5.3.2(acorn@8.15.0):
dependencies: dependencies:
acorn: 8.14.1 acorn: 8.15.0
acorn@8.14.1: {} acorn@8.15.0: {}
agent-base@7.1.3: {} agent-base@7.1.3: {}
@@ -1974,12 +1988,12 @@ snapshots:
balanced-match@1.0.2: {} balanced-match@1.0.2: {}
brace-expansion@1.1.11: brace-expansion@1.1.12:
dependencies: dependencies:
balanced-match: 1.0.2 balanced-match: 1.0.2
concat-map: 0.0.1 concat-map: 0.0.1
brace-expansion@2.0.1: brace-expansion@2.0.2:
dependencies: dependencies:
balanced-match: 1.0.2 balanced-match: 1.0.2
@@ -2103,38 +2117,38 @@ snapshots:
escape-string-regexp@4.0.0: {} escape-string-regexp@4.0.0: {}
eslint-scope@8.3.0: eslint-scope@8.4.0:
dependencies: dependencies:
esrecurse: 4.3.0 esrecurse: 4.3.0
estraverse: 5.3.0 estraverse: 5.3.0
eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@3.4.3: {}
eslint-visitor-keys@4.2.0: {} eslint-visitor-keys@4.2.1: {}
eslint@9.28.0: eslint@9.30.0:
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.5.1(eslint@9.28.0) '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.0)
'@eslint-community/regexpp': 4.12.1 '@eslint-community/regexpp': 4.12.1
'@eslint/config-array': 0.20.0 '@eslint/config-array': 0.21.0
'@eslint/config-helpers': 0.2.2 '@eslint/config-helpers': 0.3.0
'@eslint/core': 0.14.0 '@eslint/core': 0.14.0
'@eslint/eslintrc': 3.3.1 '@eslint/eslintrc': 3.3.1
'@eslint/js': 9.28.0 '@eslint/js': 9.30.0
'@eslint/plugin-kit': 0.3.1 '@eslint/plugin-kit': 0.3.3
'@humanfs/node': 0.16.6 '@humanfs/node': 0.16.6
'@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/module-importer': 1.0.1
'@humanwhocodes/retry': 0.4.2 '@humanwhocodes/retry': 0.4.3
'@types/estree': 1.0.7 '@types/estree': 1.0.8
'@types/json-schema': 7.0.15 '@types/json-schema': 7.0.15
ajv: 6.12.6 ajv: 6.12.6
chalk: 4.1.2 chalk: 4.1.2
cross-spawn: 7.0.6 cross-spawn: 7.0.6
debug: 4.4.0 debug: 4.4.1
escape-string-regexp: 4.0.0 escape-string-regexp: 4.0.0
eslint-scope: 8.3.0 eslint-scope: 8.4.0
eslint-visitor-keys: 4.2.0 eslint-visitor-keys: 4.2.1
espree: 10.3.0 espree: 10.4.0
esquery: 1.6.0 esquery: 1.6.0
esutils: 2.0.3 esutils: 2.0.3
fast-deep-equal: 3.1.3 fast-deep-equal: 3.1.3
@@ -2152,11 +2166,11 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
espree@10.3.0: espree@10.4.0:
dependencies: dependencies:
acorn: 8.14.1 acorn: 8.15.0
acorn-jsx: 5.3.2(acorn@8.14.1) acorn-jsx: 5.3.2(acorn@8.15.0)
eslint-visitor-keys: 4.2.0 eslint-visitor-keys: 4.2.1
esquery@1.6.0: esquery@1.6.0:
dependencies: dependencies:
@@ -2285,6 +2299,15 @@ snapshots:
graphemer@1.4.0: {} graphemer@1.4.0: {}
handlebars@4.7.8:
dependencies:
minimist: 1.2.8
neo-async: 2.6.2
source-map: 0.6.1
wordwrap: 1.0.0
optionalDependencies:
uglify-js: 3.19.3
has-flag@4.0.0: {} has-flag@4.0.0: {}
has-symbols@1.1.0: {} has-symbols@1.1.0: {}
@@ -2400,17 +2423,19 @@ snapshots:
minimatch@3.1.2: minimatch@3.1.2:
dependencies: dependencies:
brace-expansion: 1.1.11 brace-expansion: 1.1.12
minimatch@9.0.5: minimatch@9.0.5:
dependencies: dependencies:
brace-expansion: 2.0.1 brace-expansion: 2.0.2
minimist@1.2.8: {}
minipass@7.1.2: {} minipass@7.1.2: {}
mlly@1.7.4: mlly@1.7.4:
dependencies: dependencies:
acorn: 8.14.1 acorn: 8.15.0
pathe: 2.0.3 pathe: 2.0.3
pkg-types: 1.3.1 pkg-types: 1.3.1
ufo: 1.6.1 ufo: 1.6.1
@@ -2425,6 +2450,8 @@ snapshots:
natural-compare@1.4.0: {} natural-compare@1.4.0: {}
neo-async@2.6.2: {}
node-fetch@2.7.0: node-fetch@2.7.0:
dependencies: dependencies:
whatwg-url: 5.0.0 whatwg-url: 5.0.0
@@ -2485,7 +2512,7 @@ snapshots:
prelude-ls@1.2.1: {} prelude-ls@1.2.1: {}
prettier@3.5.3: {} prettier@3.6.2: {}
punycode@2.3.1: {} punycode@2.3.1: {}
@@ -2544,7 +2571,9 @@ snapshots:
signal-exit@4.1.0: {} signal-exit@4.1.0: {}
smol-toml@1.3.4: {} smol-toml@1.4.0: {}
source-map@0.6.1: {}
source-map@0.8.0-beta.0: source-map@0.8.0-beta.0:
dependencies: dependencies:
@@ -2658,12 +2687,12 @@ snapshots:
dependencies: dependencies:
prelude-ls: 1.2.1 prelude-ls: 1.2.1
typescript-eslint@8.33.0(eslint@9.28.0)(typescript@5.8.3): typescript-eslint@8.35.1(eslint@9.30.0)(typescript@5.8.3):
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0)(typescript@5.8.3))(eslint@9.28.0)(typescript@5.8.3) '@typescript-eslint/eslint-plugin': 8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.0)(typescript@5.8.3))(eslint@9.30.0)(typescript@5.8.3)
'@typescript-eslint/parser': 8.33.0(eslint@9.28.0)(typescript@5.8.3) '@typescript-eslint/parser': 8.35.1(eslint@9.30.0)(typescript@5.8.3)
'@typescript-eslint/utils': 8.33.0(eslint@9.28.0)(typescript@5.8.3) '@typescript-eslint/utils': 8.35.1(eslint@9.30.0)(typescript@5.8.3)
eslint: 9.28.0 eslint: 9.30.0
typescript: 5.8.3 typescript: 5.8.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -2674,7 +2703,10 @@ snapshots:
ufo@1.6.1: {} ufo@1.6.1: {}
undici-types@6.21.0: {} uglify-js@3.19.3:
optional: true
undici-types@7.8.0: {}
undici@5.29.0: undici@5.29.0:
dependencies: dependencies:
@@ -2713,6 +2745,8 @@ snapshots:
word-wrap@1.2.5: {} word-wrap@1.2.5: {}
wordwrap@1.0.0: {}
wrap-ansi@7.0.0: wrap-ansi@7.0.0:
dependencies: dependencies:
ansi-styles: 4.3.0 ansi-styles: 4.3.0
@@ -2734,4 +2768,4 @@ snapshots:
yocto-queue@0.1.0: {} yocto-queue@0.1.0: {}
zod@3.25.45: {} zod@3.25.67: {}
+5 -3
View File
@@ -6,18 +6,20 @@ import * as core from '@actions/core'
import { downloadTool } from '@actions/tool-cache' import { downloadTool } from '@actions/tool-cache'
import type { PixiSource } from './options' import type { PixiSource } from './options'
import { options } from './options' import { options } from './options'
import { execute, getPixiUrlFromVersion, pixiCmd } from './util' import { execute, pixiCmd, renderPixiUrl } from './util'
import { saveCache, tryRestoreCache } from './cache' import { saveCache, tryRestoreCache } from './cache'
import { activateEnvironment } from './activate' import { activateEnvironment } from './activate'
const downloadPixi = (source: PixiSource) => { const downloadPixi = (source: PixiSource) => {
const url = 'version' in source ? getPixiUrlFromVersion(source.version) : source.url const url = renderPixiUrl(source.urlTemplate, source.version)
const auth = 'bearerToken' in source && source.bearerToken ? `Bearer ${source.bearerToken}` : ''
return core.group('Downloading Pixi', () => { return core.group('Downloading Pixi', () => {
core.debug('Installing pixi') core.debug('Installing pixi')
core.debug(`Downloading pixi from ${url}`) core.debug(`Downloading pixi from ${url}`)
core.debug(`Using Bearer auth: ${auth ? 'yes' : 'no'}`)
return fs return fs
.mkdir(path.dirname(options.pixiBinPath), { recursive: true }) .mkdir(path.dirname(options.pixiBinPath), { recursive: true })
.then(() => downloadTool(url, options.pixiBinPath)) .then(() => downloadTool(url, options.pixiBinPath, auth))
.then((_downloadPath) => fs.chmod(options.pixiBinPath, 0o755)) .then((_downloadPath) => fs.chmod(options.pixiBinPath, 0o755))
.then(() => { .then(() => {
core.info(`Pixi installed to ${options.pixiBinPath}`) core.info(`Pixi installed to ${options.pixiBinPath}`)
+43 -24
View File
@@ -7,10 +7,12 @@ import * as z from 'zod'
import untildify from 'untildify' import untildify from 'untildify'
import { parse } from 'smol-toml' import { parse } from 'smol-toml'
import which from 'which' import which from 'which'
import { DEFAULT_PIXI_URL_TEMPLATE } from './util'
type Inputs = Readonly<{ type Inputs = Readonly<{
pixiVersion?: string pixiVersion?: string
pixiUrl?: string pixiUrl?: string
pixiUrlBearerToken?: string
logLevel?: LogLevel logLevel?: LogLevel
manifestPath?: string manifestPath?: string
runInstall?: boolean runInstall?: boolean
@@ -33,13 +35,11 @@ type Inputs = Readonly<{
postCleanup?: boolean postCleanup?: boolean
}> }>
export type PixiSource = export interface PixiSource {
| { urlTemplate: string
version: string bearerToken?: string
} version: string
| { }
url: string
}
type Auth = { type Auth = {
host: string host: string
@@ -92,10 +92,30 @@ export const PATHS = {
pixiBin: path.join(os.homedir(), '.pixi', 'bin', `pixi${os.platform() === 'win32' ? '.exe' : ''}`) pixiBin: path.join(os.homedir(), '.pixi', 'bin', `pixi${os.platform() === 'win32' ? '.exe' : ''}`)
} }
const getEnvironmentVariableName = (key: string): string => {
return `SETUP_PIXI_${key.toUpperCase().replace(/-/g, '_')}`
}
const inputOrEnvironmentVariable = (key: string): string | undefined => {
const inputValue = core.getInput(key)
// GitHub actions sets empty inputs to the empty string
if (inputValue !== '') {
return inputValue
}
const envVarName = getEnvironmentVariableName(key)
const envVarValue = process.env[envVarName]
// Empty environment variables are treated as undefined
if (envVarValue !== undefined && envVarValue !== '') {
core.debug(`Using environment variable ${envVarName} with value: ${envVarValue}`)
return envVarValue
}
return undefined
}
const parseOrUndefined = <T>(key: string, schema: z.ZodSchema<T>, errorMessage?: string): T | undefined => { const parseOrUndefined = <T>(key: string, schema: z.ZodSchema<T>, errorMessage?: string): T | undefined => {
const input = core.getInput(key) const input = inputOrEnvironmentVariable(key)
// GitHub actions sets empty inputs to the empty string, but we want undefined if (input === undefined) {
if (input === '') {
return undefined return undefined
} }
const maybeResult = schema.safeParse(input) const maybeResult = schema.safeParse(input)
@@ -109,18 +129,16 @@ const parseOrUndefined = <T>(key: string, schema: z.ZodSchema<T>, errorMessage?:
} }
const parseOrUndefinedJSON = <T>(key: string, schema: z.ZodSchema<T>): T | undefined => { const parseOrUndefinedJSON = <T>(key: string, schema: z.ZodSchema<T>): T | undefined => {
const input = core.getInput(key) const input = inputOrEnvironmentVariable(key)
// GitHub actions sets empty inputs to the empty string, but we want undefined if (input === undefined) {
if (input === '') {
return undefined return undefined
} }
return schema.parse(JSON.parse(input)) return schema.parse(JSON.parse(input))
} }
const parseOrUndefinedList = <T>(key: string, schema: z.ZodSchema<T>): T[] | undefined => { const parseOrUndefinedList = <T>(key: string, schema: z.ZodSchema<T>): T[] | undefined => {
const input = core.getInput(key) const input = inputOrEnvironmentVariable(key)
// GitHub actions sets empty inputs to the empty string, but we want undefined if (input === undefined) {
if (input === '') {
return undefined return undefined
} }
return input return input
@@ -130,8 +148,8 @@ const parseOrUndefinedList = <T>(key: string, schema: z.ZodSchema<T>): T[] | und
} }
const validateInputs = (inputs: Inputs): void => { const validateInputs = (inputs: Inputs): void => {
if (inputs.pixiVersion && inputs.pixiUrl) { if (inputs.pixiUrlBearerToken && !inputs.pixiUrl) {
throw new Error('You need to specify either pixi-version or pixi-url') throw new Error('You need to specify pixi-url when using pixi-url-bearer-token')
} }
if (inputs.cacheKey !== undefined && inputs.cache === false) { if (inputs.cacheKey !== undefined && inputs.cache === false) {
throw new Error('Cannot specify cache key without caching') throw new Error('Cannot specify cache key without caching')
@@ -220,11 +238,11 @@ const determinePixiInstallation = (pixiUrlOrVersionSet: boolean, pixiBinPath: st
const inferOptions = (inputs: Inputs): Options => { const inferOptions = (inputs: Inputs): Options => {
const runInstall = inputs.runInstall ?? true const runInstall = inputs.runInstall ?? true
const pixiSource = inputs.pixiVersion const pixiSource: PixiSource = {
? { version: inputs.pixiVersion } urlTemplate: inputs.pixiUrl ?? DEFAULT_PIXI_URL_TEMPLATE,
: inputs.pixiUrl bearerToken: inputs.pixiUrlBearerToken,
? { url: inputs.pixiUrl } version: inputs.pixiVersion ?? 'latest'
: { version: 'latest' } }
const { downloadPixi, pixiBinPath } = determinePixiInstallation( const { downloadPixi, pixiBinPath } = determinePixiInstallation(
!!inputs.pixiVersion || !!inputs.pixiUrl, !!inputs.pixiVersion || !!inputs.pixiUrl,
@@ -339,7 +357,8 @@ const getOptions = () => {
z.union([z.literal('latest'), z.string().regex(/^v\d+\.\d+\.\d+$/)]), z.union([z.literal('latest'), z.string().regex(/^v\d+\.\d+\.\d+$/)]),
'pixi-version must either be `latest` or a version string matching `vX.Y.Z`.' 'pixi-version must either be `latest` or a version string matching `vX.Y.Z`.'
), ),
pixiUrl: parseOrUndefined('pixi-url', z.string().url()), pixiUrl: parseOrUndefined('pixi-url', z.string()),
pixiUrlBearerToken: parseOrUndefined('pixi-url-bearer-token', z.string()),
logLevel: parseOrUndefined( logLevel: parseOrUndefined(
'log-level', 'log-level',
logLevelSchema, logLevelSchema,
+20 -20
View File
@@ -1,4 +1,5 @@
import fs from 'fs/promises' import fs from 'fs/promises'
import { existsSync } from 'fs'
import path from 'path' import path from 'path'
import os from 'os' import os from 'os'
import { exit } from 'process' import { exit } from 'process'
@@ -6,32 +7,31 @@ import * as core from '@actions/core'
import { options } from './options' import { options } from './options'
const removeEmptyParentDirs = (dirPath: string): Promise<void> => { const removeEmptyParentDirs = (dirPath: string): Promise<void> => {
return fs.readdir(dirPath).then((files) => { if (existsSync(dirPath)) {
if (files.length === 0) { return fs.readdir(dirPath).then((files) => {
core.debug(`Removing empty directory ${dirPath}.`) if (files.length === 0) {
return fs.rm(dirPath, { recursive: true }).then(() => { core.debug(`Removing empty directory ${dirPath}.`)
const parentDir = path.dirname(dirPath) return fs.rm(dirPath, { recursive: true, force: true }).then(() => {
if (parentDir !== dirPath) { const parentDir = path.dirname(dirPath)
return removeEmptyParentDirs(parentDir) if (parentDir !== dirPath) {
} return removeEmptyParentDirs(parentDir)
}) }
} })
return Promise.resolve() }
}) })
}
return Promise.resolve()
} }
const cleanupPixiBin = () => { const cleanupPixiBin = () => {
const pixiBinPath = options.pixiBinPath const pixiBinPath = options.pixiBinPath
const pixiBinDir = path.dirname(pixiBinPath) const pixiBinDir = path.dirname(pixiBinPath)
core.debug(`Cleaning up pixi binary ${pixiBinPath}.`) core.debug(`Cleaning up pixi binary ${pixiBinPath}.`)
return fs if (existsSync(pixiBinPath)) {
.rm(pixiBinPath, { return fs.rm(pixiBinPath).then(() => removeEmptyParentDirs(pixiBinDir))
// Ignore exceptions if pixi binary does not exist anymore, } else {
// to avoid errors if setup-pixi is used multiple times within the same workflow. return removeEmptyParentDirs(pixiBinDir)
// This could, for instance, be the case for composite actions using setup-pixi. }
force: true
})
.then(() => removeEmptyParentDirs(pixiBinDir))
} }
const cleanupEnv = () => { const cleanupEnv = () => {
+16 -5
View File
@@ -5,6 +5,14 @@ import * as core from '@actions/core'
import type { ExecOptions } from '@actions/exec' import type { ExecOptions } from '@actions/exec'
import { exec, getExecOutput } from '@actions/exec' import { exec, getExecOutput } from '@actions/exec'
import { options } from './options' import { options } from './options'
import Handlebars from 'handlebars'
export const DEFAULT_PIXI_URL_TEMPLATE = `\
{{#if latest~}}
https://github.com/prefix-dev/pixi/releases/latest/download/{{pixiFile}}
{{~else~}}
https://github.com/prefix-dev/pixi/releases/download/{{version}}/{{pixiFile}}
{{~/if}}`
export const getCondaArch = () => { export const getCondaArch = () => {
const archDict: Record<string, string> = { const archDict: Record<string, string> = {
@@ -49,14 +57,17 @@ const getArch = () => {
} }
} }
export const getPixiUrlFromVersion = (version: string) => { export const renderPixiUrl = (urlTemplate: string, version: string) => {
const latest = version == 'latest'
const arch = getArch() const arch = getArch()
const platform = getPlatform() const platform = getPlatform()
const pixiFile = `pixi-${arch}-${platform}${platform === 'pc-windows-msvc' ? '.exe' : ''}` const pixiFile = `pixi-${arch}-${platform}${platform === 'pc-windows-msvc' ? '.exe' : ''}`
if (version === 'latest') { const template = Handlebars.compile(urlTemplate)
return `https://github.com/prefix-dev/pixi/releases/latest/download/${pixiFile}` return template({
} version,
return `https://github.com/prefix-dev/pixi/releases/download/${version}/${pixiFile}` latest,
pixiFile
})
} }
export const sha256 = (s: BinaryLike) => { export const sha256 = (s: BinaryLike) => {
+1
View File
@@ -24,6 +24,7 @@ export default defineConfig({
'@actions/cache', '@actions/cache',
'@actions/io', '@actions/io',
'@actions/tool-cache', '@actions/tool-cache',
'handlebars',
'untildify', 'untildify',
'smol-toml', 'smol-toml',
'which', 'which',