├── bin └── every-ts.js ├── .vscode ├── extensions.json ├── settings.json └── tasks.json ├── .npmrc ├── .changeset ├── config.json └── README.md ├── .ncurc.cjs ├── tsconfig.json ├── src ├── main.ts ├── typescript.ts ├── common.ts ├── fnm.ts ├── repo.ts └── git.ts ├── .github ├── renovate.json ├── actions │ └── setup │ │ └── action.yml └── workflows │ ├── ci.yml │ └── release.yml ├── .dprint.jsonc ├── LICENSE ├── package.json ├── CHANGELOG.md ├── .gitignore ├── README.md ├── eslint.config.mjs └── pnpm-lock.yaml /bin/every-ts.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import "../dist/main.js"; 3 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["dbaeumer.vscode-eslint", "dprint.dprint"] 3 | } 4 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | use-lockfile-v6=true 2 | resolution-mode=highest 3 | auto-install-peers=true 4 | strict-peer-dependencies=false 5 | -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json", 3 | "changelog": "@changesets/cli/changelog", 4 | "commit": false, 5 | "fixed": [], 6 | "linked": [], 7 | "access": "public", 8 | "baseBranch": "main", 9 | "updateInternalDependencies": "patch", 10 | "ignore": [] 11 | } 12 | -------------------------------------------------------------------------------- /.ncurc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 3 | target: (dependencyName, [{ semver, version, operator, major, minor, patch, release, build }]) => { 4 | if (dependencyName === "@types/node") return "minor"; 5 | if (major === "0") return "minor"; 6 | return "latest"; 7 | }, 8 | }; 9 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "dprint.dprint", 3 | "editor.formatOnSave": true, 4 | "editor.codeActionsOnSave": { 5 | "source.fixAll.eslint": "explicit" 6 | }, 7 | 8 | // These options search the repo recursively and slow down 9 | // the build task menu. We define our own in tasks.json. 10 | "typescript.tsc.autoDetect": "off", 11 | "npm.autoDetect": "off", 12 | "grunt.autoDetect": "off", 13 | "jake.autoDetect": "off", 14 | "gulp.autoDetect": "off" 15 | } 16 | -------------------------------------------------------------------------------- /.changeset/README.md: -------------------------------------------------------------------------------- 1 | # Changesets 2 | 3 | Hello and welcome! This folder has been automatically generated by 4 | `@changesets/cli`, a build tool that works with multi-package repos, or 5 | single-package repos to help you version and publish your code. You can find the 6 | full documentation for it 7 | [in our repository](https://github.com/changesets/changesets) 8 | 9 | We have a quick list of common questions to get you started engaging with this 10 | project in 11 | [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) 12 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "label": "tsc: watch", 8 | "type": "shell", 9 | "command": "node", 10 | "args": ["${workspaceFolder}/node_modules/typescript/lib/tsc.js", "--watch"], 11 | "group": "build", 12 | "isBackground": true, 13 | "problemMatcher": [ 14 | "$tsc-watch" 15 | ] 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/node18/tsconfig.json", 3 | "compilerOptions": { 4 | "module": "Node16", 5 | "moduleResolution": "Node16", 6 | "rootDir": "src", 7 | "outDir": "dist", 8 | "sourceMap": true, 9 | 10 | "allowUnusedLabels": false, 11 | "allowUnreachableCode": false, 12 | "exactOptionalPropertyTypes": true, 13 | "noFallthroughCasesInSwitch": true, 14 | "noImplicitOverride": true, 15 | "noImplicitReturns": true, 16 | "noPropertyAccessFromIndexSignature": true, 17 | "verbatimModuleSyntax": true 18 | }, 19 | "exclude": ["dist"] 20 | } 21 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { Builtins, Cli } from "clipanion"; 2 | 3 | import { getPackageVersion } from "./common.js"; 4 | import { Bisect, BisectRun, Switch } from "./git.js"; 5 | import { Fetch } from "./git.js"; 6 | import { Dir, Exec, Tsc, Tsdk } from "./typescript.js"; 7 | 8 | const cli = new Cli({ 9 | binaryLabel: `every-ts`, 10 | binaryName: `every-ts`, 11 | binaryVersion: getPackageVersion(), 12 | enableCapture: true, 13 | }); 14 | 15 | cli.register(Builtins.HelpCommand); 16 | cli.register(Builtins.VersionCommand); 17 | cli.register(Bisect); 18 | cli.register(BisectRun); 19 | cli.register(Switch); 20 | cli.register(Fetch); 21 | cli.register(Tsc); 22 | cli.register(Tsdk); 23 | cli.register(Exec); 24 | cli.register(Dir); 25 | 26 | void cli.runExit(process.argv.slice(2)); 27 | -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:recommended", 5 | "helpers:pinGitHubActionDigests" 6 | ], 7 | "rangeStrategy": "bump", 8 | "packageRules": [ 9 | { 10 | "description": "Ignore nodejs", 11 | "matchPackageNames": ["node"], 12 | "matchManagers": ["npm"], 13 | "matchDepTypes": ["engines"], 14 | "dependencyDashboardApproval": true 15 | }, 16 | { 17 | "matchManagers": ["github-actions"], 18 | "groupName": "github actions", 19 | "groupSlug": "github-actions" 20 | }, 21 | { 22 | "matchManagers": ["github-actions"], 23 | "matchPackageNames": ["slsa-framework/slsa-github-generator"], 24 | "pinDigests": false 25 | } 26 | ] 27 | } 28 | -------------------------------------------------------------------------------- /.dprint.jsonc: -------------------------------------------------------------------------------- 1 | { 2 | "indentWidth": 4, 3 | "lineWidth": 120, 4 | "newLineKind": "auto", 5 | "useTabs": false, 6 | "typescript": { 7 | "quoteStyle": "preferDouble", 8 | "semiColons": "always", 9 | "arrowFunction.useParentheses": "force" 10 | }, 11 | "json": { 12 | "trailingCommas": "never" 13 | }, 14 | "markdown": { 15 | "textWrap": "always", 16 | "lineWidth": 80 17 | }, 18 | "yaml": { 19 | "indentWidth": 2, 20 | "quotes": "preferSingle" 21 | }, 22 | "excludes": [ 23 | "**/node_modules", 24 | "**/*-lock.json", 25 | "dist/**", 26 | "coverage/**", 27 | ".data/**", 28 | "pnpm-lock.yaml" 29 | ], 30 | "plugins": [ 31 | "https://plugins.dprint.dev/typescript-0.95.13.wasm", 32 | "https://plugins.dprint.dev/json-0.21.0.wasm", 33 | "https://plugins.dprint.dev/markdown-0.20.0.wasm", 34 | "https://plugins.dprint.dev/g-plane/pretty_yaml-v0.5.1.wasm" 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Jake Bailey 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/actions/setup/action.yml: -------------------------------------------------------------------------------- 1 | name: Setup 2 | description: Setup Node.js and pnpm 3 | 4 | inputs: 5 | node-version: 6 | description: Node.js version to use 7 | default: '*' 8 | 9 | runs: 10 | using: composite 11 | steps: 12 | - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 13 | with: 14 | node-version: ${{ inputs.node-version }} 15 | package-manager-cache: false 16 | 17 | - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 18 | name: Install pnpm 19 | with: 20 | run_install: false 21 | 22 | - name: Get pnpm store directory 23 | id: pnpm-cache 24 | shell: bash 25 | run: | 26 | echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT 27 | 28 | - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 29 | name: Setup pnpm cache 30 | with: 31 | path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} 32 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 33 | restore-keys: | 34 | ${{ runner.os }}-pnpm-store- 35 | 36 | - name: pnpm install 37 | run: pnpm install 38 | shell: bash 39 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | branches: 9 | - main 10 | 11 | jobs: 12 | smoke: 13 | name: Smoke test 14 | runs-on: ubuntu-latest 15 | 16 | strategy: 17 | fail-fast: false 18 | matrix: 19 | node-version: 20 | - 22 21 | - 20 22 | - 18 23 | 24 | steps: 25 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 26 | - uses: ./.github/actions/setup 27 | with: 28 | node-version: ${{ matrix.node-version }} 29 | - run: pnpm build 30 | - run: node ./dist/main.js fetch 31 | - run: node ./dist/main.js tsc --version 32 | 33 | eslint: 34 | name: ESLint 35 | runs-on: ubuntu-latest 36 | 37 | steps: 38 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 39 | - uses: ./.github/actions/setup 40 | - run: pnpm eslint . 41 | 42 | dprint: 43 | name: dprint 44 | runs-on: ubuntu-latest 45 | 46 | steps: 47 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 48 | - uses: ./.github/actions/setup 49 | - run: pnpm dprint check 50 | 51 | required: 52 | runs-on: ubuntu-latest 53 | if: ${{ always() }} 54 | needs: 55 | - smoke 56 | - eslint 57 | - dprint 58 | 59 | steps: 60 | - name: Check required jobs 61 | env: 62 | NEEDS: ${{ toJson(needs) }} 63 | run: | 64 | ! echo $NEEDS | jq -e 'to_entries[] | { job: .key, result: .value.result } | select(.result != "success")' 65 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - main 8 | 9 | permissions: 10 | pull-requests: write 11 | contents: write 12 | id-token: write 13 | 14 | concurrency: ${{ github.workflow }}-${{ github.ref }} 15 | 16 | jobs: 17 | release: 18 | runs-on: ubuntu-latest 19 | 20 | environment: npm 21 | 22 | steps: 23 | - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 24 | with: 25 | fetch-depth: 0 26 | filter: blob:none 27 | 28 | - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 29 | with: 30 | node-version: '*' 31 | package-manager-cache: false 32 | 33 | - run: npm install -g npm@latest 34 | 35 | - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 36 | name: Install pnpm 37 | 38 | - name: Get pnpm store directory 39 | id: pnpm-cache 40 | shell: bash 41 | run: | 42 | echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT 43 | 44 | - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 45 | name: Setup pnpm cache 46 | with: 47 | path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} 48 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 49 | restore-keys: | 50 | ${{ runner.os }}-pnpm-store- 51 | 52 | - name: pnpm install 53 | run: pnpm install 54 | 55 | - uses: changesets/action@v1 56 | with: 57 | publish: pnpm changeset publish 58 | env: 59 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 60 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "every-ts", 3 | "version": "3.0.1", 4 | "author": "Jake Bailey", 5 | "license": "MIT", 6 | "description": "A CLI to build and bisect any version of TypeScript", 7 | "keywords": [], 8 | "repository": "github:jakebailey/every-ts", 9 | "type": "module", 10 | "bin": "./bin/every-ts.js", 11 | "preferUnplugged": true, 12 | "files": [ 13 | "bin", 14 | "dist" 15 | ], 16 | "dependencies": { 17 | "@zkochan/cmd-shim": "^7.0.0", 18 | "adm-zip": "^0.5.16", 19 | "clipanion": "4.0.0-rc.4", 20 | "execa": "^9.6.1", 21 | "semver": "^7.7.3" 22 | }, 23 | "devDependencies": { 24 | "@changesets/cli": "^2.29.8", 25 | "@eslint/js": "^9.39.1", 26 | "@tsconfig/node18": "^18.2.6", 27 | "@types/adm-zip": "^0.5.7", 28 | "@types/node": "^18.19.130", 29 | "@types/semver": "^7.7.1", 30 | "dprint": "^0.50.2", 31 | "eslint": "^9.39.1", 32 | "eslint-plugin-simple-import-sort": "^12.1.1", 33 | "eslint-plugin-unicorn": "^62.0.0", 34 | "globals": "^16.5.0", 35 | "rimraf": "^6.1.2", 36 | "typescript": "^5.9.3", 37 | "typescript-eslint": "^8.48.1" 38 | }, 39 | "scripts": { 40 | "build": "tsc", 41 | "watch": "tsc --watch", 42 | "prepack": "rimraf dist && npm run build" 43 | }, 44 | "engines": { 45 | "node": ">= 18.19" 46 | }, 47 | "packageManager": "pnpm@10.24.0+sha512.01ff8ae71b4419903b65c60fb2dc9d34cf8bb6e06d03bde112ef38f7a34d6904c424ba66bea5cdcf12890230bf39f9580473140ed9c946fef328b6e5238a345a", 48 | "pnpm": { 49 | "onlyBuiltDependencies": [ 50 | "dprint" 51 | ] 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # every-ts 2 | 3 | ## 3.0.1 4 | 5 | ### Patch Changes 6 | 7 | - 5412de6: Update deps 8 | 9 | ## 3.0.0 10 | 11 | ### Major Changes 12 | 13 | - 52dd13a: Update execa, require Node 18.19 14 | 15 | ### Patch Changes 16 | 17 | - 5539d56: Update deps 18 | - 33404c0: Update deps 19 | - 6ffc475: Update deps 20 | 21 | ## 2.0.2 22 | 23 | ### Patch Changes 24 | 25 | - b2161bb: Drop accidental declared support for Node 16, which has never worked 26 | 27 | ## 2.0.1 28 | 29 | ### Patch Changes 30 | 31 | - e5a9066: Pin back adm-zip to prevent unzip from crashing 32 | 33 | ## 2.0.0 34 | 35 | ### Major Changes 36 | 37 | - ab5d9e5: Update minimum node version to v18 38 | 39 | ## 1.2.4 40 | 41 | ### Patch Changes 42 | 43 | - 685a3ed: Attempt to update local branches on `every-ts fetch` 44 | - c143c42: Ensure repo is cloned before bisect commands are run 45 | 46 | ## 1.2.3 47 | 48 | ### Patch Changes 49 | 50 | - fcc9b5f: Always reset checkout on bisect reset 51 | 52 | ## 1.2.2 53 | 54 | ### Patch Changes 55 | 56 | - d4be77f: Fix missing exit codes 57 | 58 | ## 1.2.1 59 | 60 | ### Patch Changes 61 | 62 | - 713e55f: Add missing --version flag 63 | 64 | ## 1.2.0 65 | 66 | ### Minor Changes 67 | 68 | - d9a5c3b: Print bisect action during bisect run 69 | 70 | ### Patch Changes 71 | 72 | - 831d1b7: Directly execute fnm instead of using PATH 73 | 74 | ## 1.1.4 75 | 76 | ### Patch Changes 77 | 78 | - 2069853: Fix node execution on Windows 79 | 80 | ## 1.1.3 81 | 82 | ### Patch Changes 83 | 84 | - c6bb829: Add extra logging for failed builds 85 | - 8203cd6: Ensure that longpaths are enabled when cloning on Windows 86 | 87 | ## 1.1.2 88 | 89 | ### Patch Changes 90 | 91 | - a491de0: Fix bin linking on Windows 92 | 93 | ## 1.1.1 94 | 95 | ### Patch Changes 96 | 97 | - 6e75119: Print a message when TS has been built successfully 98 | - 409dc01: Fix git bisect when repo isn't clean 99 | 100 | ## 1.1.0 101 | 102 | ### Minor Changes 103 | 104 | - be0ccf6: Add "every-ts dir" to get the repo dir for npm link 105 | 106 | ### Patch Changes 107 | 108 | - b6d28a9: Document "every-ts fetch" and ensure it builds 109 | 110 | ## 1.0.0 111 | 112 | ### Major Changes 113 | 114 | - e51e137: Initial release 115 | -------------------------------------------------------------------------------- /src/typescript.ts: -------------------------------------------------------------------------------- 1 | import { Command, Option } from "clipanion"; 2 | import { execa } from "execa"; 3 | 4 | import { BaseCommand, getPATHWithBinDir, tsDir } from "./common.js"; 5 | import { ensureBuilt, getPaths } from "./repo.js"; 6 | 7 | export class Tsc extends BaseCommand { 8 | static override paths: string[][] = [[`tsc`]]; 9 | 10 | static override usage = Command.Usage({ 11 | description: `Runs "tsc".`, 12 | }); 13 | 14 | args = Option.Proxy(); 15 | 16 | override async executeOrThrow(): Promise { 17 | await ensureBuilt(); 18 | const { tsc } = getPaths(); 19 | const result = await execa(`node`, [tsc, ...this.args], { stdio: `inherit`, reject: false }); 20 | return result.exitCode; 21 | } 22 | } 23 | 24 | export class Tsdk extends BaseCommand { 25 | static override paths: string[][] = [[`tsdk`]]; 26 | 27 | static override usage = Command.Usage({ 28 | description: `Gets the path for use with VS Code's "typescript.tsdk" option.`, 29 | }); 30 | 31 | args = Option.Proxy(); 32 | 33 | override async executeOrThrow(): Promise { 34 | await ensureBuilt(); 35 | const { baseDir } = getPaths(); 36 | console.log(`"typescript.tsdk": ${JSON.stringify(baseDir)}`); 37 | } 38 | } 39 | 40 | export class Exec extends BaseCommand { 41 | static override paths: string[][] = [[`exec`]]; 42 | 43 | static override usage = Command.Usage({ 44 | description: `Runs the provided command in with TypeScript's executables on PATH.`, 45 | }); 46 | 47 | args = Option.Proxy({ required: 1 }); 48 | 49 | override async executeOrThrow(): Promise { 50 | await ensureBuilt(); 51 | const result = await execa( 52 | this.args[0], 53 | this.args.slice(1), 54 | { stdio: `inherit`, reject: false, env: { PATH: getPATHWithBinDir() } }, 55 | ); 56 | return result.exitCode; 57 | } 58 | } 59 | 60 | export class Dir extends BaseCommand { 61 | static override paths: string[][] = [[`dir`]]; 62 | 63 | static override usage = Command.Usage({ 64 | description: `Gets the path to the TypeScript checkout, for use in "npm link", etc.`, 65 | }); 66 | 67 | override async executeOrThrow(): Promise { 68 | await ensureBuilt(); 69 | console.log(tsDir); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/common.ts: -------------------------------------------------------------------------------- 1 | import crypto from "node:crypto"; 2 | import fs from "node:fs"; 3 | import path from "node:path"; 4 | import url from "node:url"; 5 | 6 | import { Command } from "clipanion"; 7 | import { execa } from "execa"; 8 | 9 | const __filename = url.fileURLToPath(new URL(import.meta.url)); 10 | const __dirname = path.dirname(__filename); 11 | 12 | const packageRoot = path.resolve(__dirname, `..`); 13 | const dataDir = path.join(packageRoot, `.data`); 14 | export const tsDir = path.join(dataDir, `TypeScript`); 15 | export const fnmDir = path.join(dataDir, `fnm`); 16 | export const binDir = path.join(dataDir, `bin`); 17 | export const nodeModulesHashPath = path.join(dataDir, `node_modules.hash`); 18 | export const buildCommitHashPath = path.join(dataDir, `builtCommit.hash`); 19 | 20 | export function getPackageVersion() { 21 | return JSON.parse(fs.readFileSync(path.join(packageRoot, `package.json`), `utf8`)).version; 22 | } 23 | 24 | export function getPATHWithBinDir() { 25 | return `${binDir}${path.delimiter}${process.env[`PATH`]}`; 26 | } 27 | 28 | export async function tryStat(p: string) { 29 | try { 30 | return await fs.promises.stat(p); 31 | } catch { 32 | return undefined; 33 | } 34 | } 35 | 36 | export async function ensureDataDir() { 37 | await fs.promises.mkdir(dataDir, { recursive: true }); 38 | } 39 | 40 | export async function hashFile(p: string) { 41 | const contents = await fs.promises.readFile(p); 42 | return crypto.createHash(`sha256`).update(contents).digest(`hex`); 43 | } 44 | 45 | export function rimraf(p: fs.PathLike) { 46 | return fs.promises.rm(p, { recursive: true, force: true, maxRetries: process.platform === `win32` ? 10 : 0 }); 47 | } 48 | 49 | export class ExitError extends Error { 50 | constructor(message: string, public readonly exitCode = 1) { 51 | super(message); 52 | } 53 | } 54 | 55 | export abstract class BaseCommand extends Command { 56 | override async execute(): Promise { 57 | try { 58 | return await this.executeOrThrow(); 59 | } catch (e) { 60 | if (e instanceof ExitError) { 61 | this.context.stderr.write(`${e.message}\n`); 62 | return e.exitCode; 63 | } 64 | throw e; 65 | } 66 | } 67 | 68 | abstract executeOrThrow(): Promise; 69 | } 70 | 71 | export async function revParse(rev: string) { 72 | const { stdout } = await execa(`git`, [`rev-parse`, rev], { cwd: tsDir }); 73 | return stdout; 74 | } 75 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | 132 | 133 | .data/ 134 | -------------------------------------------------------------------------------- /src/fnm.ts: -------------------------------------------------------------------------------- 1 | import fs from "node:fs"; 2 | import path from "node:path"; 3 | 4 | import { execa, type Options as ExecaOptions } from "execa"; 5 | 6 | import { ensureDataDir, ExitError, fnmDir, tryStat } from "./common.js"; 7 | 8 | type FnmPlatform = "arm32" | "arm64" | "linux" | "macos" | "windows"; 9 | 10 | function getPlatform(): FnmPlatform { 11 | switch (process.platform) { 12 | case `win32`: 13 | return `windows`; 14 | case `darwin`: 15 | return `macos`; 16 | case `linux`: 17 | switch (process.arch) { 18 | case `arm`: 19 | return `arm32`; 20 | case `arm64`: 21 | return `arm64`; 22 | case `x64`: 23 | return `linux`; 24 | } 25 | } 26 | 27 | throw new ExitError(`Unsupported system ${process.platform} ${process.arch}`); 28 | } 29 | 30 | let fnmInstalled = false; 31 | 32 | const fnmExe = path.join(fnmDir, process.platform === `win32` ? `fnm.exe` : `fnm`); 33 | 34 | export async function ensureFnm() { 35 | if (fnmInstalled) { 36 | return; 37 | } 38 | 39 | await ensureDataDir(); 40 | const stat = await tryStat(fnmDir); 41 | if (stat?.isDirectory()) { 42 | return; 43 | } 44 | 45 | console.log(`Downloading fnm...`); 46 | const url = `https://github.com/Schniz/fnm/releases/latest/download/fnm-${getPlatform()}.zip`; 47 | const response = await fetch(url); 48 | const buffer = await response.arrayBuffer(); 49 | 50 | const AdmZip = (await import(`adm-zip`)).default; 51 | const zip = new AdmZip(Buffer.from(buffer)); 52 | 53 | await new Promise((resolve, reject) => { 54 | zip.extractAllToAsync(fnmDir, undefined, undefined, (error) => { 55 | if (error) { 56 | reject(error); 57 | } else { 58 | resolve(); 59 | } 60 | }); 61 | }); 62 | 63 | if (process.platform !== `win32`) { 64 | await fs.promises.chmod(fnmExe, 0o755); 65 | } 66 | 67 | fnmInstalled = true; 68 | console.log(`fnm installed`); 69 | } 70 | 71 | const installedNode = new Set(); 72 | 73 | export async function runInNode(version: string, command: string[], opts?: ExecaOptions) { 74 | await ensureFnm(); 75 | if (!installedNode.has(version)) { 76 | await execa(fnmExe, [`install`, version], { env: { FNM_DIR: fnmDir } }); 77 | installedNode.add(version); 78 | } 79 | 80 | return run(command, opts); 81 | 82 | function run(command: string[], opts?: ExecaOptions) { 83 | return execa( 84 | fnmExe, 85 | [`exec`, `--using=${version}`, `--`, ...command], 86 | { 87 | ...opts, 88 | env: { ...opts?.env, FNM_DIR: fnmDir }, 89 | }, 90 | ); 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # every-ts 2 | 3 | [![npm](https://img.shields.io/npm/v/every-ts.svg)](https://npmjs.com/package/every-ts) 4 | [![node](https://img.shields.io/node/v/every-ts.svg)](https://nodejs.org) 5 | 6 | ```console 7 | $ npm install -g every-ts 8 | $ every-ts 9 | ``` 10 | 11 | `every-ts` is a utility that can build _any_ version of TypeScript. Yes, that's 12 | right, any version, any commit, even main, v1.0.3, or in between. (If it breaks, 13 | let me know!) 14 | 15 | `every-ts` can also be used to bisect TypeScript, without needing to know 16 | anything about TypeScript's build process. 17 | 18 | This repo works by making a 19 | ["blobless" clone](https://github.blog/2020-12-21-get-up-to-speed-with-partial-clone-and-shallow-clone/) 20 | of TypeScript (to save time and space), switching to the desired version, and 21 | building it. The way to build TypeScript has changed over the years (even places 22 | which don't build with modern Node!), and `every-ts` knows how to build any of 23 | them. 24 | 25 | ## Switching versions 26 | 27 | To switch versions, use `every-ts switch `. This rev can be anything that 28 | `git` accepts. If `` isn't found, `origin/`, `origin/release-`, 29 | and `v` will also be tried. You may also pass in a `-dev` version, which 30 | will be resolved to the commit that generated that nightly build. 31 | 32 | ```console 33 | $ every-ts switch main # Switches to `origin/main` 34 | $ every-ts switch release-2.7 # Switches to `origin/release-2.7` 35 | $ every-ts switch 1.8 # Switches to `origin/release-1.8` 36 | $ every-ts switch 1.8~100 # Switches 100 commits before `origin/release-1.8` 37 | $ every-ts switch v1.1 # Switches the tag `v1.1` 38 | $ every-ts switch 5.3.0-dev.20231001 # Switches to the 20231001 nightly build 39 | ``` 40 | 41 | ## Fetching new changes 42 | 43 | To fetch the latest repo information, run `every-ts fetch`. 44 | 45 | ## Running `tsc` 46 | 47 | To invoke `tsc`, run `every-ts tsc`: 48 | 49 | ```console 50 | $ every-ts switch main 51 | $ every-ts tsc 52 | Version 5.3.0-dev 53 | $ every-ts switch 1.8~100 54 | $ every-ts tsc --version 55 | Version 1.8.0 56 | $ every-ts switch v1.1 57 | $ every-ts tsc --version 58 | message TS6029: Version 1.1.0.0 59 | ``` 60 | 61 | Alternatively, you can use `every-ts exec` to run commands in an environment 62 | with `tsc` on `PATH`: 63 | 64 | ```console 65 | $ every-ts switch main 66 | $ every-ts exec tsc --version 67 | Version 5.3.0-dev 68 | $ every-ts exec tsc -p ./path/to/tsconfig.json 69 | ``` 70 | 71 | You can also link TypeScript into your package: 72 | 73 | ```console 74 | $ every-ts dir 75 | /home/jake/every-ts/.data/TypeScript 76 | $ npm link $(every-ts dir) 77 | ``` 78 | 79 | ## Using with VS Code 80 | 81 | To get a working path to use with VS Code, run `every-ts tsdk` to get the option 82 | to add to `settings.json`: 83 | 84 | ```console 85 | $ every-ts tsdk 86 | "typescript.tsdk": "/home/jabaile/work/every-ts/.data/TypeScript/lib" 87 | ``` 88 | 89 | Remember, you still need to use the "Select TypeScript Version" command to make 90 | this active. The setting itself is not enough. 91 | 92 | ## Bisecting 93 | 94 | `every-ts` wraps `git bisect`, building TypeScript automatically. To use it, run 95 | `every-ts bisect` just like you would `git bisect`: 96 | 97 | ```console 98 | $ every-ts bisect start 99 | status: waiting for both good and bad commits 100 | $ every-ts bisect bad 5.3.0-dev.20231001 101 | status: waiting for good commit(s), bad commit known 102 | $ every-ts bisect good v5.1.6 103 | Bisecting: a merge base must be tested 104 | [0aa49c152d37f97e16ad3d166701d0f7166a635e] Update package-lock.json 105 | $ every-ts tsc --version 106 | Version 5.1.0-dev 107 | # Do something with `every-ts tsc`... 108 | $ every-ts bisect good 109 | $ every-ts bisect bad 110 | $ every-ts bisect bad 111 | # ... 112 | $ every-ts bisect good 113 | $ every-ts bisect bad 114 | 607d96f6dfc6dc557fa370d8ae86f5191608ec91 is the first bad commit 115 | commit 607d96f6dfc6dc557fa370d8ae86f5191608ec91 116 | Author: Jake Bailey <5341706+jakebailey@users.noreply.github.com> 117 | Date: Thu Aug 3 15:53:30 2023 -0700 118 | 119 | Improve performance of maybe stack in recursiveTypeRelatedTo (#55224) 120 | $ every-ts bisect reset 121 | ``` 122 | 123 | `bisect run` is also supported. The executed command will have TypeScript's bin 124 | directory prepended to the path, so you can run `tsc` directly: 125 | 126 | ```console 127 | $ every-ts bisect start 128 | status: waiting for both good and bad commits 129 | $ every-ts bisect new v5.0.3 130 | status: waiting for good commit(s), bad commit known 131 | $ every-ts bisect old v4.9.4 132 | Bisecting: a merge base must be tested 133 | [0aa49c152d37f97e16ad3d166701d0f7166a635e] Update package-lock.json 134 | $ every-ts bisect run tsc --version 135 | ``` 136 | 137 | For more info on `git bisect`, see the 138 | [git docs](https://git-scm.com/docs/git-bisect). 139 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | import eslint from "@eslint/js"; 3 | import eslintPluginSimpleImportSort from "eslint-plugin-simple-import-sort"; 4 | import eslintPluginUnicorn from "eslint-plugin-unicorn"; 5 | import globals from "globals"; 6 | import tseslint from "typescript-eslint"; 7 | 8 | export default tseslint.config( 9 | { 10 | files: ["**/*.{ts,tsx,cts,mts,js,cjs,mjs}"], 11 | }, 12 | { 13 | ignores: [ 14 | "**/dist/**", 15 | "**/node_modules/**", 16 | "bin/**", 17 | "coverage/**", 18 | ], 19 | }, 20 | eslint.configs.recommended, 21 | ...tseslint.configs.recommendedTypeChecked, 22 | ...tseslint.configs.stylistic, 23 | eslintPluginUnicorn.configs["flat/recommended"], 24 | { 25 | languageOptions: { 26 | parserOptions: { 27 | warnOnUnsupportedTypeScriptVersion: false, 28 | ecmaVersion: "latest", 29 | sourceType: "module", 30 | project: true, 31 | }, 32 | globals: globals.node, 33 | }, 34 | plugins: { 35 | "simple-import-sort": eslintPluginSimpleImportSort, 36 | }, 37 | }, 38 | { 39 | "rules": { 40 | "eqeqeq": "error", 41 | "no-constant-condition": "off", 42 | "no-inner-declarations": "off", 43 | "no-undef": "off", 44 | "no-unused-vars": "off", 45 | "no-empty": "off", 46 | "simple-import-sort/imports": "error", 47 | "simple-import-sort/exports": "error", 48 | "@typescript-eslint/no-import-type-side-effects": "error", 49 | // In theory good, but less good when declaring a new interface and 50 | // stopping to think about its contents. 51 | "@typescript-eslint/no-empty-interface": "off", 52 | "@typescript-eslint/no-namespace": "off", 53 | "@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" }], 54 | "@typescript-eslint/no-use-before-define": "off", 55 | "@typescript-eslint/no-explicit-any": "off", 56 | "@typescript-eslint/no-unsafe-argument": "off", 57 | "@typescript-eslint/no-unsafe-assignment": "off", 58 | "@typescript-eslint/no-unsafe-call": "off", 59 | "@typescript-eslint/no-unsafe-member-access": "off", 60 | "@typescript-eslint/no-unsafe-return": "off", 61 | "@typescript-eslint/no-empty-object-type": "off", 62 | "@typescript-eslint/require-await": "off", 63 | "@typescript-eslint/restrict-template-expressions": "off", 64 | "@typescript-eslint/naming-convention": [ 65 | "error", 66 | { 67 | "selector": [ 68 | "classProperty", 69 | "typeProperty", 70 | "parameterProperty", 71 | "classMethod", 72 | "typeMethod", 73 | "accessor", 74 | ], 75 | "modifiers": ["private"], 76 | "leadingUnderscore": "require", 77 | "format": ["camelCase"], 78 | "filter": { 79 | "regex": "^(test_| )", 80 | "match": false, 81 | }, 82 | }, 83 | { 84 | "selector": [ 85 | "classProperty", 86 | "typeProperty", 87 | "parameterProperty", 88 | "classMethod", 89 | "typeMethod", 90 | "accessor", 91 | ], 92 | "modifiers": ["protected"], 93 | "leadingUnderscore": "allow", 94 | "format": ["camelCase"], 95 | "filter": { 96 | "regex": "^(test_| )", 97 | "match": false, 98 | }, 99 | }, 100 | { 101 | "selector": [ 102 | "classProperty", 103 | "typeProperty", 104 | "parameterProperty", 105 | "classMethod", 106 | "typeMethod", 107 | "accessor", 108 | ], 109 | "modifiers": ["public"], 110 | "leadingUnderscore": "forbid", 111 | "format": ["camelCase"], 112 | "filter": { 113 | "regex": "^(test_| )", 114 | "match": false, 115 | }, 116 | }, 117 | ], 118 | "unicorn/catch-error-name": "off", 119 | "unicorn/filename-case": "off", 120 | "unicorn/no-array-callback-reference": "off", 121 | "unicorn/no-await-expression-member": "off", 122 | "unicorn/no-useless-undefined": "off", 123 | "unicorn/prefer-top-level-await": "off", // Reenable once Node 12 is dropped. 124 | "unicorn/prevent-abbreviations": "off", 125 | "unicorn/switch-case-braces": "off", 126 | "unicorn/prefer-string-replace-all": "off", // Bad suggestion for old targets 127 | }, 128 | }, 129 | { 130 | files: [ 131 | ".ncurc.cjs", 132 | "eslint.config.mjs", 133 | ], 134 | extends: [tseslint.configs.disableTypeChecked], 135 | }, 136 | ); 137 | -------------------------------------------------------------------------------- /src/repo.ts: -------------------------------------------------------------------------------- 1 | import fs from "node:fs"; 2 | import path from "node:path"; 3 | 4 | import cmdShim from "@zkochan/cmd-shim"; 5 | import { execa } from "execa"; 6 | 7 | import { 8 | binDir, 9 | buildCommitHashPath, 10 | ExitError, 11 | hashFile, 12 | nodeModulesHashPath, 13 | revParse, 14 | rimraf, 15 | tsDir, 16 | } from "./common.js"; 17 | import { runInNode } from "./fnm.js"; 18 | import { ensureRepo, resetTypeScript } from "./git.js"; 19 | 20 | function getExecutableName(name: string) { 21 | if (process.platform === `win32`) { 22 | // Workaround for https://github.com/Schniz/fnm/issues/1054 23 | return `${name}.cmd`; 24 | } 25 | return name; 26 | } 27 | 28 | async function getBuildCommand() { 29 | const dir = await fs.promises.readdir(tsDir); 30 | let name; 31 | if (dir.some((v) => v.includes(`Herebyfile`))) { 32 | name = `hereby`; 33 | } else if (dir.some((v) => v.includes(`Jakefile`))) { 34 | name = `jake`; 35 | } else if (dir.some((v) => v.includes(`Gulpfile`))) { 36 | name = `gulp`; 37 | } else { 38 | throw new ExitError(`build command unknown`); 39 | } 40 | 41 | return path.join(`node_modules`, `.bin`, getExecutableName(name)); 42 | } 43 | 44 | async function getCommitDate() { 45 | const { stdout } = await execa(`git`, [`log`, `-1`, `--format=%cI`], { cwd: tsDir }); 46 | return stdout; 47 | } 48 | 49 | function hasPackageLock() { 50 | return fs.existsSync(path.join(tsDir, `package-lock.json`)); 51 | } 52 | 53 | async function getPackageManagerCommand() { 54 | const packageJsonContents = await fs.promises.readFile(path.join(tsDir, `package.json`), `utf8`); 55 | const packageJson = JSON.parse(packageJsonContents); 56 | const packageManager = packageJson?.packageManager; 57 | if (packageManager) { 58 | return [getExecutableName(`npx`), packageManager]; 59 | } 60 | return [getExecutableName(`npm`)]; 61 | } 62 | 63 | async function tryInstall() { 64 | const packageManagerCommand = await getPackageManagerCommand(); 65 | 66 | if (hasPackageLock()) { 67 | let oldHash: string; 68 | try { 69 | oldHash = await fs.promises.readFile(nodeModulesHashPath, `utf8`); 70 | } catch { 71 | oldHash = ``; 72 | } 73 | 74 | const newHash = await hashFile(path.join(tsDir, `package-lock.json`)); 75 | if (oldHash === newHash) { 76 | return; 77 | } 78 | 79 | // TODO: remember previous package-lock.json hash and skip? 80 | try { 81 | await runInNode(`20`, [...packageManagerCommand, `ci`], { cwd: tsDir }); 82 | await fs.promises.writeFile(nodeModulesHashPath, newHash, `utf8`); 83 | return; 84 | } catch {} 85 | } 86 | 87 | await rimraf(nodeModulesHashPath); 88 | await rimraf(path.join(tsDir, `node_modules`)); 89 | const commitDate = await getCommitDate(); 90 | await runInNode(`20`, [...packageManagerCommand, `install`, `--before=${commitDate}`], { cwd: tsDir }); 91 | } 92 | 93 | const badLocales = [ 94 | [/pt-BR/g, `pt-BR`, `pt-br`], 95 | [/zh-CN/g, `zh-CN`, `zh-cn`], 96 | [/zh-TW/g, `zh-TW`, `zh-tw`], 97 | ] as const; 98 | 99 | async function fixBuild() { 100 | // Early builds of TS were produced on a case-insensitive file system; confusingly 101 | // the input and output files plus the build config were inconsistent, so we need 102 | // to fix them up. 103 | // Not including Gulpfile.mjs; the problem was fixed before that was added. 104 | for (const file of [`Jakefile.js`, `Gulpfile.ts`, `Gulpfile.js`]) { 105 | const p = path.join(tsDir, file); 106 | if (!fs.existsSync(p)) { 107 | continue; 108 | } 109 | let contents = await fs.promises.readFile(p, `utf8`); 110 | for (const [re, bad, good] of badLocales) { 111 | contents = contents.replace(re, good); 112 | await rimraf(path.join(tsDir, `lib`, bad)); 113 | } 114 | await fs.promises.writeFile(p, contents, `utf8`); 115 | } 116 | } 117 | 118 | const buildFuncs = [ 119 | async () => { 120 | const buildCommand = await getBuildCommand(); 121 | await runInNode(`20`, [buildCommand, `local`], { cwd: tsDir }); 122 | await runInNode(`20`, [buildCommand, `LKG`], { cwd: tsDir }); 123 | }, 124 | async () => { 125 | const buildCommand = await getBuildCommand(); 126 | await runInNode(`8`, [buildCommand, `local`], { cwd: tsDir }); 127 | await runInNode(`8`, [buildCommand, `LKG`], { cwd: tsDir }); 128 | }, 129 | ]; 130 | 131 | async function tryBuildFns() { 132 | let lastError: unknown; 133 | for (const fn of buildFuncs) { 134 | try { 135 | try { 136 | await resetTypeScript(`node_modules`, `built`); 137 | await fixBuild(); 138 | await fn(); 139 | return; 140 | } catch (e) { 141 | lastError = e; 142 | } 143 | 144 | await resetTypeScript(`node_modules`); 145 | await fixBuild(); 146 | await fn(); 147 | return; 148 | } catch (e) { 149 | lastError = e; 150 | } 151 | } 152 | throw lastError; 153 | } 154 | 155 | async function ensureBuiltWorker() { 156 | const { stdout: commitHash } = await execa(`git`, [`rev-parse`, `HEAD`], { cwd: tsDir }); 157 | try { 158 | const contents = await fs.promises.readFile(buildCommitHashPath, `utf8`); 159 | if (contents === commitHash) { 160 | return false; 161 | } 162 | } catch { 163 | await rimraf(buildCommitHashPath); 164 | } 165 | 166 | console.log(`Building TypeScript...`); 167 | 168 | let succeeded = false; 169 | try { 170 | if (!hasPackageLock() && fs.existsSync(path.join(tsDir, `node_modules`))) { 171 | try { 172 | await tryBuildFns(); 173 | succeeded = true; 174 | return true; 175 | } catch { 176 | // ignore 177 | } 178 | } 179 | 180 | await tryInstall(); 181 | await tryBuildFns(); 182 | succeeded = true; 183 | return true; 184 | } finally { 185 | if (succeeded) { 186 | await fs.promises.writeFile(buildCommitHashPath, commitHash, `utf8`); 187 | } 188 | } 189 | } 190 | 191 | // TODO: maintain a file with the last commit hash that was built, like the package-lock.json hash 192 | export async function ensureBuilt() { 193 | await ensureRepo(); 194 | try { 195 | const didBuild = await ensureBuiltWorker(); 196 | if (didBuild) { 197 | const paths = getPaths(); 198 | await execa(`node`, [paths.tsc, `--version`], { stdout: `ignore` }); // TODO: needed? 199 | 200 | await rimraf(binDir); 201 | await fs.promises.mkdir(binDir, { recursive: true }); 202 | const tscBin = path.join(binDir, `tsc`); 203 | const tsserverBin = path.join(binDir, `tsserver`); 204 | 205 | await cmdShim.ifExists(paths.tsc, tscBin); 206 | await cmdShim.ifExists(paths.tsserver, tsserverBin); 207 | console.log(`TypeScript built successfully!`); 208 | } 209 | } catch (e) { 210 | console.error(e); 211 | throw new ExitError(`Unable to build typescript at rev ${await revParse(`HEAD`)}; please file a bug!`); 212 | } 213 | } 214 | 215 | export function getPaths() { 216 | const baseDir = fs.existsSync(path.join(tsDir, `lib`, `tsc.js`)) 217 | ? path.join(tsDir, `lib`) 218 | : path.join(tsDir, `bin`); 219 | 220 | return { 221 | baseDir, 222 | tsc: path.join(baseDir, `tsc.js`), 223 | tsserver: path.join(baseDir, `tsserver.js`), 224 | }; 225 | } 226 | -------------------------------------------------------------------------------- /src/git.ts: -------------------------------------------------------------------------------- 1 | import fs from "node:fs"; 2 | 3 | import { Command, Option } from "clipanion"; 4 | import { execa } from "execa"; 5 | import semver from "semver"; 6 | 7 | import { 8 | BaseCommand, 9 | buildCommitHashPath, 10 | ensureDataDir, 11 | ExitError, 12 | getPATHWithBinDir, 13 | nodeModulesHashPath, 14 | revParse, 15 | rimraf, 16 | tryStat, 17 | tsDir, 18 | } from "./common.js"; 19 | import { ensureBuilt } from "./repo.js"; 20 | 21 | const actionsAcceptingRevs = new Set([`start`, `bad`, `good`, `new`, `old`, `skip`]); 22 | const actionsWithSideEffects = new Set([`reset`, `replay`, ...actionsAcceptingRevs]); 23 | 24 | export class Bisect extends BaseCommand { 25 | static override paths = [[`bisect`]]; 26 | 27 | static override usage = Command.Usage({ 28 | description: `Wraps "git bisect".`, 29 | }); 30 | 31 | subcommand = Option.String({ required: true }); 32 | args = Option.Proxy(); 33 | 34 | override async executeOrThrow(): Promise { 35 | await ensureRepo(); 36 | 37 | let startArgs: string[] = []; 38 | let revs: string[] | undefined; 39 | let endArgs: string[] = []; 40 | 41 | const dashDashIndex = this.args.indexOf(`--`); 42 | if (this.subcommand === `start` && dashDashIndex !== -1) { 43 | endArgs = this.args.slice(dashDashIndex); 44 | revs = this.args.slice(0, dashDashIndex); 45 | const nonFlagIndex = revs.findIndex((v) => !v.startsWith(`--`)); 46 | if (nonFlagIndex !== -1) { 47 | startArgs = revs.slice(0, nonFlagIndex); 48 | revs = revs.slice(nonFlagIndex); 49 | } 50 | } else { 51 | revs = [...this.args]; 52 | } 53 | 54 | if (actionsAcceptingRevs.has(this.subcommand)) { 55 | revs = await Promise.all(revs.map((r) => findRev(r))); 56 | } 57 | 58 | let shouldReset = false; 59 | const bisectInfo = await getBisectInfo(); 60 | 61 | if (this.subcommand === `reset`) { 62 | shouldReset = true; 63 | } else if (this.subcommand === `start` && revs.length >= 2) { 64 | shouldReset = true; 65 | } else if (bisectInfo?.terms.size === 2) { 66 | shouldReset = true; 67 | } else { 68 | if ( 69 | bisectInfo 70 | && actionsWithSideEffects.has(this.subcommand) 71 | && !bisectInfo.terms.has(this.subcommand) 72 | && bisectInfo.terms.size === 1 73 | ) { 74 | shouldReset = true; 75 | } 76 | } 77 | 78 | if (shouldReset) { 79 | await resetTypeScript(`node_modules`, `built`); 80 | } 81 | 82 | const result = await execa( 83 | `git`, 84 | [`bisect`, this.subcommand, ...startArgs, ...revs, ...endArgs], 85 | { cwd: tsDir, stdio: `inherit`, reject: false }, 86 | ); 87 | if (result.exitCode !== 0) { 88 | return result.exitCode; 89 | } 90 | await ensureBuilt(); 91 | } 92 | } 93 | 94 | async function getBisectInfo() { 95 | try { 96 | const { stdout } = await execa(`git`, [`bisect`, `log`], { cwd: tsDir }); 97 | const lines = stdout.split(/\r?\n/); 98 | const done = lines.some((v) => v.startsWith(`# first `)); 99 | // Info lines look like "# bad: ...", "# good: ...", "# skip: ...", "# new: ...", "# old: ...", "# status: ..." 100 | const terms = new Set( 101 | lines 102 | .filter((v) => v.startsWith(`# `)) 103 | .map((v) => v.split(` `)[1].slice(0, -1)) 104 | .filter((v) => v !== `status` && v !== `skip`), 105 | ); 106 | return { done, terms }; 107 | } catch { 108 | return undefined; 109 | } 110 | } 111 | 112 | export class BisectRun extends BaseCommand { 113 | static override paths = [[`bisect`, `run`]]; 114 | 115 | static override usage = Command.Usage({ 116 | description: `Wraps "git bisect run".`, 117 | }); 118 | 119 | args = Option.Proxy({ required: 1 }); 120 | 121 | override async executeOrThrow(): Promise { 122 | await ensureRepo(); 123 | 124 | if (!await getBisectInfo()) { 125 | throw new ExitError(`Not bisecting`); 126 | } 127 | 128 | const { stdout: termGood } = await execa(`git`, [`bisect`, `terms`, `--term-good`], { cwd: tsDir }); 129 | const { stdout: termBad } = await execa(`git`, [`bisect`, `terms`, `--term-bad`], { cwd: tsDir }); 130 | 131 | while (!(await getBisectInfo())?.done) { 132 | await resetTypeScript(`node_modules`, `built`); 133 | await ensureBuilt(); 134 | 135 | const result = await execa( 136 | this.args[0], 137 | this.args.slice(1), 138 | { stdio: `inherit`, reject: false, env: { PATH: getPATHWithBinDir() } }, 139 | ); 140 | await resetTypeScript(`node_modules`, `built`); 141 | 142 | let bResult; 143 | if (result.exitCode === 0) { 144 | console.log(`git bisect ${termGood}`); 145 | bResult = await execa(`git`, [`bisect`, termGood], { cwd: tsDir, stdio: `inherit`, reject: false }); 146 | } else if (result.exitCode === 125) { 147 | console.log(`git bisect skip`); 148 | bResult = await execa(`git`, [`bisect`, `skip`], { cwd: tsDir, stdio: `inherit`, reject: false }); 149 | } else if (result.exitCode && result.exitCode < 128) { 150 | console.log(`git bisect ${termBad}`); 151 | bResult = await execa(`git`, [`bisect`, termBad], { cwd: tsDir, stdio: `inherit`, reject: false }); 152 | } else { 153 | // eslint-disable-next-line @typescript-eslint/only-throw-error 154 | throw result; 155 | } 156 | 157 | if (bResult.exitCode !== 0) { 158 | return bResult.exitCode; 159 | } 160 | } 161 | } 162 | } 163 | 164 | export class Switch extends BaseCommand { 165 | static override paths = [[`switch`], [`checkout`], [`clone`], Command.Default]; 166 | 167 | static override usage = Command.Usage({ 168 | description: `Switches to the provided rev and builds it.`, 169 | }); 170 | 171 | rev = Option.String({ required: false }); 172 | 173 | override async executeOrThrow(): Promise { 174 | await ensureRepo(); 175 | 176 | const target = await findRev(this.rev ?? `main`, true); 177 | if (fs.existsSync(buildCommitHashPath)) { 178 | const current = await revParse(`HEAD`); 179 | 180 | if (current === target) { 181 | return; 182 | } 183 | } 184 | 185 | await resetTypeScript(`node_modules`, `built`); 186 | const result = await execa(`git`, [`switch`, `--detach`, target], { 187 | cwd: tsDir, 188 | stdio: `inherit`, 189 | reject: false, 190 | }); 191 | if (result.exitCode !== 0) { 192 | return result.exitCode; 193 | } 194 | await ensureBuilt(); 195 | } 196 | } 197 | 198 | export class Fetch extends BaseCommand { 199 | static override paths = [[`fetch`]]; 200 | 201 | static override usage = Command.Usage({ 202 | description: `Fetches the latest info for the TypeScript checkout.`, 203 | }); 204 | 205 | override async executeOrThrow(): Promise { 206 | await ensureRepo(); 207 | await execa(`git`, [`fetch`, `--all`, `--tags`, `--update-head-ok`], { cwd: tsDir }); 208 | 209 | // Attempt to fast forward all branches. 210 | // https://stackoverflow.com/a/24451300 211 | const { stdout: currentBranch } = await execa(`git`, [`rev-parse`, `--abbrev-ref`, `HEAD`], { cwd: tsDir }); 212 | const { stdout: branches } = await execa(`git`, [`for-each-ref`, `refs/heads`, `--format=%(refname:short)`], { 213 | cwd: tsDir, 214 | }); 215 | 216 | for (const branch of branches.split(/\r?\n/)) { 217 | let { stdout: originBranch } = await execa(`git`, [`config`, `--get`, `branch.${branch}.merge`], { 218 | cwd: tsDir, 219 | }); 220 | originBranch = originBranch.slice(`refs/heads/`.length); 221 | // eslint-disable-next-line unicorn/prefer-ternary 222 | if (branch === currentBranch) { 223 | await execa(`git`, [`merge`, `--ff-only`, `origin/${originBranch}`], { cwd: tsDir }); 224 | } else { 225 | await execa(`git`, [`fetch`, `.`, `origin/${originBranch}:${branch}`], { cwd: tsDir }); 226 | } 227 | } 228 | 229 | // This will usually be a noop, but if this is what's used to fetch the first time, 230 | // it will be unbuilt which is less than good. 231 | await ensureBuilt(); 232 | } 233 | } 234 | 235 | let repoCloned = false; 236 | 237 | export async function ensureRepo() { 238 | if (repoCloned) { 239 | return; 240 | } 241 | 242 | await ensureDataDir(); 243 | const stat = await tryStat(tsDir); 244 | if (!stat?.isDirectory()) { 245 | console.log(`Cloning TypeScript; this may take a bit...`); 246 | const args = [`clone`, `--filter=blob:none`]; 247 | if (process.platform === `win32`) { 248 | args.push(`-c`, `core.longpaths=true`); 249 | } 250 | args.push(`https://github.com/microsoft/TypeScript.git`, tsDir); 251 | await execa(`git`, args, { stdio: `inherit` }); 252 | } 253 | 254 | repoCloned = true; 255 | } 256 | 257 | export async function resetTypeScript(...keep: string[]) { 258 | const excludes = []; 259 | for (const exclude of keep) { 260 | excludes.push(`-e`, exclude); 261 | } 262 | await execa(`git`, [`clean`, `-fdx`, ...excludes], { cwd: tsDir }); 263 | await execa(`git`, [`reset`, `--hard`, `HEAD`], { cwd: tsDir }); 264 | 265 | if (!keep?.includes(`node_modules`)) { 266 | await rimraf(nodeModulesHashPath); 267 | } 268 | await rimraf(buildCommitHashPath); 269 | } 270 | 271 | async function findRev(rev: string, toHash = false) { 272 | const candidates = [ 273 | `origin/${rev}`, 274 | `release-${rev}`, 275 | `origin/release-${rev}`, 276 | `v${rev}`, 277 | rev, // Try this last, so we refer to newer fetched revs first. 278 | ]; 279 | 280 | for (const candidate of candidates) { 281 | try { 282 | const hash = await revParse(candidate); 283 | if (toHash) { 284 | return hash; 285 | } 286 | if (rev !== candidate) { 287 | console.log(`Resolved ${rev} to ${candidate}`); 288 | } 289 | return candidate; 290 | } catch { 291 | // ignore 292 | } 293 | } 294 | 295 | if (rev.includes(`-dev.`)) { 296 | const version = semver.parse(rev)?.format(); 297 | if (version) { 298 | const response = await fetch(`https://registry.npmjs.org/typescript/${version}`); 299 | if (response.ok) { 300 | const { gitHead } = (await response.json()) as { gitHead?: string; }; 301 | if (gitHead) { 302 | console.log(`Resolved ${rev} to ${gitHead}`); 303 | return gitHead; 304 | } else { 305 | console.error(`${version} is too old to have commit metadata and cannot be resolved`); 306 | } 307 | } 308 | } 309 | } 310 | 311 | throw new ExitError(`Could not find ${rev}`); 312 | } 313 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@zkochan/cmd-shim': 12 | specifier: ^7.0.0 13 | version: 7.0.0 14 | adm-zip: 15 | specifier: ^0.5.16 16 | version: 0.5.16 17 | clipanion: 18 | specifier: 4.0.0-rc.4 19 | version: 4.0.0-rc.4(typanion@3.14.0) 20 | execa: 21 | specifier: ^9.6.1 22 | version: 9.6.1 23 | semver: 24 | specifier: ^7.7.3 25 | version: 7.7.3 26 | devDependencies: 27 | '@changesets/cli': 28 | specifier: ^2.29.8 29 | version: 2.29.8(@types/node@18.19.130) 30 | '@eslint/js': 31 | specifier: ^9.39.1 32 | version: 9.39.1 33 | '@tsconfig/node18': 34 | specifier: ^18.2.6 35 | version: 18.2.6 36 | '@types/adm-zip': 37 | specifier: ^0.5.7 38 | version: 0.5.7 39 | '@types/node': 40 | specifier: ^18.19.130 41 | version: 18.19.130 42 | '@types/semver': 43 | specifier: ^7.7.1 44 | version: 7.7.1 45 | dprint: 46 | specifier: ^0.50.2 47 | version: 0.50.2 48 | eslint: 49 | specifier: ^9.39.1 50 | version: 9.39.1 51 | eslint-plugin-simple-import-sort: 52 | specifier: ^12.1.1 53 | version: 12.1.1(eslint@9.39.1) 54 | eslint-plugin-unicorn: 55 | specifier: ^62.0.0 56 | version: 62.0.0(eslint@9.39.1) 57 | globals: 58 | specifier: ^16.5.0 59 | version: 16.5.0 60 | rimraf: 61 | specifier: ^6.1.2 62 | version: 6.1.2 63 | typescript: 64 | specifier: ^5.9.3 65 | version: 5.9.3 66 | typescript-eslint: 67 | specifier: ^8.48.1 68 | version: 8.48.1(eslint@9.39.1)(typescript@5.9.3) 69 | 70 | packages: 71 | 72 | '@babel/helper-validator-identifier@7.28.5': 73 | resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 74 | engines: {node: '>=6.9.0'} 75 | 76 | '@babel/runtime@7.28.4': 77 | resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} 78 | engines: {node: '>=6.9.0'} 79 | 80 | '@changesets/apply-release-plan@7.0.14': 81 | resolution: {integrity: sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==} 82 | 83 | '@changesets/assemble-release-plan@6.0.9': 84 | resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} 85 | 86 | '@changesets/changelog-git@0.2.1': 87 | resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} 88 | 89 | '@changesets/cli@2.29.8': 90 | resolution: {integrity: sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA==} 91 | hasBin: true 92 | 93 | '@changesets/config@3.1.2': 94 | resolution: {integrity: sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog==} 95 | 96 | '@changesets/errors@0.2.0': 97 | resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} 98 | 99 | '@changesets/get-dependents-graph@2.1.3': 100 | resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} 101 | 102 | '@changesets/get-release-plan@4.0.14': 103 | resolution: {integrity: sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g==} 104 | 105 | '@changesets/get-version-range-type@0.4.0': 106 | resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} 107 | 108 | '@changesets/git@3.0.4': 109 | resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} 110 | 111 | '@changesets/logger@0.1.1': 112 | resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} 113 | 114 | '@changesets/parse@0.4.2': 115 | resolution: {integrity: sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==} 116 | 117 | '@changesets/pre@2.0.2': 118 | resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} 119 | 120 | '@changesets/read@0.6.6': 121 | resolution: {integrity: sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==} 122 | 123 | '@changesets/should-skip-package@0.1.2': 124 | resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} 125 | 126 | '@changesets/types@4.1.0': 127 | resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} 128 | 129 | '@changesets/types@6.1.0': 130 | resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} 131 | 132 | '@changesets/write@0.4.0': 133 | resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} 134 | 135 | '@dprint/darwin-arm64@0.50.2': 136 | resolution: {integrity: sha512-4d08INZlTxbPW9LK9W8+93viN543/qA2Kxn4azVnPW/xCb2Im03UqJBz8mMm3nJZdtNnK3uTVG3ib1VW+XJisw==} 137 | cpu: [arm64] 138 | os: [darwin] 139 | 140 | '@dprint/darwin-x64@0.50.2': 141 | resolution: {integrity: sha512-ZXWPBwdLojhdBATq+bKwJvB7D8bIzrD6eR/Xuq9UYE7evQazUiR069d9NPF0iVuzTo6wNf9ub9SXI7qDl11EGA==} 142 | cpu: [x64] 143 | os: [darwin] 144 | 145 | '@dprint/linux-arm64-glibc@0.50.2': 146 | resolution: {integrity: sha512-marxQzRw8atXAnaawwZHeeUaaAVewrGTlFKKcDASGyjPBhc23J5fHPUPremm8xCbgYZyTlokzrV8/1rDRWhJcw==} 147 | cpu: [arm64] 148 | os: [linux] 149 | 150 | '@dprint/linux-arm64-musl@0.50.2': 151 | resolution: {integrity: sha512-oGDq44ydzo0ZkJk6RHcUzUN5sOMT5HC6WA8kHXI6tkAsLUkaLO2DzZFfW4aAYZUn+hYNpQfQD8iGew0sjkyLyg==} 152 | cpu: [arm64] 153 | os: [linux] 154 | 155 | '@dprint/linux-riscv64-glibc@0.50.2': 156 | resolution: {integrity: sha512-QMmZoZYWsXezDcC03fBOwPfxhTpPEyHqutcgJ0oauN9QcSXGji9NSZITMmtLz2Ki3T1MIvdaLd1goGzNSvNqTQ==} 157 | cpu: [riscv64] 158 | os: [linux] 159 | 160 | '@dprint/linux-x64-glibc@0.50.2': 161 | resolution: {integrity: sha512-KMeHEzb4teQJChTgq8HuQzc+reRNDnarOTGTQovAZ9WNjOtKLViftsKWW5HsnRHtP5nUIPE9rF1QLjJ/gUsqvw==} 162 | cpu: [x64] 163 | os: [linux] 164 | 165 | '@dprint/linux-x64-musl@0.50.2': 166 | resolution: {integrity: sha512-qM37T7H69g5coBTfE7SsA+KZZaRBky6gaUhPgAYxW+fOsoVtZSVkXtfTtQauHTpqqOEtbxfCtum70Hz1fr1teg==} 167 | cpu: [x64] 168 | os: [linux] 169 | 170 | '@dprint/win32-arm64@0.50.2': 171 | resolution: {integrity: sha512-kuGVHGoxLwssVDsodefUIYQRoO2fQncurH/xKgXiZwMPOSzFcgUzYJQiyqmJEp+PENhO9VT1hXUHZtlyCAWBUQ==} 172 | cpu: [arm64] 173 | os: [win32] 174 | 175 | '@dprint/win32-x64@0.50.2': 176 | resolution: {integrity: sha512-N3l9k31c3IMfVXqL0L6ygIhJFvCIrfQ+Z5Jph6RnCcBO6oDYWeYhAv/qBk1vLsF2y/e79TKsR1tvaEwnrQ03XA==} 177 | cpu: [x64] 178 | os: [win32] 179 | 180 | '@eslint-community/eslint-utils@4.9.0': 181 | resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} 182 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 183 | peerDependencies: 184 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 185 | 186 | '@eslint-community/regexpp@4.12.2': 187 | resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} 188 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 189 | 190 | '@eslint/config-array@0.21.1': 191 | resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} 192 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 193 | 194 | '@eslint/config-helpers@0.4.2': 195 | resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} 196 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 197 | 198 | '@eslint/core@0.17.0': 199 | resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} 200 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 201 | 202 | '@eslint/eslintrc@3.3.3': 203 | resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} 204 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 205 | 206 | '@eslint/js@9.39.1': 207 | resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} 208 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 209 | 210 | '@eslint/object-schema@2.1.7': 211 | resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} 212 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 213 | 214 | '@eslint/plugin-kit@0.4.1': 215 | resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} 216 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 217 | 218 | '@humanfs/core@0.19.1': 219 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 220 | engines: {node: '>=18.18.0'} 221 | 222 | '@humanfs/node@0.16.7': 223 | resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} 224 | engines: {node: '>=18.18.0'} 225 | 226 | '@humanwhocodes/module-importer@1.0.1': 227 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 228 | engines: {node: '>=12.22'} 229 | 230 | '@humanwhocodes/retry@0.4.3': 231 | resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 232 | engines: {node: '>=18.18'} 233 | 234 | '@inquirer/external-editor@1.0.3': 235 | resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} 236 | engines: {node: '>=18'} 237 | peerDependencies: 238 | '@types/node': '>=18' 239 | peerDependenciesMeta: 240 | '@types/node': 241 | optional: true 242 | 243 | '@isaacs/balanced-match@4.0.1': 244 | resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} 245 | engines: {node: 20 || >=22} 246 | 247 | '@isaacs/brace-expansion@5.0.0': 248 | resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} 249 | engines: {node: 20 || >=22} 250 | 251 | '@manypkg/find-root@1.1.0': 252 | resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} 253 | 254 | '@manypkg/get-packages@1.1.3': 255 | resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} 256 | 257 | '@nodelib/fs.scandir@2.1.5': 258 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 259 | engines: {node: '>= 8'} 260 | 261 | '@nodelib/fs.stat@2.0.5': 262 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 263 | engines: {node: '>= 8'} 264 | 265 | '@nodelib/fs.walk@1.2.8': 266 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 267 | engines: {node: '>= 8'} 268 | 269 | '@sec-ant/readable-stream@0.4.1': 270 | resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} 271 | 272 | '@sindresorhus/merge-streams@4.0.0': 273 | resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} 274 | engines: {node: '>=18'} 275 | 276 | '@tsconfig/node18@18.2.6': 277 | resolution: {integrity: sha512-eAWQzAjPj18tKnDzmWstz4OyWewLUNBm9tdoN9LayzoboRktYx3Enk1ZXPmThj55L7c4VWYq/Bzq0A51znZfhw==} 278 | 279 | '@types/adm-zip@0.5.7': 280 | resolution: {integrity: sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==} 281 | 282 | '@types/estree@1.0.8': 283 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 284 | 285 | '@types/json-schema@7.0.15': 286 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 287 | 288 | '@types/node@12.20.55': 289 | resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} 290 | 291 | '@types/node@18.19.130': 292 | resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} 293 | 294 | '@types/semver@7.7.1': 295 | resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} 296 | 297 | '@typescript-eslint/eslint-plugin@8.48.1': 298 | resolution: {integrity: sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA==} 299 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 300 | peerDependencies: 301 | '@typescript-eslint/parser': ^8.48.1 302 | eslint: ^8.57.0 || ^9.0.0 303 | typescript: '>=4.8.4 <6.0.0' 304 | 305 | '@typescript-eslint/parser@8.48.1': 306 | resolution: {integrity: sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==} 307 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 308 | peerDependencies: 309 | eslint: ^8.57.0 || ^9.0.0 310 | typescript: '>=4.8.4 <6.0.0' 311 | 312 | '@typescript-eslint/project-service@8.48.1': 313 | resolution: {integrity: sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==} 314 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 315 | peerDependencies: 316 | typescript: '>=4.8.4 <6.0.0' 317 | 318 | '@typescript-eslint/scope-manager@8.48.1': 319 | resolution: {integrity: sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==} 320 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 321 | 322 | '@typescript-eslint/tsconfig-utils@8.48.1': 323 | resolution: {integrity: sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==} 324 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 325 | peerDependencies: 326 | typescript: '>=4.8.4 <6.0.0' 327 | 328 | '@typescript-eslint/type-utils@8.48.1': 329 | resolution: {integrity: sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==} 330 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 331 | peerDependencies: 332 | eslint: ^8.57.0 || ^9.0.0 333 | typescript: '>=4.8.4 <6.0.0' 334 | 335 | '@typescript-eslint/types@8.48.1': 336 | resolution: {integrity: sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==} 337 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 338 | 339 | '@typescript-eslint/typescript-estree@8.48.1': 340 | resolution: {integrity: sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==} 341 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 342 | peerDependencies: 343 | typescript: '>=4.8.4 <6.0.0' 344 | 345 | '@typescript-eslint/utils@8.48.1': 346 | resolution: {integrity: sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==} 347 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 348 | peerDependencies: 349 | eslint: ^8.57.0 || ^9.0.0 350 | typescript: '>=4.8.4 <6.0.0' 351 | 352 | '@typescript-eslint/visitor-keys@8.48.1': 353 | resolution: {integrity: sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==} 354 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 355 | 356 | '@zkochan/cmd-shim@7.0.0': 357 | resolution: {integrity: sha512-E5mgrRS8Kk80n19Xxmrx5qO9UG03FyZd8Me5gxYi++VPZsOv8+OsclA+0Fth4KTDCrQ/FkJryNFKJ6/642lo4g==} 358 | engines: {node: '>=18.12'} 359 | 360 | acorn-jsx@5.3.2: 361 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 362 | peerDependencies: 363 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 364 | 365 | acorn@8.15.0: 366 | resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 367 | engines: {node: '>=0.4.0'} 368 | hasBin: true 369 | 370 | adm-zip@0.5.16: 371 | resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} 372 | engines: {node: '>=12.0'} 373 | 374 | ajv@6.12.6: 375 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 376 | 377 | ansi-colors@4.1.3: 378 | resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 379 | engines: {node: '>=6'} 380 | 381 | ansi-regex@5.0.1: 382 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 383 | engines: {node: '>=8'} 384 | 385 | ansi-styles@4.3.0: 386 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 387 | engines: {node: '>=8'} 388 | 389 | argparse@1.0.10: 390 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 391 | 392 | argparse@2.0.1: 393 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 394 | 395 | array-union@2.1.0: 396 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 397 | engines: {node: '>=8'} 398 | 399 | balanced-match@1.0.2: 400 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 401 | 402 | baseline-browser-mapping@2.9.2: 403 | resolution: {integrity: sha512-PxSsosKQjI38iXkmb3d0Y32efqyA0uW4s41u4IVBsLlWLhCiYNpH/AfNOVWRqCQBlD8TFJTz6OUWNd4DFJCnmw==} 404 | hasBin: true 405 | 406 | better-path-resolve@1.0.0: 407 | resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} 408 | engines: {node: '>=4'} 409 | 410 | brace-expansion@1.1.12: 411 | resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 412 | 413 | brace-expansion@2.0.2: 414 | resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 415 | 416 | braces@3.0.3: 417 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 418 | engines: {node: '>=8'} 419 | 420 | browserslist@4.28.1: 421 | resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} 422 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 423 | hasBin: true 424 | 425 | builtin-modules@5.0.0: 426 | resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} 427 | engines: {node: '>=18.20'} 428 | 429 | callsites@3.1.0: 430 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 431 | engines: {node: '>=6'} 432 | 433 | caniuse-lite@1.0.30001759: 434 | resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} 435 | 436 | chalk@4.1.2: 437 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 438 | engines: {node: '>=10'} 439 | 440 | change-case@5.4.4: 441 | resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} 442 | 443 | chardet@2.1.1: 444 | resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} 445 | 446 | ci-info@3.9.0: 447 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 448 | engines: {node: '>=8'} 449 | 450 | ci-info@4.3.1: 451 | resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} 452 | engines: {node: '>=8'} 453 | 454 | clean-regexp@1.0.0: 455 | resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} 456 | engines: {node: '>=4'} 457 | 458 | clipanion@4.0.0-rc.4: 459 | resolution: {integrity: sha512-CXkMQxU6s9GklO/1f714dkKBMu1lopS1WFF0B8o4AxPykR1hpozxSiUZ5ZUeBjfPgCWqbcNOtZVFhB8Lkfp1+Q==} 460 | peerDependencies: 461 | typanion: '*' 462 | 463 | cmd-extension@1.0.2: 464 | resolution: {integrity: sha512-iWDjmP8kvsMdBmLTHxFaqXikO8EdFRDfim7k6vUHglY/2xJ5jLrPsnQGijdfp4U+sr/BeecG0wKm02dSIAeQ1g==} 465 | engines: {node: '>=10'} 466 | 467 | color-convert@2.0.1: 468 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 469 | engines: {node: '>=7.0.0'} 470 | 471 | color-name@1.1.4: 472 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 473 | 474 | concat-map@0.0.1: 475 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 476 | 477 | core-js-compat@3.47.0: 478 | resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==} 479 | 480 | cross-spawn@7.0.6: 481 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 482 | engines: {node: '>= 8'} 483 | 484 | debug@4.4.3: 485 | resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 486 | engines: {node: '>=6.0'} 487 | peerDependencies: 488 | supports-color: '*' 489 | peerDependenciesMeta: 490 | supports-color: 491 | optional: true 492 | 493 | deep-is@0.1.4: 494 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 495 | 496 | detect-indent@6.1.0: 497 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 498 | engines: {node: '>=8'} 499 | 500 | dir-glob@3.0.1: 501 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 502 | engines: {node: '>=8'} 503 | 504 | dprint@0.50.2: 505 | resolution: {integrity: sha512-+0Fzg+17jsMMUouK00/Fara5YtGOuE76EAJINHB8VpkXHd0n00rMXtw/03qorOgz23eo8Y0UpYvNZBJJo3aNtw==} 506 | hasBin: true 507 | 508 | electron-to-chromium@1.5.264: 509 | resolution: {integrity: sha512-1tEf0nLgltC3iy9wtlYDlQDc5Rg9lEKVjEmIHJ21rI9OcqkvD45K1oyNIRA4rR1z3LgJ7KeGzEBojVcV6m4qjA==} 510 | 511 | enquirer@2.4.1: 512 | resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} 513 | engines: {node: '>=8.6'} 514 | 515 | escalade@3.2.0: 516 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 517 | engines: {node: '>=6'} 518 | 519 | escape-string-regexp@1.0.5: 520 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 521 | engines: {node: '>=0.8.0'} 522 | 523 | escape-string-regexp@4.0.0: 524 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 525 | engines: {node: '>=10'} 526 | 527 | eslint-plugin-simple-import-sort@12.1.1: 528 | resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} 529 | peerDependencies: 530 | eslint: '>=5.0.0' 531 | 532 | eslint-plugin-unicorn@62.0.0: 533 | resolution: {integrity: sha512-HIlIkGLkvf29YEiS/ImuDZQbP12gWyx5i3C6XrRxMvVdqMroCI9qoVYCoIl17ChN+U89pn9sVwLxhIWj5nEc7g==} 534 | engines: {node: ^20.10.0 || >=21.0.0} 535 | peerDependencies: 536 | eslint: '>=9.38.0' 537 | 538 | eslint-scope@8.4.0: 539 | resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} 540 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 541 | 542 | eslint-visitor-keys@3.4.3: 543 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 544 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 545 | 546 | eslint-visitor-keys@4.2.1: 547 | resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 548 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 549 | 550 | eslint@9.39.1: 551 | resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} 552 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 553 | hasBin: true 554 | peerDependencies: 555 | jiti: '*' 556 | peerDependenciesMeta: 557 | jiti: 558 | optional: true 559 | 560 | espree@10.4.0: 561 | resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} 562 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 563 | 564 | esprima@4.0.1: 565 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 566 | engines: {node: '>=4'} 567 | hasBin: true 568 | 569 | esquery@1.6.0: 570 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 571 | engines: {node: '>=0.10'} 572 | 573 | esrecurse@4.3.0: 574 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 575 | engines: {node: '>=4.0'} 576 | 577 | estraverse@5.3.0: 578 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 579 | engines: {node: '>=4.0'} 580 | 581 | esutils@2.0.3: 582 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 583 | engines: {node: '>=0.10.0'} 584 | 585 | execa@9.6.1: 586 | resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} 587 | engines: {node: ^18.19.0 || >=20.5.0} 588 | 589 | extendable-error@0.1.7: 590 | resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} 591 | 592 | fast-deep-equal@3.1.3: 593 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 594 | 595 | fast-glob@3.3.3: 596 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 597 | engines: {node: '>=8.6.0'} 598 | 599 | fast-json-stable-stringify@2.1.0: 600 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 601 | 602 | fast-levenshtein@2.0.6: 603 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 604 | 605 | fastq@1.19.1: 606 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 607 | 608 | fdir@6.5.0: 609 | resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 610 | engines: {node: '>=12.0.0'} 611 | peerDependencies: 612 | picomatch: ^3 || ^4 613 | peerDependenciesMeta: 614 | picomatch: 615 | optional: true 616 | 617 | figures@6.1.0: 618 | resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} 619 | engines: {node: '>=18'} 620 | 621 | file-entry-cache@8.0.0: 622 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 623 | engines: {node: '>=16.0.0'} 624 | 625 | fill-range@7.1.1: 626 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 627 | engines: {node: '>=8'} 628 | 629 | find-up-simple@1.0.1: 630 | resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} 631 | engines: {node: '>=18'} 632 | 633 | find-up@4.1.0: 634 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 635 | engines: {node: '>=8'} 636 | 637 | find-up@5.0.0: 638 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 639 | engines: {node: '>=10'} 640 | 641 | flat-cache@4.0.1: 642 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 643 | engines: {node: '>=16'} 644 | 645 | flatted@3.3.3: 646 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 647 | 648 | fs-extra@7.0.1: 649 | resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} 650 | engines: {node: '>=6 <7 || >=8'} 651 | 652 | fs-extra@8.1.0: 653 | resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 654 | engines: {node: '>=6 <7 || >=8'} 655 | 656 | get-stream@9.0.1: 657 | resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} 658 | engines: {node: '>=18'} 659 | 660 | glob-parent@5.1.2: 661 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 662 | engines: {node: '>= 6'} 663 | 664 | glob-parent@6.0.2: 665 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 666 | engines: {node: '>=10.13.0'} 667 | 668 | glob@13.0.0: 669 | resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} 670 | engines: {node: 20 || >=22} 671 | 672 | globals@14.0.0: 673 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 674 | engines: {node: '>=18'} 675 | 676 | globals@16.5.0: 677 | resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} 678 | engines: {node: '>=18'} 679 | 680 | globby@11.1.0: 681 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 682 | engines: {node: '>=10'} 683 | 684 | graceful-fs@4.2.11: 685 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 686 | 687 | graphemer@1.4.0: 688 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 689 | 690 | has-flag@4.0.0: 691 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 692 | engines: {node: '>=8'} 693 | 694 | human-id@4.1.3: 695 | resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} 696 | hasBin: true 697 | 698 | human-signals@8.0.1: 699 | resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} 700 | engines: {node: '>=18.18.0'} 701 | 702 | iconv-lite@0.7.0: 703 | resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} 704 | engines: {node: '>=0.10.0'} 705 | 706 | ignore@5.3.2: 707 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 708 | engines: {node: '>= 4'} 709 | 710 | ignore@7.0.5: 711 | resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} 712 | engines: {node: '>= 4'} 713 | 714 | import-fresh@3.3.1: 715 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 716 | engines: {node: '>=6'} 717 | 718 | imurmurhash@0.1.4: 719 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 720 | engines: {node: '>=0.8.19'} 721 | 722 | indent-string@5.0.0: 723 | resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} 724 | engines: {node: '>=12'} 725 | 726 | is-builtin-module@5.0.0: 727 | resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} 728 | engines: {node: '>=18.20'} 729 | 730 | is-extglob@2.1.1: 731 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 732 | engines: {node: '>=0.10.0'} 733 | 734 | is-glob@4.0.3: 735 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 736 | engines: {node: '>=0.10.0'} 737 | 738 | is-number@7.0.0: 739 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 740 | engines: {node: '>=0.12.0'} 741 | 742 | is-plain-obj@4.1.0: 743 | resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} 744 | engines: {node: '>=12'} 745 | 746 | is-stream@4.0.1: 747 | resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} 748 | engines: {node: '>=18'} 749 | 750 | is-subdir@1.2.0: 751 | resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} 752 | engines: {node: '>=4'} 753 | 754 | is-unicode-supported@2.1.0: 755 | resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} 756 | engines: {node: '>=18'} 757 | 758 | is-windows@1.0.2: 759 | resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} 760 | engines: {node: '>=0.10.0'} 761 | 762 | isexe@2.0.0: 763 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 764 | 765 | js-yaml@3.14.2: 766 | resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} 767 | hasBin: true 768 | 769 | js-yaml@4.1.1: 770 | resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} 771 | hasBin: true 772 | 773 | jsesc@3.1.0: 774 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 775 | engines: {node: '>=6'} 776 | hasBin: true 777 | 778 | json-buffer@3.0.1: 779 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 780 | 781 | json-schema-traverse@0.4.1: 782 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 783 | 784 | json-stable-stringify-without-jsonify@1.0.1: 785 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 786 | 787 | jsonfile@4.0.0: 788 | resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 789 | 790 | keyv@4.5.4: 791 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 792 | 793 | levn@0.4.1: 794 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 795 | engines: {node: '>= 0.8.0'} 796 | 797 | locate-path@5.0.0: 798 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 799 | engines: {node: '>=8'} 800 | 801 | locate-path@6.0.0: 802 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 803 | engines: {node: '>=10'} 804 | 805 | lodash.merge@4.6.2: 806 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 807 | 808 | lodash.startcase@4.4.0: 809 | resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} 810 | 811 | lru-cache@11.2.4: 812 | resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} 813 | engines: {node: 20 || >=22} 814 | 815 | merge2@1.4.1: 816 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 817 | engines: {node: '>= 8'} 818 | 819 | micromatch@4.0.8: 820 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 821 | engines: {node: '>=8.6'} 822 | 823 | minimatch@10.1.1: 824 | resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} 825 | engines: {node: 20 || >=22} 826 | 827 | minimatch@3.1.2: 828 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 829 | 830 | minimatch@9.0.5: 831 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 832 | engines: {node: '>=16 || 14 >=14.17'} 833 | 834 | minipass@7.1.2: 835 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 836 | engines: {node: '>=16 || 14 >=14.17'} 837 | 838 | mri@1.2.0: 839 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 840 | engines: {node: '>=4'} 841 | 842 | ms@2.1.3: 843 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 844 | 845 | natural-compare@1.4.0: 846 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 847 | 848 | node-releases@2.0.27: 849 | resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} 850 | 851 | npm-run-path@6.0.0: 852 | resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} 853 | engines: {node: '>=18'} 854 | 855 | optionator@0.9.4: 856 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 857 | engines: {node: '>= 0.8.0'} 858 | 859 | outdent@0.5.0: 860 | resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} 861 | 862 | p-filter@2.1.0: 863 | resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} 864 | engines: {node: '>=8'} 865 | 866 | p-limit@2.3.0: 867 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 868 | engines: {node: '>=6'} 869 | 870 | p-limit@3.1.0: 871 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 872 | engines: {node: '>=10'} 873 | 874 | p-locate@4.1.0: 875 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 876 | engines: {node: '>=8'} 877 | 878 | p-locate@5.0.0: 879 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 880 | engines: {node: '>=10'} 881 | 882 | p-map@2.1.0: 883 | resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} 884 | engines: {node: '>=6'} 885 | 886 | p-try@2.2.0: 887 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 888 | engines: {node: '>=6'} 889 | 890 | package-json-from-dist@1.0.1: 891 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 892 | 893 | package-manager-detector@0.2.11: 894 | resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} 895 | 896 | parent-module@1.0.1: 897 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 898 | engines: {node: '>=6'} 899 | 900 | parse-ms@4.0.0: 901 | resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} 902 | engines: {node: '>=18'} 903 | 904 | path-exists@4.0.0: 905 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 906 | engines: {node: '>=8'} 907 | 908 | path-key@3.1.1: 909 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 910 | engines: {node: '>=8'} 911 | 912 | path-key@4.0.0: 913 | resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} 914 | engines: {node: '>=12'} 915 | 916 | path-scurry@2.0.1: 917 | resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} 918 | engines: {node: 20 || >=22} 919 | 920 | path-type@4.0.0: 921 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 922 | engines: {node: '>=8'} 923 | 924 | picocolors@1.1.1: 925 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 926 | 927 | picomatch@2.3.1: 928 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 929 | engines: {node: '>=8.6'} 930 | 931 | picomatch@4.0.3: 932 | resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 933 | engines: {node: '>=12'} 934 | 935 | pify@4.0.1: 936 | resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} 937 | engines: {node: '>=6'} 938 | 939 | pluralize@8.0.0: 940 | resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} 941 | engines: {node: '>=4'} 942 | 943 | prelude-ls@1.2.1: 944 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 945 | engines: {node: '>= 0.8.0'} 946 | 947 | prettier@2.8.8: 948 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 949 | engines: {node: '>=10.13.0'} 950 | hasBin: true 951 | 952 | pretty-ms@9.3.0: 953 | resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} 954 | engines: {node: '>=18'} 955 | 956 | punycode@2.3.1: 957 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 958 | engines: {node: '>=6'} 959 | 960 | quansync@0.2.11: 961 | resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} 962 | 963 | queue-microtask@1.2.3: 964 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 965 | 966 | read-yaml-file@1.1.0: 967 | resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} 968 | engines: {node: '>=6'} 969 | 970 | regexp-tree@0.1.27: 971 | resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} 972 | hasBin: true 973 | 974 | regjsparser@0.13.0: 975 | resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} 976 | hasBin: true 977 | 978 | resolve-from@4.0.0: 979 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 980 | engines: {node: '>=4'} 981 | 982 | resolve-from@5.0.0: 983 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 984 | engines: {node: '>=8'} 985 | 986 | reusify@1.1.0: 987 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 988 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 989 | 990 | rimraf@6.1.2: 991 | resolution: {integrity: sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==} 992 | engines: {node: 20 || >=22} 993 | hasBin: true 994 | 995 | run-parallel@1.2.0: 996 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 997 | 998 | safer-buffer@2.1.2: 999 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1000 | 1001 | semver@7.7.3: 1002 | resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} 1003 | engines: {node: '>=10'} 1004 | hasBin: true 1005 | 1006 | shebang-command@2.0.0: 1007 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1008 | engines: {node: '>=8'} 1009 | 1010 | shebang-regex@3.0.0: 1011 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1012 | engines: {node: '>=8'} 1013 | 1014 | signal-exit@4.1.0: 1015 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1016 | engines: {node: '>=14'} 1017 | 1018 | slash@3.0.0: 1019 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1020 | engines: {node: '>=8'} 1021 | 1022 | spawndamnit@3.0.1: 1023 | resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} 1024 | 1025 | sprintf-js@1.0.3: 1026 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1027 | 1028 | strip-ansi@6.0.1: 1029 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1030 | engines: {node: '>=8'} 1031 | 1032 | strip-bom@3.0.0: 1033 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1034 | engines: {node: '>=4'} 1035 | 1036 | strip-final-newline@4.0.0: 1037 | resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} 1038 | engines: {node: '>=18'} 1039 | 1040 | strip-indent@4.1.1: 1041 | resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} 1042 | engines: {node: '>=12'} 1043 | 1044 | strip-json-comments@3.1.1: 1045 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1046 | engines: {node: '>=8'} 1047 | 1048 | supports-color@7.2.0: 1049 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1050 | engines: {node: '>=8'} 1051 | 1052 | term-size@2.2.1: 1053 | resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} 1054 | engines: {node: '>=8'} 1055 | 1056 | tinyglobby@0.2.15: 1057 | resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 1058 | engines: {node: '>=12.0.0'} 1059 | 1060 | to-regex-range@5.0.1: 1061 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1062 | engines: {node: '>=8.0'} 1063 | 1064 | ts-api-utils@2.1.0: 1065 | resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 1066 | engines: {node: '>=18.12'} 1067 | peerDependencies: 1068 | typescript: '>=4.8.4' 1069 | 1070 | typanion@3.14.0: 1071 | resolution: {integrity: sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==} 1072 | 1073 | type-check@0.4.0: 1074 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1075 | engines: {node: '>= 0.8.0'} 1076 | 1077 | typescript-eslint@8.48.1: 1078 | resolution: {integrity: sha512-FbOKN1fqNoXp1hIl5KYpObVrp0mCn+CLgn479nmu2IsRMrx2vyv74MmsBLVlhg8qVwNFGbXSp8fh1zp8pEoC2A==} 1079 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1080 | peerDependencies: 1081 | eslint: ^8.57.0 || ^9.0.0 1082 | typescript: '>=4.8.4 <6.0.0' 1083 | 1084 | typescript@5.9.3: 1085 | resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 1086 | engines: {node: '>=14.17'} 1087 | hasBin: true 1088 | 1089 | undici-types@5.26.5: 1090 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 1091 | 1092 | unicorn-magic@0.3.0: 1093 | resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} 1094 | engines: {node: '>=18'} 1095 | 1096 | universalify@0.1.2: 1097 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 1098 | engines: {node: '>= 4.0.0'} 1099 | 1100 | update-browserslist-db@1.2.2: 1101 | resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==} 1102 | hasBin: true 1103 | peerDependencies: 1104 | browserslist: '>= 4.21.0' 1105 | 1106 | uri-js@4.4.1: 1107 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1108 | 1109 | which@2.0.2: 1110 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1111 | engines: {node: '>= 8'} 1112 | hasBin: true 1113 | 1114 | word-wrap@1.2.5: 1115 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1116 | engines: {node: '>=0.10.0'} 1117 | 1118 | yocto-queue@0.1.0: 1119 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1120 | engines: {node: '>=10'} 1121 | 1122 | yoctocolors@2.1.2: 1123 | resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} 1124 | engines: {node: '>=18'} 1125 | 1126 | snapshots: 1127 | 1128 | '@babel/helper-validator-identifier@7.28.5': {} 1129 | 1130 | '@babel/runtime@7.28.4': {} 1131 | 1132 | '@changesets/apply-release-plan@7.0.14': 1133 | dependencies: 1134 | '@changesets/config': 3.1.2 1135 | '@changesets/get-version-range-type': 0.4.0 1136 | '@changesets/git': 3.0.4 1137 | '@changesets/should-skip-package': 0.1.2 1138 | '@changesets/types': 6.1.0 1139 | '@manypkg/get-packages': 1.1.3 1140 | detect-indent: 6.1.0 1141 | fs-extra: 7.0.1 1142 | lodash.startcase: 4.4.0 1143 | outdent: 0.5.0 1144 | prettier: 2.8.8 1145 | resolve-from: 5.0.0 1146 | semver: 7.7.3 1147 | 1148 | '@changesets/assemble-release-plan@6.0.9': 1149 | dependencies: 1150 | '@changesets/errors': 0.2.0 1151 | '@changesets/get-dependents-graph': 2.1.3 1152 | '@changesets/should-skip-package': 0.1.2 1153 | '@changesets/types': 6.1.0 1154 | '@manypkg/get-packages': 1.1.3 1155 | semver: 7.7.3 1156 | 1157 | '@changesets/changelog-git@0.2.1': 1158 | dependencies: 1159 | '@changesets/types': 6.1.0 1160 | 1161 | '@changesets/cli@2.29.8(@types/node@18.19.130)': 1162 | dependencies: 1163 | '@changesets/apply-release-plan': 7.0.14 1164 | '@changesets/assemble-release-plan': 6.0.9 1165 | '@changesets/changelog-git': 0.2.1 1166 | '@changesets/config': 3.1.2 1167 | '@changesets/errors': 0.2.0 1168 | '@changesets/get-dependents-graph': 2.1.3 1169 | '@changesets/get-release-plan': 4.0.14 1170 | '@changesets/git': 3.0.4 1171 | '@changesets/logger': 0.1.1 1172 | '@changesets/pre': 2.0.2 1173 | '@changesets/read': 0.6.6 1174 | '@changesets/should-skip-package': 0.1.2 1175 | '@changesets/types': 6.1.0 1176 | '@changesets/write': 0.4.0 1177 | '@inquirer/external-editor': 1.0.3(@types/node@18.19.130) 1178 | '@manypkg/get-packages': 1.1.3 1179 | ansi-colors: 4.1.3 1180 | ci-info: 3.9.0 1181 | enquirer: 2.4.1 1182 | fs-extra: 7.0.1 1183 | mri: 1.2.0 1184 | p-limit: 2.3.0 1185 | package-manager-detector: 0.2.11 1186 | picocolors: 1.1.1 1187 | resolve-from: 5.0.0 1188 | semver: 7.7.3 1189 | spawndamnit: 3.0.1 1190 | term-size: 2.2.1 1191 | transitivePeerDependencies: 1192 | - '@types/node' 1193 | 1194 | '@changesets/config@3.1.2': 1195 | dependencies: 1196 | '@changesets/errors': 0.2.0 1197 | '@changesets/get-dependents-graph': 2.1.3 1198 | '@changesets/logger': 0.1.1 1199 | '@changesets/types': 6.1.0 1200 | '@manypkg/get-packages': 1.1.3 1201 | fs-extra: 7.0.1 1202 | micromatch: 4.0.8 1203 | 1204 | '@changesets/errors@0.2.0': 1205 | dependencies: 1206 | extendable-error: 0.1.7 1207 | 1208 | '@changesets/get-dependents-graph@2.1.3': 1209 | dependencies: 1210 | '@changesets/types': 6.1.0 1211 | '@manypkg/get-packages': 1.1.3 1212 | picocolors: 1.1.1 1213 | semver: 7.7.3 1214 | 1215 | '@changesets/get-release-plan@4.0.14': 1216 | dependencies: 1217 | '@changesets/assemble-release-plan': 6.0.9 1218 | '@changesets/config': 3.1.2 1219 | '@changesets/pre': 2.0.2 1220 | '@changesets/read': 0.6.6 1221 | '@changesets/types': 6.1.0 1222 | '@manypkg/get-packages': 1.1.3 1223 | 1224 | '@changesets/get-version-range-type@0.4.0': {} 1225 | 1226 | '@changesets/git@3.0.4': 1227 | dependencies: 1228 | '@changesets/errors': 0.2.0 1229 | '@manypkg/get-packages': 1.1.3 1230 | is-subdir: 1.2.0 1231 | micromatch: 4.0.8 1232 | spawndamnit: 3.0.1 1233 | 1234 | '@changesets/logger@0.1.1': 1235 | dependencies: 1236 | picocolors: 1.1.1 1237 | 1238 | '@changesets/parse@0.4.2': 1239 | dependencies: 1240 | '@changesets/types': 6.1.0 1241 | js-yaml: 4.1.1 1242 | 1243 | '@changesets/pre@2.0.2': 1244 | dependencies: 1245 | '@changesets/errors': 0.2.0 1246 | '@changesets/types': 6.1.0 1247 | '@manypkg/get-packages': 1.1.3 1248 | fs-extra: 7.0.1 1249 | 1250 | '@changesets/read@0.6.6': 1251 | dependencies: 1252 | '@changesets/git': 3.0.4 1253 | '@changesets/logger': 0.1.1 1254 | '@changesets/parse': 0.4.2 1255 | '@changesets/types': 6.1.0 1256 | fs-extra: 7.0.1 1257 | p-filter: 2.1.0 1258 | picocolors: 1.1.1 1259 | 1260 | '@changesets/should-skip-package@0.1.2': 1261 | dependencies: 1262 | '@changesets/types': 6.1.0 1263 | '@manypkg/get-packages': 1.1.3 1264 | 1265 | '@changesets/types@4.1.0': {} 1266 | 1267 | '@changesets/types@6.1.0': {} 1268 | 1269 | '@changesets/write@0.4.0': 1270 | dependencies: 1271 | '@changesets/types': 6.1.0 1272 | fs-extra: 7.0.1 1273 | human-id: 4.1.3 1274 | prettier: 2.8.8 1275 | 1276 | '@dprint/darwin-arm64@0.50.2': 1277 | optional: true 1278 | 1279 | '@dprint/darwin-x64@0.50.2': 1280 | optional: true 1281 | 1282 | '@dprint/linux-arm64-glibc@0.50.2': 1283 | optional: true 1284 | 1285 | '@dprint/linux-arm64-musl@0.50.2': 1286 | optional: true 1287 | 1288 | '@dprint/linux-riscv64-glibc@0.50.2': 1289 | optional: true 1290 | 1291 | '@dprint/linux-x64-glibc@0.50.2': 1292 | optional: true 1293 | 1294 | '@dprint/linux-x64-musl@0.50.2': 1295 | optional: true 1296 | 1297 | '@dprint/win32-arm64@0.50.2': 1298 | optional: true 1299 | 1300 | '@dprint/win32-x64@0.50.2': 1301 | optional: true 1302 | 1303 | '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': 1304 | dependencies: 1305 | eslint: 9.39.1 1306 | eslint-visitor-keys: 3.4.3 1307 | 1308 | '@eslint-community/regexpp@4.12.2': {} 1309 | 1310 | '@eslint/config-array@0.21.1': 1311 | dependencies: 1312 | '@eslint/object-schema': 2.1.7 1313 | debug: 4.4.3 1314 | minimatch: 3.1.2 1315 | transitivePeerDependencies: 1316 | - supports-color 1317 | 1318 | '@eslint/config-helpers@0.4.2': 1319 | dependencies: 1320 | '@eslint/core': 0.17.0 1321 | 1322 | '@eslint/core@0.17.0': 1323 | dependencies: 1324 | '@types/json-schema': 7.0.15 1325 | 1326 | '@eslint/eslintrc@3.3.3': 1327 | dependencies: 1328 | ajv: 6.12.6 1329 | debug: 4.4.3 1330 | espree: 10.4.0 1331 | globals: 14.0.0 1332 | ignore: 5.3.2 1333 | import-fresh: 3.3.1 1334 | js-yaml: 4.1.1 1335 | minimatch: 3.1.2 1336 | strip-json-comments: 3.1.1 1337 | transitivePeerDependencies: 1338 | - supports-color 1339 | 1340 | '@eslint/js@9.39.1': {} 1341 | 1342 | '@eslint/object-schema@2.1.7': {} 1343 | 1344 | '@eslint/plugin-kit@0.4.1': 1345 | dependencies: 1346 | '@eslint/core': 0.17.0 1347 | levn: 0.4.1 1348 | 1349 | '@humanfs/core@0.19.1': {} 1350 | 1351 | '@humanfs/node@0.16.7': 1352 | dependencies: 1353 | '@humanfs/core': 0.19.1 1354 | '@humanwhocodes/retry': 0.4.3 1355 | 1356 | '@humanwhocodes/module-importer@1.0.1': {} 1357 | 1358 | '@humanwhocodes/retry@0.4.3': {} 1359 | 1360 | '@inquirer/external-editor@1.0.3(@types/node@18.19.130)': 1361 | dependencies: 1362 | chardet: 2.1.1 1363 | iconv-lite: 0.7.0 1364 | optionalDependencies: 1365 | '@types/node': 18.19.130 1366 | 1367 | '@isaacs/balanced-match@4.0.1': {} 1368 | 1369 | '@isaacs/brace-expansion@5.0.0': 1370 | dependencies: 1371 | '@isaacs/balanced-match': 4.0.1 1372 | 1373 | '@manypkg/find-root@1.1.0': 1374 | dependencies: 1375 | '@babel/runtime': 7.28.4 1376 | '@types/node': 12.20.55 1377 | find-up: 4.1.0 1378 | fs-extra: 8.1.0 1379 | 1380 | '@manypkg/get-packages@1.1.3': 1381 | dependencies: 1382 | '@babel/runtime': 7.28.4 1383 | '@changesets/types': 4.1.0 1384 | '@manypkg/find-root': 1.1.0 1385 | fs-extra: 8.1.0 1386 | globby: 11.1.0 1387 | read-yaml-file: 1.1.0 1388 | 1389 | '@nodelib/fs.scandir@2.1.5': 1390 | dependencies: 1391 | '@nodelib/fs.stat': 2.0.5 1392 | run-parallel: 1.2.0 1393 | 1394 | '@nodelib/fs.stat@2.0.5': {} 1395 | 1396 | '@nodelib/fs.walk@1.2.8': 1397 | dependencies: 1398 | '@nodelib/fs.scandir': 2.1.5 1399 | fastq: 1.19.1 1400 | 1401 | '@sec-ant/readable-stream@0.4.1': {} 1402 | 1403 | '@sindresorhus/merge-streams@4.0.0': {} 1404 | 1405 | '@tsconfig/node18@18.2.6': {} 1406 | 1407 | '@types/adm-zip@0.5.7': 1408 | dependencies: 1409 | '@types/node': 18.19.130 1410 | 1411 | '@types/estree@1.0.8': {} 1412 | 1413 | '@types/json-schema@7.0.15': {} 1414 | 1415 | '@types/node@12.20.55': {} 1416 | 1417 | '@types/node@18.19.130': 1418 | dependencies: 1419 | undici-types: 5.26.5 1420 | 1421 | '@types/semver@7.7.1': {} 1422 | 1423 | '@typescript-eslint/eslint-plugin@8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': 1424 | dependencies: 1425 | '@eslint-community/regexpp': 4.12.2 1426 | '@typescript-eslint/parser': 8.48.1(eslint@9.39.1)(typescript@5.9.3) 1427 | '@typescript-eslint/scope-manager': 8.48.1 1428 | '@typescript-eslint/type-utils': 8.48.1(eslint@9.39.1)(typescript@5.9.3) 1429 | '@typescript-eslint/utils': 8.48.1(eslint@9.39.1)(typescript@5.9.3) 1430 | '@typescript-eslint/visitor-keys': 8.48.1 1431 | eslint: 9.39.1 1432 | graphemer: 1.4.0 1433 | ignore: 7.0.5 1434 | natural-compare: 1.4.0 1435 | ts-api-utils: 2.1.0(typescript@5.9.3) 1436 | typescript: 5.9.3 1437 | transitivePeerDependencies: 1438 | - supports-color 1439 | 1440 | '@typescript-eslint/parser@8.48.1(eslint@9.39.1)(typescript@5.9.3)': 1441 | dependencies: 1442 | '@typescript-eslint/scope-manager': 8.48.1 1443 | '@typescript-eslint/types': 8.48.1 1444 | '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) 1445 | '@typescript-eslint/visitor-keys': 8.48.1 1446 | debug: 4.4.3 1447 | eslint: 9.39.1 1448 | typescript: 5.9.3 1449 | transitivePeerDependencies: 1450 | - supports-color 1451 | 1452 | '@typescript-eslint/project-service@8.48.1(typescript@5.9.3)': 1453 | dependencies: 1454 | '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.9.3) 1455 | '@typescript-eslint/types': 8.48.1 1456 | debug: 4.4.3 1457 | typescript: 5.9.3 1458 | transitivePeerDependencies: 1459 | - supports-color 1460 | 1461 | '@typescript-eslint/scope-manager@8.48.1': 1462 | dependencies: 1463 | '@typescript-eslint/types': 8.48.1 1464 | '@typescript-eslint/visitor-keys': 8.48.1 1465 | 1466 | '@typescript-eslint/tsconfig-utils@8.48.1(typescript@5.9.3)': 1467 | dependencies: 1468 | typescript: 5.9.3 1469 | 1470 | '@typescript-eslint/type-utils@8.48.1(eslint@9.39.1)(typescript@5.9.3)': 1471 | dependencies: 1472 | '@typescript-eslint/types': 8.48.1 1473 | '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) 1474 | '@typescript-eslint/utils': 8.48.1(eslint@9.39.1)(typescript@5.9.3) 1475 | debug: 4.4.3 1476 | eslint: 9.39.1 1477 | ts-api-utils: 2.1.0(typescript@5.9.3) 1478 | typescript: 5.9.3 1479 | transitivePeerDependencies: 1480 | - supports-color 1481 | 1482 | '@typescript-eslint/types@8.48.1': {} 1483 | 1484 | '@typescript-eslint/typescript-estree@8.48.1(typescript@5.9.3)': 1485 | dependencies: 1486 | '@typescript-eslint/project-service': 8.48.1(typescript@5.9.3) 1487 | '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.9.3) 1488 | '@typescript-eslint/types': 8.48.1 1489 | '@typescript-eslint/visitor-keys': 8.48.1 1490 | debug: 4.4.3 1491 | minimatch: 9.0.5 1492 | semver: 7.7.3 1493 | tinyglobby: 0.2.15 1494 | ts-api-utils: 2.1.0(typescript@5.9.3) 1495 | typescript: 5.9.3 1496 | transitivePeerDependencies: 1497 | - supports-color 1498 | 1499 | '@typescript-eslint/utils@8.48.1(eslint@9.39.1)(typescript@5.9.3)': 1500 | dependencies: 1501 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) 1502 | '@typescript-eslint/scope-manager': 8.48.1 1503 | '@typescript-eslint/types': 8.48.1 1504 | '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) 1505 | eslint: 9.39.1 1506 | typescript: 5.9.3 1507 | transitivePeerDependencies: 1508 | - supports-color 1509 | 1510 | '@typescript-eslint/visitor-keys@8.48.1': 1511 | dependencies: 1512 | '@typescript-eslint/types': 8.48.1 1513 | eslint-visitor-keys: 4.2.1 1514 | 1515 | '@zkochan/cmd-shim@7.0.0': 1516 | dependencies: 1517 | cmd-extension: 1.0.2 1518 | graceful-fs: 4.2.11 1519 | is-windows: 1.0.2 1520 | 1521 | acorn-jsx@5.3.2(acorn@8.15.0): 1522 | dependencies: 1523 | acorn: 8.15.0 1524 | 1525 | acorn@8.15.0: {} 1526 | 1527 | adm-zip@0.5.16: {} 1528 | 1529 | ajv@6.12.6: 1530 | dependencies: 1531 | fast-deep-equal: 3.1.3 1532 | fast-json-stable-stringify: 2.1.0 1533 | json-schema-traverse: 0.4.1 1534 | uri-js: 4.4.1 1535 | 1536 | ansi-colors@4.1.3: {} 1537 | 1538 | ansi-regex@5.0.1: {} 1539 | 1540 | ansi-styles@4.3.0: 1541 | dependencies: 1542 | color-convert: 2.0.1 1543 | 1544 | argparse@1.0.10: 1545 | dependencies: 1546 | sprintf-js: 1.0.3 1547 | 1548 | argparse@2.0.1: {} 1549 | 1550 | array-union@2.1.0: {} 1551 | 1552 | balanced-match@1.0.2: {} 1553 | 1554 | baseline-browser-mapping@2.9.2: {} 1555 | 1556 | better-path-resolve@1.0.0: 1557 | dependencies: 1558 | is-windows: 1.0.2 1559 | 1560 | brace-expansion@1.1.12: 1561 | dependencies: 1562 | balanced-match: 1.0.2 1563 | concat-map: 0.0.1 1564 | 1565 | brace-expansion@2.0.2: 1566 | dependencies: 1567 | balanced-match: 1.0.2 1568 | 1569 | braces@3.0.3: 1570 | dependencies: 1571 | fill-range: 7.1.1 1572 | 1573 | browserslist@4.28.1: 1574 | dependencies: 1575 | baseline-browser-mapping: 2.9.2 1576 | caniuse-lite: 1.0.30001759 1577 | electron-to-chromium: 1.5.264 1578 | node-releases: 2.0.27 1579 | update-browserslist-db: 1.2.2(browserslist@4.28.1) 1580 | 1581 | builtin-modules@5.0.0: {} 1582 | 1583 | callsites@3.1.0: {} 1584 | 1585 | caniuse-lite@1.0.30001759: {} 1586 | 1587 | chalk@4.1.2: 1588 | dependencies: 1589 | ansi-styles: 4.3.0 1590 | supports-color: 7.2.0 1591 | 1592 | change-case@5.4.4: {} 1593 | 1594 | chardet@2.1.1: {} 1595 | 1596 | ci-info@3.9.0: {} 1597 | 1598 | ci-info@4.3.1: {} 1599 | 1600 | clean-regexp@1.0.0: 1601 | dependencies: 1602 | escape-string-regexp: 1.0.5 1603 | 1604 | clipanion@4.0.0-rc.4(typanion@3.14.0): 1605 | dependencies: 1606 | typanion: 3.14.0 1607 | 1608 | cmd-extension@1.0.2: {} 1609 | 1610 | color-convert@2.0.1: 1611 | dependencies: 1612 | color-name: 1.1.4 1613 | 1614 | color-name@1.1.4: {} 1615 | 1616 | concat-map@0.0.1: {} 1617 | 1618 | core-js-compat@3.47.0: 1619 | dependencies: 1620 | browserslist: 4.28.1 1621 | 1622 | cross-spawn@7.0.6: 1623 | dependencies: 1624 | path-key: 3.1.1 1625 | shebang-command: 2.0.0 1626 | which: 2.0.2 1627 | 1628 | debug@4.4.3: 1629 | dependencies: 1630 | ms: 2.1.3 1631 | 1632 | deep-is@0.1.4: {} 1633 | 1634 | detect-indent@6.1.0: {} 1635 | 1636 | dir-glob@3.0.1: 1637 | dependencies: 1638 | path-type: 4.0.0 1639 | 1640 | dprint@0.50.2: 1641 | optionalDependencies: 1642 | '@dprint/darwin-arm64': 0.50.2 1643 | '@dprint/darwin-x64': 0.50.2 1644 | '@dprint/linux-arm64-glibc': 0.50.2 1645 | '@dprint/linux-arm64-musl': 0.50.2 1646 | '@dprint/linux-riscv64-glibc': 0.50.2 1647 | '@dprint/linux-x64-glibc': 0.50.2 1648 | '@dprint/linux-x64-musl': 0.50.2 1649 | '@dprint/win32-arm64': 0.50.2 1650 | '@dprint/win32-x64': 0.50.2 1651 | 1652 | electron-to-chromium@1.5.264: {} 1653 | 1654 | enquirer@2.4.1: 1655 | dependencies: 1656 | ansi-colors: 4.1.3 1657 | strip-ansi: 6.0.1 1658 | 1659 | escalade@3.2.0: {} 1660 | 1661 | escape-string-regexp@1.0.5: {} 1662 | 1663 | escape-string-regexp@4.0.0: {} 1664 | 1665 | eslint-plugin-simple-import-sort@12.1.1(eslint@9.39.1): 1666 | dependencies: 1667 | eslint: 9.39.1 1668 | 1669 | eslint-plugin-unicorn@62.0.0(eslint@9.39.1): 1670 | dependencies: 1671 | '@babel/helper-validator-identifier': 7.28.5 1672 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) 1673 | '@eslint/plugin-kit': 0.4.1 1674 | change-case: 5.4.4 1675 | ci-info: 4.3.1 1676 | clean-regexp: 1.0.0 1677 | core-js-compat: 3.47.0 1678 | eslint: 9.39.1 1679 | esquery: 1.6.0 1680 | find-up-simple: 1.0.1 1681 | globals: 16.5.0 1682 | indent-string: 5.0.0 1683 | is-builtin-module: 5.0.0 1684 | jsesc: 3.1.0 1685 | pluralize: 8.0.0 1686 | regexp-tree: 0.1.27 1687 | regjsparser: 0.13.0 1688 | semver: 7.7.3 1689 | strip-indent: 4.1.1 1690 | 1691 | eslint-scope@8.4.0: 1692 | dependencies: 1693 | esrecurse: 4.3.0 1694 | estraverse: 5.3.0 1695 | 1696 | eslint-visitor-keys@3.4.3: {} 1697 | 1698 | eslint-visitor-keys@4.2.1: {} 1699 | 1700 | eslint@9.39.1: 1701 | dependencies: 1702 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) 1703 | '@eslint-community/regexpp': 4.12.2 1704 | '@eslint/config-array': 0.21.1 1705 | '@eslint/config-helpers': 0.4.2 1706 | '@eslint/core': 0.17.0 1707 | '@eslint/eslintrc': 3.3.3 1708 | '@eslint/js': 9.39.1 1709 | '@eslint/plugin-kit': 0.4.1 1710 | '@humanfs/node': 0.16.7 1711 | '@humanwhocodes/module-importer': 1.0.1 1712 | '@humanwhocodes/retry': 0.4.3 1713 | '@types/estree': 1.0.8 1714 | ajv: 6.12.6 1715 | chalk: 4.1.2 1716 | cross-spawn: 7.0.6 1717 | debug: 4.4.3 1718 | escape-string-regexp: 4.0.0 1719 | eslint-scope: 8.4.0 1720 | eslint-visitor-keys: 4.2.1 1721 | espree: 10.4.0 1722 | esquery: 1.6.0 1723 | esutils: 2.0.3 1724 | fast-deep-equal: 3.1.3 1725 | file-entry-cache: 8.0.0 1726 | find-up: 5.0.0 1727 | glob-parent: 6.0.2 1728 | ignore: 5.3.2 1729 | imurmurhash: 0.1.4 1730 | is-glob: 4.0.3 1731 | json-stable-stringify-without-jsonify: 1.0.1 1732 | lodash.merge: 4.6.2 1733 | minimatch: 3.1.2 1734 | natural-compare: 1.4.0 1735 | optionator: 0.9.4 1736 | transitivePeerDependencies: 1737 | - supports-color 1738 | 1739 | espree@10.4.0: 1740 | dependencies: 1741 | acorn: 8.15.0 1742 | acorn-jsx: 5.3.2(acorn@8.15.0) 1743 | eslint-visitor-keys: 4.2.1 1744 | 1745 | esprima@4.0.1: {} 1746 | 1747 | esquery@1.6.0: 1748 | dependencies: 1749 | estraverse: 5.3.0 1750 | 1751 | esrecurse@4.3.0: 1752 | dependencies: 1753 | estraverse: 5.3.0 1754 | 1755 | estraverse@5.3.0: {} 1756 | 1757 | esutils@2.0.3: {} 1758 | 1759 | execa@9.6.1: 1760 | dependencies: 1761 | '@sindresorhus/merge-streams': 4.0.0 1762 | cross-spawn: 7.0.6 1763 | figures: 6.1.0 1764 | get-stream: 9.0.1 1765 | human-signals: 8.0.1 1766 | is-plain-obj: 4.1.0 1767 | is-stream: 4.0.1 1768 | npm-run-path: 6.0.0 1769 | pretty-ms: 9.3.0 1770 | signal-exit: 4.1.0 1771 | strip-final-newline: 4.0.0 1772 | yoctocolors: 2.1.2 1773 | 1774 | extendable-error@0.1.7: {} 1775 | 1776 | fast-deep-equal@3.1.3: {} 1777 | 1778 | fast-glob@3.3.3: 1779 | dependencies: 1780 | '@nodelib/fs.stat': 2.0.5 1781 | '@nodelib/fs.walk': 1.2.8 1782 | glob-parent: 5.1.2 1783 | merge2: 1.4.1 1784 | micromatch: 4.0.8 1785 | 1786 | fast-json-stable-stringify@2.1.0: {} 1787 | 1788 | fast-levenshtein@2.0.6: {} 1789 | 1790 | fastq@1.19.1: 1791 | dependencies: 1792 | reusify: 1.1.0 1793 | 1794 | fdir@6.5.0(picomatch@4.0.3): 1795 | optionalDependencies: 1796 | picomatch: 4.0.3 1797 | 1798 | figures@6.1.0: 1799 | dependencies: 1800 | is-unicode-supported: 2.1.0 1801 | 1802 | file-entry-cache@8.0.0: 1803 | dependencies: 1804 | flat-cache: 4.0.1 1805 | 1806 | fill-range@7.1.1: 1807 | dependencies: 1808 | to-regex-range: 5.0.1 1809 | 1810 | find-up-simple@1.0.1: {} 1811 | 1812 | find-up@4.1.0: 1813 | dependencies: 1814 | locate-path: 5.0.0 1815 | path-exists: 4.0.0 1816 | 1817 | find-up@5.0.0: 1818 | dependencies: 1819 | locate-path: 6.0.0 1820 | path-exists: 4.0.0 1821 | 1822 | flat-cache@4.0.1: 1823 | dependencies: 1824 | flatted: 3.3.3 1825 | keyv: 4.5.4 1826 | 1827 | flatted@3.3.3: {} 1828 | 1829 | fs-extra@7.0.1: 1830 | dependencies: 1831 | graceful-fs: 4.2.11 1832 | jsonfile: 4.0.0 1833 | universalify: 0.1.2 1834 | 1835 | fs-extra@8.1.0: 1836 | dependencies: 1837 | graceful-fs: 4.2.11 1838 | jsonfile: 4.0.0 1839 | universalify: 0.1.2 1840 | 1841 | get-stream@9.0.1: 1842 | dependencies: 1843 | '@sec-ant/readable-stream': 0.4.1 1844 | is-stream: 4.0.1 1845 | 1846 | glob-parent@5.1.2: 1847 | dependencies: 1848 | is-glob: 4.0.3 1849 | 1850 | glob-parent@6.0.2: 1851 | dependencies: 1852 | is-glob: 4.0.3 1853 | 1854 | glob@13.0.0: 1855 | dependencies: 1856 | minimatch: 10.1.1 1857 | minipass: 7.1.2 1858 | path-scurry: 2.0.1 1859 | 1860 | globals@14.0.0: {} 1861 | 1862 | globals@16.5.0: {} 1863 | 1864 | globby@11.1.0: 1865 | dependencies: 1866 | array-union: 2.1.0 1867 | dir-glob: 3.0.1 1868 | fast-glob: 3.3.3 1869 | ignore: 5.3.2 1870 | merge2: 1.4.1 1871 | slash: 3.0.0 1872 | 1873 | graceful-fs@4.2.11: {} 1874 | 1875 | graphemer@1.4.0: {} 1876 | 1877 | has-flag@4.0.0: {} 1878 | 1879 | human-id@4.1.3: {} 1880 | 1881 | human-signals@8.0.1: {} 1882 | 1883 | iconv-lite@0.7.0: 1884 | dependencies: 1885 | safer-buffer: 2.1.2 1886 | 1887 | ignore@5.3.2: {} 1888 | 1889 | ignore@7.0.5: {} 1890 | 1891 | import-fresh@3.3.1: 1892 | dependencies: 1893 | parent-module: 1.0.1 1894 | resolve-from: 4.0.0 1895 | 1896 | imurmurhash@0.1.4: {} 1897 | 1898 | indent-string@5.0.0: {} 1899 | 1900 | is-builtin-module@5.0.0: 1901 | dependencies: 1902 | builtin-modules: 5.0.0 1903 | 1904 | is-extglob@2.1.1: {} 1905 | 1906 | is-glob@4.0.3: 1907 | dependencies: 1908 | is-extglob: 2.1.1 1909 | 1910 | is-number@7.0.0: {} 1911 | 1912 | is-plain-obj@4.1.0: {} 1913 | 1914 | is-stream@4.0.1: {} 1915 | 1916 | is-subdir@1.2.0: 1917 | dependencies: 1918 | better-path-resolve: 1.0.0 1919 | 1920 | is-unicode-supported@2.1.0: {} 1921 | 1922 | is-windows@1.0.2: {} 1923 | 1924 | isexe@2.0.0: {} 1925 | 1926 | js-yaml@3.14.2: 1927 | dependencies: 1928 | argparse: 1.0.10 1929 | esprima: 4.0.1 1930 | 1931 | js-yaml@4.1.1: 1932 | dependencies: 1933 | argparse: 2.0.1 1934 | 1935 | jsesc@3.1.0: {} 1936 | 1937 | json-buffer@3.0.1: {} 1938 | 1939 | json-schema-traverse@0.4.1: {} 1940 | 1941 | json-stable-stringify-without-jsonify@1.0.1: {} 1942 | 1943 | jsonfile@4.0.0: 1944 | optionalDependencies: 1945 | graceful-fs: 4.2.11 1946 | 1947 | keyv@4.5.4: 1948 | dependencies: 1949 | json-buffer: 3.0.1 1950 | 1951 | levn@0.4.1: 1952 | dependencies: 1953 | prelude-ls: 1.2.1 1954 | type-check: 0.4.0 1955 | 1956 | locate-path@5.0.0: 1957 | dependencies: 1958 | p-locate: 4.1.0 1959 | 1960 | locate-path@6.0.0: 1961 | dependencies: 1962 | p-locate: 5.0.0 1963 | 1964 | lodash.merge@4.6.2: {} 1965 | 1966 | lodash.startcase@4.4.0: {} 1967 | 1968 | lru-cache@11.2.4: {} 1969 | 1970 | merge2@1.4.1: {} 1971 | 1972 | micromatch@4.0.8: 1973 | dependencies: 1974 | braces: 3.0.3 1975 | picomatch: 2.3.1 1976 | 1977 | minimatch@10.1.1: 1978 | dependencies: 1979 | '@isaacs/brace-expansion': 5.0.0 1980 | 1981 | minimatch@3.1.2: 1982 | dependencies: 1983 | brace-expansion: 1.1.12 1984 | 1985 | minimatch@9.0.5: 1986 | dependencies: 1987 | brace-expansion: 2.0.2 1988 | 1989 | minipass@7.1.2: {} 1990 | 1991 | mri@1.2.0: {} 1992 | 1993 | ms@2.1.3: {} 1994 | 1995 | natural-compare@1.4.0: {} 1996 | 1997 | node-releases@2.0.27: {} 1998 | 1999 | npm-run-path@6.0.0: 2000 | dependencies: 2001 | path-key: 4.0.0 2002 | unicorn-magic: 0.3.0 2003 | 2004 | optionator@0.9.4: 2005 | dependencies: 2006 | deep-is: 0.1.4 2007 | fast-levenshtein: 2.0.6 2008 | levn: 0.4.1 2009 | prelude-ls: 1.2.1 2010 | type-check: 0.4.0 2011 | word-wrap: 1.2.5 2012 | 2013 | outdent@0.5.0: {} 2014 | 2015 | p-filter@2.1.0: 2016 | dependencies: 2017 | p-map: 2.1.0 2018 | 2019 | p-limit@2.3.0: 2020 | dependencies: 2021 | p-try: 2.2.0 2022 | 2023 | p-limit@3.1.0: 2024 | dependencies: 2025 | yocto-queue: 0.1.0 2026 | 2027 | p-locate@4.1.0: 2028 | dependencies: 2029 | p-limit: 2.3.0 2030 | 2031 | p-locate@5.0.0: 2032 | dependencies: 2033 | p-limit: 3.1.0 2034 | 2035 | p-map@2.1.0: {} 2036 | 2037 | p-try@2.2.0: {} 2038 | 2039 | package-json-from-dist@1.0.1: {} 2040 | 2041 | package-manager-detector@0.2.11: 2042 | dependencies: 2043 | quansync: 0.2.11 2044 | 2045 | parent-module@1.0.1: 2046 | dependencies: 2047 | callsites: 3.1.0 2048 | 2049 | parse-ms@4.0.0: {} 2050 | 2051 | path-exists@4.0.0: {} 2052 | 2053 | path-key@3.1.1: {} 2054 | 2055 | path-key@4.0.0: {} 2056 | 2057 | path-scurry@2.0.1: 2058 | dependencies: 2059 | lru-cache: 11.2.4 2060 | minipass: 7.1.2 2061 | 2062 | path-type@4.0.0: {} 2063 | 2064 | picocolors@1.1.1: {} 2065 | 2066 | picomatch@2.3.1: {} 2067 | 2068 | picomatch@4.0.3: {} 2069 | 2070 | pify@4.0.1: {} 2071 | 2072 | pluralize@8.0.0: {} 2073 | 2074 | prelude-ls@1.2.1: {} 2075 | 2076 | prettier@2.8.8: {} 2077 | 2078 | pretty-ms@9.3.0: 2079 | dependencies: 2080 | parse-ms: 4.0.0 2081 | 2082 | punycode@2.3.1: {} 2083 | 2084 | quansync@0.2.11: {} 2085 | 2086 | queue-microtask@1.2.3: {} 2087 | 2088 | read-yaml-file@1.1.0: 2089 | dependencies: 2090 | graceful-fs: 4.2.11 2091 | js-yaml: 3.14.2 2092 | pify: 4.0.1 2093 | strip-bom: 3.0.0 2094 | 2095 | regexp-tree@0.1.27: {} 2096 | 2097 | regjsparser@0.13.0: 2098 | dependencies: 2099 | jsesc: 3.1.0 2100 | 2101 | resolve-from@4.0.0: {} 2102 | 2103 | resolve-from@5.0.0: {} 2104 | 2105 | reusify@1.1.0: {} 2106 | 2107 | rimraf@6.1.2: 2108 | dependencies: 2109 | glob: 13.0.0 2110 | package-json-from-dist: 1.0.1 2111 | 2112 | run-parallel@1.2.0: 2113 | dependencies: 2114 | queue-microtask: 1.2.3 2115 | 2116 | safer-buffer@2.1.2: {} 2117 | 2118 | semver@7.7.3: {} 2119 | 2120 | shebang-command@2.0.0: 2121 | dependencies: 2122 | shebang-regex: 3.0.0 2123 | 2124 | shebang-regex@3.0.0: {} 2125 | 2126 | signal-exit@4.1.0: {} 2127 | 2128 | slash@3.0.0: {} 2129 | 2130 | spawndamnit@3.0.1: 2131 | dependencies: 2132 | cross-spawn: 7.0.6 2133 | signal-exit: 4.1.0 2134 | 2135 | sprintf-js@1.0.3: {} 2136 | 2137 | strip-ansi@6.0.1: 2138 | dependencies: 2139 | ansi-regex: 5.0.1 2140 | 2141 | strip-bom@3.0.0: {} 2142 | 2143 | strip-final-newline@4.0.0: {} 2144 | 2145 | strip-indent@4.1.1: {} 2146 | 2147 | strip-json-comments@3.1.1: {} 2148 | 2149 | supports-color@7.2.0: 2150 | dependencies: 2151 | has-flag: 4.0.0 2152 | 2153 | term-size@2.2.1: {} 2154 | 2155 | tinyglobby@0.2.15: 2156 | dependencies: 2157 | fdir: 6.5.0(picomatch@4.0.3) 2158 | picomatch: 4.0.3 2159 | 2160 | to-regex-range@5.0.1: 2161 | dependencies: 2162 | is-number: 7.0.0 2163 | 2164 | ts-api-utils@2.1.0(typescript@5.9.3): 2165 | dependencies: 2166 | typescript: 5.9.3 2167 | 2168 | typanion@3.14.0: {} 2169 | 2170 | type-check@0.4.0: 2171 | dependencies: 2172 | prelude-ls: 1.2.1 2173 | 2174 | typescript-eslint@8.48.1(eslint@9.39.1)(typescript@5.9.3): 2175 | dependencies: 2176 | '@typescript-eslint/eslint-plugin': 8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) 2177 | '@typescript-eslint/parser': 8.48.1(eslint@9.39.1)(typescript@5.9.3) 2178 | '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) 2179 | '@typescript-eslint/utils': 8.48.1(eslint@9.39.1)(typescript@5.9.3) 2180 | eslint: 9.39.1 2181 | typescript: 5.9.3 2182 | transitivePeerDependencies: 2183 | - supports-color 2184 | 2185 | typescript@5.9.3: {} 2186 | 2187 | undici-types@5.26.5: {} 2188 | 2189 | unicorn-magic@0.3.0: {} 2190 | 2191 | universalify@0.1.2: {} 2192 | 2193 | update-browserslist-db@1.2.2(browserslist@4.28.1): 2194 | dependencies: 2195 | browserslist: 4.28.1 2196 | escalade: 3.2.0 2197 | picocolors: 1.1.1 2198 | 2199 | uri-js@4.4.1: 2200 | dependencies: 2201 | punycode: 2.3.1 2202 | 2203 | which@2.0.2: 2204 | dependencies: 2205 | isexe: 2.0.0 2206 | 2207 | word-wrap@1.2.5: {} 2208 | 2209 | yocto-queue@0.1.0: {} 2210 | 2211 | yoctocolors@2.1.2: {} 2212 | --------------------------------------------------------------------------------