├── .editorconfig ├── .github ├── renovate.json5 └── workflows │ ├── ci.yml │ ├── ecosystem-ci-from-pr.yml │ ├── ecosystem-ci-rolldown.yml │ ├── ecosystem-ci-selected.yml │ └── ecosystem-ci.yml ├── .gitignore ├── .npmrc ├── .prettierrc.json ├── LICENSE ├── README.md ├── builds ├── vite-plugin-react.ts ├── vite-plugin-svelte.ts └── vite-plugin-vue.ts ├── discord-webhook.ts ├── docs ├── github_app_id.png ├── github_app_private_key.png └── pr-comment-setup.md ├── ecosystem-ci.ts ├── eslint.config.js ├── package.json ├── pnpm-lock.yaml ├── tests ├── _selftest.ts ├── analogjs.ts ├── astro.ts ├── histoire.ts ├── hydrogen.ts ├── iles.ts ├── ladle.ts ├── laravel.ts ├── marko.ts ├── nuxt.ts ├── nx.ts ├── one.ts ├── previewjs.ts ├── quasar.ts ├── qwik.ts ├── rakkas.ts ├── react-router.ts ├── redwoodjs.ts ├── storybook.ts ├── sveltekit.ts ├── unocss.ts ├── vike.ts ├── vite-environment-examples.ts ├── vite-plugin-cloudflare.ts ├── vite-plugin-laravel.ts ├── vite-plugin-pwa.ts ├── vite-plugin-react-pages.ts ├── vite-plugin-react.ts ├── vite-plugin-svelte.ts ├── vite-plugin-vue.ts ├── vite-setup-catalogue.ts ├── vitepress.ts ├── vitest.ts ├── vuepress.ts └── waku.ts ├── tsconfig.json ├── types.d.ts └── utils.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | indent_style = tab 7 | indent_size = 2 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | 11 | [package.json] 12 | indent_style = space 13 | -------------------------------------------------------------------------------- /.github/renovate.json5: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": ["config:base", "schedule:weekly", "group:allNonMajor"], 4 | "labels": ["dependencies"], 5 | "ignorePaths": [], 6 | "rangeStrategy": "bump", 7 | "packageRules": [ 8 | { 9 | "depTypeList": ["peerDependencies", "engines"], 10 | "enabled": false, 11 | }, 12 | ], 13 | "ignoreDeps": [], 14 | } 15 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | env: 4 | # 7 GiB by default on GitHub, setting to 6 GiB 5 | # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources 6 | NODE_OPTIONS: --max-old-space-size=6144 7 | # configure corepack to be strict but not download newer versions or change anything 8 | COREPACK_DEFAULT_TO_LATEST: 0 9 | COREPACK_ENABLE_AUTO_PIN: 0 10 | COREPACK_ENABLE_STRICT: 1 11 | # see https://turbo.build/repo/docs/telemetry#how-do-i-opt-out 12 | TURBO_TELEMETRY_DISABLED: 1 13 | DO_NOT_TRACK: 1 14 | on: 15 | push: 16 | branches: 17 | - main 18 | pull_request: 19 | branches: 20 | - main 21 | 22 | jobs: 23 | ci: 24 | timeout-minutes: 10 25 | runs-on: ubuntu-latest 26 | permissions: 27 | contents: read # to clone the repo 28 | steps: 29 | - uses: actions/checkout@v4 30 | - uses: actions/setup-node@v4 31 | with: 32 | node-version: ^22.14.0 33 | - run: corepack enable 34 | - run: pnpm --version 35 | - uses: actions/setup-node@v4 36 | with: 37 | node-version: ^22.14.0 38 | cache: "pnpm" 39 | cache-dependency-path: "**/pnpm-lock.yaml" 40 | - name: install 41 | run: pnpm install --frozen-lockfile --prefer-offline 42 | - name: format 43 | run: pnpm format 44 | - name: lint 45 | run: pnpm run lint 46 | - name: typecheck 47 | run: pnpm run typecheck 48 | - name: audit 49 | if: (${{ success() }} || ${{ failure() }}) 50 | run: pnpm audit --prod --audit-level moderate 51 | - name: test 52 | if: (${{ success() }} || ${{ failure() }}) 53 | run: pnpm test:self 54 | -------------------------------------------------------------------------------- /.github/workflows/ecosystem-ci-from-pr.yml: -------------------------------------------------------------------------------- 1 | # integration tests for vite ecosystem - run from pr comments 2 | name: vite-ecosystem-ci-from-pr 3 | 4 | env: 5 | # 7 GiB by default on GitHub, setting to 6 GiB 6 | # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources 7 | NODE_OPTIONS: --max-old-space-size=6144 8 | # configure corepack to be strict but not download newer versions or change anything 9 | COREPACK_DEFAULT_TO_LATEST: 0 10 | COREPACK_ENABLE_AUTO_PIN: 0 11 | COREPACK_ENABLE_STRICT: 1 12 | # see https://turbo.build/repo/docs/telemetry#how-do-i-opt-out 13 | TURBO_TELEMETRY_DISABLED: 1 14 | DO_NOT_TRACK: 1 15 | on: 16 | workflow_dispatch: 17 | inputs: 18 | prNumber: 19 | description: "PR number (e.g. 9887)" 20 | required: true 21 | type: string 22 | branchName: 23 | description: "vite branch to use" 24 | required: true 25 | type: string 26 | default: "main" 27 | repo: 28 | description: "vite repository to use" 29 | required: true 30 | type: string 31 | default: "vitejs/vite" 32 | commit: 33 | description: "vite commit sha to use" 34 | type: string 35 | suite: 36 | description: "testsuite to run. runs all testsuits when `-`." 37 | required: false 38 | type: choice 39 | options: 40 | - "-" 41 | - analogjs 42 | - astro 43 | - histoire 44 | - hydrogen 45 | - iles 46 | - ladle 47 | - laravel 48 | - marko 49 | - nuxt 50 | - nx 51 | - one 52 | - previewjs 53 | - quasar 54 | - qwik 55 | - rakkas 56 | # - redwoodjs # disabled temporarily 57 | - storybook 58 | - sveltekit 59 | - unocss 60 | - vike 61 | - vite-environment-examples 62 | - vite-plugin-pwa 63 | - vite-plugin-react 64 | - vite-plugin-react-pages 65 | - vite-plugin-svelte 66 | - vite-plugin-vue 67 | - vite-plugin-cloudflare 68 | - vite-setup-catalogue 69 | - vitepress 70 | - vitest 71 | - vuepress 72 | - waku 73 | jobs: 74 | init: 75 | runs-on: ubuntu-latest 76 | outputs: 77 | comment-id: ${{ steps.create-comment.outputs.result }} 78 | permissions: {} 79 | steps: 80 | - id: generate-token 81 | uses: actions/create-github-app-token@v1 82 | with: 83 | app-id: ${{ secrets.PR_GITHUB_APP_ID }} 84 | private-key: ${{ secrets.PR_GITHUB_APP_PRIVATE_KEY }} 85 | repositories: vite 86 | - id: create-comment 87 | uses: actions/github-script@v7 88 | with: 89 | github-token: ${{ steps.generate-token.outputs.token }} 90 | result-encoding: string 91 | script: | 92 | const url = `${context.serverUrl}//${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}` 93 | const urlLink = `[Open](${url})` 94 | 95 | const { data: comment } = await github.rest.issues.createComment({ 96 | issue_number: context.payload.inputs.prNumber, 97 | owner: context.repo.owner, 98 | repo: 'vite', 99 | body: `⏳ Triggered ecosystem CI: ${urlLink}` 100 | }) 101 | return comment.id 102 | 103 | execute-selected-suite: 104 | timeout-minutes: 30 105 | runs-on: ubuntu-latest 106 | needs: init 107 | if: "inputs.suite != '-'" 108 | outputs: 109 | ref: ${{ steps.get-ref.outputs.ref }} 110 | permissions: 111 | contents: read # to clone the repo 112 | steps: 113 | - uses: actions/checkout@v4 114 | - uses: actions/setup-node@v4 115 | with: 116 | node-version: ^22.14.0 117 | - uses: denoland/setup-deno@11b63cf76cfcafb4e43f97b6cad24d8e8438f62d #v1.5.2 118 | with: 119 | deno-version: v1.x 120 | continue-on-error: true 121 | - run: corepack enable 122 | - run: pnpm --version 123 | - run: pnpm i --frozen-lockfile 124 | - run: >- 125 | pnpm tsx ecosystem-ci.ts 126 | --branch ${{ inputs.branchName }} 127 | --repo ${{ inputs.repo }} 128 | ${{ inputs.commit && format('--commit {0}', inputs.commit) }} 129 | ${{ inputs.suite }} 130 | - id: get-ref 131 | if: always() 132 | run: | 133 | ref=${{ inputs.commit || '$(git log -1 --pretty=format:%H)' }} 134 | echo "ref=$ref" >> $GITHUB_OUTPUT 135 | working-directory: ${{ inputs.commit && '.' || 'workspace/vite' }} 136 | 137 | execute-all: 138 | timeout-minutes: 30 139 | runs-on: ubuntu-latest 140 | needs: init 141 | if: "inputs.suite == '-'" 142 | outputs: 143 | ref: ${{ steps.get-ref.outputs.ref }} 144 | permissions: 145 | contents: read # to clone the repo 146 | strategy: 147 | matrix: 148 | suite: 149 | - analogjs 150 | - astro 151 | - histoire 152 | # - hydrogen # disabled until they complete they migration back to Vite 153 | # - iles # disabled until its CI is fixed 154 | - ladle 155 | - laravel 156 | - marko 157 | - nuxt 158 | # - nx # disabled temporarily 159 | - previewjs 160 | - quasar 161 | - qwik 162 | - rakkas 163 | - react-router 164 | # - redwoodjs # disabled temporarily 165 | - storybook 166 | - sveltekit 167 | - unocss 168 | - vike 169 | - vite-environment-examples 170 | - vite-plugin-pwa 171 | - vite-plugin-react 172 | # - vite-plugin-react-pages # # disabled until its install setup is fixed 173 | - vite-plugin-svelte 174 | - vite-plugin-vue 175 | - vite-plugin-cloudflare 176 | - vite-setup-catalogue 177 | - vitepress 178 | - vitest 179 | - vuepress 180 | - waku 181 | fail-fast: false 182 | steps: 183 | - uses: actions/checkout@v4 184 | - uses: actions/setup-node@v4 185 | with: 186 | node-version: ^22.14.0 187 | - uses: denoland/setup-deno@11b63cf76cfcafb4e43f97b6cad24d8e8438f62d #v1.5.2 188 | with: 189 | deno-version: v1.x 190 | continue-on-error: true 191 | - run: corepack enable 192 | - run: pnpm --version 193 | - run: pnpm i --frozen-lockfile 194 | - run: >- 195 | pnpm tsx ecosystem-ci.ts 196 | --branch ${{ inputs.branchName }} 197 | --repo ${{ inputs.repo }} 198 | ${{ inputs.commit && format('--commit {0}', inputs.commit) }} 199 | ${{ matrix.suite }} 200 | - id: get-ref 201 | if: always() 202 | run: | 203 | ref=${{ inputs.commit || '$(git log -1 --pretty=format:%H)' }} 204 | echo "ref=$ref" >> $GITHUB_OUTPUT 205 | working-directory: ${{ inputs.commit && '.' || 'workspace/vite' }} 206 | 207 | update-comment: 208 | runs-on: ubuntu-latest 209 | needs: [init, execute-selected-suite, execute-all] 210 | if: always() 211 | permissions: {} 212 | steps: 213 | - id: generate-token 214 | uses: actions/create-github-app-token@v1 215 | with: 216 | app-id: ${{ secrets.PR_GITHUB_APP_ID }} 217 | private-key: ${{ secrets.PR_GITHUB_APP_PRIVATE_KEY }} 218 | repositories: | 219 | vite 220 | vite-ecosystem-ci 221 | - uses: actions/github-script@v7 222 | with: 223 | github-token: ${{ steps.generate-token.outputs.token }} 224 | script: | 225 | const mainRepoName = 'vite' 226 | const ref = "${{ needs.execute-all.outputs.ref }}" || "${{ needs.execute-selected-suite.outputs.ref }}" 227 | const refLink = `[\`${ref.slice(0, 7)}\`](${context.serverUrl}/${context.repo.owner}/${mainRepoName}/pull/${context.payload.inputs.prNumber}/commits/${ref})` 228 | 229 | const { data: { jobs } } = await github.rest.actions.listJobsForWorkflowRun({ 230 | owner: context.repo.owner, 231 | repo: context.repo.repo, 232 | run_id: context.runId, 233 | per_page: 100 234 | }); 235 | 236 | const selectedSuite = context.payload.inputs.suite 237 | let results 238 | if (selectedSuite !== "-") { 239 | const { conclusion, html_url } = jobs.find(job => job.name === "execute-selected-suite") 240 | results = [{ suite: selectedSuite, conclusion, link: html_url }] 241 | } else { 242 | results = jobs 243 | .filter(job => job.name.startsWith('execute-all ')) 244 | .map(job => { 245 | const suite = job.name.replace(/^execute-all \(([^)]+)\)$/, "$1") 246 | return { suite, conclusion: job.conclusion, link: job.html_url } 247 | }) 248 | } 249 | 250 | const url = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}` 251 | const urlLink = `[Open](${url})` 252 | 253 | const conclusionEmoji = { 254 | success: ":white_check_mark:", 255 | failure: ":x:", 256 | cancelled: ":stop_button:" 257 | } 258 | 259 | // check for previous ecosystem-ci runs against the main branch 260 | 261 | // first, list workflow runs for ecosystem-ci.yml 262 | const { data: { workflow_runs } } = await github.rest.actions.listWorkflowRuns({ 263 | owner: context.repo.owner, 264 | repo: context.repo.repo, 265 | workflow_id: 'ecosystem-ci.yml' 266 | }); 267 | 268 | // for simplity, we only take the latest completed scheduled run 269 | // otherwise we would have to check the inputs for every maunally triggerred runs, which is an overkill 270 | const latestScheduledRun = workflow_runs.find(run => run.event === "schedule" && run.status === "completed") 271 | 272 | // get the jobs for the latest scheduled run 273 | const { data: { jobs: scheduledJobs } } = await github.rest.actions.listJobsForWorkflowRun({ 274 | owner: context.repo.owner, 275 | repo: context.repo.repo, 276 | run_id: latestScheduledRun.id 277 | }); 278 | const scheduledResults = scheduledJobs 279 | .filter(job => job.name.startsWith('test-ecosystem ')) 280 | .map(job => { 281 | const suite = job.name.replace(/^test-ecosystem \(([^)]+)\)$/, "$1") 282 | return { suite, conclusion: job.conclusion, link: job.html_url } 283 | }) 284 | 285 | const rows = [] 286 | const successfulSuitesWithoutChanges = [] 287 | results.forEach(current => { 288 | const latest = scheduledResults.find(s => s.suite === current.suite) || {} // in case a new suite is added after latest scheduled 289 | 290 | if (current.conclusion === "success" && latest.conclusion === "success") { 291 | successfulSuitesWithoutChanges.push(`[${current.suite}](${current.link})`) 292 | } 293 | else { 294 | const firstColumn = current.suite 295 | const secondColumn = `${conclusionEmoji[current.conclusion]} [${current.conclusion}](${current.link})` 296 | const thirdColumn = `${conclusionEmoji[latest.conclusion]} [${latest.conclusion}](${latest.link})` 297 | 298 | rows.push(`| ${firstColumn} | ${secondColumn} | ${thirdColumn} |`) 299 | } 300 | }) 301 | 302 | let body = ` 303 | 📝 Ran ecosystem CI on ${refLink}: ${urlLink} 304 | 305 | ` 306 | if (rows.length > 0) { 307 | body += `| suite | result | [latest scheduled](${latestScheduledRun.html_url}) | 308 | |-------|--------|----------------| 309 | ${rows.join("\n")} 310 | 311 | ${conclusionEmoji.success} ${successfulSuitesWithoutChanges.join(", ")} 312 | ` 313 | } else { 314 | body += `${conclusionEmoji.success} ${successfulSuitesWithoutChanges.join(", ")} 315 | ` 316 | } 317 | 318 | await github.rest.issues.createComment({ 319 | issue_number: context.payload.inputs.prNumber, 320 | owner: context.repo.owner, 321 | repo: mainRepoName, 322 | body 323 | }) 324 | 325 | await github.rest.issues.deleteComment({ 326 | owner: context.repo.owner, 327 | repo: mainRepoName, 328 | comment_id: ${{ needs.init.outputs.comment-id }} 329 | }) 330 | -------------------------------------------------------------------------------- /.github/workflows/ecosystem-ci-rolldown.yml: -------------------------------------------------------------------------------- 1 | # integration tests for vite ecosystem projects - scheduled or manual run for all suites 2 | name: vite-ecosystem-ci (rolldown-vite) 3 | 4 | env: 5 | # 7 GiB by default on GitHub, setting to 6 GiB 6 | # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources 7 | NODE_OPTIONS: --max-old-space-size=6144 8 | # configure corepack to be strict but not download newer versions or change anything 9 | COREPACK_DEFAULT_TO_LATEST: 0 10 | COREPACK_ENABLE_AUTO_PIN: 0 11 | COREPACK_ENABLE_STRICT: 1 12 | # see https://turbo.build/repo/docs/telemetry#how-do-i-opt-out 13 | TURBO_TELEMETRY_DISABLED: 1 14 | DO_NOT_TRACK: 1 15 | on: 16 | schedule: 17 | - cron: "0 5 * * 2,4" # tuesday,thursday 5AM 18 | workflow_dispatch: 19 | inputs: 20 | refType: 21 | description: "type of ref" 22 | required: true 23 | type: choice 24 | options: 25 | - branch 26 | - tag 27 | - commit 28 | - release 29 | default: "branch" 30 | ref: 31 | description: "vite ref to use" 32 | required: true 33 | type: string 34 | default: "rolldown-vite" 35 | repo: 36 | description: "vite repository to use" 37 | required: true 38 | type: string 39 | default: "vitejs/rolldown-vite" 40 | repository_dispatch: 41 | types: [ecosystem-ci] 42 | jobs: 43 | test-ecosystem: 44 | timeout-minutes: 30 45 | runs-on: ubuntu-latest 46 | strategy: 47 | matrix: 48 | suite: 49 | - analogjs 50 | - astro 51 | - histoire 52 | # - hydrogen # disabled until they complete they migration back to Vite 53 | # - iles # disabled until its CI is fixed 54 | - ladle 55 | - laravel 56 | - marko 57 | - nuxt 58 | - one 59 | # - nx # disabled temporarily 60 | - previewjs 61 | - quasar 62 | - qwik 63 | - rakkas 64 | - react-router 65 | # - redwoodjs # disabled temporarily 66 | - storybook 67 | - sveltekit 68 | - unocss 69 | - vike 70 | - vite-environment-examples 71 | - vite-plugin-pwa 72 | - vite-plugin-react 73 | # - vite-plugin-react-pages # disabled until its install setup is fixed 74 | - vite-plugin-svelte 75 | - vite-plugin-vue 76 | - vite-plugin-cloudflare 77 | - vite-setup-catalogue 78 | - vitepress 79 | - vitest 80 | - vuepress 81 | - waku 82 | fail-fast: false 83 | permissions: 84 | contents: read # to clone the repo 85 | steps: 86 | - uses: actions/checkout@v4 87 | - uses: actions/setup-node@v4 88 | with: 89 | node-version: ^22.14.0 90 | id: setup-node 91 | - uses: denoland/setup-deno@11b63cf76cfcafb4e43f97b6cad24d8e8438f62d #v1.5.2 92 | with: 93 | deno-version: v1.x 94 | id: setup-deno 95 | continue-on-error: true 96 | - run: corepack enable 97 | - run: pnpm --version 98 | - run: pnpm i --frozen-lockfile 99 | - run: >- 100 | pnpm tsx ecosystem-ci.ts 101 | --${{ inputs.refType || github.event.client_payload.refType || 'branch' }} ${{ inputs.ref || github.event.client_payload.ref || 'rolldown-vite' }} 102 | --repo ${{ inputs.repo || github.event.client_payload.repo || 'vitejs/rolldown-vite' }} 103 | ${{ matrix.suite }} 104 | id: ecosystem-ci-run 105 | - if: always() 106 | run: pnpm tsx discord-webhook.ts 107 | env: 108 | WORKFLOW_NAME: ci 109 | REF_TYPE: ${{ inputs.refType || github.event.client_payload.refType || 'branch' }} 110 | REF: ${{ inputs.ref || github.event.client_payload.ref || 'rolldown-vite' }} 111 | REPO: ${{ inputs.repo || github.event.client_payload.repo || 'vitejs/rolldown-vite' }} 112 | SUITE: ${{ matrix.suite }} 113 | STATUS: ${{ job.status }} 114 | DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL_ROLLDOWN_VITE }} 115 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 116 | -------------------------------------------------------------------------------- /.github/workflows/ecosystem-ci-selected.yml: -------------------------------------------------------------------------------- 1 | # integration tests for vite ecosystem - single run of selected testsuite 2 | name: vite-ecosystem-ci-selected 3 | 4 | env: 5 | # 7 GiB by default on GitHub, setting to 6 GiB 6 | # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources 7 | NODE_OPTIONS: --max-old-space-size=6144 8 | # configure corepack to be strict but not download newer versions or change anything 9 | COREPACK_DEFAULT_TO_LATEST: 0 10 | COREPACK_ENABLE_AUTO_PIN: 0 11 | COREPACK_ENABLE_STRICT: 1 12 | # see https://turbo.build/repo/docs/telemetry#how-do-i-opt-out 13 | TURBO_TELEMETRY_DISABLED: 1 14 | DO_NOT_TRACK: 1 15 | on: 16 | workflow_dispatch: 17 | inputs: 18 | refType: 19 | description: "type of vite ref to use" 20 | required: true 21 | type: choice 22 | options: 23 | - branch 24 | - tag 25 | - commit 26 | - release 27 | default: "branch" 28 | ref: 29 | description: "vite ref to use" 30 | required: true 31 | type: string 32 | default: "main" 33 | repo: 34 | description: "vite repository to use" 35 | required: true 36 | type: string 37 | default: "vitejs/vite" 38 | suite: 39 | description: "testsuite to run" 40 | required: true 41 | type: choice 42 | options: 43 | - analogjs 44 | - astro 45 | - histoire 46 | - hydrogen 47 | - iles 48 | - ladle 49 | - laravel 50 | - marko 51 | - nuxt 52 | - nx 53 | - one 54 | - previewjs 55 | - quasar 56 | - qwik 57 | - rakkas 58 | - react-router 59 | # - redwoodjs # disabled temporarily 60 | - storybook 61 | - sveltekit 62 | - unocss 63 | - vike 64 | - vite-environment-examples 65 | - vite-plugin-pwa 66 | - vite-plugin-react 67 | - vite-plugin-react-pages 68 | - vite-plugin-svelte 69 | - vite-plugin-vue 70 | - vite-plugin-cloudflare 71 | - vite-setup-catalogue 72 | - vitepress 73 | - vitest 74 | - vuepress 75 | - waku 76 | jobs: 77 | execute-selected-suite: 78 | timeout-minutes: 30 79 | runs-on: ubuntu-latest 80 | permissions: 81 | contents: read # to clone the repo 82 | steps: 83 | - uses: actions/checkout@v4 84 | - uses: actions/setup-node@v4 85 | with: 86 | node-version: ^22.14.0 87 | id: setup-node 88 | - uses: denoland/setup-deno@11b63cf76cfcafb4e43f97b6cad24d8e8438f62d #v1.5.2 89 | with: 90 | deno-version: v1.x 91 | id: setup-deno 92 | continue-on-error: true 93 | - run: corepack enable 94 | - run: pnpm --version 95 | - run: pnpm i --frozen-lockfile 96 | - run: >- 97 | pnpm tsx ecosystem-ci.ts 98 | --${{ inputs.refType }} ${{ inputs.ref }} 99 | --repo ${{ inputs.repo }} 100 | ${{ inputs.suite }} 101 | id: ecosystem-ci-run 102 | - if: always() 103 | run: pnpm tsx discord-webhook.ts 104 | env: 105 | WORKFLOW_NAME: ci-selected 106 | REF_TYPE: ${{ inputs.refType }} 107 | REF: ${{ inputs.ref }} 108 | REPO: ${{ inputs.repo }} 109 | SUITE: ${{ inputs.suite }} 110 | STATUS: ${{ job.status }} 111 | DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} 112 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 113 | -------------------------------------------------------------------------------- /.github/workflows/ecosystem-ci.yml: -------------------------------------------------------------------------------- 1 | # integration tests for vite ecosystem projects - scheduled or manual run for all suites 2 | name: vite-ecosystem-ci 3 | 4 | env: 5 | # 7 GiB by default on GitHub, setting to 6 GiB 6 | # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources 7 | NODE_OPTIONS: --max-old-space-size=6144 8 | # configure corepack to be strict but not download newer versions or change anything 9 | COREPACK_DEFAULT_TO_LATEST: 0 10 | COREPACK_ENABLE_AUTO_PIN: 0 11 | COREPACK_ENABLE_STRICT: 1 12 | # see https://turbo.build/repo/docs/telemetry#how-do-i-opt-out 13 | TURBO_TELEMETRY_DISABLED: 1 14 | DO_NOT_TRACK: 1 15 | on: 16 | schedule: 17 | - cron: "0 5 * * 1,3,5" # monday,wednesday,friday 5AM 18 | workflow_dispatch: 19 | inputs: 20 | refType: 21 | description: "type of ref" 22 | required: true 23 | type: choice 24 | options: 25 | - branch 26 | - tag 27 | - commit 28 | - release 29 | default: "branch" 30 | ref: 31 | description: "vite ref to use" 32 | required: true 33 | type: string 34 | default: "main" 35 | repo: 36 | description: "vite repository to use" 37 | required: true 38 | type: string 39 | default: "vitejs/vite" 40 | repository_dispatch: 41 | types: [ecosystem-ci] 42 | jobs: 43 | test-ecosystem: 44 | timeout-minutes: 30 45 | runs-on: ubuntu-latest 46 | strategy: 47 | matrix: 48 | suite: 49 | - analogjs 50 | - astro 51 | - histoire 52 | # - hydrogen # disabled until they complete they migration back to Vite 53 | # - iles # disabled until its CI is fixed 54 | - ladle 55 | - laravel 56 | - marko 57 | - nuxt 58 | - one 59 | # - nx # disabled temporarily 60 | - previewjs 61 | - quasar 62 | - qwik 63 | - rakkas 64 | - react-router 65 | # - redwoodjs # disabled temporarily 66 | - storybook 67 | - sveltekit 68 | - unocss 69 | - vike 70 | - vite-environment-examples 71 | - vite-plugin-pwa 72 | - vite-plugin-react 73 | # - vite-plugin-react-pages # disabled until its install setup is fixed 74 | - vite-plugin-svelte 75 | - vite-plugin-vue 76 | - vite-plugin-cloudflare 77 | - vite-setup-catalogue 78 | - vitepress 79 | - vitest 80 | - vuepress 81 | - waku 82 | fail-fast: false 83 | permissions: 84 | contents: read # to clone the repo 85 | steps: 86 | - uses: actions/checkout@v4 87 | - uses: actions/setup-node@v4 88 | with: 89 | node-version: ^22.14.0 90 | id: setup-node 91 | - uses: denoland/setup-deno@11b63cf76cfcafb4e43f97b6cad24d8e8438f62d #v1.5.2 92 | with: 93 | deno-version: v1.x 94 | id: setup-deno 95 | continue-on-error: true 96 | - run: corepack enable 97 | - run: pnpm --version 98 | - run: pnpm i --frozen-lockfile 99 | - run: >- 100 | pnpm tsx ecosystem-ci.ts 101 | --${{ inputs.refType || github.event.client_payload.refType || 'branch' }} ${{ inputs.ref || github.event.client_payload.ref || 'main' }} 102 | --repo ${{ inputs.repo || github.event.client_payload.repo || 'vitejs/vite' }} 103 | ${{ matrix.suite }} 104 | id: ecosystem-ci-run 105 | - if: always() 106 | run: pnpm tsx discord-webhook.ts 107 | env: 108 | WORKFLOW_NAME: ci 109 | REF_TYPE: ${{ inputs.refType || github.event.client_payload.refType || 'branch' }} 110 | REF: ${{ inputs.ref || github.event.client_payload.ref || 'main' }} 111 | REPO: ${{ inputs.repo || github.event.client_payload.repo || 'vitejs/vite' }} 112 | SUITE: ${{ matrix.suite }} 113 | STATUS: ${{ job.status }} 114 | DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} 115 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 116 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .DS_Store? 3 | node_modules 4 | vite 5 | workspace 6 | .pnpm-debug.log 7 | .idea 8 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict = true 2 | strict-peer-dependencies = false 3 | package-manager-strict = false 4 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "semi": false, 4 | "tabWidth": 2, 5 | "singleQuote": true, 6 | "printWidth": 80, 7 | "trailingComma": "all", 8 | "overrides": [ 9 | { 10 | "files": ["*.json5"], 11 | "options": { 12 | "singleQuote": false, 13 | "quoteProps": "preserve" 14 | } 15 | }, 16 | { 17 | "files": ["*.yml"], 18 | "options": { 19 | "singleQuote": false 20 | } 21 | }, 22 | { 23 | "files": "**/pnpm-lock.yaml", 24 | "options": { 25 | "requirePragma": true 26 | } 27 | }, 28 | { 29 | "files": "**/package.json", 30 | "options": { 31 | "useTabs": false, 32 | "tabWidth": 2 33 | } 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021-present, Vite contributors 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. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vite-ecosystem-ci 2 | 3 | This repository is used to run integration tests for vite ecosystem projects 4 | 5 | ## via github workflow 6 | 7 | ### scheduled 8 | 9 | Workflows are scheduled to run automatically every Monday, Wednesday and Friday 10 | 11 | ### manually 12 | 13 | - open [workflow](../../actions/workflows/ecosystem-ci-selected.yml) 14 | - click 'Run workflow' button on top right of the list 15 | - select suite to run in dropdown 16 | - start workflow 17 | 18 | ## via shell script 19 | 20 | - clone this repo 21 | - run `pnpm i` 22 | - run `pnpm test` to run all suites 23 | - or `pnpm test ` to select a suite 24 | - or `tsx ecosystem-ci.ts` 25 | 26 | You can pass `--tag v2.8.0-beta.1`, `--branch somebranch` or `--commit abcd1234` option to select a specific vite version to build. 27 | If you pass `--release 2.7.13`, vite build will be skipped and vite is fetched from the registry instead 28 | 29 | The repositories are checked out into `workspace` subdirectory as shallow clones 30 | 31 | ## via comment on PR 32 | 33 | - comment `/ecosystem-ci run` on a PR 34 | - or `/ecosystem-ci run ` to select a suite 35 | 36 | Users with triage permission to vitejs/vite repository can only use this. 37 | 38 | See [docs/pr-comment-setup.md](./docs/pr-comment-setup.md) for how to setup this feature. 39 | 40 | # how to add a new integration test 41 | 42 | - check out the existing [tests](./tests) and add one yourself. Thanks to some utilities it is really easy 43 | - once you are confident the suite works, add it to the lists of suites in the [workflows](../../actions/) 44 | 45 | # reporting results 46 | 47 | ## Discord 48 | 49 | Results are posted automatically to `#ecosystem-ci` on [vite discord](https://chat.vitejs.dev/) 50 | 51 | ### on your own server 52 | 53 | - Go to `Server settings > Integrations > Webhooks` and click `New Webhook` 54 | - Give it a name, icon and a channel to post to 55 | - copy the webhook url 56 | - get in touch with admins of this repo so they can add the webhook 57 | 58 | #### how to add a discord webhook here 59 | 60 | - Go to `/settings/secrets/actions` and click on `New repository secret` 61 | - set `Name` as `DISCORD_WEBHOOK_URL` 62 | - paste the discord webhook url you copied from above into `Value` 63 | - Click `Add secret` 64 | -------------------------------------------------------------------------------- /builds/vite-plugin-react.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function build(options: RunOptions) { 5 | return runInRepo({ 6 | ...options, 7 | repo: 'vitejs/vite-plugin-react', 8 | build: 'build', 9 | }) 10 | } 11 | 12 | export const packages = { 13 | '@vitejs/plugin-react': 'packages/plugin-react', 14 | } 15 | -------------------------------------------------------------------------------- /builds/vite-plugin-svelte.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function build(options: RunOptions) { 5 | return runInRepo({ 6 | ...options, 7 | repo: 'sveltejs/vite-plugin-svelte', 8 | branch: 'main', 9 | overrides: { 10 | svelte: 'latest', 11 | }, 12 | }) 13 | } 14 | 15 | export const packages = { 16 | '@sveltejs/vite-plugin-svelte': 'packages/vite-plugin-svelte', 17 | '@sveltejs/vite-plugin-svelte-inspector': 18 | 'packages/vite-plugin-svelte-inspector', 19 | } 20 | -------------------------------------------------------------------------------- /builds/vite-plugin-vue.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function build(options: RunOptions) { 5 | return runInRepo({ 6 | ...options, 7 | repo: 'vitejs/vite-plugin-vue', 8 | build: 'build', 9 | }) 10 | } 11 | 12 | export const packages = { 13 | '@vitejs/plugin-vue': 'packages/plugin-vue', 14 | '@vitejs/plugin-vue-jsx': 'packages/plugin-vue-jsx', 15 | } 16 | -------------------------------------------------------------------------------- /discord-webhook.ts: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch' 2 | import { getPermanentRef, setupEnvironment } from './utils.ts' 3 | 4 | type RefType = 'branch' | 'tag' | 'commit' | 'release' 5 | type Status = 'success' | 'failure' | 'cancelled' 6 | type Env = { 7 | WORKFLOW_NAME?: string 8 | REF_TYPE?: RefType 9 | REF?: string 10 | REPO?: string 11 | SUITE?: string 12 | STATUS?: Status 13 | DISCORD_WEBHOOK_URL?: string 14 | } 15 | 16 | const statusConfig = { 17 | success: { 18 | color: parseInt('57ab5a', 16), 19 | emoji: ':white_check_mark:', 20 | }, 21 | failure: { 22 | color: parseInt('e5534b', 16), 23 | emoji: ':x:', 24 | }, 25 | cancelled: { 26 | color: parseInt('768390', 16), 27 | emoji: ':stop_button:', 28 | }, 29 | } 30 | 31 | async function run() { 32 | if (!process.env.GITHUB_ACTIONS) { 33 | throw new Error('This script can only run on GitHub Actions.') 34 | } 35 | if (!process.env.DISCORD_WEBHOOK_URL) { 36 | console.warn( 37 | "Skipped beacuse process.env.DISCORD_WEBHOOK_URL was empty or didn't exist", 38 | ) 39 | return 40 | } 41 | if (!process.env.GITHUB_TOKEN) { 42 | console.warn( 43 | "Not using a token because process.env.GITHUB_TOKEN was empty or didn't exist", 44 | ) 45 | } 46 | 47 | const env = process.env as Env 48 | 49 | assertEnv('WORKFLOW_NAME', env.WORKFLOW_NAME) 50 | assertEnv('REF_TYPE', env.REF_TYPE) 51 | assertEnv('REF', env.REF) 52 | assertEnv('REPO', env.REPO) 53 | assertEnv('SUITE', env.SUITE) 54 | assertEnv('STATUS', env.STATUS) 55 | assertEnv('DISCORD_WEBHOOK_URL', env.DISCORD_WEBHOOK_URL) 56 | 57 | await setupEnvironment() 58 | 59 | const refType = env.REF_TYPE 60 | // vite repo is not cloned when release 61 | const permRef = refType === 'release' ? undefined : await getPermanentRef() 62 | 63 | const targetText = createTargetText(refType, env.REF, permRef, env.REPO) 64 | 65 | const webhookContent = { 66 | username: `vite-ecosystem-ci (${env.WORKFLOW_NAME})`, 67 | avatar_url: 'https://github.com/vitejs.png', 68 | embeds: [ 69 | { 70 | title: `${statusConfig[env.STATUS].emoji} ${env.SUITE}`, 71 | description: await createDescription(env.SUITE, targetText), 72 | color: statusConfig[env.STATUS].color, 73 | }, 74 | ], 75 | } 76 | 77 | const res = await fetch(env.DISCORD_WEBHOOK_URL, { 78 | method: 'POST', 79 | headers: { 80 | 'Content-Type': 'application/json', 81 | }, 82 | body: JSON.stringify(webhookContent), 83 | }) 84 | if (res.ok) { 85 | console.log('Sent Webhook') 86 | } else { 87 | console.error(`Webhook failed ${res.status}:`, await res.text()) 88 | } 89 | } 90 | 91 | function assertEnv( 92 | name: string, 93 | value: T, 94 | ): asserts value is Exclude { 95 | if (!value) { 96 | throw new Error(`process.env.${name} is empty or does not exist.`) 97 | } 98 | } 99 | 100 | async function createRunUrl(suite: string) { 101 | const result = await fetchJobs() 102 | if (!result) { 103 | return undefined 104 | } 105 | 106 | if (result.total_count <= 0) { 107 | console.warn('total_count was 0') 108 | return undefined 109 | } 110 | 111 | const job = result.jobs.find((job) => job.name === process.env.GITHUB_JOB) 112 | if (job) { 113 | return job.html_url 114 | } 115 | 116 | // when matrix 117 | const jobM = result.jobs.find( 118 | (job) => job.name === `${process.env.GITHUB_JOB} (${suite})`, 119 | ) 120 | return jobM?.html_url 121 | } 122 | 123 | interface GitHubActionsJob { 124 | name: string 125 | html_url: string 126 | } 127 | 128 | async function fetchJobs() { 129 | const url = `${process.env.GITHUB_API_URL}/repos/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}/jobs` 130 | const res = await fetch(url, { 131 | headers: { 132 | Accept: 'application/vnd.github.v3+json', 133 | ...(process.env.GITHUB_TOKEN 134 | ? { 135 | Authorization: `token ${process.env.GITHUB_TOKEN}`, 136 | } 137 | : undefined), 138 | }, 139 | }) 140 | if (!res.ok) { 141 | console.warn( 142 | `Failed to fetch jobs (${res.status} ${res.statusText}): ${res.text()}`, 143 | ) 144 | return null 145 | } 146 | 147 | const result = await res.json() 148 | return result as { 149 | total_count: number 150 | jobs: GitHubActionsJob[] 151 | } 152 | } 153 | 154 | async function createDescription(suite: string, targetText: string) { 155 | const runUrl = await createRunUrl(suite) 156 | const open = runUrl === undefined ? 'Null' : `[Open](${runUrl})` 157 | 158 | return ` 159 | :scroll:\u00a0\u00a0${open}\u3000\u3000:zap:\u00a0\u00a0${targetText} 160 | `.trim() 161 | } 162 | 163 | function createTargetText( 164 | refType: RefType, 165 | ref: string, 166 | permRef: string | undefined, 167 | repo: string, 168 | ) { 169 | const repoText = repo !== 'vitejs/vite' ? `${repo}:` : '' 170 | if (refType === 'branch') { 171 | const shortRef = permRef?.slice(0, 7) 172 | const link = `https://github.com/${repo}/commits/${permRef || ref}` 173 | return `[${repoText}${ref} (${shortRef || 'unknown'})](${link})` 174 | } 175 | 176 | const refTypeText = refType === 'release' ? ' (release)' : '' 177 | const link = `https://github.com/${repo}/commits/${ref}` 178 | return `[${repoText}${ref}${refTypeText}](${link})` 179 | } 180 | 181 | run().catch((e) => { 182 | console.error('Error sending webhook:', e) 183 | }) 184 | -------------------------------------------------------------------------------- /docs/github_app_id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vitejs/vite-ecosystem-ci/9cc457b82e829c3784e258a52d1f0c71b2beef43/docs/github_app_id.png -------------------------------------------------------------------------------- /docs/github_app_private_key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vitejs/vite-ecosystem-ci/9cc457b82e829c3784e258a52d1f0c71b2beef43/docs/github_app_private_key.png -------------------------------------------------------------------------------- /docs/pr-comment-setup.md: -------------------------------------------------------------------------------- 1 | # Setting up "PR comment trigger" feature 2 | 3 | ## (1) Create a GitHub App 4 | 5 | 1. [Create a GitHub App](https://docs.github.com/en/apps/creating-github-apps/registering-a-github-app/registering-a-github-app). Webhook is not needed. The following permissions are required: 6 | - Metadata: Read only 7 | - Actions: Read and Write 8 | - Issues: Read and Write 9 | - Pull requests: Read and Write 10 | 1. Install that App to the organization/user. Give that App access to vitejs/vite and vitejs/vite-ecosystem-ci. 11 | 1. Check the App ID. It's written on `https://github.com/settings/apps/`. This is used later. 12 | ![GitHub App ID](github_app_id.png) 13 | 1. Generate a private key. It can be generated on the same page with the App ID. The key will be downloaded when you generate it. 14 | ![GitHub App private key](github_app_private_key.png) 15 | 16 | ## (2) Adding secrets to vitejs/vite and vitejs/vite-ecosystem-ci 17 | 18 | - vitejs/vite 19 | - `ECOSYSTEM_CI_GITHUB_APP_ID`: ID of the created GitHub App 20 | - `ECOSYSTEM_CI_GITHUB_APP_PRIVATE_KEY`: the content of the private key of the created GitHub App 21 | - vitejs/vite-ecosystem-ci 22 | - `PR_GITHUB_APP_ID`: ID of the created GitHub App 23 | - `PR_GITHUB_APP_PRIVATE_KEY`: the content of the private key of the created GitHub App 24 | 25 | ## (3) Adding workflows to vitejs/vite 26 | 27 | Add [this workflow](https://github.com/vitejs/vite/blob/main/.github/workflows/ecosystem-ci-trigger.yml). 28 | -------------------------------------------------------------------------------- /ecosystem-ci.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs' 2 | import path from 'path' 3 | import process from 'process' 4 | import { cac } from 'cac' 5 | 6 | import { 7 | setupEnvironment, 8 | setupViteRepo, 9 | buildVite, 10 | bisectVite, 11 | parseViteMajor, 12 | parseMajorVersion, 13 | } from './utils.ts' 14 | import type { CommandOptions, RunOptions } from './types.d.ts' 15 | 16 | const cli = cac() 17 | cli 18 | .command('[...suites]', 'build vite and run selected suites') 19 | .option('--verify', 'verify checkouts by running tests', { default: false }) 20 | .option('--repo ', 'vite repository to use', { default: 'vitejs/vite' }) 21 | .option('--branch ', 'vite branch to use', { default: 'main' }) 22 | .option('--tag ', 'vite tag to use') 23 | .option('--commit ', 'vite commit sha to use') 24 | .option('--release ', 'vite release to use from npm registry') 25 | .action(async (suites, options: CommandOptions) => { 26 | if (options.commit) { 27 | const url = `https://pkg.pr.new/vite@${options.commit}` 28 | //eslint-disable-next-line n/no-unsupported-features/node-builtins 29 | const { status } = await fetch(url) 30 | if (status === 200) { 31 | options.release = url 32 | delete options.commit 33 | 34 | console.log(`continuous release available on ${url}`) 35 | } 36 | } 37 | const { root, vitePath, workspace } = await setupEnvironment() 38 | const suitesToRun = getSuitesToRun(suites, root) 39 | let viteMajor 40 | if (!options.release) { 41 | await setupViteRepo(options) 42 | await buildVite({ verify: options.verify }) 43 | viteMajor = parseViteMajor(vitePath) 44 | } else { 45 | viteMajor = parseMajorVersion(options.release) 46 | } 47 | const runOptions: RunOptions = { 48 | root, 49 | vitePath, 50 | viteMajor, 51 | workspace, 52 | release: options.release, 53 | verify: options.verify, 54 | skipGit: false, 55 | } 56 | for (const suite of suitesToRun) { 57 | await run(suite, runOptions) 58 | } 59 | }) 60 | 61 | cli 62 | .command('build-vite', 'build vite only') 63 | .option('--verify', 'verify vite checkout by running tests', { 64 | default: false, 65 | }) 66 | .option('--repo ', 'vite repository to use', { default: 'vitejs/vite' }) 67 | .option('--branch ', 'vite branch to use', { default: 'main' }) 68 | .option('--tag ', 'vite tag to use') 69 | .option('--commit ', 'vite commit sha to use') 70 | .action(async (options: CommandOptions) => { 71 | await setupEnvironment() 72 | await setupViteRepo(options) 73 | await buildVite({ verify: options.verify }) 74 | }) 75 | 76 | cli 77 | .command('run-suites [...suites]', 'run single suite with pre-built vite') 78 | .option( 79 | '--verify', 80 | 'verify checkout by running tests before using local vite', 81 | { default: false }, 82 | ) 83 | .option('--repo ', 'vite repository to use', { default: 'vitejs/vite' }) 84 | .option('--release ', 'vite release to use from npm registry') 85 | .action(async (suites, options: CommandOptions) => { 86 | const { root, vitePath, workspace } = await setupEnvironment() 87 | const suitesToRun = getSuitesToRun(suites, root) 88 | const runOptions: RunOptions = { 89 | ...options, 90 | root, 91 | vitePath, 92 | viteMajor: parseViteMajor(vitePath), 93 | workspace, 94 | } 95 | for (const suite of suitesToRun) { 96 | await run(suite, runOptions) 97 | } 98 | }) 99 | 100 | cli 101 | .command( 102 | 'bisect [...suites]', 103 | 'use git bisect to find a commit in vite that broke suites', 104 | ) 105 | .option('--good ', 'last known good ref, e.g. a previous tag. REQUIRED!') 106 | .option('--verify', 'verify checkouts by running tests', { default: false }) 107 | .option('--repo ', 'vite repository to use', { default: 'vitejs/vite' }) 108 | .option('--branch ', 'vite branch to use', { default: 'main' }) 109 | .option('--tag ', 'vite tag to use') 110 | .option('--commit ', 'vite commit sha to use') 111 | .action(async (suites, options: CommandOptions & { good: string }) => { 112 | if (!options.good) { 113 | console.log( 114 | 'you have to specify a known good version with `--good `', 115 | ) 116 | process.exit(1) 117 | } 118 | const { root, vitePath, workspace } = await setupEnvironment() 119 | const suitesToRun = getSuitesToRun(suites, root) 120 | let isFirstRun = true 121 | const { verify } = options 122 | const runSuite = async () => { 123 | try { 124 | await buildVite({ verify: isFirstRun && verify }) 125 | for (const suite of suitesToRun) { 126 | await run(suite, { 127 | verify: !!(isFirstRun && verify), 128 | skipGit: !isFirstRun, 129 | root, 130 | vitePath, 131 | viteMajor: parseViteMajor(vitePath), 132 | workspace, 133 | }) 134 | } 135 | isFirstRun = false 136 | return null 137 | } catch (e) { 138 | return e 139 | } 140 | } 141 | await setupViteRepo({ ...options, shallow: false }) 142 | const initialError = await runSuite() 143 | if (initialError) { 144 | await bisectVite(options.good, runSuite) 145 | } else { 146 | console.log(`no errors for starting commit, cannot bisect`) 147 | } 148 | }) 149 | cli.help() 150 | cli.parse() 151 | 152 | async function run(suite: string, options: RunOptions) { 153 | const { test } = await import(`./tests/${suite}.ts`) 154 | await test({ 155 | ...options, 156 | workspace: path.resolve(options.workspace, suite), 157 | }) 158 | } 159 | 160 | function getSuitesToRun(suites: string[], root: string) { 161 | let suitesToRun: string[] = suites 162 | const availableSuites: string[] = fs 163 | .readdirSync(path.join(root, 'tests')) 164 | .filter((f: string) => !f.startsWith('_') && f.endsWith('.ts')) 165 | .map((f: string) => f.slice(0, -3)) 166 | availableSuites.sort() 167 | if (suitesToRun.length === 0) { 168 | suitesToRun = availableSuites 169 | } else { 170 | const invalidSuites = suitesToRun.filter( 171 | (x) => !x.startsWith('_') && !availableSuites.includes(x), 172 | ) 173 | if (invalidSuites.length) { 174 | console.log(`invalid suite(s): ${invalidSuites.join(', ')}`) 175 | console.log(`available suites: ${availableSuites.join(', ')}`) 176 | process.exit(1) 177 | } 178 | } 179 | return suitesToRun 180 | } 181 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | import eslint from '@eslint/js' 3 | import pluginN from 'eslint-plugin-n' 4 | import tseslint from 'typescript-eslint' 5 | 6 | export default tseslint.config( 7 | { 8 | ignores: ['workspace/**'], 9 | }, 10 | eslint.configs.recommended, 11 | ...tseslint.configs.recommended, 12 | { 13 | name: 'main', 14 | languageOptions: { 15 | parser: tseslint.parser, 16 | parserOptions: { 17 | sourceType: 'module', 18 | ecmaVersion: 2022, 19 | project: true, 20 | }, 21 | }, 22 | plugins: { 23 | n: pluginN, 24 | }, 25 | rules: { 26 | eqeqeq: ['warn', 'always', { null: 'never' }], 27 | 'no-debugger': ['error'], 28 | 'no-empty': ['warn', { allowEmptyCatch: true }], 29 | 'no-process-exit': 'off', 30 | 'no-useless-escape': 'off', 31 | 'prefer-const': [ 32 | 'warn', 33 | { 34 | destructuring: 'all', 35 | }, 36 | ], 37 | 'n/no-missing-import': 'off', // doesn't like ts imports 38 | 'n/no-process-exit': 'off', 39 | '@typescript-eslint/no-explicit-any': 'off', // we use any in some places 40 | }, 41 | }, 42 | ) 43 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-ecosystem-ci", 3 | "private": true, 4 | "version": "0.0.1", 5 | "description": "Vite Ecosystem CI", 6 | "scripts": { 7 | "prepare": "pnpm exec simple-git-hooks", 8 | "lint": "eslint '**/*.ts'", 9 | "lint:fix": "pnpm lint --fix", 10 | "typecheck": "tsc", 11 | "format": "prettier --ignore-path .gitignore --check .", 12 | "format:fix": "pnpm format --write", 13 | "test:self": "tsx ecosystem-ci.ts _selftest", 14 | "test": "tsx ecosystem-ci.ts", 15 | "bisect": "tsx ecosystem-ci.ts bisect" 16 | }, 17 | "simple-git-hooks": { 18 | "pre-commit": "pnpm exec lint-staged --concurrent false" 19 | }, 20 | "lint-staged": { 21 | "*": [ 22 | "prettier --write --ignore-unknown" 23 | ], 24 | "*.ts": [ 25 | "eslint --fix" 26 | ] 27 | }, 28 | "packageManager": "pnpm@10.6.3", 29 | "type": "module", 30 | "engines": { 31 | "node": ">=18", 32 | "pnpm": "^10.0.0" 33 | }, 34 | "repository": { 35 | "type": "git", 36 | "url": "git+https://github.com/vitejs/vite-ecosystem-ci.git" 37 | }, 38 | "license": "MIT", 39 | "bugs": { 40 | "url": "https://github.com/vitejs/vite-ecosystem-ci/issues" 41 | }, 42 | "homepage": "https://github.com/vitejs/vite-ecosystem-ci#readme", 43 | "dependencies": { 44 | "@actions/core": "^1.11.1", 45 | "cac": "^6.7.14", 46 | "execa": "^9.5.2", 47 | "node-fetch": "^3.3.2" 48 | }, 49 | "devDependencies": { 50 | "@antfu/ni": "^23.3.1", 51 | "@eslint/js": "^9.22.0", 52 | "@types/node": "^22.13.10", 53 | "@types/pacote": "^11.1.8", 54 | "@types/semver": "^7.5.8", 55 | "eslint": "^9.22.0", 56 | "eslint-plugin-n": "^17.16.2", 57 | "lint-staged": "^15.5.0", 58 | "pacote": "^21.0.0", 59 | "prettier": "^3.5.3", 60 | "semver": "^7.7.1", 61 | "simple-git-hooks": "^2.11.1", 62 | "tsx": "^4.19.3", 63 | "typescript": "^5.8.2", 64 | "typescript-eslint": "^8.26.1" 65 | }, 66 | "pnpm": { 67 | "overrides": { 68 | "cross-spawn@>=7.0.0 <7.0.5": "^7.0.6" 69 | }, 70 | "onlyBuiltDependencies": [ 71 | "esbuild", 72 | "simple-git-hooks" 73 | ] 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | overrides: 8 | cross-spawn@>=7.0.0 <7.0.5: ^7.0.6 9 | 10 | importers: 11 | 12 | .: 13 | dependencies: 14 | '@actions/core': 15 | specifier: ^1.11.1 16 | version: 1.11.1 17 | cac: 18 | specifier: ^6.7.14 19 | version: 6.7.14 20 | execa: 21 | specifier: ^9.5.2 22 | version: 9.5.2 23 | node-fetch: 24 | specifier: ^3.3.2 25 | version: 3.3.2 26 | devDependencies: 27 | '@antfu/ni': 28 | specifier: ^23.3.1 29 | version: 23.3.1 30 | '@eslint/js': 31 | specifier: ^9.22.0 32 | version: 9.22.0 33 | '@types/node': 34 | specifier: ^22.13.10 35 | version: 22.13.10 36 | '@types/pacote': 37 | specifier: ^11.1.8 38 | version: 11.1.8 39 | '@types/semver': 40 | specifier: ^7.5.8 41 | version: 7.5.8 42 | eslint: 43 | specifier: ^9.22.0 44 | version: 9.22.0 45 | eslint-plugin-n: 46 | specifier: ^17.16.2 47 | version: 17.16.2(eslint@9.22.0) 48 | lint-staged: 49 | specifier: ^15.5.0 50 | version: 15.5.0 51 | pacote: 52 | specifier: ^21.0.0 53 | version: 21.0.0 54 | prettier: 55 | specifier: ^3.5.3 56 | version: 3.5.3 57 | semver: 58 | specifier: ^7.7.1 59 | version: 7.7.1 60 | simple-git-hooks: 61 | specifier: ^2.11.1 62 | version: 2.11.1 63 | tsx: 64 | specifier: ^4.19.3 65 | version: 4.19.3 66 | typescript: 67 | specifier: ^5.8.2 68 | version: 5.8.2 69 | typescript-eslint: 70 | specifier: ^8.26.1 71 | version: 8.26.1(eslint@9.22.0)(typescript@5.8.2) 72 | 73 | packages: 74 | 75 | '@aashutoshrathi/word-wrap@1.2.6': 76 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 77 | engines: {node: '>=0.10.0'} 78 | 79 | '@actions/core@1.11.1': 80 | resolution: {integrity: sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==} 81 | 82 | '@actions/exec@1.1.1': 83 | resolution: {integrity: sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==} 84 | 85 | '@actions/http-client@2.1.1': 86 | resolution: {integrity: sha512-qhrkRMB40bbbLo7gF+0vu+X+UawOvQQqNAA/5Unx774RS8poaOhThDOG6BGmxvAnxhQnDp2BG/ZUm65xZILTpw==} 87 | 88 | '@actions/io@1.1.3': 89 | resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} 90 | 91 | '@antfu/ni@23.3.1': 92 | resolution: {integrity: sha512-C90iyzm/jLV7Lomv2UzwWUzRv9WZr1oRsFRKsX5HjQL4EXrbi9H/RtBkjCP+NF+ABZXUKpAa4F1dkoTaea4zHg==} 93 | hasBin: true 94 | 95 | '@esbuild/aix-ppc64@0.25.1': 96 | resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} 97 | engines: {node: '>=18'} 98 | cpu: [ppc64] 99 | os: [aix] 100 | 101 | '@esbuild/android-arm64@0.25.1': 102 | resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} 103 | engines: {node: '>=18'} 104 | cpu: [arm64] 105 | os: [android] 106 | 107 | '@esbuild/android-arm@0.25.1': 108 | resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} 109 | engines: {node: '>=18'} 110 | cpu: [arm] 111 | os: [android] 112 | 113 | '@esbuild/android-x64@0.25.1': 114 | resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} 115 | engines: {node: '>=18'} 116 | cpu: [x64] 117 | os: [android] 118 | 119 | '@esbuild/darwin-arm64@0.25.1': 120 | resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} 121 | engines: {node: '>=18'} 122 | cpu: [arm64] 123 | os: [darwin] 124 | 125 | '@esbuild/darwin-x64@0.25.1': 126 | resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} 127 | engines: {node: '>=18'} 128 | cpu: [x64] 129 | os: [darwin] 130 | 131 | '@esbuild/freebsd-arm64@0.25.1': 132 | resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} 133 | engines: {node: '>=18'} 134 | cpu: [arm64] 135 | os: [freebsd] 136 | 137 | '@esbuild/freebsd-x64@0.25.1': 138 | resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} 139 | engines: {node: '>=18'} 140 | cpu: [x64] 141 | os: [freebsd] 142 | 143 | '@esbuild/linux-arm64@0.25.1': 144 | resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} 145 | engines: {node: '>=18'} 146 | cpu: [arm64] 147 | os: [linux] 148 | 149 | '@esbuild/linux-arm@0.25.1': 150 | resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} 151 | engines: {node: '>=18'} 152 | cpu: [arm] 153 | os: [linux] 154 | 155 | '@esbuild/linux-ia32@0.25.1': 156 | resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} 157 | engines: {node: '>=18'} 158 | cpu: [ia32] 159 | os: [linux] 160 | 161 | '@esbuild/linux-loong64@0.25.1': 162 | resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} 163 | engines: {node: '>=18'} 164 | cpu: [loong64] 165 | os: [linux] 166 | 167 | '@esbuild/linux-mips64el@0.25.1': 168 | resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} 169 | engines: {node: '>=18'} 170 | cpu: [mips64el] 171 | os: [linux] 172 | 173 | '@esbuild/linux-ppc64@0.25.1': 174 | resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} 175 | engines: {node: '>=18'} 176 | cpu: [ppc64] 177 | os: [linux] 178 | 179 | '@esbuild/linux-riscv64@0.25.1': 180 | resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} 181 | engines: {node: '>=18'} 182 | cpu: [riscv64] 183 | os: [linux] 184 | 185 | '@esbuild/linux-s390x@0.25.1': 186 | resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} 187 | engines: {node: '>=18'} 188 | cpu: [s390x] 189 | os: [linux] 190 | 191 | '@esbuild/linux-x64@0.25.1': 192 | resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} 193 | engines: {node: '>=18'} 194 | cpu: [x64] 195 | os: [linux] 196 | 197 | '@esbuild/netbsd-arm64@0.25.1': 198 | resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} 199 | engines: {node: '>=18'} 200 | cpu: [arm64] 201 | os: [netbsd] 202 | 203 | '@esbuild/netbsd-x64@0.25.1': 204 | resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} 205 | engines: {node: '>=18'} 206 | cpu: [x64] 207 | os: [netbsd] 208 | 209 | '@esbuild/openbsd-arm64@0.25.1': 210 | resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} 211 | engines: {node: '>=18'} 212 | cpu: [arm64] 213 | os: [openbsd] 214 | 215 | '@esbuild/openbsd-x64@0.25.1': 216 | resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} 217 | engines: {node: '>=18'} 218 | cpu: [x64] 219 | os: [openbsd] 220 | 221 | '@esbuild/sunos-x64@0.25.1': 222 | resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} 223 | engines: {node: '>=18'} 224 | cpu: [x64] 225 | os: [sunos] 226 | 227 | '@esbuild/win32-arm64@0.25.1': 228 | resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} 229 | engines: {node: '>=18'} 230 | cpu: [arm64] 231 | os: [win32] 232 | 233 | '@esbuild/win32-ia32@0.25.1': 234 | resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} 235 | engines: {node: '>=18'} 236 | cpu: [ia32] 237 | os: [win32] 238 | 239 | '@esbuild/win32-x64@0.25.1': 240 | resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} 241 | engines: {node: '>=18'} 242 | cpu: [x64] 243 | os: [win32] 244 | 245 | '@eslint-community/eslint-utils@4.4.1': 246 | resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} 247 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 248 | peerDependencies: 249 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 250 | 251 | '@eslint-community/regexpp@4.12.1': 252 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 253 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 254 | 255 | '@eslint/config-array@0.19.2': 256 | resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} 257 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 258 | 259 | '@eslint/config-helpers@0.1.0': 260 | resolution: {integrity: sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==} 261 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 262 | 263 | '@eslint/core@0.12.0': 264 | resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} 265 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 266 | 267 | '@eslint/eslintrc@3.3.0': 268 | resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} 269 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 270 | 271 | '@eslint/js@9.22.0': 272 | resolution: {integrity: sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==} 273 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 274 | 275 | '@eslint/object-schema@2.1.6': 276 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 277 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 278 | 279 | '@eslint/plugin-kit@0.2.7': 280 | resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} 281 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 282 | 283 | '@humanfs/core@0.19.1': 284 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 285 | engines: {node: '>=18.18.0'} 286 | 287 | '@humanfs/node@0.16.6': 288 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 289 | engines: {node: '>=18.18.0'} 290 | 291 | '@humanwhocodes/module-importer@1.0.1': 292 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 293 | engines: {node: '>=12.22'} 294 | 295 | '@humanwhocodes/retry@0.3.1': 296 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 297 | engines: {node: '>=18.18'} 298 | 299 | '@humanwhocodes/retry@0.4.2': 300 | resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} 301 | engines: {node: '>=18.18'} 302 | 303 | '@isaacs/cliui@8.0.2': 304 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 305 | engines: {node: '>=12'} 306 | 307 | '@isaacs/fs-minipass@4.0.1': 308 | resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} 309 | engines: {node: '>=18.0.0'} 310 | 311 | '@nodelib/fs.scandir@2.1.5': 312 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 313 | engines: {node: '>= 8'} 314 | 315 | '@nodelib/fs.stat@2.0.5': 316 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 317 | engines: {node: '>= 8'} 318 | 319 | '@nodelib/fs.walk@1.2.8': 320 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 321 | engines: {node: '>= 8'} 322 | 323 | '@npmcli/agent@3.0.0': 324 | resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==} 325 | engines: {node: ^18.17.0 || >=20.5.0} 326 | 327 | '@npmcli/fs@4.0.0': 328 | resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} 329 | engines: {node: ^18.17.0 || >=20.5.0} 330 | 331 | '@npmcli/git@6.0.1': 332 | resolution: {integrity: sha512-BBWMMxeQzalmKadyimwb2/VVQyJB01PH0HhVSNLHNBDZN/M/h/02P6f8fxedIiFhpMj11SO9Ep5tKTBE7zL2nw==} 333 | engines: {node: ^18.17.0 || >=20.5.0} 334 | 335 | '@npmcli/installed-package-contents@3.0.0': 336 | resolution: {integrity: sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==} 337 | engines: {node: ^18.17.0 || >=20.5.0} 338 | hasBin: true 339 | 340 | '@npmcli/node-gyp@4.0.0': 341 | resolution: {integrity: sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==} 342 | engines: {node: ^18.17.0 || >=20.5.0} 343 | 344 | '@npmcli/package-json@6.1.0': 345 | resolution: {integrity: sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug==} 346 | engines: {node: ^18.17.0 || >=20.5.0} 347 | 348 | '@npmcli/promise-spawn@8.0.2': 349 | resolution: {integrity: sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==} 350 | engines: {node: ^18.17.0 || >=20.5.0} 351 | 352 | '@npmcli/redact@3.0.0': 353 | resolution: {integrity: sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ==} 354 | engines: {node: ^18.17.0 || >=20.5.0} 355 | 356 | '@npmcli/run-script@9.0.2': 357 | resolution: {integrity: sha512-cJXiUlycdizQwvqE1iaAb4VRUM3RX09/8q46zjvy+ct9GhfZRWd7jXYVc1tn/CfRlGPVkX/u4sstRlepsm7hfw==} 358 | engines: {node: ^18.17.0 || >=20.5.0} 359 | 360 | '@pkgjs/parseargs@0.11.0': 361 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 362 | engines: {node: '>=14'} 363 | 364 | '@sec-ant/readable-stream@0.4.1': 365 | resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} 366 | 367 | '@sigstore/bundle@3.0.0': 368 | resolution: {integrity: sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==} 369 | engines: {node: ^18.17.0 || >=20.5.0} 370 | 371 | '@sigstore/core@2.0.0': 372 | resolution: {integrity: sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==} 373 | engines: {node: ^18.17.0 || >=20.5.0} 374 | 375 | '@sigstore/protobuf-specs@0.3.2': 376 | resolution: {integrity: sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==} 377 | engines: {node: ^16.14.0 || >=18.0.0} 378 | 379 | '@sigstore/sign@3.0.0': 380 | resolution: {integrity: sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==} 381 | engines: {node: ^18.17.0 || >=20.5.0} 382 | 383 | '@sigstore/tuf@3.0.0': 384 | resolution: {integrity: sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==} 385 | engines: {node: ^18.17.0 || >=20.5.0} 386 | 387 | '@sigstore/verify@2.0.0': 388 | resolution: {integrity: sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==} 389 | engines: {node: ^18.17.0 || >=20.5.0} 390 | 391 | '@sindresorhus/merge-streams@4.0.0': 392 | resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} 393 | engines: {node: '>=18'} 394 | 395 | '@tufjs/canonical-json@2.0.0': 396 | resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} 397 | engines: {node: ^16.14.0 || >=18.0.0} 398 | 399 | '@tufjs/models@3.0.1': 400 | resolution: {integrity: sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==} 401 | engines: {node: ^18.17.0 || >=20.5.0} 402 | 403 | '@types/estree@1.0.6': 404 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 405 | 406 | '@types/json-schema@7.0.15': 407 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 408 | 409 | '@types/node-fetch@2.6.12': 410 | resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} 411 | 412 | '@types/node@22.13.10': 413 | resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} 414 | 415 | '@types/npm-package-arg@6.1.4': 416 | resolution: {integrity: sha512-vDgdbMy2QXHnAruzlv68pUtXCjmqUk3WrBAsRboRovsOmxbfn/WiYCjmecyKjGztnMps5dWp4Uq2prp+Ilo17Q==} 417 | 418 | '@types/npm-registry-fetch@8.0.8': 419 | resolution: {integrity: sha512-VL/chssZawBkaQ5gFD5njblJce/ny9OICBlWAG9X6/m/ypPNJMWYiM22SY2mhLIGoknd4AyEJyi+FGyrBnsr+A==} 420 | 421 | '@types/npmlog@7.0.0': 422 | resolution: {integrity: sha512-hJWbrKFvxKyWwSUXjZMYTINsSOY6IclhvGOZ97M8ac2tmR9hMwmTnYaMdpGhvju9ctWLTPhCS+eLfQNluiEjQQ==} 423 | 424 | '@types/pacote@11.1.8': 425 | resolution: {integrity: sha512-/XLR0VoTh2JEO0jJg1q/e6Rh9bxjBq9vorJuQmtT7rRrXSiWz7e7NsvXVYJQ0i8JxMlBMPPYDTnrRe7MZRFA8Q==} 426 | 427 | '@types/semver@7.5.8': 428 | resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} 429 | 430 | '@types/ssri@7.1.5': 431 | resolution: {integrity: sha512-odD/56S3B51liILSk5aXJlnYt99S6Rt9EFDDqGtJM26rKHApHcwyU/UoYHrzKkdkHMAIquGWCuHtQTbes+FRQw==} 432 | 433 | '@typescript-eslint/eslint-plugin@8.26.1': 434 | resolution: {integrity: sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==} 435 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 436 | peerDependencies: 437 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 438 | eslint: ^8.57.0 || ^9.0.0 439 | typescript: '>=4.8.4 <5.9.0' 440 | 441 | '@typescript-eslint/parser@8.26.1': 442 | resolution: {integrity: sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==} 443 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 444 | peerDependencies: 445 | eslint: ^8.57.0 || ^9.0.0 446 | typescript: '>=4.8.4 <5.9.0' 447 | 448 | '@typescript-eslint/scope-manager@8.26.1': 449 | resolution: {integrity: sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==} 450 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 451 | 452 | '@typescript-eslint/type-utils@8.26.1': 453 | resolution: {integrity: sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==} 454 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 455 | peerDependencies: 456 | eslint: ^8.57.0 || ^9.0.0 457 | typescript: '>=4.8.4 <5.9.0' 458 | 459 | '@typescript-eslint/types@8.26.1': 460 | resolution: {integrity: sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==} 461 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 462 | 463 | '@typescript-eslint/typescript-estree@8.26.1': 464 | resolution: {integrity: sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==} 465 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 466 | peerDependencies: 467 | typescript: '>=4.8.4 <5.9.0' 468 | 469 | '@typescript-eslint/utils@8.26.1': 470 | resolution: {integrity: sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==} 471 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 472 | peerDependencies: 473 | eslint: ^8.57.0 || ^9.0.0 474 | typescript: '>=4.8.4 <5.9.0' 475 | 476 | '@typescript-eslint/visitor-keys@8.26.1': 477 | resolution: {integrity: sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==} 478 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 479 | 480 | abbrev@2.0.0: 481 | resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} 482 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 483 | 484 | acorn-jsx@5.3.2: 485 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 486 | peerDependencies: 487 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 488 | 489 | acorn@8.14.0: 490 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 491 | engines: {node: '>=0.4.0'} 492 | hasBin: true 493 | 494 | agent-base@7.1.3: 495 | resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} 496 | engines: {node: '>= 14'} 497 | 498 | ajv@6.12.6: 499 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 500 | 501 | ansi-escapes@7.0.0: 502 | resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} 503 | engines: {node: '>=18'} 504 | 505 | ansi-regex@5.0.1: 506 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 507 | engines: {node: '>=8'} 508 | 509 | ansi-regex@6.0.1: 510 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 511 | engines: {node: '>=12'} 512 | 513 | ansi-styles@4.3.0: 514 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 515 | engines: {node: '>=8'} 516 | 517 | ansi-styles@6.2.1: 518 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 519 | engines: {node: '>=12'} 520 | 521 | argparse@2.0.1: 522 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 523 | 524 | asynckit@0.4.0: 525 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 526 | 527 | balanced-match@1.0.2: 528 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 529 | 530 | brace-expansion@1.1.11: 531 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 532 | 533 | brace-expansion@2.0.1: 534 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 535 | 536 | braces@3.0.3: 537 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 538 | engines: {node: '>=8'} 539 | 540 | cac@6.7.14: 541 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 542 | engines: {node: '>=8'} 543 | 544 | cacache@19.0.1: 545 | resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==} 546 | engines: {node: ^18.17.0 || >=20.5.0} 547 | 548 | callsites@3.1.0: 549 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 550 | engines: {node: '>=6'} 551 | 552 | chalk@4.1.2: 553 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 554 | engines: {node: '>=10'} 555 | 556 | chalk@5.4.1: 557 | resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} 558 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 559 | 560 | chownr@2.0.0: 561 | resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} 562 | engines: {node: '>=10'} 563 | 564 | chownr@3.0.0: 565 | resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} 566 | engines: {node: '>=18'} 567 | 568 | cli-cursor@5.0.0: 569 | resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} 570 | engines: {node: '>=18'} 571 | 572 | cli-truncate@4.0.0: 573 | resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} 574 | engines: {node: '>=18'} 575 | 576 | color-convert@2.0.1: 577 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 578 | engines: {node: '>=7.0.0'} 579 | 580 | color-name@1.1.4: 581 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 582 | 583 | colorette@2.0.20: 584 | resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} 585 | 586 | combined-stream@1.0.8: 587 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 588 | engines: {node: '>= 0.8'} 589 | 590 | commander@13.1.0: 591 | resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} 592 | engines: {node: '>=18'} 593 | 594 | concat-map@0.0.1: 595 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 596 | 597 | cross-spawn@7.0.6: 598 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 599 | engines: {node: '>= 8'} 600 | 601 | data-uri-to-buffer@4.0.1: 602 | resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} 603 | engines: {node: '>= 12'} 604 | 605 | debug@4.4.0: 606 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 607 | engines: {node: '>=6.0'} 608 | peerDependencies: 609 | supports-color: '*' 610 | peerDependenciesMeta: 611 | supports-color: 612 | optional: true 613 | 614 | deep-is@0.1.4: 615 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 616 | 617 | delayed-stream@1.0.0: 618 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 619 | engines: {node: '>=0.4.0'} 620 | 621 | eastasianwidth@0.2.0: 622 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 623 | 624 | emoji-regex@10.3.0: 625 | resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} 626 | 627 | emoji-regex@8.0.0: 628 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 629 | 630 | emoji-regex@9.2.2: 631 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 632 | 633 | encoding@0.1.13: 634 | resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} 635 | 636 | enhanced-resolve@5.17.1: 637 | resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} 638 | engines: {node: '>=10.13.0'} 639 | 640 | env-paths@2.2.1: 641 | resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} 642 | engines: {node: '>=6'} 643 | 644 | environment@1.1.0: 645 | resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} 646 | engines: {node: '>=18'} 647 | 648 | err-code@2.0.3: 649 | resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} 650 | 651 | esbuild@0.25.1: 652 | resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} 653 | engines: {node: '>=18'} 654 | hasBin: true 655 | 656 | escape-string-regexp@4.0.0: 657 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 658 | engines: {node: '>=10'} 659 | 660 | eslint-compat-utils@0.5.1: 661 | resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} 662 | engines: {node: '>=12'} 663 | peerDependencies: 664 | eslint: '>=6.0.0' 665 | 666 | eslint-plugin-es-x@7.8.0: 667 | resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} 668 | engines: {node: ^14.18.0 || >=16.0.0} 669 | peerDependencies: 670 | eslint: '>=8' 671 | 672 | eslint-plugin-n@17.16.2: 673 | resolution: {integrity: sha512-iQM5Oj+9o0KaeLoObJC/uxNGpktZCkYiTTBo8PkRWq3HwNcRxwpvSDFjBhQ5+HLJzBTy+CLDC5+bw0Z5GyhlOQ==} 674 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 675 | peerDependencies: 676 | eslint: '>=8.23.0' 677 | 678 | eslint-scope@8.3.0: 679 | resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} 680 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 681 | 682 | eslint-visitor-keys@3.4.3: 683 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 684 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 685 | 686 | eslint-visitor-keys@4.2.0: 687 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 688 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 689 | 690 | eslint@9.22.0: 691 | resolution: {integrity: sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==} 692 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 693 | hasBin: true 694 | peerDependencies: 695 | jiti: '*' 696 | peerDependenciesMeta: 697 | jiti: 698 | optional: true 699 | 700 | espree@10.3.0: 701 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 702 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 703 | 704 | esquery@1.5.0: 705 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 706 | engines: {node: '>=0.10'} 707 | 708 | esrecurse@4.3.0: 709 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 710 | engines: {node: '>=4.0'} 711 | 712 | estraverse@5.3.0: 713 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 714 | engines: {node: '>=4.0'} 715 | 716 | esutils@2.0.3: 717 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 718 | engines: {node: '>=0.10.0'} 719 | 720 | eventemitter3@5.0.1: 721 | resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} 722 | 723 | execa@8.0.1: 724 | resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} 725 | engines: {node: '>=16.17'} 726 | 727 | execa@9.5.2: 728 | resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} 729 | engines: {node: ^18.19.0 || >=20.5.0} 730 | 731 | exponential-backoff@3.1.1: 732 | resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} 733 | 734 | fast-deep-equal@3.1.3: 735 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 736 | 737 | fast-glob@3.3.2: 738 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 739 | engines: {node: '>=8.6.0'} 740 | 741 | fast-json-stable-stringify@2.1.0: 742 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 743 | 744 | fast-levenshtein@2.0.6: 745 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 746 | 747 | fastq@1.15.0: 748 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 749 | 750 | fetch-blob@3.2.0: 751 | resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} 752 | engines: {node: ^12.20 || >= 14.13} 753 | 754 | figures@6.1.0: 755 | resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} 756 | engines: {node: '>=18'} 757 | 758 | file-entry-cache@8.0.0: 759 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 760 | engines: {node: '>=16.0.0'} 761 | 762 | fill-range@7.1.1: 763 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 764 | engines: {node: '>=8'} 765 | 766 | find-up@5.0.0: 767 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 768 | engines: {node: '>=10'} 769 | 770 | flat-cache@4.0.1: 771 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 772 | engines: {node: '>=16'} 773 | 774 | flatted@3.3.1: 775 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 776 | 777 | foreground-child@3.3.0: 778 | resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} 779 | engines: {node: '>=14'} 780 | 781 | form-data@4.0.1: 782 | resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} 783 | engines: {node: '>= 6'} 784 | 785 | formdata-polyfill@4.0.10: 786 | resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} 787 | engines: {node: '>=12.20.0'} 788 | 789 | fs-minipass@2.1.0: 790 | resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} 791 | engines: {node: '>= 8'} 792 | 793 | fs-minipass@3.0.3: 794 | resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} 795 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 796 | 797 | fsevents@2.3.3: 798 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 799 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 800 | os: [darwin] 801 | 802 | get-east-asian-width@1.2.0: 803 | resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} 804 | engines: {node: '>=18'} 805 | 806 | get-stream@8.0.1: 807 | resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} 808 | engines: {node: '>=16'} 809 | 810 | get-stream@9.0.1: 811 | resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} 812 | engines: {node: '>=18'} 813 | 814 | get-tsconfig@4.8.1: 815 | resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} 816 | 817 | glob-parent@5.1.2: 818 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 819 | engines: {node: '>= 6'} 820 | 821 | glob-parent@6.0.2: 822 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 823 | engines: {node: '>=10.13.0'} 824 | 825 | glob@10.4.5: 826 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 827 | hasBin: true 828 | 829 | globals@14.0.0: 830 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 831 | engines: {node: '>=18'} 832 | 833 | globals@15.11.0: 834 | resolution: {integrity: sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==} 835 | engines: {node: '>=18'} 836 | 837 | graceful-fs@4.2.11: 838 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 839 | 840 | graphemer@1.4.0: 841 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 842 | 843 | has-flag@4.0.0: 844 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 845 | engines: {node: '>=8'} 846 | 847 | hosted-git-info@8.0.2: 848 | resolution: {integrity: sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==} 849 | engines: {node: ^18.17.0 || >=20.5.0} 850 | 851 | http-cache-semantics@4.1.1: 852 | resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} 853 | 854 | http-proxy-agent@7.0.2: 855 | resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} 856 | engines: {node: '>= 14'} 857 | 858 | https-proxy-agent@7.0.6: 859 | resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} 860 | engines: {node: '>= 14'} 861 | 862 | human-signals@5.0.0: 863 | resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} 864 | engines: {node: '>=16.17.0'} 865 | 866 | human-signals@8.0.0: 867 | resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} 868 | engines: {node: '>=18.18.0'} 869 | 870 | iconv-lite@0.6.3: 871 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 872 | engines: {node: '>=0.10.0'} 873 | 874 | ignore-walk@7.0.0: 875 | resolution: {integrity: sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==} 876 | engines: {node: ^18.17.0 || >=20.5.0} 877 | 878 | ignore@5.3.2: 879 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 880 | engines: {node: '>= 4'} 881 | 882 | import-fresh@3.3.0: 883 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 884 | engines: {node: '>=6'} 885 | 886 | imurmurhash@0.1.4: 887 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 888 | engines: {node: '>=0.8.19'} 889 | 890 | ini@5.0.0: 891 | resolution: {integrity: sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==} 892 | engines: {node: ^18.17.0 || >=20.5.0} 893 | 894 | ip-address@9.0.5: 895 | resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} 896 | engines: {node: '>= 12'} 897 | 898 | is-extglob@2.1.1: 899 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 900 | engines: {node: '>=0.10.0'} 901 | 902 | is-fullwidth-code-point@3.0.0: 903 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 904 | engines: {node: '>=8'} 905 | 906 | is-fullwidth-code-point@4.0.0: 907 | resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} 908 | engines: {node: '>=12'} 909 | 910 | is-fullwidth-code-point@5.0.0: 911 | resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} 912 | engines: {node: '>=18'} 913 | 914 | is-glob@4.0.3: 915 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 916 | engines: {node: '>=0.10.0'} 917 | 918 | is-number@7.0.0: 919 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 920 | engines: {node: '>=0.12.0'} 921 | 922 | is-plain-obj@4.1.0: 923 | resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} 924 | engines: {node: '>=12'} 925 | 926 | is-stream@3.0.0: 927 | resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} 928 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 929 | 930 | is-stream@4.0.1: 931 | resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} 932 | engines: {node: '>=18'} 933 | 934 | is-unicode-supported@2.0.0: 935 | resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} 936 | engines: {node: '>=18'} 937 | 938 | isexe@2.0.0: 939 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 940 | 941 | isexe@3.1.1: 942 | resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} 943 | engines: {node: '>=16'} 944 | 945 | jackspeak@3.4.3: 946 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 947 | 948 | js-yaml@4.1.0: 949 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 950 | hasBin: true 951 | 952 | jsbn@1.1.0: 953 | resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} 954 | 955 | json-buffer@3.0.1: 956 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 957 | 958 | json-parse-even-better-errors@4.0.0: 959 | resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==} 960 | engines: {node: ^18.17.0 || >=20.5.0} 961 | 962 | json-schema-traverse@0.4.1: 963 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 964 | 965 | json-stable-stringify-without-jsonify@1.0.1: 966 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 967 | 968 | jsonparse@1.3.1: 969 | resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} 970 | engines: {'0': node >= 0.2.0} 971 | 972 | keyv@4.5.4: 973 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 974 | 975 | levn@0.4.1: 976 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 977 | engines: {node: '>= 0.8.0'} 978 | 979 | lilconfig@3.1.3: 980 | resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} 981 | engines: {node: '>=14'} 982 | 983 | lint-staged@15.5.0: 984 | resolution: {integrity: sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==} 985 | engines: {node: '>=18.12.0'} 986 | hasBin: true 987 | 988 | listr2@8.2.5: 989 | resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} 990 | engines: {node: '>=18.0.0'} 991 | 992 | locate-path@6.0.0: 993 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 994 | engines: {node: '>=10'} 995 | 996 | lodash.merge@4.6.2: 997 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 998 | 999 | log-update@6.1.0: 1000 | resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} 1001 | engines: {node: '>=18'} 1002 | 1003 | lru-cache@10.4.3: 1004 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1005 | 1006 | make-fetch-happen@14.0.3: 1007 | resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==} 1008 | engines: {node: ^18.17.0 || >=20.5.0} 1009 | 1010 | merge-stream@2.0.0: 1011 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1012 | 1013 | merge2@1.4.1: 1014 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1015 | engines: {node: '>= 8'} 1016 | 1017 | micromatch@4.0.8: 1018 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1019 | engines: {node: '>=8.6'} 1020 | 1021 | mime-db@1.52.0: 1022 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1023 | engines: {node: '>= 0.6'} 1024 | 1025 | mime-types@2.1.35: 1026 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1027 | engines: {node: '>= 0.6'} 1028 | 1029 | mimic-fn@4.0.0: 1030 | resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 1031 | engines: {node: '>=12'} 1032 | 1033 | mimic-function@5.0.1: 1034 | resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} 1035 | engines: {node: '>=18'} 1036 | 1037 | minimatch@3.1.2: 1038 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1039 | 1040 | minimatch@9.0.5: 1041 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1042 | engines: {node: '>=16 || 14 >=14.17'} 1043 | 1044 | minipass-collect@2.0.1: 1045 | resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} 1046 | engines: {node: '>=16 || 14 >=14.17'} 1047 | 1048 | minipass-fetch@4.0.0: 1049 | resolution: {integrity: sha512-2v6aXUXwLP1Epd/gc32HAMIWoczx+fZwEPRHm/VwtrJzRGwR1qGZXEYV3Zp8ZjjbwaZhMrM6uHV4KVkk+XCc2w==} 1050 | engines: {node: ^18.17.0 || >=20.5.0} 1051 | 1052 | minipass-flush@1.0.5: 1053 | resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} 1054 | engines: {node: '>= 8'} 1055 | 1056 | minipass-pipeline@1.2.4: 1057 | resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} 1058 | engines: {node: '>=8'} 1059 | 1060 | minipass-sized@1.0.3: 1061 | resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} 1062 | engines: {node: '>=8'} 1063 | 1064 | minipass@3.3.6: 1065 | resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} 1066 | engines: {node: '>=8'} 1067 | 1068 | minipass@5.0.0: 1069 | resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} 1070 | engines: {node: '>=8'} 1071 | 1072 | minipass@7.1.2: 1073 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1074 | engines: {node: '>=16 || 14 >=14.17'} 1075 | 1076 | minizlib@2.1.2: 1077 | resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} 1078 | engines: {node: '>= 8'} 1079 | 1080 | minizlib@3.0.1: 1081 | resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} 1082 | engines: {node: '>= 18'} 1083 | 1084 | mkdirp@1.0.4: 1085 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 1086 | engines: {node: '>=10'} 1087 | hasBin: true 1088 | 1089 | mkdirp@3.0.1: 1090 | resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} 1091 | engines: {node: '>=10'} 1092 | hasBin: true 1093 | 1094 | ms@2.1.3: 1095 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1096 | 1097 | natural-compare@1.4.0: 1098 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1099 | 1100 | negotiator@1.0.0: 1101 | resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} 1102 | engines: {node: '>= 0.6'} 1103 | 1104 | node-domexception@1.0.0: 1105 | resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} 1106 | engines: {node: '>=10.5.0'} 1107 | 1108 | node-fetch@3.3.2: 1109 | resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} 1110 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1111 | 1112 | node-gyp@11.0.0: 1113 | resolution: {integrity: sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw==} 1114 | engines: {node: ^18.17.0 || >=20.5.0} 1115 | hasBin: true 1116 | 1117 | nopt@8.0.0: 1118 | resolution: {integrity: sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==} 1119 | engines: {node: ^18.17.0 || >=20.5.0} 1120 | hasBin: true 1121 | 1122 | normalize-package-data@7.0.0: 1123 | resolution: {integrity: sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==} 1124 | engines: {node: ^18.17.0 || >=20.5.0} 1125 | 1126 | npm-bundled@4.0.0: 1127 | resolution: {integrity: sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==} 1128 | engines: {node: ^18.17.0 || >=20.5.0} 1129 | 1130 | npm-install-checks@7.1.1: 1131 | resolution: {integrity: sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==} 1132 | engines: {node: ^18.17.0 || >=20.5.0} 1133 | 1134 | npm-normalize-package-bin@4.0.0: 1135 | resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==} 1136 | engines: {node: ^18.17.0 || >=20.5.0} 1137 | 1138 | npm-package-arg@12.0.1: 1139 | resolution: {integrity: sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ==} 1140 | engines: {node: ^18.17.0 || >=20.5.0} 1141 | 1142 | npm-packlist@10.0.0: 1143 | resolution: {integrity: sha512-rht9U6nS8WOBDc53eipZNPo5qkAV4X2rhKE2Oj1DYUQ3DieXfj0mKkVmjnf3iuNdtMd8WfLdi2L6ASkD/8a+Kg==} 1144 | engines: {node: ^20.17.0 || >=22.9.0} 1145 | 1146 | npm-pick-manifest@10.0.0: 1147 | resolution: {integrity: sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==} 1148 | engines: {node: ^18.17.0 || >=20.5.0} 1149 | 1150 | npm-registry-fetch@18.0.2: 1151 | resolution: {integrity: sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==} 1152 | engines: {node: ^18.17.0 || >=20.5.0} 1153 | 1154 | npm-run-path@5.3.0: 1155 | resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} 1156 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1157 | 1158 | npm-run-path@6.0.0: 1159 | resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} 1160 | engines: {node: '>=18'} 1161 | 1162 | onetime@6.0.0: 1163 | resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} 1164 | engines: {node: '>=12'} 1165 | 1166 | onetime@7.0.0: 1167 | resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} 1168 | engines: {node: '>=18'} 1169 | 1170 | optionator@0.9.3: 1171 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 1172 | engines: {node: '>= 0.8.0'} 1173 | 1174 | p-limit@3.1.0: 1175 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1176 | engines: {node: '>=10'} 1177 | 1178 | p-locate@5.0.0: 1179 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1180 | engines: {node: '>=10'} 1181 | 1182 | p-map@7.0.3: 1183 | resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} 1184 | engines: {node: '>=18'} 1185 | 1186 | package-json-from-dist@1.0.1: 1187 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1188 | 1189 | pacote@21.0.0: 1190 | resolution: {integrity: sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==} 1191 | engines: {node: ^20.17.0 || >=22.9.0} 1192 | hasBin: true 1193 | 1194 | parent-module@1.0.1: 1195 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1196 | engines: {node: '>=6'} 1197 | 1198 | parse-ms@4.0.0: 1199 | resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} 1200 | engines: {node: '>=18'} 1201 | 1202 | path-exists@4.0.0: 1203 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1204 | engines: {node: '>=8'} 1205 | 1206 | path-key@3.1.1: 1207 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1208 | engines: {node: '>=8'} 1209 | 1210 | path-key@4.0.0: 1211 | resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} 1212 | engines: {node: '>=12'} 1213 | 1214 | path-scurry@1.11.1: 1215 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 1216 | engines: {node: '>=16 || 14 >=14.18'} 1217 | 1218 | picomatch@2.3.1: 1219 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1220 | engines: {node: '>=8.6'} 1221 | 1222 | pidtree@0.6.0: 1223 | resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} 1224 | engines: {node: '>=0.10'} 1225 | hasBin: true 1226 | 1227 | prelude-ls@1.2.1: 1228 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1229 | engines: {node: '>= 0.8.0'} 1230 | 1231 | prettier@3.5.3: 1232 | resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} 1233 | engines: {node: '>=14'} 1234 | hasBin: true 1235 | 1236 | pretty-ms@9.0.0: 1237 | resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} 1238 | engines: {node: '>=18'} 1239 | 1240 | proc-log@5.0.0: 1241 | resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} 1242 | engines: {node: ^18.17.0 || >=20.5.0} 1243 | 1244 | promise-inflight@1.0.1: 1245 | resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} 1246 | peerDependencies: 1247 | bluebird: '*' 1248 | peerDependenciesMeta: 1249 | bluebird: 1250 | optional: true 1251 | 1252 | promise-retry@2.0.1: 1253 | resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} 1254 | engines: {node: '>=10'} 1255 | 1256 | punycode@2.3.0: 1257 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 1258 | engines: {node: '>=6'} 1259 | 1260 | queue-microtask@1.2.3: 1261 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1262 | 1263 | resolve-from@4.0.0: 1264 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1265 | engines: {node: '>=4'} 1266 | 1267 | resolve-pkg-maps@1.0.0: 1268 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1269 | 1270 | restore-cursor@5.1.0: 1271 | resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} 1272 | engines: {node: '>=18'} 1273 | 1274 | retry@0.12.0: 1275 | resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} 1276 | engines: {node: '>= 4'} 1277 | 1278 | reusify@1.0.4: 1279 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1280 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1281 | 1282 | rfdc@1.4.1: 1283 | resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} 1284 | 1285 | rimraf@5.0.10: 1286 | resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} 1287 | hasBin: true 1288 | 1289 | run-parallel@1.2.0: 1290 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1291 | 1292 | safer-buffer@2.1.2: 1293 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1294 | 1295 | semver@7.7.1: 1296 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 1297 | engines: {node: '>=10'} 1298 | hasBin: true 1299 | 1300 | shebang-command@2.0.0: 1301 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1302 | engines: {node: '>=8'} 1303 | 1304 | shebang-regex@3.0.0: 1305 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1306 | engines: {node: '>=8'} 1307 | 1308 | signal-exit@4.1.0: 1309 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1310 | engines: {node: '>=14'} 1311 | 1312 | sigstore@3.0.0: 1313 | resolution: {integrity: sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==} 1314 | engines: {node: ^18.17.0 || >=20.5.0} 1315 | 1316 | simple-git-hooks@2.11.1: 1317 | resolution: {integrity: sha512-tgqwPUMDcNDhuf1Xf6KTUsyeqGdgKMhzaH4PAZZuzguOgTl5uuyeYe/8mWgAr6IBxB5V06uqEf6Dy37gIWDtDg==} 1318 | hasBin: true 1319 | 1320 | slice-ansi@5.0.0: 1321 | resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} 1322 | engines: {node: '>=12'} 1323 | 1324 | slice-ansi@7.1.0: 1325 | resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} 1326 | engines: {node: '>=18'} 1327 | 1328 | smart-buffer@4.2.0: 1329 | resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} 1330 | engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} 1331 | 1332 | socks-proxy-agent@8.0.5: 1333 | resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} 1334 | engines: {node: '>= 14'} 1335 | 1336 | socks@2.8.3: 1337 | resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} 1338 | engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} 1339 | 1340 | spdx-correct@3.2.0: 1341 | resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} 1342 | 1343 | spdx-exceptions@2.5.0: 1344 | resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} 1345 | 1346 | spdx-expression-parse@3.0.1: 1347 | resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} 1348 | 1349 | spdx-license-ids@3.0.20: 1350 | resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} 1351 | 1352 | sprintf-js@1.1.3: 1353 | resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} 1354 | 1355 | ssri@12.0.0: 1356 | resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} 1357 | engines: {node: ^18.17.0 || >=20.5.0} 1358 | 1359 | string-argv@0.3.2: 1360 | resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} 1361 | engines: {node: '>=0.6.19'} 1362 | 1363 | string-width@4.2.3: 1364 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1365 | engines: {node: '>=8'} 1366 | 1367 | string-width@5.1.2: 1368 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1369 | engines: {node: '>=12'} 1370 | 1371 | string-width@7.0.0: 1372 | resolution: {integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==} 1373 | engines: {node: '>=18'} 1374 | 1375 | strip-ansi@6.0.1: 1376 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1377 | engines: {node: '>=8'} 1378 | 1379 | strip-ansi@7.1.0: 1380 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1381 | engines: {node: '>=12'} 1382 | 1383 | strip-final-newline@3.0.0: 1384 | resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} 1385 | engines: {node: '>=12'} 1386 | 1387 | strip-final-newline@4.0.0: 1388 | resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} 1389 | engines: {node: '>=18'} 1390 | 1391 | strip-json-comments@3.1.1: 1392 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1393 | engines: {node: '>=8'} 1394 | 1395 | supports-color@7.2.0: 1396 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1397 | engines: {node: '>=8'} 1398 | 1399 | tapable@2.2.1: 1400 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 1401 | engines: {node: '>=6'} 1402 | 1403 | tar@6.2.1: 1404 | resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} 1405 | engines: {node: '>=10'} 1406 | 1407 | tar@7.4.3: 1408 | resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} 1409 | engines: {node: '>=18'} 1410 | 1411 | to-regex-range@5.0.1: 1412 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1413 | engines: {node: '>=8.0'} 1414 | 1415 | ts-api-utils@2.0.1: 1416 | resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} 1417 | engines: {node: '>=18.12'} 1418 | peerDependencies: 1419 | typescript: '>=4.8.4' 1420 | 1421 | tsx@4.19.3: 1422 | resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} 1423 | engines: {node: '>=18.0.0'} 1424 | hasBin: true 1425 | 1426 | tuf-js@3.0.1: 1427 | resolution: {integrity: sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==} 1428 | engines: {node: ^18.17.0 || >=20.5.0} 1429 | 1430 | tunnel@0.0.6: 1431 | resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} 1432 | engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} 1433 | 1434 | type-check@0.4.0: 1435 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1436 | engines: {node: '>= 0.8.0'} 1437 | 1438 | typescript-eslint@8.26.1: 1439 | resolution: {integrity: sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==} 1440 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1441 | peerDependencies: 1442 | eslint: ^8.57.0 || ^9.0.0 1443 | typescript: '>=4.8.4 <5.9.0' 1444 | 1445 | typescript@5.8.2: 1446 | resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} 1447 | engines: {node: '>=14.17'} 1448 | hasBin: true 1449 | 1450 | undici-types@6.20.0: 1451 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 1452 | 1453 | unicorn-magic@0.3.0: 1454 | resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} 1455 | engines: {node: '>=18'} 1456 | 1457 | unique-filename@4.0.0: 1458 | resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==} 1459 | engines: {node: ^18.17.0 || >=20.5.0} 1460 | 1461 | unique-slug@5.0.0: 1462 | resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==} 1463 | engines: {node: ^18.17.0 || >=20.5.0} 1464 | 1465 | uri-js@4.4.1: 1466 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1467 | 1468 | validate-npm-package-license@3.0.4: 1469 | resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 1470 | 1471 | validate-npm-package-name@6.0.0: 1472 | resolution: {integrity: sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==} 1473 | engines: {node: ^18.17.0 || >=20.5.0} 1474 | 1475 | web-streams-polyfill@3.2.1: 1476 | resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} 1477 | engines: {node: '>= 8'} 1478 | 1479 | which@2.0.2: 1480 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1481 | engines: {node: '>= 8'} 1482 | hasBin: true 1483 | 1484 | which@5.0.0: 1485 | resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} 1486 | engines: {node: ^18.17.0 || >=20.5.0} 1487 | hasBin: true 1488 | 1489 | wrap-ansi@7.0.0: 1490 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1491 | engines: {node: '>=10'} 1492 | 1493 | wrap-ansi@8.1.0: 1494 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1495 | engines: {node: '>=12'} 1496 | 1497 | wrap-ansi@9.0.0: 1498 | resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} 1499 | engines: {node: '>=18'} 1500 | 1501 | yallist@4.0.0: 1502 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1503 | 1504 | yallist@5.0.0: 1505 | resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} 1506 | engines: {node: '>=18'} 1507 | 1508 | yaml@2.7.0: 1509 | resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} 1510 | engines: {node: '>= 14'} 1511 | hasBin: true 1512 | 1513 | yocto-queue@0.1.0: 1514 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1515 | engines: {node: '>=10'} 1516 | 1517 | yoctocolors@2.0.2: 1518 | resolution: {integrity: sha512-Ct97huExsu7cWeEjmrXlofevF8CvzUglJ4iGUet5B8xn1oumtAZBpHU4GzYuoE6PVqcZ5hghtBrSlhwHuR1Jmw==} 1519 | engines: {node: '>=18'} 1520 | 1521 | snapshots: 1522 | 1523 | '@aashutoshrathi/word-wrap@1.2.6': {} 1524 | 1525 | '@actions/core@1.11.1': 1526 | dependencies: 1527 | '@actions/exec': 1.1.1 1528 | '@actions/http-client': 2.1.1 1529 | 1530 | '@actions/exec@1.1.1': 1531 | dependencies: 1532 | '@actions/io': 1.1.3 1533 | 1534 | '@actions/http-client@2.1.1': 1535 | dependencies: 1536 | tunnel: 0.0.6 1537 | 1538 | '@actions/io@1.1.3': {} 1539 | 1540 | '@antfu/ni@23.3.1': {} 1541 | 1542 | '@esbuild/aix-ppc64@0.25.1': 1543 | optional: true 1544 | 1545 | '@esbuild/android-arm64@0.25.1': 1546 | optional: true 1547 | 1548 | '@esbuild/android-arm@0.25.1': 1549 | optional: true 1550 | 1551 | '@esbuild/android-x64@0.25.1': 1552 | optional: true 1553 | 1554 | '@esbuild/darwin-arm64@0.25.1': 1555 | optional: true 1556 | 1557 | '@esbuild/darwin-x64@0.25.1': 1558 | optional: true 1559 | 1560 | '@esbuild/freebsd-arm64@0.25.1': 1561 | optional: true 1562 | 1563 | '@esbuild/freebsd-x64@0.25.1': 1564 | optional: true 1565 | 1566 | '@esbuild/linux-arm64@0.25.1': 1567 | optional: true 1568 | 1569 | '@esbuild/linux-arm@0.25.1': 1570 | optional: true 1571 | 1572 | '@esbuild/linux-ia32@0.25.1': 1573 | optional: true 1574 | 1575 | '@esbuild/linux-loong64@0.25.1': 1576 | optional: true 1577 | 1578 | '@esbuild/linux-mips64el@0.25.1': 1579 | optional: true 1580 | 1581 | '@esbuild/linux-ppc64@0.25.1': 1582 | optional: true 1583 | 1584 | '@esbuild/linux-riscv64@0.25.1': 1585 | optional: true 1586 | 1587 | '@esbuild/linux-s390x@0.25.1': 1588 | optional: true 1589 | 1590 | '@esbuild/linux-x64@0.25.1': 1591 | optional: true 1592 | 1593 | '@esbuild/netbsd-arm64@0.25.1': 1594 | optional: true 1595 | 1596 | '@esbuild/netbsd-x64@0.25.1': 1597 | optional: true 1598 | 1599 | '@esbuild/openbsd-arm64@0.25.1': 1600 | optional: true 1601 | 1602 | '@esbuild/openbsd-x64@0.25.1': 1603 | optional: true 1604 | 1605 | '@esbuild/sunos-x64@0.25.1': 1606 | optional: true 1607 | 1608 | '@esbuild/win32-arm64@0.25.1': 1609 | optional: true 1610 | 1611 | '@esbuild/win32-ia32@0.25.1': 1612 | optional: true 1613 | 1614 | '@esbuild/win32-x64@0.25.1': 1615 | optional: true 1616 | 1617 | '@eslint-community/eslint-utils@4.4.1(eslint@9.22.0)': 1618 | dependencies: 1619 | eslint: 9.22.0 1620 | eslint-visitor-keys: 3.4.3 1621 | 1622 | '@eslint-community/regexpp@4.12.1': {} 1623 | 1624 | '@eslint/config-array@0.19.2': 1625 | dependencies: 1626 | '@eslint/object-schema': 2.1.6 1627 | debug: 4.4.0 1628 | minimatch: 3.1.2 1629 | transitivePeerDependencies: 1630 | - supports-color 1631 | 1632 | '@eslint/config-helpers@0.1.0': {} 1633 | 1634 | '@eslint/core@0.12.0': 1635 | dependencies: 1636 | '@types/json-schema': 7.0.15 1637 | 1638 | '@eslint/eslintrc@3.3.0': 1639 | dependencies: 1640 | ajv: 6.12.6 1641 | debug: 4.4.0 1642 | espree: 10.3.0 1643 | globals: 14.0.0 1644 | ignore: 5.3.2 1645 | import-fresh: 3.3.0 1646 | js-yaml: 4.1.0 1647 | minimatch: 3.1.2 1648 | strip-json-comments: 3.1.1 1649 | transitivePeerDependencies: 1650 | - supports-color 1651 | 1652 | '@eslint/js@9.22.0': {} 1653 | 1654 | '@eslint/object-schema@2.1.6': {} 1655 | 1656 | '@eslint/plugin-kit@0.2.7': 1657 | dependencies: 1658 | '@eslint/core': 0.12.0 1659 | levn: 0.4.1 1660 | 1661 | '@humanfs/core@0.19.1': {} 1662 | 1663 | '@humanfs/node@0.16.6': 1664 | dependencies: 1665 | '@humanfs/core': 0.19.1 1666 | '@humanwhocodes/retry': 0.3.1 1667 | 1668 | '@humanwhocodes/module-importer@1.0.1': {} 1669 | 1670 | '@humanwhocodes/retry@0.3.1': {} 1671 | 1672 | '@humanwhocodes/retry@0.4.2': {} 1673 | 1674 | '@isaacs/cliui@8.0.2': 1675 | dependencies: 1676 | string-width: 5.1.2 1677 | string-width-cjs: string-width@4.2.3 1678 | strip-ansi: 7.1.0 1679 | strip-ansi-cjs: strip-ansi@6.0.1 1680 | wrap-ansi: 8.1.0 1681 | wrap-ansi-cjs: wrap-ansi@7.0.0 1682 | 1683 | '@isaacs/fs-minipass@4.0.1': 1684 | dependencies: 1685 | minipass: 7.1.2 1686 | 1687 | '@nodelib/fs.scandir@2.1.5': 1688 | dependencies: 1689 | '@nodelib/fs.stat': 2.0.5 1690 | run-parallel: 1.2.0 1691 | 1692 | '@nodelib/fs.stat@2.0.5': {} 1693 | 1694 | '@nodelib/fs.walk@1.2.8': 1695 | dependencies: 1696 | '@nodelib/fs.scandir': 2.1.5 1697 | fastq: 1.15.0 1698 | 1699 | '@npmcli/agent@3.0.0': 1700 | dependencies: 1701 | agent-base: 7.1.3 1702 | http-proxy-agent: 7.0.2 1703 | https-proxy-agent: 7.0.6 1704 | lru-cache: 10.4.3 1705 | socks-proxy-agent: 8.0.5 1706 | transitivePeerDependencies: 1707 | - supports-color 1708 | 1709 | '@npmcli/fs@4.0.0': 1710 | dependencies: 1711 | semver: 7.7.1 1712 | 1713 | '@npmcli/git@6.0.1': 1714 | dependencies: 1715 | '@npmcli/promise-spawn': 8.0.2 1716 | ini: 5.0.0 1717 | lru-cache: 10.4.3 1718 | npm-pick-manifest: 10.0.0 1719 | proc-log: 5.0.0 1720 | promise-inflight: 1.0.1 1721 | promise-retry: 2.0.1 1722 | semver: 7.7.1 1723 | which: 5.0.0 1724 | transitivePeerDependencies: 1725 | - bluebird 1726 | 1727 | '@npmcli/installed-package-contents@3.0.0': 1728 | dependencies: 1729 | npm-bundled: 4.0.0 1730 | npm-normalize-package-bin: 4.0.0 1731 | 1732 | '@npmcli/node-gyp@4.0.0': {} 1733 | 1734 | '@npmcli/package-json@6.1.0': 1735 | dependencies: 1736 | '@npmcli/git': 6.0.1 1737 | glob: 10.4.5 1738 | hosted-git-info: 8.0.2 1739 | json-parse-even-better-errors: 4.0.0 1740 | normalize-package-data: 7.0.0 1741 | proc-log: 5.0.0 1742 | semver: 7.7.1 1743 | transitivePeerDependencies: 1744 | - bluebird 1745 | 1746 | '@npmcli/promise-spawn@8.0.2': 1747 | dependencies: 1748 | which: 5.0.0 1749 | 1750 | '@npmcli/redact@3.0.0': {} 1751 | 1752 | '@npmcli/run-script@9.0.2': 1753 | dependencies: 1754 | '@npmcli/node-gyp': 4.0.0 1755 | '@npmcli/package-json': 6.1.0 1756 | '@npmcli/promise-spawn': 8.0.2 1757 | node-gyp: 11.0.0 1758 | proc-log: 5.0.0 1759 | which: 5.0.0 1760 | transitivePeerDependencies: 1761 | - bluebird 1762 | - supports-color 1763 | 1764 | '@pkgjs/parseargs@0.11.0': 1765 | optional: true 1766 | 1767 | '@sec-ant/readable-stream@0.4.1': {} 1768 | 1769 | '@sigstore/bundle@3.0.0': 1770 | dependencies: 1771 | '@sigstore/protobuf-specs': 0.3.2 1772 | 1773 | '@sigstore/core@2.0.0': {} 1774 | 1775 | '@sigstore/protobuf-specs@0.3.2': {} 1776 | 1777 | '@sigstore/sign@3.0.0': 1778 | dependencies: 1779 | '@sigstore/bundle': 3.0.0 1780 | '@sigstore/core': 2.0.0 1781 | '@sigstore/protobuf-specs': 0.3.2 1782 | make-fetch-happen: 14.0.3 1783 | proc-log: 5.0.0 1784 | promise-retry: 2.0.1 1785 | transitivePeerDependencies: 1786 | - supports-color 1787 | 1788 | '@sigstore/tuf@3.0.0': 1789 | dependencies: 1790 | '@sigstore/protobuf-specs': 0.3.2 1791 | tuf-js: 3.0.1 1792 | transitivePeerDependencies: 1793 | - supports-color 1794 | 1795 | '@sigstore/verify@2.0.0': 1796 | dependencies: 1797 | '@sigstore/bundle': 3.0.0 1798 | '@sigstore/core': 2.0.0 1799 | '@sigstore/protobuf-specs': 0.3.2 1800 | 1801 | '@sindresorhus/merge-streams@4.0.0': {} 1802 | 1803 | '@tufjs/canonical-json@2.0.0': {} 1804 | 1805 | '@tufjs/models@3.0.1': 1806 | dependencies: 1807 | '@tufjs/canonical-json': 2.0.0 1808 | minimatch: 9.0.5 1809 | 1810 | '@types/estree@1.0.6': {} 1811 | 1812 | '@types/json-schema@7.0.15': {} 1813 | 1814 | '@types/node-fetch@2.6.12': 1815 | dependencies: 1816 | '@types/node': 22.13.10 1817 | form-data: 4.0.1 1818 | 1819 | '@types/node@22.13.10': 1820 | dependencies: 1821 | undici-types: 6.20.0 1822 | 1823 | '@types/npm-package-arg@6.1.4': {} 1824 | 1825 | '@types/npm-registry-fetch@8.0.8': 1826 | dependencies: 1827 | '@types/node': 22.13.10 1828 | '@types/node-fetch': 2.6.12 1829 | '@types/npm-package-arg': 6.1.4 1830 | '@types/npmlog': 7.0.0 1831 | '@types/ssri': 7.1.5 1832 | 1833 | '@types/npmlog@7.0.0': 1834 | dependencies: 1835 | '@types/node': 22.13.10 1836 | 1837 | '@types/pacote@11.1.8': 1838 | dependencies: 1839 | '@types/node': 22.13.10 1840 | '@types/npm-registry-fetch': 8.0.8 1841 | '@types/npmlog': 7.0.0 1842 | '@types/ssri': 7.1.5 1843 | 1844 | '@types/semver@7.5.8': {} 1845 | 1846 | '@types/ssri@7.1.5': 1847 | dependencies: 1848 | '@types/node': 22.13.10 1849 | 1850 | '@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2)': 1851 | dependencies: 1852 | '@eslint-community/regexpp': 4.12.1 1853 | '@typescript-eslint/parser': 8.26.1(eslint@9.22.0)(typescript@5.8.2) 1854 | '@typescript-eslint/scope-manager': 8.26.1 1855 | '@typescript-eslint/type-utils': 8.26.1(eslint@9.22.0)(typescript@5.8.2) 1856 | '@typescript-eslint/utils': 8.26.1(eslint@9.22.0)(typescript@5.8.2) 1857 | '@typescript-eslint/visitor-keys': 8.26.1 1858 | eslint: 9.22.0 1859 | graphemer: 1.4.0 1860 | ignore: 5.3.2 1861 | natural-compare: 1.4.0 1862 | ts-api-utils: 2.0.1(typescript@5.8.2) 1863 | typescript: 5.8.2 1864 | transitivePeerDependencies: 1865 | - supports-color 1866 | 1867 | '@typescript-eslint/parser@8.26.1(eslint@9.22.0)(typescript@5.8.2)': 1868 | dependencies: 1869 | '@typescript-eslint/scope-manager': 8.26.1 1870 | '@typescript-eslint/types': 8.26.1 1871 | '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) 1872 | '@typescript-eslint/visitor-keys': 8.26.1 1873 | debug: 4.4.0 1874 | eslint: 9.22.0 1875 | typescript: 5.8.2 1876 | transitivePeerDependencies: 1877 | - supports-color 1878 | 1879 | '@typescript-eslint/scope-manager@8.26.1': 1880 | dependencies: 1881 | '@typescript-eslint/types': 8.26.1 1882 | '@typescript-eslint/visitor-keys': 8.26.1 1883 | 1884 | '@typescript-eslint/type-utils@8.26.1(eslint@9.22.0)(typescript@5.8.2)': 1885 | dependencies: 1886 | '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) 1887 | '@typescript-eslint/utils': 8.26.1(eslint@9.22.0)(typescript@5.8.2) 1888 | debug: 4.4.0 1889 | eslint: 9.22.0 1890 | ts-api-utils: 2.0.1(typescript@5.8.2) 1891 | typescript: 5.8.2 1892 | transitivePeerDependencies: 1893 | - supports-color 1894 | 1895 | '@typescript-eslint/types@8.26.1': {} 1896 | 1897 | '@typescript-eslint/typescript-estree@8.26.1(typescript@5.8.2)': 1898 | dependencies: 1899 | '@typescript-eslint/types': 8.26.1 1900 | '@typescript-eslint/visitor-keys': 8.26.1 1901 | debug: 4.4.0 1902 | fast-glob: 3.3.2 1903 | is-glob: 4.0.3 1904 | minimatch: 9.0.5 1905 | semver: 7.7.1 1906 | ts-api-utils: 2.0.1(typescript@5.8.2) 1907 | typescript: 5.8.2 1908 | transitivePeerDependencies: 1909 | - supports-color 1910 | 1911 | '@typescript-eslint/utils@8.26.1(eslint@9.22.0)(typescript@5.8.2)': 1912 | dependencies: 1913 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.22.0) 1914 | '@typescript-eslint/scope-manager': 8.26.1 1915 | '@typescript-eslint/types': 8.26.1 1916 | '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) 1917 | eslint: 9.22.0 1918 | typescript: 5.8.2 1919 | transitivePeerDependencies: 1920 | - supports-color 1921 | 1922 | '@typescript-eslint/visitor-keys@8.26.1': 1923 | dependencies: 1924 | '@typescript-eslint/types': 8.26.1 1925 | eslint-visitor-keys: 4.2.0 1926 | 1927 | abbrev@2.0.0: {} 1928 | 1929 | acorn-jsx@5.3.2(acorn@8.14.0): 1930 | dependencies: 1931 | acorn: 8.14.0 1932 | 1933 | acorn@8.14.0: {} 1934 | 1935 | agent-base@7.1.3: {} 1936 | 1937 | ajv@6.12.6: 1938 | dependencies: 1939 | fast-deep-equal: 3.1.3 1940 | fast-json-stable-stringify: 2.1.0 1941 | json-schema-traverse: 0.4.1 1942 | uri-js: 4.4.1 1943 | 1944 | ansi-escapes@7.0.0: 1945 | dependencies: 1946 | environment: 1.1.0 1947 | 1948 | ansi-regex@5.0.1: {} 1949 | 1950 | ansi-regex@6.0.1: {} 1951 | 1952 | ansi-styles@4.3.0: 1953 | dependencies: 1954 | color-convert: 2.0.1 1955 | 1956 | ansi-styles@6.2.1: {} 1957 | 1958 | argparse@2.0.1: {} 1959 | 1960 | asynckit@0.4.0: {} 1961 | 1962 | balanced-match@1.0.2: {} 1963 | 1964 | brace-expansion@1.1.11: 1965 | dependencies: 1966 | balanced-match: 1.0.2 1967 | concat-map: 0.0.1 1968 | 1969 | brace-expansion@2.0.1: 1970 | dependencies: 1971 | balanced-match: 1.0.2 1972 | 1973 | braces@3.0.3: 1974 | dependencies: 1975 | fill-range: 7.1.1 1976 | 1977 | cac@6.7.14: {} 1978 | 1979 | cacache@19.0.1: 1980 | dependencies: 1981 | '@npmcli/fs': 4.0.0 1982 | fs-minipass: 3.0.3 1983 | glob: 10.4.5 1984 | lru-cache: 10.4.3 1985 | minipass: 7.1.2 1986 | minipass-collect: 2.0.1 1987 | minipass-flush: 1.0.5 1988 | minipass-pipeline: 1.2.4 1989 | p-map: 7.0.3 1990 | ssri: 12.0.0 1991 | tar: 7.4.3 1992 | unique-filename: 4.0.0 1993 | 1994 | callsites@3.1.0: {} 1995 | 1996 | chalk@4.1.2: 1997 | dependencies: 1998 | ansi-styles: 4.3.0 1999 | supports-color: 7.2.0 2000 | 2001 | chalk@5.4.1: {} 2002 | 2003 | chownr@2.0.0: {} 2004 | 2005 | chownr@3.0.0: {} 2006 | 2007 | cli-cursor@5.0.0: 2008 | dependencies: 2009 | restore-cursor: 5.1.0 2010 | 2011 | cli-truncate@4.0.0: 2012 | dependencies: 2013 | slice-ansi: 5.0.0 2014 | string-width: 7.0.0 2015 | 2016 | color-convert@2.0.1: 2017 | dependencies: 2018 | color-name: 1.1.4 2019 | 2020 | color-name@1.1.4: {} 2021 | 2022 | colorette@2.0.20: {} 2023 | 2024 | combined-stream@1.0.8: 2025 | dependencies: 2026 | delayed-stream: 1.0.0 2027 | 2028 | commander@13.1.0: {} 2029 | 2030 | concat-map@0.0.1: {} 2031 | 2032 | cross-spawn@7.0.6: 2033 | dependencies: 2034 | path-key: 3.1.1 2035 | shebang-command: 2.0.0 2036 | which: 2.0.2 2037 | 2038 | data-uri-to-buffer@4.0.1: {} 2039 | 2040 | debug@4.4.0: 2041 | dependencies: 2042 | ms: 2.1.3 2043 | 2044 | deep-is@0.1.4: {} 2045 | 2046 | delayed-stream@1.0.0: {} 2047 | 2048 | eastasianwidth@0.2.0: {} 2049 | 2050 | emoji-regex@10.3.0: {} 2051 | 2052 | emoji-regex@8.0.0: {} 2053 | 2054 | emoji-regex@9.2.2: {} 2055 | 2056 | encoding@0.1.13: 2057 | dependencies: 2058 | iconv-lite: 0.6.3 2059 | optional: true 2060 | 2061 | enhanced-resolve@5.17.1: 2062 | dependencies: 2063 | graceful-fs: 4.2.11 2064 | tapable: 2.2.1 2065 | 2066 | env-paths@2.2.1: {} 2067 | 2068 | environment@1.1.0: {} 2069 | 2070 | err-code@2.0.3: {} 2071 | 2072 | esbuild@0.25.1: 2073 | optionalDependencies: 2074 | '@esbuild/aix-ppc64': 0.25.1 2075 | '@esbuild/android-arm': 0.25.1 2076 | '@esbuild/android-arm64': 0.25.1 2077 | '@esbuild/android-x64': 0.25.1 2078 | '@esbuild/darwin-arm64': 0.25.1 2079 | '@esbuild/darwin-x64': 0.25.1 2080 | '@esbuild/freebsd-arm64': 0.25.1 2081 | '@esbuild/freebsd-x64': 0.25.1 2082 | '@esbuild/linux-arm': 0.25.1 2083 | '@esbuild/linux-arm64': 0.25.1 2084 | '@esbuild/linux-ia32': 0.25.1 2085 | '@esbuild/linux-loong64': 0.25.1 2086 | '@esbuild/linux-mips64el': 0.25.1 2087 | '@esbuild/linux-ppc64': 0.25.1 2088 | '@esbuild/linux-riscv64': 0.25.1 2089 | '@esbuild/linux-s390x': 0.25.1 2090 | '@esbuild/linux-x64': 0.25.1 2091 | '@esbuild/netbsd-arm64': 0.25.1 2092 | '@esbuild/netbsd-x64': 0.25.1 2093 | '@esbuild/openbsd-arm64': 0.25.1 2094 | '@esbuild/openbsd-x64': 0.25.1 2095 | '@esbuild/sunos-x64': 0.25.1 2096 | '@esbuild/win32-arm64': 0.25.1 2097 | '@esbuild/win32-ia32': 0.25.1 2098 | '@esbuild/win32-x64': 0.25.1 2099 | 2100 | escape-string-regexp@4.0.0: {} 2101 | 2102 | eslint-compat-utils@0.5.1(eslint@9.22.0): 2103 | dependencies: 2104 | eslint: 9.22.0 2105 | semver: 7.7.1 2106 | 2107 | eslint-plugin-es-x@7.8.0(eslint@9.22.0): 2108 | dependencies: 2109 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.22.0) 2110 | '@eslint-community/regexpp': 4.12.1 2111 | eslint: 9.22.0 2112 | eslint-compat-utils: 0.5.1(eslint@9.22.0) 2113 | 2114 | eslint-plugin-n@17.16.2(eslint@9.22.0): 2115 | dependencies: 2116 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.22.0) 2117 | enhanced-resolve: 5.17.1 2118 | eslint: 9.22.0 2119 | eslint-plugin-es-x: 7.8.0(eslint@9.22.0) 2120 | get-tsconfig: 4.8.1 2121 | globals: 15.11.0 2122 | ignore: 5.3.2 2123 | minimatch: 9.0.5 2124 | semver: 7.7.1 2125 | 2126 | eslint-scope@8.3.0: 2127 | dependencies: 2128 | esrecurse: 4.3.0 2129 | estraverse: 5.3.0 2130 | 2131 | eslint-visitor-keys@3.4.3: {} 2132 | 2133 | eslint-visitor-keys@4.2.0: {} 2134 | 2135 | eslint@9.22.0: 2136 | dependencies: 2137 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.22.0) 2138 | '@eslint-community/regexpp': 4.12.1 2139 | '@eslint/config-array': 0.19.2 2140 | '@eslint/config-helpers': 0.1.0 2141 | '@eslint/core': 0.12.0 2142 | '@eslint/eslintrc': 3.3.0 2143 | '@eslint/js': 9.22.0 2144 | '@eslint/plugin-kit': 0.2.7 2145 | '@humanfs/node': 0.16.6 2146 | '@humanwhocodes/module-importer': 1.0.1 2147 | '@humanwhocodes/retry': 0.4.2 2148 | '@types/estree': 1.0.6 2149 | '@types/json-schema': 7.0.15 2150 | ajv: 6.12.6 2151 | chalk: 4.1.2 2152 | cross-spawn: 7.0.6 2153 | debug: 4.4.0 2154 | escape-string-regexp: 4.0.0 2155 | eslint-scope: 8.3.0 2156 | eslint-visitor-keys: 4.2.0 2157 | espree: 10.3.0 2158 | esquery: 1.5.0 2159 | esutils: 2.0.3 2160 | fast-deep-equal: 3.1.3 2161 | file-entry-cache: 8.0.0 2162 | find-up: 5.0.0 2163 | glob-parent: 6.0.2 2164 | ignore: 5.3.2 2165 | imurmurhash: 0.1.4 2166 | is-glob: 4.0.3 2167 | json-stable-stringify-without-jsonify: 1.0.1 2168 | lodash.merge: 4.6.2 2169 | minimatch: 3.1.2 2170 | natural-compare: 1.4.0 2171 | optionator: 0.9.3 2172 | transitivePeerDependencies: 2173 | - supports-color 2174 | 2175 | espree@10.3.0: 2176 | dependencies: 2177 | acorn: 8.14.0 2178 | acorn-jsx: 5.3.2(acorn@8.14.0) 2179 | eslint-visitor-keys: 4.2.0 2180 | 2181 | esquery@1.5.0: 2182 | dependencies: 2183 | estraverse: 5.3.0 2184 | 2185 | esrecurse@4.3.0: 2186 | dependencies: 2187 | estraverse: 5.3.0 2188 | 2189 | estraverse@5.3.0: {} 2190 | 2191 | esutils@2.0.3: {} 2192 | 2193 | eventemitter3@5.0.1: {} 2194 | 2195 | execa@8.0.1: 2196 | dependencies: 2197 | cross-spawn: 7.0.6 2198 | get-stream: 8.0.1 2199 | human-signals: 5.0.0 2200 | is-stream: 3.0.0 2201 | merge-stream: 2.0.0 2202 | npm-run-path: 5.3.0 2203 | onetime: 6.0.0 2204 | signal-exit: 4.1.0 2205 | strip-final-newline: 3.0.0 2206 | 2207 | execa@9.5.2: 2208 | dependencies: 2209 | '@sindresorhus/merge-streams': 4.0.0 2210 | cross-spawn: 7.0.6 2211 | figures: 6.1.0 2212 | get-stream: 9.0.1 2213 | human-signals: 8.0.0 2214 | is-plain-obj: 4.1.0 2215 | is-stream: 4.0.1 2216 | npm-run-path: 6.0.0 2217 | pretty-ms: 9.0.0 2218 | signal-exit: 4.1.0 2219 | strip-final-newline: 4.0.0 2220 | yoctocolors: 2.0.2 2221 | 2222 | exponential-backoff@3.1.1: {} 2223 | 2224 | fast-deep-equal@3.1.3: {} 2225 | 2226 | fast-glob@3.3.2: 2227 | dependencies: 2228 | '@nodelib/fs.stat': 2.0.5 2229 | '@nodelib/fs.walk': 1.2.8 2230 | glob-parent: 5.1.2 2231 | merge2: 1.4.1 2232 | micromatch: 4.0.8 2233 | 2234 | fast-json-stable-stringify@2.1.0: {} 2235 | 2236 | fast-levenshtein@2.0.6: {} 2237 | 2238 | fastq@1.15.0: 2239 | dependencies: 2240 | reusify: 1.0.4 2241 | 2242 | fetch-blob@3.2.0: 2243 | dependencies: 2244 | node-domexception: 1.0.0 2245 | web-streams-polyfill: 3.2.1 2246 | 2247 | figures@6.1.0: 2248 | dependencies: 2249 | is-unicode-supported: 2.0.0 2250 | 2251 | file-entry-cache@8.0.0: 2252 | dependencies: 2253 | flat-cache: 4.0.1 2254 | 2255 | fill-range@7.1.1: 2256 | dependencies: 2257 | to-regex-range: 5.0.1 2258 | 2259 | find-up@5.0.0: 2260 | dependencies: 2261 | locate-path: 6.0.0 2262 | path-exists: 4.0.0 2263 | 2264 | flat-cache@4.0.1: 2265 | dependencies: 2266 | flatted: 3.3.1 2267 | keyv: 4.5.4 2268 | 2269 | flatted@3.3.1: {} 2270 | 2271 | foreground-child@3.3.0: 2272 | dependencies: 2273 | cross-spawn: 7.0.6 2274 | signal-exit: 4.1.0 2275 | 2276 | form-data@4.0.1: 2277 | dependencies: 2278 | asynckit: 0.4.0 2279 | combined-stream: 1.0.8 2280 | mime-types: 2.1.35 2281 | 2282 | formdata-polyfill@4.0.10: 2283 | dependencies: 2284 | fetch-blob: 3.2.0 2285 | 2286 | fs-minipass@2.1.0: 2287 | dependencies: 2288 | minipass: 3.3.6 2289 | 2290 | fs-minipass@3.0.3: 2291 | dependencies: 2292 | minipass: 7.1.2 2293 | 2294 | fsevents@2.3.3: 2295 | optional: true 2296 | 2297 | get-east-asian-width@1.2.0: {} 2298 | 2299 | get-stream@8.0.1: {} 2300 | 2301 | get-stream@9.0.1: 2302 | dependencies: 2303 | '@sec-ant/readable-stream': 0.4.1 2304 | is-stream: 4.0.1 2305 | 2306 | get-tsconfig@4.8.1: 2307 | dependencies: 2308 | resolve-pkg-maps: 1.0.0 2309 | 2310 | glob-parent@5.1.2: 2311 | dependencies: 2312 | is-glob: 4.0.3 2313 | 2314 | glob-parent@6.0.2: 2315 | dependencies: 2316 | is-glob: 4.0.3 2317 | 2318 | glob@10.4.5: 2319 | dependencies: 2320 | foreground-child: 3.3.0 2321 | jackspeak: 3.4.3 2322 | minimatch: 9.0.5 2323 | minipass: 7.1.2 2324 | package-json-from-dist: 1.0.1 2325 | path-scurry: 1.11.1 2326 | 2327 | globals@14.0.0: {} 2328 | 2329 | globals@15.11.0: {} 2330 | 2331 | graceful-fs@4.2.11: {} 2332 | 2333 | graphemer@1.4.0: {} 2334 | 2335 | has-flag@4.0.0: {} 2336 | 2337 | hosted-git-info@8.0.2: 2338 | dependencies: 2339 | lru-cache: 10.4.3 2340 | 2341 | http-cache-semantics@4.1.1: {} 2342 | 2343 | http-proxy-agent@7.0.2: 2344 | dependencies: 2345 | agent-base: 7.1.3 2346 | debug: 4.4.0 2347 | transitivePeerDependencies: 2348 | - supports-color 2349 | 2350 | https-proxy-agent@7.0.6: 2351 | dependencies: 2352 | agent-base: 7.1.3 2353 | debug: 4.4.0 2354 | transitivePeerDependencies: 2355 | - supports-color 2356 | 2357 | human-signals@5.0.0: {} 2358 | 2359 | human-signals@8.0.0: {} 2360 | 2361 | iconv-lite@0.6.3: 2362 | dependencies: 2363 | safer-buffer: 2.1.2 2364 | optional: true 2365 | 2366 | ignore-walk@7.0.0: 2367 | dependencies: 2368 | minimatch: 9.0.5 2369 | 2370 | ignore@5.3.2: {} 2371 | 2372 | import-fresh@3.3.0: 2373 | dependencies: 2374 | parent-module: 1.0.1 2375 | resolve-from: 4.0.0 2376 | 2377 | imurmurhash@0.1.4: {} 2378 | 2379 | ini@5.0.0: {} 2380 | 2381 | ip-address@9.0.5: 2382 | dependencies: 2383 | jsbn: 1.1.0 2384 | sprintf-js: 1.1.3 2385 | 2386 | is-extglob@2.1.1: {} 2387 | 2388 | is-fullwidth-code-point@3.0.0: {} 2389 | 2390 | is-fullwidth-code-point@4.0.0: {} 2391 | 2392 | is-fullwidth-code-point@5.0.0: 2393 | dependencies: 2394 | get-east-asian-width: 1.2.0 2395 | 2396 | is-glob@4.0.3: 2397 | dependencies: 2398 | is-extglob: 2.1.1 2399 | 2400 | is-number@7.0.0: {} 2401 | 2402 | is-plain-obj@4.1.0: {} 2403 | 2404 | is-stream@3.0.0: {} 2405 | 2406 | is-stream@4.0.1: {} 2407 | 2408 | is-unicode-supported@2.0.0: {} 2409 | 2410 | isexe@2.0.0: {} 2411 | 2412 | isexe@3.1.1: {} 2413 | 2414 | jackspeak@3.4.3: 2415 | dependencies: 2416 | '@isaacs/cliui': 8.0.2 2417 | optionalDependencies: 2418 | '@pkgjs/parseargs': 0.11.0 2419 | 2420 | js-yaml@4.1.0: 2421 | dependencies: 2422 | argparse: 2.0.1 2423 | 2424 | jsbn@1.1.0: {} 2425 | 2426 | json-buffer@3.0.1: {} 2427 | 2428 | json-parse-even-better-errors@4.0.0: {} 2429 | 2430 | json-schema-traverse@0.4.1: {} 2431 | 2432 | json-stable-stringify-without-jsonify@1.0.1: {} 2433 | 2434 | jsonparse@1.3.1: {} 2435 | 2436 | keyv@4.5.4: 2437 | dependencies: 2438 | json-buffer: 3.0.1 2439 | 2440 | levn@0.4.1: 2441 | dependencies: 2442 | prelude-ls: 1.2.1 2443 | type-check: 0.4.0 2444 | 2445 | lilconfig@3.1.3: {} 2446 | 2447 | lint-staged@15.5.0: 2448 | dependencies: 2449 | chalk: 5.4.1 2450 | commander: 13.1.0 2451 | debug: 4.4.0 2452 | execa: 8.0.1 2453 | lilconfig: 3.1.3 2454 | listr2: 8.2.5 2455 | micromatch: 4.0.8 2456 | pidtree: 0.6.0 2457 | string-argv: 0.3.2 2458 | yaml: 2.7.0 2459 | transitivePeerDependencies: 2460 | - supports-color 2461 | 2462 | listr2@8.2.5: 2463 | dependencies: 2464 | cli-truncate: 4.0.0 2465 | colorette: 2.0.20 2466 | eventemitter3: 5.0.1 2467 | log-update: 6.1.0 2468 | rfdc: 1.4.1 2469 | wrap-ansi: 9.0.0 2470 | 2471 | locate-path@6.0.0: 2472 | dependencies: 2473 | p-locate: 5.0.0 2474 | 2475 | lodash.merge@4.6.2: {} 2476 | 2477 | log-update@6.1.0: 2478 | dependencies: 2479 | ansi-escapes: 7.0.0 2480 | cli-cursor: 5.0.0 2481 | slice-ansi: 7.1.0 2482 | strip-ansi: 7.1.0 2483 | wrap-ansi: 9.0.0 2484 | 2485 | lru-cache@10.4.3: {} 2486 | 2487 | make-fetch-happen@14.0.3: 2488 | dependencies: 2489 | '@npmcli/agent': 3.0.0 2490 | cacache: 19.0.1 2491 | http-cache-semantics: 4.1.1 2492 | minipass: 7.1.2 2493 | minipass-fetch: 4.0.0 2494 | minipass-flush: 1.0.5 2495 | minipass-pipeline: 1.2.4 2496 | negotiator: 1.0.0 2497 | proc-log: 5.0.0 2498 | promise-retry: 2.0.1 2499 | ssri: 12.0.0 2500 | transitivePeerDependencies: 2501 | - supports-color 2502 | 2503 | merge-stream@2.0.0: {} 2504 | 2505 | merge2@1.4.1: {} 2506 | 2507 | micromatch@4.0.8: 2508 | dependencies: 2509 | braces: 3.0.3 2510 | picomatch: 2.3.1 2511 | 2512 | mime-db@1.52.0: {} 2513 | 2514 | mime-types@2.1.35: 2515 | dependencies: 2516 | mime-db: 1.52.0 2517 | 2518 | mimic-fn@4.0.0: {} 2519 | 2520 | mimic-function@5.0.1: {} 2521 | 2522 | minimatch@3.1.2: 2523 | dependencies: 2524 | brace-expansion: 1.1.11 2525 | 2526 | minimatch@9.0.5: 2527 | dependencies: 2528 | brace-expansion: 2.0.1 2529 | 2530 | minipass-collect@2.0.1: 2531 | dependencies: 2532 | minipass: 7.1.2 2533 | 2534 | minipass-fetch@4.0.0: 2535 | dependencies: 2536 | minipass: 7.1.2 2537 | minipass-sized: 1.0.3 2538 | minizlib: 3.0.1 2539 | optionalDependencies: 2540 | encoding: 0.1.13 2541 | 2542 | minipass-flush@1.0.5: 2543 | dependencies: 2544 | minipass: 3.3.6 2545 | 2546 | minipass-pipeline@1.2.4: 2547 | dependencies: 2548 | minipass: 3.3.6 2549 | 2550 | minipass-sized@1.0.3: 2551 | dependencies: 2552 | minipass: 3.3.6 2553 | 2554 | minipass@3.3.6: 2555 | dependencies: 2556 | yallist: 4.0.0 2557 | 2558 | minipass@5.0.0: {} 2559 | 2560 | minipass@7.1.2: {} 2561 | 2562 | minizlib@2.1.2: 2563 | dependencies: 2564 | minipass: 3.3.6 2565 | yallist: 4.0.0 2566 | 2567 | minizlib@3.0.1: 2568 | dependencies: 2569 | minipass: 7.1.2 2570 | rimraf: 5.0.10 2571 | 2572 | mkdirp@1.0.4: {} 2573 | 2574 | mkdirp@3.0.1: {} 2575 | 2576 | ms@2.1.3: {} 2577 | 2578 | natural-compare@1.4.0: {} 2579 | 2580 | negotiator@1.0.0: {} 2581 | 2582 | node-domexception@1.0.0: {} 2583 | 2584 | node-fetch@3.3.2: 2585 | dependencies: 2586 | data-uri-to-buffer: 4.0.1 2587 | fetch-blob: 3.2.0 2588 | formdata-polyfill: 4.0.10 2589 | 2590 | node-gyp@11.0.0: 2591 | dependencies: 2592 | env-paths: 2.2.1 2593 | exponential-backoff: 3.1.1 2594 | glob: 10.4.5 2595 | graceful-fs: 4.2.11 2596 | make-fetch-happen: 14.0.3 2597 | nopt: 8.0.0 2598 | proc-log: 5.0.0 2599 | semver: 7.7.1 2600 | tar: 7.4.3 2601 | which: 5.0.0 2602 | transitivePeerDependencies: 2603 | - supports-color 2604 | 2605 | nopt@8.0.0: 2606 | dependencies: 2607 | abbrev: 2.0.0 2608 | 2609 | normalize-package-data@7.0.0: 2610 | dependencies: 2611 | hosted-git-info: 8.0.2 2612 | semver: 7.7.1 2613 | validate-npm-package-license: 3.0.4 2614 | 2615 | npm-bundled@4.0.0: 2616 | dependencies: 2617 | npm-normalize-package-bin: 4.0.0 2618 | 2619 | npm-install-checks@7.1.1: 2620 | dependencies: 2621 | semver: 7.7.1 2622 | 2623 | npm-normalize-package-bin@4.0.0: {} 2624 | 2625 | npm-package-arg@12.0.1: 2626 | dependencies: 2627 | hosted-git-info: 8.0.2 2628 | proc-log: 5.0.0 2629 | semver: 7.7.1 2630 | validate-npm-package-name: 6.0.0 2631 | 2632 | npm-packlist@10.0.0: 2633 | dependencies: 2634 | ignore-walk: 7.0.0 2635 | 2636 | npm-pick-manifest@10.0.0: 2637 | dependencies: 2638 | npm-install-checks: 7.1.1 2639 | npm-normalize-package-bin: 4.0.0 2640 | npm-package-arg: 12.0.1 2641 | semver: 7.7.1 2642 | 2643 | npm-registry-fetch@18.0.2: 2644 | dependencies: 2645 | '@npmcli/redact': 3.0.0 2646 | jsonparse: 1.3.1 2647 | make-fetch-happen: 14.0.3 2648 | minipass: 7.1.2 2649 | minipass-fetch: 4.0.0 2650 | minizlib: 3.0.1 2651 | npm-package-arg: 12.0.1 2652 | proc-log: 5.0.0 2653 | transitivePeerDependencies: 2654 | - supports-color 2655 | 2656 | npm-run-path@5.3.0: 2657 | dependencies: 2658 | path-key: 4.0.0 2659 | 2660 | npm-run-path@6.0.0: 2661 | dependencies: 2662 | path-key: 4.0.0 2663 | unicorn-magic: 0.3.0 2664 | 2665 | onetime@6.0.0: 2666 | dependencies: 2667 | mimic-fn: 4.0.0 2668 | 2669 | onetime@7.0.0: 2670 | dependencies: 2671 | mimic-function: 5.0.1 2672 | 2673 | optionator@0.9.3: 2674 | dependencies: 2675 | '@aashutoshrathi/word-wrap': 1.2.6 2676 | deep-is: 0.1.4 2677 | fast-levenshtein: 2.0.6 2678 | levn: 0.4.1 2679 | prelude-ls: 1.2.1 2680 | type-check: 0.4.0 2681 | 2682 | p-limit@3.1.0: 2683 | dependencies: 2684 | yocto-queue: 0.1.0 2685 | 2686 | p-locate@5.0.0: 2687 | dependencies: 2688 | p-limit: 3.1.0 2689 | 2690 | p-map@7.0.3: {} 2691 | 2692 | package-json-from-dist@1.0.1: {} 2693 | 2694 | pacote@21.0.0: 2695 | dependencies: 2696 | '@npmcli/git': 6.0.1 2697 | '@npmcli/installed-package-contents': 3.0.0 2698 | '@npmcli/package-json': 6.1.0 2699 | '@npmcli/promise-spawn': 8.0.2 2700 | '@npmcli/run-script': 9.0.2 2701 | cacache: 19.0.1 2702 | fs-minipass: 3.0.3 2703 | minipass: 7.1.2 2704 | npm-package-arg: 12.0.1 2705 | npm-packlist: 10.0.0 2706 | npm-pick-manifest: 10.0.0 2707 | npm-registry-fetch: 18.0.2 2708 | proc-log: 5.0.0 2709 | promise-retry: 2.0.1 2710 | sigstore: 3.0.0 2711 | ssri: 12.0.0 2712 | tar: 6.2.1 2713 | transitivePeerDependencies: 2714 | - bluebird 2715 | - supports-color 2716 | 2717 | parent-module@1.0.1: 2718 | dependencies: 2719 | callsites: 3.1.0 2720 | 2721 | parse-ms@4.0.0: {} 2722 | 2723 | path-exists@4.0.0: {} 2724 | 2725 | path-key@3.1.1: {} 2726 | 2727 | path-key@4.0.0: {} 2728 | 2729 | path-scurry@1.11.1: 2730 | dependencies: 2731 | lru-cache: 10.4.3 2732 | minipass: 7.1.2 2733 | 2734 | picomatch@2.3.1: {} 2735 | 2736 | pidtree@0.6.0: {} 2737 | 2738 | prelude-ls@1.2.1: {} 2739 | 2740 | prettier@3.5.3: {} 2741 | 2742 | pretty-ms@9.0.0: 2743 | dependencies: 2744 | parse-ms: 4.0.0 2745 | 2746 | proc-log@5.0.0: {} 2747 | 2748 | promise-inflight@1.0.1: {} 2749 | 2750 | promise-retry@2.0.1: 2751 | dependencies: 2752 | err-code: 2.0.3 2753 | retry: 0.12.0 2754 | 2755 | punycode@2.3.0: {} 2756 | 2757 | queue-microtask@1.2.3: {} 2758 | 2759 | resolve-from@4.0.0: {} 2760 | 2761 | resolve-pkg-maps@1.0.0: {} 2762 | 2763 | restore-cursor@5.1.0: 2764 | dependencies: 2765 | onetime: 7.0.0 2766 | signal-exit: 4.1.0 2767 | 2768 | retry@0.12.0: {} 2769 | 2770 | reusify@1.0.4: {} 2771 | 2772 | rfdc@1.4.1: {} 2773 | 2774 | rimraf@5.0.10: 2775 | dependencies: 2776 | glob: 10.4.5 2777 | 2778 | run-parallel@1.2.0: 2779 | dependencies: 2780 | queue-microtask: 1.2.3 2781 | 2782 | safer-buffer@2.1.2: 2783 | optional: true 2784 | 2785 | semver@7.7.1: {} 2786 | 2787 | shebang-command@2.0.0: 2788 | dependencies: 2789 | shebang-regex: 3.0.0 2790 | 2791 | shebang-regex@3.0.0: {} 2792 | 2793 | signal-exit@4.1.0: {} 2794 | 2795 | sigstore@3.0.0: 2796 | dependencies: 2797 | '@sigstore/bundle': 3.0.0 2798 | '@sigstore/core': 2.0.0 2799 | '@sigstore/protobuf-specs': 0.3.2 2800 | '@sigstore/sign': 3.0.0 2801 | '@sigstore/tuf': 3.0.0 2802 | '@sigstore/verify': 2.0.0 2803 | transitivePeerDependencies: 2804 | - supports-color 2805 | 2806 | simple-git-hooks@2.11.1: {} 2807 | 2808 | slice-ansi@5.0.0: 2809 | dependencies: 2810 | ansi-styles: 6.2.1 2811 | is-fullwidth-code-point: 4.0.0 2812 | 2813 | slice-ansi@7.1.0: 2814 | dependencies: 2815 | ansi-styles: 6.2.1 2816 | is-fullwidth-code-point: 5.0.0 2817 | 2818 | smart-buffer@4.2.0: {} 2819 | 2820 | socks-proxy-agent@8.0.5: 2821 | dependencies: 2822 | agent-base: 7.1.3 2823 | debug: 4.4.0 2824 | socks: 2.8.3 2825 | transitivePeerDependencies: 2826 | - supports-color 2827 | 2828 | socks@2.8.3: 2829 | dependencies: 2830 | ip-address: 9.0.5 2831 | smart-buffer: 4.2.0 2832 | 2833 | spdx-correct@3.2.0: 2834 | dependencies: 2835 | spdx-expression-parse: 3.0.1 2836 | spdx-license-ids: 3.0.20 2837 | 2838 | spdx-exceptions@2.5.0: {} 2839 | 2840 | spdx-expression-parse@3.0.1: 2841 | dependencies: 2842 | spdx-exceptions: 2.5.0 2843 | spdx-license-ids: 3.0.20 2844 | 2845 | spdx-license-ids@3.0.20: {} 2846 | 2847 | sprintf-js@1.1.3: {} 2848 | 2849 | ssri@12.0.0: 2850 | dependencies: 2851 | minipass: 7.1.2 2852 | 2853 | string-argv@0.3.2: {} 2854 | 2855 | string-width@4.2.3: 2856 | dependencies: 2857 | emoji-regex: 8.0.0 2858 | is-fullwidth-code-point: 3.0.0 2859 | strip-ansi: 6.0.1 2860 | 2861 | string-width@5.1.2: 2862 | dependencies: 2863 | eastasianwidth: 0.2.0 2864 | emoji-regex: 9.2.2 2865 | strip-ansi: 7.1.0 2866 | 2867 | string-width@7.0.0: 2868 | dependencies: 2869 | emoji-regex: 10.3.0 2870 | get-east-asian-width: 1.2.0 2871 | strip-ansi: 7.1.0 2872 | 2873 | strip-ansi@6.0.1: 2874 | dependencies: 2875 | ansi-regex: 5.0.1 2876 | 2877 | strip-ansi@7.1.0: 2878 | dependencies: 2879 | ansi-regex: 6.0.1 2880 | 2881 | strip-final-newline@3.0.0: {} 2882 | 2883 | strip-final-newline@4.0.0: {} 2884 | 2885 | strip-json-comments@3.1.1: {} 2886 | 2887 | supports-color@7.2.0: 2888 | dependencies: 2889 | has-flag: 4.0.0 2890 | 2891 | tapable@2.2.1: {} 2892 | 2893 | tar@6.2.1: 2894 | dependencies: 2895 | chownr: 2.0.0 2896 | fs-minipass: 2.1.0 2897 | minipass: 5.0.0 2898 | minizlib: 2.1.2 2899 | mkdirp: 1.0.4 2900 | yallist: 4.0.0 2901 | 2902 | tar@7.4.3: 2903 | dependencies: 2904 | '@isaacs/fs-minipass': 4.0.1 2905 | chownr: 3.0.0 2906 | minipass: 7.1.2 2907 | minizlib: 3.0.1 2908 | mkdirp: 3.0.1 2909 | yallist: 5.0.0 2910 | 2911 | to-regex-range@5.0.1: 2912 | dependencies: 2913 | is-number: 7.0.0 2914 | 2915 | ts-api-utils@2.0.1(typescript@5.8.2): 2916 | dependencies: 2917 | typescript: 5.8.2 2918 | 2919 | tsx@4.19.3: 2920 | dependencies: 2921 | esbuild: 0.25.1 2922 | get-tsconfig: 4.8.1 2923 | optionalDependencies: 2924 | fsevents: 2.3.3 2925 | 2926 | tuf-js@3.0.1: 2927 | dependencies: 2928 | '@tufjs/models': 3.0.1 2929 | debug: 4.4.0 2930 | make-fetch-happen: 14.0.3 2931 | transitivePeerDependencies: 2932 | - supports-color 2933 | 2934 | tunnel@0.0.6: {} 2935 | 2936 | type-check@0.4.0: 2937 | dependencies: 2938 | prelude-ls: 1.2.1 2939 | 2940 | typescript-eslint@8.26.1(eslint@9.22.0)(typescript@5.8.2): 2941 | dependencies: 2942 | '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2) 2943 | '@typescript-eslint/parser': 8.26.1(eslint@9.22.0)(typescript@5.8.2) 2944 | '@typescript-eslint/utils': 8.26.1(eslint@9.22.0)(typescript@5.8.2) 2945 | eslint: 9.22.0 2946 | typescript: 5.8.2 2947 | transitivePeerDependencies: 2948 | - supports-color 2949 | 2950 | typescript@5.8.2: {} 2951 | 2952 | undici-types@6.20.0: {} 2953 | 2954 | unicorn-magic@0.3.0: {} 2955 | 2956 | unique-filename@4.0.0: 2957 | dependencies: 2958 | unique-slug: 5.0.0 2959 | 2960 | unique-slug@5.0.0: 2961 | dependencies: 2962 | imurmurhash: 0.1.4 2963 | 2964 | uri-js@4.4.1: 2965 | dependencies: 2966 | punycode: 2.3.0 2967 | 2968 | validate-npm-package-license@3.0.4: 2969 | dependencies: 2970 | spdx-correct: 3.2.0 2971 | spdx-expression-parse: 3.0.1 2972 | 2973 | validate-npm-package-name@6.0.0: {} 2974 | 2975 | web-streams-polyfill@3.2.1: {} 2976 | 2977 | which@2.0.2: 2978 | dependencies: 2979 | isexe: 2.0.0 2980 | 2981 | which@5.0.0: 2982 | dependencies: 2983 | isexe: 3.1.1 2984 | 2985 | wrap-ansi@7.0.0: 2986 | dependencies: 2987 | ansi-styles: 4.3.0 2988 | string-width: 4.2.3 2989 | strip-ansi: 6.0.1 2990 | 2991 | wrap-ansi@8.1.0: 2992 | dependencies: 2993 | ansi-styles: 6.2.1 2994 | string-width: 5.1.2 2995 | strip-ansi: 7.1.0 2996 | 2997 | wrap-ansi@9.0.0: 2998 | dependencies: 2999 | ansi-styles: 6.2.1 3000 | string-width: 7.0.0 3001 | strip-ansi: 7.1.0 3002 | 3003 | yallist@4.0.0: {} 3004 | 3005 | yallist@5.0.0: {} 3006 | 3007 | yaml@2.7.0: {} 3008 | 3009 | yocto-queue@0.1.0: {} 3010 | 3011 | yoctocolors@2.0.2: {} 3012 | -------------------------------------------------------------------------------- /tests/_selftest.ts: -------------------------------------------------------------------------------- 1 | import path from 'path' 2 | import fs from 'fs' 3 | import { runInRepo } from '../utils.ts' 4 | import type { RunOptions } from '../types.d.ts' 5 | 6 | export async function test(options: RunOptions) { 7 | await runInRepo({ 8 | ...options, 9 | repo: 'vitejs/vite-ecosystem-ci', 10 | build: async () => { 11 | const dir = path.resolve(options.workspace, 'vite-ecosystem-ci') 12 | const pkgFile = path.join(dir, 'package.json') 13 | const pkg = JSON.parse(await fs.promises.readFile(pkgFile, 'utf-8')) 14 | if (pkg.name !== 'vite-ecosystem-ci') { 15 | throw new Error( 16 | `invalid checkout, expected package.json with "name":"vite-ecosystem-ci" in ${dir}`, 17 | ) 18 | } 19 | pkg.scripts.selftestscript = 20 | "[ -d ../../vite/packages/vite/dist ] || (echo 'vite build failed' && exit 1)" 21 | await fs.promises.writeFile( 22 | pkgFile, 23 | JSON.stringify(pkg, null, 2), 24 | 'utf-8', 25 | ) 26 | }, 27 | test: 'pnpm run selftestscript', 28 | verify: false, 29 | }) 30 | } 31 | -------------------------------------------------------------------------------- /tests/analogjs.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'analogjs/analog', 8 | branch: 'beta', 9 | build: 'build:vite-ci', 10 | test: 'test:vite-ci', 11 | }) 12 | } 13 | -------------------------------------------------------------------------------- /tests/astro.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'withastro/astro', 8 | branch: 'main', 9 | build: 'build:ci', 10 | test: 'test:vite-ci', 11 | }) 12 | } 13 | -------------------------------------------------------------------------------- /tests/histoire.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'histoire-dev/histoire', 8 | branch: 'main', 9 | build: 'build', 10 | test: ['test', 'test:examples'], 11 | }) 12 | } 13 | -------------------------------------------------------------------------------- /tests/hydrogen.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'Shopify/hydrogen', 8 | build: 'build', 9 | test: 'test:vite-ci', 10 | }) 11 | } 12 | -------------------------------------------------------------------------------- /tests/iles.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo, $ } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'ElMassimo/iles', 8 | overrides: { 9 | '@vitejs/plugin-vue': true, 10 | }, 11 | beforeInstall: async () => $`git lfs install && git lfs pull`, 12 | build: 'build:all', 13 | test: 'test', 14 | }) 15 | } 16 | -------------------------------------------------------------------------------- /tests/ladle.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'tajo/ladle', 8 | branch: 'main', 9 | build: 'build', 10 | beforeTest: 'pnpm playwright install chromium', 11 | test: 'test', 12 | }) 13 | } 14 | -------------------------------------------------------------------------------- /tests/laravel.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | //see https://github.com/laravel/vite-plugin/blob/73466441b0c9eb0c1a5ce0a0e937bd83eaef4b70/.github/workflows/tests.yml#L10 6 | process.env.LARAVEL_BYPASS_ENV_CHECK = '1' 7 | await runInRepo({ 8 | ...options, 9 | repo: 'laravel/vite-plugin', 10 | branch: '1.x', 11 | build: 'build', 12 | test: 'test', 13 | }) 14 | } 15 | -------------------------------------------------------------------------------- /tests/marko.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'marko-js/vite', 8 | dir: 'marko', // default is last segment of repo, which would be vite and confusing 9 | build: 'build', 10 | beforeTest: 'pnpm playwright install chromium', 11 | test: 'test', 12 | overrides: { 13 | esbuild: true, 14 | }, 15 | }) 16 | } 17 | -------------------------------------------------------------------------------- /tests/nuxt.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'nuxt/nuxt', 8 | overrides: { 9 | '@vitejs/plugin-vue': true, 10 | }, 11 | build: ['dev:prepare', 'build'], 12 | beforeTest: 'pnpm playwright-core install', 13 | test: ['test:fixtures', 'test:fixtures:dev', 'test:types'], 14 | }) 15 | } 16 | -------------------------------------------------------------------------------- /tests/nx.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'nrwl/nx', 8 | branch: 'master', 9 | build: { script: 'build-project', args: ['vite', '--skip-nx-cache'] }, 10 | test: [ 11 | { script: 'test', args: ['vite', '--skip-nx-cache'] }, 12 | { script: 'e2e', args: ['e2e-vite', '--skip-nx-cache'] }, 13 | ], 14 | overrides: { 15 | rollup: false, 16 | }, 17 | }) 18 | } 19 | -------------------------------------------------------------------------------- /tests/one.ts: -------------------------------------------------------------------------------- 1 | import type { RunOptions } from '../types.d.ts' 2 | import { runInRepo } from '../utils.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'onejs/one', 8 | branch: 'main', 9 | build: 'build', 10 | beforeTest: 'yarn playwright install chromium', 11 | test: 'test:vite-ecosystem-ci', 12 | }) 13 | } 14 | -------------------------------------------------------------------------------- /tests/previewjs.ts: -------------------------------------------------------------------------------- 1 | import type { RunOptions } from '../types.d.ts' 2 | import { runInRepo } from '../utils.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'fwouts/previewjs', 8 | branch: 'main', 9 | overrides: { 10 | '@vitejs/plugin-react': true, 11 | }, 12 | build: 'vite-ecosystem-ci:build', 13 | beforeTest: 'vite-ecosystem-ci:before-test', 14 | test: ['vite-ecosystem-ci:test'], 15 | }) 16 | } 17 | -------------------------------------------------------------------------------- /tests/quasar.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'quasarframework/quasar', 8 | branch: 'dev', 9 | overrides: { 10 | '@vitejs/plugin-vue': true, 11 | }, 12 | build: 'vite-ecosystem-ci:build', 13 | test: 'vite-ecosystem-ci:test', 14 | }) 15 | } 16 | -------------------------------------------------------------------------------- /tests/qwik.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'BuilderIO/qwik', 8 | build: 'build.vite', 9 | beforeTest: 'pnpm playwright install chromium', 10 | test: 'test.vite', 11 | }) 12 | } 13 | -------------------------------------------------------------------------------- /tests/rakkas.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | import { execSync } from 'node:child_process' 4 | 5 | export async function test(options: RunOptions) { 6 | await runInRepo({ 7 | ...options, 8 | repo: 'rakkasjs/rakkasjs', 9 | branch: 'main', 10 | build: 'build', 11 | // This is needed to run puppeteer in Ubuntu 23+ 12 | // https://github.com/puppeteer/puppeteer/pull/13196 13 | beforeTest: [ 14 | process.env.GITHUB_ACTIONS 15 | ? async () => { 16 | execSync( 17 | 'echo 0 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns', 18 | ) 19 | } 20 | : null, 21 | 'pnpm --dir testbed/examples exec puppeteer browsers install chrome', 22 | ].filter((x) => x != null), 23 | test: 'vite-ecosystem-ci', 24 | }) 25 | } 26 | -------------------------------------------------------------------------------- /tests/react-router.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'remix-run/react-router', 8 | branch: 'dev', 9 | build: 'vite-ecosystem-ci:build', 10 | beforeTest: 'vite-ecosystem-ci:before-test', 11 | test: 'vite-ecosystem-ci:test', 12 | }) 13 | } 14 | -------------------------------------------------------------------------------- /tests/redwoodjs.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'redwoodjs/redwood', 8 | build: { script: 'build', args: ['--skip-nx-cache'] }, 9 | test: { script: 'test-ci', args: ['--skip-nx-cache'] }, 10 | }) 11 | } 12 | -------------------------------------------------------------------------------- /tests/storybook.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'storybookjs/storybook', 8 | branch: 'next', 9 | build: 'vite-ecosystem-ci:build', 10 | beforeTest: 'vite-ecosystem-ci:before-test', 11 | test: 'vite-ecosystem-ci:test', 12 | }) 13 | } 14 | -------------------------------------------------------------------------------- /tests/sveltekit.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'sveltejs/kit', 8 | branch: 'main', 9 | overrides: { 10 | svelte: 'latest', 11 | '@sveltejs/vite-plugin-svelte': true, 12 | '@sveltejs/vite-plugin-svelte-inspector': true, 13 | }, 14 | beforeTest: 'pnpm playwright install chromium', 15 | test: [ 16 | 'test:vite-ecosystem-ci', 17 | 'pnpm --dir packages/kit check', // only run checks for kit package, not the whole repo 18 | ], 19 | }) 20 | } 21 | -------------------------------------------------------------------------------- /tests/unocss.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'unocss/unocss', 8 | build: 'build', 9 | test: 'test', 10 | }) 11 | } 12 | -------------------------------------------------------------------------------- /tests/vike.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'vikejs/vike', 8 | branch: 'main', 9 | overrides: { 10 | '@vitejs/plugin-react': true, 11 | '@vitejs/plugin-vue': true, 12 | }, 13 | build: 'build', 14 | beforeTest: 'pnpm exec playwright install chromium', 15 | test: 'test:vite-ecosystem-ci', 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /tests/vite-environment-examples.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | if (options.viteMajor < 6) { 6 | return 7 | } 8 | await runInRepo({ 9 | ...options, 10 | repo: 'hi-ogawa/vite-environment-examples', 11 | branch: 'main', 12 | build: 'vite-ecosystem-ci:build', 13 | beforeTest: 'vite-ecosystem-ci:before-test', 14 | test: 'vite-ecosystem-ci:test', 15 | }) 16 | } 17 | -------------------------------------------------------------------------------- /tests/vite-plugin-cloudflare.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.js' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'cloudflare/workers-sdk', 8 | test: 'pnpm test:ci -F @vite-plugin-cloudflare/playground', 9 | }) 10 | } 11 | -------------------------------------------------------------------------------- /tests/vite-plugin-laravel.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'innocenzi/laravel-vite', 8 | build: 'build', 9 | test: 'test:vite', 10 | }) 11 | } 12 | -------------------------------------------------------------------------------- /tests/vite-plugin-pwa.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'vite-pwa/vite-plugin-pwa', 8 | branch: 'main', 9 | beforeTest: 'pnpm playwright install chromium', 10 | build: 'build', 11 | test: 'test:vite-ecosystem-ci', 12 | }) 13 | } 14 | -------------------------------------------------------------------------------- /tests/vite-plugin-react-pages.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'vitejs/vite-plugin-react-pages', 8 | overrides: { 9 | '@vitejs/plugin-react': true, 10 | }, 11 | branch: 'main', 12 | build: 'pnpm --filter vite-plugin-react-pages run build', 13 | beforeTest: 'pnpm playwright install chromium', 14 | test: 'test', 15 | }) 16 | } 17 | -------------------------------------------------------------------------------- /tests/vite-plugin-react.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'vitejs/vite-plugin-react', 8 | build: 'build', 9 | beforeTest: 'pnpm playwright install chromium', 10 | test: ['test', 'typecheck'], 11 | overrides: { 12 | '@vitejs/plugin-react-oxc>vite': 'catalog:rolldown-vite', 13 | }, 14 | }) 15 | } 16 | -------------------------------------------------------------------------------- /tests/vite-plugin-svelte.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'sveltejs/vite-plugin-svelte', 8 | branch: 'main', 9 | beforeTest: 'pnpm playwright install chromium', 10 | test: ['check:lint', 'check:types', 'test'], 11 | }) 12 | } 13 | -------------------------------------------------------------------------------- /tests/vite-plugin-vue.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'vitejs/vite-plugin-vue', 8 | build: 'build', 9 | beforeTest: 'pnpm playwright install chromium', 10 | test: 'test', 11 | }) 12 | } 13 | -------------------------------------------------------------------------------- /tests/vite-setup-catalogue.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'sapphi-red/vite-setup-catalogue', 8 | branch: 'main', 9 | test: 'test-for-ecosystem-ci', 10 | }) 11 | } 12 | -------------------------------------------------------------------------------- /tests/vitepress.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'vuejs/vitepress', 8 | overrides: { 9 | '@vitejs/plugin-vue': true, 10 | }, 11 | branch: 'main', 12 | build: 'build', 13 | beforeTest: 'pnpm playwright install chromium', 14 | test: 'test', 15 | }) 16 | } 17 | -------------------------------------------------------------------------------- /tests/vitest.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'vitest-dev/vitest', 8 | build: 'build', 9 | test: ['test:ecosystem-ci', 'test:examples'], 10 | beforeTest: 'pnpm playwright install chromium', 11 | }) 12 | } 13 | -------------------------------------------------------------------------------- /tests/vuepress.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'vuepress/core', 8 | overrides: { 9 | '@vitejs/plugin-vue': true, 10 | }, 11 | branch: 'main', 12 | build: 'build', 13 | beforeTest: 'pnpm --filter e2e exec playwright install chromium', 14 | test: 'test', 15 | }) 16 | } 17 | -------------------------------------------------------------------------------- /tests/waku.ts: -------------------------------------------------------------------------------- 1 | import { runInRepo } from '../utils.ts' 2 | import type { RunOptions } from '../types.d.ts' 3 | 4 | export async function test(options: RunOptions) { 5 | await runInRepo({ 6 | ...options, 7 | repo: 'dai-shi/waku', 8 | branch: 'main', 9 | build: 'compile', 10 | beforeTest: 'pnpm playwright install chromium', 11 | test: 'test-vite-ecosystem-ci', 12 | }) 13 | } 14 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["./**/*.ts"], 3 | "exclude": ["**/node_modules/**", "./workspace/**"], 4 | "compilerOptions": { 5 | "target": "esnext", 6 | "module": "nodenext", 7 | "moduleResolution": "nodenext", 8 | "allowImportingTsExtensions": true, 9 | "noEmit": true, 10 | "skipLibCheck": true, 11 | "strict": true, 12 | "declaration": true, 13 | "noImplicitOverride": true, 14 | "noUnusedLocals": true, 15 | "esModuleInterop": true, 16 | "useUnknownInCatchVariables": false, 17 | "allowSyntheticDefaultImports": true, 18 | "lib": ["esnext"], 19 | "sourceMap": true 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /types.d.ts: -------------------------------------------------------------------------------- 1 | import type { AGENTS } from '@antfu/ni' 2 | export interface EnvironmentData { 3 | root: string 4 | workspace: string 5 | vitePath: string 6 | cwd: string 7 | env: ProcessEnv 8 | } 9 | 10 | export interface RunOptions { 11 | workspace: string 12 | root: string 13 | vitePath: string 14 | viteMajor: number 15 | verify?: boolean 16 | skipGit?: boolean 17 | release?: string 18 | agent?: (typeof AGENTS)[number] 19 | build?: Task | Task[] 20 | test?: Task | Task[] 21 | beforeInstall?: Task | Task[] 22 | beforeBuild?: Task | Task[] 23 | beforeTest?: Task | Task[] 24 | } 25 | 26 | type Task = string | { script: string; args?: string[] } | (() => Promise) 27 | 28 | export interface CommandOptions { 29 | suites?: string[] 30 | repo?: string 31 | branch?: string 32 | tag?: string 33 | commit?: string 34 | release?: string 35 | verify?: boolean 36 | skipGit?: boolean 37 | } 38 | 39 | export interface RepoOptions { 40 | repo: string 41 | dir?: string 42 | branch?: string 43 | tag?: string 44 | commit?: string 45 | shallow?: boolean 46 | overrides?: Overrides 47 | } 48 | 49 | export interface Overrides { 50 | [key: string]: string | boolean 51 | } 52 | 53 | export interface ProcessEnv { 54 | [key: string]: string | undefined 55 | } 56 | 57 | interface DependencyInfo { 58 | from: string 59 | version: string 60 | resolved: string 61 | path: string 62 | } 63 | interface PackageInfo { 64 | name: string 65 | version: string 66 | path: string 67 | private: boolean 68 | dependencies: Record 69 | devDependencies: Record 70 | optionalDependencies: Record 71 | } 72 | -------------------------------------------------------------------------------- /utils.ts: -------------------------------------------------------------------------------- 1 | import path from 'path' 2 | import fs from 'fs' 3 | import { fileURLToPath, pathToFileURL } from 'url' 4 | import { execaCommand } from 'execa' 5 | import type { 6 | PackageInfo, 7 | EnvironmentData, 8 | Overrides, 9 | ProcessEnv, 10 | RepoOptions, 11 | RunOptions, 12 | Task, 13 | } from './types.d.ts' 14 | import { detect, AGENTS, getCommand, serializeCommand } from '@antfu/ni' 15 | import actionsCore from '@actions/core' 16 | import * as semver from 'semver' 17 | import pacote from 'pacote' 18 | 19 | const isGitHubActions = !!process.env.GITHUB_ACTIONS 20 | 21 | let vitePath: string 22 | let cwd: string 23 | let env: ProcessEnv 24 | 25 | function cd(dir: string) { 26 | cwd = path.resolve(cwd, dir) 27 | } 28 | 29 | export async function $(literals: TemplateStringsArray, ...values: any[]) { 30 | const cmd = literals.reduce( 31 | (result, current, i) => 32 | result + current + (values?.[i] != null ? `${values[i]}` : ''), 33 | '', 34 | ) 35 | 36 | if (isGitHubActions) { 37 | actionsCore.startGroup(`${cwd} $> ${cmd}`) 38 | } else { 39 | console.log(`${cwd} $> ${cmd}`) 40 | } 41 | 42 | const proc = execaCommand(cmd, { 43 | env, 44 | stdio: 'pipe', 45 | cwd, 46 | }) 47 | if (proc.stdin) process.stdin.pipe(proc.stdin) 48 | if (proc.stdout) proc.stdout.pipe(process.stdout) 49 | if (proc.stderr) proc.stderr.pipe(process.stderr) 50 | 51 | let result 52 | try { 53 | result = await proc 54 | } catch (error) { 55 | // Since we already piped the io to the parent process, we remove the duplicated 56 | // messages here so it's easier to read the error message. 57 | if (error.stdout) error.stdout = 'value removed by vite-ecosystem-ci' 58 | if (error.stderr) error.stderr = 'value removed by vite-ecosystem-ci' 59 | if (error.stdio) error.stdio = ['value removed by vite-ecosystem-ci'] 60 | throw error 61 | } 62 | 63 | if (isGitHubActions) { 64 | actionsCore.endGroup() 65 | } 66 | 67 | return result.stdout 68 | } 69 | 70 | export async function setupEnvironment(): Promise { 71 | const root = dirnameFrom(import.meta.url) 72 | const workspace = path.resolve(root, 'workspace') 73 | vitePath = path.resolve(workspace, 'vite') 74 | cwd = process.cwd() 75 | env = { 76 | ...process.env, 77 | CI: 'true', 78 | TURBO_FORCE: 'true', // disable turbo caching, ecosystem-ci modifies things and we don't want replays 79 | YARN_ENABLE_IMMUTABLE_INSTALLS: 'false', // to avoid errors with mutated lockfile due to overrides 80 | NODE_OPTIONS: '--max-old-space-size=6144', // GITHUB CI has 7GB max, stay below 81 | ECOSYSTEM_CI: 'true', // flag for tests, can be used to conditionally skip irrelevant tests. 82 | TURBO_TELEMETRY_DISABLED: '1', // # see https://turbo.build/repo/docs/telemetry#how-do-i-opt-out 83 | DO_NOT_TRACK: '1', 84 | } 85 | initWorkspace(workspace) 86 | return { root, workspace, vitePath, cwd, env } 87 | } 88 | 89 | function initWorkspace(workspace: string) { 90 | if (!fs.existsSync(workspace)) { 91 | fs.mkdirSync(workspace, { recursive: true }) 92 | } 93 | const eslintrc = path.join(workspace, '.eslintrc.json') 94 | if (!fs.existsSync(eslintrc)) { 95 | fs.writeFileSync(eslintrc, '{"root":true}\n', 'utf-8') 96 | } 97 | const editorconfig = path.join(workspace, '.editorconfig') 98 | if (!fs.existsSync(editorconfig)) { 99 | fs.writeFileSync(editorconfig, 'root = true\n', 'utf-8') 100 | } 101 | const tsconfig = path.join(workspace, 'tsconfig.json') 102 | if (!fs.existsSync(tsconfig)) { 103 | fs.writeFileSync(tsconfig, '{}\n', 'utf-8') 104 | } 105 | } 106 | 107 | export async function setupRepo(options: RepoOptions) { 108 | if (options.branch == null) { 109 | options.branch = 'main' 110 | } 111 | if (options.shallow == null) { 112 | options.shallow = true 113 | } 114 | 115 | let { repo, commit, branch, tag, dir, shallow } = options 116 | if (!dir) { 117 | throw new Error('setupRepo must be called with options.dir') 118 | } 119 | if (!repo.includes(':')) { 120 | repo = `https://github.com/${repo}.git` 121 | } 122 | 123 | let needClone = true 124 | if (fs.existsSync(dir)) { 125 | const _cwd = cwd 126 | cd(dir) 127 | let currentClonedRepo: string | undefined 128 | try { 129 | currentClonedRepo = await $`git ls-remote --get-url` 130 | } catch { 131 | // when not a git repo 132 | } 133 | if (repo === currentClonedRepo) { 134 | const isShallow = 135 | (await $`git rev-parse --is-shallow-repository`).trim() === 'true' 136 | if (isShallow === shallow) { 137 | needClone = false 138 | } 139 | } 140 | cd(_cwd) 141 | 142 | if (needClone) { 143 | fs.rmSync(dir, { recursive: true, force: true }) 144 | } 145 | } 146 | 147 | if (needClone) { 148 | await $`git -c advice.detachedHead=false clone ${ 149 | shallow ? '--depth=1 --no-tags' : '' 150 | } --branch ${tag || branch} ${repo} ${dir}` 151 | } 152 | cd(dir) 153 | await $`git clean -fdxq` 154 | if (!needClone && shallow && !commit) { 155 | await $`git remote set-branches origin ${branch}` 156 | } 157 | await $`git fetch ${shallow ? '--depth=1 --no-tags' : '--tags'} origin ${ 158 | tag ? `tag ${tag}` : `${commit || branch}` 159 | }` 160 | if (shallow) { 161 | await $`git -c advice.detachedHead=false checkout ${ 162 | tag ? `tags/${tag}` : `${commit || branch}` 163 | }` 164 | } else { 165 | await $`git checkout ${branch}` 166 | await $`git merge FETCH_HEAD` 167 | if (tag || commit) { 168 | await $`git reset --hard ${tag || commit}` 169 | } 170 | } 171 | } 172 | 173 | function toCommand( 174 | task: Task | Task[] | void, 175 | agent: (typeof AGENTS)[number], 176 | ): ((scripts: any) => Promise) | void { 177 | return async (scripts: any) => { 178 | const tasks = Array.isArray(task) ? task : [task] 179 | for (const task of tasks) { 180 | if (task == null || task === '') { 181 | continue 182 | } else if (typeof task === 'string') { 183 | if (scripts[task] != null) { 184 | const runTaskWithAgent = getCommand(agent, 'run', [task]) 185 | await $`${serializeCommand(runTaskWithAgent)}` 186 | } else { 187 | await $`${task}` 188 | } 189 | } else if (typeof task === 'function') { 190 | await task() 191 | } else if (task?.script) { 192 | if (scripts[task.script] != null) { 193 | const runTaskWithAgent = getCommand(agent, 'run', [ 194 | task.script, 195 | ...(task.args ?? []), 196 | ]) 197 | await $`${serializeCommand(runTaskWithAgent)}` 198 | } else { 199 | throw new Error( 200 | `invalid task, script "${task.script}" does not exist in package.json`, 201 | ) 202 | } 203 | } else { 204 | throw new Error( 205 | `invalid task, expected string or function but got ${typeof task}: ${task}`, 206 | ) 207 | } 208 | } 209 | } 210 | } 211 | 212 | export async function runInRepo(options: RunOptions & RepoOptions) { 213 | if (options.verify == null) { 214 | options.verify = true 215 | } 216 | if (options.skipGit == null) { 217 | options.skipGit = false 218 | } 219 | if (options.branch == null) { 220 | options.branch = 'main' 221 | } 222 | 223 | const { 224 | build, 225 | test, 226 | repo, 227 | branch, 228 | tag, 229 | commit, 230 | skipGit, 231 | verify, 232 | beforeInstall, 233 | beforeBuild, 234 | beforeTest, 235 | } = options 236 | 237 | const dir = path.resolve( 238 | options.workspace, 239 | options.dir || repo.substring(repo.lastIndexOf('/') + 1), 240 | ) 241 | 242 | if (!skipGit) { 243 | await setupRepo({ repo, dir, branch, tag, commit }) 244 | } else { 245 | cd(dir) 246 | } 247 | if (options.agent == null) { 248 | const detectedAgent = await detect({ cwd: dir, autoInstall: false }) 249 | if (detectedAgent == null) { 250 | throw new Error(`Failed to detect packagemanager in ${dir}`) 251 | } 252 | options.agent = detectedAgent 253 | } 254 | if (!AGENTS.includes(options.agent)) { 255 | throw new Error( 256 | `Invalid agent ${options.agent}. Allowed values: ${AGENTS.join(', ')}`, 257 | ) 258 | } 259 | const agent = options.agent 260 | const beforeInstallCommand = toCommand(beforeInstall, agent) 261 | const beforeBuildCommand = toCommand(beforeBuild, agent) 262 | const beforeTestCommand = toCommand(beforeTest, agent) 263 | const buildCommand = toCommand(build, agent) 264 | const testCommand = toCommand(test, agent) 265 | 266 | const pkgFile = path.join(dir, 'package.json') 267 | const pkg = JSON.parse(await fs.promises.readFile(pkgFile, 'utf-8')) 268 | 269 | await beforeInstallCommand?.(pkg.scripts) 270 | 271 | if (verify && test) { 272 | const frozenInstall = getCommand(agent, 'frozen') 273 | await $`${serializeCommand(frozenInstall)}` 274 | await beforeBuildCommand?.(pkg.scripts) 275 | await buildCommand?.(pkg.scripts) 276 | await beforeTestCommand?.(pkg.scripts) 277 | await testCommand?.(pkg.scripts) 278 | } 279 | let overrides = options.overrides || {} 280 | if (options.release) { 281 | if (overrides.vite && overrides.vite !== options.release) { 282 | throw new Error( 283 | `conflicting overrides.vite=${overrides.vite} and --release=${options.release} config. Use either one or the other`, 284 | ) 285 | } else { 286 | overrides.vite = options.release 287 | } 288 | 289 | if (overrides.rollup !== false || overrides.esbuild === true) { 290 | const viteManifest = await pacote.manifest(`vite@${options.release}`, { 291 | retry: { 292 | // enable retry with same options with pnpm (https://pnpm.io/settings#fetchretries) 293 | retries: 2, 294 | factor: 10, 295 | minTimeout: 10 * 1000, 296 | maxTimeout: 60 * 1000, 297 | }, 298 | }) 299 | 300 | // skip if `overrides.rollup` is `false` 301 | if (overrides.rollup !== false) { 302 | overrides.rollup = viteManifest.dependencies!.rollup 303 | } 304 | 305 | // apply if `overrides.esbuild` is `true` 306 | if (overrides.esbuild === true) { 307 | overrides.esbuild = viteManifest.dependencies!.esbuild 308 | } 309 | } 310 | } else { 311 | overrides.vite ||= `${options.vitePath}/packages/vite` 312 | 313 | overrides[`@vitejs/plugin-legacy`] ||= 314 | `${options.vitePath}/packages/plugin-legacy` 315 | 316 | const vitePackageInfo = await getVitePackageInfo(options.vitePath) 317 | // skip if `overrides.rollup` is `false` 318 | if ( 319 | vitePackageInfo.dependencies.rollup?.version && 320 | overrides.rollup !== false 321 | ) { 322 | overrides.rollup = vitePackageInfo.dependencies.rollup.version 323 | } 324 | 325 | // apply if `overrides.esbuild` is `true` 326 | if ( 327 | vitePackageInfo.dependencies.esbuild?.version && 328 | overrides.esbuild === true 329 | ) { 330 | overrides.esbuild = vitePackageInfo.dependencies.esbuild.version 331 | } 332 | 333 | // build and apply local overrides 334 | const localOverrides = await buildOverrides(pkg, options, overrides) 335 | cd(dir) // buildOverrides changed dir, change it back 336 | overrides = { 337 | ...overrides, 338 | ...localOverrides, 339 | } 340 | } 341 | await applyPackageOverrides(dir, pkg, overrides) 342 | await beforeBuildCommand?.(pkg.scripts) 343 | await buildCommand?.(pkg.scripts) 344 | if (test) { 345 | await beforeTestCommand?.(pkg.scripts) 346 | await testCommand?.(pkg.scripts) 347 | } 348 | return { dir } 349 | } 350 | 351 | export async function setupViteRepo(options: Partial) { 352 | const repo = options.repo || 'vitejs/vite' 353 | await setupRepo({ 354 | repo, 355 | dir: vitePath, 356 | branch: 'main', 357 | shallow: true, 358 | ...options, 359 | }) 360 | 361 | try { 362 | const rootPackageJsonFile = path.join(vitePath, 'package.json') 363 | const rootPackageJson = JSON.parse( 364 | await fs.promises.readFile(rootPackageJsonFile, 'utf-8'), 365 | ) 366 | const viteMonoRepoNames = ['@vitejs/vite-monorepo', 'vite-monorepo'] 367 | const { name } = rootPackageJson 368 | if (!viteMonoRepoNames.includes(name)) { 369 | throw new Error( 370 | `expected "name" field of ${repo}/package.json to indicate vite monorepo, but got ${name}.`, 371 | ) 372 | } 373 | const needsWrite = await overridePackageManagerVersion( 374 | rootPackageJson, 375 | 'pnpm', 376 | ) 377 | if (needsWrite) { 378 | fs.writeFileSync( 379 | rootPackageJsonFile, 380 | JSON.stringify(rootPackageJson, null, 2), 381 | 'utf-8', 382 | ) 383 | if (rootPackageJson.devDependencies?.pnpm) { 384 | await $`pnpm install -Dw pnpm --lockfile-only` 385 | } 386 | } 387 | } catch (e) { 388 | throw new Error(`Failed to setup vite repo`, { cause: e }) 389 | } 390 | } 391 | 392 | export async function getPermanentRef() { 393 | cd(vitePath) 394 | try { 395 | const ref = await $`git log -1 --pretty=format:%H` 396 | return ref 397 | } catch (e) { 398 | console.warn(`Failed to obtain perm ref. ${e}`) 399 | return undefined 400 | } 401 | } 402 | 403 | export async function buildVite({ verify = false }) { 404 | cd(vitePath) 405 | const frozenInstall = getCommand('pnpm', 'frozen') 406 | const runBuild = getCommand('pnpm', 'run', ['build']) 407 | const runTest = getCommand('pnpm', 'run', ['test']) 408 | await $`${serializeCommand(frozenInstall)}` 409 | await $`${serializeCommand(runBuild)}` 410 | if (verify) { 411 | await $`${serializeCommand(runTest)}` 412 | } 413 | } 414 | 415 | export async function bisectVite( 416 | good: string, 417 | runSuite: () => Promise, 418 | ) { 419 | // sometimes vite build modifies files in git, e.g. LICENSE.md 420 | // this would stop bisect, so to reset those changes 421 | const resetChanges = async () => $`git reset --hard HEAD` 422 | 423 | try { 424 | cd(vitePath) 425 | await resetChanges() 426 | await $`git bisect start` 427 | await $`git bisect bad` 428 | await $`git bisect good ${good}` 429 | let bisecting = true 430 | while (bisecting) { 431 | const commitMsg = await $`git log -1 --format=%s` 432 | const isNonCodeCommit = commitMsg.match(/^(?:release|docs)[:(]/) 433 | if (isNonCodeCommit) { 434 | await $`git bisect skip` 435 | continue // see if next commit can be skipped too 436 | } 437 | const error = await runSuite() 438 | cd(vitePath) 439 | await resetChanges() 440 | const bisectOut = await $`git bisect ${error ? 'bad' : 'good'}` 441 | bisecting = bisectOut.substring(0, 10).toLowerCase() === 'bisecting:' // as long as git prints 'bisecting: ' there are more revisions to test 442 | } 443 | } catch (e) { 444 | console.log('error while bisecting', e) 445 | } finally { 446 | try { 447 | cd(vitePath) 448 | await $`git bisect reset` 449 | } catch (e) { 450 | console.log('Error while resetting bisect', e) 451 | } 452 | } 453 | } 454 | 455 | function isLocalOverride(v: string): boolean { 456 | if (!v.includes('/') || v.startsWith('@')) { 457 | // not path-like (either a version number or a package name) 458 | return false 459 | } 460 | try { 461 | return !!fs.lstatSync(v)?.isDirectory() 462 | } catch (e) { 463 | if (e.code !== 'ENOENT') { 464 | throw e 465 | } 466 | return false 467 | } 468 | } 469 | 470 | /** 471 | * utility to override packageManager version 472 | * 473 | * @param pkg parsed package.json 474 | * @param pm package manager to override eg. `pnpm` 475 | * @returns {boolean} true if pkg was updated, caller is responsible for writing it to disk 476 | */ 477 | async function overridePackageManagerVersion( 478 | pkg: { [key: string]: any }, 479 | pm: string, 480 | ): Promise { 481 | const versionInUse = pkg.packageManager?.startsWith(`${pm}@`) 482 | ? pkg.packageManager.substring(pm.length + 1) 483 | : await $`${pm} --version` 484 | let overrideWithVersion: string | null = null 485 | if (pm === 'pnpm') { 486 | if (semver.eq(versionInUse, '7.18.0')) { 487 | // avoid bug with absolute overrides in pnpm 7.18.0 488 | overrideWithVersion = '7.18.1' 489 | } 490 | } 491 | if (overrideWithVersion) { 492 | console.warn( 493 | `detected ${pm}@${versionInUse} used in ${pkg.name}, changing pkg.packageManager and pkg.engines.${pm} to enforce use of ${pm}@${overrideWithVersion}`, 494 | ) 495 | // corepack reads this and uses pnpm @ newVersion then 496 | pkg.packageManager = `${pm}@${overrideWithVersion}` 497 | if (!pkg.engines) { 498 | pkg.engines = {} 499 | } 500 | pkg.engines[pm] = overrideWithVersion 501 | 502 | if (pkg.devDependencies?.[pm]) { 503 | // if for some reason the pm is in devDependencies, that would be a local version that'd be preferred over our forced global 504 | // so ensure it here too. 505 | pkg.devDependencies[pm] = overrideWithVersion 506 | } 507 | 508 | return true 509 | } 510 | return false 511 | } 512 | 513 | export async function applyPackageOverrides( 514 | dir: string, 515 | pkg: any, 516 | overrides: Overrides = {}, 517 | ) { 518 | const useFileProtocol = (v: string) => 519 | isLocalOverride(v) ? `file:${path.resolve(v)}` : v 520 | // remove boolean flags 521 | overrides = Object.fromEntries( 522 | Object.entries(overrides) 523 | //eslint-disable-next-line @typescript-eslint/no-unused-vars 524 | .filter(([key, value]) => typeof value === 'string') 525 | .map(([key, value]) => [key, useFileProtocol(value as string)]), 526 | ) 527 | await $`git clean -fdxq` // remove current install 528 | 529 | const agent = await detect({ cwd: dir, autoInstall: false }) 530 | if (!agent) { 531 | throw new Error(`failed to detect packageManager in ${dir}`) 532 | } 533 | // Remove version from agent string: 534 | // yarn@berry => yarn 535 | // pnpm@6, pnpm@7 => pnpm 536 | const pm = agent?.split('@')[0] 537 | 538 | await overridePackageManagerVersion(pkg, pm) 539 | 540 | if (pm === 'pnpm') { 541 | const overridesWithoutSpecialSyntax = Object.fromEntries( 542 | Object.entries(overrides) 543 | //eslint-disable-next-line @typescript-eslint/no-unused-vars 544 | .filter(([key, value]) => (value as string).includes('>')), 545 | ) 546 | 547 | if (!pkg.devDependencies) { 548 | pkg.devDependencies = {} 549 | } 550 | pkg.devDependencies = { 551 | ...pkg.devDependencies, 552 | ...overridesWithoutSpecialSyntax, // overrides must be present in devDependencies or dependencies otherwise they may not work 553 | } 554 | if (!pkg.pnpm) { 555 | pkg.pnpm = {} 556 | } 557 | pkg.pnpm.overrides = { 558 | ...pkg.pnpm.overrides, 559 | ...overrides, 560 | } 561 | } else if (pm === 'yarn') { 562 | pkg.resolutions = { 563 | ...pkg.resolutions, 564 | ...overrides, 565 | } 566 | } else if (pm === 'npm') { 567 | pkg.overrides = { 568 | ...pkg.overrides, 569 | ...overrides, 570 | } 571 | // npm does not allow overriding direct dependencies, force it by updating the blocks themselves 572 | for (const [name, version] of Object.entries(overrides)) { 573 | if (pkg.dependencies?.[name]) { 574 | pkg.dependencies[name] = version 575 | } 576 | if (pkg.devDependencies?.[name]) { 577 | pkg.devDependencies[name] = version 578 | } 579 | } 580 | } else { 581 | throw new Error(`unsupported package manager detected: ${pm}`) 582 | } 583 | const pkgFile = path.join(dir, 'package.json') 584 | await fs.promises.writeFile(pkgFile, JSON.stringify(pkg, null, 2), 'utf-8') 585 | 586 | // use of `ni` command here could cause lockfile violation errors so fall back to native commands that avoid these 587 | if (pm === 'pnpm') { 588 | await $`pnpm install --prefer-frozen-lockfile --strict-peer-dependencies false` 589 | } else if (pm === 'yarn') { 590 | await $`yarn install` 591 | } else if (pm === 'npm') { 592 | await $`npm install` 593 | } 594 | } 595 | 596 | export function dirnameFrom(url: string) { 597 | return path.dirname(fileURLToPath(url)) 598 | } 599 | 600 | export function parseViteMajor(vitePath: string): number { 601 | const content = fs.readFileSync( 602 | path.join(vitePath, 'packages', 'vite', 'package.json'), 603 | 'utf-8', 604 | ) 605 | const pkg = JSON.parse(content) 606 | return parseMajorVersion(pkg.version) 607 | } 608 | 609 | export function parseMajorVersion(version: string) { 610 | return parseInt(version.split('.', 1)[0], 10) 611 | } 612 | 613 | async function buildOverrides( 614 | pkg: any, 615 | options: RunOptions, 616 | repoOverrides: Overrides, 617 | ) { 618 | const { root } = options 619 | const buildsPath = path.join(root, 'builds') 620 | const buildFiles: string[] = fs 621 | .readdirSync(buildsPath) 622 | .filter((f: string) => !f.startsWith('_') && f.endsWith('.ts')) 623 | .map((f) => path.join(buildsPath, f)) 624 | const buildDefinitions: { 625 | packages: { [key: string]: string } 626 | build: (options: RunOptions) => Promise<{ dir: string }> 627 | dir?: string 628 | }[] = await Promise.all(buildFiles.map((f) => import(pathToFileURL(f).href))) 629 | const deps = new Set([ 630 | ...Object.keys(pkg.dependencies ?? {}), 631 | ...Object.keys(pkg.devDependencies ?? {}), 632 | ...Object.keys(pkg.peerDependencies ?? {}), 633 | ]) 634 | 635 | const needsOverride = (p: string) => 636 | repoOverrides[p] === true || (deps.has(p) && repoOverrides[p] == null) 637 | const buildsToRun = buildDefinitions.filter(({ packages }) => 638 | Object.keys(packages).some(needsOverride), 639 | ) 640 | const overrides: Overrides = {} 641 | for (const buildDef of buildsToRun) { 642 | const { dir } = await buildDef.build({ 643 | root: options.root, 644 | workspace: options.workspace, 645 | vitePath: options.vitePath, 646 | viteMajor: options.viteMajor, 647 | skipGit: options.skipGit, 648 | release: options.release, 649 | verify: options.verify, 650 | // do not pass along scripts 651 | }) 652 | for (const [name, path] of Object.entries(buildDef.packages)) { 653 | if (needsOverride(name)) { 654 | overrides[name] = `${dir}/${path}` 655 | } 656 | } 657 | } 658 | return overrides 659 | } 660 | 661 | /** 662 | * use pnpm ls to get information about installed dependency versions of vite 663 | * @param vitePath - workspace vite root 664 | */ 665 | async function getVitePackageInfo(vitePath: string): Promise { 666 | try { 667 | // run in vite dir to avoid package manager mismatch error from corepack 668 | const current = cwd 669 | cd(`${vitePath}/packages/vite`) 670 | const lsOutput = $`pnpm ls --json` 671 | cd(current) 672 | const lsParsed = JSON.parse(await lsOutput) 673 | return lsParsed[0] as PackageInfo 674 | } catch (e) { 675 | console.error('failed to retrieve vite package infos', e) 676 | throw e 677 | } 678 | } 679 | --------------------------------------------------------------------------------