├── .dvmrc ├── .github └── workflows │ └── test.yml ├── .gitignore ├── .tool-versions ├── .vscode └── settings.json ├── CODEOWNERS ├── LICENSE ├── README.md ├── action.yml ├── deno-problem-matchers.json ├── deno.json ├── deno.lock ├── dist ├── cache-BG71A93Z.mjs ├── cache-CSb2jW5L.mjs ├── main.mjs ├── post.mjs └── semver-C43QPvfi.mjs ├── package.json ├── scripts └── build.ts └── src ├── cache.ts ├── install.ts ├── main.ts ├── post.ts └── version.ts /.dvmrc: -------------------------------------------------------------------------------- 1 | 1.43.1 2 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: test 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | branches: [main] 8 | 9 | jobs: 10 | test: 11 | runs-on: ${{ matrix.os }} 12 | strategy: 13 | matrix: 14 | os: 15 | - ubuntu-latest 16 | - windows-latest 17 | - macos-latest 18 | deno: 19 | - "1.x" 20 | - "2.x" 21 | - "1.33.1" 22 | - "canary" 23 | - "~1.32" 24 | - "b290fd01f3f5d32f9d010fc719ced0240759c049" 25 | - "rc" 26 | - "lts" 27 | 28 | steps: 29 | - uses: actions/checkout@v3 30 | 31 | - name: Setup Deno 32 | uses: ./ 33 | with: 34 | deno-version: ${{ matrix.deno }} 35 | 36 | - name: Test Deno 37 | run: deno run https://deno.land/std@0.198.0/examples/welcome.ts 38 | 39 | - name: Test `deno install -g` (2.0) 40 | if: matrix.deno == 'canary' || matrix.deno == 'latest' 41 | run: | 42 | deno install -g --allow-net --no-config -n deno_curl https://deno.land/std@0.198.0/examples/curl.ts 43 | deno_curl https://deno.land/std@0.198.0/examples/curl.ts 44 | 45 | - name: Test `deno install (1.0) 46 | if: matrix.deno == '1.x' || matrix.deno == '1.33.1' || matrix.deno == '~1.32' || matrix.deno == 'b290fd01f3f5d32f9d010fc719ced0240759c049' 47 | run: | 48 | deno install --allow-net --no-config -n deno_curl https://deno.land/std@0.198.0/examples/curl.ts 49 | deno_curl https://deno.land/std@0.198.0/examples/curl.ts 50 | 51 | test-version-file: 52 | runs-on: ubuntu-latest 53 | strategy: 54 | matrix: 55 | deno-version-file: [.dvmrc, .tool-versions] 56 | steps: 57 | - uses: actions/checkout@v3 58 | 59 | - name: Setup Deno 60 | uses: ./ 61 | with: 62 | deno-version-file: ${{ matrix.deno-version-file }} 63 | 64 | - name: Check version 65 | run: deno -V | grep -q "deno 1\.43\.1" 66 | 67 | test-binary-name: 68 | runs-on: ${{ matrix.os }} 69 | strategy: 70 | matrix: 71 | os: [ubuntu-latest, windows-latest, macos-latest] 72 | steps: 73 | - uses: actions/checkout@v3 74 | 75 | - name: Setup Deno 76 | uses: ./ 77 | with: 78 | deno-binary-name: deno_foo 79 | 80 | - name: Check binary exists 81 | run: deno_foo -V 82 | 83 | test-setup-cache: 84 | runs-on: ${{ matrix.os }} 85 | strategy: 86 | matrix: 87 | os: [ubuntu-latest, windows-latest, macos-latest] 88 | steps: 89 | - uses: actions/checkout@v4 90 | 91 | - name: Setup Deno 92 | uses: ./ 93 | with: 94 | cache: true 95 | 96 | - name: Download dependencies for cache 97 | run: deno install --global --no-config npm:cowsay@1.6.0 98 | 99 | test-cache: 100 | needs: test-setup-cache 101 | runs-on: ${{ matrix.os }} 102 | strategy: 103 | matrix: 104 | os: [ubuntu-latest, windows-latest, macos-latest] 105 | steps: 106 | - uses: actions/checkout@v4 107 | 108 | - name: Setup Deno 109 | uses: ./ 110 | with: 111 | cache: true 112 | 113 | - name: Run with cached dependencies 114 | run: deno run --cached-only --no-config -RE npm:cowsay@1.6.0 "It works!" 115 | 116 | lint: 117 | runs-on: ubuntu-latest 118 | steps: 119 | - uses: actions/checkout@v4 120 | 121 | - name: Setup Deno 122 | uses: ./ 123 | with: 124 | deno-version: canary 125 | 126 | - name: Lint 127 | run: deno lint 128 | 129 | - name: Format 130 | run: deno fmt --check 131 | 132 | - name: Check types 133 | run: deno check src/main.ts 134 | 135 | build-diff: 136 | runs-on: ubuntu-latest 137 | steps: 138 | - uses: actions/checkout@v4 139 | 140 | - name: Setup Deno 141 | uses: ./ 142 | with: 143 | deno-version: canary 144 | 145 | - name: Build code 146 | run: deno run -A scripts/build.ts 147 | 148 | - name: Assert no git changes (run `deno task build` if this fails) 149 | run: git diff --quiet 150 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | -------------------------------------------------------------------------------- /.tool-versions: -------------------------------------------------------------------------------- 1 | nodejs 20.5.1 2 | bun 1.1.4 3 | ruby 3.3.0 4 | lua 5.4.4 5 | deno 1.43.1 6 | rust 1.65.0 7 | python 3.11.0 8 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "deno.enable": true, 3 | "deno.lint": true, 4 | "[markdown]": { 5 | "editor.defaultFormatter": "denoland.vscode-deno", 6 | "editor.formatOnSave": true 7 | }, 8 | "[json]": { 9 | "editor.defaultFormatter": "denoland.vscode-deno", 10 | "editor.formatOnSave": true 11 | }, 12 | "[jsonc]": { 13 | "editor.defaultFormatter": "denoland.vscode-deno", 14 | "editor.formatOnSave": true 15 | }, 16 | "[typescript]": { 17 | "editor.defaultFormatter": "denoland.vscode-deno", 18 | "editor.formatOnSave": true 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @lucacasonato -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Deno Land 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # setup-deno 2 | 3 | Set up your GitHub Actions workflow with a specific version of Deno. 4 | 5 | ## Usage 6 | 7 | ### Latest stable for a major 8 | 9 | ```yaml 10 | - uses: denoland/setup-deno@v2 11 | with: 12 | deno-version: v2.x 13 | ``` 14 | 15 | ### Latest stable for any major 16 | 17 | Targets the latest major, minor and patch version of Deno. 18 | 19 | ```yaml 20 | - uses: denoland/setup-deno@v2 21 | with: 22 | deno-version: vx.x.x 23 | ``` 24 | 25 | ### Specific stable 26 | 27 | ```yaml 28 | - uses: denoland/setup-deno@v2 29 | with: 30 | deno-version: "1.8.2" 31 | ``` 32 | 33 | ### Semver range 34 | 35 | ```yaml 36 | - uses: denoland/setup-deno@v2 37 | with: 38 | deno-version: "~1.7" 39 | ``` 40 | 41 | ### Latest canary 42 | 43 | ```yaml 44 | - uses: denoland/setup-deno@v2 45 | with: 46 | deno-version: canary 47 | ``` 48 | 49 | ### Specific canary 50 | 51 | ```yaml 52 | - uses: denoland/setup-deno@v2 53 | with: 54 | deno-version: e7b7129b7a92b7500ded88f8f5baa25a7f59e56e 55 | ``` 56 | 57 | ### Latest release candidate 58 | 59 | ```yaml 60 | - uses: denoland/setup-deno@v2 61 | with: 62 | deno-version: rc 63 | ``` 64 | 65 | ### Specific release candidate 66 | 67 | ```yaml 68 | - uses: denoland/setup-deno@v2 69 | with: 70 | deno-version: 2.0.0-rc.1 71 | ``` 72 | 73 | ### Latest LTS 74 | 75 | ```yaml 76 | - uses: denoland/setup-deno@v2 77 | with: 78 | deno-version: lts 79 | ``` 80 | 81 | ### Version from file 82 | 83 | The extension can also automatically read the version file from 84 | [`.tool-versions`](https://asdf-vm.com/manage/configuration.html#tool-versions) 85 | 86 | ```yaml 87 | - uses: denoland/setup-deno@v2 88 | with: 89 | deno-version-file: .tool-versions 90 | ``` 91 | 92 | The extension can also automatically read the file from 93 | [`dvm`](https://github.com/justjavac/dvm). 94 | 95 | ```yaml 96 | - uses: denoland/setup-deno@v2 97 | with: 98 | deno-version-file: .dvmrc 99 | ``` 100 | 101 | ### Specifying binary name 102 | 103 | This is useful when you want to install different versions of Deno side by side. 104 | 105 | ```yaml 106 | - uses: denoland/setup-deno@v2 107 | with: 108 | deno-version: canary 109 | deno-binary-name: deno_canary 110 | ``` 111 | 112 | ### Determining the release channel 113 | 114 | You can determine the release channel reading back the `release-channel` output. 115 | 116 | Valid values are `stable`, `canary` and `rc`. 117 | 118 | ```yaml 119 | - uses: denoland/setup-deno@v2 120 | id: deno 121 | with: 122 | deno-version: canary 123 | 124 | - run: echo "Deno release channel is ${{ steps.deno.outputs.release-channel }}" 125 | ``` 126 | 127 | ### Determining the installed version 128 | 129 | You can determine the installed version reading back the `deno-version` output. 130 | 131 | For canary versions, the output will be in the form `0.0.0-GIT_HASH`. 132 | 133 | For stable and rc versions, the output will be the regular semver version 134 | number. 135 | 136 | ```yaml 137 | - uses: denoland/setup-deno@v2 138 | id: deno 139 | with: 140 | deno-version: canary 141 | 142 | - run: echo "Deno version is ${{ steps.deno.outputs.deno-version }}" 143 | ``` 144 | 145 | ### Caching dependencies downloaded by Deno automatically 146 | 147 | Dependencies installed by Deno can be cached automatically between workflow 148 | runs. This helps make your GH action run faster by not repeating caching work 149 | and network requests done by a previous run. 150 | 151 | To enable the cache, use `cache: true`. 152 | 153 | ```yaml 154 | - uses: denoland/setup-deno@v2 155 | with: 156 | cache: true 157 | ``` 158 | 159 | > [!WARNING] 160 | > If an environment variable `DENO_DIR` is set for steps that run/download 161 | > dependencies, then `DENO_DIR` must also be set for the `denoland/setup-deno` 162 | > action, for the caching to work as intended. 163 | 164 | By default, the cache is automatically keyed by: 165 | 166 | - the github 167 | [job_id](https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#jobsjob_id) 168 | - the runner os and architecture 169 | - a hash of the `deno.lock` files in the project 170 | 171 | It is possible to customize the default hash 172 | (`${{ hashFiles('**/deno.lock') }}`) used as part of the cache key via the 173 | `cache-hash` input. 174 | 175 | ```yaml 176 | - uses: denoland/setup-deno@v2 177 | with: 178 | # setting `cache-hash` implies `cache: true` and will replace 179 | # the default cache-hash of `${{ hashFiles('**/deno.lock') }}` 180 | cache-hash: ${{ hashFiles('**/deno.json') }} 181 | ``` 182 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: "Setup Deno" 2 | description: "Setup Deno by installing, downloading, and adding it to the path." 3 | author: "Deno Land" 4 | branding: 5 | icon: "play-circle" 6 | color: "gray-dark" 7 | inputs: 8 | deno-version: 9 | description: The Deno version to install. Can be a semver version of a stable release, "canary" for the latest canary, "lts" for the latest LTS, or the Git hash of a specific canary release. 10 | default: "2.x" 11 | deno-version-file: 12 | description: File containing the Deno version to install such as .dvmrc or .tool-versions. 13 | deno-binary-name: 14 | description: The name to use for the binary. 15 | default: "deno" 16 | cache: 17 | description: Cache downloaded modules & packages automatically in GitHub Actions cache. 18 | default: "false" 19 | cache-hash: 20 | description: A hash used as part of the cache key, which defaults to a hash of the deno.lock files. 21 | outputs: 22 | cache-hit: 23 | description: A boolean indicating whether the cache was hit. 24 | deno-version: 25 | description: "The Deno version that was installed." 26 | release-channel: 27 | description: "The release channel of the installed version." 28 | runs: 29 | using: "node20" 30 | main: "dist/main.mjs" 31 | post: "dist/post.mjs" 32 | post-if: always() 33 | -------------------------------------------------------------------------------- /deno-problem-matchers.json: -------------------------------------------------------------------------------- 1 | { 2 | "problemMatcher": [ 3 | { 4 | "owner": "deno-lint", 5 | "pattern": [ 6 | { 7 | "regexp": "^(?:\\x1B\\[[0-9;]*[a-zA-Z])*(warning|warn|error)(?:\\[(\\S*)\\])?(?:\\x1B\\[[0-9;]*[a-zA-Z])*: (.*?)(?:\\x1B\\[[0-9;]*[a-zA-Z])*$", 8 | "severity": 1, 9 | "code": 2, 10 | "message": 3 11 | }, 12 | { 13 | "regexp": "^(?:\\s*)(?:\\x1B\\[[0-9;]*[a-zA-Z])*-->(?:\\x1B\\[[0-9;]*[a-zA-Z])* (?:\\x1B\\[[0-9;]*[a-zA-Z])*(\\S+?)(?:\\x1B\\[[0-9;]*[a-zA-Z])*:(\\d+):(\\d+)(?:\\x1B\\[[0-9;]*[a-zA-Z])*$", 14 | "file": 1, 15 | "line": 2, 16 | "column": 3 17 | } 18 | ] 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /deno.json: -------------------------------------------------------------------------------- 1 | { 2 | "lock": { 3 | "frozen": true 4 | }, 5 | "nodeModulesDir": "auto", 6 | "license": "MIT", 7 | "compilerOptions": { 8 | "lib": ["esnext"] 9 | }, 10 | "exclude": [ 11 | "dist" 12 | ], 13 | "tasks": { 14 | "build": "deno run -A scripts/build.ts" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /deno.lock: -------------------------------------------------------------------------------- 1 | { 2 | "version": "5", 3 | "specifiers": { 4 | "npm:@actions/cache@4.0.3": "4.0.3", 5 | "npm:@actions/core@^1.11.1": "1.11.1", 6 | "npm:@actions/glob@0.5": "0.5.0", 7 | "npm:@actions/tool-cache@^2.0.2": "2.0.2", 8 | "npm:@types/node@^20.16.5": "20.17.47", 9 | "npm:@types/semver@^7.7.0": "7.7.0", 10 | "npm:semver@^7.7.1": "7.7.2", 11 | "npm:tsdown@0.10.1": "0.10.1_rolldown@1.0.0-beta.8-commit.852c603__valibot@1.0.0", 12 | "npm:undici@^7.8.0": "7.9.0" 13 | }, 14 | "npm": { 15 | "@actions/cache@4.0.3": { 16 | "integrity": "sha512-SvrqFtYJ7I48A/uXNkoJrnukx5weQv1fGquhs3+4nkByZThBH109KTIqj5x/cGV7JGNvb8dLPVywUOqX1fjiXg==", 17 | "dependencies": [ 18 | "@actions/core", 19 | "@actions/exec", 20 | "@actions/glob@0.1.2", 21 | "@actions/http-client", 22 | "@actions/io", 23 | "@azure/abort-controller@1.1.0", 24 | "@azure/ms-rest-js", 25 | "@azure/storage-blob", 26 | "@protobuf-ts/plugin", 27 | "semver@6.3.1" 28 | ] 29 | }, 30 | "@actions/core@1.11.1": { 31 | "integrity": "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==", 32 | "dependencies": [ 33 | "@actions/exec", 34 | "@actions/http-client" 35 | ] 36 | }, 37 | "@actions/exec@1.1.1": { 38 | "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", 39 | "dependencies": [ 40 | "@actions/io" 41 | ] 42 | }, 43 | "@actions/glob@0.1.2": { 44 | "integrity": "sha512-SclLR7Ia5sEqjkJTPs7Sd86maMDw43p769YxBOxvPvEWuPEhpAnBsQfENOpXjFYMmhCqd127bmf+YdvJqVqR4A==", 45 | "dependencies": [ 46 | "@actions/core", 47 | "minimatch" 48 | ] 49 | }, 50 | "@actions/glob@0.5.0": { 51 | "integrity": "sha512-tST2rjPvJLRZLuT9NMUtyBjvj9Yo0MiJS3ow004slMvm8GFM+Zv9HvMJ7HWzfUyJnGrJvDsYkWBaaG3YKXRtCw==", 52 | "dependencies": [ 53 | "@actions/core", 54 | "minimatch" 55 | ] 56 | }, 57 | "@actions/http-client@2.2.3": { 58 | "integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==", 59 | "dependencies": [ 60 | "tunnel", 61 | "undici@5.29.0" 62 | ] 63 | }, 64 | "@actions/io@1.1.3": { 65 | "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==" 66 | }, 67 | "@actions/tool-cache@2.0.2": { 68 | "integrity": "sha512-fBhNNOWxuoLxztQebpOaWu6WeVmuwa77Z+DxIZ1B+OYvGkGQon6kTVg6Z32Cb13WCuw0szqonK+hh03mJV7Z6w==", 69 | "dependencies": [ 70 | "@actions/core", 71 | "@actions/exec", 72 | "@actions/http-client", 73 | "@actions/io", 74 | "semver@6.3.1" 75 | ] 76 | }, 77 | "@azure/abort-controller@1.1.0": { 78 | "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", 79 | "dependencies": [ 80 | "tslib@2.8.1" 81 | ] 82 | }, 83 | "@azure/abort-controller@2.1.2": { 84 | "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", 85 | "dependencies": [ 86 | "tslib@2.8.1" 87 | ] 88 | }, 89 | "@azure/core-auth@1.9.0": { 90 | "integrity": "sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==", 91 | "dependencies": [ 92 | "@azure/abort-controller@2.1.2", 93 | "@azure/core-util", 94 | "tslib@2.8.1" 95 | ] 96 | }, 97 | "@azure/core-client@1.9.4": { 98 | "integrity": "sha512-f7IxTD15Qdux30s2qFARH+JxgwxWLG2Rlr4oSkPGuLWm+1p5y1+C04XGLA0vmX6EtqfutmjvpNmAfgwVIS5hpw==", 99 | "dependencies": [ 100 | "@azure/abort-controller@2.1.2", 101 | "@azure/core-auth", 102 | "@azure/core-rest-pipeline", 103 | "@azure/core-tracing", 104 | "@azure/core-util", 105 | "@azure/logger", 106 | "tslib@2.8.1" 107 | ] 108 | }, 109 | "@azure/core-http-compat@2.3.0": { 110 | "integrity": "sha512-qLQujmUypBBG0gxHd0j6/Jdmul6ttl24c8WGiLXIk7IHXdBlfoBqW27hyz3Xn6xbfdyVSarl1Ttbk0AwnZBYCw==", 111 | "dependencies": [ 112 | "@azure/abort-controller@2.1.2", 113 | "@azure/core-client", 114 | "@azure/core-rest-pipeline" 115 | ] 116 | }, 117 | "@azure/core-lro@2.7.2": { 118 | "integrity": "sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==", 119 | "dependencies": [ 120 | "@azure/abort-controller@2.1.2", 121 | "@azure/core-util", 122 | "@azure/logger", 123 | "tslib@2.8.1" 124 | ] 125 | }, 126 | "@azure/core-paging@1.6.2": { 127 | "integrity": "sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==", 128 | "dependencies": [ 129 | "tslib@2.8.1" 130 | ] 131 | }, 132 | "@azure/core-rest-pipeline@1.20.0": { 133 | "integrity": "sha512-ASoP8uqZBS3H/8N8at/XwFr6vYrRP3syTK0EUjDXQy0Y1/AUS+QeIRThKmTNJO2RggvBBxaXDPM7YoIwDGeA0g==", 134 | "dependencies": [ 135 | "@azure/abort-controller@2.1.2", 136 | "@azure/core-auth", 137 | "@azure/core-tracing", 138 | "@azure/core-util", 139 | "@azure/logger", 140 | "@typespec/ts-http-runtime", 141 | "tslib@2.8.1" 142 | ] 143 | }, 144 | "@azure/core-tracing@1.2.0": { 145 | "integrity": "sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==", 146 | "dependencies": [ 147 | "tslib@2.8.1" 148 | ] 149 | }, 150 | "@azure/core-util@1.12.0": { 151 | "integrity": "sha512-13IyjTQgABPARvG90+N2dXpC+hwp466XCdQXPCRlbWHgd3SJd5Q1VvaBGv6k1BIa4MQm6hAF1UBU1m8QUxV8sQ==", 152 | "dependencies": [ 153 | "@azure/abort-controller@2.1.2", 154 | "@typespec/ts-http-runtime", 155 | "tslib@2.8.1" 156 | ] 157 | }, 158 | "@azure/core-xml@1.4.5": { 159 | "integrity": "sha512-gT4H8mTaSXRz7eGTuQyq1aIJnJqeXzpOe9Ay7Z3FrCouer14CbV3VzjnJrNrQfbBpGBLO9oy8BmrY75A0p53cA==", 160 | "dependencies": [ 161 | "fast-xml-parser", 162 | "tslib@2.8.1" 163 | ] 164 | }, 165 | "@azure/logger@1.2.0": { 166 | "integrity": "sha512-0hKEzLhpw+ZTAfNJyRrn6s+V0nDWzXk9OjBr2TiGIu0OfMr5s2V4FpKLTAK3Ca5r5OKLbf4hkOGDPyiRjie/jA==", 167 | "dependencies": [ 168 | "@typespec/ts-http-runtime", 169 | "tslib@2.8.1" 170 | ] 171 | }, 172 | "@azure/ms-rest-js@2.7.0": { 173 | "integrity": "sha512-ngbzWbqF+NmztDOpLBVDxYM+XLcUj7nKhxGbSU9WtIsXfRB//cf2ZbAG5HkOrhU9/wd/ORRB6lM/d69RKVjiyA==", 174 | "dependencies": [ 175 | "@azure/core-auth", 176 | "abort-controller", 177 | "form-data", 178 | "node-fetch", 179 | "tslib@1.14.1", 180 | "tunnel", 181 | "uuid", 182 | "xml2js" 183 | ] 184 | }, 185 | "@azure/storage-blob@12.27.0": { 186 | "integrity": "sha512-IQjj9RIzAKatmNca3D6bT0qJ+Pkox1WZGOg2esJF2YLHb45pQKOwGPIAV+w3rfgkj7zV3RMxpn/c6iftzSOZJQ==", 187 | "dependencies": [ 188 | "@azure/abort-controller@2.1.2", 189 | "@azure/core-auth", 190 | "@azure/core-client", 191 | "@azure/core-http-compat", 192 | "@azure/core-lro", 193 | "@azure/core-paging", 194 | "@azure/core-rest-pipeline", 195 | "@azure/core-tracing", 196 | "@azure/core-util", 197 | "@azure/core-xml", 198 | "@azure/logger", 199 | "events", 200 | "tslib@2.8.1" 201 | ] 202 | }, 203 | "@babel/generator@7.27.1": { 204 | "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", 205 | "dependencies": [ 206 | "@babel/parser", 207 | "@babel/types", 208 | "@jridgewell/gen-mapping", 209 | "@jridgewell/trace-mapping", 210 | "jsesc" 211 | ] 212 | }, 213 | "@babel/helper-string-parser@7.27.1": { 214 | "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" 215 | }, 216 | "@babel/helper-validator-identifier@7.27.1": { 217 | "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" 218 | }, 219 | "@babel/parser@7.27.2": { 220 | "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", 221 | "dependencies": [ 222 | "@babel/types" 223 | ], 224 | "bin": true 225 | }, 226 | "@babel/types@7.27.1": { 227 | "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", 228 | "dependencies": [ 229 | "@babel/helper-string-parser", 230 | "@babel/helper-validator-identifier" 231 | ] 232 | }, 233 | "@emnapi/core@1.4.3": { 234 | "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", 235 | "dependencies": [ 236 | "@emnapi/wasi-threads", 237 | "tslib@2.8.1" 238 | ] 239 | }, 240 | "@emnapi/runtime@1.4.3": { 241 | "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", 242 | "dependencies": [ 243 | "tslib@2.8.1" 244 | ] 245 | }, 246 | "@emnapi/wasi-threads@1.0.2": { 247 | "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", 248 | "dependencies": [ 249 | "tslib@2.8.1" 250 | ] 251 | }, 252 | "@fastify/busboy@2.1.1": { 253 | "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==" 254 | }, 255 | "@jridgewell/gen-mapping@0.3.8": { 256 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 257 | "dependencies": [ 258 | "@jridgewell/set-array", 259 | "@jridgewell/sourcemap-codec", 260 | "@jridgewell/trace-mapping" 261 | ] 262 | }, 263 | "@jridgewell/resolve-uri@3.1.2": { 264 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" 265 | }, 266 | "@jridgewell/set-array@1.2.1": { 267 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" 268 | }, 269 | "@jridgewell/sourcemap-codec@1.5.0": { 270 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" 271 | }, 272 | "@jridgewell/trace-mapping@0.3.25": { 273 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 274 | "dependencies": [ 275 | "@jridgewell/resolve-uri", 276 | "@jridgewell/sourcemap-codec" 277 | ] 278 | }, 279 | "@napi-rs/wasm-runtime@0.2.9": { 280 | "integrity": "sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==", 281 | "dependencies": [ 282 | "@emnapi/core", 283 | "@emnapi/runtime", 284 | "@tybys/wasm-util" 285 | ] 286 | }, 287 | "@oxc-project/types@0.67.0": { 288 | "integrity": "sha512-AI7inoYvnVro7b8S2Z+Fxi295xQvNKLP1CM/xzx5il4R3aiGgnFt9qiXaRo9vIutataX8AjHcaPnOsjdcItU0w==" 289 | }, 290 | "@oxc-resolver/binding-darwin-arm64@9.0.2": { 291 | "integrity": "sha512-MVyRgP2gzJJtAowjG/cHN3VQXwNLWnY+FpOEsyvDepJki1SdAX/8XDijM1yN6ESD1kr9uhBKjGelC6h3qtT+rA==", 292 | "os": ["darwin"], 293 | "cpu": ["arm64"] 294 | }, 295 | "@oxc-resolver/binding-darwin-x64@9.0.2": { 296 | "integrity": "sha512-7kV0EOFEZ3sk5Hjy4+bfA6XOQpCwbDiDkkHN4BHHyrBHsXxUR05EcEJPPL1WjItefg+9+8hrBmoK0xRoDs41+A==", 297 | "os": ["darwin"], 298 | "cpu": ["x64"] 299 | }, 300 | "@oxc-resolver/binding-freebsd-x64@9.0.2": { 301 | "integrity": "sha512-6OvkEtRXrt8sJ4aVfxHRikjain9nV1clIsWtJ1J3J8NG1ZhjyJFgT00SCvqxbK+pzeWJq6XzHyTCN78ML+lY2w==", 302 | "os": ["freebsd"], 303 | "cpu": ["x64"] 304 | }, 305 | "@oxc-resolver/binding-linux-arm-gnueabihf@9.0.2": { 306 | "integrity": "sha512-aYpNL6o5IRAUIdoweW21TyLt54Hy/ZS9tvzNzF6ya1ckOQ8DLaGVPjGpmzxdNja9j/bbV6aIzBH7lNcBtiOTkQ==", 307 | "os": ["linux"], 308 | "cpu": ["arm"] 309 | }, 310 | "@oxc-resolver/binding-linux-arm64-gnu@9.0.2": { 311 | "integrity": "sha512-RGFW4vCfKMFEIzb9VCY0oWyyY9tR1/o+wDdNePhiUXZU4SVniRPQaZ1SJ0sUFI1k25pXZmzQmIP6cBmazi/Dew==", 312 | "os": ["linux"], 313 | "cpu": ["arm64"] 314 | }, 315 | "@oxc-resolver/binding-linux-arm64-musl@9.0.2": { 316 | "integrity": "sha512-lxx/PibBfzqYvut2Y8N2D0Ritg9H8pKO+7NUSJb9YjR/bfk2KRmP8iaUz3zB0JhPtf/W3REs65oKpWxgflGToA==", 317 | "os": ["linux"], 318 | "cpu": ["arm64"] 319 | }, 320 | "@oxc-resolver/binding-linux-riscv64-gnu@9.0.2": { 321 | "integrity": "sha512-yD28ptS/OuNhwkpXRPNf+/FvrO7lwURLsEbRVcL1kIE0GxNJNMtKgIE4xQvtKDzkhk6ZRpLho5VSrkkF+3ARTQ==", 322 | "os": ["linux"], 323 | "cpu": ["riscv64"] 324 | }, 325 | "@oxc-resolver/binding-linux-s390x-gnu@9.0.2": { 326 | "integrity": "sha512-WBwEJdspoga2w+aly6JVZeHnxuPVuztw3fPfWrei2P6rNM5hcKxBGWKKT6zO1fPMCB4sdDkFohGKkMHVV1eryQ==", 327 | "os": ["linux"], 328 | "cpu": ["s390x"] 329 | }, 330 | "@oxc-resolver/binding-linux-x64-gnu@9.0.2": { 331 | "integrity": "sha512-a2z3/cbOOTUq0UTBG8f3EO/usFcdwwXnCejfXv42HmV/G8GjrT4fp5+5mVDoMByH3Ce3iVPxj1LmS6OvItKMYQ==", 332 | "os": ["linux"], 333 | "cpu": ["x64"] 334 | }, 335 | "@oxc-resolver/binding-linux-x64-musl@9.0.2": { 336 | "integrity": "sha512-bHZF+WShYQWpuswB9fyxcgMIWVk4sZQT0wnwpnZgQuvGTZLkYJ1JTCXJMtaX5mIFHf69ngvawnwPIUA4Feil0g==", 337 | "os": ["linux"], 338 | "cpu": ["x64"] 339 | }, 340 | "@oxc-resolver/binding-wasm32-wasi@9.0.2": { 341 | "integrity": "sha512-I5cSgCCh5nFozGSHz+PjIOfrqW99eUszlxKLgoNNzQ1xQ2ou9ZJGzcZ94BHsM9SpyYHLtgHljmOZxCT9bgxYNA==", 342 | "dependencies": [ 343 | "@napi-rs/wasm-runtime" 344 | ], 345 | "cpu": ["wasm32"] 346 | }, 347 | "@oxc-resolver/binding-win32-arm64-msvc@9.0.2": { 348 | "integrity": "sha512-5IhoOpPr38YWDWRCA5kP30xlUxbIJyLAEsAK7EMyUgqygBHEYLkElaKGgS0X5jRXUQ6l5yNxuW73caogb2FYaw==", 349 | "os": ["win32"], 350 | "cpu": ["arm64"] 351 | }, 352 | "@oxc-resolver/binding-win32-x64-msvc@9.0.2": { 353 | "integrity": "sha512-Qc40GDkaad9rZksSQr2l/V9UubigIHsW69g94Gswc2sKYB3XfJXfIfyV8WTJ67u6ZMXsZ7BH1msSC6Aen75mCg==", 354 | "os": ["win32"], 355 | "cpu": ["x64"] 356 | }, 357 | "@oxc-transform/binding-darwin-arm64@0.67.0": { 358 | "integrity": "sha512-P3zBMhpOQceNSys3/ZqvrjuRvcIbVzfGFN/tH34HlVkOjOmfGK1mOWjORsGAZtbgh1muXrF6mQETLzFjfYndXQ==", 359 | "os": ["darwin"], 360 | "cpu": ["arm64"] 361 | }, 362 | "@oxc-transform/binding-darwin-x64@0.67.0": { 363 | "integrity": "sha512-B52aeo/C3spYHcwFQ4nAbDkwbMKf0K6ncWM8GrVUgGu8PPECLBhjPCW11kPW/lt9FxwrdgVYVzPYlZ6wmJmpEA==", 364 | "os": ["darwin"], 365 | "cpu": ["x64"] 366 | }, 367 | "@oxc-transform/binding-linux-arm-gnueabihf@0.67.0": { 368 | "integrity": "sha512-5Ir1eQrC9lvj/rR1TJVGwOR4yLgXTLmfKHIfpVH7GGSQrzK7VMUfHWX+dAsX1VutaeE8puXIqtYvf9cHLw78dw==", 369 | "os": ["linux"], 370 | "cpu": ["arm"] 371 | }, 372 | "@oxc-transform/binding-linux-arm64-gnu@0.67.0": { 373 | "integrity": "sha512-zTqfPET5+hZfJ3/dMqJboKxrpXMXk+j2HVdvX0wVhW2MI7n7hwELl+In6Yu20nXuEyJkNQlWHbNPCUfpM+cBWw==", 374 | "os": ["linux"], 375 | "cpu": ["arm64"] 376 | }, 377 | "@oxc-transform/binding-linux-arm64-musl@0.67.0": { 378 | "integrity": "sha512-jzz/ATUhZ8wetb4gm5GwzheZns3Qj1CZ+DIMmD8nBxQXszmTS/fqnAPpgzruyLqkXBUuUfF3pHv5f/UmuHReuQ==", 379 | "os": ["linux"], 380 | "cpu": ["arm64"] 381 | }, 382 | "@oxc-transform/binding-linux-x64-gnu@0.67.0": { 383 | "integrity": "sha512-Qy2+tfglJ8yX6guC1EDAnuuzRZIXciXO9UwOewxyiahLxwuTpj/wvvZN3Cb1SA3c14zrwb2TNMZvaXS1/OS5Pg==", 384 | "os": ["linux"], 385 | "cpu": ["x64"] 386 | }, 387 | "@oxc-transform/binding-linux-x64-musl@0.67.0": { 388 | "integrity": "sha512-tHoYgDIRhgvh+/wIrzAk3cUoj/LSSoJAdsZW9XRlaixFW/TF2puxRyaS1hRco0bcKTwotXl/eDYqZmhIfUyGRQ==", 389 | "os": ["linux"], 390 | "cpu": ["x64"] 391 | }, 392 | "@oxc-transform/binding-wasm32-wasi@0.67.0": { 393 | "integrity": "sha512-ZPT+1HECf7WUnotodIuS8tvSkwaiCdC2DDw8HVRmlerbS6iPYIPKyBCvkSM4RyUx0kljZtB9AciLCkEbwy5/zA==", 394 | "dependencies": [ 395 | "@napi-rs/wasm-runtime" 396 | ], 397 | "cpu": ["wasm32"] 398 | }, 399 | "@oxc-transform/binding-win32-arm64-msvc@0.67.0": { 400 | "integrity": "sha512-+E3lOHCk4EuIk6IjshBAARknAUpgH+gHTtZxCPqK4AWYA+Tls2J6C0FVM48uZ4m3rZpAq8ZszM9JZVAkOaynBQ==", 401 | "os": ["win32"], 402 | "cpu": ["arm64"] 403 | }, 404 | "@oxc-transform/binding-win32-x64-msvc@0.67.0": { 405 | "integrity": "sha512-3pIIFb9g5aFrAODTQVJYitq+ONHgDJ4IYk/7pk+jsG6JpKUkURd0auUlxvriO11fFit5hdwy+wIbU4kBvyRUkg==", 406 | "os": ["win32"], 407 | "cpu": ["x64"] 408 | }, 409 | "@protobuf-ts/plugin-framework@2.10.0": { 410 | "integrity": "sha512-EuW9irbt+w7Ml1CaAxK6xyl7pSuWVbNy0rsChxJEthMrAVTN5EPdJ3whNWvsRBa+HwRImEl8KHNnRoq/vGOHbg==", 411 | "dependencies": [ 412 | "@protobuf-ts/runtime", 413 | "typescript" 414 | ] 415 | }, 416 | "@protobuf-ts/plugin@2.10.0": { 417 | "integrity": "sha512-iMX4C4TVfMNRLn2msK0cVg5jmizjtu5FYiy8EK5Lg6EgyR9TVHeK2rzmufWKYM2Pcg1jSwC0cFcXHQnCoeFxUg==", 418 | "dependencies": [ 419 | "@protobuf-ts/plugin-framework", 420 | "@protobuf-ts/protoc", 421 | "@protobuf-ts/runtime", 422 | "@protobuf-ts/runtime-rpc", 423 | "typescript" 424 | ], 425 | "bin": true 426 | }, 427 | "@protobuf-ts/protoc@2.10.0": { 428 | "integrity": "sha512-S4BtGBh22+uL5E6qLVxV0QNY6tiLVB8QL7RIkvo+KYknipZfSNwubdKy5CPkrwVXzJn4s3cx7bKx1w6BxkBIPg==", 429 | "bin": true 430 | }, 431 | "@protobuf-ts/runtime-rpc@2.10.0": { 432 | "integrity": "sha512-8CS/XPv3+pMK4v8UKhtCdvbS4h9l7aqlteKdRt0/UbIKZ8n0qHj6hX8cBhz2ngvohxCOS0N08zPr9aCLBNhW3Q==", 433 | "dependencies": [ 434 | "@protobuf-ts/runtime" 435 | ] 436 | }, 437 | "@protobuf-ts/runtime@2.10.0": { 438 | "integrity": "sha512-ypYwGg9Pn3W/2lZ7/HW60hONGuSdzphvOY8Dq7LeNttymDe0y3LaTUUMRpuGqOT6FfrWEMnfQbyqU8AAreo8wA==" 439 | }, 440 | "@quansync/fs@0.1.3": { 441 | "integrity": "sha512-G0OnZbMWEs5LhDyqy2UL17vGhSVHkQIfVojMtEWVenvj0V5S84VBgy86kJIuNsGDp2p7sTKlpSIpBUWdC35OKg==", 442 | "dependencies": [ 443 | "quansync" 444 | ] 445 | }, 446 | "@rolldown/binding-darwin-arm64@1.0.0-beta.8-commit.852c603": { 447 | "integrity": "sha512-V0zbNPcyRVZFUUtCiJxXMuOYriszcgzc5wW5DUA5mHDlM0gDc1snsLzM245q5fGlSLmq+Rgerkclv0ZEjgHwDw==", 448 | "os": ["darwin"], 449 | "cpu": ["arm64"] 450 | }, 451 | "@rolldown/binding-darwin-x64@1.0.0-beta.8-commit.852c603": { 452 | "integrity": "sha512-7RXXJo0U52YocMH/Bv829U3ZCXIL/+HhXme165HHflpg2flTk8dkk65Ft1lOtV80JNmUFwgfHYhvWeKz8j7qWQ==", 453 | "os": ["darwin"], 454 | "cpu": ["x64"] 455 | }, 456 | "@rolldown/binding-freebsd-x64@1.0.0-beta.8-commit.852c603": { 457 | "integrity": "sha512-vQUshBpPMdvQUfERsyjo1iNcV7wwU65mKoCwlX0e2YFI9zqyxq+fOKUEGEVrxpz4dm0kmQ5/rPdDPZQ6TcodUA==", 458 | "os": ["freebsd"], 459 | "cpu": ["x64"] 460 | }, 461 | "@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.8-commit.852c603": { 462 | "integrity": "sha512-MIeNUPb7qHB/X2Lh76Rk5cxXi0O0Cc3hRGPg8Mzwxkr5Ox5fbsJjjPHNE4g3es4VEt1NEjpZmo7XFyi1Szfbww==", 463 | "os": ["linux"], 464 | "cpu": ["arm"] 465 | }, 466 | "@rolldown/binding-linux-arm64-gnu@1.0.0-beta.8-commit.852c603": { 467 | "integrity": "sha512-f9fNXp+yROAAC49aqAeSXMFcoqNlwIsmO5Spsp2ifdFb7XWSnD1EodoCC7xIjjswMvYKnHqfQbr6dP297kN2uw==", 468 | "os": ["linux"], 469 | "cpu": ["arm64"] 470 | }, 471 | "@rolldown/binding-linux-arm64-musl@1.0.0-beta.8-commit.852c603": { 472 | "integrity": "sha512-08FSjitC8i7WWBI1DXacfhKZZ/TzjDg5uWi53aeppVWc2oT/x0TdlNVam9coU1Xs4ra6/pMe7wGroYWh/j4Lsg==", 473 | "os": ["linux"], 474 | "cpu": ["arm64"] 475 | }, 476 | "@rolldown/binding-linux-x64-gnu@1.0.0-beta.8-commit.852c603": { 477 | "integrity": "sha512-NqoANlbIhYAR8ZnF8v1d8Kw8tsd0ObpVEqNxhELqcV5HKXTtlN9uwMNWWH2G953Yj3sqTdQZWVenwr7e/YchgA==", 478 | "os": ["linux"], 479 | "cpu": ["x64"] 480 | }, 481 | "@rolldown/binding-linux-x64-musl@1.0.0-beta.8-commit.852c603": { 482 | "integrity": "sha512-ikpkqqurJsC1ijpY7vRP+qrg+7zP0JbpoMma5PyptfGeK7MQ0hhMUNr/NzMMrI11KJjkpRYJEyJ880pFknj0tQ==", 483 | "os": ["linux"], 484 | "cpu": ["x64"] 485 | }, 486 | "@rolldown/binding-wasm32-wasi@1.0.0-beta.8-commit.852c603": { 487 | "integrity": "sha512-IwMWmxkI/I60iC6M7kIhyv7X1nx61JaaeseNHARXmU3ds0d0+Sck6YuJQH8o8I3AUzWGhltOcnUHwX97qG+KgA==", 488 | "dependencies": [ 489 | "@napi-rs/wasm-runtime" 490 | ], 491 | "cpu": ["wasm32"] 492 | }, 493 | "@rolldown/binding-win32-arm64-msvc@1.0.0-beta.8-commit.852c603": { 494 | "integrity": "sha512-mgHMApQ9Ygfd70I4tmlENrdf6kot/T1UTA//Z9R3/xbXiPXwVjdw/BnTe+7AXG9t0QHXsocNx/47dj48BDuqOQ==", 495 | "os": ["win32"], 496 | "cpu": ["arm64"] 497 | }, 498 | "@rolldown/binding-win32-ia32-msvc@1.0.0-beta.8-commit.852c603": { 499 | "integrity": "sha512-pvv3FLLx2Mw2BL+YSAJeE+DNDjpRgk7oCsqf28e3sr7+zfv+VnOMxHHkJTjFzl3R8BA58OMG3C4J7Fv1SVkqbQ==", 500 | "os": ["win32"], 501 | "cpu": ["ia32"] 502 | }, 503 | "@rolldown/binding-win32-x64-msvc@1.0.0-beta.8-commit.852c603": { 504 | "integrity": "sha512-4gv06TqlMp3IArfyznTOWopMY1ZBZLkE4QZKY+BnxPh8NuDngXrBoQeOauW6w0ZN/8cuTYqX03N+3Hu7t3dNGw==", 505 | "os": ["win32"], 506 | "cpu": ["x64"] 507 | }, 508 | "@tybys/wasm-util@0.9.0": { 509 | "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", 510 | "dependencies": [ 511 | "tslib@2.8.1" 512 | ] 513 | }, 514 | "@types/node@20.17.47": { 515 | "integrity": "sha512-3dLX0Upo1v7RvUimvxLeXqwrfyKxUINk0EAM83swP2mlSUcwV73sZy8XhNz8bcZ3VbsfQyC/y6jRdL5tgCNpDQ==", 516 | "dependencies": [ 517 | "undici-types" 518 | ] 519 | }, 520 | "@types/semver@7.7.0": { 521 | "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==" 522 | }, 523 | "@typespec/ts-http-runtime@0.2.2": { 524 | "integrity": "sha512-Gz/Sm64+Sq/vklJu1tt9t+4R2lvnud8NbTD/ZfpZtMiUX7YeVpCA8j6NSW8ptwcoLL+NmYANwqP8DV0q/bwl2w==", 525 | "dependencies": [ 526 | "http-proxy-agent", 527 | "https-proxy-agent", 528 | "tslib@2.8.1" 529 | ] 530 | }, 531 | "@valibot/to-json-schema@1.0.0_valibot@1.0.0": { 532 | "integrity": "sha512-/9crJgPptVsGCL6X+JPDQyaJwkalSZ/52WuF8DiRUxJgcmpNdzYRfZ+gqMEP8W3CTVfuMWPqqvIgfwJ97f9Etw==", 533 | "dependencies": [ 534 | "valibot" 535 | ] 536 | }, 537 | "abort-controller@3.0.0": { 538 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 539 | "dependencies": [ 540 | "event-target-shim" 541 | ] 542 | }, 543 | "acorn@8.14.1": { 544 | "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", 545 | "bin": true 546 | }, 547 | "agent-base@7.1.3": { 548 | "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==" 549 | }, 550 | "ansis@3.17.0": { 551 | "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==" 552 | }, 553 | "ast-kit@1.4.3": { 554 | "integrity": "sha512-MdJqjpodkS5J149zN0Po+HPshkTdUyrvF7CKTafUgv69vBSPtncrj+3IiUgqdd7ElIEkbeXCsEouBUwLrw9Ilg==", 555 | "dependencies": [ 556 | "@babel/parser", 557 | "pathe" 558 | ] 559 | }, 560 | "asynckit@0.4.0": { 561 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 562 | }, 563 | "balanced-match@1.0.2": { 564 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 565 | }, 566 | "brace-expansion@1.1.11": { 567 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 568 | "dependencies": [ 569 | "balanced-match", 570 | "concat-map" 571 | ] 572 | }, 573 | "cac@6.7.14": { 574 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==" 575 | }, 576 | "call-bind-apply-helpers@1.0.2": { 577 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 578 | "dependencies": [ 579 | "es-errors", 580 | "function-bind" 581 | ] 582 | }, 583 | "chokidar@4.0.3": { 584 | "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", 585 | "dependencies": [ 586 | "readdirp" 587 | ] 588 | }, 589 | "combined-stream@1.0.8": { 590 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 591 | "dependencies": [ 592 | "delayed-stream" 593 | ] 594 | }, 595 | "concat-map@0.0.1": { 596 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 597 | }, 598 | "consola@3.4.2": { 599 | "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==" 600 | }, 601 | "debug@4.4.1": { 602 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 603 | "dependencies": [ 604 | "ms" 605 | ] 606 | }, 607 | "defu@6.1.4": { 608 | "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" 609 | }, 610 | "delayed-stream@1.0.0": { 611 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 612 | }, 613 | "detect-libc@2.0.4": { 614 | "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==" 615 | }, 616 | "diff@7.0.0": { 617 | "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==" 618 | }, 619 | "dts-resolver@1.2.0": { 620 | "integrity": "sha512-+xNF7raXYI1E3IFB+f3JqvoKYFI8R+1Mh9mpI75yNm3F5XuiC6ErEXe2Lqh9ach+4MQ1tOefzjxulhWGVclYbg==", 621 | "dependencies": [ 622 | "oxc-resolver", 623 | "pathe" 624 | ] 625 | }, 626 | "dunder-proto@1.0.1": { 627 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 628 | "dependencies": [ 629 | "call-bind-apply-helpers", 630 | "es-errors", 631 | "gopd" 632 | ] 633 | }, 634 | "empathic@1.1.0": { 635 | "integrity": "sha512-rsPft6CK3eHtrlp9Y5ALBb+hfK+DWnA4WFebbazxjWyx8vSm3rZeoM3z9irsjcqO3PYRzlfv27XIB4tz2DV7RA==" 636 | }, 637 | "es-define-property@1.0.1": { 638 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" 639 | }, 640 | "es-errors@1.3.0": { 641 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" 642 | }, 643 | "es-object-atoms@1.1.1": { 644 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 645 | "dependencies": [ 646 | "es-errors" 647 | ] 648 | }, 649 | "es-set-tostringtag@2.1.0": { 650 | "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", 651 | "dependencies": [ 652 | "es-errors", 653 | "get-intrinsic", 654 | "has-tostringtag", 655 | "hasown" 656 | ] 657 | }, 658 | "event-target-shim@5.0.1": { 659 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 660 | }, 661 | "events@3.3.0": { 662 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" 663 | }, 664 | "fast-xml-parser@5.2.3": { 665 | "integrity": "sha512-OdCYfRqfpuLUFonTNjvd30rCBZUneHpSQkCqfaeWQ9qrKcl6XlWeDBNVwGb+INAIxRshuN2jF+BE0L6gbBO2mw==", 666 | "dependencies": [ 667 | "strnum" 668 | ], 669 | "bin": true 670 | }, 671 | "fdir@6.4.4_picomatch@4.0.2": { 672 | "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", 673 | "dependencies": [ 674 | "picomatch" 675 | ], 676 | "optionalPeers": [ 677 | "picomatch" 678 | ] 679 | }, 680 | "form-data@2.5.3": { 681 | "integrity": "sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==", 682 | "dependencies": [ 683 | "asynckit", 684 | "combined-stream", 685 | "es-set-tostringtag", 686 | "mime-types", 687 | "safe-buffer" 688 | ] 689 | }, 690 | "function-bind@1.1.2": { 691 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" 692 | }, 693 | "get-intrinsic@1.3.0": { 694 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 695 | "dependencies": [ 696 | "call-bind-apply-helpers", 697 | "es-define-property", 698 | "es-errors", 699 | "es-object-atoms", 700 | "function-bind", 701 | "get-proto", 702 | "gopd", 703 | "has-symbols", 704 | "hasown", 705 | "math-intrinsics" 706 | ] 707 | }, 708 | "get-proto@1.0.1": { 709 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 710 | "dependencies": [ 711 | "dunder-proto", 712 | "es-object-atoms" 713 | ] 714 | }, 715 | "get-tsconfig@4.10.0": { 716 | "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", 717 | "dependencies": [ 718 | "resolve-pkg-maps" 719 | ] 720 | }, 721 | "gopd@1.2.0": { 722 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" 723 | }, 724 | "has-symbols@1.1.0": { 725 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" 726 | }, 727 | "has-tostringtag@1.0.2": { 728 | "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 729 | "dependencies": [ 730 | "has-symbols" 731 | ] 732 | }, 733 | "hasown@2.0.2": { 734 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 735 | "dependencies": [ 736 | "function-bind" 737 | ] 738 | }, 739 | "hookable@5.5.3": { 740 | "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==" 741 | }, 742 | "http-proxy-agent@7.0.2": { 743 | "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", 744 | "dependencies": [ 745 | "agent-base", 746 | "debug" 747 | ] 748 | }, 749 | "https-proxy-agent@7.0.6": { 750 | "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 751 | "dependencies": [ 752 | "agent-base", 753 | "debug" 754 | ] 755 | }, 756 | "jiti@2.4.2": { 757 | "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", 758 | "bin": true 759 | }, 760 | "jsesc@3.1.0": { 761 | "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 762 | "bin": true 763 | }, 764 | "lightningcss-darwin-arm64@1.30.1": { 765 | "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", 766 | "os": ["darwin"], 767 | "cpu": ["arm64"] 768 | }, 769 | "lightningcss-darwin-x64@1.30.1": { 770 | "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", 771 | "os": ["darwin"], 772 | "cpu": ["x64"] 773 | }, 774 | "lightningcss-freebsd-x64@1.30.1": { 775 | "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", 776 | "os": ["freebsd"], 777 | "cpu": ["x64"] 778 | }, 779 | "lightningcss-linux-arm-gnueabihf@1.30.1": { 780 | "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", 781 | "os": ["linux"], 782 | "cpu": ["arm"] 783 | }, 784 | "lightningcss-linux-arm64-gnu@1.30.1": { 785 | "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", 786 | "os": ["linux"], 787 | "cpu": ["arm64"] 788 | }, 789 | "lightningcss-linux-arm64-musl@1.30.1": { 790 | "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", 791 | "os": ["linux"], 792 | "cpu": ["arm64"] 793 | }, 794 | "lightningcss-linux-x64-gnu@1.30.1": { 795 | "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", 796 | "os": ["linux"], 797 | "cpu": ["x64"] 798 | }, 799 | "lightningcss-linux-x64-musl@1.30.1": { 800 | "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", 801 | "os": ["linux"], 802 | "cpu": ["x64"] 803 | }, 804 | "lightningcss-win32-arm64-msvc@1.30.1": { 805 | "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", 806 | "os": ["win32"], 807 | "cpu": ["arm64"] 808 | }, 809 | "lightningcss-win32-x64-msvc@1.30.1": { 810 | "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", 811 | "os": ["win32"], 812 | "cpu": ["x64"] 813 | }, 814 | "lightningcss@1.30.1": { 815 | "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", 816 | "dependencies": [ 817 | "detect-libc" 818 | ], 819 | "optionalDependencies": [ 820 | "lightningcss-darwin-arm64", 821 | "lightningcss-darwin-x64", 822 | "lightningcss-freebsd-x64", 823 | "lightningcss-linux-arm-gnueabihf", 824 | "lightningcss-linux-arm64-gnu", 825 | "lightningcss-linux-arm64-musl", 826 | "lightningcss-linux-x64-gnu", 827 | "lightningcss-linux-x64-musl", 828 | "lightningcss-win32-arm64-msvc", 829 | "lightningcss-win32-x64-msvc" 830 | ] 831 | }, 832 | "magic-string@0.30.17": { 833 | "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", 834 | "dependencies": [ 835 | "@jridgewell/sourcemap-codec" 836 | ] 837 | }, 838 | "math-intrinsics@1.1.0": { 839 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" 840 | }, 841 | "mime-db@1.52.0": { 842 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 843 | }, 844 | "mime-types@2.1.35": { 845 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 846 | "dependencies": [ 847 | "mime-db" 848 | ] 849 | }, 850 | "minimatch@3.1.2": { 851 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 852 | "dependencies": [ 853 | "brace-expansion" 854 | ] 855 | }, 856 | "ms@2.1.3": { 857 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 858 | }, 859 | "node-fetch@2.7.0": { 860 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 861 | "dependencies": [ 862 | "whatwg-url" 863 | ] 864 | }, 865 | "oxc-resolver@9.0.2": { 866 | "integrity": "sha512-w838ygc1p7rF+7+h5vR9A+Y9Fc4imy6C3xPthCMkdFUgFvUWkmABeNB8RBDQ6+afk44Q60/UMMQ+gfDUW99fBA==", 867 | "optionalDependencies": [ 868 | "@oxc-resolver/binding-darwin-arm64", 869 | "@oxc-resolver/binding-darwin-x64", 870 | "@oxc-resolver/binding-freebsd-x64", 871 | "@oxc-resolver/binding-linux-arm-gnueabihf", 872 | "@oxc-resolver/binding-linux-arm64-gnu", 873 | "@oxc-resolver/binding-linux-arm64-musl", 874 | "@oxc-resolver/binding-linux-riscv64-gnu", 875 | "@oxc-resolver/binding-linux-s390x-gnu", 876 | "@oxc-resolver/binding-linux-x64-gnu", 877 | "@oxc-resolver/binding-linux-x64-musl", 878 | "@oxc-resolver/binding-wasm32-wasi", 879 | "@oxc-resolver/binding-win32-arm64-msvc", 880 | "@oxc-resolver/binding-win32-x64-msvc" 881 | ] 882 | }, 883 | "oxc-transform@0.67.0": { 884 | "integrity": "sha512-QXwmpLfNrXZoHgIjEtDEf6lhwmvHouNtstNgg/UveczVIjo8VSzd5h25Ea96PoX9KzReJUY/qYa4QSNkJpZGfA==", 885 | "optionalDependencies": [ 886 | "@oxc-transform/binding-darwin-arm64", 887 | "@oxc-transform/binding-darwin-x64", 888 | "@oxc-transform/binding-linux-arm-gnueabihf", 889 | "@oxc-transform/binding-linux-arm64-gnu", 890 | "@oxc-transform/binding-linux-arm64-musl", 891 | "@oxc-transform/binding-linux-x64-gnu", 892 | "@oxc-transform/binding-linux-x64-musl", 893 | "@oxc-transform/binding-wasm32-wasi", 894 | "@oxc-transform/binding-win32-arm64-msvc", 895 | "@oxc-transform/binding-win32-x64-msvc" 896 | ] 897 | }, 898 | "pathe@2.0.3": { 899 | "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" 900 | }, 901 | "picomatch@4.0.2": { 902 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" 903 | }, 904 | "quansync@0.2.10": { 905 | "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==" 906 | }, 907 | "readdirp@4.1.2": { 908 | "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==" 909 | }, 910 | "resolve-pkg-maps@1.0.0": { 911 | "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==" 912 | }, 913 | "rolldown-plugin-dts@0.9.11_rolldown@1.0.0-beta.8-commit.852c603__valibot@1.0.0": { 914 | "integrity": "sha512-iCIRKmvPLwRV4UKSxhaBo+5wDkvc3+MFiqYYvu7sGLSohzxoDn9WEsjN3y7A6xg3aCuxHh6rlRp8xbX98r1rSg==", 915 | "dependencies": [ 916 | "@babel/generator", 917 | "@babel/parser", 918 | "@babel/types", 919 | "ast-kit", 920 | "debug", 921 | "dts-resolver", 922 | "get-tsconfig", 923 | "oxc-transform", 924 | "rolldown" 925 | ] 926 | }, 927 | "rolldown@1.0.0-beta.8-commit.852c603_valibot@1.0.0": { 928 | "integrity": "sha512-5sq8IPiJ8q/IlL084zf8fPhflsdNrKE7gwXma7m820u8oQtkAEmhb8cmHw6jztlidgOe3hpUIm55HevPmVRelQ==", 929 | "dependencies": [ 930 | "@oxc-project/types", 931 | "@valibot/to-json-schema", 932 | "ansis", 933 | "valibot" 934 | ], 935 | "optionalDependencies": [ 936 | "@rolldown/binding-darwin-arm64", 937 | "@rolldown/binding-darwin-x64", 938 | "@rolldown/binding-freebsd-x64", 939 | "@rolldown/binding-linux-arm-gnueabihf", 940 | "@rolldown/binding-linux-arm64-gnu", 941 | "@rolldown/binding-linux-arm64-musl", 942 | "@rolldown/binding-linux-x64-gnu", 943 | "@rolldown/binding-linux-x64-musl", 944 | "@rolldown/binding-wasm32-wasi", 945 | "@rolldown/binding-win32-arm64-msvc", 946 | "@rolldown/binding-win32-ia32-msvc", 947 | "@rolldown/binding-win32-x64-msvc" 948 | ], 949 | "bin": true 950 | }, 951 | "safe-buffer@5.2.1": { 952 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 953 | }, 954 | "sax@1.4.1": { 955 | "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" 956 | }, 957 | "semver@6.3.1": { 958 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 959 | "bin": true 960 | }, 961 | "semver@7.7.2": { 962 | "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", 963 | "bin": true 964 | }, 965 | "strnum@2.1.0": { 966 | "integrity": "sha512-w0S//9BqZZGw0L0Y8uLSelFGnDJgTyyNQLmSlPnVz43zPAiqu3w4t8J8sDqqANOGeZIZ/9jWuPguYcEnsoHv4A==" 967 | }, 968 | "tinyexec@1.0.1": { 969 | "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==" 970 | }, 971 | "tinyglobby@0.2.13_picomatch@4.0.2": { 972 | "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", 973 | "dependencies": [ 974 | "fdir", 975 | "picomatch" 976 | ] 977 | }, 978 | "tr46@0.0.3": { 979 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 980 | }, 981 | "tsdown@0.10.1_rolldown@1.0.0-beta.8-commit.852c603__valibot@1.0.0": { 982 | "integrity": "sha512-NT1XSUDweBpgpiZb3Upfy3DBwAbn8W0aXo3Ecp4kHozTLewWa0UkWUP6nRTvSj2c0NcD/BLLuf0HthqMpbEdkA==", 983 | "dependencies": [ 984 | "ansis", 985 | "cac", 986 | "chokidar", 987 | "consola", 988 | "debug", 989 | "diff", 990 | "empathic", 991 | "hookable", 992 | "lightningcss", 993 | "rolldown", 994 | "rolldown-plugin-dts", 995 | "tinyexec", 996 | "tinyglobby", 997 | "unconfig", 998 | "unplugin-lightningcss" 999 | ], 1000 | "bin": true 1001 | }, 1002 | "tslib@1.14.1": { 1003 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 1004 | }, 1005 | "tslib@2.8.1": { 1006 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" 1007 | }, 1008 | "tunnel@0.0.6": { 1009 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" 1010 | }, 1011 | "typescript@3.9.10": { 1012 | "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", 1013 | "bin": true 1014 | }, 1015 | "unconfig@7.3.2": { 1016 | "integrity": "sha512-nqG5NNL2wFVGZ0NA/aCFw0oJ2pxSf1lwg4Z5ill8wd7K4KX/rQbHlwbh+bjctXL5Ly1xtzHenHGOK0b+lG6JVg==", 1017 | "dependencies": [ 1018 | "@quansync/fs", 1019 | "defu", 1020 | "jiti", 1021 | "quansync" 1022 | ] 1023 | }, 1024 | "undici-types@6.19.8": { 1025 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" 1026 | }, 1027 | "undici@5.29.0": { 1028 | "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", 1029 | "dependencies": [ 1030 | "@fastify/busboy" 1031 | ] 1032 | }, 1033 | "undici@7.9.0": { 1034 | "integrity": "sha512-e696y354tf5cFZPXsF26Yg+5M63+5H3oE6Vtkh2oqbvsE2Oe7s2nIbcQh5lmG7Lp/eS29vJtTpw9+p6PX0qNSg==" 1035 | }, 1036 | "unplugin-lightningcss@0.3.3": { 1037 | "integrity": "sha512-mMNRCNIcxc/3410w7sJdXcPxn0IGZdEpq42OBDyckdGkhOeWYZCG9RkHs72TFyBsS82a4agFDOFU8VrFKF2ZvA==", 1038 | "dependencies": [ 1039 | "lightningcss", 1040 | "magic-string", 1041 | "unplugin" 1042 | ] 1043 | }, 1044 | "unplugin@2.3.4": { 1045 | "integrity": "sha512-m4PjxTurwpWfpMomp8AptjD5yj8qEZN5uQjjGM3TAs9MWWD2tXSSNNj6jGR2FoVGod4293ytyV6SwBbertfyJg==", 1046 | "dependencies": [ 1047 | "acorn", 1048 | "picomatch", 1049 | "webpack-virtual-modules" 1050 | ] 1051 | }, 1052 | "uuid@8.3.2": { 1053 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 1054 | "bin": true 1055 | }, 1056 | "valibot@1.0.0": { 1057 | "integrity": "sha512-1Hc0ihzWxBar6NGeZv7fPLY0QuxFMyxwYR2sF1Blu7Wq7EnremwY2W02tit2ij2VJT8HcSkHAQqmFfl77f73Yw==" 1058 | }, 1059 | "webidl-conversions@3.0.1": { 1060 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 1061 | }, 1062 | "webpack-virtual-modules@0.6.2": { 1063 | "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==" 1064 | }, 1065 | "whatwg-url@5.0.0": { 1066 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 1067 | "dependencies": [ 1068 | "tr46", 1069 | "webidl-conversions" 1070 | ] 1071 | }, 1072 | "xml2js@0.5.0": { 1073 | "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", 1074 | "dependencies": [ 1075 | "sax", 1076 | "xmlbuilder" 1077 | ] 1078 | }, 1079 | "xmlbuilder@11.0.1": { 1080 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" 1081 | } 1082 | }, 1083 | "workspace": { 1084 | "packageJson": { 1085 | "dependencies": [ 1086 | "npm:@actions/cache@4.0.3", 1087 | "npm:@actions/core@^1.11.1", 1088 | "npm:@actions/glob@0.5", 1089 | "npm:@actions/tool-cache@^2.0.2", 1090 | "npm:@types/node@^20.16.5", 1091 | "npm:@types/semver@^7.7.0", 1092 | "npm:semver@^7.7.1", 1093 | "npm:tsdown@0.10.1", 1094 | "npm:undici@^7.8.0" 1095 | ] 1096 | } 1097 | } 1098 | } 1099 | -------------------------------------------------------------------------------- /dist/cache-CSb2jW5L.mjs: -------------------------------------------------------------------------------- 1 | import "./semver-C43QPvfi.mjs"; 2 | import { restoreCache, saveCache } from "./cache-BG71A93Z.mjs"; 3 | 4 | export { restoreCache }; -------------------------------------------------------------------------------- /dist/post.mjs: -------------------------------------------------------------------------------- 1 | import { import_core } from "./semver-C43QPvfi.mjs"; 2 | import { saveCache } from "./cache-BG71A93Z.mjs"; 3 | import process from "node:process"; 4 | 5 | //#region src/post.ts 6 | async function main() { 7 | try { 8 | await saveCache(); 9 | } catch (err) { 10 | import_core.setFailed(err instanceof Error ? err : String(err)); 11 | process.exit(); 12 | } 13 | } 14 | main(); 15 | 16 | //#endregion -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "setup-deno", 3 | "description": "Set up Deno easily in GitHub Actions", 4 | "version": "2.0.3", 5 | "author": "Deno Land Inc", 6 | "license": "MIT", 7 | "type": "module", 8 | "devDependencies": { 9 | "@actions/cache": "4.0.3", 10 | "@actions/core": "^1.11.1", 11 | "@actions/glob": "^0.5.0", 12 | "@actions/tool-cache": "^2.0.2", 13 | "semver": "^7.7.1", 14 | "undici": "^7.8.0", 15 | "@types/node": "^20.16.5", 16 | "@types/semver": "^7.7.0", 17 | "tsdown": "0.10.1" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /scripts/build.ts: -------------------------------------------------------------------------------- 1 | import { build } from "tsdown"; 2 | import { join } from "node:path"; 3 | 4 | // Ensure `deno install` has run before building 5 | await new Deno.Command(Deno.execPath(), { 6 | args: ["install"], 7 | cwd: join(import.meta.dirname!, ".."), 8 | stdout: "inherit", 9 | stderr: "inherit", 10 | }).output(); 11 | 12 | try { 13 | Deno.removeSync(join(import.meta.dirname!, "../dist"), { recursive: true }); 14 | } catch { 15 | // ignore 16 | } 17 | 18 | await build({ 19 | entry: { 20 | main: "src/main.ts", 21 | post: "src/post.ts", 22 | }, 23 | target: "node20.19", 24 | platform: "node", 25 | format: "esm", 26 | fixedExtension: true, 27 | }); 28 | -------------------------------------------------------------------------------- /src/cache.ts: -------------------------------------------------------------------------------- 1 | import process from "node:process"; 2 | import cache from "@actions/cache"; 3 | import core from "@actions/core"; 4 | import { hashFiles } from "@actions/glob"; 5 | 6 | const state = { 7 | DENO_DIR: "DENO_DIR", 8 | CACHE_HIT: "CACHE_HIT", 9 | CACHE_SAVE: "CACHE_SAVE", 10 | } as const; 11 | 12 | export async function saveCache() { 13 | if (!cache.isFeatureAvailable()) { 14 | core.warning("Caching is not available. Caching is skipped."); 15 | return; 16 | } 17 | 18 | const denoDir = core.getState(state.DENO_DIR); 19 | const saveKey = core.getState(state.CACHE_SAVE); 20 | if (!denoDir || !saveKey) { 21 | core.info("Caching is not enabled. Caching is skipped."); 22 | return; 23 | } else if (core.getState(state.CACHE_HIT) === "true") { 24 | core.info( 25 | `Cache hit occurred on the primary key "${saveKey}", not saving cache.`, 26 | ); 27 | return; 28 | } 29 | 30 | await cache.saveCache([denoDir], saveKey); 31 | core.info(`Cache saved with key: "${saveKey}".`); 32 | } 33 | 34 | export async function restoreCache(cacheHash: string) { 35 | try { 36 | const denoDir = await resolveDenoDir(); 37 | core.saveState(state.DENO_DIR, denoDir); 38 | 39 | if (cacheHash.length === 0) { 40 | cacheHash = await resolveDefaultCacheKey(); 41 | } 42 | 43 | const { GITHUB_JOB, RUNNER_OS, RUNNER_ARCH } = process.env; 44 | const restoreKey = `deno-cache-${RUNNER_OS}-${RUNNER_ARCH}`; 45 | // CI jobs often download different dependencies, so include Job ID in the cache key. 46 | const primaryKey = `${restoreKey}-${GITHUB_JOB}-${cacheHash}`; 47 | core.saveState(state.CACHE_SAVE, primaryKey); 48 | 49 | const loadedCacheKey = await cache.restoreCache([denoDir], primaryKey, [ 50 | restoreKey, 51 | ]); 52 | const cacheHit = primaryKey === loadedCacheKey; 53 | core.setOutput("cache-hit", cacheHit); 54 | core.saveState(state.CACHE_HIT, cacheHit); 55 | 56 | const message = loadedCacheKey 57 | ? `Cache key used: "${loadedCacheKey}".` 58 | : `No cache found for restore key: "${restoreKey}".`; 59 | core.info(message); 60 | } catch (err) { 61 | core.warning( 62 | new Error("Failed to restore cache. Continuing without cache."), 63 | ); 64 | // core.warning doesn't log error causes, so explicititly log the error 65 | core.warning(err as Error); 66 | } 67 | } 68 | 69 | function resolveDefaultCacheKey(): Promise { 70 | return hashFiles( 71 | "**/deno.lock", 72 | process.env.GITHUB_WORKSPACE, 73 | ); 74 | } 75 | 76 | async function resolveDenoDir(): Promise { 77 | const { DENO_DIR } = process.env; 78 | if (DENO_DIR) { 79 | return DENO_DIR; 80 | } 81 | 82 | // Retrieve the DENO_DIR from `deno info --json` 83 | const output = await exec("deno info --json"); 84 | const info = JSON.parse(output); 85 | if (typeof info.denoDir !== "string") { 86 | throw new Error( 87 | "`deno info --json` output did not contain a denoDir property. " + 88 | "Maybe try updating this action or your Deno version if either are old.", 89 | ); 90 | } 91 | return info.denoDir; 92 | } 93 | 94 | async function exec(command: string) { 95 | const { exec } = await import("node:child_process"); 96 | return await new Promise((res, rej) => { 97 | exec(command, (err, stdout) => err ? rej(err) : res(stdout)); 98 | }); 99 | } 100 | -------------------------------------------------------------------------------- /src/install.ts: -------------------------------------------------------------------------------- 1 | import * as os from "node:os"; 2 | import * as path from "node:path"; 3 | import * as fs from "node:fs/promises"; 4 | import process from "node:process"; 5 | import core from "@actions/core"; 6 | import tc from "@actions/tool-cache"; 7 | import type { Version } from "./version.ts"; 8 | 9 | export async function install(version: Version) { 10 | const cachedPath = tc.find( 11 | "deno", 12 | version.kind === "canary" ? `0.0.0-${version.version}` : version.version, 13 | ); 14 | if (cachedPath) { 15 | core.info(`Using cached Deno installation from ${cachedPath}.`); 16 | core.addPath(cachedPath); 17 | return; 18 | } 19 | 20 | const zip = zipName(); 21 | let url; 22 | 23 | switch (version.kind) { 24 | case "canary": 25 | url = `https://dl.deno.land/canary/${version.version}/${zip}`; 26 | break; 27 | case "rc": 28 | url = `https://dl.deno.land/release/v${version.version}/${zip}`; 29 | break; 30 | case "stable": 31 | case "lts": 32 | url = 33 | `https://github.com/denoland/deno/releases/download/v${version.version}/${zip}`; 34 | break; 35 | } 36 | 37 | core.info(`Downloading Deno from ${url}.`); 38 | 39 | const zipPath = await tc.downloadTool(url); 40 | const extractedFolder = await tc.extractZip(zipPath); 41 | 42 | const binaryName = core.getInput("deno-binary-name"); 43 | if (binaryName !== "deno") { 44 | await fs.rename( 45 | path.join( 46 | extractedFolder, 47 | process.platform === "win32" ? "deno.exe" : "deno", 48 | ), 49 | path.join( 50 | extractedFolder, 51 | process.platform === "win32" ? binaryName + ".exe" : binaryName, 52 | ), 53 | ); 54 | } 55 | 56 | const newCachedPath = await tc.cacheDir( 57 | extractedFolder, 58 | binaryName, 59 | version.kind === "canary" ? `0.0.0-${version.version}` : version.version, 60 | ); 61 | core.info(`Cached Deno to ${newCachedPath}.`); 62 | core.addPath(newCachedPath); 63 | const denoInstallRoot = process.env.DENO_INSTALL_ROOT || 64 | path.join(os.homedir(), ".deno", "bin"); 65 | core.addPath(denoInstallRoot); 66 | } 67 | 68 | function zipName(): string { 69 | let arch; 70 | switch (process.arch) { 71 | case "arm64": 72 | arch = "aarch64"; 73 | break; 74 | case "x64": 75 | arch = "x86_64"; 76 | break; 77 | default: 78 | throw new Error(`Unsupported architechture ${process.arch}.`); 79 | } 80 | 81 | let platform; 82 | switch (process.platform) { 83 | case "linux": 84 | platform = "unknown-linux-gnu"; 85 | break; 86 | case "darwin": 87 | platform = "apple-darwin"; 88 | break; 89 | case "win32": 90 | platform = "pc-windows-msvc"; 91 | break; 92 | default: 93 | throw new Error(`Unsupported platform ${process.platform}.`); 94 | } 95 | 96 | return `deno-${arch}-${platform}.zip`; 97 | } 98 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import process from "node:process"; 2 | import core from "@actions/core"; 3 | import path from "node:path"; 4 | import { 5 | getDenoVersionFromFile, 6 | parseVersionRange, 7 | resolveVersion, 8 | } from "./version.ts"; 9 | import { install } from "./install.ts"; 10 | 11 | declare global { 12 | interface ImportMeta { 13 | dirname?: string; 14 | filename?: string; 15 | } 16 | } 17 | 18 | function exit(message: string): never { 19 | core.setFailed(message); 20 | process.exit(); 21 | } 22 | 23 | function isCachingEnabled() { 24 | return core.getInput("cache") === "true" || 25 | core.getInput("cache-hash").length > 0; 26 | } 27 | 28 | async function main() { 29 | try { 30 | const denoVersionFile = core.getInput("deno-version-file"); 31 | const range = parseVersionRange( 32 | denoVersionFile 33 | ? getDenoVersionFromFile(denoVersionFile) 34 | : core.getInput("deno-version"), 35 | ); 36 | 37 | if (range === null) { 38 | exit("The passed version range is not valid."); 39 | } 40 | 41 | const version = await resolveVersion(range); 42 | if (version === null) { 43 | exit("Could not resolve a version for the given range."); 44 | } 45 | 46 | core.info(`Going to install ${version.kind} version ${version.version}.`); 47 | 48 | await install(version); 49 | 50 | core.info( 51 | `::add-matcher::${ 52 | path.join( 53 | import.meta.dirname ?? ".", 54 | "..", 55 | "deno-problem-matchers.json", 56 | ) 57 | }`, 58 | ); 59 | 60 | core.setOutput("deno-version", version.version); 61 | core.setOutput("release-channel", version.kind); 62 | 63 | core.info("Installation complete."); 64 | 65 | if (isCachingEnabled()) { 66 | const { restoreCache } = await import("./cache.ts"); 67 | await restoreCache(core.getInput("cache-hash")); 68 | } 69 | } catch (err) { 70 | core.setFailed((err instanceof Error) ? err : String(err)); 71 | process.exit(); 72 | } 73 | } 74 | 75 | main(); 76 | -------------------------------------------------------------------------------- /src/post.ts: -------------------------------------------------------------------------------- 1 | import process from "node:process"; 2 | import core from "@actions/core"; 3 | import { saveCache } from "./cache.ts"; 4 | 5 | async function main() { 6 | try { 7 | await saveCache(); 8 | } catch (err) { 9 | core.setFailed((err instanceof Error) ? err : String(err)); 10 | process.exit(); 11 | } 12 | } 13 | 14 | main(); 15 | -------------------------------------------------------------------------------- /src/version.ts: -------------------------------------------------------------------------------- 1 | // @ts-types="@types/semver" 2 | import semver from "semver"; 3 | import { fetch } from "undici"; 4 | import * as fs from "node:fs"; 5 | import * as console from "node:console"; 6 | import { setTimeout } from "node:timers"; 7 | 8 | const GIT_HASH_RE = /^[0-9a-fA-F]{40}$/; 9 | 10 | export interface VersionRange { 11 | range: string; 12 | kind: "canary" | "rc" | "stable" | "lts"; 13 | } 14 | 15 | export interface Version { 16 | version: string; 17 | kind: "canary" | "rc" | "stable" | "lts"; 18 | } 19 | 20 | /** Parses the version from the user into a structure */ 21 | export function parseVersionRange( 22 | version: string | undefined, 23 | ): VersionRange | null { 24 | version = String(version) || "2.x"; 25 | version = version.trim(); 26 | 27 | if (version === "canary") { 28 | return { range: "latest", kind: "canary" }; 29 | } 30 | 31 | if (version === "rc") { 32 | return { range: "latest", kind: "rc" }; 33 | } 34 | 35 | if (version === "latest") { 36 | return { range: "latest", kind: "stable" }; 37 | } 38 | 39 | if (version === "lts") { 40 | return { range: "latest", kind: "lts" }; 41 | } 42 | 43 | if (GIT_HASH_RE.test(version)) { 44 | return { range: version, kind: "canary" }; 45 | } 46 | 47 | const range = semver.validRange(version); 48 | if (range !== null) { 49 | return { range, kind: "stable" }; 50 | } 51 | 52 | return null; 53 | } 54 | 55 | /** Parses the version from the version file */ 56 | export function getDenoVersionFromFile( 57 | versionFilePath: string, 58 | ): string | undefined { 59 | if (!fs.existsSync(versionFilePath)) { 60 | throw new Error( 61 | `The specified node version file at: ${versionFilePath} does not exist`, 62 | ); 63 | } 64 | 65 | const contents = fs.readFileSync(versionFilePath, "utf8"); 66 | 67 | // .tool-versions typically looks like 68 | // ``` 69 | // ruby 2.6.5 70 | // deno 1.43.1 71 | // node 20.0.0 72 | // ``` 73 | // This parses the version of Deno from the file 74 | const denoVersionInToolVersions = contents.match( 75 | /^deno\s+v?(?[^\s]+)$/m, 76 | ); 77 | 78 | return denoVersionInToolVersions?.groups?.version || contents.trim(); 79 | } 80 | 81 | export function resolveVersion( 82 | { range, kind }: VersionRange, 83 | ): Promise { 84 | if (kind === "canary") { 85 | return resolveCanary(range); 86 | } else if (kind === "rc") { 87 | // range is always "latest" 88 | return resolveReleaseCandidate(); 89 | } else if (kind === "lts") { 90 | return resolveLTS(); 91 | } else { 92 | return resolveRelease(range); 93 | } 94 | } 95 | 96 | async function resolveCanary(range: string): Promise { 97 | if (range === "latest") { 98 | const res = await fetchWithRetries( 99 | "https://dl.deno.land/canary-latest.txt", 100 | ); 101 | if (res.status !== 200) { 102 | throw new Error( 103 | "Failed to fetch canary version info from dl.deno.land. Please try again later.", 104 | ); 105 | } 106 | const version = (await res.text()).trim(); 107 | return { version, kind: "canary" }; 108 | } else { 109 | return { version: range, kind: "canary" }; 110 | } 111 | } 112 | 113 | async function resolveReleaseCandidate(): Promise { 114 | const res = await fetchWithRetries( 115 | "https://dl.deno.land/release-rc-latest.txt", 116 | ); 117 | if (res.status !== 200) { 118 | throw new Error( 119 | "Failed to fetch release candidate version info from dl.deno.land. Please try again later.", 120 | ); 121 | } 122 | const version = semver.clean((await res.text()).trim()); 123 | if (version === null) { 124 | throw new Error("Failed to parse release candidate version."); 125 | } 126 | return { version, kind: "rc" }; 127 | } 128 | 129 | async function resolveLTS(): Promise { 130 | const res = await fetchWithRetries( 131 | "https://dl.deno.land/release-lts-latest.txt", 132 | ); 133 | if (res.status !== 200) { 134 | throw new Error( 135 | "Failed to fetch LTS version info from dl.deno.land. Please try again later.", 136 | ); 137 | } 138 | const version = semver.clean((await res.text()).trim()); 139 | if (version === null) { 140 | throw new Error("Failed to parse LTS version."); 141 | } 142 | return { version, kind: "lts" }; 143 | } 144 | 145 | async function resolveRelease(range: string): Promise { 146 | if (range === "latest") { 147 | const res = await fetchWithRetries( 148 | "https://dl.deno.land/release-latest.txt", 149 | ); 150 | if (res.status !== 200) { 151 | throw new Error( 152 | "Failed to fetch release version info from dl.deno.land. Please try again later.", 153 | ); 154 | } 155 | let version: string | null = (await res.text()).trim(); 156 | version = semver.clean(version); 157 | if (version === null) { 158 | throw new Error("Failed to parse release version."); 159 | } 160 | return { version, kind: "stable" }; 161 | } else { 162 | const res = await fetchWithRetries("https://deno.com/versions.json"); 163 | if (res.status !== 200) { 164 | throw new Error( 165 | "Failed to fetch stable version info from deno.com/versions.json. Please try again later.", 166 | ); 167 | } 168 | const versionJson = await res.json(); 169 | if (typeof versionJson !== "object" || versionJson === null) { 170 | throw new Error("Fetched stable version info is invalid."); 171 | } 172 | if (!("cli" in versionJson)) { 173 | throw new Error("Fetched stable version info is invalid."); 174 | } 175 | if (!Array.isArray(versionJson.cli)) { 176 | throw new Error("Fetched stable version info is invalid."); 177 | } 178 | const versions: string[] = versionJson.cli; 179 | 180 | let version = semver.maxSatisfying(versions, range); 181 | if (version === null) { 182 | return null; 183 | } 184 | version = semver.clean(version); 185 | if (version === null) throw new Error("UNREACHABLE"); 186 | 187 | return { version, kind: version.includes("-rc.") ? "rc" : "stable" }; 188 | } 189 | } 190 | 191 | async function fetchWithRetries(url: string, maxRetries = 5) { 192 | let sleepMs = 250; 193 | let iterationCount = 0; 194 | while (true) { 195 | iterationCount++; 196 | try { 197 | const res = await fetch(url); 198 | if (res.status === 200 || iterationCount > maxRetries) { 199 | return res; 200 | } 201 | } catch (err) { 202 | if (iterationCount > maxRetries) { 203 | throw err; 204 | } 205 | } 206 | console.warn(`Failed fetching. Retrying in ${sleepMs}ms...`); 207 | await new Promise((resolve) => setTimeout(resolve, sleepMs)); 208 | sleepMs = Math.min(sleepMs * 2, 10_000); 209 | } 210 | } 211 | --------------------------------------------------------------------------------