diff --git a/.ci/minikube-test-setup/deployment.yaml b/.ci/minikube-test-setup/deployment.yaml index d7afe110c830f42ce0a567b6be6210c8c914570b..6d9768f91e5be62362fc05a2f75094b16bb9f9a0 100644 --- a/.ci/minikube-test-setup/deployment.yaml +++ b/.ci/minikube-test-setup/deployment.yaml @@ -15,7 +15,7 @@ spec: app.kubernetes.io/name: test spec: containers: - - image: postgres:12 + - image: postgres:17 name: postgres ports: - containerPort: 5432 diff --git a/.circleci/config.yml b/.circleci/config.yml index f29c69235e6886bc2cb5fb59a284a468ba8dcc60..9c27be38c176b2d6141bd3729a87b468773c450f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -15,7 +15,7 @@ variables: jobs: get_code: docker: - - image: cimg/python:3.8 + - image: cimg/python:3.9 <<: *set_workdir steps: # Replace standard code checkout with shallow clone to speed things up. @@ -73,7 +73,7 @@ jobs: - ~/repo validate_test_tools: docker: - - image: cimg/python:3.8 + - image: cimg/python:3.9 <<: *set_workdir steps: - *restore_repo_cache diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000000000000000000000000000000000..6a1e6032c68485062be480211fbd42c985391aea --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + # Enable version updates for GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/api.yaml b/.github/workflows/api.yaml index b2463c75f099d6f0cd06ed83a5ec6a55fc7ae2f8..3005df3cb603b7428190a90df5ef09ab4c85693f 100644 --- a/.github/workflows/api.yaml +++ b/.github/workflows/api.yaml @@ -31,11 +31,11 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8'] + python-version: ['3.9'] chunk: [0, 1] services: postgres: - image: postgres:13 + image: postgres:17 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres @@ -47,15 +47,11 @@ jobs: run: | echo "GALAXY_CONFIG_OVERRIDE_METADATA_STRATEGY=extended" >> $GITHUB_ENV echo "GALAXY_CONFIG_OVERRIDE_OUTPUTS_TO_WORKING_DIRECTORY=true" >> $GITHUB_ENV - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-node@v4 - with: - node-version: '18.12.1' - cache: 'yarn' - cache-dependency-path: 'galaxy root/client/yarn.lock' - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' @@ -72,7 +68,7 @@ jobs: - name: Run tests run: ./run_tests.sh --coverage --skip_flakey_fails -api lib/galaxy_test/api -- --num-shards=2 --shard-id=${{ matrix.chunk }} working-directory: 'galaxy root' - - uses: codecov/codecov-action@v3 + - uses: codecov/codecov-action@v5 with: flags: api working-directory: 'galaxy root' diff --git a/.github/workflows/bioblend.yaml b/.github/workflows/bioblend.yaml index f0da9f2ed0e673fb0f19f3efa827608c358ca630..53bef3e07bbee438f1336a2c4e1cfaedb798ded8 100644 --- a/.github/workflows/bioblend.yaml +++ b/.github/workflows/bioblend.yaml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest services: postgres: - image: postgres + image: postgres:17 # Provide the password for postgres env: POSTGRES_PASSWORD: postgres @@ -32,18 +32,20 @@ jobs: fail-fast: false matrix: tox_env: [py313] - galaxy_python_version: ["3.8"] + galaxy_python_version: ['3.9'] steps: - name: Checkout Galaxy - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 1 path: galaxy + persist-credentials: false - name: Checkout Bioblend - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: repository: galaxyproject/bioblend path: bioblend + persist-credentials: false - name: Cache pip dir uses: actions/cache@v4 with: @@ -53,7 +55,7 @@ jobs: id: get_bioblend_python_version run: echo "bioblend_python_version=$(echo "${{ matrix.tox_env }}" | sed -e 's/^py\([3-9]\)\([0-9]\+\)/\1.\2/')" >> $GITHUB_OUTPUT - name: Set up Python for BioBlend - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ steps.get_bioblend_python_version.outputs.bioblend_python_version }} - name: Install tox @@ -61,7 +63,7 @@ jobs: python3 -m pip install --upgrade pip setuptools python3 -m pip install 'tox>=1.8.0' - name: Set up Python for Galaxy - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.galaxy_python_version }} - name: Run tests diff --git a/.github/workflows/build_client.yaml b/.github/workflows/build_client.yaml index c3103201390226a1231923a7d3c7dd3e3af1df50..a083b1c3005ccc11cb10006d2d2a390c506275dc 100644 --- a/.github/workflows/build_client.yaml +++ b/.github/workflows/build_client.yaml @@ -11,12 +11,16 @@ jobs: outputs: commit-id: ${{ steps.client-commit.outputs.commit }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-node@v4 + persist-credentials: false + - name: Read Node.js version + id: node-version + run: echo "version=$(cat 'galaxy root/client/.node_version')" >> $GITHUB_OUTPUT + - uses: actions/setup-node@v5 with: - node-version: '18.12.1' + node-version: ${{ steps.node-version.outputs.version }} cache: 'yarn' cache-dependency-path: 'galaxy root/client/yarn.lock' - name: get client commit diff --git a/.github/workflows/build_container_image.yaml b/.github/workflows/build_container_image.yaml index dbff3546e9ae79fb4458da7bddf04abbfa017455..0cbc37dedd9f1a824d322f1ec1f962fd8549a47d 100644 --- a/.github/workflows/build_container_image.yaml +++ b/.github/workflows/build_container_image.yaml @@ -14,7 +14,9 @@ jobs: name: Build container image for GHCR runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 + with: + persist-credentials: false # https://stackoverflow.com/questions/59810838/how-to-get-the-short-sha-for-the-github-workflow - name: Set outputs id: commit @@ -32,7 +34,7 @@ jobs: shell: bash - name: Extract metadata for container image id: meta - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v5 with: images: ghcr.io/${{ github.repository }} tags: | @@ -44,19 +46,19 @@ jobs: echo "builddate=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 with: platforms: linux/amd64 - name: Login to GHCR - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push container image to ghcr - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v6 with: build-args: | GIT_COMMIT=${{ steps.buildargs.outputs.gitcommit }} @@ -74,7 +76,9 @@ jobs: runs-on: ubuntu-latest if: github.repository_owner == 'galaxyproject' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 + with: + persist-credentials: false # https://stackoverflow.com/questions/59810838/how-to-get-the-short-sha-for-the-github-workflow - name: Set outputs id: commit diff --git a/.github/workflows/check_test_class_names.yaml b/.github/workflows/check_test_class_names.yaml index 33bf31877177f0f607312585a25860f81d8049d2..2ecfa4302c664c275ff198aa94c0b8fb35880a78 100644 --- a/.github/workflows/check_test_class_names.yaml +++ b/.github/workflows/check_test_class_names.yaml @@ -14,15 +14,17 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.8'] + python-version: ['3.9'] steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/checkout@v5 + with: + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' cache-dependency-path: 'requirements.txt' - name: Install Python dependencies - run: pip install -r requirements.txt -r lib/galaxy/dependencies/dev-requirements.txt + run: pip install -r requirements.txt -r lib/galaxy/dependencies/pinned-test-requirements.txt - name: Run tests run: .ci/check_test_class_names.sh diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index bbacec3a450b65d1533f33b09c06cafa0c2197d9..2cad7e7f102b996c12a74e83e002260a88958036 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -40,7 +40,9 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 + with: + persist-credentials: false # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/converter_tests.yaml b/.github/workflows/converter_tests.yaml index 0a1928e69861e8b842e291f69196acf415b613bc..e4fb8051f86e5d8593f237ae2e34416923870d1f 100644 --- a/.github/workflows/converter_tests.yaml +++ b/.github/workflows/converter_tests.yaml @@ -24,26 +24,23 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.8'] + python-version: ['3.9'] steps: - if: github.event_name == 'schedule' run: | echo "GALAXY_CONFIG_OVERRIDE_METADATA_STRATEGY=extended" >> $GITHUB_ENV echo "GALAXY_CONFIG_OVERRIDE_OUTPUTS_TO_WORKING_DIRECTORY=true" >> $GITHUB_ENV - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-node@v4 - with: - node-version: '18.12.1' - cache: 'yarn' - cache-dependency-path: 'galaxy root/client/yarn.lock' + persist-credentials: false - name: Clone galaxyproject/galaxy-test-data - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: repository: galaxyproject/galaxy-test-data path: galaxy-test-data - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' diff --git a/.github/workflows/cwl_conformance.yaml b/.github/workflows/cwl_conformance.yaml index 3dbae9898f4f34e992eb5d59379fcd714a515c8f..c14f724e03ff268d110fe0a380e6ab72a9fe90df 100644 --- a/.github/workflows/cwl_conformance.yaml +++ b/.github/workflows/cwl_conformance.yaml @@ -26,12 +26,12 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8'] + python-version: ['3.9'] marker: ['green', 'red and required', 'red and not required'] conformance-version: ['cwl_conformance_v1_0'] #, 'cwl_conformance_v1_1', 'cwl_conformance_v1_2'] services: postgres: - image: postgres:13 + image: postgres:17 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres @@ -39,15 +39,11 @@ jobs: ports: - 5432:5432 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-node@v4 - with: - node-version: '18.12.1' - cache: 'yarn' - cache-dependency-path: 'galaxy root/client/yarn.lock' - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' @@ -64,7 +60,7 @@ jobs: - name: Run tests run: ./run_tests.sh --coverage --skip_flakey_fails -cwl lib/galaxy_test/api/cwl -- -m "${{ matrix.marker }} and ${{ matrix.conformance-version }}" working-directory: 'galaxy root' - - uses: codecov/codecov-action@v3 + - uses: codecov/codecov-action@v5 with: flags: cwl-conformance working-directory: 'galaxy root' diff --git a/.github/workflows/db_indexes.yaml b/.github/workflows/db_indexes.yaml index f74c7d5f63e228bed68a0fbf2746c0a2b55d1d0c..71326d91bc4b348ec0dc403a2852a5c9f6425c5f 100644 --- a/.github/workflows/db_indexes.yaml +++ b/.github/workflows/db_indexes.yaml @@ -25,12 +25,12 @@ jobs: strategy: matrix: db: ['postgresql', 'sqlite'] - postgresql-version: ['13'] - python-version: ['3.8'] + postgresql-version: ['17'] + python-version: ['3.9'] include: - db: postgresql postgresql-version: '9.6' - python-version: '3.8' + python-version: '3.9' services: postgres: image: postgres:${{ matrix.postgresql-version }} @@ -41,10 +41,11 @@ jobs: ports: - 5432:5432 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' diff --git a/.github/workflows/dependencies.yaml b/.github/workflows/dependencies.yaml index 2401107eb32517ccb950a1c2f6d69ed8c513e59a..ddfe485bb023bf7f51e7d24d98165fcd18cf686e 100644 --- a/.github/workflows/dependencies.yaml +++ b/.github/workflows/dependencies.yaml @@ -9,18 +9,16 @@ jobs: if: github.repository_owner == 'galaxyproject' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - # Install Python 3.8 for update_lint_requirements.sh - # Install Python 3.9 (as default) to allow `uv lock` to generate metadata for rucio-clients - - uses: actions/setup-python@v5 + - uses: actions/checkout@v5 with: - python-version: | - 3.8 - 3.9 + persist-credentials: false + - uses: actions/setup-python@v6 + with: + python-version: '3.9' - name: Update dependencies run: make update-dependencies - name: Create pull request - uses: peter-evans/create-pull-request@v6 + uses: peter-evans/create-pull-request@v7 with: author: galaxybot token: ${{ secrets.GALAXYBOT_PAT }} diff --git a/.github/workflows/deployment.yaml b/.github/workflows/deployment.yaml index 281b60beb071d234abca8e939292dc19c4701454..6af399f578b38356ddea9d240b3ce6c110e7a4ba 100644 --- a/.github/workflows/deployment.yaml +++ b/.github/workflows/deployment.yaml @@ -29,12 +29,13 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.8'] + python-version: ['3.9'] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 742d5b6a0048e9700fcd9eb7f905de1e5f183f39..08f2e312841ddc00d5590a1add793e1807ddc706 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.8'] + python-version: ['3.9'] steps: - name: Get target branch name (push) if: github.event_name == 'push' @@ -28,10 +28,11 @@ jobs: run: echo "TARGET_BRANCH=$GITHUB_BASE_REF" >> $GITHUB_ENV - name: Show target branch name run: echo $TARGET_BRANCH - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' diff --git a/.github/workflows/first_startup.yaml b/.github/workflows/first_startup.yaml index c874344fe6d006d85dfb1d0196cac92f95facef0..c45df624d81ac865348121a295cf5d261c26189f 100644 --- a/.github/workflows/first_startup.yaml +++ b/.github/workflows/first_startup.yaml @@ -25,21 +25,17 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.13'] + python-version: ['3.9', '3.13'] defaults: run: shell: bash -l {0} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-node@v4 - with: - node-version: '18.12.1' - cache: 'yarn' - cache-dependency-path: 'galaxy root/client/yarn.lock' + persist-credentials: false - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' diff --git a/.github/workflows/framework_tools.yaml b/.github/workflows/framework_tools.yaml index 167afcdc45b8982311bdb76403b3c8c535a9f1be..edc415b3d1686739f0432a5b4c4ec9d477aae679 100644 --- a/.github/workflows/framework_tools.yaml +++ b/.github/workflows/framework_tools.yaml @@ -27,10 +27,10 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.8'] + python-version: ['3.9'] services: postgres: - image: postgres:13 + image: postgres:17 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres @@ -42,15 +42,11 @@ jobs: run: | echo "GALAXY_CONFIG_OVERRIDE_METADATA_STRATEGY=extended" >> $GITHUB_ENV echo "GALAXY_CONFIG_OVERRIDE_OUTPUTS_TO_WORKING_DIRECTORY=true" >> $GITHUB_ENV - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-node@v4 - with: - node-version: '18.12.1' - cache: 'yarn' - cache-dependency-path: 'galaxy root/client/yarn.lock' - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' @@ -63,16 +59,16 @@ jobs: uses: actions/cache@v4 with: path: 'galaxy root/.venv' - key: gxy-venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('galaxy root/requirements.txt') }}-framework-tools + key: gxy-venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('galaxy root/requirements.txt') }}-framework - name: Run tests run: ./run_tests.sh --coverage --framework-tools working-directory: 'galaxy root' - - uses: codecov/codecov-action@v3 + - uses: codecov/codecov-action@v5 with: flags: framework working-directory: 'galaxy root' - uses: actions/upload-artifact@v4 if: failure() with: - name: Framework test results (${{ matrix.python-version }}) + name: Tool framework test results (${{ matrix.python-version }}) path: 'galaxy root/run_framework_tests.html' diff --git a/.github/workflows/framework_workflows.yaml b/.github/workflows/framework_workflows.yaml index 018463833e22af398a9de0cdc2653c5f7a1bd330..375c0dafef35e7f74913569bd6e6d7126940aca4 100644 --- a/.github/workflows/framework_workflows.yaml +++ b/.github/workflows/framework_workflows.yaml @@ -5,11 +5,13 @@ on: - 'client/**' - 'doc/**' - 'lib/galaxy_test/selenium/**' + - 'packages/**' pull_request: paths-ignore: - 'client/**' - 'doc/**' - 'lib/galaxy_test/selenium/**' + - 'packages/**' schedule: # Run at midnight UTC every Tuesday - cron: '0 0 * * 2' @@ -26,10 +28,10 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.8'] + python-version: ['3.9'] services: postgres: - image: postgres:13 + image: postgres:17 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres @@ -41,15 +43,11 @@ jobs: run: | echo "GALAXY_CONFIG_OVERRIDE_METADATA_STRATEGY=extended" >> $GITHUB_ENV echo "GALAXY_CONFIG_OVERRIDE_OUTPUTS_TO_WORKING_DIRECTORY=true" >> $GITHUB_ENV - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-node@v4 - with: - node-version: '18.12.1' - cache: 'yarn' - cache-dependency-path: 'galaxy root/client/yarn.lock' - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' @@ -62,16 +60,16 @@ jobs: uses: actions/cache@v4 with: path: 'galaxy root/.venv' - key: gxy-venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('galaxy root/requirements.txt') }}-framework-workflows + key: gxy-venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('galaxy root/requirements.txt') }}-framework - name: Run tests run: ./run_tests.sh --coverage --framework-workflows working-directory: 'galaxy root' - - uses: codecov/codecov-action@v3 + - uses: codecov/codecov-action@v5 with: - flags: framework + flags: framework-workflows working-directory: 'galaxy root' - uses: actions/upload-artifact@v4 if: failure() with: - name: Framework test results (${{ matrix.python-version }}) + name: Workflow framework test results (${{ matrix.python-version }}) path: 'galaxy root/run_framework_workflows_tests.html' diff --git a/.github/workflows/integration.yaml b/.github/workflows/integration.yaml index 1bdc5b58cf9a77d62022243c5abb61ea8fc0685c..7cc13b2ea5bcafc709438fff5cc2119091475490 100644 --- a/.github/workflows/integration.yaml +++ b/.github/workflows/integration.yaml @@ -16,8 +16,6 @@ on: # Run at midnight UTC every Tuesday - cron: '0 0 * * 2' env: - GALAXY_TEST_AMQP_URL: 'amqp://localhost:5672//' - GALAXY_TEST_DBURI: 'postgresql://postgres:postgres@localhost:5432/galaxy?client_encoding=utf8' GALAXY_TEST_RAISE_EXCEPTION_ON_HISTORYLESS_HDA: '1' GALAXY_CONFIG_SQLALCHEMY_WARN_20: '1' GALAXY_DEPENDENCIES_INSTALL_WEASYPRINT: '1' @@ -27,25 +25,12 @@ concurrency: jobs: test: name: Test - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest strategy: fail-fast: false matrix: - python-version: ['3.8'] + python-version: ['3.9'] chunk: ['0', '1', '2', '3'] - services: - postgres: - image: postgres:13 - env: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_DB: postgres - ports: - - 5432:5432 - rabbitmq: - image: rabbitmq - ports: - - 5672:5672 steps: - if: github.event_name == 'schedule' run: | @@ -57,25 +42,20 @@ jobs: - name: Clean dotnet folder for space run: rm -Rf /usr/share/dotnet - name: Install packages - # conntrack: mandatory for later k8s versions # ffmpeg: ffprobe needed by media datatypes - run: sudo apt-get update && sudo apt-get -y install conntrack ffmpeg + run: sudo apt-get update && sudo apt-get -y install ffmpeg - name: Setup Minikube uses: medyagh/setup-minikube@latest with: driver: none - kubernetes-version: '1.23.0' + kubernetes-version: '1.28.0' - name: Check pods run: kubectl get pods -A - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-node@v4 - with: - node-version: '18.12.1' - cache: 'yarn' - cache-dependency-path: 'galaxy root/client/yarn.lock' - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' @@ -96,7 +76,7 @@ jobs: . .ci/minikube-test-setup/start_services.sh ./run_tests.sh --coverage -integration test/integration -- --num-shards=4 --shard-id=${{ matrix.chunk }} working-directory: 'galaxy root' - - uses: codecov/codecov-action@v3 + - uses: codecov/codecov-action@v5 with: flags: integration working-directory: 'galaxy root' diff --git a/.github/workflows/integration_selenium.yaml b/.github/workflows/integration_selenium.yaml index 73488daea60ddb7885d7cbb498ceada964cfd4a7..27ba24dc0f8dc98cced6f6a6f8a8e9c5468858f9 100644 --- a/.github/workflows/integration_selenium.yaml +++ b/.github/workflows/integration_selenium.yaml @@ -33,10 +33,10 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.8'] + python-version: ['3.9'] services: postgres: - image: postgres:13 + image: postgres:17 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres @@ -50,10 +50,11 @@ jobs: echo "GALAXY_CONFIG_OVERRIDE_OUTPUTS_TO_WORKING_DIRECTORY=true" >> $GITHUB_ENV - name: Prune unused docker image, volumes and containers run: docker system prune -a -f - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' @@ -67,11 +68,6 @@ jobs: with: path: 'galaxy root/.venv' key: gxy-venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('galaxy root/requirements.txt') }}-integration-selenium - - uses: actions/setup-node@v4 - with: - node-version: '18.12.1' - cache: 'yarn' - cache-dependency-path: 'galaxy root/client/yarn.lock' - name: Restore client cache uses: actions/cache@v4 with: @@ -80,7 +76,7 @@ jobs: - name: Run tests run: ./run_tests.sh --coverage -integration test/integration_selenium working-directory: 'galaxy root' - - uses: codecov/codecov-action@v3 + - uses: codecov/codecov-action@v5 with: flags: integration-selenium working-directory: 'galaxy root' diff --git a/.github/workflows/jest.yaml b/.github/workflows/jest.yaml index 0d69a1498299220380dca72bb67b83e53db83c94..bf7d6d8096f1592482eec60a2ea83ee27a6d8ed1 100644 --- a/.github/workflows/jest.yaml +++ b/.github/workflows/jest.yaml @@ -14,15 +14,17 @@ concurrency: jobs: client-unit-test: runs-on: ubuntu-latest - strategy: - matrix: - node: [18] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 + with: + persist-credentials: false + - name: Read Node.js version + id: node-version + run: echo "version=$(cat 'client/.node_version')" >> $GITHUB_OUTPUT - name: Setup node - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: - node-version: ${{ matrix.node}} + node-version: ${{ steps.node-version.outputs.version }} cache: 'yarn' cache-dependency-path: 'client/yarn.lock' - run: yarn install --frozen-lockfile diff --git a/.github/workflows/js_lint.yaml b/.github/workflows/js_lint.yaml index ea821e1c105b1f3c01c55c010f7a8ba008cde67d..34afddab117f0df8e50d6556ef30da18fd5553ed 100644 --- a/.github/workflows/js_lint.yaml +++ b/.github/workflows/js_lint.yaml @@ -14,15 +14,17 @@ concurrency: jobs: client-unit-test: runs-on: ubuntu-latest - strategy: - matrix: - node: [18] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 + with: + persist-credentials: false + - name: Read Node.js version + id: node-version + run: echo "version=$(cat 'client/.node_version')" >> $GITHUB_OUTPUT - name: Setup node - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: - node-version: ${{ matrix.node}} + node-version: ${{ steps.node-version.outputs.version }} cache: 'yarn' cache-dependency-path: 'client/yarn.lock' - run: yarn install --frozen-lockfile @@ -33,3 +35,6 @@ jobs: - name: Run prettier checks run: yarn run format-check working-directory: client + - name: Run vue-tsc + working-directory: client + run: yarn type-check diff --git a/.github/workflows/labels-verifier.yaml b/.github/workflows/labels-verifier.yaml index 61dee02ee73e8992798a1ccf9bc377dbb837b273..67835ea49f37d9d587f76a0fb8cb4847246cf062 100644 --- a/.github/workflows/labels-verifier.yaml +++ b/.github/workflows/labels-verifier.yaml @@ -15,7 +15,7 @@ jobs: ! contains(join(github.event.pull_request.labels.*.name, ', '), 'kind/') && ! contains(github.event.pull_request.labels.*.name, 'merge') && ! contains(github.event.pull_request.labels.*.name, 'minor') - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: script: | github.rest.issues.createComment({ diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 37d337fb95febef33a5f35103805de734721b430..857b6b274eff81cc02fafdff0f90750ef333f465 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -22,14 +22,16 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.13'] + python-version: ['3.9', '3.13'] env: LINT_PATH: 'lib/galaxy/dependencies/pinned-lint-requirements.txt' TYPE_PATH: 'lib/galaxy/dependencies/pinned-typecheck-requirements.txt' CORE_PATH: 'lib/galaxy/dependencies/pinned-requirements.txt' steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/checkout@v5 + with: + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' @@ -56,5 +58,5 @@ jobs: run: tox -e mypy - uses: psf/black@stable with: - version: "24.8.0" # last version supporting Python 3.8 + version: ">=25.1.0" - uses: isort/isort-action@v1 diff --git a/.github/workflows/lint_openapi_schema.yml b/.github/workflows/lint_openapi_schema.yml index 9aa656bd20e1c34846af46e5f867338039c0dce9..bdf31be3877a7e471c44d64549d619b8101ce9df 100644 --- a/.github/workflows/lint_openapi_schema.yml +++ b/.github/workflows/lint_openapi_schema.yml @@ -22,17 +22,21 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.13'] + python-version: ['3.9', '3.13'] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-node@v4 + persist-credentials: false + - name: Read Node.js version + id: node-version + run: echo "version=$(cat 'galaxy root/client/.node_version')" >> $GITHUB_OUTPUT + - uses: actions/setup-node@v5 with: - node-version: '18.12.1' + node-version: ${{ steps.node-version.outputs.version }} cache: 'yarn' cache-dependency-path: 'galaxy root/client/yarn.lock' - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' diff --git a/.github/workflows/main_tools.yaml b/.github/workflows/main_tools.yaml new file mode 100644 index 0000000000000000000000000000000000000000..00646929d7b40cd8c3e96ac00eefe72535e38d2c --- /dev/null +++ b/.github/workflows/main_tools.yaml @@ -0,0 +1,67 @@ +name: Main tool tests +on: + push: + paths-ignore: + - 'client/**' + - 'doc/**' + - 'lib/galaxy_test/selenium/**' + - 'packages/**' + pull_request: + paths-ignore: + - 'client/**' + - 'doc/**' + - 'lib/galaxy_test/selenium/**' + - 'packages/**' +env: + GALAXY_TEST_DBURI: 'postgresql://postgres:postgres@localhost:5432/galaxy?client_encoding=utf8' + GALAXY_TEST_RAISE_EXCEPTION_ON_HISTORYLESS_HDA: '1' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +jobs: + test: + name: Test + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ['3.9'] + services: + postgres: + image: postgres:17 + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: postgres + ports: + - 5432:5432 + steps: + - uses: actions/checkout@v5 + with: + path: 'galaxy root' + persist-credentials: false + - uses: actions/setup-python@v6 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + cache-dependency-path: 'galaxy root/requirements.txt' + - name: Get full Python version + id: full-python-version + shell: bash + run: echo "version=$(python -c 'import sys; print("-".join(str(v) for v in sys.version_info))')" >> $GITHUB_OUTPUT + - name: Cache galaxy venv + uses: actions/cache@v4 + with: + path: 'galaxy root/.venv' + key: gxy-venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('galaxy root/requirements.txt') }}-framework + - name: Run tests + run: ./run_tests.sh --coverage --main_tools + working-directory: 'galaxy root' + - uses: codecov/codecov-action@v5 + with: + flags: main-tools + working-directory: 'galaxy root' + - uses: actions/upload-artifact@v4 + if: failure() + with: + name: Main tool test results (${{ matrix.python-version }}) + path: 'galaxy root/run_framework_tests.html' diff --git a/.github/workflows/maintenance_bot.yaml b/.github/workflows/maintenance_bot.yaml index b45dd2b87c7a45ad3578599b7a2686c740f53994..431f8098b626df6b4c601d51b011676b883b6a34 100644 --- a/.github/workflows/maintenance_bot.yaml +++ b/.github/workflows/maintenance_bot.yaml @@ -12,11 +12,11 @@ jobs: pull-requests: write runs-on: ubuntu-latest env: - MILESTONE_NUMBER: 29 + MILESTONE_NUMBER: 32 steps: - name: Get latest pull request labels id: get_pr_labels - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: script: | const response = await github.rest.issues.listLabelsOnIssue({ @@ -28,7 +28,7 @@ jobs: return response.data; - name: Add area labels if: ${{ ! contains(join(fromJSON(steps.get_pr_labels.outputs.result).*.name, ', '), 'area/') }} - uses: actions/labeler@v5 + uses: actions/labeler@v6 - name: Assign milestone if: | ! github.event.pull_request.milestone && @@ -36,7 +36,7 @@ jobs: ! contains(github.event.pull_request.labels.*.name, 'status/WIP') && ! contains(github.event.pull_request.title, 'WIP') && ! github.event.pull_request.draft - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: script: | github.rest.issues.update({ diff --git a/.github/workflows/mulled.yaml b/.github/workflows/mulled.yaml index 0d4eed74c0e02f03e055858c33d7db07791772b8..05b8411679bc817810e7296519b884d78677f081 100644 --- a/.github/workflows/mulled.yaml +++ b/.github/workflows/mulled.yaml @@ -22,12 +22,13 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8'] + python-version: ['3.9'] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' @@ -43,8 +44,6 @@ jobs: key: tox-cache-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('galaxy root/requirements.txt') }}-mulled - name: Install Apptainer's singularity uses: eWaterCycle/setup-apptainer@v2 - with: - apptainer-version: 1.3.6 # https://github.com/eWaterCycle/setup-apptainer/pull/68 - name: Install tox run: pip install tox - name: Run tests diff --git a/.github/workflows/osx_startup.yaml b/.github/workflows/osx_startup.yaml index b0639ca433406c0d1f6a594641dffb2551537c44..46cea351141651a6ce8c875186e10ddaf4643501 100644 --- a/.github/workflows/osx_startup.yaml +++ b/.github/workflows/osx_startup.yaml @@ -23,19 +23,15 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.13'] + python-version: ['3.9', '3.13'] defaults: run: shell: bash -l {0} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-node@v4 - with: - node-version: '18.12.1' - cache: 'yarn' - cache-dependency-path: 'galaxy root/client/yarn.lock' + persist-credentials: false - name: Cache pip dir uses: actions/cache@v4 with: diff --git a/.github/workflows/performance.yaml b/.github/workflows/performance.yaml index ecfdc7452464acb8bc759996ec6de7e224d76c3c..47551a8652142de8002b29a82bd6e2dcaa6a432f 100644 --- a/.github/workflows/performance.yaml +++ b/.github/workflows/performance.yaml @@ -26,10 +26,10 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.8'] + python-version: ['3.9'] services: postgres: - image: postgres:13 + image: postgres:17 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres @@ -41,15 +41,11 @@ jobs: run: | echo "GALAXY_CONFIG_OVERRIDE_METADATA_STRATEGY=extended" >> $GITHUB_ENV echo "GALAXY_CONFIG_OVERRIDE_OUTPUTS_TO_WORKING_DIRECTORY=true" >> $GITHUB_ENV - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-node@v4 - with: - node-version: '18.12.1' - cache: 'yarn' - cache-dependency-path: 'galaxy root/client/yarn.lock' - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' diff --git a/.github/workflows/publish_artifacts.yaml b/.github/workflows/publish_artifacts.yaml index e4bc8f6118f8fc38148ab0396a6ec4440a9ae0ac..eeae3aba880c73f55d53a090e3219651573f9ab1 100644 --- a/.github/workflows/publish_artifacts.yaml +++ b/.github/workflows/publish_artifacts.yaml @@ -9,10 +9,12 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.8'] + python-version: ['3.9'] steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/checkout@v5 + with: + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} - name: Install script dependencies @@ -29,11 +31,16 @@ jobs: if: github.repository_owner == 'galaxyproject' name: Build and Publish to NPM runs-on: ubuntu-latest + permissions: + id-token: write steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v5 + - name: Read Node.js version + id: node-version + run: echo "version=$(cat client/.node_version)" >> $GITHUB_OUTPUT + - uses: actions/setup-node@v5 with: - node-version: '18.12.1' + node-version: ${{ steps.node-version.outputs.version }} cache: 'yarn' cache-dependency-path: 'client/yarn.lock' registry-url: 'https://registry.npmjs.org' diff --git a/.github/workflows/reports_startup.yaml b/.github/workflows/reports_startup.yaml index f0285ff468f6f93a6bacd887eabca78c16c507cb..f3f9b0f857324ae54eba5743fe36c86a5e338831 100644 --- a/.github/workflows/reports_startup.yaml +++ b/.github/workflows/reports_startup.yaml @@ -20,21 +20,17 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.13'] + python-version: ['3.9', '3.13'] defaults: run: shell: bash -l {0} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-node@v4 - with: - node-version: '18.12.1' - cache: 'yarn' - cache-dependency-path: 'galaxy root/client/yarn.lock' + persist-credentials: false - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' diff --git a/.github/workflows/selenium.yaml b/.github/workflows/selenium.yaml index 8ea022cad9d7e27359879426b2a9b026c214df31..8d2fc7016dab9968dac7a337a01e4d7069c7fe64 100644 --- a/.github/workflows/selenium.yaml +++ b/.github/workflows/selenium.yaml @@ -34,11 +34,11 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8'] + python-version: ['3.9'] chunk: [0, 1, 2] services: postgres: - image: postgres:13 + image: postgres:17 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres @@ -50,15 +50,11 @@ jobs: run: | echo "GALAXY_CONFIG_OVERRIDE_METADATA_STRATEGY=extended" >> $GITHUB_ENV echo "GALAXY_CONFIG_OVERRIDE_OUTPUTS_TO_WORKING_DIRECTORY=true" >> $GITHUB_ENV - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-node@v4 - with: - node-version: '18.12.1' - cache: 'yarn' - cache-dependency-path: 'galaxy root/client/yarn.lock' - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' @@ -80,7 +76,7 @@ jobs: - name: Run tests run: ./run_tests.sh --coverage -selenium lib/galaxy_test/selenium -- --num-shards=3 --shard-id=${{ matrix.chunk }} working-directory: 'galaxy root' - - uses: codecov/codecov-action@v3 + - uses: codecov/codecov-action@v5 with: flags: selenium working-directory: 'galaxy root' diff --git a/.github/workflows/test_galaxy_packages.yaml b/.github/workflows/test_galaxy_packages.yaml index f38f05846e747638a797bd93c682fa9ba3b51f03..c928c51a3d6b6274199bfd23fe2f33c602529792 100644 --- a/.github/workflows/test_galaxy_packages.yaml +++ b/.github/workflows/test_galaxy_packages.yaml @@ -18,17 +18,13 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.13'] + python-version: ['3.9', '3.13'] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-node@v4 - with: - node-version: '18.12.1' - cache: 'yarn' - cache-dependency-path: 'galaxy root/client/yarn.lock' - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' diff --git a/.github/workflows/test_galaxy_packages_for_pulsar.yaml b/.github/workflows/test_galaxy_packages_for_pulsar.yaml index 5f54f7fd31adc7387eb484eee8cffcadeab5e974..e418e48a106fe4c4d42d9fceab3f0b2bade7473f 100644 --- a/.github/workflows/test_galaxy_packages_for_pulsar.yaml +++ b/.github/workflows/test_galaxy_packages_for_pulsar.yaml @@ -16,16 +16,17 @@ concurrency: jobs: test: name: Test - runs-on: ubuntu-22.04 # Python 3.7 is not available via setup-python on ubuntu >=24.04 + runs-on: ubuntu-latest strategy: fail-fast: false matrix: - python-version: ['3.7'] # don't upgrade, see https://github.com/galaxyproject/galaxy/pull/16649 + python-version: ['3.8'] # don't upgrade, see https://github.com/galaxyproject/galaxy/pull/16649 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' diff --git a/.github/workflows/test_galaxy_release.yaml b/.github/workflows/test_galaxy_release.yaml index 6e39d98adc8ec40fcf7738de9ed90fc3ae69ca25..f3a6078b1145f78fb5f5460faef4f04ff3b89633 100644 --- a/.github/workflows/test_galaxy_release.yaml +++ b/.github/workflows/test_galaxy_release.yaml @@ -22,8 +22,9 @@ jobs: name: Test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 + persist-credentials: false - name: Run tests run: ./test/release.sh diff --git a/.github/workflows/toolshed.yaml b/.github/workflows/toolshed.yaml index 46ba1b38956175204639e8d136ee8f6fece52238..e3ee589e628abe0a3af2cce5fb0eb366daeeed7f 100644 --- a/.github/workflows/toolshed.yaml +++ b/.github/workflows/toolshed.yaml @@ -23,12 +23,12 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.13'] + python-version: ['3.9', '3.13'] shed-api: ['v1', 'v2'] test-install-client: ['galaxy_api', 'standalone'] services: postgres: - image: postgres:13 + image: postgres:17 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres @@ -36,15 +36,11 @@ jobs: ports: - 5432:5432 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-node@v4 - with: - node-version: '18.12.1' - cache: 'yarn' - cache-dependency-path: 'galaxy root/client/yarn.lock' - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' diff --git a/.github/workflows/unit-postgres.yaml b/.github/workflows/unit-postgres.yaml index 9c106bfd4613bc62a07635f1423393534d348d6d..f811de120f0cad92551f081cd38d95f2b41950e0 100644 --- a/.github/workflows/unit-postgres.yaml +++ b/.github/workflows/unit-postgres.yaml @@ -24,10 +24,10 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8'] + python-version: ['3.9'] services: postgres: - image: postgres:13 + image: postgres:17 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres @@ -35,15 +35,11 @@ jobs: ports: - 5432:5432 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-node@v4 - with: - node-version: '18.12.1' - cache: 'yarn' - cache-dependency-path: 'galaxy root/client/yarn.lock' - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' diff --git a/.github/workflows/unit.yaml b/.github/workflows/unit.yaml index bf41453d740a37cc263cf7d8d356cdb2f2c0d1c1..3d711dc6715e27e4b2c2069b387e86a67ddaac11 100644 --- a/.github/workflows/unit.yaml +++ b/.github/workflows/unit.yaml @@ -22,17 +22,13 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.8', '3.13'] + python-version: ['3.9', '3.13'] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: path: 'galaxy root' - - uses: actions/setup-node@v4 - with: - node-version: '18.12.1' - cache: 'yarn' - cache-dependency-path: 'galaxy root/client/yarn.lock' - - uses: actions/setup-python@v5 + persist-credentials: false + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} cache: 'pip' @@ -53,7 +49,7 @@ jobs: - name: Run tests run: tox -e unit-coverage working-directory: 'galaxy root' - - uses: codecov/codecov-action@v3 + - uses: codecov/codecov-action@v5 with: flags: py-unit working-directory: 'galaxy root' diff --git a/.gitignore b/.gitignore index 330502b43a5ea6fee170a2e07e66184e44db27eb..f36b06945bd89c99906c190ddba4e0f7e29d5f1b 100644 --- a/.gitignore +++ b/.gitignore @@ -76,6 +76,7 @@ config/* config/plugins/interactive_environments/**/*.ini config/plugins/**/.cache config/plugins/**/.parcel-cache +config/plugins/visualizations !config/plugins static/welcome.html.* static/welcome.html @@ -130,6 +131,7 @@ tool_test_output.json client/**/jsconfig.json vetur.config.js .pre-commit-config.yaml +galaxy.code-workspace # Chrom len files *.len @@ -163,6 +165,7 @@ client/webpack-stats.json packages/*/build packages/*/dist packages/*/*.egg-info +packages/meta/requirements.txt # Standalone script + main, or build into dist config/plugins/**/static/dist @@ -176,6 +179,7 @@ config/plugins/**/static/*.map config/plugins/visualizations/annotate_image/static/jquery.contextMenu.css config/plugins/visualizations/nvd3/nvd3_bar/static/nvd3.js config/plugins/visualizations/scatterplot/static/scatterplot.js +config/plugins/visualizations/tiffviewer/static/ # CWL conformance tests lib/galaxy_test/api/cwl/test_cwl_conformance_v1_?.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d5a36c3ecbe876bd7d86a74afdcd09511b0b0630..b43edd760241d36826f7b87459c0654812c1be0d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,8 +9,8 @@ variables: CONTAINER_GALAXY_URL: "${NDIP_DOCKER_REPOSITORY}/${CI_PROJECT_PATH}" CONTAINER_GALAXY_BASE_URL: "${CONTAINER_GALAXY_URL}/base" CONTAINER_GALAXY_COMMIT_URL: "${CONTAINER_GALAXY_URL}/commit" - GALAXY_VERSION_PYTHON: 24.2.dev8+ornl - GALAXY_VERSION_DOCKER: 24.2.dev8.ornl + GALAXY_VERSION_PYTHON: 25.1.dev0+ornl + GALAXY_VERSION_DOCKER: 25.1.dev0.ornl # This import is for the func_rse_docker_* functions before_script: diff --git a/.k8s_ci.Dockerfile b/.k8s_ci.Dockerfile index 287a94b94372d020032dc88a740ad4494e5f2582..ee884967c4cb5b189574cdb8760558cd7f4908e5 100644 --- a/.k8s_ci.Dockerfile +++ b/.k8s_ci.Dockerfile @@ -22,7 +22,7 @@ ARG STAGE1_BASE=python:3.12-slim ARG FINAL_STAGE_BASE=$STAGE1_BASE ARG GALAXY_USER=galaxy ARG GALAXY_PLAYBOOK_REPO=https://github.com/galaxyproject/galaxy-docker-k8s -ARG GALAXY_PLAYBOOK_BRANCH=v4.1.0 +ARG GALAXY_PLAYBOOK_BRANCH=v4.2.0 ARG GIT_COMMIT=unspecified ARG BUILD_DATE=unspecified @@ -168,7 +168,7 @@ RUN set -xe; \ # Create Galaxy user, group, directory; chown RUN set -xe; \ - adduser --system --group --uid 101 $GALAXY_USER \ + adduser --system --group --uid 10001 $GALAXY_USER \ && mkdir -p $SERVER_DIR \ && chown $GALAXY_USER:$GALAXY_USER $ROOT_DIR -R diff --git a/.pre-commit-config.yaml.sample b/.pre-commit-config.yaml.sample index 6c98887c9ce0df31e4163209f3b7260a57c8149c..0d1538243735a48f27603b8d4dc547ccd9e43e1d 100644 --- a/.pre-commit-config.yaml.sample +++ b/.pre-commit-config.yaml.sample @@ -8,13 +8,14 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-prettier - rev: v2.7.1 # Use the sha or tag you want to point at + rev: v3.1.0 hooks: - - id: prettier - types: [file] - types_or: [javascript, jsx, ts, tsx, vue] - additional_dependencies: - - prettier@2.8.8 # Workaround. See https://github.com/pre-commit/mirrors-prettier/issues/29 + - id: prettier + additional_dependencies: + - prettier@3.6.2 # SEE: https://github.com/pre-commit/pre-commit/issues/3133 + exclude_types: # .prettierignore ignored apparently ... + - yaml + - json - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.5.0 # Use the ref you want to point at hooks: diff --git a/CITATION b/CITATION index ad38514dfc8311081673df5655667f9d864d6af7..e8192aed879578cd0e5ac6bae8e7c5ce91ed1542 100644 --- a/CITATION +++ b/CITATION @@ -1,22 +1,22 @@ If you use or extend Galaxy in your published work, please cite this publication: -- The Galaxy Community. "The Galaxy platform for accessible, reproducible and collaborative - biomedical analyses: 2022 update" - Nucleic Acids Res. (2022) 50(W1):W345-W351 doi:10.1093/nar/gkac247 +- The Galaxy Community. "The Galaxy platform for accessible, reproducible, and + collaborative data analyses: 2024 update" + Nucleic Acids Res. (2024) 52(W1):W83-W94 doi:10.1093/nar/gkae410 BibTeX format: -@article{10.1093/nar/gkac247, - title = {The {Galaxy} platform for accessible, reproducible and collaborative biomedical analyses: 2022 update}, +@article{10.1093/nar/gkae410, + title = {The {Galaxy} platform for accessible, reproducible, and collaborative data analyses: 2024 update}, author = {The Galaxy Community}, journal = {Nucleic Acids Res.}, - doi = {10.1093/nar/gkac247}, - volume = {50}, + doi = {10.1093/nar/gkae410}, + volume = {52}, number = {W1}, - pages = {W345-W351}, - year = {2022}, - url = {https://doi.org/10.1093/nar/gkac247}, + pages = {W83-W94}, + year = {2024}, + url = {https://doi.org/10.1093/nar/gkae410}, publisher = {Oxford University Press} } diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 6f0c38bdf85f3c73c96a1985427104ff686f89dd..b6010e693e79ce90d210eafac239cdccded95dd8 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -35,7 +35,7 @@ The following individuals have contributed code to Galaxy: * Richard Burhans * Jennifer Cabral * Martin Čech -* Eli Chadwick +* Eli Chadwick * Ramkrishna Chakrabarty * Matt Chambers * Brad Chapman diff --git a/Makefile b/Makefile index 64d649ebf188d71642be1a2ae88fa6e96aa1e84c..72f32693e3bde5bdf56615ab0505562d09ce1022 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ VENV?=.venv # Source virtualenv to execute command (darker, sphinx, twine, etc...) IN_VENV=if [ -f "$(VENV)/bin/activate" ]; then . "$(VENV)/bin/activate"; fi; -RELEASE_CURR:=25.0 +RELEASE_CURR:=25.1 RELEASE_UPSTREAM:=upstream CONFIG_MANAGE=$(IN_VENV) python lib/galaxy/config/config_manage.py PROJECT_URL?=https://github.com/galaxyproject/galaxy @@ -18,7 +18,7 @@ GALAXY_PLUGIN_BUILD_FAIL_ON_ERROR?=0 # Respect predefined NODE_OPTIONS, otherwise set maximum heap size low for # compatibility with smaller machines. NODE_OPTIONS ?= --max-old-space-size=3072 -NODE_ENV = env NODE_OPTIONS=$(NODE_OPTIONS) GALAXY_PLUGIN_BUILD_FAIL_ON_ERROR=$(GALAXY_PLUGIN_BUILD_FAIL_ON_ERROR) +NODE_ENV = env NODE_OPTIONS=$(NODE_OPTIONS) GALAXY_PLUGIN_BUILD_FAIL_ON_ERROR=$(GALAXY_PLUGIN_BUILD_FAIL_ON_ERROR) CWL_TARGETS := test/functional/tools/cwl_tools/v1.0/conformance_tests.yaml \ test/functional/tools/cwl_tools/v1.1/conformance_tests.yaml \ test/functional/tools/cwl_tools/v1.2/conformance_tests.yaml \ @@ -26,6 +26,14 @@ CWL_TARGETS := test/functional/tools/cwl_tools/v1.0/conformance_tests.yaml \ lib/galaxy_test/api/cwl/test_cwl_conformance_v1_1.py \ lib/galaxy_test/api/cwl/test_cwl_conformance_v1_2.py NO_YARN_MSG="Could not find yarn, which is required to build the Galaxy client.\nIt should be shipped with Galaxy's virtualenv, but to install yarn manually please visit \033[0;34mhttps://yarnpkg.com/en/docs/install\033[0m for instructions, and package information for all platforms.\n" +SPACE := $() $() +NEVER_PYUPGRADE_PATHS := .venv/ .tox/ lib/galaxy/schema/bco/ \ + lib/galaxy/schema/drs/ lib/tool_shed_client/schema/trs \ + scripts/check_python.py tools/ test/functional/tools/cwl_tools/ +PY38_PYUPGRADE_PATHS := lib/galaxy/exceptions/ lib/galaxy/job_metrics/ \ + lib/galaxy/objectstore/ lib/galaxy/tool_util/ lib/galaxy/tool_util_models/ \ + lib/galaxy/util/ test/unit/job_metrics/ test/unit/objectstore/ \ + test/unit/tool_util/ test/unit/tool_util_models/ test/unit/util/ all: help @echo "This makefile is used for building Galaxy's JS client, documentation, and drive the release process. A sensible all target is not implemented." @@ -54,10 +62,10 @@ format: ## Format Python code base remove-unused-imports: ## Remove unused imports in Python code base $(IN_VENV) autoflake --in-place --remove-all-unused-imports --recursive --verbose lib/ test/ -pyupgrade: ## Convert older code patterns to Python3.7/3.8 idiomatic ones - ack --type=python -f | grep -v '^lib/galaxy/schema/bco/\|^lib/galaxy/schema/drs/\|^lib/tool_shed_client/schema/trs\|^tools/\|^.venv/\|^.tox/\|^lib/galaxy/exceptions/\|^lib/galaxy/job_metrics/\|^lib/galaxy/objectstore/\|^lib/galaxy/tool_util/\|^lib/galaxy/util/\|^test/functional/tools/cwl_tools/' | xargs pyupgrade --py38-plus - ack --type=python -f | grep -v '^lib/galaxy/schema/bco/\|^lib/galaxy/schema/drs/\|^lib/tool_shed_client/schema/trs\|^tools/\|^.venv/\|^.tox/\|^lib/galaxy/exceptions/\|^lib/galaxy/job_metrics/\|^lib/galaxy/objectstore/\|^lib/galaxy/tool_util/\|^lib/galaxy/util/\|^test/functional/tools/cwl_tools/' | xargs auto-walrus - ack --type=python -f lib/galaxy/exceptions/ lib/galaxy/job_metrics/ lib/galaxy/objectstore/ lib/galaxy/tool_util/ lib/galaxy/util/ | xargs pyupgrade --py37-plus +pyupgrade: ## Convert older code patterns to Python 3.8/3.9 idiomatic ones + ack --type=python -f | grep -v '^$(subst $(SPACE),\|^,$(NEVER_PYUPGRADE_PATHS) $(PY38_PYUPGRADE_PATHS))' | xargs pyupgrade --py39-plus + ack --type=python -f | grep -v '^$(subst $(SPACE),\|^,$(NEVER_PYUPGRADE_PATHS) $(PY38_PYUPGRADE_PATHS))' | xargs auto-walrus + ack --type=python -f $(PY38_PYUPGRADE_PATHS) | xargs pyupgrade --py38-plus docs-slides-ready: test -f plantuml.jar || wget http://jaist.dl.sourceforge.net/project/plantuml/plantuml.jar @@ -172,19 +180,15 @@ skip-client: ## Run only the server, skipping the client build. node-deps: ## Install NodeJS dependencies. ifndef YARN - @echo $(NO_YARN_MSG) - false; -else - $(IN_VENV) yarn install $(YARN_INSTALL_OPTS) + npm install -g yarn; endif + $(IN_VENV) yarn install $(YARN_INSTALL_OPTS) client-node-deps: ## Install NodeJS dependencies for the client. ifndef YARN - @echo $(NO_YARN_MSG) - false; -else - $(IN_VENV) cd client && yarn install $(YARN_INSTALL_OPTS) + npm install -g yarn; endif + $(IN_VENV) cd client && yarn install $(YARN_INSTALL_OPTS) format-xsd: xmllint --format --output galaxy-tmp.xsd lib/galaxy/tool_util/xsd/galaxy.xsd @@ -198,7 +202,7 @@ remove-api-schema: rm _schema.yaml rm _shed_schema.yaml -update-client-api-schema: client-node-deps build-api-schema +update-client-api-schema: client-node-deps build-api-schema ## Update client API schema $(IN_VENV) cd client && npx openapi-typescript ../_schema.yaml > src/api/schema/schema.ts && npx prettier --write src/api/schema/schema.ts $(IN_VENV) cd client && npx openapi-typescript ../_shed_schema.yaml > ../lib/tool_shed/webapp/frontend/src/schema/schema.ts && npx prettier --write ../lib/tool_shed/webapp/frontend/src/schema/schema.ts $(MAKE) remove-api-schema @@ -254,6 +258,12 @@ client-test-watch: client ## Watch and run all client unit tests on changes serve-selenium-notebooks: ## Serve testing notebooks for Jupyter cd lib && export PYTHONPATH=`pwd`; jupyter notebook --notebook-dir=galaxy_test/selenium/jupyter +files-sources-lint: ## Validate file sources configuration + $(IN_VENV) cd lib && PYTHONPATH=`pwd` python galaxy/files/validate/script.py + +files-sources-lint-verbose: ## Validate file sources configuration (verbose) + $(IN_VENV) cd lib && PYTHONPATH=`pwd` python galaxy/files/validate/script.py --verbose + # Release Targets release-create-rc: ## Create a release-candidate branch or new release-candidate version $(IN_VENV) ./scripts/release.sh -c diff --git a/README.rst b/README.rst index 6c4fb522c003ceb7da2007fc8ede154c72030c4b..a2ae0f9125df69069c8f0c7fd7e74fca66de1df3 100644 --- a/README.rst +++ b/README.rst @@ -24,12 +24,12 @@ Community support is available at `Galaxy Help Galaxy Quickstart ================= -Galaxy requires Python 3.8 or higher. To check your Python version, run: +Galaxy requires Python 3.9 or higher. To check your Python version, run: .. code:: console $ python -V - Python 3.8.18 + Python 3.9.21 Start Galaxy: diff --git a/client-api/.npmignore b/client-api/.npmignore new file mode 100644 index 0000000000000000000000000000000000000000..9cbf8156d3fb7364432b49ad4f01fc310856ec0d --- /dev/null +++ b/client-api/.npmignore @@ -0,0 +1,34 @@ +# Development files +node_modules/ +coverage/ +.vscode/ +.idea/ +.git/ +.github/ +.DS_Store + +# Source and test files (only dist is published) +src/examples/ +src/**/*.test.ts +vitest.config.ts +tsconfig.json +tsconfig.*.json +tsup.config.ts + +# CI/CD +*.yml +*.yaml + +# Logs +*.log +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Lock files +package-lock.json +pnpm-lock.yaml +yarn.lock + +# Not ignoring src directory since we're including it for source maps and debugging \ No newline at end of file diff --git a/client-api/README.md b/client-api/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2f43a2cc9b91af600cef2e17e1e0027eaca0208b --- /dev/null +++ b/client-api/README.md @@ -0,0 +1,194 @@ +# Galaxy API Client + +A standalone client library for the Galaxy API, built using the type definitions from the main Galaxy client. + +## Installation + +```bash +npm install @galaxyproject/galaxy-api-client +``` + +## Usage + +### Basic Usage + +```typescript +import { createGalaxyApi } from "@galaxyproject/galaxy-api-client"; + +// Create an instance of the Galaxy API client with a specific base URL +const api = createGalaxyApi("https://usegalaxy.org"); + +// Alternatively, use the default (current origin) +// const api = createGalaxyApi(); + +// Example: Get a list of histories +const { data, error } = await api.GET("/api/histories"); + +if (error) { + console.error("Error fetching histories:", error); +} else { + console.log("Histories:", data); +} + +// For backward compatibility +import { GalaxyApi } from "@galaxyproject/galaxy-api-client"; +const legacyApi = GalaxyApi(); // Uses current origin +``` + +### Usage with API Keys and Custom Headers + +```typescript +import { createGalaxyApi } from "@galaxyproject/galaxy-api-client"; + +// Create a client with API key authentication and custom headers +const api = createGalaxyApi({ + baseUrl: "https://usegalaxy.org", + apiKey: "your-api-key-here", + headers: { + Accept: "application/json", + }, + fetchOptions: { + credentials: "include", // Include cookies for CORS requests + cache: "no-cache", // Don't cache responses + }, +}); + +// Now all requests will include the API key header and custom options +const { data, error } = await api.GET("/api/histories"); +``` + +## Type Safety + +This package provides TypeScript types for Galaxy API endpoints and models: + +```typescript +import { createGalaxyApi, type HistorySummary, type DatasetEntry } from "@galaxyproject/galaxy-api-client"; + +const api = createGalaxyApi(); + +// Type-safe API calls +const { data: histories } = await api.GET("/api/histories"); +// histories is typed as HistorySummary[] | undefined + +// You can use the types for your variables +const myHistory: HistorySummary = { + id: "123", + name: "My History", + // ...other required properties +}; +``` + +## Examples + +See more in `src/example.ts` that demonstrate how to use the client: + +### Basic Example + +```typescript +import { createGalaxyApi } from "@galaxyproject/galaxy-api-client"; + +// Create a client with a specific Galaxy instance +const api = createGalaxyApi("https://usegalaxy.org"); + +// Example: Get a list of tools +async function getTools() { + const { data, error } = await api.GET("/api/tools"); + + if (error) { + console.error("Error fetching tools:", error); + return []; + } + + // Log tool count + console.log(`Found ${data.length} tools`); + + return data; +} +``` + +## Notes + +This package uses a symlink to reference API type definitions from the main Galaxy client while providing a standalone client implementation. This approach was chosen to: + +1. Minimize duplication of type definitions +2. Ensure type definitions stay in sync with the main codebase +3. Allow the client to work independently of Galaxy's internal utilities + +## Development + +To work on this package: + +1. Make changes to the API type definitions in the main Galaxy client +2. The type changes will automatically be available in this package via symlinks +3. Synchronize the version with Galaxy: + + ```bash + # Update the version in package.json from Galaxy's version.py + npm run sync-version + ``` + +4. Build the library for distribution: + + ```bash + # Install dependencies + npm install + + # Build the library + npm run build + + # Watch mode for development + npm run dev + ``` + +### Version Synchronization + +This package maintains version parity with Galaxy to indicate API compatibility. The version number in `package.json` is derived from Galaxy's `lib/galaxy/version.py` file but formatted to comply with npm's semver requirements. + +**Important:** npm does not allow republishing the same version, even for development versions. When making changes to the client API during development: + +1. Manually increment the version before publishing: + + ```bash + # Example: Update from 25.0.0-dev.0 to 25.0.0-dev.1 + npm version prerelease --preid=dev + ``` + +2. Or edit the npm version directly in package.json: + ```json + { + "version": "25.0.0-dev.1" + } + ``` + +There's also a script to automate this process of syncing with galaxy version that we may want to use in other contexts, too?: + +```bash +# Using npm script +npm run sync-version +``` + +The script will: + +1. Read the version from Galaxy's `version.py` file +2. Convert it to npm-compatible semver format +3. Update the version in `package.json` if different + +Version synchronization should be performed before each release to ensure the client API version accurately reflects the Galaxy API version it supports. + +### Testing + +The package includes a few vitest tests as a sanity check, but we could do a lot more here: + +```bash +# Run tests +npm test + +# Run tests with watch mode (during development) +npm run test:watch +``` + +The tests verify: + +- Client creation with default and custom base URLs +- Basic API interaction with proper typing +- Error handling diff --git a/client-api/package-lock.json b/client-api/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..16a72ac25cff0315232599331112387e74fe1e9b --- /dev/null +++ b/client-api/package-lock.json @@ -0,0 +1,3198 @@ +{ + "name": "@galaxyproject/galaxy-api-client", + "version": "25.0.0-dev.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@galaxyproject/galaxy-api-client", + "version": "25.0.0-dev.0", + "license": "MIT", + "dependencies": { + "openapi-fetch": "^0.12.0" + }, + "devDependencies": { + "jsdom": "^26.1.0", + "rimraf": "^6.0.1", + "ts-node": "^10.9.2", + "tsup": "^8.4.0", + "typescript": "^5.8.3", + "vitest": "^3.1.3" + }, + "peerDependencies": { + "typescript": ">=4.5.0" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.1.7.tgz", + "integrity": "sha512-Ok5fYhtwdyJQmU1PpEv6Si7Y+A4cYb8yNM9oiIJC9TzXPMuN9fvdonKJqcnz9TbFqV6bQ8z0giRq0iaOpGZV2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.3.tgz", + "integrity": "sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.9.tgz", + "integrity": "sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", + "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", + "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", + "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", + "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", + "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", + "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", + "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", + "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", + "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", + "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", + "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", + "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", + "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", + "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", + "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", + "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", + "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", + "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", + "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", + "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", + "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", + "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", + "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", + "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", + "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", + "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", + "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", + "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", + "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", + "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", + "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", + "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", + "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", + "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", + "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", + "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", + "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", + "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", + "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", + "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", + "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", + "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", + "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", + "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", + "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.15.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.15.tgz", + "integrity": "sha512-R5muMcZob3/Jjchn5LcO8jdKwSCbzqmPB6ruBxMcf9kbxtniZHP327s6C37iOfuw8mbKK3cAQa7sEl7afLrQ8A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@vitest/expect": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.3.tgz", + "integrity": "sha512-7FTQQuuLKmN1Ig/h+h/GO+44Q1IlglPlR2es4ab7Yvfx+Uk5xsv+Ykk+MEt/M2Yn/xGmzaLKxGw2lgy2bwuYqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.1.3", + "@vitest/utils": "3.1.3", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.3.tgz", + "integrity": "sha512-PJbLjonJK82uCWHjzgBJZuR7zmAOrSvKk1QBxrennDIgtH4uK0TB1PvYmc0XBCigxxtiAVPfWtAdy4lpz8SQGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.1.3", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.3.tgz", + "integrity": "sha512-i6FDiBeJUGLDKADw2Gb01UtUNb12yyXAqC/mmRWuYl+m/U9GS7s8us5ONmGkGpUUo7/iAYzI2ePVfOZTYvUifA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.3.tgz", + "integrity": "sha512-Tae+ogtlNfFei5DggOsSUvkIaSuVywujMj6HzR97AHK6XK8i3BuVyIifWAm/sE3a15lF5RH9yQIrbXYuo0IFyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.1.3", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.3.tgz", + "integrity": "sha512-XVa5OPNTYUsyqG9skuUkFzAeFnEzDp8hQu7kZ0N25B1+6KjGm4hWLtURyBbsIAOekfWQ7Wuz/N/XXzgYO3deWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.1.3", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.3.tgz", + "integrity": "sha512-x6w+ctOEmEXdWaa6TO4ilb7l9DxPR5bwEb6hILKuxfU1NqWT2mpJD9NJN7t3OTfxmVlOMrvtoFJGdgyzZ605lQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.3.tgz", + "integrity": "sha512-2Ltrpht4OmHO9+c/nmHtF09HWiyWdworqnHIwjfvDyWjuwKbdkcS9AnhsDn+8E2RM4x++foD1/tNuLPVvWG1Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.1.3", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/bundle-require": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", + "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.18" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chai": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssstyle": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.1.tgz", + "integrity": "sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.1.2", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", + "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", + "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.4", + "@esbuild/android-arm": "0.25.4", + "@esbuild/android-arm64": "0.25.4", + "@esbuild/android-x64": "0.25.4", + "@esbuild/darwin-arm64": "0.25.4", + "@esbuild/darwin-x64": "0.25.4", + "@esbuild/freebsd-arm64": "0.25.4", + "@esbuild/freebsd-x64": "0.25.4", + "@esbuild/linux-arm": "0.25.4", + "@esbuild/linux-arm64": "0.25.4", + "@esbuild/linux-ia32": "0.25.4", + "@esbuild/linux-loong64": "0.25.4", + "@esbuild/linux-mips64el": "0.25.4", + "@esbuild/linux-ppc64": "0.25.4", + "@esbuild/linux-riscv64": "0.25.4", + "@esbuild/linux-s390x": "0.25.4", + "@esbuild/linux-x64": "0.25.4", + "@esbuild/netbsd-arm64": "0.25.4", + "@esbuild/netbsd-x64": "0.25.4", + "@esbuild/openbsd-arm64": "0.25.4", + "@esbuild/openbsd-x64": "0.25.4", + "@esbuild/sunos-x64": "0.25.4", + "@esbuild/win32-arm64": "0.25.4", + "@esbuild/win32-ia32": "0.25.4", + "@esbuild/win32-x64": "0.25.4" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", + "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/jsdom": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/loupe": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", + "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/openapi-fetch": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.12.5.tgz", + "integrity": "sha512-FnAMWLt0MNL6ComcL4q/YbB1tUgyz5YnYtwA1+zlJ5xcucmK5RlWsgH1ynxmEeu8fGJkYjm8armU/HVpORc9lw==", + "license": "MIT", + "dependencies": { + "openapi-typescript-helpers": "^0.0.15" + } + }, + "node_modules/openapi-typescript-helpers": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.0.15.tgz", + "integrity": "sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==", + "license": "MIT" + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", + "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/jackspeak": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", + "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", + "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.40.2", + "@rollup/rollup-android-arm64": "4.40.2", + "@rollup/rollup-darwin-arm64": "4.40.2", + "@rollup/rollup-darwin-x64": "4.40.2", + "@rollup/rollup-freebsd-arm64": "4.40.2", + "@rollup/rollup-freebsd-x64": "4.40.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", + "@rollup/rollup-linux-arm-musleabihf": "4.40.2", + "@rollup/rollup-linux-arm64-gnu": "4.40.2", + "@rollup/rollup-linux-arm64-musl": "4.40.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-musl": "4.40.2", + "@rollup/rollup-linux-s390x-gnu": "4.40.2", + "@rollup/rollup-linux-x64-gnu": "4.40.2", + "@rollup/rollup-linux-x64-musl": "4.40.2", + "@rollup/rollup-win32-arm64-msvc": "4.40.2", + "@rollup/rollup-win32-ia32-msvc": "4.40.2", + "@rollup/rollup-win32-x64-msvc": "4.40.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/source-map/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/source-map/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsup": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.4.0.tgz", + "integrity": "sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-require": "^5.1.0", + "cac": "^6.7.14", + "chokidar": "^4.0.3", + "consola": "^3.4.0", + "debug": "^4.4.0", + "esbuild": "^0.25.0", + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.34.8", + "source-map": "0.8.0-beta.0", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.11", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", + "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.3.tgz", + "integrity": "sha512-uHV4plJ2IxCl4u1up1FQRrqclylKAogbtBfOTwcuJ28xFi+89PZ57BRh+naIRvH70HPwxy5QHYzg1OrEaC7AbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.0", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.3.tgz", + "integrity": "sha512-188iM4hAHQ0km23TN/adso1q5hhwKqUpv+Sd6p5sOuh6FhQnRNW3IsiIpvxqahtBabsJ2SLZgmGSpcYK4wQYJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "3.1.3", + "@vitest/mocker": "3.1.3", + "@vitest/pretty-format": "^3.1.3", + "@vitest/runner": "3.1.3", + "@vitest/snapshot": "3.1.3", + "@vitest/spy": "3.1.3", + "@vitest/utils": "3.1.3", + "chai": "^5.2.0", + "debug": "^4.4.0", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.13", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.1.3", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.1.3", + "@vitest/ui": "3.1.3", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + } + } +} diff --git a/client-api/package.json b/client-api/package.json new file mode 100644 index 0000000000000000000000000000000000000000..1a15d0f2e250a165c7c1ae323dd9352f21c8f2ef --- /dev/null +++ b/client-api/package.json @@ -0,0 +1,51 @@ +{ + "name": "@galaxyproject/galaxy-api-client", + "version": "25.0.0-dev.0", + "description": "A client library for the Galaxy API", + "type": "module", + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + }, + "files": [ + "dist", + "src" + ], + "scripts": { + "build": "tsup", + "dev": "tsup --watch", + "clean": "rimraf dist", + "prepublishOnly": "npm run clean && npm run build", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage", + "sync-version": "node scripts/sync-version.js" + }, + "keywords": [ + "galaxy", + "api", + "client" + ], + "author": "Galaxy Community", + "license": "MIT", + "dependencies": { + "openapi-fetch": "^0.12.0" + }, + "peerDependencies": { + "typescript": ">=4.5.0" + }, + "devDependencies": { + "jsdom": "^26.1.0", + "rimraf": "^6.0.1", + "ts-node": "^10.9.2", + "tsup": "^8.4.0", + "typescript": "^5.8.3", + "vitest": "^3.1.3" + } +} diff --git a/client-api/scripts/sync-version.js b/client-api/scripts/sync-version.js new file mode 100755 index 0000000000000000000000000000000000000000..4b0a67e7eecc339206700c8be2a3fef0b0cccbd5 --- /dev/null +++ b/client-api/scripts/sync-version.js @@ -0,0 +1,71 @@ +#!/usr/bin/env node + +/** + * Galaxy Client API Version Synchronization Script + * + * Reads Galaxy's version.py and updates package.json with a semver-compatible version. + */ + +import fs from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; + +// Get directory paths +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const galaxyRoot = process.env.GALAXY_ROOT || path.resolve(__dirname, "../.."); +const clientApiRoot = path.resolve(__dirname, ".."); + +// File paths +const galaxyVersionPath = path.join(galaxyRoot, "lib/galaxy/version.py"); +const packageJsonPath = path.join(clientApiRoot, "package.json"); + +// Check if Galaxy version.py exists +if (!fs.existsSync(galaxyVersionPath)) { + console.error(`Galaxy version file not found at ${galaxyVersionPath}`); + process.exit(1); +} + +// Read Galaxy version information +const versionPy = fs.readFileSync(galaxyVersionPath, "utf-8"); +const majorMatch = versionPy.match(/VERSION_MAJOR\s*=\s*"([^"]+)"/); +const minorMatch = versionPy.match(/VERSION_MINOR\s*=\s*"([^"]+)"/); + +if (!majorMatch) { + console.error("Could not find VERSION_MAJOR in version.py"); + process.exit(1); +} + +// Parse Galaxy version components +const galaxyMajor = majorMatch[1].split(".")[0]; +const galaxyMinor = majorMatch[1].split(".")[1] || "0"; +const preRelease = minorMatch && minorMatch[1] ? minorMatch[1] : null; + +// Read current package.json +const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8")); +const currentVersion = packageJson.version; + +// Create npm-compatible version +let newVersion; + +if (preRelease) { + // Handle prerelease versions (dev0, rc1, etc.) + const type = preRelease.match(/^([a-z]+)/)[1]; // dev, rc, etc. + const num = preRelease.match(/\d+$/)[0]; // The trailing number + newVersion = `${galaxyMajor}.${galaxyMinor}.0-${type}.${num}`; +} else { + // Stable release + newVersion = `${galaxyMajor}.${galaxyMinor}.0`; +} + +// Update if different +if (currentVersion !== newVersion) { + console.log(`Updating version from ${currentVersion} to ${newVersion}`); + + packageJson.version = newVersion; + fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + "\n", "utf-8"); + + console.log("Version updated successfully"); +} else { + console.log(`Version is already up to date (${currentVersion})`); +} diff --git a/client-api/src/api b/client-api/src/api new file mode 120000 index 0000000000000000000000000000000000000000..e6fdfd11d72b0269762a1566011ca6a6c9d93211 --- /dev/null +++ b/client-api/src/api @@ -0,0 +1 @@ +../../client/src/api \ No newline at end of file diff --git a/client-api/src/api-types.ts b/client-api/src/api-types.ts new file mode 100644 index 0000000000000000000000000000000000000000..07544c43510614116ea2433f7d39e3757cc01885 --- /dev/null +++ b/client-api/src/api-types.ts @@ -0,0 +1,106 @@ +/** + * This file re-exports the types we want to use from the Galaxy API. + * It serves as a compatibility layer to avoid importing directly from the + * symlinked files, which would require all of Galaxy's dependencies. + */ + +// Import types from the symlinked files +import { type components, type GalaxyApiPaths } from "./api/schema"; + +// We only need the types, not the code that depends on Galaxy's implementation +export type { components, GalaxyApiPaths }; + +// Re-export specific types +export type HistorySummary = components["schemas"]["HistorySummary"]; +export type HistoryDetailed = components["schemas"]["HistoryDetailed"]; +export type HDASummary = components["schemas"]["HDASummary"]; +export type HDADetailed = components["schemas"]["HDADetailed"]; +export type DCESummary = components["schemas"]["DCESummary"]; +export type HDCASummary = components["schemas"]["HDCASummary"]; +export type HDCADetailed = components["schemas"]["HDCADetailed"]; +export type DCObject = components["schemas"]["DCObject"]; +export type HDAObject = components["schemas"]["HDAObject"]; +export type HDAInaccessible = components["schemas"]["HDAInaccessible"]; +export type DatasetTextContentDetails = components["schemas"]["DatasetTextContentDetails"]; +export type DatasetStorageDetails = components["schemas"]["DatasetStorageDetails"]; +export type DatasetCollectionAttributes = components["schemas"]["DatasetCollectionAttributesResult"]; +export type ConcreteObjectStoreModel = components["schemas"]["ConcreteObjectStoreModel"]; +export type MessageException = components["schemas"]["MessageExceptionModel"]; +export type DatasetHash = components["schemas"]["DatasetHash"]; +export type DatasetSource = components["schemas"]["DatasetSource"]; +export type DatasetTransform = components["schemas"]["DatasetSourceTransform"]; +export type StoreExportPayload = components["schemas"]["StoreExportPayload"]; +export type ModelStoreFormat = components["schemas"]["ModelStoreFormat"]; +export type ObjectExportTaskResponse = components["schemas"]["ObjectExportTaskResponse"]; +export type ExportObjectRequestMetadata = components["schemas"]["ExportObjectRequestMetadata"]; +export type ExportObjectResultMetadata = components["schemas"]["ExportObjectResultMetadata"]; +export type AsyncTaskResultSummary = components["schemas"]["AsyncTaskResultSummary"]; + +// Define utility types that may be used in the client +export type HistorySortByLiteral = "create_time" | "name" | "update_time" | "username" | undefined; + +export interface HistoryContentsStats { + id: string; + update_time: string; + size: number; + contents_active: components["schemas"]["HistoryActiveContentCounts"]; +} + +export interface HistorySummaryExtended extends HistorySummary, HistoryContentsStats { + user_id: string | null; +} + +export interface SelectableObjectStore extends ConcreteObjectStoreModel { + object_store_id: string; +} + +export type DatasetEntry = HDASummary | HDADetailed | HDAInaccessible; + +export interface DCECollection extends DCESummary { + element_type: "dataset_collection"; + object: DCObject; +} + +export interface DCEDataset extends DCESummary { + element_type: "hda"; + object: HDAObject; +} + +export interface SubCollection extends DCObject { + name: string; + hdca_id: string; +} + +export type CollectionEntry = HDCASummary | SubCollection; +export type HistoryItemSummary = HDASummary | HDCASummary; + +// Utility functions +export function isHDA(entry?: HistoryItemSummary): entry is HDASummary { + return entry !== undefined && "history_content_type" in entry && entry.history_content_type === "dataset"; +} + +export function isHDCA(entry?: HistoryItemSummary | CollectionEntry): entry is HDCASummary { + return ( + entry !== undefined && "history_content_type" in entry && entry.history_content_type === "dataset_collection" + ); +} + +export function isDCE(item: object): item is DCESummary { + return item && "element_type" in item; +} + +export function isCollectionElement(element: DCESummary): element is DCECollection { + return element.element_type === "dataset_collection"; +} + +export function isDatasetElement(element: DCESummary): element is DCEDataset { + return element.element_type === "hda"; +} + +export function hasDetails(entry: DatasetEntry): entry is HDADetailed { + return "peek" in entry; +} + +export function isInaccessible(entry: DatasetEntry): entry is HDAInaccessible { + return "accessible" in entry && !entry.accessible; +} diff --git a/client-api/src/client.test.ts b/client-api/src/client.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..b83fec20c3ce096255a766d4181801a4ac27f792 --- /dev/null +++ b/client-api/src/client.test.ts @@ -0,0 +1,68 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { createGalaxyApi } from "./client"; + +// Create a mock API client for testing +const mockApiClient = { + GET: vi.fn(), + POST: vi.fn(), + PUT: vi.fn(), + DELETE: vi.fn(), + PATCH: vi.fn(), +}; + +// Mock createClient before importing +vi.mock("openapi-fetch", () => { + return { + default: vi.fn().mockImplementation(() => mockApiClient), + }; +}); + +import createClient from "openapi-fetch"; + +describe("Galaxy API Client", () => { + beforeEach(() => { + // Reset mock function calls before each test + vi.clearAllMocks(); + }); + + it("creates a client with the default base URL", () => { + // Set up window.location.origin for testing + const originalLocation = window.location; + delete (window as any).location; + window.location = { ...originalLocation, origin: "https://test-galaxy.org" } as any; + + const api = createGalaxyApi(); + + expect(createClient).toHaveBeenCalledWith({ baseUrl: "https://test-galaxy.org" }); + + // Restore window.location + window.location = originalLocation; + }); + + it("creates a client with a custom base URL", () => { + const customUrl = "https://usegalaxy.org"; + const api = createGalaxyApi(customUrl); + + expect(createClient).toHaveBeenCalledWith({ baseUrl: customUrl }); + }); + + it("strips trailing slash from base URL", () => { + const customUrl = "https://usegalaxy.org/"; + const expectedUrl = "https://usegalaxy.org"; + const api = createGalaxyApi(customUrl); + + expect(createClient).toHaveBeenCalledWith({ baseUrl: expectedUrl }); + }); + + it("returns the configured client", () => { + const api = createGalaxyApi(); + + // Should have all the HTTP methods + expect(api).toEqual(mockApiClient); + expect(api).toHaveProperty("GET"); + expect(api).toHaveProperty("POST"); + expect(api).toHaveProperty("PUT"); + expect(api).toHaveProperty("DELETE"); + expect(api).toHaveProperty("PATCH"); + }); +}); diff --git a/client-api/src/client.ts b/client-api/src/client.ts new file mode 100644 index 0000000000000000000000000000000000000000..55aa7700a5e4a2c95ef65281eb21b7efdc408d5b --- /dev/null +++ b/client-api/src/client.ts @@ -0,0 +1,62 @@ +import createClient from "openapi-fetch"; +import { type GalaxyApiPaths } from "./api-types"; + +/** + * Options for creating a Galaxy API client + */ +export interface GalaxyApiOptions { + /** + * The base URL of the Galaxy server (e.g., "https://usegalaxy.org") + * @default window.location.origin + */ + baseUrl?: string; + + /** + * API key for authentication + */ + apiKey?: string; + + /** + * Custom headers to include with each request + */ + headers?: Record; + + /** + * Custom fetch options that will be passed to all requests + */ + fetchOptions?: RequestInit; +} + +/** + * Creates a Galaxy API client with the specified options + * @param options Configuration options for the Galaxy API client + * @returns The Galaxy API client + */ +export function createGalaxyApi(options: GalaxyApiOptions | string = {}) { + // Handle the case where baseUrl is passed as a string for backward compatibility + const opts = typeof options === "string" ? { baseUrl: options } : options; + + // Default to window.location.origin if no baseUrl is provided + const baseUrl = opts.baseUrl || window.location.origin; + const normalizedBaseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; + + // Build headers object + const headers: Record = { + ...(opts.headers || {}), + }; + + // Add API key header if provided + if (opts.apiKey) { + headers["x-api-key"] = opts.apiKey; + } + + // Create the client with all options + return createClient({ + baseUrl: normalizedBaseUrl, + headers, + // Pass any custom fetchOptions directly to createClient + ...(opts.fetchOptions ? { fetchOptions: opts.fetchOptions } : {}), + }); +} + +export type GalaxyApiClient = ReturnType; diff --git a/client-api/src/example.ts b/client-api/src/example.ts new file mode 100644 index 0000000000000000000000000000000000000000..bb107c38e494afd3ecbd4a5c92699b61c09ec48d --- /dev/null +++ b/client-api/src/example.ts @@ -0,0 +1,105 @@ +// Example usage of the Galaxy API client +import { createGalaxyApi } from "./index"; + +// +// Basic usage - just provide a base URL +// +const basicApi = createGalaxyApi("https://usegalaxy.org"); + +// +// Advanced usage - with API key authentication and custom headers +// +const authenticatedApi = createGalaxyApi({ + baseUrl: "https://usegalaxy.org", + apiKey: "your-api-key-here", + headers: { + Accept: "application/json", + "User-Agent": "GalaxyClientApp/1.0", + }, +}); + +// +// Example with request options (timeouts, credentials, etc.) +// +const apiWithOptions = createGalaxyApi({ + baseUrl: "https://usegalaxy.org", + fetchOptions: { + credentials: "include", // Include cookies for CORS requests + cache: "no-cache", // Don't cache responses + timeout: 30000, // 30 second timeout + }, +}); + +// Example function to get a list of tools +async function getTools() { + // Using the basic API + const { data, error } = await basicApi.GET("/api/tools"); + + if (error) { + console.error("Error fetching tools:", error); + return []; + } + + // Log tool count + console.log(`Found ${data.length} tools`); + + // Group tools by section + const sections: Record = {}; + for (const tool of data) { + const section = tool.panel_section_name || "Ungrouped"; + if (!sections[section]) sections[section] = []; + sections[section].push(tool); + } + + // Print summary + Object.keys(sections).forEach((section) => { + console.log(`${section}: ${sections[section].length} tools`); + }); + + return data; +} + +// Example function to get a specific tool by ID +async function getToolById(id: string) { + // Using the authenticated API + const { data, error } = await authenticatedApi.GET("/api/tools/{tool_id}", { + params: { + path: { + tool_id: id, + }, + }, + }); + + if (error || !data) { + console.error("Error fetching tool:", error); + return null; + } + + return data; +} + +// Example function to create a dataset in a history +async function createDataset(historyId: string, name: string, content: string) { + // Using the API with custom options + const { data, error } = await apiWithOptions.POST("/api/histories/{history_id}/contents", { + params: { + path: { + history_id: historyId, + }, + }, + body: { + name, + content, + type: "file", + }, + }); + + if (error) { + console.error("Error creating dataset:", error); + return null; + } + + return data; +} + +export { getTools, getToolById, createDataset }; diff --git a/client-api/src/index.ts b/client-api/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..393d62f6b7b77ae0610d553b3f125e65ba67d367 --- /dev/null +++ b/client-api/src/index.ts @@ -0,0 +1,31 @@ +/** + * Galaxy Client API + * A client library for the Galaxy API + */ + +import { createGalaxyApi, type GalaxyApiClient } from "./client"; +import { errorMessageAsString } from "./utils/error"; + +// Re-export all the types from our type compatibility layer +export * from "./api-types"; + +// SimpleError class for error handling +export class SimpleError extends Error { + constructor(message: string) { + super(message); + this.name = "GalaxyApiError"; + } +} + +// Re-export the client functions +export { createGalaxyApi, type GalaxyApiClient }; + +// For backward compatibility - creates a client with default settings +export function GalaxyApi() { + return createGalaxyApi(); +} + +// Utility function to format error messages +export function formatErrorMessage(error: any): string { + return errorMessageAsString(error); +} diff --git a/client-api/src/integration.test.ts b/client-api/src/integration.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..3861a6f244aa803d3da56b9042cc42b511661d3b --- /dev/null +++ b/client-api/src/integration.test.ts @@ -0,0 +1,118 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { type HistorySummary } from "./api-types"; + +// Set up mock responses +const mockHistories: HistorySummary[] = [ + { + id: "1", + name: "Test History 1", + deleted: false, + purged: false, + archived: false, + tags: [], + model_class: "History", + url: "/api/histories/1", + }, + { + id: "2", + name: "Test History 2", + deleted: false, + purged: false, + archived: false, + tags: ["test"], + model_class: "History", + url: "/api/histories/2", + }, +]; + +// Create a mock API client with typed responses +const mockApiClient = { + GET: vi.fn().mockImplementation((path, options) => { + if (path === "/api/histories") { + return Promise.resolve({ + data: mockHistories, + error: null, + response: new Response(), + }); + } + if (path === "/api/histories/{history_id}" && options?.params?.path?.history_id === "1") { + return Promise.resolve({ + data: mockHistories[0], + error: null, + response: new Response(), + }); + } + return Promise.resolve({ + data: null, + error: { status: 404, message: "Not found" }, + response: new Response(), + }); + }), + POST: vi.fn(), + PUT: vi.fn(), + DELETE: vi.fn(), + PATCH: vi.fn(), +}; + +// Setup mocks before importing the modules that use them +vi.mock("openapi-fetch", () => { + return { + default: vi.fn().mockImplementation(() => mockApiClient), + }; +}); + +// Import the modules after setting up mocks +import { createGalaxyApi, GalaxyApi } from "./index"; + +describe("Galaxy API Integration", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("exports the createGalaxyApi function", () => { + expect(typeof createGalaxyApi).toBe("function"); + }); + + it("exports the backward-compatible GalaxyApi function", () => { + expect(typeof GalaxyApi).toBe("function"); + expect(GalaxyApi()).toEqual(mockApiClient); + }); + + it("retrieves histories with proper typing", async () => { + const api = createGalaxyApi(); + const { data, error } = await api.GET("/api/histories"); + + expect(error).toBeNull(); + expect(data).toEqual(mockHistories); + + if (data) { + // This is a type check - if TypeScript can compile this, + // it means the types are working correctly + const firstHistory = data[0]; + expect(firstHistory.id).toBe("1"); + expect(firstHistory.name).toBe("Test History 1"); + } + }); + + it("retrieves a single history by ID", async () => { + const api = createGalaxyApi(); + const { data, error } = await api.GET("/api/histories/{history_id}", { + params: { + path: { + history_id: "1", + }, + }, + }); + + expect(error).toBeNull(); + expect(data).toEqual(mockHistories[0]); + }); + + it("handles errors properly", async () => { + const api = createGalaxyApi(); + const { data, error } = await api.GET("/api/nonexistent"); + + expect(data).toBeNull(); + expect(error).toEqual({ status: 404, message: "Not found" }); + }); +}); diff --git a/client-api/src/utils/error.ts b/client-api/src/utils/error.ts new file mode 100644 index 0000000000000000000000000000000000000000..8be44f9ee9a4e21a0dd45569a5b8962b5cf16f42 --- /dev/null +++ b/client-api/src/utils/error.ts @@ -0,0 +1,38 @@ +/** + * Simple error handling utilities for Galaxy Client API + */ + +/** + * Convert various error formats to a readable string message + */ +export function errorMessageAsString(error: any): string { + if (typeof error === "string") { + return error; + } + + if (error instanceof Error) { + return error.message; + } + + if (error && typeof error === "object") { + // Handle API response errors + if (error.status && error.error) { + return `API Error (${error.status}): ${error.error}`; + } + + // Handle response objects with error message + if (error.message) { + return error.message; + } + + // Try to stringify the error object + try { + return JSON.stringify(error); + } catch (e) { + // Fall back to object inspection + return String(error); + } + } + + return "Unknown error"; +} diff --git a/client-api/tsconfig.build.json b/client-api/tsconfig.build.json new file mode 100644 index 0000000000000000000000000000000000000000..e9fb12777e72879ffe9bb0d6cb34514bd4ed732a --- /dev/null +++ b/client-api/tsconfig.build.json @@ -0,0 +1,19 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "importHelpers": true, + "esModuleInterop": true + }, + "include": ["src/**/*.ts"], + "exclude": [ + "node_modules", + "dist", + "**/*.test.ts", + "src/examples", + "vitest.config.ts" + ] +} \ No newline at end of file diff --git a/client-api/tsconfig.json b/client-api/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..7d26b1160aa37ac7a3c60edae815dfd16723d37b --- /dev/null +++ b/client-api/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "es2022", + "module": "es2022", + "moduleResolution": "node", + + "verbatimModuleSyntax": true, + + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + }, + + "allowJs": true, + "checkJs": false, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "noUncheckedIndexedAccess": true, + + // Necessary for now, was previously the default setting + "resolvePackageJsonExports": false + }, + "include": ["./src/**/*.ts"] +} \ No newline at end of file diff --git a/client-api/tsconfig.node.json b/client-api/tsconfig.node.json new file mode 100644 index 0000000000000000000000000000000000000000..b64496f4e4597af0e412abffc5cdb5874d8f0f2a --- /dev/null +++ b/client-api/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["src/examples/**/*.ts"] +} \ No newline at end of file diff --git a/client-api/tsup.config.ts b/client-api/tsup.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..d499054fa7ed96a28b231ce1c4b17e997e627719 --- /dev/null +++ b/client-api/tsup.config.ts @@ -0,0 +1,19 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + entry: ['src/index.ts'], + format: ['esm', 'cjs'], + dts: true, + sourcemap: true, + clean: true, + treeshake: true, + minify: false, + target: 'es2022', + esbuildOptions(options) { + options.external = [ + ...options.external || [], + // External dependencies that should not be bundled + 'openapi-fetch' + ]; + }, +}); \ No newline at end of file diff --git a/client-api/vitest.config.ts b/client-api/vitest.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..cf8c0e8514eff762f69e65006ca693df49c3aa17 --- /dev/null +++ b/client-api/vitest.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from 'vitest/config'; +import { resolve } from 'path'; + +export default defineConfig({ + test: { + environment: 'jsdom', // Use jsdom for browser-like environment + globals: true, // Makes expect and other test globals available without imports + include: ['src/**/*.test.ts'], + exclude: ['src/api/**/*.test.ts'], // Exclude tests from symlinked files + alias: { + '@': resolve(__dirname, 'src'), + }, + deps: { + optimizer: { + web: { + include: ['openapi-fetch'] + } + } + }, + }, +}); \ No newline at end of file diff --git a/client/.eslintrc.js b/client/.eslintrc.js index a2ade17c292b63c55f3c8b8f7c1fb4e794a1e284..85e3a860b795a1f329cc3d4d36e81f4fecac812c 100644 --- a/client/.eslintrc.js +++ b/client/.eslintrc.js @@ -87,6 +87,8 @@ const baseRules = { "error", { prefer: "type-imports", fixStyle: "inline-type-imports" }, ], + + "@typescript-eslint/no-import-type-side-effects": "error", }; const baseExtends = [ diff --git a/client/.node_version b/client/.node_version index b460d6f2dea9644f93d341a3d98d8fe6966df1cb..442c7587a99a786eb2a9b27d535623cc1aa15ebe 100644 --- a/client/.node_version +++ b/client/.node_version @@ -1 +1 @@ -18.12.1 +22.20.0 diff --git a/client/README.md b/client/README.md index 667eb23b05e478f542a1ee61350889fd505cdb46..afa67060c0c1f6269e52feaca915e97ce33a3cb4 100644 --- a/client/README.md +++ b/client/README.md @@ -122,6 +122,15 @@ utils](https://vue-test-utils.vuejs.org/) to mount individual components in a test bed and check them for rendered features. Please use jest-based mocking for isolating test functionality. +### Linting + +We use [Prettier](https://prettier.io/) to enforce code style and best +practices. Before submitting a pull request, run the following commands +as appropriate to ensure all the code is properly formatted: + + make client-lint + make client-format + ### Running the tests #### At Build-Time diff --git a/client/docs/avoid-using-global-Galaxy.md b/client/docs/avoid-using-global-Galaxy.md index 3092190ce5862aa0380f44722dc3ca714f15ae60..1a4bc92099f492f94512ff379f51b3465ec8571c 100644 --- a/client/docs/avoid-using-global-Galaxy.md +++ b/client/docs/avoid-using-global-Galaxy.md @@ -14,8 +14,8 @@ There are definitely use-cases where the Backbone models update over time and we value inside Vue. Instead of importing backbone models directly into Vue components, try building a backbone event listener that updates some relevant Vuex store. -- [Keeping Vuex in Sync with - Galaxy](https://github.com/galaxyproject/galaxy/blob/dev/client/src/store/syncVuexToGalaxy.js) +- [Keeping Vuex in Sync with + Galaxy](https://github.com/galaxyproject/galaxy/blob/dev/client/src/store/syncVuexToGalaxy.js) These issues should disappear over time as the all of the old client is rebuilt in the new ecosystem. diff --git a/client/docs/composables.md b/client/docs/composables.md index 25820697d8b542bdb2b608dadaddea6c0eac0688..f8208470057a8079e3845794ef1776e84a887a57 100644 --- a/client/docs/composables.md +++ b/client/docs/composables.md @@ -6,9 +6,9 @@ Using them effectively can make your code more reusable, decoupled, and easier t **More about Composables:** -- [Composables Overview](https://vuejs.org/guide/reusability/composables.html) -- [Composition API](https://vuejs.org/api/composition-api-setup.html) -- [\