├── .editorconfig ├── .gitattributes ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── action.yml ├── dist └── index.js ├── eslint.config.mjs ├── package.json ├── pnpm-lock.yaml ├── src ├── index.ts ├── install.ts ├── parse.ts └── resolve │ ├── git.ts │ └── registry.ts └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | dist/** -diff linguist-generated=true 2 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [main, next] 6 | pull_request: 7 | 8 | jobs: 9 | lint: 10 | name: Lint 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Checkout sources 15 | uses: actions/checkout@v4 16 | 17 | - name: Enable corepack 18 | run: corepack enable 19 | 20 | - name: Setup Node.js 20 21 | uses: actions/setup-node@v4 22 | with: 23 | node-version: 20 24 | cache: pnpm 25 | 26 | - name: Install dependencies 27 | run: pnpm install --frozen-lockfile 28 | 29 | - name: Check types 30 | run: pnpm run check 31 | 32 | - name: Lint 33 | run: pnpm run lint 34 | 35 | - name: Check format 36 | run: pnpm run format:check 37 | 38 | - name: Build action 39 | run: pnpm run package 40 | 41 | - name: Compare output 42 | run: | 43 | if [ "$(git diff --text --ignore-space-at-eol --ignore-cr-at-eol dist/ | wc -l)" -gt "0" ]; then 44 | echo "Detected uncommitted changes after build. See status below:" 45 | git diff --text --ignore-space-at-eol --ignore-cr-at-eol 46 | exit 1 47 | fi 48 | 49 | test-action: 50 | name: Test on ${{ matrix.runner }} 51 | runs-on: ${{ matrix.runner }} 52 | needs: [lint] 53 | 54 | strategy: 55 | matrix: 56 | runner: [ubuntu-latest, macos-latest, windows-latest] 57 | 58 | steps: 59 | - name: Checkout sources 60 | uses: actions/checkout@v4 61 | 62 | - name: Install cargo-hack (from crates.io) 63 | uses: ./ 64 | with: 65 | crate: cargo-hack 66 | version: ^0.4.4 67 | cache-key: test 68 | 69 | - name: Install cargo-sort (from git) 70 | uses: ./ 71 | with: 72 | crate: cargo-sort 73 | git: https://github.com/devinr528/cargo-sort 74 | tag: v1.0.9 75 | 76 | - name: Print cargo hack version 77 | run: cargo hack --version 78 | 79 | - name: Print cargo sort version 80 | run: cargo sort --version 81 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | lib/ 3 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [Unreleased] 9 | 10 | ## [3.3.0] - 2025-01-06 11 | 12 | ### Changed 13 | 14 | - Removed the job id from the cache key. This allows the same cache to be used 15 | across multiple jobs if the installation arguments are the same. 16 | - Improved the cache key generation logic. 17 | 18 | ## [3.2.0] - 2024-12-26 19 | 20 | ### Changed 21 | 22 | - Updated to `@actions/cache` v4 ([previous versions are 23 | deprecated](https://github.com/actions/toolkit/discussions/1890)). 24 | 25 | ## [3.1.1] - 2024-06-24 26 | 27 | ### Fixed 28 | 29 | - Pre-release versions are ignored when resolving the latest version. 30 | 31 | ## [3.1.0] - 2024-04-10 32 | 33 | ### Changed 34 | 35 | - Runner arch is included in the cache key. 36 | 37 | ### Fixed 38 | 39 | - Fix runner os version resolution on macOS runners. (issue #24) 40 | 41 | ## [3.0.1] - 2024-03-08 42 | 43 | ### Fixed 44 | 45 | - Improve git tag/branch resolution. (issue #22) 46 | 47 | ## [3.0.0] - 2024-02-01 48 | 49 | ### Added 50 | 51 | - Runner os version is included in the cache key. (issue #21) 52 | 53 | ### Changed 54 | 55 | - **Breaking:** The action now runs on Node.js 20. 56 | - Dependencies have been updated. 57 | 58 | ## [2.2.0] - 2023-09-07 59 | 60 | ### Added 61 | 62 | - Support alternative registries with the `registry` and `index` input 63 | parameters. 64 | 65 | ### Changed 66 | 67 | - Crate versions are fetched from the sparse index instead of the crates.io 68 | API. 69 | 70 | ## [2.1.0] - 2023-06-09 71 | 72 | ### Added 73 | 74 | - Git installation is now supported with the `git` input parameter. You can 75 | specify a branch, tag or commit hash. 76 | 77 | ## [2.0.0] - 2023-03-23 78 | 79 | ### Added 80 | 81 | - Name and version are shown in the cache key. This allow to identify cache 82 | entries in the cache management UI more easily. 83 | 84 | ### Changed 85 | 86 | - **Breaking:** The action now runs on Node.js 16. 87 | - **Breaking:** Versions without semver range (e.g. `1.2.3`) are now considered 88 | as exact versions. 89 | - **Breaking:** Set `--locked` by default. `locked` input is no longer 90 | deprecated. 91 | - Various code improvements and refactoring. 92 | 93 | ## [1.3.1] - 2023-02-15 94 | 95 | ### Fixed 96 | 97 | - Use `semver` instead of `compare-versions` to fix version resolution issues. 98 | - Dependencies have been updated. This removes the warning about `set-output` 99 | being deprecated. 100 | 101 | ## [1.3.0] - 2022-06-14 102 | 103 | ### Added 104 | 105 | - Add `args` input to add additional arguments to the `cargo install` command. 106 | 107 | ### Deprecated 108 | 109 | - `locked` input is deprecated, use the `args` input with `--locked` instead. 110 | 111 | ## [1.2.0] - 2022-03-16 112 | 113 | ### Added 114 | 115 | - Add `locked` input to add `--locked` argument to `cargo install` command. 116 | 117 | ### Changed 118 | 119 | - Dependencies have been updated. 120 | 121 | ## [1.1.0] - 2022-01-14 122 | 123 | ### Added 124 | 125 | - Add `cache-key` input to add a custom key to the automatic cache key. 126 | 127 | ## [1.0.1] - 2022-01-07 128 | 129 | ### Fixed 130 | 131 | - Errors when saving cache no longer cause the workflow to fail. 132 | 133 | ## [1.0.0] - 2021-11-21 134 | 135 | ### Added 136 | 137 | - Initial release of `cargo-install` action. 138 | 139 | [Unreleased]: https://github.com/baptiste0928/cargo-install/compare/v3.3.0...HEAD 140 | [3.3.0]: https://github.com/baptiste0928/cargo-install/compare/v3.2.0...v3.3.0 141 | [3.2.0]: https://github.com/baptiste0928/cargo-install/compare/v3.1.1...v3.2.0 142 | [3.1.1]: https://github.com/baptiste0928/cargo-install/compare/v3.1.0...v3.1.1 143 | [3.1.0]: https://github.com/baptiste0928/cargo-install/compare/v3.0.1...v3.1.0 144 | [3.0.1]: https://github.com/baptiste0928/cargo-install/compare/v3.0.0...v3.0.1 145 | [3.0.0]: https://github.com/baptiste0928/cargo-install/compare/v2.2.0...v3.0.0 146 | [2.2.0]: https://github.com/baptiste0928/cargo-install/compare/v2.1.0...v2.2.0 147 | [2.1.0]: https://github.com/baptiste0928/cargo-install/compare/v2.0.0...v2.1.0 148 | [2.0.0]: https://github.com/baptiste0928/cargo-install/compare/v1.3.1...v2.0.0 149 | [1.3.1]: https://github.com/baptiste0928/cargo-install/compare/v1.3.0...v1.3.1 150 | [1.3.0]: https://github.com/baptiste0928/cargo-install/compare/v1.2.0...v1.3.0 151 | [1.2.0]: https://github.com/baptiste0928/cargo-install/compare/v1.1.0...v1.2.0 152 | [1.1.0]: https://github.com/baptiste0928/cargo-install/compare/v1.0.1...v1.1.0 153 | [1.0.1]: https://github.com/baptiste0928/cargo-install/compare/v1.0.0...v1.0.1 154 | [1.0.0]: https://github.com/baptiste0928/cargo-install/releases/tag/v1.0.0 155 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | ISC License 2 | 3 | Copyright (c) 2021 Baptiste Girardeau 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted, provided that the above 7 | copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 10 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 12 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 14 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15 | PERFORMANCE OF THIS SOFTWARE. 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cargo install action 2 | 3 | ![GitHub release (latest by date)](https://img.shields.io/github/v/release/baptiste0928/cargo-install) 4 | [![CI](https://github.com/baptiste0928/cargo-install/actions/workflows/ci.yml/badge.svg)](https://github.com/baptiste0928/cargo-install/actions/workflows/ci.yml) 5 | 6 | > [!IMPORTANT] 7 | > 8 | > **Versions prior to v3.2 will stop working on February 1st, 2025**, due to 9 | > GitHub changing their cache service APIs. See the [`@actions/cache` 10 | > package deprecation notice](https://github.com/actions/toolkit/discussions/1890). 11 | 12 | A GitHub Action that runs `cargo install` and automatically caches the resulting binaries to speed up subsequent builds. 13 | 14 | ## Features 15 | 16 | - Install any Rust binary crate from [crates.io], git repositories or custom 17 | registries 18 | - Automatically cache binaries to avoid repeated compilations 19 | - Version range support to keep crates updated 20 | - Works on Linux, Windows and MacOS runners 21 | 22 | ## Usage 23 | 24 | The following example steps install the [`cargo-hack`] and [`cargo-sort`] 25 | crates. Read [Quickstart for GitHub Actions] to learn more about Actions usage. 26 | 27 | ```yaml 28 | - name: Install cargo-hack from crates.io 29 | uses: baptiste0928/cargo-install@v3 30 | with: 31 | crate: cargo-hack 32 | version: '^0.5' # optional semver range (defaults to latest) 33 | 34 | - name: Install cargo-sort from git 35 | uses: baptiste0928/cargo-install@v3 36 | with: 37 | crate: cargo-sort 38 | git: https://github.com/devinr528/cargo-sort 39 | tag: v1.0.9 # `branch` and `commit` are also supported 40 | 41 | - name: Run cargo hack 42 | run: cargo hack --version 43 | ``` 44 | 45 | If no version or branch/tag/commit is specified, the latest version will be 46 | installed. The `--locked` flag is added by default to avoid breakages due to 47 | unexpected dependencies updates. 48 | 49 | ### Input parameters 50 | 51 | - `crate` _(required)_: Name of the crate to install 52 | - `version`: Version to install, supports semver range (default: latest) 53 | - `features`: Space or comma-separated list of crate features to enable 54 | - `locked`: Adds `--locked` flag to (default: true) 55 | - `args`: Extra arguments for `cargo install` 56 | - `cache-key`: Custom string added to the cache key to force-invalidate the 57 | cache 58 | 59 | #### Git parameters 60 | 61 | When installing from a git repository, the `version` parameter is ignored. 62 | 63 | - `git`: URL of the git repository 64 | - `branch`: git branch to install from 65 | - `tag`: git tag to install from 66 | - `commit`/`rev`: commit hash to install from 67 | 68 | `branch`, `tag` and `commit`/`rev` are mutually exclusive. If none of them are 69 | specified, the latest commit of the default branch will be used. 70 | 71 | #### Custom registry parameters 72 | 73 | Version range resolution is only supported when using a sparse registry index with the `index` parameter. Otherwise, only exact versions can be used. 74 | 75 | - `index`: Registry index URL 76 | - `registry`: Registry name from the Cargo configuration (see 77 | [Using an alternate registry](https://doc.rust-lang.org/nightly/cargo/reference/registries.html#using-an-alternate-registry) on the Cargo Book) 78 | 79 | `registry` and `index` are mutually exclusive. 80 | 81 | ### Outputs 82 | 83 | - `version`: Installed crate version (or commit hash for git installations) 84 | - `cache-hit`: Boolean indicating whether the crate was restored from cache 85 | 86 | ## Caching 87 | 88 | Compiled binaries are cached in `~/.cargo-install/`. The cache key contains a hash derived from the installation context (command arguments and os version). 89 | 90 | Cache entries expire after 7 days of inactivity. For more details, see [GitHub's caching documentation](https://docs.github.com/en/actions/advanced-guides/caching-dependencies-to-speed-up-workflows). 91 | 92 | ## Security 93 | 94 | Installation is done using the `cargo` binary installed in the runner. 95 | 96 | When installing from [crates.io] or a custom sparse registry, the action 97 | resolves the latest version prior to installation. It is recommended to pin 98 | exact versions for sensitive workflows. 99 | 100 | If using a git repository, the action uses [`git ls-remote`] to resolve the 101 | commit hash. The repository is cloned by `cargo install`. 102 | 103 | ## Contributing 104 | 105 | There is no particular contribution guidelines, feel free to open a new PR to 106 | improve the code. If you want to introduce a new feature, please create an 107 | issue before. 108 | 109 | [changelog]: https://github.com/baptiste0928/cargo-install/releases/tag/v2.0.0 110 | [crates.io]: https://crates.io 111 | [`cargo-hack`]: https://crates.io/crates/cargo-hack 112 | [`cargo-sort`]: https://crates.io/crates/cargo-sort 113 | [`git ls-remote`]: https://git-scm.com/docs/git-ls-remote 114 | [Quickstart for GitHub Actions]: https://docs.github.com/en/actions/quickstart 115 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: 'cargo-install' 2 | description: 'GitHub action for cache-efficient Rust crates installation' 3 | inputs: 4 | # Global input parameters 5 | crate: 6 | description: 'Name of the crate to install' 7 | required: true 8 | features: 9 | description: 'Features of the crate to enable.' 10 | required: false 11 | locked: 12 | description: 'Use the crate Cargo.lock if available.' 13 | required: false 14 | default: 'true' 15 | args: 16 | description: 'Arguments added to the `cargo install` command.' 17 | required: false 18 | cache-key: 19 | description: 'Additional key added to the automatic cache key.' 20 | required: false 21 | 22 | # Registry installation 23 | version: 24 | description: 'Version of the crate to install.' 25 | required: true 26 | default: 'latest' 27 | registry: 28 | description: 'Registry to install the crate from.' 29 | required: false 30 | index: 31 | description: 'Registry index to install the crate from.' 32 | required: false 33 | 34 | # Git installation 35 | git: 36 | description: 'Git repository to install the crate from.' 37 | required: false 38 | branch: 39 | description: 'Branch to install the crate from.' 40 | required: false 41 | tag: 42 | description: 'Tag to install the crate from.' 43 | required: false 44 | commit: 45 | description: 'Commit to install the crate from.' 46 | required: false 47 | rev: # alias for commit 48 | description: 'Commit to install the crate from.' 49 | required: false 50 | 51 | outputs: 52 | version: 53 | description: 'The version of the crate that has been installed.' 54 | cache-hit: 55 | description: 'A boolean indicating whether the crate was restored from cache.' 56 | runs: 57 | using: 'node20' 58 | main: 'dist/index.js' 59 | branding: 60 | color: 'yellow' 61 | icon: 'package' 62 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import eslint from '@eslint/js'; 2 | import tseslint from 'typescript-eslint'; 3 | 4 | export default tseslint.config( 5 | eslint.configs.recommended, 6 | ...tseslint.configs.strict, 7 | ); 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cargo-install", 3 | "version": "3.3.0", 4 | "description": "GitHub action for cache-efficient Rust crates installation", 5 | "author": "baptiste0928", 6 | "license": "ISC", 7 | "packageManager": "pnpm@9.15.1", 8 | "scripts": { 9 | "check": "tsc", 10 | "lint": "eslint src", 11 | "format": "prettier . !pnpm-lock.yaml !dist --write", 12 | "format:check": "prettier . !pnpm-lock.yaml !dist --check", 13 | "package": "esbuild src/index.ts --bundle --platform=node --target=node20 --outfile=dist/index.js" 14 | }, 15 | "dependencies": { 16 | "@actions/cache": "^4.0.0", 17 | "@actions/core": "^1.11.1", 18 | "@actions/exec": "^1.1.1", 19 | "@actions/http-client": "^2.2.3", 20 | "@actions/io": "^1.1.3", 21 | "chalk": "^5.4.1", 22 | "semver": "^7.6.3", 23 | "string-argv": "^0.3.2", 24 | "valibot": "^0.33.3" 25 | }, 26 | "devDependencies": { 27 | "@types/node": "^20.17.10", 28 | "@types/semver": "^7.5.8", 29 | "esbuild": "^0.24.2", 30 | "eslint": "^9.17.0", 31 | "prettier": "^3.4.2", 32 | "prettier-plugin-organize-imports": "^4.1.0", 33 | "typescript": "^5.7.2", 34 | "typescript-eslint": "^8.18.2" 35 | }, 36 | "prettier": { 37 | "arrowParens": "avoid", 38 | "singleQuote": true, 39 | "plugins": [ 40 | "prettier-plugin-organize-imports" 41 | ] 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@actions/cache': 12 | specifier: ^4.0.0 13 | version: 4.0.0 14 | '@actions/core': 15 | specifier: ^1.11.1 16 | version: 1.11.1 17 | '@actions/exec': 18 | specifier: ^1.1.1 19 | version: 1.1.1 20 | '@actions/http-client': 21 | specifier: ^2.2.3 22 | version: 2.2.3 23 | '@actions/io': 24 | specifier: ^1.1.3 25 | version: 1.1.3 26 | chalk: 27 | specifier: ^5.4.1 28 | version: 5.4.1 29 | semver: 30 | specifier: ^7.6.3 31 | version: 7.6.3 32 | string-argv: 33 | specifier: ^0.3.2 34 | version: 0.3.2 35 | valibot: 36 | specifier: ^0.33.3 37 | version: 0.33.3 38 | devDependencies: 39 | '@types/node': 40 | specifier: ^20.17.10 41 | version: 20.17.10 42 | '@types/semver': 43 | specifier: ^7.5.8 44 | version: 7.5.8 45 | esbuild: 46 | specifier: ^0.24.2 47 | version: 0.24.2 48 | eslint: 49 | specifier: ^9.17.0 50 | version: 9.17.0 51 | prettier: 52 | specifier: ^3.4.2 53 | version: 3.4.2 54 | prettier-plugin-organize-imports: 55 | specifier: ^4.1.0 56 | version: 4.1.0(prettier@3.4.2)(typescript@5.7.2) 57 | typescript: 58 | specifier: ^5.7.2 59 | version: 5.7.2 60 | typescript-eslint: 61 | specifier: ^8.18.2 62 | version: 8.18.2(eslint@9.17.0)(typescript@5.7.2) 63 | 64 | packages: 65 | 66 | '@actions/cache@4.0.0': 67 | resolution: {integrity: sha512-WIuxjnZ44lNYtIS4fqSaYvF00hORdy3cSin+jx8xNgBVGWnNIAiCBHjlwusVQlcgExoQC9pHXGrDsZyZr7rCDQ==} 68 | 69 | '@actions/core@1.11.1': 70 | resolution: {integrity: sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==} 71 | 72 | '@actions/exec@1.1.1': 73 | resolution: {integrity: sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==} 74 | 75 | '@actions/glob@0.1.2': 76 | resolution: {integrity: sha512-SclLR7Ia5sEqjkJTPs7Sd86maMDw43p769YxBOxvPvEWuPEhpAnBsQfENOpXjFYMmhCqd127bmf+YdvJqVqR4A==} 77 | 78 | '@actions/http-client@2.2.3': 79 | resolution: {integrity: sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==} 80 | 81 | '@actions/io@1.1.3': 82 | resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} 83 | 84 | '@azure/abort-controller@1.1.0': 85 | resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} 86 | engines: {node: '>=12.0.0'} 87 | 88 | '@azure/abort-controller@2.1.2': 89 | resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} 90 | engines: {node: '>=18.0.0'} 91 | 92 | '@azure/core-auth@1.9.0': 93 | resolution: {integrity: sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==} 94 | engines: {node: '>=18.0.0'} 95 | 96 | '@azure/core-client@1.9.2': 97 | resolution: {integrity: sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==} 98 | engines: {node: '>=18.0.0'} 99 | 100 | '@azure/core-http-compat@2.1.2': 101 | resolution: {integrity: sha512-5MnV1yqzZwgNLLjlizsU3QqOeQChkIXw781Fwh1xdAqJR5AA32IUaq6xv1BICJvfbHoa+JYcaij2HFkhLbNTJQ==} 102 | engines: {node: '>=18.0.0'} 103 | 104 | '@azure/core-lro@2.7.2': 105 | resolution: {integrity: sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==} 106 | engines: {node: '>=18.0.0'} 107 | 108 | '@azure/core-paging@1.6.2': 109 | resolution: {integrity: sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==} 110 | engines: {node: '>=18.0.0'} 111 | 112 | '@azure/core-rest-pipeline@1.18.1': 113 | resolution: {integrity: sha512-/wS73UEDrxroUEVywEm7J0p2c+IIiVxyfigCGfsKvCxxCET4V/Hef2aURqltrXMRjNmdmt5IuOgIpl8f6xdO5A==} 114 | engines: {node: '>=18.0.0'} 115 | 116 | '@azure/core-tracing@1.2.0': 117 | resolution: {integrity: sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==} 118 | engines: {node: '>=18.0.0'} 119 | 120 | '@azure/core-util@1.11.0': 121 | resolution: {integrity: sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==} 122 | engines: {node: '>=18.0.0'} 123 | 124 | '@azure/core-xml@1.4.4': 125 | resolution: {integrity: sha512-J4FYAqakGXcbfeZjwjMzjNcpcH4E+JtEBv+xcV1yL0Ydn/6wbQfeFKTCHh9wttAi0lmajHw7yBbHPRG+YHckZQ==} 126 | engines: {node: '>=18.0.0'} 127 | 128 | '@azure/logger@1.1.4': 129 | resolution: {integrity: sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==} 130 | engines: {node: '>=18.0.0'} 131 | 132 | '@azure/ms-rest-js@2.7.0': 133 | resolution: {integrity: sha512-ngbzWbqF+NmztDOpLBVDxYM+XLcUj7nKhxGbSU9WtIsXfRB//cf2ZbAG5HkOrhU9/wd/ORRB6lM/d69RKVjiyA==} 134 | 135 | '@azure/storage-blob@12.26.0': 136 | resolution: {integrity: sha512-SriLPKezypIsiZ+TtlFfE46uuBIap2HeaQVS78e1P7rz5OSbq0rsd52WE1mC5f7vAeLiXqv7I7oRhL3WFZEw3Q==} 137 | engines: {node: '>=18.0.0'} 138 | 139 | '@esbuild/aix-ppc64@0.24.2': 140 | resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} 141 | engines: {node: '>=18'} 142 | cpu: [ppc64] 143 | os: [aix] 144 | 145 | '@esbuild/android-arm64@0.24.2': 146 | resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} 147 | engines: {node: '>=18'} 148 | cpu: [arm64] 149 | os: [android] 150 | 151 | '@esbuild/android-arm@0.24.2': 152 | resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} 153 | engines: {node: '>=18'} 154 | cpu: [arm] 155 | os: [android] 156 | 157 | '@esbuild/android-x64@0.24.2': 158 | resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} 159 | engines: {node: '>=18'} 160 | cpu: [x64] 161 | os: [android] 162 | 163 | '@esbuild/darwin-arm64@0.24.2': 164 | resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} 165 | engines: {node: '>=18'} 166 | cpu: [arm64] 167 | os: [darwin] 168 | 169 | '@esbuild/darwin-x64@0.24.2': 170 | resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} 171 | engines: {node: '>=18'} 172 | cpu: [x64] 173 | os: [darwin] 174 | 175 | '@esbuild/freebsd-arm64@0.24.2': 176 | resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} 177 | engines: {node: '>=18'} 178 | cpu: [arm64] 179 | os: [freebsd] 180 | 181 | '@esbuild/freebsd-x64@0.24.2': 182 | resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} 183 | engines: {node: '>=18'} 184 | cpu: [x64] 185 | os: [freebsd] 186 | 187 | '@esbuild/linux-arm64@0.24.2': 188 | resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} 189 | engines: {node: '>=18'} 190 | cpu: [arm64] 191 | os: [linux] 192 | 193 | '@esbuild/linux-arm@0.24.2': 194 | resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} 195 | engines: {node: '>=18'} 196 | cpu: [arm] 197 | os: [linux] 198 | 199 | '@esbuild/linux-ia32@0.24.2': 200 | resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} 201 | engines: {node: '>=18'} 202 | cpu: [ia32] 203 | os: [linux] 204 | 205 | '@esbuild/linux-loong64@0.24.2': 206 | resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} 207 | engines: {node: '>=18'} 208 | cpu: [loong64] 209 | os: [linux] 210 | 211 | '@esbuild/linux-mips64el@0.24.2': 212 | resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} 213 | engines: {node: '>=18'} 214 | cpu: [mips64el] 215 | os: [linux] 216 | 217 | '@esbuild/linux-ppc64@0.24.2': 218 | resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} 219 | engines: {node: '>=18'} 220 | cpu: [ppc64] 221 | os: [linux] 222 | 223 | '@esbuild/linux-riscv64@0.24.2': 224 | resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} 225 | engines: {node: '>=18'} 226 | cpu: [riscv64] 227 | os: [linux] 228 | 229 | '@esbuild/linux-s390x@0.24.2': 230 | resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} 231 | engines: {node: '>=18'} 232 | cpu: [s390x] 233 | os: [linux] 234 | 235 | '@esbuild/linux-x64@0.24.2': 236 | resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} 237 | engines: {node: '>=18'} 238 | cpu: [x64] 239 | os: [linux] 240 | 241 | '@esbuild/netbsd-arm64@0.24.2': 242 | resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} 243 | engines: {node: '>=18'} 244 | cpu: [arm64] 245 | os: [netbsd] 246 | 247 | '@esbuild/netbsd-x64@0.24.2': 248 | resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} 249 | engines: {node: '>=18'} 250 | cpu: [x64] 251 | os: [netbsd] 252 | 253 | '@esbuild/openbsd-arm64@0.24.2': 254 | resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} 255 | engines: {node: '>=18'} 256 | cpu: [arm64] 257 | os: [openbsd] 258 | 259 | '@esbuild/openbsd-x64@0.24.2': 260 | resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} 261 | engines: {node: '>=18'} 262 | cpu: [x64] 263 | os: [openbsd] 264 | 265 | '@esbuild/sunos-x64@0.24.2': 266 | resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} 267 | engines: {node: '>=18'} 268 | cpu: [x64] 269 | os: [sunos] 270 | 271 | '@esbuild/win32-arm64@0.24.2': 272 | resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} 273 | engines: {node: '>=18'} 274 | cpu: [arm64] 275 | os: [win32] 276 | 277 | '@esbuild/win32-ia32@0.24.2': 278 | resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} 279 | engines: {node: '>=18'} 280 | cpu: [ia32] 281 | os: [win32] 282 | 283 | '@esbuild/win32-x64@0.24.2': 284 | resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} 285 | engines: {node: '>=18'} 286 | cpu: [x64] 287 | os: [win32] 288 | 289 | '@eslint-community/eslint-utils@4.4.1': 290 | resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} 291 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 292 | peerDependencies: 293 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 294 | 295 | '@eslint-community/regexpp@4.12.1': 296 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 297 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 298 | 299 | '@eslint/config-array@0.19.1': 300 | resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} 301 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 302 | 303 | '@eslint/core@0.9.1': 304 | resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} 305 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 306 | 307 | '@eslint/eslintrc@3.2.0': 308 | resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} 309 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 310 | 311 | '@eslint/js@9.17.0': 312 | resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} 313 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 314 | 315 | '@eslint/object-schema@2.1.5': 316 | resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} 317 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 318 | 319 | '@eslint/plugin-kit@0.2.4': 320 | resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} 321 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 322 | 323 | '@fastify/busboy@2.1.1': 324 | resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} 325 | engines: {node: '>=14'} 326 | 327 | '@humanfs/core@0.19.1': 328 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 329 | engines: {node: '>=18.18.0'} 330 | 331 | '@humanfs/node@0.16.6': 332 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 333 | engines: {node: '>=18.18.0'} 334 | 335 | '@humanwhocodes/module-importer@1.0.1': 336 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 337 | engines: {node: '>=12.22'} 338 | 339 | '@humanwhocodes/retry@0.3.1': 340 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 341 | engines: {node: '>=18.18'} 342 | 343 | '@humanwhocodes/retry@0.4.1': 344 | resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} 345 | engines: {node: '>=18.18'} 346 | 347 | '@nodelib/fs.scandir@2.1.5': 348 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 349 | engines: {node: '>= 8'} 350 | 351 | '@nodelib/fs.stat@2.0.5': 352 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 353 | engines: {node: '>= 8'} 354 | 355 | '@nodelib/fs.walk@1.2.8': 356 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 357 | engines: {node: '>= 8'} 358 | 359 | '@protobuf-ts/plugin-framework@2.9.4': 360 | resolution: {integrity: sha512-9nuX1kjdMliv+Pes8dQCKyVhjKgNNfwxVHg+tx3fLXSfZZRcUHMc1PMwB9/vTvc6gBKt9QGz5ERqSqZc0++E9A==} 361 | 362 | '@protobuf-ts/plugin@2.9.4': 363 | resolution: {integrity: sha512-Db5Laq5T3mc6ERZvhIhkj1rn57/p8gbWiCKxQWbZBBl20wMuqKoHbRw4tuD7FyXi+IkwTToaNVXymv5CY3E8Rw==} 364 | hasBin: true 365 | 366 | '@protobuf-ts/protoc@2.9.4': 367 | resolution: {integrity: sha512-hQX+nOhFtrA+YdAXsXEDrLoGJqXHpgv4+BueYF0S9hy/Jq0VRTVlJS1Etmf4qlMt/WdigEes5LOd/LDzui4GIQ==} 368 | hasBin: true 369 | 370 | '@protobuf-ts/runtime-rpc@2.9.4': 371 | resolution: {integrity: sha512-y9L9JgnZxXFqH5vD4d7j9duWvIJ7AShyBRoNKJGhu9Q27qIbchfzli66H9RvrQNIFk5ER7z1Twe059WZGqERcA==} 372 | 373 | '@protobuf-ts/runtime@2.9.4': 374 | resolution: {integrity: sha512-vHRFWtJJB/SiogWDF0ypoKfRIZ41Kq+G9cEFj6Qm1eQaAhJ1LDFvgZ7Ja4tb3iLOQhz0PaoPnnOijF1qmEqTxg==} 375 | 376 | '@types/estree@1.0.6': 377 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 378 | 379 | '@types/json-schema@7.0.15': 380 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 381 | 382 | '@types/node@20.17.10': 383 | resolution: {integrity: sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==} 384 | 385 | '@types/semver@7.5.8': 386 | resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} 387 | 388 | '@typescript-eslint/eslint-plugin@8.18.2': 389 | resolution: {integrity: sha512-adig4SzPLjeQ0Tm+jvsozSGiCliI2ajeURDGHjZ2llnA+A67HihCQ+a3amtPhUakd1GlwHxSRvzOZktbEvhPPg==} 390 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 391 | peerDependencies: 392 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 393 | eslint: ^8.57.0 || ^9.0.0 394 | typescript: '>=4.8.4 <5.8.0' 395 | 396 | '@typescript-eslint/parser@8.18.2': 397 | resolution: {integrity: sha512-y7tcq4StgxQD4mDr9+Jb26dZ+HTZ/SkfqpXSiqeUXZHxOUyjWDKsmwKhJ0/tApR08DgOhrFAoAhyB80/p3ViuA==} 398 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 399 | peerDependencies: 400 | eslint: ^8.57.0 || ^9.0.0 401 | typescript: '>=4.8.4 <5.8.0' 402 | 403 | '@typescript-eslint/scope-manager@8.18.2': 404 | resolution: {integrity: sha512-YJFSfbd0CJjy14r/EvWapYgV4R5CHzptssoag2M7y3Ra7XNta6GPAJPPP5KGB9j14viYXyrzRO5GkX7CRfo8/g==} 405 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 406 | 407 | '@typescript-eslint/type-utils@8.18.2': 408 | resolution: {integrity: sha512-AB/Wr1Lz31bzHfGm/jgbFR0VB0SML/hd2P1yxzKDM48YmP7vbyJNHRExUE/wZsQj2wUCvbWH8poNHFuxLqCTnA==} 409 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 410 | peerDependencies: 411 | eslint: ^8.57.0 || ^9.0.0 412 | typescript: '>=4.8.4 <5.8.0' 413 | 414 | '@typescript-eslint/types@8.18.2': 415 | resolution: {integrity: sha512-Z/zblEPp8cIvmEn6+tPDIHUbRu/0z5lqZ+NvolL5SvXWT5rQy7+Nch83M0++XzO0XrWRFWECgOAyE8bsJTl1GQ==} 416 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 417 | 418 | '@typescript-eslint/typescript-estree@8.18.2': 419 | resolution: {integrity: sha512-WXAVt595HjpmlfH4crSdM/1bcsqh+1weFRWIa9XMTx/XHZ9TCKMcr725tLYqWOgzKdeDrqVHxFotrvWcEsk2Tg==} 420 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 421 | peerDependencies: 422 | typescript: '>=4.8.4 <5.8.0' 423 | 424 | '@typescript-eslint/utils@8.18.2': 425 | resolution: {integrity: sha512-Cr4A0H7DtVIPkauj4sTSXVl+VBWewE9/o40KcF3TV9aqDEOWoXF3/+oRXNby3DYzZeCATvbdksYsGZzplwnK/Q==} 426 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 427 | peerDependencies: 428 | eslint: ^8.57.0 || ^9.0.0 429 | typescript: '>=4.8.4 <5.8.0' 430 | 431 | '@typescript-eslint/visitor-keys@8.18.2': 432 | resolution: {integrity: sha512-zORcwn4C3trOWiCqFQP1x6G3xTRyZ1LYydnj51cRnJ6hxBlr/cKPckk+PKPUw/fXmvfKTcw7bwY3w9izgx5jZw==} 433 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 434 | 435 | abort-controller@3.0.0: 436 | resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} 437 | engines: {node: '>=6.5'} 438 | 439 | acorn-jsx@5.3.2: 440 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 441 | peerDependencies: 442 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 443 | 444 | acorn@8.14.0: 445 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 446 | engines: {node: '>=0.4.0'} 447 | hasBin: true 448 | 449 | agent-base@7.1.3: 450 | resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} 451 | engines: {node: '>= 14'} 452 | 453 | ajv@6.12.6: 454 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 455 | 456 | ansi-styles@4.3.0: 457 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 458 | engines: {node: '>=8'} 459 | 460 | argparse@2.0.1: 461 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 462 | 463 | asynckit@0.4.0: 464 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 465 | 466 | balanced-match@1.0.2: 467 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 468 | 469 | brace-expansion@1.1.11: 470 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 471 | 472 | brace-expansion@2.0.1: 473 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 474 | 475 | braces@3.0.3: 476 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 477 | engines: {node: '>=8'} 478 | 479 | callsites@3.1.0: 480 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 481 | engines: {node: '>=6'} 482 | 483 | camel-case@4.1.2: 484 | resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} 485 | 486 | chalk@4.1.2: 487 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 488 | engines: {node: '>=10'} 489 | 490 | chalk@5.4.1: 491 | resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} 492 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 493 | 494 | color-convert@2.0.1: 495 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 496 | engines: {node: '>=7.0.0'} 497 | 498 | color-name@1.1.4: 499 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 500 | 501 | combined-stream@1.0.8: 502 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 503 | engines: {node: '>= 0.8'} 504 | 505 | commander@6.2.1: 506 | resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} 507 | engines: {node: '>= 6'} 508 | 509 | concat-map@0.0.1: 510 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 511 | 512 | cross-spawn@7.0.6: 513 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 514 | engines: {node: '>= 8'} 515 | 516 | debug@4.4.0: 517 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 518 | engines: {node: '>=6.0'} 519 | peerDependencies: 520 | supports-color: '*' 521 | peerDependenciesMeta: 522 | supports-color: 523 | optional: true 524 | 525 | deep-is@0.1.4: 526 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 527 | 528 | delayed-stream@1.0.0: 529 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 530 | engines: {node: '>=0.4.0'} 531 | 532 | dot-object@2.1.5: 533 | resolution: {integrity: sha512-xHF8EP4XH/Ba9fvAF2LDd5O3IITVolerVV6xvkxoM8zlGEiCUrggpAnHyOoKJKCrhvPcGATFAUwIujj7bRG5UA==} 534 | hasBin: true 535 | 536 | esbuild@0.24.2: 537 | resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} 538 | engines: {node: '>=18'} 539 | hasBin: true 540 | 541 | escape-string-regexp@4.0.0: 542 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 543 | engines: {node: '>=10'} 544 | 545 | eslint-scope@8.2.0: 546 | resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} 547 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 548 | 549 | eslint-visitor-keys@3.4.3: 550 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 551 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 552 | 553 | eslint-visitor-keys@4.2.0: 554 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 555 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 556 | 557 | eslint@9.17.0: 558 | resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} 559 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 560 | hasBin: true 561 | peerDependencies: 562 | jiti: '*' 563 | peerDependenciesMeta: 564 | jiti: 565 | optional: true 566 | 567 | espree@10.3.0: 568 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 569 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 570 | 571 | esquery@1.6.0: 572 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 573 | engines: {node: '>=0.10'} 574 | 575 | esrecurse@4.3.0: 576 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 577 | engines: {node: '>=4.0'} 578 | 579 | estraverse@5.3.0: 580 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 581 | engines: {node: '>=4.0'} 582 | 583 | esutils@2.0.3: 584 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 585 | engines: {node: '>=0.10.0'} 586 | 587 | event-target-shim@5.0.1: 588 | resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} 589 | engines: {node: '>=6'} 590 | 591 | events@3.3.0: 592 | resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} 593 | engines: {node: '>=0.8.x'} 594 | 595 | fast-deep-equal@3.1.3: 596 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 597 | 598 | fast-glob@3.3.2: 599 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 600 | engines: {node: '>=8.6.0'} 601 | 602 | fast-json-stable-stringify@2.1.0: 603 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 604 | 605 | fast-levenshtein@2.0.6: 606 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 607 | 608 | fast-xml-parser@4.5.1: 609 | resolution: {integrity: sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w==} 610 | hasBin: true 611 | 612 | fastq@1.18.0: 613 | resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} 614 | 615 | file-entry-cache@8.0.0: 616 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 617 | engines: {node: '>=16.0.0'} 618 | 619 | fill-range@7.1.1: 620 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 621 | engines: {node: '>=8'} 622 | 623 | find-up@5.0.0: 624 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 625 | engines: {node: '>=10'} 626 | 627 | flat-cache@4.0.1: 628 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 629 | engines: {node: '>=16'} 630 | 631 | flatted@3.3.2: 632 | resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} 633 | 634 | form-data@2.5.2: 635 | resolution: {integrity: sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==} 636 | engines: {node: '>= 0.12'} 637 | 638 | fs.realpath@1.0.0: 639 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 640 | 641 | glob-parent@5.1.2: 642 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 643 | engines: {node: '>= 6'} 644 | 645 | glob-parent@6.0.2: 646 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 647 | engines: {node: '>=10.13.0'} 648 | 649 | glob@7.2.3: 650 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 651 | deprecated: Glob versions prior to v9 are no longer supported 652 | 653 | globals@14.0.0: 654 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 655 | engines: {node: '>=18'} 656 | 657 | graphemer@1.4.0: 658 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 659 | 660 | has-flag@4.0.0: 661 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 662 | engines: {node: '>=8'} 663 | 664 | http-proxy-agent@7.0.2: 665 | resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} 666 | engines: {node: '>= 14'} 667 | 668 | https-proxy-agent@7.0.6: 669 | resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} 670 | engines: {node: '>= 14'} 671 | 672 | ignore@5.3.2: 673 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 674 | engines: {node: '>= 4'} 675 | 676 | import-fresh@3.3.0: 677 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 678 | engines: {node: '>=6'} 679 | 680 | imurmurhash@0.1.4: 681 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 682 | engines: {node: '>=0.8.19'} 683 | 684 | inflight@1.0.6: 685 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 686 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 687 | 688 | inherits@2.0.4: 689 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 690 | 691 | is-extglob@2.1.1: 692 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 693 | engines: {node: '>=0.10.0'} 694 | 695 | is-glob@4.0.3: 696 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 697 | engines: {node: '>=0.10.0'} 698 | 699 | is-number@7.0.0: 700 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 701 | engines: {node: '>=0.12.0'} 702 | 703 | isexe@2.0.0: 704 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 705 | 706 | js-yaml@4.1.0: 707 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 708 | hasBin: true 709 | 710 | json-buffer@3.0.1: 711 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 712 | 713 | json-schema-traverse@0.4.1: 714 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 715 | 716 | json-stable-stringify-without-jsonify@1.0.1: 717 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 718 | 719 | keyv@4.5.4: 720 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 721 | 722 | levn@0.4.1: 723 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 724 | engines: {node: '>= 0.8.0'} 725 | 726 | locate-path@6.0.0: 727 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 728 | engines: {node: '>=10'} 729 | 730 | lodash.merge@4.6.2: 731 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 732 | 733 | lodash@4.17.21: 734 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 735 | 736 | lower-case@2.0.2: 737 | resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 738 | 739 | merge2@1.4.1: 740 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 741 | engines: {node: '>= 8'} 742 | 743 | micromatch@4.0.8: 744 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 745 | engines: {node: '>=8.6'} 746 | 747 | mime-db@1.52.0: 748 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 749 | engines: {node: '>= 0.6'} 750 | 751 | mime-types@2.1.35: 752 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 753 | engines: {node: '>= 0.6'} 754 | 755 | minimatch@3.1.2: 756 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 757 | 758 | minimatch@9.0.5: 759 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 760 | engines: {node: '>=16 || 14 >=14.17'} 761 | 762 | ms@2.1.3: 763 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 764 | 765 | natural-compare@1.4.0: 766 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 767 | 768 | no-case@3.0.4: 769 | resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} 770 | 771 | node-fetch@2.7.0: 772 | resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 773 | engines: {node: 4.x || >=6.0.0} 774 | peerDependencies: 775 | encoding: ^0.1.0 776 | peerDependenciesMeta: 777 | encoding: 778 | optional: true 779 | 780 | once@1.4.0: 781 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 782 | 783 | optionator@0.9.4: 784 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 785 | engines: {node: '>= 0.8.0'} 786 | 787 | p-limit@3.1.0: 788 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 789 | engines: {node: '>=10'} 790 | 791 | p-locate@5.0.0: 792 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 793 | engines: {node: '>=10'} 794 | 795 | parent-module@1.0.1: 796 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 797 | engines: {node: '>=6'} 798 | 799 | pascal-case@3.1.2: 800 | resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} 801 | 802 | path-exists@4.0.0: 803 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 804 | engines: {node: '>=8'} 805 | 806 | path-is-absolute@1.0.1: 807 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 808 | engines: {node: '>=0.10.0'} 809 | 810 | path-key@3.1.1: 811 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 812 | engines: {node: '>=8'} 813 | 814 | path-to-regexp@6.3.0: 815 | resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} 816 | 817 | picomatch@2.3.1: 818 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 819 | engines: {node: '>=8.6'} 820 | 821 | prelude-ls@1.2.1: 822 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 823 | engines: {node: '>= 0.8.0'} 824 | 825 | prettier-plugin-organize-imports@4.1.0: 826 | resolution: {integrity: sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==} 827 | peerDependencies: 828 | prettier: '>=2.0' 829 | typescript: '>=2.9' 830 | vue-tsc: ^2.1.0 831 | peerDependenciesMeta: 832 | vue-tsc: 833 | optional: true 834 | 835 | prettier@2.8.8: 836 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 837 | engines: {node: '>=10.13.0'} 838 | hasBin: true 839 | 840 | prettier@3.4.2: 841 | resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} 842 | engines: {node: '>=14'} 843 | hasBin: true 844 | 845 | punycode@2.3.1: 846 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 847 | engines: {node: '>=6'} 848 | 849 | queue-microtask@1.2.3: 850 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 851 | 852 | resolve-from@4.0.0: 853 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 854 | engines: {node: '>=4'} 855 | 856 | reusify@1.0.4: 857 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 858 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 859 | 860 | run-parallel@1.2.0: 861 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 862 | 863 | safe-buffer@5.2.1: 864 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 865 | 866 | sax@1.4.1: 867 | resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} 868 | 869 | semver@6.3.1: 870 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 871 | hasBin: true 872 | 873 | semver@7.6.3: 874 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 875 | engines: {node: '>=10'} 876 | hasBin: true 877 | 878 | shebang-command@2.0.0: 879 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 880 | engines: {node: '>=8'} 881 | 882 | shebang-regex@3.0.0: 883 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 884 | engines: {node: '>=8'} 885 | 886 | string-argv@0.3.2: 887 | resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} 888 | engines: {node: '>=0.6.19'} 889 | 890 | strip-json-comments@3.1.1: 891 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 892 | engines: {node: '>=8'} 893 | 894 | strnum@1.0.5: 895 | resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} 896 | 897 | supports-color@7.2.0: 898 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 899 | engines: {node: '>=8'} 900 | 901 | to-regex-range@5.0.1: 902 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 903 | engines: {node: '>=8.0'} 904 | 905 | tr46@0.0.3: 906 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 907 | 908 | ts-api-utils@1.4.3: 909 | resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} 910 | engines: {node: '>=16'} 911 | peerDependencies: 912 | typescript: '>=4.2.0' 913 | 914 | ts-poet@4.15.0: 915 | resolution: {integrity: sha512-sLLR8yQBvHzi9d4R1F4pd+AzQxBfzOSSjfxiJxQhkUoH5bL7RsAC6wgvtVUQdGqiCsyS9rT6/8X2FI7ipdir5g==} 916 | 917 | tslib@1.14.1: 918 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 919 | 920 | tslib@2.8.1: 921 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 922 | 923 | tunnel@0.0.6: 924 | resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} 925 | engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} 926 | 927 | twirp-ts@2.5.0: 928 | resolution: {integrity: sha512-JTKIK5Pf/+3qCrmYDFlqcPPUx+ohEWKBaZy8GL8TmvV2VvC0SXVyNYILO39+GCRbqnuP6hBIF+BVr8ZxRz+6fw==} 929 | hasBin: true 930 | peerDependencies: 931 | '@protobuf-ts/plugin': ^2.5.0 932 | ts-proto: ^1.81.3 933 | peerDependenciesMeta: 934 | '@protobuf-ts/plugin': 935 | optional: true 936 | ts-proto: 937 | optional: true 938 | 939 | type-check@0.4.0: 940 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 941 | engines: {node: '>= 0.8.0'} 942 | 943 | typescript-eslint@8.18.2: 944 | resolution: {integrity: sha512-KuXezG6jHkvC3MvizeXgupZzaG5wjhU3yE8E7e6viOvAvD9xAWYp8/vy0WULTGe9DYDWcQu7aW03YIV3mSitrQ==} 945 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 946 | peerDependencies: 947 | eslint: ^8.57.0 || ^9.0.0 948 | typescript: '>=4.8.4 <5.8.0' 949 | 950 | typescript@3.9.10: 951 | resolution: {integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==} 952 | engines: {node: '>=4.2.0'} 953 | hasBin: true 954 | 955 | typescript@5.7.2: 956 | resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} 957 | engines: {node: '>=14.17'} 958 | hasBin: true 959 | 960 | undici-types@6.19.8: 961 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 962 | 963 | undici@5.28.4: 964 | resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} 965 | engines: {node: '>=14.0'} 966 | 967 | uri-js@4.4.1: 968 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 969 | 970 | uuid@8.3.2: 971 | resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} 972 | hasBin: true 973 | 974 | valibot@0.33.3: 975 | resolution: {integrity: sha512-/fuY1DlX8uiQ7aphlzrrI2DbG0YJk84JMgvz2qKpUIdXRNsS53varfo4voPjSrjUr5BSV2K0miSEJUOlA5fQFg==} 976 | 977 | webidl-conversions@3.0.1: 978 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 979 | 980 | whatwg-url@5.0.0: 981 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 982 | 983 | which@2.0.2: 984 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 985 | engines: {node: '>= 8'} 986 | hasBin: true 987 | 988 | word-wrap@1.2.5: 989 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 990 | engines: {node: '>=0.10.0'} 991 | 992 | wrappy@1.0.2: 993 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 994 | 995 | xml2js@0.5.0: 996 | resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} 997 | engines: {node: '>=4.0.0'} 998 | 999 | xmlbuilder@11.0.1: 1000 | resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} 1001 | engines: {node: '>=4.0'} 1002 | 1003 | yaml@1.10.2: 1004 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 1005 | engines: {node: '>= 6'} 1006 | 1007 | yocto-queue@0.1.0: 1008 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1009 | engines: {node: '>=10'} 1010 | 1011 | snapshots: 1012 | 1013 | '@actions/cache@4.0.0': 1014 | dependencies: 1015 | '@actions/core': 1.11.1 1016 | '@actions/exec': 1.1.1 1017 | '@actions/glob': 0.1.2 1018 | '@actions/http-client': 2.2.3 1019 | '@actions/io': 1.1.3 1020 | '@azure/abort-controller': 1.1.0 1021 | '@azure/ms-rest-js': 2.7.0 1022 | '@azure/storage-blob': 12.26.0 1023 | '@protobuf-ts/plugin': 2.9.4 1024 | semver: 6.3.1 1025 | twirp-ts: 2.5.0(@protobuf-ts/plugin@2.9.4) 1026 | transitivePeerDependencies: 1027 | - encoding 1028 | - supports-color 1029 | - ts-proto 1030 | 1031 | '@actions/core@1.11.1': 1032 | dependencies: 1033 | '@actions/exec': 1.1.1 1034 | '@actions/http-client': 2.2.3 1035 | 1036 | '@actions/exec@1.1.1': 1037 | dependencies: 1038 | '@actions/io': 1.1.3 1039 | 1040 | '@actions/glob@0.1.2': 1041 | dependencies: 1042 | '@actions/core': 1.11.1 1043 | minimatch: 3.1.2 1044 | 1045 | '@actions/http-client@2.2.3': 1046 | dependencies: 1047 | tunnel: 0.0.6 1048 | undici: 5.28.4 1049 | 1050 | '@actions/io@1.1.3': {} 1051 | 1052 | '@azure/abort-controller@1.1.0': 1053 | dependencies: 1054 | tslib: 2.8.1 1055 | 1056 | '@azure/abort-controller@2.1.2': 1057 | dependencies: 1058 | tslib: 2.8.1 1059 | 1060 | '@azure/core-auth@1.9.0': 1061 | dependencies: 1062 | '@azure/abort-controller': 2.1.2 1063 | '@azure/core-util': 1.11.0 1064 | tslib: 2.8.1 1065 | 1066 | '@azure/core-client@1.9.2': 1067 | dependencies: 1068 | '@azure/abort-controller': 2.1.2 1069 | '@azure/core-auth': 1.9.0 1070 | '@azure/core-rest-pipeline': 1.18.1 1071 | '@azure/core-tracing': 1.2.0 1072 | '@azure/core-util': 1.11.0 1073 | '@azure/logger': 1.1.4 1074 | tslib: 2.8.1 1075 | transitivePeerDependencies: 1076 | - supports-color 1077 | 1078 | '@azure/core-http-compat@2.1.2': 1079 | dependencies: 1080 | '@azure/abort-controller': 2.1.2 1081 | '@azure/core-client': 1.9.2 1082 | '@azure/core-rest-pipeline': 1.18.1 1083 | transitivePeerDependencies: 1084 | - supports-color 1085 | 1086 | '@azure/core-lro@2.7.2': 1087 | dependencies: 1088 | '@azure/abort-controller': 2.1.2 1089 | '@azure/core-util': 1.11.0 1090 | '@azure/logger': 1.1.4 1091 | tslib: 2.8.1 1092 | 1093 | '@azure/core-paging@1.6.2': 1094 | dependencies: 1095 | tslib: 2.8.1 1096 | 1097 | '@azure/core-rest-pipeline@1.18.1': 1098 | dependencies: 1099 | '@azure/abort-controller': 2.1.2 1100 | '@azure/core-auth': 1.9.0 1101 | '@azure/core-tracing': 1.2.0 1102 | '@azure/core-util': 1.11.0 1103 | '@azure/logger': 1.1.4 1104 | http-proxy-agent: 7.0.2 1105 | https-proxy-agent: 7.0.6 1106 | tslib: 2.8.1 1107 | transitivePeerDependencies: 1108 | - supports-color 1109 | 1110 | '@azure/core-tracing@1.2.0': 1111 | dependencies: 1112 | tslib: 2.8.1 1113 | 1114 | '@azure/core-util@1.11.0': 1115 | dependencies: 1116 | '@azure/abort-controller': 2.1.2 1117 | tslib: 2.8.1 1118 | 1119 | '@azure/core-xml@1.4.4': 1120 | dependencies: 1121 | fast-xml-parser: 4.5.1 1122 | tslib: 2.8.1 1123 | 1124 | '@azure/logger@1.1.4': 1125 | dependencies: 1126 | tslib: 2.8.1 1127 | 1128 | '@azure/ms-rest-js@2.7.0': 1129 | dependencies: 1130 | '@azure/core-auth': 1.9.0 1131 | abort-controller: 3.0.0 1132 | form-data: 2.5.2 1133 | node-fetch: 2.7.0 1134 | tslib: 1.14.1 1135 | tunnel: 0.0.6 1136 | uuid: 8.3.2 1137 | xml2js: 0.5.0 1138 | transitivePeerDependencies: 1139 | - encoding 1140 | 1141 | '@azure/storage-blob@12.26.0': 1142 | dependencies: 1143 | '@azure/abort-controller': 2.1.2 1144 | '@azure/core-auth': 1.9.0 1145 | '@azure/core-client': 1.9.2 1146 | '@azure/core-http-compat': 2.1.2 1147 | '@azure/core-lro': 2.7.2 1148 | '@azure/core-paging': 1.6.2 1149 | '@azure/core-rest-pipeline': 1.18.1 1150 | '@azure/core-tracing': 1.2.0 1151 | '@azure/core-util': 1.11.0 1152 | '@azure/core-xml': 1.4.4 1153 | '@azure/logger': 1.1.4 1154 | events: 3.3.0 1155 | tslib: 2.8.1 1156 | transitivePeerDependencies: 1157 | - supports-color 1158 | 1159 | '@esbuild/aix-ppc64@0.24.2': 1160 | optional: true 1161 | 1162 | '@esbuild/android-arm64@0.24.2': 1163 | optional: true 1164 | 1165 | '@esbuild/android-arm@0.24.2': 1166 | optional: true 1167 | 1168 | '@esbuild/android-x64@0.24.2': 1169 | optional: true 1170 | 1171 | '@esbuild/darwin-arm64@0.24.2': 1172 | optional: true 1173 | 1174 | '@esbuild/darwin-x64@0.24.2': 1175 | optional: true 1176 | 1177 | '@esbuild/freebsd-arm64@0.24.2': 1178 | optional: true 1179 | 1180 | '@esbuild/freebsd-x64@0.24.2': 1181 | optional: true 1182 | 1183 | '@esbuild/linux-arm64@0.24.2': 1184 | optional: true 1185 | 1186 | '@esbuild/linux-arm@0.24.2': 1187 | optional: true 1188 | 1189 | '@esbuild/linux-ia32@0.24.2': 1190 | optional: true 1191 | 1192 | '@esbuild/linux-loong64@0.24.2': 1193 | optional: true 1194 | 1195 | '@esbuild/linux-mips64el@0.24.2': 1196 | optional: true 1197 | 1198 | '@esbuild/linux-ppc64@0.24.2': 1199 | optional: true 1200 | 1201 | '@esbuild/linux-riscv64@0.24.2': 1202 | optional: true 1203 | 1204 | '@esbuild/linux-s390x@0.24.2': 1205 | optional: true 1206 | 1207 | '@esbuild/linux-x64@0.24.2': 1208 | optional: true 1209 | 1210 | '@esbuild/netbsd-arm64@0.24.2': 1211 | optional: true 1212 | 1213 | '@esbuild/netbsd-x64@0.24.2': 1214 | optional: true 1215 | 1216 | '@esbuild/openbsd-arm64@0.24.2': 1217 | optional: true 1218 | 1219 | '@esbuild/openbsd-x64@0.24.2': 1220 | optional: true 1221 | 1222 | '@esbuild/sunos-x64@0.24.2': 1223 | optional: true 1224 | 1225 | '@esbuild/win32-arm64@0.24.2': 1226 | optional: true 1227 | 1228 | '@esbuild/win32-ia32@0.24.2': 1229 | optional: true 1230 | 1231 | '@esbuild/win32-x64@0.24.2': 1232 | optional: true 1233 | 1234 | '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0)': 1235 | dependencies: 1236 | eslint: 9.17.0 1237 | eslint-visitor-keys: 3.4.3 1238 | 1239 | '@eslint-community/regexpp@4.12.1': {} 1240 | 1241 | '@eslint/config-array@0.19.1': 1242 | dependencies: 1243 | '@eslint/object-schema': 2.1.5 1244 | debug: 4.4.0 1245 | minimatch: 3.1.2 1246 | transitivePeerDependencies: 1247 | - supports-color 1248 | 1249 | '@eslint/core@0.9.1': 1250 | dependencies: 1251 | '@types/json-schema': 7.0.15 1252 | 1253 | '@eslint/eslintrc@3.2.0': 1254 | dependencies: 1255 | ajv: 6.12.6 1256 | debug: 4.4.0 1257 | espree: 10.3.0 1258 | globals: 14.0.0 1259 | ignore: 5.3.2 1260 | import-fresh: 3.3.0 1261 | js-yaml: 4.1.0 1262 | minimatch: 3.1.2 1263 | strip-json-comments: 3.1.1 1264 | transitivePeerDependencies: 1265 | - supports-color 1266 | 1267 | '@eslint/js@9.17.0': {} 1268 | 1269 | '@eslint/object-schema@2.1.5': {} 1270 | 1271 | '@eslint/plugin-kit@0.2.4': 1272 | dependencies: 1273 | levn: 0.4.1 1274 | 1275 | '@fastify/busboy@2.1.1': {} 1276 | 1277 | '@humanfs/core@0.19.1': {} 1278 | 1279 | '@humanfs/node@0.16.6': 1280 | dependencies: 1281 | '@humanfs/core': 0.19.1 1282 | '@humanwhocodes/retry': 0.3.1 1283 | 1284 | '@humanwhocodes/module-importer@1.0.1': {} 1285 | 1286 | '@humanwhocodes/retry@0.3.1': {} 1287 | 1288 | '@humanwhocodes/retry@0.4.1': {} 1289 | 1290 | '@nodelib/fs.scandir@2.1.5': 1291 | dependencies: 1292 | '@nodelib/fs.stat': 2.0.5 1293 | run-parallel: 1.2.0 1294 | 1295 | '@nodelib/fs.stat@2.0.5': {} 1296 | 1297 | '@nodelib/fs.walk@1.2.8': 1298 | dependencies: 1299 | '@nodelib/fs.scandir': 2.1.5 1300 | fastq: 1.18.0 1301 | 1302 | '@protobuf-ts/plugin-framework@2.9.4': 1303 | dependencies: 1304 | '@protobuf-ts/runtime': 2.9.4 1305 | typescript: 3.9.10 1306 | 1307 | '@protobuf-ts/plugin@2.9.4': 1308 | dependencies: 1309 | '@protobuf-ts/plugin-framework': 2.9.4 1310 | '@protobuf-ts/protoc': 2.9.4 1311 | '@protobuf-ts/runtime': 2.9.4 1312 | '@protobuf-ts/runtime-rpc': 2.9.4 1313 | typescript: 3.9.10 1314 | 1315 | '@protobuf-ts/protoc@2.9.4': {} 1316 | 1317 | '@protobuf-ts/runtime-rpc@2.9.4': 1318 | dependencies: 1319 | '@protobuf-ts/runtime': 2.9.4 1320 | 1321 | '@protobuf-ts/runtime@2.9.4': {} 1322 | 1323 | '@types/estree@1.0.6': {} 1324 | 1325 | '@types/json-schema@7.0.15': {} 1326 | 1327 | '@types/node@20.17.10': 1328 | dependencies: 1329 | undici-types: 6.19.8 1330 | 1331 | '@types/semver@7.5.8': {} 1332 | 1333 | '@typescript-eslint/eslint-plugin@8.18.2(@typescript-eslint/parser@8.18.2(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2)': 1334 | dependencies: 1335 | '@eslint-community/regexpp': 4.12.1 1336 | '@typescript-eslint/parser': 8.18.2(eslint@9.17.0)(typescript@5.7.2) 1337 | '@typescript-eslint/scope-manager': 8.18.2 1338 | '@typescript-eslint/type-utils': 8.18.2(eslint@9.17.0)(typescript@5.7.2) 1339 | '@typescript-eslint/utils': 8.18.2(eslint@9.17.0)(typescript@5.7.2) 1340 | '@typescript-eslint/visitor-keys': 8.18.2 1341 | eslint: 9.17.0 1342 | graphemer: 1.4.0 1343 | ignore: 5.3.2 1344 | natural-compare: 1.4.0 1345 | ts-api-utils: 1.4.3(typescript@5.7.2) 1346 | typescript: 5.7.2 1347 | transitivePeerDependencies: 1348 | - supports-color 1349 | 1350 | '@typescript-eslint/parser@8.18.2(eslint@9.17.0)(typescript@5.7.2)': 1351 | dependencies: 1352 | '@typescript-eslint/scope-manager': 8.18.2 1353 | '@typescript-eslint/types': 8.18.2 1354 | '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) 1355 | '@typescript-eslint/visitor-keys': 8.18.2 1356 | debug: 4.4.0 1357 | eslint: 9.17.0 1358 | typescript: 5.7.2 1359 | transitivePeerDependencies: 1360 | - supports-color 1361 | 1362 | '@typescript-eslint/scope-manager@8.18.2': 1363 | dependencies: 1364 | '@typescript-eslint/types': 8.18.2 1365 | '@typescript-eslint/visitor-keys': 8.18.2 1366 | 1367 | '@typescript-eslint/type-utils@8.18.2(eslint@9.17.0)(typescript@5.7.2)': 1368 | dependencies: 1369 | '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) 1370 | '@typescript-eslint/utils': 8.18.2(eslint@9.17.0)(typescript@5.7.2) 1371 | debug: 4.4.0 1372 | eslint: 9.17.0 1373 | ts-api-utils: 1.4.3(typescript@5.7.2) 1374 | typescript: 5.7.2 1375 | transitivePeerDependencies: 1376 | - supports-color 1377 | 1378 | '@typescript-eslint/types@8.18.2': {} 1379 | 1380 | '@typescript-eslint/typescript-estree@8.18.2(typescript@5.7.2)': 1381 | dependencies: 1382 | '@typescript-eslint/types': 8.18.2 1383 | '@typescript-eslint/visitor-keys': 8.18.2 1384 | debug: 4.4.0 1385 | fast-glob: 3.3.2 1386 | is-glob: 4.0.3 1387 | minimatch: 9.0.5 1388 | semver: 7.6.3 1389 | ts-api-utils: 1.4.3(typescript@5.7.2) 1390 | typescript: 5.7.2 1391 | transitivePeerDependencies: 1392 | - supports-color 1393 | 1394 | '@typescript-eslint/utils@8.18.2(eslint@9.17.0)(typescript@5.7.2)': 1395 | dependencies: 1396 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) 1397 | '@typescript-eslint/scope-manager': 8.18.2 1398 | '@typescript-eslint/types': 8.18.2 1399 | '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) 1400 | eslint: 9.17.0 1401 | typescript: 5.7.2 1402 | transitivePeerDependencies: 1403 | - supports-color 1404 | 1405 | '@typescript-eslint/visitor-keys@8.18.2': 1406 | dependencies: 1407 | '@typescript-eslint/types': 8.18.2 1408 | eslint-visitor-keys: 4.2.0 1409 | 1410 | abort-controller@3.0.0: 1411 | dependencies: 1412 | event-target-shim: 5.0.1 1413 | 1414 | acorn-jsx@5.3.2(acorn@8.14.0): 1415 | dependencies: 1416 | acorn: 8.14.0 1417 | 1418 | acorn@8.14.0: {} 1419 | 1420 | agent-base@7.1.3: {} 1421 | 1422 | ajv@6.12.6: 1423 | dependencies: 1424 | fast-deep-equal: 3.1.3 1425 | fast-json-stable-stringify: 2.1.0 1426 | json-schema-traverse: 0.4.1 1427 | uri-js: 4.4.1 1428 | 1429 | ansi-styles@4.3.0: 1430 | dependencies: 1431 | color-convert: 2.0.1 1432 | 1433 | argparse@2.0.1: {} 1434 | 1435 | asynckit@0.4.0: {} 1436 | 1437 | balanced-match@1.0.2: {} 1438 | 1439 | brace-expansion@1.1.11: 1440 | dependencies: 1441 | balanced-match: 1.0.2 1442 | concat-map: 0.0.1 1443 | 1444 | brace-expansion@2.0.1: 1445 | dependencies: 1446 | balanced-match: 1.0.2 1447 | 1448 | braces@3.0.3: 1449 | dependencies: 1450 | fill-range: 7.1.1 1451 | 1452 | callsites@3.1.0: {} 1453 | 1454 | camel-case@4.1.2: 1455 | dependencies: 1456 | pascal-case: 3.1.2 1457 | tslib: 2.8.1 1458 | 1459 | chalk@4.1.2: 1460 | dependencies: 1461 | ansi-styles: 4.3.0 1462 | supports-color: 7.2.0 1463 | 1464 | chalk@5.4.1: {} 1465 | 1466 | color-convert@2.0.1: 1467 | dependencies: 1468 | color-name: 1.1.4 1469 | 1470 | color-name@1.1.4: {} 1471 | 1472 | combined-stream@1.0.8: 1473 | dependencies: 1474 | delayed-stream: 1.0.0 1475 | 1476 | commander@6.2.1: {} 1477 | 1478 | concat-map@0.0.1: {} 1479 | 1480 | cross-spawn@7.0.6: 1481 | dependencies: 1482 | path-key: 3.1.1 1483 | shebang-command: 2.0.0 1484 | which: 2.0.2 1485 | 1486 | debug@4.4.0: 1487 | dependencies: 1488 | ms: 2.1.3 1489 | 1490 | deep-is@0.1.4: {} 1491 | 1492 | delayed-stream@1.0.0: {} 1493 | 1494 | dot-object@2.1.5: 1495 | dependencies: 1496 | commander: 6.2.1 1497 | glob: 7.2.3 1498 | 1499 | esbuild@0.24.2: 1500 | optionalDependencies: 1501 | '@esbuild/aix-ppc64': 0.24.2 1502 | '@esbuild/android-arm': 0.24.2 1503 | '@esbuild/android-arm64': 0.24.2 1504 | '@esbuild/android-x64': 0.24.2 1505 | '@esbuild/darwin-arm64': 0.24.2 1506 | '@esbuild/darwin-x64': 0.24.2 1507 | '@esbuild/freebsd-arm64': 0.24.2 1508 | '@esbuild/freebsd-x64': 0.24.2 1509 | '@esbuild/linux-arm': 0.24.2 1510 | '@esbuild/linux-arm64': 0.24.2 1511 | '@esbuild/linux-ia32': 0.24.2 1512 | '@esbuild/linux-loong64': 0.24.2 1513 | '@esbuild/linux-mips64el': 0.24.2 1514 | '@esbuild/linux-ppc64': 0.24.2 1515 | '@esbuild/linux-riscv64': 0.24.2 1516 | '@esbuild/linux-s390x': 0.24.2 1517 | '@esbuild/linux-x64': 0.24.2 1518 | '@esbuild/netbsd-arm64': 0.24.2 1519 | '@esbuild/netbsd-x64': 0.24.2 1520 | '@esbuild/openbsd-arm64': 0.24.2 1521 | '@esbuild/openbsd-x64': 0.24.2 1522 | '@esbuild/sunos-x64': 0.24.2 1523 | '@esbuild/win32-arm64': 0.24.2 1524 | '@esbuild/win32-ia32': 0.24.2 1525 | '@esbuild/win32-x64': 0.24.2 1526 | 1527 | escape-string-regexp@4.0.0: {} 1528 | 1529 | eslint-scope@8.2.0: 1530 | dependencies: 1531 | esrecurse: 4.3.0 1532 | estraverse: 5.3.0 1533 | 1534 | eslint-visitor-keys@3.4.3: {} 1535 | 1536 | eslint-visitor-keys@4.2.0: {} 1537 | 1538 | eslint@9.17.0: 1539 | dependencies: 1540 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) 1541 | '@eslint-community/regexpp': 4.12.1 1542 | '@eslint/config-array': 0.19.1 1543 | '@eslint/core': 0.9.1 1544 | '@eslint/eslintrc': 3.2.0 1545 | '@eslint/js': 9.17.0 1546 | '@eslint/plugin-kit': 0.2.4 1547 | '@humanfs/node': 0.16.6 1548 | '@humanwhocodes/module-importer': 1.0.1 1549 | '@humanwhocodes/retry': 0.4.1 1550 | '@types/estree': 1.0.6 1551 | '@types/json-schema': 7.0.15 1552 | ajv: 6.12.6 1553 | chalk: 4.1.2 1554 | cross-spawn: 7.0.6 1555 | debug: 4.4.0 1556 | escape-string-regexp: 4.0.0 1557 | eslint-scope: 8.2.0 1558 | eslint-visitor-keys: 4.2.0 1559 | espree: 10.3.0 1560 | esquery: 1.6.0 1561 | esutils: 2.0.3 1562 | fast-deep-equal: 3.1.3 1563 | file-entry-cache: 8.0.0 1564 | find-up: 5.0.0 1565 | glob-parent: 6.0.2 1566 | ignore: 5.3.2 1567 | imurmurhash: 0.1.4 1568 | is-glob: 4.0.3 1569 | json-stable-stringify-without-jsonify: 1.0.1 1570 | lodash.merge: 4.6.2 1571 | minimatch: 3.1.2 1572 | natural-compare: 1.4.0 1573 | optionator: 0.9.4 1574 | transitivePeerDependencies: 1575 | - supports-color 1576 | 1577 | espree@10.3.0: 1578 | dependencies: 1579 | acorn: 8.14.0 1580 | acorn-jsx: 5.3.2(acorn@8.14.0) 1581 | eslint-visitor-keys: 4.2.0 1582 | 1583 | esquery@1.6.0: 1584 | dependencies: 1585 | estraverse: 5.3.0 1586 | 1587 | esrecurse@4.3.0: 1588 | dependencies: 1589 | estraverse: 5.3.0 1590 | 1591 | estraverse@5.3.0: {} 1592 | 1593 | esutils@2.0.3: {} 1594 | 1595 | event-target-shim@5.0.1: {} 1596 | 1597 | events@3.3.0: {} 1598 | 1599 | fast-deep-equal@3.1.3: {} 1600 | 1601 | fast-glob@3.3.2: 1602 | dependencies: 1603 | '@nodelib/fs.stat': 2.0.5 1604 | '@nodelib/fs.walk': 1.2.8 1605 | glob-parent: 5.1.2 1606 | merge2: 1.4.1 1607 | micromatch: 4.0.8 1608 | 1609 | fast-json-stable-stringify@2.1.0: {} 1610 | 1611 | fast-levenshtein@2.0.6: {} 1612 | 1613 | fast-xml-parser@4.5.1: 1614 | dependencies: 1615 | strnum: 1.0.5 1616 | 1617 | fastq@1.18.0: 1618 | dependencies: 1619 | reusify: 1.0.4 1620 | 1621 | file-entry-cache@8.0.0: 1622 | dependencies: 1623 | flat-cache: 4.0.1 1624 | 1625 | fill-range@7.1.1: 1626 | dependencies: 1627 | to-regex-range: 5.0.1 1628 | 1629 | find-up@5.0.0: 1630 | dependencies: 1631 | locate-path: 6.0.0 1632 | path-exists: 4.0.0 1633 | 1634 | flat-cache@4.0.1: 1635 | dependencies: 1636 | flatted: 3.3.2 1637 | keyv: 4.5.4 1638 | 1639 | flatted@3.3.2: {} 1640 | 1641 | form-data@2.5.2: 1642 | dependencies: 1643 | asynckit: 0.4.0 1644 | combined-stream: 1.0.8 1645 | mime-types: 2.1.35 1646 | safe-buffer: 5.2.1 1647 | 1648 | fs.realpath@1.0.0: {} 1649 | 1650 | glob-parent@5.1.2: 1651 | dependencies: 1652 | is-glob: 4.0.3 1653 | 1654 | glob-parent@6.0.2: 1655 | dependencies: 1656 | is-glob: 4.0.3 1657 | 1658 | glob@7.2.3: 1659 | dependencies: 1660 | fs.realpath: 1.0.0 1661 | inflight: 1.0.6 1662 | inherits: 2.0.4 1663 | minimatch: 3.1.2 1664 | once: 1.4.0 1665 | path-is-absolute: 1.0.1 1666 | 1667 | globals@14.0.0: {} 1668 | 1669 | graphemer@1.4.0: {} 1670 | 1671 | has-flag@4.0.0: {} 1672 | 1673 | http-proxy-agent@7.0.2: 1674 | dependencies: 1675 | agent-base: 7.1.3 1676 | debug: 4.4.0 1677 | transitivePeerDependencies: 1678 | - supports-color 1679 | 1680 | https-proxy-agent@7.0.6: 1681 | dependencies: 1682 | agent-base: 7.1.3 1683 | debug: 4.4.0 1684 | transitivePeerDependencies: 1685 | - supports-color 1686 | 1687 | ignore@5.3.2: {} 1688 | 1689 | import-fresh@3.3.0: 1690 | dependencies: 1691 | parent-module: 1.0.1 1692 | resolve-from: 4.0.0 1693 | 1694 | imurmurhash@0.1.4: {} 1695 | 1696 | inflight@1.0.6: 1697 | dependencies: 1698 | once: 1.4.0 1699 | wrappy: 1.0.2 1700 | 1701 | inherits@2.0.4: {} 1702 | 1703 | is-extglob@2.1.1: {} 1704 | 1705 | is-glob@4.0.3: 1706 | dependencies: 1707 | is-extglob: 2.1.1 1708 | 1709 | is-number@7.0.0: {} 1710 | 1711 | isexe@2.0.0: {} 1712 | 1713 | js-yaml@4.1.0: 1714 | dependencies: 1715 | argparse: 2.0.1 1716 | 1717 | json-buffer@3.0.1: {} 1718 | 1719 | json-schema-traverse@0.4.1: {} 1720 | 1721 | json-stable-stringify-without-jsonify@1.0.1: {} 1722 | 1723 | keyv@4.5.4: 1724 | dependencies: 1725 | json-buffer: 3.0.1 1726 | 1727 | levn@0.4.1: 1728 | dependencies: 1729 | prelude-ls: 1.2.1 1730 | type-check: 0.4.0 1731 | 1732 | locate-path@6.0.0: 1733 | dependencies: 1734 | p-locate: 5.0.0 1735 | 1736 | lodash.merge@4.6.2: {} 1737 | 1738 | lodash@4.17.21: {} 1739 | 1740 | lower-case@2.0.2: 1741 | dependencies: 1742 | tslib: 2.8.1 1743 | 1744 | merge2@1.4.1: {} 1745 | 1746 | micromatch@4.0.8: 1747 | dependencies: 1748 | braces: 3.0.3 1749 | picomatch: 2.3.1 1750 | 1751 | mime-db@1.52.0: {} 1752 | 1753 | mime-types@2.1.35: 1754 | dependencies: 1755 | mime-db: 1.52.0 1756 | 1757 | minimatch@3.1.2: 1758 | dependencies: 1759 | brace-expansion: 1.1.11 1760 | 1761 | minimatch@9.0.5: 1762 | dependencies: 1763 | brace-expansion: 2.0.1 1764 | 1765 | ms@2.1.3: {} 1766 | 1767 | natural-compare@1.4.0: {} 1768 | 1769 | no-case@3.0.4: 1770 | dependencies: 1771 | lower-case: 2.0.2 1772 | tslib: 2.8.1 1773 | 1774 | node-fetch@2.7.0: 1775 | dependencies: 1776 | whatwg-url: 5.0.0 1777 | 1778 | once@1.4.0: 1779 | dependencies: 1780 | wrappy: 1.0.2 1781 | 1782 | optionator@0.9.4: 1783 | dependencies: 1784 | deep-is: 0.1.4 1785 | fast-levenshtein: 2.0.6 1786 | levn: 0.4.1 1787 | prelude-ls: 1.2.1 1788 | type-check: 0.4.0 1789 | word-wrap: 1.2.5 1790 | 1791 | p-limit@3.1.0: 1792 | dependencies: 1793 | yocto-queue: 0.1.0 1794 | 1795 | p-locate@5.0.0: 1796 | dependencies: 1797 | p-limit: 3.1.0 1798 | 1799 | parent-module@1.0.1: 1800 | dependencies: 1801 | callsites: 3.1.0 1802 | 1803 | pascal-case@3.1.2: 1804 | dependencies: 1805 | no-case: 3.0.4 1806 | tslib: 2.8.1 1807 | 1808 | path-exists@4.0.0: {} 1809 | 1810 | path-is-absolute@1.0.1: {} 1811 | 1812 | path-key@3.1.1: {} 1813 | 1814 | path-to-regexp@6.3.0: {} 1815 | 1816 | picomatch@2.3.1: {} 1817 | 1818 | prelude-ls@1.2.1: {} 1819 | 1820 | prettier-plugin-organize-imports@4.1.0(prettier@3.4.2)(typescript@5.7.2): 1821 | dependencies: 1822 | prettier: 3.4.2 1823 | typescript: 5.7.2 1824 | 1825 | prettier@2.8.8: {} 1826 | 1827 | prettier@3.4.2: {} 1828 | 1829 | punycode@2.3.1: {} 1830 | 1831 | queue-microtask@1.2.3: {} 1832 | 1833 | resolve-from@4.0.0: {} 1834 | 1835 | reusify@1.0.4: {} 1836 | 1837 | run-parallel@1.2.0: 1838 | dependencies: 1839 | queue-microtask: 1.2.3 1840 | 1841 | safe-buffer@5.2.1: {} 1842 | 1843 | sax@1.4.1: {} 1844 | 1845 | semver@6.3.1: {} 1846 | 1847 | semver@7.6.3: {} 1848 | 1849 | shebang-command@2.0.0: 1850 | dependencies: 1851 | shebang-regex: 3.0.0 1852 | 1853 | shebang-regex@3.0.0: {} 1854 | 1855 | string-argv@0.3.2: {} 1856 | 1857 | strip-json-comments@3.1.1: {} 1858 | 1859 | strnum@1.0.5: {} 1860 | 1861 | supports-color@7.2.0: 1862 | dependencies: 1863 | has-flag: 4.0.0 1864 | 1865 | to-regex-range@5.0.1: 1866 | dependencies: 1867 | is-number: 7.0.0 1868 | 1869 | tr46@0.0.3: {} 1870 | 1871 | ts-api-utils@1.4.3(typescript@5.7.2): 1872 | dependencies: 1873 | typescript: 5.7.2 1874 | 1875 | ts-poet@4.15.0: 1876 | dependencies: 1877 | lodash: 4.17.21 1878 | prettier: 2.8.8 1879 | 1880 | tslib@1.14.1: {} 1881 | 1882 | tslib@2.8.1: {} 1883 | 1884 | tunnel@0.0.6: {} 1885 | 1886 | twirp-ts@2.5.0(@protobuf-ts/plugin@2.9.4): 1887 | dependencies: 1888 | '@protobuf-ts/plugin-framework': 2.9.4 1889 | camel-case: 4.1.2 1890 | dot-object: 2.1.5 1891 | path-to-regexp: 6.3.0 1892 | ts-poet: 4.15.0 1893 | yaml: 1.10.2 1894 | optionalDependencies: 1895 | '@protobuf-ts/plugin': 2.9.4 1896 | 1897 | type-check@0.4.0: 1898 | dependencies: 1899 | prelude-ls: 1.2.1 1900 | 1901 | typescript-eslint@8.18.2(eslint@9.17.0)(typescript@5.7.2): 1902 | dependencies: 1903 | '@typescript-eslint/eslint-plugin': 8.18.2(@typescript-eslint/parser@8.18.2(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2) 1904 | '@typescript-eslint/parser': 8.18.2(eslint@9.17.0)(typescript@5.7.2) 1905 | '@typescript-eslint/utils': 8.18.2(eslint@9.17.0)(typescript@5.7.2) 1906 | eslint: 9.17.0 1907 | typescript: 5.7.2 1908 | transitivePeerDependencies: 1909 | - supports-color 1910 | 1911 | typescript@3.9.10: {} 1912 | 1913 | typescript@5.7.2: {} 1914 | 1915 | undici-types@6.19.8: {} 1916 | 1917 | undici@5.28.4: 1918 | dependencies: 1919 | '@fastify/busboy': 2.1.1 1920 | 1921 | uri-js@4.4.1: 1922 | dependencies: 1923 | punycode: 2.3.1 1924 | 1925 | uuid@8.3.2: {} 1926 | 1927 | valibot@0.33.3: {} 1928 | 1929 | webidl-conversions@3.0.1: {} 1930 | 1931 | whatwg-url@5.0.0: 1932 | dependencies: 1933 | tr46: 0.0.3 1934 | webidl-conversions: 3.0.1 1935 | 1936 | which@2.0.2: 1937 | dependencies: 1938 | isexe: 2.0.0 1939 | 1940 | word-wrap@1.2.5: {} 1941 | 1942 | wrappy@1.0.2: {} 1943 | 1944 | xml2js@0.5.0: 1945 | dependencies: 1946 | sax: 1.4.1 1947 | xmlbuilder: 11.0.1 1948 | 1949 | xmlbuilder@11.0.1: {} 1950 | 1951 | yaml@1.10.2: {} 1952 | 1953 | yocto-queue@0.1.0: {} 1954 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import * as cache from '@actions/cache'; 2 | import * as core from '@actions/core'; 3 | import * as exec from '@actions/exec'; 4 | import * as io from '@actions/io'; 5 | 6 | import { Chalk } from 'chalk'; 7 | import path from 'node:path'; 8 | 9 | import { type ResolvedVersion, getInstallSettings } from './install'; 10 | import { parseInput } from './parse'; 11 | import { resolveGitCommit } from './resolve/git'; 12 | import { resolveRegistryVersion } from './resolve/registry'; 13 | 14 | const chalk = new Chalk({ level: 3 }); 15 | 16 | async function run(): Promise { 17 | const input = parseInput(); 18 | 19 | // Resolve crate version and try to restore from cache 20 | core.startGroup(chalk.bold(`Installing ${input.crate}...`)); 21 | const version: ResolvedVersion = 22 | input.source.type === 'registry' 23 | ? await resolveRegistryVersion(input.crate, input.source) 24 | : await resolveGitCommit(input.source); 25 | 26 | const install = await getInstallSettings(input, version); 27 | core.info('Installation settings:'); 28 | if ('version' in version) { 29 | core.info(` version: ${version.version}`); 30 | } else { 31 | core.info(` repository: ${version.repository}`); 32 | core.info(` commit: ${version.commit}`); 33 | } 34 | core.info(` path: ${install.path}`); 35 | core.info(` key: ${install.cacheKey}`); 36 | core.info(` command: cargo ${install.args.join(' ')}`); 37 | 38 | await io.mkdirP(install.path); 39 | const restored = await cache.restoreCache([install.path], install.cacheKey); 40 | core.endGroup(); 41 | 42 | // Check if the crate has been restored from cache 43 | let cacheHit = false; 44 | if (restored !== undefined) { 45 | core.info(`Restored ${input.crate} from cache.`); 46 | cacheHit = true; 47 | } else { 48 | // Install the crate if it wasn't restored from cache 49 | core.startGroup( 50 | `No cached version found, installing ${input.crate} using cargo...`, 51 | ); 52 | await exec.exec('cargo', install.args); 53 | 54 | try { 55 | await cache.saveCache([install.path], install.cacheKey); 56 | } catch (error) { 57 | if (error instanceof Error) { 58 | core.warning(error.message); 59 | } else { 60 | core.warning('An unknown error occurred while saving the cache.'); 61 | } 62 | } 63 | 64 | core.endGroup(); 65 | } 66 | 67 | // Add the crate's binary directory to PATH 68 | core.addPath(path.join(install.path, 'bin')); 69 | core.info(`Added ${install.path}/bin to PATH.`); 70 | 71 | if ('version' in version) { 72 | core.info(chalk.green(`Installed ${input.crate} ${version.version}.`)); 73 | } else { 74 | core.info( 75 | chalk.green( 76 | `Installed ${input.crate} from ${version.repository} at ${version.commit.slice(0, 7)}.`, 77 | ), 78 | ); 79 | } 80 | 81 | core.setOutput( 82 | 'version', 83 | 'version' in version ? version.version : version.commit, 84 | ); 85 | core.setOutput('cache-hit', cacheHit); 86 | } 87 | 88 | run().catch(error => { 89 | core.setFailed(error.message); 90 | core.info(error.stack); 91 | }); 92 | -------------------------------------------------------------------------------- /src/install.ts: -------------------------------------------------------------------------------- 1 | import * as core from '@actions/core'; 2 | import * as exec from '@actions/exec'; 3 | import crypto from 'node:crypto'; 4 | import path from 'node:path'; 5 | 6 | import type { ActionInput } from './parse'; 7 | 8 | export type ResolvedVersion = 9 | | { version: string } 10 | | { repository: string; commit: string }; 11 | 12 | export interface InstallSettings { 13 | path: string; 14 | args: string[]; 15 | cacheKey: string; 16 | } 17 | 18 | // Get the installation settings for the crate (path, arguments and cache key) 19 | export async function getInstallSettings( 20 | input: ActionInput, 21 | version: ResolvedVersion, 22 | ): Promise { 23 | const homePath = process.env.HOME ?? process.env.USERPROFILE; 24 | 25 | if (homePath === undefined || homePath === '') { 26 | core.setFailed('Could not determine home directory'); 27 | process.exit(1); 28 | } 29 | 30 | const installPath = path.join(homePath, '.cargo-install', input.crate); 31 | const args = getInstallArgs(input, version, installPath); 32 | const cacheKey = await getCacheKey(input, version, args); 33 | 34 | return { 35 | path: installPath, 36 | args, 37 | cacheKey, 38 | }; 39 | } 40 | 41 | // Generate the arguments that will be passed to `cargo` to install the crate. 42 | function getInstallArgs( 43 | input: ActionInput, 44 | version: ResolvedVersion, 45 | installPath: string, 46 | ): string[] { 47 | let args = ['install', input.crate, '--force', '--root', installPath]; 48 | 49 | if ('version' in version) { 50 | args.push('--version', version.version); 51 | } else { 52 | args.push('--git', version.repository, '--rev', version.commit); 53 | } 54 | 55 | if (input.source.type === 'registry' && input.source.registry) { 56 | args.push('--registry', input.source.registry); 57 | } 58 | if (input.source.type === 'registry' && input.source.index) { 59 | args.push('--index', input.source.index); 60 | } 61 | 62 | if (input.features.length > 0) { 63 | args.push('--features', input.features.join(',')); 64 | } 65 | 66 | if (input.args.length > 0) { 67 | args = args.concat(input.args); 68 | } 69 | 70 | return args; 71 | } 72 | 73 | async function getCacheKey( 74 | input: ActionInput, 75 | version: ResolvedVersion, 76 | args: string[], 77 | ): Promise { 78 | const runnerOs = process.env.RUNNER_OS; 79 | const runnerArch = process.env.RUNNER_ARCH; 80 | const osVersion = await getOsVersion(); 81 | 82 | if (runnerOs === undefined || runnerArch === undefined) { 83 | core.setFailed('Could not determine runner OS or runner arch'); 84 | process.exit(1); 85 | } 86 | 87 | /** 88 | * Most of the cache key is a hash of the parameters that may affect the build 89 | * output. We take only the first 24 characters to improve readability. 90 | * 91 | * The key is composed of: 92 | * - the runner os information (os name, architecture and version) 93 | * - the arguments passed to cargo install (which contain the exact version 94 | * installed, features enabled, ...) 95 | * - additionally, the cache key provided by the user 96 | */ 97 | 98 | const hashKey = 99 | runnerOs + 100 | runnerArch + 101 | (osVersion ?? '') + 102 | args.join(' ') + 103 | (input.cacheKey ?? ''); 104 | 105 | const hash = crypto 106 | .createHash('sha256') 107 | .update(hashKey) 108 | .digest('hex') 109 | .slice(0, 24); 110 | 111 | // We include the installed crate and version in the cache key to make it 112 | // easier to identify if a manual invalidation is needed. 113 | const versionKey = 114 | 'version' in version ? version.version : version.commit.slice(0, 7); 115 | 116 | return `cargo-install-${input.crate}-${versionKey}-${hash}`; 117 | } 118 | 119 | async function getOsVersion(): Promise { 120 | const runnerOs = process.env.RUNNER_OS; 121 | 122 | if (runnerOs === 'Linux') { 123 | const output = await exec.getExecOutput('cat', ['/etc/os-release'], { 124 | silent: true, 125 | }); 126 | const match = output.stdout.match(/VERSION_ID="(.*)"/); 127 | return match?.[1]; 128 | } 129 | 130 | if (runnerOs === 'macOS') { 131 | const output = await exec.getExecOutput('sw_vers', ['-productVersion'], { 132 | silent: true, 133 | }); 134 | return output.stdout.trim(); 135 | } 136 | 137 | if (runnerOs === 'Windows') { 138 | const major = await exec.getExecOutput( 139 | 'pwsh', 140 | ['-Command', '[System.Environment]::OSVersion.Version.Major'], 141 | { silent: true }, 142 | ); 143 | const minor = await exec.getExecOutput( 144 | 'pwsh', 145 | ['-Command', '[System.Environment]::OSVersion.Version.Minor'], 146 | { silent: true }, 147 | ); 148 | return `${major.stdout.trim()}.${minor.stdout.trim()}`; 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /src/parse.ts: -------------------------------------------------------------------------------- 1 | import * as core from '@actions/core'; 2 | import * as semver from 'semver'; 3 | import stringArgv from 'string-argv'; 4 | 5 | // Action input parameters 6 | export interface ActionInput { 7 | crate: string; 8 | source: RegistrySource | GitSource; 9 | features: string[]; 10 | args: string[]; 11 | cacheKey: string; 12 | } 13 | 14 | export interface RegistrySource { 15 | type: 'registry'; 16 | version: string; 17 | registry?: string; 18 | index?: string; 19 | } 20 | 21 | export interface GitSource { 22 | type: 'git'; 23 | repository: string; 24 | branch?: string; 25 | tag?: string; 26 | commit?: string; 27 | } 28 | 29 | // Parse and validate action input 30 | export function parseInput(): ActionInput { 31 | // Global parameters 32 | const crate = core.getInput('crate', { required: true }); 33 | const features = core.getInput('features', { required: false }); 34 | const locked = core.getBooleanInput('locked', { required: false }); 35 | const args = core.getInput('args', { required: false }); 36 | const cacheKey = core.getInput('cache-key', { required: false }); 37 | 38 | const parsedArgs = stringArgv(args); 39 | const parsedFeatures = features.split(/[ ,]+/).filter(Boolean); 40 | if (locked) { 41 | parsedArgs.push('--locked'); 42 | } 43 | 44 | // Crate version (always provided, defaults to 'latest') 45 | const version = core.getInput('version', { required: true }); 46 | if (version !== 'latest' && semver.validRange(version) === null) { 47 | core.setFailed( 48 | 'Invalid version provided. Must be a valid semver range or "latest".', 49 | ); 50 | process.exit(1); 51 | } 52 | 53 | // Custom registry source 54 | const registry = core.getInput('registry', { required: false }); 55 | const index = core.getInput('index', { required: false }); 56 | if (registry !== '' && index !== '') { 57 | core.setFailed('Cannot provide both registry and index.'); 58 | process.exit(1); 59 | } 60 | 61 | // Git source (optional, overrides Crates.io version if provided) 62 | const repository = core.getInput('git', { required: false }); 63 | const branch = core.getInput('branch', { required: false }); 64 | const tag = core.getInput('tag', { required: false }); 65 | const rev = core.getInput('rev', { required: false }); 66 | const commit = core.getInput('commit', { required: false }); 67 | 68 | let source: RegistrySource | GitSource; 69 | if (repository !== '') { 70 | source = { type: 'git', repository }; 71 | source.branch = branch !== '' ? branch : undefined; 72 | source.tag = tag !== '' ? tag : undefined; 73 | source.commit = commit !== '' ? commit : rev !== '' ? rev : undefined; 74 | } else { 75 | source = { type: 'registry', version }; 76 | source.registry = registry !== '' ? registry : undefined; 77 | source.index = index !== '' ? index : undefined; 78 | } 79 | 80 | // Warnings if both crates.io and git are provided 81 | if ( 82 | repository === '' && 83 | (branch !== '' || tag !== '' || commit !== '' || rev !== '') 84 | ) { 85 | core.warning('Ignoring branch, tag, and commit since git is not provided.'); 86 | } 87 | if (repository !== '' && version !== 'latest') { 88 | core.warning('Ignoring version since git is provided.'); 89 | } 90 | 91 | return { 92 | crate, 93 | source, 94 | features: parsedFeatures, 95 | args: parsedArgs, 96 | cacheKey, 97 | }; 98 | } 99 | -------------------------------------------------------------------------------- /src/resolve/git.ts: -------------------------------------------------------------------------------- 1 | import * as core from '@actions/core'; 2 | import * as exec from '@actions/exec'; 3 | 4 | import type { ResolvedVersion } from '../install'; 5 | import type { GitSource } from '../parse'; 6 | 7 | interface GitRemoteCommits { 8 | head: string; 9 | tags: { [tag: string]: string }; 10 | branches: { [branch: string]: string }; 11 | } 12 | 13 | // Resolve the Git source to a specific commit 14 | export async function resolveGitCommit( 15 | git: GitSource, 16 | ): Promise { 17 | core.info(`Fetching git commits for ${git.repository}...`); 18 | const commits = await fetchGitRemote(git.repository); 19 | 20 | if (git.commit !== undefined) { 21 | core.info(`Using explicit commit ${git.commit} for ${git.repository}`); 22 | return { repository: git.repository, commit: git.commit }; 23 | } 24 | 25 | if (git.tag !== undefined) { 26 | const commit = commits.tags[git.tag]; 27 | if (commit === undefined) { 28 | core.setFailed(`Failed to resolve tag ${git.tag} for ${git.repository}`); 29 | process.exit(1); 30 | } 31 | 32 | core.info(`Resolved tag ${git.tag} to commit ${commit}`); 33 | return { repository: git.repository, commit }; 34 | } 35 | 36 | if (git.branch !== undefined) { 37 | const commit = commits.branches[git.branch]; 38 | if (commit === undefined) { 39 | core.setFailed( 40 | `Failed to resolve branch ${git.branch} for ${git.repository}`, 41 | ); 42 | process.exit(1); 43 | } 44 | 45 | core.info(`Resolved branch ${git.branch} to commit ${commit}`); 46 | return { repository: git.repository, commit }; 47 | } 48 | 49 | core.info(`Resolved HEAD to commit ${commits.head}`); 50 | return { repository: git.repository, commit: commits.head }; 51 | } 52 | 53 | async function fetchGitRemote(repository: string): Promise { 54 | const chunks: Buffer[] = []; 55 | await exec.exec('git', ['ls-remote', repository], { 56 | listeners: { stdout: data => chunks.push(data) }, 57 | silent: true, 58 | }); 59 | 60 | const output = Buffer.concat(chunks).toString('utf-8'); 61 | const commits: GitRemoteCommits = { head: '', tags: {}, branches: {} }; 62 | 63 | for (const line of output.split('\n')) { 64 | const [commit, ref] = line.split('\t'); 65 | 66 | if (commit === '' || ref === '' || ref === undefined) { 67 | continue; 68 | } 69 | 70 | if (ref === 'HEAD') { 71 | commits.head = commit; 72 | } 73 | 74 | const tagMatch = 'refs/tags/'; 75 | if (ref.startsWith(tagMatch)) { 76 | const tag = ref.slice(tagMatch.length); 77 | commits.tags[tag] = commit; 78 | } 79 | 80 | const branchMatch = 'refs/heads/'; 81 | if (ref.startsWith(branchMatch)) { 82 | const branch = ref.slice(branchMatch.length); 83 | commits.branches[branch] = commit; 84 | } 85 | } 86 | 87 | if (commits.head === '') { 88 | core.setFailed(`Failed to fetch HEAD commit for ${repository}`); 89 | process.exit(1); 90 | } 91 | 92 | return commits; 93 | } 94 | -------------------------------------------------------------------------------- /src/resolve/registry.ts: -------------------------------------------------------------------------------- 1 | import * as core from '@actions/core'; 2 | import * as http from '@actions/http-client'; 3 | import semver from 'semver'; 4 | 5 | import { 6 | InferOutput, 7 | boolean, 8 | check, 9 | object, 10 | parse, 11 | pipe, 12 | string, 13 | } from 'valibot'; 14 | import type { ResolvedVersion } from '../install'; 15 | import { RegistrySource } from '../parse'; 16 | 17 | const CrateVersionSchema = object({ 18 | vers: pipe( 19 | string(), 20 | check(input => semver.valid(input) !== null, 'Invalid semver version'), 21 | ), 22 | yanked: boolean(), 23 | }); 24 | 25 | type CrateVersion = InferOutput; 26 | 27 | // Resolve latest compatible crate version 28 | export async function resolveRegistryVersion( 29 | crate: string, 30 | { version, registry, index }: RegistrySource, 31 | ): Promise { 32 | const isVersionRange = semver.valid(version) === null; 33 | const registryIndex = 34 | index !== undefined 35 | ? parseRegistryIndex(index) 36 | : { sparse: true, url: 'https://index.crates.io/' }; 37 | 38 | const nonSparseIndex = registry !== undefined || !registryIndex.sparse; 39 | if (isVersionRange && nonSparseIndex) { 40 | core.error('Version ranges can only be used with sparse indexes'); 41 | process.exit(1); 42 | } 43 | if (!isVersionRange && nonSparseIndex) { 44 | core.info('Using non-sparse index, skipping version resolution'); 45 | return { version }; 46 | } 47 | 48 | return await resolveCrateVersion(crate, version, registryIndex); 49 | } 50 | 51 | interface RegistryIndex { 52 | sparse: boolean; 53 | url: string; 54 | } 55 | 56 | function parseRegistryIndex(input: string): RegistryIndex { 57 | const sparseProtocol = 'sparse+'; 58 | const sparse = input.startsWith(sparseProtocol); 59 | const url = sparse ? input.slice(sparseProtocol.length) : input; 60 | 61 | return { sparse, url }; 62 | } 63 | 64 | async function resolveCrateVersion( 65 | crate: string, 66 | version: string, 67 | index: RegistryIndex, 68 | ): Promise { 69 | core.info(`Fetching information for ${crate} from index ...`); 70 | const versions = await fetchIndex(crate, index.url); 71 | 72 | const sortedVersions = versions 73 | .sort((a, b) => semver.compare(a.vers, b.vers)) 74 | .reverse(); 75 | const latest = 76 | sortedVersions.find(ver => !ver.yanked && !semver.prerelease(ver.vers)) ?? 77 | sortedVersions[0]; 78 | 79 | if (version === 'latest') { 80 | return { version: latest.vers }; 81 | } 82 | 83 | const resolved = sortedVersions.filter(ver => 84 | semver.satisfies(ver.vers, version), 85 | ); 86 | if (resolved.length === 0) { 87 | core.setFailed(`No version found for ${crate} that satisfies ${version}`); 88 | core.info( 89 | `Available versions: ${versions.map(ver => ver.vers).join(', ')}`, 90 | ); 91 | process.exit(1); 92 | } 93 | 94 | const resolvedVersion = resolved.find(ver => !ver.yanked) ?? resolved[0]; 95 | if (resolvedVersion.yanked) { 96 | core.warning(`Using yanked version ${resolvedVersion.vers} for ${crate}`); 97 | } else if (resolvedVersion.vers !== latest.vers) { 98 | core.warning( 99 | `New version for ${crate} available: ${sortedVersions[0].vers}`, 100 | ); 101 | } 102 | 103 | return { version: resolvedVersion.vers }; 104 | } 105 | 106 | async function fetchIndex( 107 | crate: string, 108 | indexUrl: string, 109 | ): Promise { 110 | const url = new URL(getIndexPath(crate), indexUrl); 111 | const client = new http.HttpClient('cargo-install-action'); 112 | const response = await client.get(url.toString()); 113 | 114 | if (response.message.statusCode === 404) { 115 | core.setFailed(`Crate ${crate} not found on crates.io index`); 116 | process.exit(1); 117 | } else if (response.message.statusCode !== 200) { 118 | core.setFailed(`Failed to fetch crate ${crate} on crates.io index`); 119 | core.info( 120 | `Error: ${response.message.statusMessage ?? ''} (${response.message.statusCode ?? ''})`, 121 | ); 122 | process.exit(1); 123 | } 124 | 125 | const body = await response.readBody(); 126 | 127 | return body 128 | .split('\n') 129 | .filter(line => line.length > 0) 130 | .map(line => parse(CrateVersionSchema, JSON.parse(line))); 131 | } 132 | 133 | // Get index path for crate 134 | // https://doc.rust-lang.org/cargo/reference/registry-index.html#index-files 135 | function getIndexPath(crate: string): string { 136 | const name = crate.toLowerCase(); 137 | 138 | if (name.length === 1) { 139 | return `1/${name}`; 140 | } 141 | if (name.length === 2) { 142 | return `2/${name}`; 143 | } 144 | if (name.length === 3) { 145 | return `3/${name.slice(0, 1)}/${name}`; 146 | } 147 | 148 | return `${name.slice(0, 2)}/${name.slice(2, 4)}/${name}`; 149 | } 150 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "compilerOptions": { 4 | "lib": ["es2019", "es2020.promise", "es2020.bigint", "es2020.string"], 5 | "module": "commonjs", 6 | "target": "es2019", 7 | 8 | "rootDir": ".", 9 | "noEmit": true, 10 | 11 | "strict": true, 12 | "esModuleInterop": true, 13 | "skipLibCheck": true, 14 | "forceConsistentCasingInFileNames": true 15 | }, 16 | "exclude": ["node_modules", "dist"] 17 | } 18 | --------------------------------------------------------------------------------