From 3993896591974e04e28d158805d38f6f10da24f4 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Tue, 15 Apr 2025 11:58:47 +0800 Subject: [PATCH 01/27] chore: update dependencies in package.json - Added vite as a dependency (v6.2.6) - Added esbuild as a devDependency (v0.25.2) --- .github/workflows/ci.yml | 29 + .github/workflows/npm-publish.yml | 19 +- .github/workflows/prepare-release.yml | 16 +- .husky/pre-commit | 3 - package-lock.json | 1597 ++++--------------------- package.json | 6 +- 6 files changed, 310 insertions(+), 1360 deletions(-) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..a254aab --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + build-and-test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js 20 + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "npm" + + - name: Install dependencies + run: npm ci + + - name: Run tests + run: npm test + + - name: Build + run: npm run build diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index 8a0983d..870a287 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -5,20 +5,11 @@ on: types: [published] jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 20 - - run: npm ci - - run: npm test - - run: npm run build - publish-npm: - needs: build runs-on: ubuntu-latest + permissions: + contents: read + id-token: write steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 @@ -26,6 +17,8 @@ jobs: node-version: 20 registry-url: https://registry.npmjs.org/ - run: npm ci - - run: npm publish --access=public + - run: npm test + - run: npm run build + - run: npm publish env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index 89f6412..307698c 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -4,9 +4,9 @@ on: workflow_dispatch: inputs: version: - description: 'Version to bump to (e.g. patch, minor, major, or specific version)' + description: "Version to bump to (e.g. patch, minor, major, or specific version)" required: true - default: 'patch' + default: "patch" jobs: prepare-release: @@ -15,26 +15,26 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - + - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 - + - name: Install dependencies run: npm ci - + - name: Update version run: | npm version ${{ github.event.inputs.version }} --no-git-tag-version NEW_VERSION=$(node -p "require('./package.json').version") echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV - + - name: Generate changelog id: changelog run: | npx conventional-changelog-cli -p angular -i CHANGELOG.md -s - + - name: Create Pull Request uses: peter-evans/create-pull-request@v7 with: @@ -43,7 +43,7 @@ jobs: title: "chore(release): prepare release v${{ env.NEW_VERSION }}" body: | Prepare release v${{ env.NEW_VERSION }} - + - Update version in package.json - Update CHANGELOG.md base: main diff --git a/.husky/pre-commit b/.husky/pre-commit index 6e1eeed..2e67158 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,5 +1,2 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - npx lint-staged npm run build diff --git a/package-lock.json b/package-lock.json index 0786546..ed7fc42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.8.0", + "@rollup/rollup-linux-x64-gnu": "*", "leetcode-query": "^2.0.0", "minimist": "^1.2.8", "ts-node": "^10.9.2", @@ -22,6 +23,7 @@ "@eslint/js": "^9.24.0", "@types/minimist": "^1.2.5", "@types/node": "^22.14.0", + "esbuild": "^0.25.2", "eslint": "^9.24.0", "eslint-config-prettier": "^10.1.2", "eslint-plugin-prettier": "^5.2.6", @@ -33,416 +35,41 @@ "tsc-watch": "6.2.1", "typescript": "^5.8.3", "typescript-eslint": "^8.29.1", - "vitest": "^1.6.1" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "vitest": "^3.1.1" }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "^4.40.0" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, "engines": { "node": ">=12" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { "version": "4.6.0", - "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.6.0.tgz", - "integrity": "sha512-WhCn7Z7TauhBtmzhvKpoQs0Wwb/kBcy4CwpuI0/eEIr2Lx2auxmulAzLr91wVZJaz47iUZdkXOK7WlAfxGKCnA==", "dev": true, "license": "MIT", "dependencies": { @@ -460,8 +87,6 @@ }, "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { @@ -473,8 +98,6 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", - "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "license": "MIT", "engines": { @@ -483,8 +106,6 @@ }, "node_modules/@eslint/config-array": { "version": "0.20.0", - "resolved": "https://registry.npmmirror.com/@eslint/config-array/-/config-array-0.20.0.tgz", - "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -498,8 +119,6 @@ }, "node_modules/@eslint/config-helpers": { "version": "0.2.1", - "resolved": "https://registry.npmmirror.com/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", - "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -508,8 +127,6 @@ }, "node_modules/@eslint/core": { "version": "0.12.0", - "resolved": "https://registry.npmmirror.com/@eslint/core/-/core-0.12.0.tgz", - "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -521,8 +138,6 @@ }, "node_modules/@eslint/eslintrc": { "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "license": "MIT", "dependencies": { @@ -545,8 +160,6 @@ }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", "engines": { @@ -558,8 +171,6 @@ }, "node_modules/@eslint/js": { "version": "9.24.0", - "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-9.24.0.tgz", - "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==", "dev": true, "license": "MIT", "engines": { @@ -568,8 +179,6 @@ }, "node_modules/@eslint/object-schema": { "version": "2.1.6", - "resolved": "https://registry.npmmirror.com/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -578,8 +187,6 @@ }, "node_modules/@eslint/plugin-kit": { "version": "0.2.8", - "resolved": "https://registry.npmmirror.com/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", - "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -592,8 +199,6 @@ }, "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { "version": "0.13.0", - "resolved": "https://registry.npmmirror.com/@eslint/core/-/core-0.13.0.tgz", - "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -605,8 +210,6 @@ }, "node_modules/@fetch-impl/cross-fetch": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/@fetch-impl/cross-fetch/-/cross-fetch-1.0.0.tgz", - "integrity": "sha512-vNvwtCQ7yruvpYnp1i/4paVi/icrGYx9O4eHNDYorjTAFg78bhitO0l39opJSVfsTKqyWqj3+2+YenoGhZOCJA==", "license": "MIT", "peerDependencies": { "@fetch-impl/fetcher": "^1.0.0", @@ -615,14 +218,10 @@ }, "node_modules/@fetch-impl/fetcher": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/@fetch-impl/fetcher/-/fetcher-1.0.0.tgz", - "integrity": "sha512-UPUN9Yfjnk513Vc08iNW8/9L1nSwQMsTx6nOvmjPNfU2Rtbew/2KgAbQDPuoL6PrNgEmEmmyeM29BkcVBpt3gQ==", "license": "MIT" }, "node_modules/@humanfs/core": { "version": "0.19.1", - "resolved": "https://registry.npmmirror.com/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -631,8 +230,6 @@ }, "node_modules/@humanfs/node": { "version": "0.16.6", - "resolved": "https://registry.npmmirror.com/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -645,8 +242,6 @@ }, "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { "version": "0.3.1", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -659,8 +254,6 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -673,8 +266,6 @@ }, "node_modules/@humanwhocodes/retry": { "version": "0.4.2", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -685,23 +276,8 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -709,14 +285,10 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", @@ -725,8 +297,6 @@ }, "node_modules/@modelcontextprotocol/sdk": { "version": "1.8.0", - "resolved": "https://registry.npmmirror.com/@modelcontextprotocol/sdk/-/sdk-1.8.0.tgz", - "integrity": "sha512-e06W7SwrontJDHwCawNO5SGxG+nU9AAx+jpHHZqGl/WrDBdWOpvirC+s58VpJTB5QemI4jTRcjWT4Pt3Q1NPQQ==", "license": "MIT", "dependencies": { "content-type": "^1.0.5", @@ -746,8 +316,6 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { @@ -760,8 +328,6 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { @@ -770,8 +336,6 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { @@ -784,8 +348,6 @@ }, "node_modules/@pkgr/core": { "version": "0.2.2", - "resolved": "https://registry.npmmirror.com/@pkgr/core/-/core-0.2.2.tgz", - "integrity": "sha512-25L86MyPvnlQoX2MTIV2OiUcb6vJ6aRbFa9pbwByn95INKD5mFH2smgjDhq+fwJoqAgvgbdJLj6Tz7V9X5CFAQ==", "dev": true, "license": "MIT", "engines": { @@ -825,8 +387,6 @@ }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz", - "integrity": "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==", "cpu": [ "arm64" ], @@ -1006,13 +566,12 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", - "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", + "version": "4.40.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz", + "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1075,62 +634,39 @@ "win32" ] }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, "node_modules/@tsconfig/node10": { "version": "1.0.11", - "resolved": "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/minimist": { "version": "1.2.5", - "resolved": "https://registry.npmmirror.com/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { "version": "22.14.0", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.14.0.tgz", - "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -1138,8 +674,6 @@ }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.29.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.1.tgz", - "integrity": "sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==", "dev": true, "license": "MIT", "dependencies": { @@ -1168,8 +702,6 @@ }, "node_modules/@typescript-eslint/parser": { "version": "8.29.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.29.1.tgz", - "integrity": "sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==", "dev": true, "license": "MIT", "dependencies": { @@ -1193,8 +725,6 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.29.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.29.1.tgz", - "integrity": "sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==", "dev": true, "license": "MIT", "dependencies": { @@ -1211,8 +741,6 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "8.29.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.29.1.tgz", - "integrity": "sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==", "dev": true, "license": "MIT", "dependencies": { @@ -1235,8 +763,6 @@ }, "node_modules/@typescript-eslint/types": { "version": "8.29.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.29.1.tgz", - "integrity": "sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==", "dev": true, "license": "MIT", "engines": { @@ -1249,8 +775,6 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "8.29.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.1.tgz", - "integrity": "sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==", "dev": true, "license": "MIT", "dependencies": { @@ -1276,8 +800,6 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { @@ -1286,8 +808,6 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -1302,8 +822,6 @@ }, "node_modules/@typescript-eslint/utils": { "version": "8.29.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.29.1.tgz", - "integrity": "sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==", "dev": true, "license": "MIT", "dependencies": { @@ -1326,8 +844,6 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "8.29.1", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.1.tgz", - "integrity": "sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==", "dev": true, "license": "MIT", "dependencies": { @@ -1343,74 +859,113 @@ } }, "node_modules/@vitest/expect": { - "version": "1.6.1", - "resolved": "https://registry.npmmirror.com/@vitest/expect/-/expect-1.6.1.tgz", - "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==", + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@vitest/expect/-/expect-3.1.1.tgz", + "integrity": "sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.1.1", + "@vitest/utils": "3.1.1", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@vitest/mocker/-/mocker-3.1.1.tgz", + "integrity": "sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.1.1", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@vitest/pretty-format/-/pretty-format-3.1.1.tgz", + "integrity": "sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "1.6.1", - "@vitest/utils": "1.6.1", - "chai": "^4.3.10" + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "1.6.1", - "resolved": "https://registry.npmmirror.com/@vitest/runner/-/runner-1.6.1.tgz", - "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==", + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@vitest/runner/-/runner-3.1.1.tgz", + "integrity": "sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "1.6.1", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" + "@vitest/utils": "3.1.1", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "1.6.1", - "resolved": "https://registry.npmmirror.com/@vitest/snapshot/-/snapshot-1.6.1.tgz", - "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==", + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@vitest/snapshot/-/snapshot-3.1.1.tgz", + "integrity": "sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==", "dev": true, "license": "MIT", "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" + "@vitest/pretty-format": "3.1.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/spy": { - "version": "1.6.1", - "resolved": "https://registry.npmmirror.com/@vitest/spy/-/spy-1.6.1.tgz", - "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==", + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@vitest/spy/-/spy-3.1.1.tgz", + "integrity": "sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^2.2.0" + "tinyspy": "^3.0.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "1.6.1", - "resolved": "https://registry.npmmirror.com/@vitest/utils/-/utils-1.6.1.tgz", - "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==", + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@vitest/utils/-/utils-3.1.1.tgz", + "integrity": "sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==", "dev": true, "license": "MIT", "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" + "@vitest/pretty-format": "3.1.1", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -1418,8 +973,6 @@ }, "node_modules/accepts": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { "mime-types": "^3.0.0", @@ -1431,8 +984,6 @@ }, "node_modules/acorn": { "version": "8.14.1", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -1443,8 +994,6 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -1453,8 +1002,6 @@ }, "node_modules/acorn-walk": { "version": "8.3.4", - "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "license": "MIT", "dependencies": { "acorn": "^8.11.0" @@ -1465,8 +1012,6 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -1482,8 +1027,6 @@ }, "node_modules/ansi-escapes": { "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, "license": "MIT", "dependencies": { @@ -1498,8 +1041,6 @@ }, "node_modules/ansi-regex": { "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { @@ -1509,53 +1050,32 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { - "node": "*" + "node": ">=12" } }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/body-parser": { "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", @@ -1574,8 +1094,6 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { @@ -1585,8 +1103,6 @@ }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { @@ -1598,8 +1114,6 @@ }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -1617,8 +1131,6 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -1630,8 +1142,6 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -1646,8 +1156,6 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { @@ -1655,28 +1163,24 @@ } }, "node_modules/chai": { - "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", "dev": true, "license": "MIT", "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=12" } }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -1692,8 +1196,6 @@ }, "node_modules/chalk/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -1707,22 +1209,17 @@ } }, "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.2" - }, "engines": { - "node": "*" + "node": ">= 16" } }, "node_modules/cli-cursor": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", "dependencies": { @@ -1737,8 +1234,6 @@ }, "node_modules/cli-truncate": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, "license": "MIT", "dependencies": { @@ -1754,8 +1249,6 @@ }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1767,22 +1260,16 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, "license": "MIT" }, "node_modules/commander": { "version": "13.1.0", - "resolved": "https://registry.npmmirror.com/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", "dev": true, "license": "MIT", "engines": { @@ -1791,22 +1278,11 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", "dev": true, "license": "MIT" }, "node_modules/content-disposition": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -1817,8 +1293,6 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -1826,8 +1300,6 @@ }, "node_modules/cookie": { "version": "0.7.2", - "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -1835,8 +1307,6 @@ }, "node_modules/cookie-signature": { "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", "engines": { "node": ">=6.6.0" @@ -1844,8 +1314,6 @@ }, "node_modules/cors": { "version": "2.8.5", - "resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "license": "MIT", "dependencies": { "object-assign": "^4", @@ -1857,14 +1325,10 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "license": "MIT" }, "node_modules/cross-fetch": { "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/cross-fetch/-/cross-fetch-4.1.0.tgz", - "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", "license": "MIT", "dependencies": { "node-fetch": "^2.7.0" @@ -1872,8 +1336,6 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -1886,8 +1348,6 @@ }, "node_modules/debug": { "version": "4.4.0", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -1902,29 +1362,22 @@ } }, "node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmmirror.com/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, "engines": { "node": ">=6" } }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -1932,27 +1385,13 @@ }, "node_modules/diff": { "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -1965,28 +1404,20 @@ }, "node_modules/duplexer": { "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true, "license": "MIT" }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, "node_modules/emoji-regex": { "version": "10.4.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true, "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -1994,8 +1425,6 @@ }, "node_modules/environment": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, "license": "MIT", "engines": { @@ -2007,8 +1436,6 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -2016,17 +1443,20 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true, + "license": "MIT" + }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -2036,9 +1466,9 @@ } }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.25.2", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2046,44 +1476,42 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" } }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -2095,8 +1523,6 @@ }, "node_modules/eslint": { "version": "9.24.0", - "resolved": "https://registry.npmmirror.com/eslint/-/eslint-9.24.0.tgz", - "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2156,8 +1582,6 @@ }, "node_modules/eslint-config-prettier": { "version": "10.1.2", - "resolved": "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-10.1.2.tgz", - "integrity": "sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==", "dev": true, "license": "MIT", "bin": { @@ -2169,8 +1593,6 @@ }, "node_modules/eslint-plugin-prettier": { "version": "5.2.6", - "resolved": "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.6.tgz", - "integrity": "sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2200,8 +1622,6 @@ }, "node_modules/eslint-scope": { "version": "8.3.0", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-8.3.0.tgz", - "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2217,8 +1637,6 @@ }, "node_modules/eslint-visitor-keys": { "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2230,8 +1648,6 @@ }, "node_modules/espree": { "version": "10.3.0", - "resolved": "https://registry.npmmirror.com/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2248,8 +1664,6 @@ }, "node_modules/esquery": { "version": "1.6.0", - "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2261,8 +1675,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2274,8 +1686,6 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -2294,8 +1704,6 @@ }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -2304,8 +1712,6 @@ }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -2313,8 +1719,6 @@ }, "node_modules/event-stream": { "version": "3.3.4", - "resolved": "https://registry.npmmirror.com/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", "dev": true, "license": "MIT", "dependencies": { @@ -2329,14 +1733,10 @@ }, "node_modules/eventemitter3": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "license": "MIT" }, "node_modules/eventsource": { "version": "3.0.6", - "resolved": "https://registry.npmmirror.com/eventsource/-/eventsource-3.0.6.tgz", - "integrity": "sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==", "license": "MIT", "dependencies": { "eventsource-parser": "^3.0.1" @@ -2347,8 +1747,6 @@ }, "node_modules/eventsource-parser": { "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/eventsource-parser/-/eventsource-parser-3.0.1.tgz", - "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -2356,8 +1754,6 @@ }, "node_modules/execa": { "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "license": "MIT", "dependencies": { @@ -2378,10 +1774,18 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/expect-type": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/expect-type/-/expect-type-1.2.1.tgz", + "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/express": { "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", "dependencies": { "accepts": "^2.0.0", @@ -2422,8 +1826,6 @@ }, "node_modules/express-rate-limit": { "version": "7.5.0", - "resolved": "https://registry.npmmirror.com/express-rate-limit/-/express-rate-limit-7.5.0.tgz", - "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", "license": "MIT", "engines": { "node": ">= 16" @@ -2437,22 +1839,16 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, "node_modules/fast-diff": { "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true, "license": "Apache-2.0" }, "node_modules/fast-glob": { "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -2468,8 +1864,6 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -2481,22 +1875,16 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "node_modules/fastq": { "version": "1.19.1", - "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, "license": "ISC", "dependencies": { @@ -2505,8 +1893,6 @@ }, "node_modules/file-entry-cache": { "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2518,8 +1904,6 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -2531,8 +1915,6 @@ }, "node_modules/finalhandler": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -2548,8 +1930,6 @@ }, "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { @@ -2565,8 +1945,6 @@ }, "node_modules/flat-cache": { "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { @@ -2579,15 +1957,11 @@ }, "node_modules/flatted": { "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -2595,8 +1969,6 @@ }, "node_modules/fresh": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -2604,17 +1976,12 @@ }, "node_modules/from": { "version": "0.1.7", - "resolved": "https://registry.npmmirror.com/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", "dev": true, "license": "MIT" }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -2626,8 +1993,6 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2635,8 +2000,6 @@ }, "node_modules/get-east-asian-width": { "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", "dev": true, "license": "MIT", "engines": { @@ -2646,20 +2009,8 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -2682,8 +2033,6 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -2695,8 +2044,6 @@ }, "node_modules/get-stream": { "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "license": "MIT", "engines": { @@ -2708,8 +2055,6 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -2721,8 +2066,6 @@ }, "node_modules/globals": { "version": "16.0.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-16.0.0.tgz", - "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==", "dev": true, "license": "MIT", "engines": { @@ -2734,8 +2077,6 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -2746,15 +2087,11 @@ }, "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -2763,8 +2100,6 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -2775,8 +2110,6 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -2787,8 +2120,6 @@ }, "node_modules/http-errors": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "license": "MIT", "dependencies": { "depd": "2.0.0", @@ -2803,8 +2134,6 @@ }, "node_modules/human-signals": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2813,8 +2142,6 @@ }, "node_modules/husky": { "version": "9.1.7", - "resolved": "https://registry.npmmirror.com/husky/-/husky-9.1.7.tgz", - "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, "license": "MIT", "bin": { @@ -2829,8 +2156,6 @@ }, "node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -2841,8 +2166,6 @@ }, "node_modules/ignore": { "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -2851,8 +2174,6 @@ }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2868,8 +2189,6 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -2878,14 +2197,10 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -2893,8 +2208,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -2903,8 +2216,6 @@ }, "node_modules/is-fullwidth-code-point": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, "license": "MIT", "engines": { @@ -2916,8 +2227,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -2929,8 +2238,6 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", "engines": { @@ -2939,14 +2246,10 @@ }, "node_modules/is-promise": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, "node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "license": "MIT", "engines": { @@ -2958,21 +2261,10 @@ }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, - "node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, "node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", "dependencies": { @@ -2984,29 +2276,21 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { @@ -3015,8 +2299,6 @@ }, "node_modules/leetcode-query": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/leetcode-query/-/leetcode-query-2.0.0.tgz", - "integrity": "sha512-kIX2YZq/XTRx53VObr4D39u9nSEnBUl3aCoYQEzTusuo97Oo3EfjryvyN6esqwqtfYa2AeSy/glsKVVxyTAcXw==", "license": "MIT", "dependencies": { "@fetch-impl/cross-fetch": "^1.0.0", @@ -3027,8 +2309,6 @@ }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3041,8 +2321,6 @@ }, "node_modules/lilconfig": { "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, "license": "MIT", "engines": { @@ -3054,8 +2332,6 @@ }, "node_modules/lint-staged": { "version": "15.5.1", - "resolved": "https://registry.npmmirror.com/lint-staged/-/lint-staged-15.5.1.tgz", - "integrity": "sha512-6m7u8mue4Xn6wK6gZvSCQwBvMBR36xfY24nF5bMTf2MHDYG6S3yhJuOgdYVw99hsjyDt2d4z168b3naI8+NWtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3082,8 +2358,6 @@ }, "node_modules/lint-staged/node_modules/chalk": { "version": "5.4.1", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "dev": true, "license": "MIT", "engines": { @@ -3095,8 +2369,6 @@ }, "node_modules/listr2": { "version": "8.3.2", - "resolved": "https://registry.npmmirror.com/listr2/-/listr2-8.3.2.tgz", - "integrity": "sha512-vsBzcU4oE+v0lj4FhVLzr9dBTv4/fHIa57l+GCwovP8MoFNZJTOhGU8PXd4v2VJCbECAaijBiHntiekFMLvo0g==", "dev": true, "license": "MIT", "dependencies": { @@ -3111,27 +2383,8 @@ "node": ">=18.0.0" } }, - "node_modules/local-pkg": { - "version": "0.5.1", - "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.1.tgz", - "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -3146,15 +2399,11 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/log-update": { "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "license": "MIT", "dependencies": { @@ -3173,8 +2422,6 @@ }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", "engines": { @@ -3186,8 +2433,6 @@ }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", "dev": true, "license": "MIT", "dependencies": { @@ -3202,8 +2447,6 @@ }, "node_modules/log-update/node_modules/slice-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", "dev": true, "license": "MIT", "dependencies": { @@ -3218,14 +2461,11 @@ } }, "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmmirror.com/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } + "license": "MIT" }, "node_modules/magic-string": { "version": "0.30.17", @@ -3239,20 +2479,14 @@ }, "node_modules/make-error": { "version": "1.3.6", - "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "license": "ISC" }, "node_modules/map-stream": { "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", "dev": true }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -3260,8 +2494,6 @@ }, "node_modules/media-typer": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -3269,8 +2501,6 @@ }, "node_modules/merge-descriptors": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", "engines": { "node": ">=18" @@ -3281,15 +2511,11 @@ }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", "engines": { @@ -3298,8 +2524,6 @@ }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -3312,8 +2536,6 @@ }, "node_modules/mime-db": { "version": "1.54.0", - "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -3321,8 +2543,6 @@ }, "node_modules/mime-types": { "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -3333,8 +2553,6 @@ }, "node_modules/mimic-fn": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "license": "MIT", "engines": { @@ -3346,8 +2564,6 @@ }, "node_modules/mimic-function": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "license": "MIT", "engines": { @@ -3359,8 +2575,6 @@ }, "node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -3372,43 +2586,17 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mlly": { - "version": "1.7.4", - "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.4.tgz", - "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.14.0", - "pathe": "^2.0.1", - "pkg-types": "^1.3.0", - "ufo": "^1.5.4" - } - }, - "node_modules/mlly/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", - "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -3426,15 +2614,11 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, "node_modules/negotiator": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -3442,15 +2626,11 @@ }, "node_modules/node-cleanup": { "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/node-cleanup/-/node-cleanup-2.1.2.tgz", - "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==", "dev": true, "license": "MIT" }, "node_modules/node-fetch": { "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -3469,8 +2649,6 @@ }, "node_modules/npm-run-path": { "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3485,8 +2663,6 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", "engines": { @@ -3498,8 +2674,6 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3507,8 +2681,6 @@ }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -3519,8 +2691,6 @@ }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -3531,8 +2701,6 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -3540,8 +2708,6 @@ }, "node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3556,8 +2722,6 @@ }, "node_modules/optionator": { "version": "0.9.4", - "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { @@ -3572,26 +2736,8 @@ "node": ">= 0.8.0" } }, - "node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -3606,8 +2752,6 @@ }, "node_modules/p-locate/node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3622,8 +2766,6 @@ }, "node_modules/p-locate/node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { @@ -3635,8 +2777,6 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { @@ -3648,8 +2788,6 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -3657,8 +2795,6 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -3667,8 +2803,6 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { "node": ">=8" @@ -3676,34 +2810,30 @@ }, "node_modules/path-to-regexp": { "version": "8.2.0", - "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", "license": "MIT", "engines": { "node": ">=16" } }, "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, "license": "MIT", "engines": { - "node": "*" + "node": ">= 14.16" } }, "node_modules/pause-stream": { "version": "0.0.11", - "resolved": "https://registry.npmmirror.com/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", "dev": true, "license": [ "MIT", @@ -3715,15 +2845,11 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -3735,8 +2861,6 @@ }, "node_modules/pidtree": { "version": "0.6.0", - "resolved": "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, "license": "MIT", "bin": { @@ -3748,36 +2872,13 @@ }, "node_modules/pkce-challenge": { "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/pkce-challenge/-/pkce-challenge-4.1.0.tgz", - "integrity": "sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ==", "license": "MIT", "engines": { "node": ">=16.20.0" } }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/pkg-types/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, "node_modules/postcss": { "version": "8.5.3", - "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, "funding": [ { @@ -3805,8 +2906,6 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -3815,8 +2914,6 @@ }, "node_modules/prettier": { "version": "3.5.3", - "resolved": "https://registry.npmmirror.com/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", "dev": true, "license": "MIT", "bin": { @@ -3831,8 +2928,6 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, "license": "MIT", "dependencies": { @@ -3844,8 +2939,6 @@ }, "node_modules/prettier-plugin-organize-imports": { "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.1.0.tgz", - "integrity": "sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3859,25 +2952,8 @@ } } }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -3889,8 +2965,6 @@ }, "node_modules/ps-tree": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/ps-tree/-/ps-tree-1.2.0.tgz", - "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", "dev": true, "license": "MIT", "dependencies": { @@ -3905,8 +2979,6 @@ }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { @@ -3915,8 +2987,6 @@ }, "node_modules/qs": { "version": "6.14.0", - "resolved": "https://registry.npmmirror.com/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -3930,8 +3000,6 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -3951,8 +3019,6 @@ }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -3960,8 +3026,6 @@ }, "node_modules/raw-body": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -3973,17 +3037,8 @@ "node": ">= 0.8" } }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { @@ -3992,8 +3047,6 @@ }, "node_modules/restore-cursor": { "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", "dependencies": { @@ -4009,8 +3062,6 @@ }, "node_modules/restore-cursor/node_modules/onetime": { "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4025,8 +3076,6 @@ }, "node_modules/reusify": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { @@ -4036,15 +3085,11 @@ }, "node_modules/rfdc": { "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true, "license": "MIT" }, "node_modules/rollup": { "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.39.0.tgz", - "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==", "dev": true, "license": "MIT", "dependencies": { @@ -4081,10 +3126,22 @@ "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", + "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/router": { "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -4099,8 +3156,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -4123,8 +3178,6 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -4143,14 +3196,10 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/semver": { "version": "7.7.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "license": "ISC", "bin": { @@ -4162,8 +3211,6 @@ }, "node_modules/send": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", "dependencies": { "debug": "^4.3.5", @@ -4184,8 +3231,6 @@ }, "node_modules/serve-static": { "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", @@ -4199,14 +3244,10 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -4217,8 +3258,6 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { "node": ">=8" @@ -4226,8 +3265,6 @@ }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -4245,8 +3282,6 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -4261,8 +3296,6 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -4279,8 +3312,6 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -4298,15 +3329,11 @@ }, "node_modules/siginfo": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, "node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -4318,8 +3345,6 @@ }, "node_modules/slice-ansi": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4335,8 +3360,6 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", "engines": { @@ -4348,8 +3371,6 @@ }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -4358,8 +3379,6 @@ }, "node_modules/split": { "version": "0.3.3", - "resolved": "https://registry.npmmirror.com/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", "dev": true, "license": "MIT", "dependencies": { @@ -4371,15 +3390,11 @@ }, "node_modules/stackback": { "version": "0.0.2", - "resolved": "https://registry.npmmirror.com/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, "node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4387,15 +3402,11 @@ }, "node_modules/std-env": { "version": "3.9.0", - "resolved": "https://registry.npmmirror.com/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", "dev": true, "license": "MIT" }, "node_modules/stream-combiner": { "version": "0.0.4", - "resolved": "https://registry.npmmirror.com/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", "dev": true, "license": "MIT", "dependencies": { @@ -4404,8 +3415,6 @@ }, "node_modules/string-argv": { "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, "license": "MIT", "engines": { @@ -4414,8 +3423,6 @@ }, "node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4432,8 +3439,6 @@ }, "node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4448,8 +3453,6 @@ }, "node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "license": "MIT", "engines": { @@ -4461,8 +3464,6 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { @@ -4472,23 +3473,8 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-2.1.1.tgz", - "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -4500,8 +3486,6 @@ }, "node_modules/synckit": { "version": "0.11.3", - "resolved": "https://registry.npmmirror.com/synckit/-/synckit-0.11.3.tgz", - "integrity": "sha512-szhWDqNNI9etJUvbZ1/cx1StnZx8yMmFxme48SwR4dty4ioSY50KEZlpv0qAfgc1fpRzuh9hBXEzoCpJ779dLg==", "dev": true, "license": "MIT", "dependencies": { @@ -4517,22 +3501,35 @@ }, "node_modules/through": { "version": "2.3.8", - "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true, "license": "MIT" }, "node_modules/tinybench": { "version": "2.9.0", - "resolved": "https://registry.npmmirror.com/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true, "license": "MIT" }, "node_modules/tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmmirror.com/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, "license": "MIT", "engines": { @@ -4540,9 +3537,9 @@ } }, "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, "license": "MIT", "engines": { @@ -4551,8 +3548,6 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4564,8 +3559,6 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", "engines": { "node": ">=0.6" @@ -4573,14 +3566,10 @@ }, "node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, "node_modules/ts-api-utils": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, "license": "MIT", "engines": { @@ -4592,8 +3581,6 @@ }, "node_modules/ts-node": { "version": "10.9.2", - "resolved": "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -4635,8 +3622,6 @@ }, "node_modules/tsc-watch": { "version": "6.2.1", - "resolved": "https://registry.npmmirror.com/tsc-watch/-/tsc-watch-6.2.1.tgz", - "integrity": "sha512-GLwdz5Dy9K3sVm3RzgkLcyDpl5cvU9HEcE1A3gf5rqEwlUe7gDLxNCgcuNEw3zoKOiegMo3LnbF1t6HLqxhrSA==", "dev": true, "license": "MIT", "dependencies": { @@ -4657,15 +3642,11 @@ }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -4675,20 +3656,8 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/type-is": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { "content-type": "^1.0.5", @@ -4701,8 +3670,6 @@ }, "node_modules/typescript": { "version": "5.8.3", - "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -4714,8 +3681,6 @@ }, "node_modules/typescript-eslint": { "version": "8.29.1", - "resolved": "https://registry.npmmirror.com/typescript-eslint/-/typescript-eslint-8.29.1.tgz", - "integrity": "sha512-f8cDkvndhbQMPcysk6CUSGBWV+g1utqdn71P5YKwMumVMOG/5k7cHq0KyG4O52nB0oKS4aN2Tp5+wB4APJGC+w==", "dev": true, "license": "MIT", "dependencies": { @@ -4735,23 +3700,12 @@ "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "dev": true, - "license": "MIT" - }, "node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4759,8 +3713,6 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4769,35 +3721,31 @@ }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "license": "MIT" }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/vite": { - "version": "5.4.17", - "resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.17.tgz", - "integrity": "sha512-5+VqZryDj4wgCs55o9Lp+p8GE78TLVg0lasCH5xFZ4jacZjtqZa6JUw9/p0WeAojaOfncSM6v77InkFPGnvPvg==", + "version": "6.2.6", + "resolved": "https://registry.npmmirror.com/vite/-/vite-6.2.6.tgz", + "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -4806,19 +3754,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -4839,74 +3793,81 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, "node_modules/vite-node": { - "version": "1.6.1", - "resolved": "https://registry.npmmirror.com/vite-node/-/vite-node-1.6.1.tgz", - "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==", + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/vite-node/-/vite-node-3.1.1.tgz", + "integrity": "sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0" }, "bin": { "vite-node": "vite-node.mjs" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/vitest": { - "version": "1.6.1", - "resolved": "https://registry.npmmirror.com/vitest/-/vitest-1.6.1.tgz", - "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==", + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/vitest/-/vitest-3.1.1.tgz", + "integrity": "sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "1.6.1", - "@vitest/runner": "1.6.1", - "@vitest/snapshot": "1.6.1", - "@vitest/spy": "1.6.1", - "@vitest/utils": "1.6.1", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", - "vite": "^5.0.0", - "vite-node": "1.6.1", - "why-is-node-running": "^2.2.2" + "@vitest/expect": "3.1.1", + "@vitest/mocker": "3.1.1", + "@vitest/pretty-format": "^3.1.1", + "@vitest/runner": "3.1.1", + "@vitest/snapshot": "3.1.1", + "@vitest/spy": "3.1.1", + "@vitest/utils": "3.1.1", + "chai": "^5.2.0", + "debug": "^4.4.0", + "expect-type": "^1.2.0", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "std-env": "^3.8.1", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.1.1", + "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.6.1", - "@vitest/ui": "1.6.1", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.1.1", + "@vitest/ui": "3.1.1", "happy-dom": "*", "jsdom": "*" }, @@ -4914,6 +3875,9 @@ "@edge-runtime/vm": { "optional": true }, + "@types/debug": { + "optional": true + }, "@types/node": { "optional": true }, @@ -4933,14 +3897,10 @@ }, "node_modules/webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "license": "BSD-2-Clause" }, "node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "license": "MIT", "dependencies": { "tr46": "~0.0.3", @@ -4949,8 +3909,6 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -4964,8 +3922,6 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { @@ -4981,8 +3937,6 @@ }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { @@ -4991,8 +3945,6 @@ }, "node_modules/wrap-ansi": { "version": "9.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5009,8 +3961,6 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", "engines": { @@ -5022,14 +3972,10 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/yaml": { "version": "2.7.1", - "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.7.1.tgz", - "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", "dev": true, "license": "ISC", "bin": { @@ -5041,30 +3987,13 @@ }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/yocto-queue": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-1.2.1.tgz", - "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/zod": { "version": "3.24.2", - "resolved": "https://registry.npmmirror.com/zod/-/zod-3.24.2.tgz", - "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -5072,8 +4001,6 @@ }, "node_modules/zod-to-json-schema": { "version": "3.24.5", - "resolved": "https://registry.npmmirror.com/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", - "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", "license": "ISC", "peerDependencies": { "zod": "^3.24.1" diff --git a/package.json b/package.json index 82b3c52..bf714b5 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "@eslint/js": "^9.24.0", "@types/minimist": "^1.2.5", "@types/node": "^22.14.0", + "esbuild": "^0.25.2", "eslint": "^9.24.0", "eslint-config-prettier": "^10.1.2", "eslint-plugin-prettier": "^5.2.6", @@ -60,6 +61,9 @@ "tsc-watch": "6.2.1", "typescript": "^5.8.3", "typescript-eslint": "^8.29.1", - "vitest": "^1.6.1" + "vitest": "^3.1.1" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "^4.40.0" } } From 205369c4023ea2f167a1ced558a33d2431d5044d Mon Sep 17 00:00:00 2001 From: Frank Fiegel <108313943+punkpeye@users.noreply.github.com> Date: Wed, 16 Apr 2025 08:40:40 -0400 Subject: [PATCH 02/27] add MCP server badge --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b1147a7..498deba 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,10 @@ The LeetCode MCP Server is a [Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction) server that provides seamless integration with LeetCode APIs, enabling advanced automation and intelligent interaction with LeetCode's programming problems, contests, solutions, and user data. + + LeetCode Server MCP server + + ## Features - **Multi-site Support**: Supports both leetcode.com and leetcode.cn platforms @@ -202,4 +206,4 @@ The `JSON_DATA_STRING` contains either the requested data or an error message fo ## License -This project is licensed under the MIT License. +This project is licensed under the MIT License. \ No newline at end of file From d906371f7fccb7f3f673f090b4310f7d27aae904 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Sat, 19 Apr 2025 23:22:10 +0800 Subject: [PATCH 03/27] feat: add user notes feature for LeetCode CN --- src/index.ts | 2 + src/leetcode/graphql/cn/note-queries.ts | 62 +++++++++ src/leetcode/leetcode-base-service.ts | 37 ++++++ src/leetcode/leetcode-cn-service.ts | 105 +++++++++++++++ src/leetcode/leetcode-global-service.ts | 34 +++++ src/mcp/tools/note-tools.ts | 167 ++++++++++++++++++++++++ 6 files changed, 407 insertions(+) create mode 100644 src/leetcode/graphql/cn/note-queries.ts create mode 100644 src/mcp/tools/note-tools.ts diff --git a/src/index.ts b/src/index.ts index 5076fa2..021c809 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,6 +10,7 @@ import { LeetCodeServiceFactory } from "./leetcode/leetcode-service-factory.js"; import { registerProblemResources } from "./mcp/resources/problem-resources.js"; import { registerSolutionResources } from "./mcp/resources/solution-resources.js"; import { registerContestTools } from "./mcp/tools/contest-tools.js"; +import { registerNoteTools } from "./mcp/tools/note-tools.js"; import { registerProblemTools } from "./mcp/tools/problem-tools.js"; import { registerSolutionTools } from "./mcp/tools/solution-tools.js"; import { registerUserTools } from "./mcp/tools/user-tools.js"; @@ -92,6 +93,7 @@ async function main() { registerUserTools(server, leetcodeService); registerContestTools(server, leetcodeService); registerSolutionTools(server, leetcodeService); + registerNoteTools(server, leetcodeService); registerProblemResources(server, leetcodeService); registerSolutionResources(server, leetcodeService); diff --git a/src/leetcode/graphql/cn/note-queries.ts b/src/leetcode/graphql/cn/note-queries.ts new file mode 100644 index 0000000..8e41eae --- /dev/null +++ b/src/leetcode/graphql/cn/note-queries.ts @@ -0,0 +1,62 @@ +/** + * GraphQL query for fetching user notes on LeetCode CN + * This query allows retrieving notes with pagination, filtering, and sorting options + * + * @param orderBy - Optional sorting criteria for notes (e.g., "ASCENDING", "DESCENDING") + */ +export const NOTE_AGGREGATE_QUERY = ` +query noteAggregateNote( + $aggregateType: AggregateNoteEnum! + $keyword: String + $orderBy: AggregateNoteSortingOrderEnum + $limit: Int = 100 + $skip: Int = 0 +) { + noteAggregateNote( + aggregateType: $aggregateType + keyword: $keyword + orderBy: $orderBy + limit: $limit + skip: $skip + ) { + count + userNotes { + id + summary + content + ... on NoteAggregateQuestionNoteNode { + noteQuestion { + linkTemplate + questionId + title + translatedTitle + } + } + } + } +}`; + +/** + * GraphQL query for fetching user notes for a specific question ID on LeetCode CN + */ +export const NOTE_BY_QUESTION_ID_QUERY = ` +query noteOneTargetCommonNote( + $noteType: NoteCommonTypeEnum! + $questionId: String! + $limit: Int = 20 + $skip: Int = 0 +) { + noteOneTargetCommonNote( + noteType: $noteType + targetId: $questionId + limit: $limit + skip: $skip + ) { + count + userNotes { + id + summary + content + } + } +}`; diff --git a/src/leetcode/leetcode-base-service.ts b/src/leetcode/leetcode-base-service.ts index 6a415d2..759b7fa 100644 --- a/src/leetcode/leetcode-base-service.ts +++ b/src/leetcode/leetcode-base-service.ts @@ -170,4 +170,41 @@ export interface LeetCodeBaseService { * @returns Promise resolving to the solution article detail data */ fetchSolutionArticleDetail(identifier: string): Promise; + + /** + * Retrieves user notes from LeetCode with filtering and pagination options. + * Note: This feature is only available on LeetCode CN. + * + * @param options - Query parameters for filtering notes + * @param options.aggregateType - Type of notes to aggregate (e.g., "QUESTION_NOTE") + * @param options.keyword - Optional search term to filter notes + * @param options.orderBy - Optional sorting criteria for notes + * @param options.limit - Maximum number of notes to return + * @param options.skip - Number of notes to skip (for pagination) + * @returns Promise resolving to the filtered notes data + * @throws Error if not implemented or feature not supported + */ + fetchUserNotes(options: { + aggregateType: string; + keyword?: string; + orderBy?: string; + limit?: number; + skip?: number; + }): Promise; + + /** + * Retrieves user notes for a specific question ID. + * Note: This feature is only available on LeetCode CN. + * + * @param questionId - The question ID to fetch notes for + * @param limit - Maximum number of notes to return + * @param skip - Number of notes to skip (for pagination) + * @returns Promise resolving to the notes data for the specified question + * @throws Error if not implemented or feature not supported + */ + fetchNotesByQuestionId( + questionId: string, + limit?: number, + skip?: number + ): Promise; } diff --git a/src/leetcode/leetcode-cn-service.ts b/src/leetcode/leetcode-cn-service.ts index 3e7e9f6..44b9fb7 100644 --- a/src/leetcode/leetcode-cn-service.ts +++ b/src/leetcode/leetcode-cn-service.ts @@ -1,4 +1,8 @@ import { Credential, LeetCodeCN } from "leetcode-query"; +import { + NOTE_AGGREGATE_QUERY, + NOTE_BY_QUESTION_ID_QUERY +} from "./graphql/cn/note-queries.js"; import { SEARCH_PROBLEMS_QUERY } from "./graphql/cn/search-problems.js"; import { SOLUTION_ARTICLE_DETAIL_QUERY } from "./graphql/cn/solution-article-detail.js"; import { SOLUTION_ARTICLES_QUERY } from "./graphql/cn/solution-articles.js"; @@ -358,6 +362,107 @@ export class LeetCodeCNService implements LeetCodeBaseService { } } + /** + * Retrieves user notes from LeetCode CN with filtering and pagination options. + * Available only on LeetCode CN platform. + * + * @param options - Query parameters for filtering notes + * @param options.aggregateType - Type of notes to aggregate (e.g., "QUESTION_NOTE") + * @param options.keyword - Optional search term to filter notes + * @param options.orderBy - Optional sorting criteria for notes + * @param options.limit - Maximum number of notes to return + * @param options.skip - Number of notes to skip (for pagination) + * @returns Promise resolving to the filtered notes data + */ + async fetchUserNotes(options: { + aggregateType: string; + keyword?: string; + orderBy?: string; + limit?: number; + skip?: number; + }): Promise { + if (!this.isAuthenticated()) { + throw new Error("Authentication required to fetch user notes"); + } + + try { + const variables = { + aggregateType: options.aggregateType, + keyword: options.keyword, + orderBy: options.orderBy || "DESCENDING", + limit: options.limit || 20, + skip: options.skip || 0 + }; + + return await this.leetCodeApi + .graphql({ + query: NOTE_AGGREGATE_QUERY, + variables + }) + .then((response) => { + return ( + response.data?.noteAggregateNote || { + count: 0, + userNotes: [] + } + ); + }); + } catch (error) { + console.error(`Error fetching user notes:`, error); + throw error; + } + } + + /** + * Retrieves user notes for a specific question ID. + * Available only on LeetCode CN platform. + * + * @param questionId - The question ID to fetch notes for + * @param limit - Maximum number of notes to return (default: 20) + * @param skip - Number of notes to skip (default: 0) + * @returns Promise resolving to the notes data for the specified question + */ + async fetchNotesByQuestionId( + questionId: string, + limit: number = 20, + skip: number = 0 + ): Promise { + if (!this.isAuthenticated()) { + throw new Error( + "Authentication required to fetch notes by question ID" + ); + } + + try { + const variables = { + noteType: "COMMON_QUESTION", + questionId: questionId, + limit, + skip + }; + + return await this.leetCodeApi + .graphql({ + query: NOTE_BY_QUESTION_ID_QUERY, + variables + }) + .then((response) => { + return ( + response.data?.noteOneTargetCommonNote || { + count: 0, + userNotes: [] + } + ); + }); + } catch (error) { + console.error( + `Error fetching notes for question ${questionId}:`, + error + ); + throw error; + } + } + isAuthenticated(): boolean { return ( !!this.credential && diff --git a/src/leetcode/leetcode-global-service.ts b/src/leetcode/leetcode-global-service.ts index 4c87c89..cacac20 100644 --- a/src/leetcode/leetcode-global-service.ts +++ b/src/leetcode/leetcode-global-service.ts @@ -350,6 +350,40 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { } } + /** + * Note feature is not supported in LeetCode Global. + * This method is implemented to satisfy the interface but will always throw an error. + * + * @param options - Query parameters (not used) + * @throws Error indicating the feature is not supported on Global platform + */ + async fetchUserNotes(options: { + aggregateType: string; + keyword?: string; + orderBy?: string; + limit?: number; + skip?: number; + }): Promise { + throw new Error("Notes feature is not supported in LeetCode Global"); + } + + /** + * Note feature is not supported in LeetCode Global. + * This method is implemented to satisfy the interface but will always throw an error. + * + * @param questionId - The question ID (not used) + * @param limit - Maximum number of notes (not used) + * @param skip - Pagination offset (not used) + * @throws Error indicating the feature is not supported on Global platform + */ + async fetchNotesByQuestionId( + questionId: string, + limit?: number, + skip?: number + ): Promise { + throw new Error("Notes feature is not supported in LeetCode Global"); + } + isAuthenticated(): boolean { return ( !!this.credential && diff --git a/src/mcp/tools/note-tools.ts b/src/mcp/tools/note-tools.ts new file mode 100644 index 0000000..60ba561 --- /dev/null +++ b/src/mcp/tools/note-tools.ts @@ -0,0 +1,167 @@ +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { z } from "zod"; +import { LeetCodeBaseService } from "../../leetcode/leetcode-base-service.js"; +import { ToolRegistry } from "./tool-registry.js"; + +/** + * Note tool registry class that handles registration of LeetCode note-related tools. + * This class manages tools for accessing and searching user notes on LeetCode CN. + */ +export class NoteToolRegistry extends ToolRegistry { + protected registerAuthenticatedChina(): void { + // Notes search tool (CN-specific) + this.server.tool( + "search_notes", + "Searches for user notes on LeetCode with filtering options, returning note content and associated problem information (requires authentication)", + { + keyword: z + .string() + .optional() + .describe( + "Optional search term to filter notes by content or title" + ), + limit: z + .number() + .optional() + .default(20) + .describe( + "Maximum number of notes to return per request (defaults to 20)" + ), + skip: z + .number() + .optional() + .default(0) + .describe( + "Number of notes to skip before returning results (for pagination)" + ), + orderBy: z + .enum(["ASCENDING", "DESCENDING"]) + .optional() + .default("DESCENDING") + .describe( + "Sort order for returned notes: 'DESCENDING' (newest first) or 'ASCENDING' (oldest first)" + ) + }, + async ({ keyword, limit, skip, orderBy }) => { + try { + const options = { + aggregateType: "QUESTION_NOTE", + keyword, + orderBy, + limit, + skip + }; + + const data = + await this.leetcodeService.fetchUserNotes(options); + + return { + content: [ + { + type: "text", + text: JSON.stringify({ + filters: { keyword, orderBy }, + pagination: { + limit, + skip, + totalCount: data.count + }, + notes: data.userNotes + }) + } + ] + }; + } catch (error: any) { + return { + content: [ + { + type: "text", + text: JSON.stringify({ + error: "Failed to search notes", + message: error.message + }) + } + ] + }; + } + } + ); + + // Notes detail tool (CN-specific, requires authentication) + this.server.tool( + "get_note", + "Retrieves user notes for a specific LeetCode problem by its question ID, returning the complete note content and metadata (requires authentication)", + { + questionId: z + .string() + .describe( + "The question ID of the LeetCode problem to get notes for (e.g., '42' for 'Trapping Rain Water')" + ), + limit: z + .number() + .optional() + .default(20) + .describe( + "Maximum number of notes to return per request (defaults to 20)" + ), + skip: z + .number() + .optional() + .default(0) + .describe( + "Number of notes to skip before returning results (for pagination)" + ) + }, + async ({ questionId, limit = 20, skip = 0 }) => { + try { + const data = + await this.leetcodeService.fetchNotesByQuestionId( + questionId, + limit, + skip + ); + + return { + content: [ + { + type: "text", + text: JSON.stringify({ + questionId, + count: data.count, + pagination: { limit, skip }, + notes: data.userNotes + }) + } + ] + }; + } catch (error: any) { + return { + content: [ + { + type: "text", + text: JSON.stringify({ + error: "Failed to get note for question", + message: error.message + }) + } + ] + }; + } + } + ); + } +} + +/** + * Registers all note-related tools with the MCP server. + * + * @param server - The MCP server instance to register tools with + * @param leetcodeService - The LeetCode service implementation to use for API calls + */ +export function registerNoteTools( + server: McpServer, + leetcodeService: LeetCodeBaseService +): void { + const registry = new NoteToolRegistry(server, leetcodeService); + registry.registerTools(); +} From 7af01bd541fccbde911c6192860c56080d987160 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Sun, 20 Apr 2025 15:36:49 +0800 Subject: [PATCH 04/27] fix: update default `limit` for notes retrieval to 10 --- src/mcp/tools/note-tools.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mcp/tools/note-tools.ts b/src/mcp/tools/note-tools.ts index 60ba561..2ac51eb 100644 --- a/src/mcp/tools/note-tools.ts +++ b/src/mcp/tools/note-tools.ts @@ -23,9 +23,9 @@ export class NoteToolRegistry extends ToolRegistry { limit: z .number() .optional() - .default(20) + .default(10) .describe( - "Maximum number of notes to return per request (defaults to 20)" + "Maximum number of notes to return per request (defaults to 10)" ), skip: z .number() @@ -100,9 +100,9 @@ export class NoteToolRegistry extends ToolRegistry { limit: z .number() .optional() - .default(20) + .default(10) .describe( - "Maximum number of notes to return per request (defaults to 20)" + "Maximum number of notes to return per request (defaults to 10)" ), skip: z .number() From 7dd479ff616c8efe5c243eac8f244cd90a716d8b Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Sun, 20 Apr 2025 15:43:16 +0800 Subject: [PATCH 05/27] refactor: standardize terminology from "solution articles" to "solutions" - remove the "leetcode-" prefix --- .../graphql/cn/solution-article-detail.ts | 2 +- src/leetcode/graphql/cn/solution-articles.ts | 2 +- .../graphql/global/solution-article-detail.ts | 2 +- .../graphql/global/solution-articles.ts | 2 +- src/leetcode/leetcode-base-service.ts | 12 ++-- src/leetcode/leetcode-cn-service.ts | 16 ++--- src/leetcode/leetcode-global-service.ts | 16 ++--- src/mcp/resources/problem-resources.ts | 12 ++-- src/mcp/resources/solution-resources.ts | 22 +++---- src/mcp/tools/contest-tools.ts | 4 +- src/mcp/tools/problem-tools.ts | 8 +-- src/mcp/tools/solution-tools.ts | 62 +++++++++---------- src/mcp/tools/user-tools.ts | 37 ++++++----- tests/services/solution-services.test.ts | 12 ++-- 14 files changed, 108 insertions(+), 101 deletions(-) diff --git a/src/leetcode/graphql/cn/solution-article-detail.ts b/src/leetcode/graphql/cn/solution-article-detail.ts index 5742a90..5a36c04 100644 --- a/src/leetcode/graphql/cn/solution-article-detail.ts +++ b/src/leetcode/graphql/cn/solution-article-detail.ts @@ -1,5 +1,5 @@ /** - * GraphQL query for fetching a solution article's detail on LeetCode CN + * GraphQL query for fetching a solution's detail on LeetCode CN */ export const SOLUTION_ARTICLE_DETAIL_QUERY = ` query discussTopic($slug: String) { diff --git a/src/leetcode/graphql/cn/solution-articles.ts b/src/leetcode/graphql/cn/solution-articles.ts index f25cba2..da30f9c 100644 --- a/src/leetcode/graphql/cn/solution-articles.ts +++ b/src/leetcode/graphql/cn/solution-articles.ts @@ -1,5 +1,5 @@ /** - * GraphQL query for fetching solution articles for a problem on LeetCode CN + * GraphQL query for fetching solutions for a problem on LeetCode CN * `orderBy` can be one of [DEFAULT, MOST_UPVOTE, HOT, NEWEST_TO_OLDEST, OLDEST_TO_NEWEST] */ export const SOLUTION_ARTICLES_QUERY = ` diff --git a/src/leetcode/graphql/global/solution-article-detail.ts b/src/leetcode/graphql/global/solution-article-detail.ts index 41d35ec..5b1aede 100644 --- a/src/leetcode/graphql/global/solution-article-detail.ts +++ b/src/leetcode/graphql/global/solution-article-detail.ts @@ -1,5 +1,5 @@ /** - * GraphQL query for fetching a solution article's detail on LeetCode Global + * GraphQL query for fetching a solution's detail on LeetCode Global */ export const SOLUTION_ARTICLE_DETAIL_QUERY = ` query ugcArticleSolutionArticle($articleId: ID, $topicId: ID) { diff --git a/src/leetcode/graphql/global/solution-articles.ts b/src/leetcode/graphql/global/solution-articles.ts index f916b09..de3958f 100644 --- a/src/leetcode/graphql/global/solution-articles.ts +++ b/src/leetcode/graphql/global/solution-articles.ts @@ -1,5 +1,5 @@ /** - * GraphQL query for fetching solution articles for a problem on LeetCode Global + * GraphQL query for fetching solutions for a problem on LeetCode Global * `orderBy` can be one of [HOT, MOST_RECENT, MOST_VOTES] */ export const SOLUTION_ARTICLES_QUERY = ` diff --git a/src/leetcode/leetcode-base-service.ts b/src/leetcode/leetcode-base-service.ts index 759b7fa..5404af4 100644 --- a/src/leetcode/leetcode-base-service.ts +++ b/src/leetcode/leetcode-base-service.ts @@ -152,11 +152,11 @@ export interface LeetCodeBaseService { isCN(): boolean; /** - * Retrieves a list of solution articles for a specific problem. + * Retrieves a list of solutions for a specific problem. * * @param questionSlug - The URL slug/identifier of the problem - * @param options - Optional parameters for filtering and sorting the solution articles - * @returns Promise resolving to the solution articles list data + * @param options - Optional parameters for filtering and sorting the solutions + * @returns Promise resolving to the solutions list data */ fetchQuestionSolutionArticles( questionSlug: string, @@ -164,10 +164,10 @@ export interface LeetCodeBaseService { ): Promise; /** - * Retrieves detailed information about a specific solution article. + * Retrieves detailed information about a specific solution. * - * @param identifier - The identifier of the solution article (topicId for Global, slug for CN) - * @returns Promise resolving to the solution article detail data + * @param identifier - The identifier of the solution (topicId for Global, slug for CN) + * @returns Promise resolving to the solution detail data */ fetchSolutionArticleDetail(identifier: string): Promise; diff --git a/src/leetcode/leetcode-cn-service.ts b/src/leetcode/leetcode-cn-service.ts index 44b9fb7..6b11b68 100644 --- a/src/leetcode/leetcode-cn-service.ts +++ b/src/leetcode/leetcode-cn-service.ts @@ -268,11 +268,11 @@ export class LeetCodeCNService implements LeetCodeBaseService { } /** - * Retrieves a list of solution articles for a specific problem on LeetCode CN. + * Retrieves a list of solutions for a specific problem on LeetCode CN. * * @param questionSlug - The URL slug/identifier of the problem - * @param options - Optional parameters for filtering and sorting the solution articles - * @returns Promise resolving to the solution articles list data + * @param options - Optional parameters for filtering and sorting the solutions + * @returns Promise resolving to the solutions list data */ async fetchQuestionSolutionArticles( questionSlug: string, @@ -328,7 +328,7 @@ export class LeetCodeCNService implements LeetCodeBaseService { }); } catch (error) { console.error( - `Error fetching solution articles for ${questionSlug}:`, + `Error fetching solutions for ${questionSlug}:`, error ); throw error; @@ -336,10 +336,10 @@ export class LeetCodeCNService implements LeetCodeBaseService { } /** - * Retrieves detailed information about a specific solution article on LeetCode CN. + * Retrieves detailed information about a specific solution on LeetCode CN. * - * @param slug - The slug of the solution article - * @returns Promise resolving to the solution article detail data + * @param slug - The slug of the solution + * @returns Promise resolving to the solution detail data */ async fetchSolutionArticleDetail(slug: string): Promise { try { @@ -355,7 +355,7 @@ export class LeetCodeCNService implements LeetCodeBaseService { }); } catch (error) { console.error( - `Error fetching solution article detail for slug ${slug}:`, + `Error fetching solution detail for slug ${slug}:`, error ); throw error; diff --git a/src/leetcode/leetcode-global-service.ts b/src/leetcode/leetcode-global-service.ts index cacac20..446d3a8 100644 --- a/src/leetcode/leetcode-global-service.ts +++ b/src/leetcode/leetcode-global-service.ts @@ -256,11 +256,11 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { } /** - * Retrieves a list of solution articles for a specific problem. + * Retrieves a list of solutions for a specific problem. * * @param questionSlug - The URL slug/identifier of the problem - * @param options - Optional parameters for filtering and sorting the solution articles - * @returns Promise resolving to the solution articles list data + * @param options - Optional parameters for filtering and sorting the solutions + * @returns Promise resolving to the solutions list data */ async fetchQuestionSolutionArticles( questionSlug: string, @@ -316,7 +316,7 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { }); } catch (error) { console.error( - `Error fetching solution articles for ${questionSlug}:`, + `Error fetching solutions for ${questionSlug}:`, error ); throw error; @@ -324,10 +324,10 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { } /** - * Retrieves detailed information about a specific solution article on LeetCode Global. + * Retrieves detailed information about a specific solution on LeetCode Global. * - * @param topicId - The topic ID of the solution article - * @returns Promise resolving to the solution article detail data + * @param topicId - The topic ID of the solution + * @returns Promise resolving to the solution detail data */ async fetchSolutionArticleDetail(topicId: string): Promise { try { @@ -343,7 +343,7 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { }); } catch (error) { console.error( - `Error fetching solution article detail for topic ${topicId}:`, + `Error fetching solution detail for topic ${topicId}:`, error ); throw error; diff --git a/src/mcp/resources/problem-resources.ts b/src/mcp/resources/problem-resources.ts index e2c7db5..71cf946 100644 --- a/src/mcp/resources/problem-resources.ts +++ b/src/mcp/resources/problem-resources.ts @@ -19,10 +19,10 @@ export class ProblemResourceRegistry extends ResourceRegistry { // Problem Categories resource this.server.resource( "problem-categories", - "leetcode://problems/categories/all", + "categories://problems/all", { description: - "A comprehensive list of all problem classification categories in LeetCode platform, including difficulty levels (Easy, Medium, Hard) and algorithmic domains. These categories help organize and filter coding problems for users based on their complexity and topic area. Returns an array of all available problem categories.", + "A list of all problem classification categories in LeetCode platform, including difficulty levels (Easy, Medium, Hard) and algorithmic domains. These categories help organize and filter coding problems for users based on their complexity and topic area. Returns an array of all available problem categories.", mimeType: "application/json" }, async (uri, extra) => { @@ -41,7 +41,7 @@ export class ProblemResourceRegistry extends ResourceRegistry { // Problem Tags resource this.server.resource( "problem-tags", - "leetcode://problems/tags/all", + "tags://problems/all", { description: "A detailed collection of algorithmic and data structure tags used by LeetCode to categorize problems. These tags represent specific algorithms (like 'dynamic-programming', 'binary-search') or data structures (such as 'array', 'queue', 'tree') that are relevant to solving each problem. Returns an array of all available problem tags for filtering and searching problems.", @@ -63,7 +63,7 @@ export class ProblemResourceRegistry extends ResourceRegistry { // Problem Languages resource this.server.resource( "problem-langs", - "leetcode://problems/langs/all", + "langs://problems/all", { description: "A complete list of all programming languages officially supported by LeetCode for code submission and problem solving. Returns an array of all available programming languages on the platform.", @@ -85,12 +85,12 @@ export class ProblemResourceRegistry extends ResourceRegistry { // Problem Detail resource this.server.resource( "problem-detail", - new ResourceTemplate("leetcode://problems/{titleSlug}", { + new ResourceTemplate("problem://{titleSlug}", { list: undefined }), { description: - "Provides comprehensive details about a specific LeetCode problem, including its description, examples, constraints, and metadata. The titleSlug parameter in the URI identifies the specific problem.", + "Provides details about a specific LeetCode problem, including its description, examples, constraints, and metadata. The titleSlug parameter in the URI identifies the specific problem.", mimeType: "application/json" }, async (uri, variables, extra) => { diff --git a/src/mcp/resources/solution-resources.ts b/src/mcp/resources/solution-resources.ts index 40cdb58..6e90bbf 100644 --- a/src/mcp/resources/solution-resources.ts +++ b/src/mcp/resources/solution-resources.ts @@ -7,19 +7,19 @@ import { ResourceRegistry } from "./resource-registry.js"; /** * Solution resource registry class that handles registration of LeetCode solution-related resources. - * This class manages resources for accessing solution articles and solution details. + * This class manages resources for accessing solutions and solution details. */ export class SolutionResourceRegistry extends ResourceRegistry { protected registerGlobal(): void { - // Global solution article resource + // Global solution resource this.server.resource( - "solution-article", - new ResourceTemplate("leetcode://solutions/{topicId}", { + "problem-solution", + new ResourceTemplate("solution://{topicId}", { list: undefined }), { description: - "Provides the complete content and metadata of a specific solution article on LeetCode Global, including the full article text, author information, and related navigation links. The topicId parameter in the URI identifies the specific solution article. This ID can be obtained from the 'topicId' field in the response of the 'leetcode_solution_article_list' tool.", + "Provides the complete content and metadata of a specific problem solution, including the full article text, author information, and related navigation links. The topicId parameter in the URI identifies the specific solution. This ID can be obtained from the 'topicId' field in the response of the 'list_problem_solutions' tool.", mimeType: "application/json" }, async (uri, variables, extra) => { @@ -47,7 +47,7 @@ export class SolutionResourceRegistry extends ResourceRegistry { { uri: uri.toString(), text: JSON.stringify({ - error: "Failed to fetch solution article", + error: "Failed to fetch solution", message: error.message }), mimeType: "application/json" @@ -60,15 +60,15 @@ export class SolutionResourceRegistry extends ResourceRegistry { } protected registerChina(): void { - // China solution article resource + // China solution resource this.server.resource( - "solution-article", - new ResourceTemplate("leetcode://solutions/{slug}", { + "problem-solution", + new ResourceTemplate("solution://{slug}", { list: undefined }), { description: - "Provides the complete content and metadata of a specific solution article, including the full article text, author information, and related navigation links. This slug can be obtained from the 'node.slug' field in the response of the 'leetcode_solution_article_list' tool.", + "Provides the complete content and metadata of a specific solution, including the full article text, author information, and related navigation links. This slug can be obtained from the 'node.slug' field in the response of the 'list_problem_solutions' tool.", mimeType: "application/json" }, async (uri, variables, extra) => { @@ -96,7 +96,7 @@ export class SolutionResourceRegistry extends ResourceRegistry { { uri: uri.toString(), text: JSON.stringify({ - error: "Failed to fetch solution article", + error: "Failed to fetch solution", message: error.message }), mimeType: "application/json" diff --git a/src/mcp/tools/contest-tools.ts b/src/mcp/tools/contest-tools.ts index 1256d48..a4a5c8c 100644 --- a/src/mcp/tools/contest-tools.ts +++ b/src/mcp/tools/contest-tools.ts @@ -11,8 +11,8 @@ export class ContestToolRegistry extends ToolRegistry { protected registerCommon(): void { // User contest ranking tool this.server.tool( - "leetcode_user_contest_ranking", - "Retrieves a user's comprehensive contest ranking information on LeetCode, including overall ranking, participation history, and performance metrics across contests", + "get_user_contest_ranking", + "Retrieves a user's contest ranking information on LeetCode, including overall ranking, participation history, and performance metrics across contests", { username: z .string() diff --git a/src/mcp/tools/problem-tools.ts b/src/mcp/tools/problem-tools.ts index 0eff3b0..7b4e457 100644 --- a/src/mcp/tools/problem-tools.ts +++ b/src/mcp/tools/problem-tools.ts @@ -12,7 +12,7 @@ export class ProblemToolRegistry extends ToolRegistry { protected registerCommon(): void { // Daily challenge tool this.server.tool( - "leetcode_daily_challenge", + "get_daily_challenge", "Retrieves today's LeetCode Daily Challenge problem with complete details, including problem description, constraints, and examples", {}, async () => { @@ -33,8 +33,8 @@ export class ProblemToolRegistry extends ToolRegistry { // Problem details tool this.server.tool( - "leetcode_problem", - "Retrieves comprehensive details about a specific LeetCode problem, including its description, examples, constraints, and related information", + "get_problem", + "Retrieves details about a specific LeetCode problem, including its description, examples, constraints, and related information", { titleSlug: z .string() @@ -60,7 +60,7 @@ export class ProblemToolRegistry extends ToolRegistry { // Search problems tool this.server.tool( - "leetcode_search_problems", + "search_problems", "Searches for LeetCode problems based on multiple filter criteria including categories, tags, difficulty levels, and keywords, with pagination support", { category: z diff --git a/src/mcp/tools/solution-tools.ts b/src/mcp/tools/solution-tools.ts index c2566cc..ac001b4 100644 --- a/src/mcp/tools/solution-tools.ts +++ b/src/mcp/tools/solution-tools.ts @@ -5,52 +5,52 @@ import { ToolRegistry } from "./tool-registry.js"; /** * Solution tool registry class that handles registration of LeetCode solution-related tools. - * This class manages tools for accessing solution articles, filtering solutions, and reading solution details. + * This class manages tools for accessing solutions, filtering solutions, and reading solution details. */ export class SolutionToolRegistry extends ToolRegistry { protected registerGlobal(): void { - // Solution articles listing tool (Global-specific) + // Problem solutions listing tool (Global-specific) this.server.tool( - "leetcode_solution_article_list", - "Retrieves a list of community solution articles for a specific LeetCode problem, including only metadata like topicId. To view the full content of a solution article, use the 'leetcode_solution_article' tool with the topicId returned by this tool.", + "list_problem_solutions", + "Retrieves a list of community solutions for a specific LeetCode problem, including only metadata like topicId. To view the full content of a solution, use the 'get_problem_solution' tool with the topicId returned by this tool.", { questionSlug: z .string() .describe( - "The URL slug/identifier of the problem to retrieve solution articles for (e.g., 'two-sum', 'add-two-numbers'). This is the same string that appears in the LeetCode problem URL after '/problems/'" + "The URL slug/identifier of the problem to retrieve solutions for (e.g., 'two-sum', 'add-two-numbers'). This is the same string that appears in the LeetCode problem URL after '/problems/'" ), limit: z .number() .optional() - .default(5) + .default(10) .describe( - "Maximum number of solution articles to return per request. Used for pagination and controlling response size. Default is 20 if not specified. Must be a positive integer." + "Maximum number of solutions to return per request. Used for pagination and controlling response size. Default is 20 if not specified. Must be a positive integer." ), skip: z .number() .optional() .describe( - "Number of solution articles to skip before starting to collect results. Used in conjunction with 'limit' for implementing pagination. Default is 0 if not specified. Must be a non-negative integer." + "Number of solutions to skip before starting to collect results. Used in conjunction with 'limit' for implementing pagination. Default is 0 if not specified. Must be a non-negative integer." ), orderBy: z .enum(["HOT", " MOST_RECENT", "MOST_VOTES"]) .default("HOT") .optional() .describe( - "Sorting criteria for the returned solution articles. 'DEFAULT' sorts by LeetCode's default algorithm (typically a combination of recency and popularity), 'MOST_VOTES' sorts by the number of upvotes (highest first), and 'MOST_RECENT' sorts by publication date (newest first)." + "Sorting criteria for the returned solutions. 'DEFAULT' sorts by LeetCode's default algorithm (typically a combination of recency and popularity), 'MOST_VOTES' sorts by the number of upvotes (highest first), and 'MOST_RECENT' sorts by publication date (newest first)." ), userInput: z .string() .optional() .describe( - "Search term to filter solution articles by title, content, or author name. Case insensitive. Useful for finding specific approaches or algorithms mentioned in solutions." + "Search term to filter solutions by title, content, or author name. Case insensitive. Useful for finding specific approaches or algorithms mentioned in solutions." ), tagSlugs: z .array(z.string()) .optional() .default([]) .describe( - "Array of tag identifiers to filter solution articles by programming languages (e.g., 'python', 'java') or problem algorithm/data-structure tags (e.g., 'dynamic-programming', 'recursion'). Only articles tagged with at least one of the specified tags will be returned." + "Array of tag identifiers to filter solutions by programming languages (e.g., 'python', 'java') or problem algorithm/data-structure tags (e.g., 'dynamic-programming', 'recursion'). Only solutions tagged with at least one of the specified tags will be returned." ) }, async ({ @@ -93,7 +93,7 @@ export class SolutionToolRegistry extends ToolRegistry { { type: "text", text: JSON.stringify({ - error: "Failed to fetch solution articles", + error: "Failed to fetch solutions", message: error.message }) } @@ -105,13 +105,13 @@ export class SolutionToolRegistry extends ToolRegistry { // Solution article detail tool (Global-specific) this.server.tool( - "leetcode_solution_article", - "Retrieves the complete content and metadata of a specific solution article, including the full article text, author information, and related navigation links", + "get_problem_solution", + "Retrieves the complete content and metadata of a specific solution, including the full article text, author information, and related navigation links", { topicId: z .string() .describe( - "The unique topic ID of the solution article to retrieve. This ID can be obtained from the 'topicId' field in the response of the 'leetcode_solution_article_list' tool. Format is typically a string of numbers and letters that uniquely identifies the solution article in LeetCode's database." + "The unique topic ID of the solution to retrieve. This ID can be obtained from the 'topicId' field in the response of the 'list_problem_solutions' tool. Format is typically a string of numbers and letters that uniquely identifies the solution in LeetCode's database." ) }, async ({ topicId }) => { @@ -138,7 +138,7 @@ export class SolutionToolRegistry extends ToolRegistry { { type: "text", text: JSON.stringify({ - error: "Failed to fetch solution article detail", + error: "Failed to fetch solution detail", message: error.message }) } @@ -150,29 +150,29 @@ export class SolutionToolRegistry extends ToolRegistry { } protected registerChina(): void { - // Solution articles listing tool (CN-specific) + // Problem solutions listing tool (CN-specific) this.server.tool( - "leetcode_solution_article_list", - "Retrieves a list of community solution articles for a specific LeetCode problem, including only metadata like article slug. To view the full content of a solution article, use the 'leetcode_solution_article' tool with the slug returned by this tool.", + "list_problem_solutions", + "Retrieves a list of community solutions for a specific LeetCode problem, including only metadata like article slug. To view the full content of a solution, use the 'get_problem_solution' tool with the slug returned by this tool.", { questionSlug: z .string() .describe( - "The URL slug/identifier of the problem to retrieve solution articles for (e.g., 'two-sum', 'add-two-numbers'). This is the same string that appears in the LeetCode problem URL after '/problems/'" + "The URL slug/identifier of the problem to retrieve solutions for (e.g., 'two-sum', 'add-two-numbers'). This is the same string that appears in the LeetCode problem URL after '/problems/'" ), limit: z .number() .min(1) .optional() - .default(20) + .default(10) .describe( - "Maximum number of solution articles to return per request. Used for pagination and controlling response size. Default is 20 if not specified. Must be a positive integer. If not provided or set to a very large number, the system may still apply internal limits." + "Maximum number of solutions to return per request. Used for pagination and controlling response size. Default is 20 if not specified. Must be a positive integer. If not provided or set to a very large number, the system may still apply internal limits." ), skip: z .number() .optional() .describe( - "Number of solution articles to skip before starting to collect results. Used in conjunction with 'limit' for implementing pagination. Default is 0 if not specified. Must be a non-negative integer." + "Number of solutions to skip before starting to collect results. Used in conjunction with 'limit' for implementing pagination. Default is 0 if not specified. Must be a non-negative integer." ), orderBy: z .enum([ @@ -185,20 +185,20 @@ export class SolutionToolRegistry extends ToolRegistry { .default("DEFAULT") .optional() .describe( - "Sorting criteria for the returned solution articles. 'DEFAULT' uses the default algorithm, 'MOST_UPVOTE' sorts by the number of upvotes (highest first), 'HOT' prioritizes trending articles with recent engagement, 'NEWEST_TO_OLDEST' sorts by publication date (newest first), and 'OLDEST_TO_NEWEST' sorts by publication date (oldest first)." + "Sorting criteria for the returned solutions. 'DEFAULT' uses the default algorithm, 'MOST_UPVOTE' sorts by the number of upvotes (highest first), 'HOT' prioritizes trending solutions with recent engagement, 'NEWEST_TO_OLDEST' sorts by publication date (newest first), and 'OLDEST_TO_NEWEST' sorts by publication date (oldest first)." ), userInput: z .string() .optional() .describe( - "Search term to filter solution articles by title, content, or author name. Case insensitive. Useful for finding specific approaches or algorithms mentioned in solutions." + "Search term to filter solutions by title, content, or author name. Case insensitive. Useful for finding specific approaches or algorithms mentioned in solutions." ), tagSlugs: z .array(z.string()) .optional() .default([]) .describe( - "Array of tag identifiers to filter solution articles by programming languages (e.g., 'python', 'java') or problem algorithm/data-structure approaches (e.g., 'dynamic-programming', 'recursion'). Only articles tagged with at least one of the specified tags will be returned." + "Array of tag identifiers to filter solutions by programming languages (e.g., 'python', 'java') or problem algorithm/data-structure approaches (e.g., 'dynamic-programming', 'recursion'). Only solutions tagged with at least one of the specified tags will be returned." ) }, async ({ @@ -241,7 +241,7 @@ export class SolutionToolRegistry extends ToolRegistry { { type: "text", text: JSON.stringify({ - error: "Failed to fetch solution articles", + error: "Failed to fetch solutions", message: error.message }) } @@ -253,13 +253,13 @@ export class SolutionToolRegistry extends ToolRegistry { // Solution article detail tool (CN-specific) this.server.tool( - "leetcode_solution_article", - "Retrieves the complete content and metadata of a specific solution article, including the full article text, author information, and related navigation links", + "get_problem_solution", + "Retrieves the complete content and metadata of a specific solution, including the full article text, author information, and related navigation links", { slug: z .string() .describe( - "The unique slug/identifier of the solution article to retrieve. This slug can be obtained from the 'node.slug' field in the response of the 'leetcode_solution_article_list' tool. A URL-friendly slug string to identify solution articles." + "The unique slug/identifier of the solution to retrieve. This slug can be obtained from the 'node.slug' field in the response of the 'list_problem_solutions' tool. A URL-friendly slug string to identify solutions." ) }, async ({ slug }) => { @@ -286,7 +286,7 @@ export class SolutionToolRegistry extends ToolRegistry { { type: "text", text: JSON.stringify({ - error: "Failed to fetch solution article detail", + error: "Failed to fetch solution detail", message: error.message }) } diff --git a/src/mcp/tools/user-tools.ts b/src/mcp/tools/user-tools.ts index 6aa4817..f126d15 100644 --- a/src/mcp/tools/user-tools.ts +++ b/src/mcp/tools/user-tools.ts @@ -12,8 +12,8 @@ export class UserToolRegistry extends ToolRegistry { protected registerCommon(): void { // User profile tool this.server.tool( - "leetcode_user_profile", - "Retrieves comprehensive profile information about a LeetCode user, including user stats, solved problems, and profile details", + "get_user_profile", + "Retrieves profile information about a LeetCode user, including user stats, solved problems, and profile details", { username: z .string() @@ -42,7 +42,7 @@ export class UserToolRegistry extends ToolRegistry { protected registerGlobal(): void { // Recent submissions tool (Global-specific) this.server.tool( - "leetcode_recent_submissions", + "get_recent_submissions", "Retrieves a user's recent submissions on LeetCode Global, including both accepted and failed submissions with detailed metadata", { username: z @@ -53,6 +53,7 @@ export class UserToolRegistry extends ToolRegistry { limit: z .number() .optional() + .default(10) .describe( "Maximum number of submissions to return (optional, defaults to server-defined limit)" ) @@ -93,7 +94,7 @@ export class UserToolRegistry extends ToolRegistry { // Recent accepted submissions tool (Global-specific) this.server.tool( - "leetcode_recent_ac_submissions", + "get_recent_ac_submissions", "Retrieves a user's recent accepted (AC) submissions on LeetCode Global, focusing only on successfully completed problems", { username: z @@ -104,6 +105,7 @@ export class UserToolRegistry extends ToolRegistry { limit: z .number() .optional() + .default(10) .describe( "Maximum number of accepted submissions to return (optional, defaults to server-defined limit)" ) @@ -146,7 +148,7 @@ export class UserToolRegistry extends ToolRegistry { protected registerChina(): void { // User recent AC submissions tool (CN-specific) this.server.tool( - "leetcode_user_recent_ac_submissions", + "get_recent_ac_submissions", "Retrieves a user's recent accepted (AC) submissions on LeetCode China, with details about each successfully solved problem", { username: z @@ -157,6 +159,7 @@ export class UserToolRegistry extends ToolRegistry { limit: z .number() .optional() + .default(10) .describe( "Maximum number of accepted submissions to return (optional, defaults to server-defined limit)" ) @@ -202,8 +205,8 @@ export class UserToolRegistry extends ToolRegistry { protected registerAuthenticatedCommon(): void { // User status tool (requires authentication) this.server.tool( - "leetcode_user_status", - "Retrieves the current authenticated user's status on LeetCode, including login status, premium membership details, and user information (requires authentication)", + "get_user_status", + "Retrieves the current user's status on LeetCode, including login status, premium membership details, and user information (requires authentication)", async () => { try { const status = await this.leetcodeService.fetchUserStatus(); @@ -232,7 +235,7 @@ export class UserToolRegistry extends ToolRegistry { // Submission detail tool (requires authentication) this.server.tool( - "leetcode_problem_submission_detail", + "get_problem_submission_report", "Retrieves detailed information about a specific LeetCode submission by its ID, including source code, runtime stats, and test results (requires authentication)", { id: z @@ -273,8 +276,8 @@ export class UserToolRegistry extends ToolRegistry { // User progress questions tool (requires authentication) this.server.tool( - "leetcode_user_progress_questions", - "Retrieves the authenticated user's problem-solving status with filtering options, including detailed solution history for attempted or solved questions (requires authentication)", + "get_problem_progress", + "Retrieves the current user's problem-solving status with filtering options, including detailed solution history for attempted or solved questions (requires authentication)", { offset: z .number() @@ -284,7 +287,7 @@ export class UserToolRegistry extends ToolRegistry { ), limit: z .number() - .default(200) + .default(100) .describe( "The maximum number of questions to return in a single request" ), @@ -348,16 +351,18 @@ export class UserToolRegistry extends ToolRegistry { protected registerAuthenticatedGlobal(): void { // Global user submissions tool (requires authentication) this.server.tool( - "leetcode_user_all_submissions", - "Retrieves a paginated list of the authenticated user's submissions for a specific problem or all problems on LeetCode Global, with detailed submission metadata (requires authentication)", + "get_all_submissions", + "Retrieves a paginated list of the current user's submissions for a specific problem or all problems on LeetCode Global, with detailed submission metadata (requires authentication)", { limit: z .number() + .default(20) .describe( "Maximum number of submissions to return per page (typically defaults to 20 if not specified)" ), offset: z .number() + .default(0) .describe( "Number of submissions to skip for pagination purposes" ), @@ -410,16 +415,18 @@ export class UserToolRegistry extends ToolRegistry { protected registerAuthenticatedChina(): void { // China user submissions tool (requires authentication, enhanced version with more parameters) this.server.tool( - "leetcode_user_all_submissions", - "Retrieves a comprehensive, paginated list of the authenticated user's submissions on LeetCode China with extensive filtering options, including pagination support via lastKey parameter (requires authentication)", + "get_all_submissions", + "Retrieves a list of the current user's submissions on LeetCode China with extensive filtering options, including pagination support via lastKey parameter (requires authentication)", { limit: z .number() + .default(20) .describe( "Maximum number of submissions to return per page (typically defaults to 20 if not specified)" ), offset: z .number() + .default(0) .describe( "Number of submissions to skip for pagination purposes" ), diff --git a/tests/services/solution-services.test.ts b/tests/services/solution-services.test.ts index 74cc8ae..0af9d54 100644 --- a/tests/services/solution-services.test.ts +++ b/tests/services/solution-services.test.ts @@ -10,7 +10,7 @@ describe("LeetCode Solution Services", () => { const service = new LeetCodeGlobalService(leetCodeApi, credential); describe("fetchQuestionSolutionArticles", () => { - it("should fetch solution articles with default options", async () => { + it("should fetch solutions with default options", async () => { const questionSlug = "two-sum"; const result = await service.fetchQuestionSolutionArticles( @@ -23,7 +23,7 @@ describe("LeetCode Solution Services", () => { expect(Array.isArray(result.articles)).toBe(true); }, 30000); - it("should fetch solution articles with custom options", async () => { + it("should fetch solutions with custom options", async () => { const result = await service.fetchQuestionSolutionArticles( "two-sum", { @@ -53,7 +53,7 @@ describe("LeetCode Solution Services", () => { }); describe("fetchSolutionArticleDetail", () => { - it("should fetch solution article detail correctly if topicId exists", async () => { + it("should fetch solution detail correctly if topicId exists", async () => { const solutionsResult = await service.fetchQuestionSolutionArticles("two-sum", { limit: 1 @@ -100,7 +100,7 @@ describe("LeetCode Solution Services", () => { const service = new LeetCodeCNService(leetCodeApi, credential); describe("fetchQuestionSolutionArticles", () => { - it("should fetch solution articles with default options", async () => { + it("should fetch solutions with default options", async () => { const questionSlug = "two-sum"; const result = @@ -115,7 +115,7 @@ describe("LeetCode Solution Services", () => { ); }, 30000); - it("should fetch solution articles with custom options", async () => { + it("should fetch solutions with custom options", async () => { const result = await service.fetchQuestionSolutionArticles( "two-sum", { @@ -145,7 +145,7 @@ describe("LeetCode Solution Services", () => { }); describe("fetchSolutionArticleDetail", () => { - it("should fetch solution article detail correctly if slug exists", async () => { + it("should fetch solution detail correctly if slug exists", async () => { const solutionsResult = await service.fetchQuestionSolutionArticles("two-sum", { limit: 1 From 651873b0f8073ce0fe0f773adf2567666a690207 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Sun, 20 Apr 2025 15:59:29 +0800 Subject: [PATCH 06/27] docs: revise the document structure --- README.md | 212 +++++++++++++++++++++++---------- README_zh-CN.md | 303 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 456 insertions(+), 59 deletions(-) create mode 100644 README_zh-CN.md diff --git a/README.md b/README.md index 498deba..da04742 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,9 @@ [![NPM Version](https://img.shields.io/npm/v/@jinzcdev/leetcode-mcp-server.svg)](https://www.npmjs.com/package/@jinzcdev/leetcode-mcp-server) [![GitHub License](https://img.shields.io/github/license/jinzcdev/leetcode-mcp-server.svg)](https://img.shields.io/github/license/jinzcdev/leetcode-mcp-server.svg) -[![Stars](https://img.shields.io/github/stars/jinzcdev/leetcode-mcp-server)](https://github.com/jinzcdev/leetcode-mcp-server) [![smithery badge](https://smithery.ai/badge/@jinzcdev/leetcode-mcp-server)](https://smithery.ai/server/@jinzcdev/leetcode-mcp-server) +[![Chinese Doc](https://img.shields.io/badge/简体中文-点击查看-orange)](README_zh-CN.md) +[![Stars](https://img.shields.io/github/stars/jinzcdev/leetcode-mcp-server)](https://github.com/jinzcdev/leetcode-mcp-server) The LeetCode MCP Server is a [Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction) server that provides seamless integration with LeetCode APIs, enabling advanced automation and intelligent interaction with LeetCode's programming problems, contests, solutions, and user data. @@ -13,11 +14,11 @@ The LeetCode MCP Server is a [Model Context Protocol (MCP)](https://modelcontext ## Features -- **Multi-site Support**: Supports both leetcode.com and leetcode.cn platforms -- **Problem Data Retrieval**: Obtain detailed problem descriptions, constraints, examples, and solution approaches -- **User Data Access**: Retrieve user profiles, submission history, and contest performance -- **Advanced Search Capabilities**: Filter problems by tags, difficulty levels, and categories -- **Daily Challenge Tracking**: Easily access daily challenge problems +- 🌐 **Multi-site Support**: Supports both leetcode.com and leetcode.cn platforms +- 📊 **Problem Data Retrieval**: Obtain detailed problem descriptions, constraints, examples, and solution approaches +- 👤 **User Data Access**: Retrieve user profiles, submission history, and contest performance +- 🔍 **Advanced Search Capabilities**: Filter problems by tags, difficulty levels, and categories +- 📅 **Daily Challenge Access**: Easily access daily challenge problems ## Prerequisites @@ -102,86 +103,179 @@ Command-line arguments take precedence over environment variables when both are - If `LEETCODE_SITE=cn` is set but you run `leetcode-mcp-server --site global`, the server will use `global`. - If `LEETCODE_SESSION` exists but you provide `--session "new_cookie"`, the command-line session value will be used. -## Tools +## Available Tools + +### Problems + +| Tool | Global | CN | Auth Required | Description | +| ----------------------- | :----: | :-: | :-----------: | ------------------------------------------------------------ | +| **get_daily_challenge** | ✅ | ✅ | ❌ | Retrieves today's LeetCode Daily Challenge problem | +| **get_problem** | ✅ | ✅ | ❌ | Retrieves details for a specific LeetCode problem | +| **search_problems** | ✅ | ✅ | ❌ | Searches for LeetCode problems with multiple filter criteria | + +### Users + +| Tool | Global | CN | Auth Required | Description | +| --------------------------------- | :----: | :-: | :-----------: | ------------------------------------------------------------ | +| **get_user_profile** | ✅ | ✅ | ❌ | Retrieves profile information for a LeetCode user | +| **get_user_contest_ranking** | ✅ | ✅ | ❌ | Obtains contest ranking statistics for a user | +| **get_recent_ac_submissions** | ✅ | ✅ | ❌ | Retrieves a user's recent accepted submissions | +| **get_recent_submissions** | ✅ | ❌ | ❌ | Retrieves a user's recent submissions history | +| **get_user_status** | ✅ | ✅ | ✅ | Retrieves current user's current status | +| **get_problem_submission_report** | ✅ | ✅ | ✅ | Provides detailed submission analysis for a specific problem | +| **get_problem_progress** | ✅ | ✅ | ✅ | Retrieves current user's problem-solving progress | +| **get_all_submissions** | ✅ | ✅ | ✅ | Retrieves current user's submission history | + +### Notes + +| Tool | Global | CN | Auth Required | Description | +| ---------------- | :----: | :-: | :-----------: | ----------------------------------------------------- | +| **search_notes** | ❌ | ✅ | ✅ | Searches for user notes with filtering options | +| **get_note** | ❌ | ✅ | ✅ | Retrieves notes for a specific problem by question ID | + +### Solutions + +| Tool | Global | CN | Auth Required | Description | +| -------------------------- | :----: | :-: | :-----------: | -------------------------------------------------------------- | +| **list_problem_solutions** | ✅ | ✅ | ❌ | Retrieves a list of community solutions for a specific problem | +| **get_problem_solution** | ✅ | ✅ | ❌ | Retrieves the complete content of a specific solution | + +## Tool Parameters + +### Problems + +- **get_daily_challenge** - Retrieves today's LeetCode Daily Challenge problem with complete details + + - No parameters required + +- **get_problem** - Retrieves details about a specific LeetCode problem + + - `titleSlug`: The URL slug/identifier of the problem (string, required) + +- **search_problems** - Searches for LeetCode problems based on multiple filter criteria + - `category`: Problem category filter (string, optional, default: "all-code-essentials") + - `tags`: List of topic tags to filter problems by (string[], optional) + - `difficulty`: Problem difficulty level filter (enum: "EASY", "MEDIUM", "HARD", optional) + - `searchKeywords`: Keywords to search in problem titles and descriptions (string, optional) + - `limit`: Maximum number of problems to return (number, optional, default: 10) + - `offset`: Number of problems to skip (number, optional) + +### Users + +- **get_user_profile** - Retrieves profile information about a LeetCode user + + - `username`: LeetCode username (string, required) + +- **get_user_contest_ranking** - Retrieves a user's contest ranking information + + - `username`: LeetCode username (string, required) + - `attended`: Whether to include only the contests the user has participated in (boolean, optional, default: true) + +- **get_recent_submissions** - Retrieves a user's recent submissions on LeetCode Global + + - `username`: LeetCode username (string, required) + - `limit`: Maximum number of submissions to return (number, optional, default: 10) + +- **get_recent_ac_submissions** - Retrieves a user's recent accepted submissions + + - `username`: LeetCode username (string, required) + - `limit`: Maximum number of submissions to return (number, optional, default: 10) + +- **get_user_status** - Retrieves the current user's status + + - No parameters required -The server provides a comprehensive suite of tools categorized by functionality and platform compatibility. +- **get_problem_submission_report** - Retrieves detailed information about a specific submission -### Problem Tools + - `id`: The numerical submission ID (number, required) -Available on both Global and China sites, with optional authentication. +- **get_problem_progress** - Retrieves the current user's problem-solving progress -| Tool Name | Description | Parameters | -| ---------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **leetcode_daily_challenge** | Retrieves today's LeetCode Daily Challenge with complete metadata | None | -| **leetcode_problem** | Retrieves comprehensive details for a specified LeetCode problem | `titleSlug` (string, required): Problem URL identifier (e.g., 'two-sum') | -| **leetcode_search_problems** | Executes filtered searches across LeetCode problems | `category` (string, optional): Problem classification
`tags` (string[], optional): Topic tags filter
`difficulty` (string, optional): Problem complexity level ('EASY', 'MEDIUM', 'HARD')
`limit` (number, optional): Maximum results count
`offset` (number, optional): Pagination offset | + - `offset`: Number of questions to skip (number, optional, default: 0) + - `limit`: Maximum number of questions to return (number, optional, default: 100) + - `questionStatus`: Filter by question status (enum: "ATTEMPTED", "SOLVED", optional) + - `difficulty`: Filter by difficulty levels (string[], optional) -### User Tools +- **get_all_submissions** - Retrieves paginated list of user's submissions + - `limit`: Maximum number of submissions to return (number, default: 20) + - `offset`: Number of submissions to skip (number, default: 0) + - `questionSlug`: Optional problem identifier (string, optional) + - `lang`: Programming language filter (string, optional, CN only) + - `status`: Submission status filter (enum: "AC", "WA", optional, CN only) + - `lastKey`: Pagination token for retrieving next page (string, optional, CN only) -Provides user-specific data across both platforms. +### Notes -| Tool Name | Description | Parameters | -| --------------------------------- | ---------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | -| **leetcode_user_profile** | Retrieves complete profile information for a LeetCode user | `username` (string, required): LeetCode username | -| **leetcode_user_contest_ranking** | Obtains contest ranking statistics for a user | `username` (string, required): LeetCode username
`attended` (boolean, optional): Filter for attended contests only | +- **search_notes** - Searches for user notes on LeetCode China -### Global Site-Specific User Tools + - `keyword`: Search term to filter notes (string, optional) + - `limit`: Maximum number of notes to return (number, optional, default: 10) + - `skip`: Number of notes to skip (number, optional, default: 0) + - `orderBy`: Sort order for returned notes (enum: "ASCENDING", "DESCENDING", optional, default: "DESCENDING") -Exclusive to leetcode.com platform. +- **get_note** - Retrieves user notes for a specific LeetCode problem + - `questionId`: The question ID of the LeetCode problem (string, required) + - `limit`: Maximum number of notes to return (number, optional, default: 10) + - `skip`: Number of notes to skip (number, optional, default: 0) -| Tool Name | Description | Parameters | -| ---------------------------------- | ------------------------------------------------------- | --------------------------------------------------------------------------------------------- | -| **leetcode_recent_submissions** | Retrieves a user's recent submission history (Global) | `username` (string, required): LeetCode username
`limit` (number, optional): Results limit | -| **leetcode_recent_ac_submissions** | Retrieves a user's recent accepted submissions (Global) | `username` (string, required): LeetCode username
`limit` (number, optional): Results limit | +### Solutions -### China Site-Specific User Tools +- **list_problem_solutions** - Retrieves a list of community solutions for a specific problem -Exclusive to leetcode.cn platform. + - `questionSlug`: The URL slug/identifier of the problem (string, required) + - `limit`: Maximum number of solutions to return (number, optional, default: 10) + - `skip`: Number of solutions to skip (number, optional) + - `userInput`: Search term to filter solutions (string, optional) + - `tagSlugs`: Array of tag identifiers to filter solutions (string[], optional, default: []) + - `orderBy`: Sorting criteria for the returned solutions + - Global: enum: "HOT", "MOST_RECENT", "MOST_VOTES", optional, default: "HOT" + - CN: enum: "DEFAULT", "MOST_UPVOTE", "HOT", "NEWEST_TO_OLDEST", "OLDEST_TO_NEWEST", optional, default: "DEFAULT" -| Tool Name | Description | Parameters | -| --------------------------------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------- | -| **leetcode_user_recent_ac_submissions** | Retrieves recent accepted submissions (China) | `username` (string, required): LeetCode China username
`limit` (number, optional): Results limit | +- **get_problem_solution** - Retrieves the complete content of a specific solution + - `topicId`: Unique topic ID of the solution (string, required, Global only) + - `slug`: Unique slug/identifier of the solution (string, required, CN only) -### Authenticated Common Tools +## Available Resources -Requires session authentication, available on both platforms. +| Resource Name | Global | CN | Auth Required | Description | +| ---------------------- | :----: | :-: | :-----------: | ------------------------------------------------------------ | +| **problem-categories** | ✅ | ✅ | ❌ | A list of all problem classification categories | +| **problem-tags** | ✅ | ✅ | ❌ | A detailed collection of algorithmic and data structure tags | +| **problem-langs** | ✅ | ✅ | ❌ | A complete list of all supported programming languages | +| **problem-detail** | ✅ | ✅ | ❌ | Provides details about a specific problem | +| **problem-solution** | ✅ | ✅ | ❌ | Provides the complete content of a specific solution | -| Tool Name | Description | Parameters | -| -------------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **leetcode_user_status** | Retrieves authenticated user's current status | None | -| **leetcode_problem_submission_detail** | Provides detailed submission analysis | `id` (number, required): Submission ID | -| **leetcode_user_progress_questions** | Tracks user's problem-solving progress | `offset` (number, required): Pagination offset
`limit` (number, required): Results limit
`questionStatus` (enum, optional): 'ATTEMPTED' or 'SOLVED' filter
`difficulty` (string[], optional): Complexity level filter | +## Resource URIs -### Global Site-Specific Authenticated Tools +- **problem-categories** - A list of all problem classification categories -Authenticated tools exclusive to leetcode.com. + - URI: `categories://problems/all` -| Name | Description | Parameters | -| --------------------------------- | ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **leetcode_user_all_submissions** | Retrieves paginated submission history (Global) | `limit` (number, required): Results limit
`offset` (number, required): Pagination offset
`questionSlug` (string, optional): Problem identifier filter | +- **problem-tags** - A detailed collection of algorithmic and data structure tags -### China Site-Specific Authenticated Tools + - URI: `tags://problems/all` -Authenticated tools exclusive to leetcode.cn. +- **problem-langs** - A complete list of all programming languages supported by LeetCode -| Tool Name | Description | Parameters | -| --------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **leetcode_user_all_submissions** | Retrieves comprehensive submission history (China) | `limit` (number, required): Results limit
`offset` (number, required): Pagination offset
`questionSlug` (string, optional): Problem identifier
`lang` (string, optional): Programming language filter
`status` (string, optional): Submission status filter
`lastKey` (string, optional): Pagination token | + - URI: `langs://problems/all` -## Resources +- **problem-detail** - Provides details about a specific LeetCode problem -The server provides reference resources for platform metadata access via URI endpoints. + - URI: `problem://{titleSlug}` + - Parameters: + - `titleSlug`: Problem identifier as it appears in the LeetCode URL -| Resource Name | Description | URI | -| ---------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------- | -| **problem-categories** | Complete problem classification categories | `leetcode://problems/categories/all` | -| **problem-tags** | Algorithmic and data structure tags collection | `leetcode://problems/tags/all` | -| **problem-langs** | Supported programming languages list | `leetcode://problems/langs/all` | -| **solution-article** | A LeetCode solution article | global: `leetcode://solutions/{topicId}`
cn: `leetcode://solutions/{slug}` | +- **problem-solution** - Provides the complete content of a specific solution + - Global URI: `solution://{topicId}` + - Parameters: + - `topicId`: Unique topic ID of the solution + - CN URI: `solution://{slug}` + - Parameters: + - `slug`: Unique slug/identifier of the solution ## Authentication -Advanced features require LeetCode session authentication: +User-specific data access requires LeetCode session authentication: 1. Log in to LeetCode ([Global](https://leetcode.com) or [China](https://leetcode.cn) site) 2. Extract `LEETCODE_SESSION` cookie from browser developer tools @@ -206,4 +300,4 @@ The `JSON_DATA_STRING` contains either the requested data or an error message fo ## License -This project is licensed under the MIT License. \ No newline at end of file +This project is licensed under the MIT License. diff --git a/README_zh-CN.md b/README_zh-CN.md new file mode 100644 index 0000000..f916d55 --- /dev/null +++ b/README_zh-CN.md @@ -0,0 +1,303 @@ +# LeetCode MCP 服务器 + +[![NPM Version](https://img.shields.io/npm/v/@jinzcdev/leetcode-mcp-server.svg)](https://www.npmjs.com/package/@jinzcdev/leetcode-mcp-server) +[![GitHub License](https://img.shields.io/github/license/jinzcdev/leetcode-mcp-server.svg)](https://www.npmjs.com/package/@jinzcdev/leetcode-mcp-server) +[![smithery badge](https://smithery.ai/badge/@jinzcdev/leetcode-mcp-server)](https://smithery.ai/server/@jinzcdev/leetcode-mcp-server) +[![English Doc](https://img.shields.io/badge/English-Click-blue)](README.md) +[![Stars](https://img.shields.io/github/stars/jinzcdev/leetcode-mcp-server)](https://github.com/jinzcdev/leetcode-mcp-server) + +LeetCode MCP Server 是一个基于 [模型上下文协议 (MCP)](https://modelcontextprotocol.io/introduction) 的服务,提供与 LeetCode API 的无缝集成,实现与 LeetCode 编程题目、竞赛、题解和用户数据的高级自动化和智能交互。 + + + LeetCode Server MCP server + + +## 特性 + +- 🌐 **多站点支持**:同时支持 `leetcode.com` 和 `leetcode.cn` 平台 +- 📊 ​**题目数据获取**:获取详细的题目描述、约束条件、示例和题解 +- 👤 **用户数据访问**:检索用户资料、提交历史和竞赛表现 +- 🔍 **高级搜索功能**:按标签、难度级别和分类筛选题目 +- 📅 **每日一题获取**:轻松访问每日一题 + +## 前提条件 + +1. Node.js 运行环境 +2. (可选)LeetCode 会话 cookie,用于授权访问 API + +## 安装 + +### 通过 Smithery 安装 + +使用 [Smithery](https://smithery.ai/server/@jinzcdev/leetcode-mcp-server) 为 Claude Desktop 自动安装 leetcode-mcp-server: + +```bash +npx -y @smithery/cli install @jinzcdev/leetcode-mcp-server --client claude +``` + +### 手动安装 + +```bash +# 从 npm 安装 +npm install @jinzcdev/leetcode-mcp-server -g + +# 使用全球站点配置运行 +npx -y @jinzcdev/leetcode-mcp-server --site global + +# 使用认证运行(访问私有数据) +npx -y @jinzcdev/leetcode-mcp-server --site global --session <您的 LEETCODE 会话 COOKIE> +``` + +或者,您可以克隆仓库并在本地运行: + +```bash +# 克隆仓库 +git clone https://github.com/jinzcdev/leetcode-mcp-server.git + +# 导航到项目目录 +cd leetcode-mcp-server + +# 构建并运行服务器 +npm run build && node build/index.js --site global +``` + +## 使用方法 + +### Visual Studio Code 集成 + +在您的用户设置 (JSON) 文件中添加以下 JSON 配置。通过按 `Ctrl/Cmd + Shift + P` 并搜索 `Preferences: Open User Settings (JSON)` 来访问此文件。 + +```json +{ + "mcp": { + "servers": { + "leetcode": { + "type": "stdio", + "command": "npx", + "args": [ + "-y", + "@jinzcdev/leetcode-mcp-server", + "--site", + "global", + "--session", + "<您的 LEETCODE 会话 COOKIE>" + ] + } + } + } +} +``` + +对于 LeetCode 中国站点,请将 `--site` 参数修改为 `cn`。 + +## 环境变量 + +服务器支持以下环境变量: + +- `LEETCODE_SITE`:LeetCode API 端点('global' 或 'cn') +- `LEETCODE_SESSION`:用于授权 API 访问的 LeetCode 会话 cookie + +**优先级说明**: +当同时指定命令行参数和环境变量时,命令行参数优先。例如: + +- 如果设置了 `LEETCODE_SITE=cn` 但您运行 `leetcode-mcp-server --site global`,服务器将使用 `global`。 +- 如果存在 `LEETCODE_SESSION` 但您提供了 `--session "new_cookie"`,将使用命令行中的会话值。 + +## 可用工具 + +### 题目 + +| 工具 | 全球站 | 中国站 | 需要认证 | 描述 | +| ----------------------- | :----: | :----: | :------: | ---------------------------------- | +| **get_daily_challenge** | ✅ | ✅ | ❌ | 获取今天的 LeetCode 每日一题 | +| **get_problem** | ✅ | ✅ | ❌ | 获取特定 LeetCode 题目详细信息 | +| **search_problems** | ✅ | ✅ | ❌ | 使用多种过滤条件搜索 LeetCode 题目 | + +### 用户 + +| 工具 | 全球站 | 中国站 | 需要认证 | 描述 | +| --------------------------------- | :----: | :----: | :------: | ---------------------------- | +| **get_user_profile** | ✅ | ✅ | ❌ | 获取 LeetCode 用户的简介信息 | +| **get_user_contest_ranking** | ✅ | ✅ | ❌ | 获取用户的竞赛排名统计 | +| **get_recent_ac_submissions** | ✅ | ✅ | ❌ | 获取用户的近期已接受提交 | +| **get_recent_submissions** | ✅ | ❌ | ❌ | 获取用户的近期提交历史 | +| **get_user_status** | ✅ | ✅ | ✅ | 获取用户的当前状态 | +| **get_problem_submission_report** | ✅ | ✅ | ✅ | 提供详细的提交分析 | +| **get_problem_progress** | ✅ | ✅ | ✅ | 获取用户的答题进度 | +| **get_all_submissions** | ✅ | ✅ | ✅ | 获取用户提交的分页列表 | + +### 笔记 + +| 工具 | 全球站 | 中国站 | 需要认证 | 描述 | +| ---------------- | :----: | :----: | :------: | ------------------------------ | +| **search_notes** | ❌ | ✅ | ✅ | 使用过滤选项搜索用户笔记 | +| **get_note** | ❌ | ✅ | ✅ | 通过题目 ID 获取特定题目的笔记 | + +### 题解 + +| 工具 | 全球站 | 中国站 | 需要认证 | 描述 | +| -------------------------- | :----: | :----: | :------: | ------------------------------ | +| **list_problem_solutions** | ✅ | ✅ | ❌ | 获取特定题目的社区题解文章列表 | +| **get_problem_solution** | ✅ | ✅ | ❌ | 获取特定题解文章的完整内容 | + +## 工具参数 + +### 题目 + +- **get_daily_challenge** - 获取今天的 LeetCode 每日一题及完整详情 + + - 无需参数 + +- **get_problem** - 获取特定 LeetCode 题目的详情 + + - `titleSlug`:题目的 URL 标识符(字符串,必需) + +- **search_problems** - 基于多种过滤条件搜索 LeetCode 题目 + - `category`:题目类别过滤器(字符串,可选,默认:"all-code-essentials") + - `tags`:按主题标签过滤题目的列表(字符串数组,可选) + - `difficulty`:题目难度级别过滤器(枚举:"EASY"、"MEDIUM"、"HARD",可选) + - `searchKeywords`:在题目标题和描述中搜索的关键词(字符串,可选) + - `limit`:返回的最大题目数量(数字,可选,默认:10) + - `offset`:要跳过的题目数量(数字,可选) + +### 用户 + +- **get_user_profile** - 获取 LeetCode 用户的资料信息 + + - `username`:LeetCode 用户名(字符串,必需) + +- **get_user_contest_ranking** - 获取用户的竞赛排名信息 + + - `username`:LeetCode 用户名(字符串,必需) + - `attended`:是否只包括用户参加过的竞赛(布尔值,可选,默认:true) + +- **get_recent_submissions** - 获取用户在 LeetCode 全球站的近期提交 + + - `username`:LeetCode 用户名(字符串,必需) + - `limit`:返回的最大提交数量(数字,可选,默认:10) + +- **get_recent_ac_submissions** - 获取用户的近期已接受提交 + + - `username`:LeetCode 用户名(字符串,必需) + - `limit`:返回的最大提交数量(数字,可选,默认:10) + +- **get_user_status** - 获取当前已认证用户的状态 + + - 无需参数 + +- **get_problem_submission_report** - 获取特定提交的详细信息 + + - `id`:提交的数字 ID(数字,必需) + +- **get_problem_progress** - 获取已认证用户的题目解决状态 + + - `offset`:要跳过的题目数量(数字,可选,默认:0) + - `limit`:返回的最大题目数量(数字,可选,默认:100) + - `questionStatus`:按题目状态过滤(枚举:"ATTEMPTED"、"SOLVED",可选) + - `difficulty`:按难度级别过滤(字符串数组,可选) + +- **get_all_submissions** - 获取用户提交的分页列表 + - `limit`:返回的最大提交数量(数字,默认:20) + - `offset`:要跳过的提交数量(数字,默认:0) + - `questionSlug`:可选的题目标识符(字符串,可选) + - `lang`:编程语言过滤器(字符串,可选,仅中国站) + - `status`:提交状态过滤器(枚举:"AC"、"WA",可选,仅中国站) + - `lastKey`:用于检索下一页的分页令牌(字符串,可选,仅中国站) + +### 笔记 + +- **search_notes** - 搜索 LeetCode 中国站上的用户笔记 + + - `keyword`:过滤笔记的搜索词(字符串,可选) + - `limit`:返回的最大笔记数量(数字,可选,默认:10) + - `skip`:要跳过的笔记数量(数字,可选,默认:0) + - `orderBy`:返回笔记的排序顺序(枚举:"ASCENDING"、"DESCENDING",可选,默认:"DESCENDING") + +- **get_note** - 获取特定 LeetCode 题目的用户笔记 + - `questionId`:LeetCode 题目的题目 ID(字符串,必需) + - `limit`:返回的最大笔记数量(数字,可选,默认:10) + - `skip`:要跳过的笔记数量(数字,可选,默认:0) + +### 题解 + +- **list_problem_solutions** - 获取特定题目的社区题解文章列表 + + - `questionSlug`:题目的 URL 标识符(字符串,必需) + - `limit`:返回的最大题解文章数量(数字,可选,默认:10) + - `skip`:要跳过的题解文章数量(数字,可选) + - `userInput`:过滤题解文章的搜索词(字符串,可选) + - `tagSlugs`:用于过滤题解文章的标签标识符数组(字符串数组,可选,默认:[]) + - `orderBy`:题解文章的排序条件 + - 全球站:枚举:"HOT"、"MOST_RECENT"、"MOST_VOTES",可选,默认:"HOT" + - 中国站:枚举:"DEFAULT"、"MOST_UPVOTE"、"HOT"、"NEWEST_TO_OLDEST"、"OLDEST_TO_NEWEST",可选,默认:"DEFAULT" + +- **get_problem_solution** - 获取特定题解文章的完整内容 + - `topicId`:题解文章的唯一主题 ID(字符串,必需,仅全球站) + - `slug`:题解文章的唯一标识符(字符串,必需,仅中国站) + +## 可用资源 + +| 资源名称 | 全球站 | 中国站 | 需要认证 | 描述 | +| ---------------------- | :----: | :----: | :------: | ---------------------------- | +| **problem-categories** | ✅ | ✅ | ❌ | 所有题目分类类别的列表 | +| **problem-tags** | ✅ | ✅ | ❌ | 算法和数据结构标签的详细集合 | +| **problem-langs** | ✅ | ✅ | ❌ | 所有支持的编程语言的完整列表 | +| **problem-detail** | ✅ | ✅ | ❌ | 提供特定题目的详情 | +| **problem-solution** | ✅ | ✅ | ❌ | 提供特定题解文章的完整内容 | + +## 资源 URI + +- **problem-categories** - 所有题目分类类别的列表 + + - URI: `categories://problems/all` + +- **problem-tags** - 算法和数据结构标签的详细集合 + + - URI: `tags://problems/all` + +- **problem-langs** - LeetCode 支持的所有编程语言的完整列表 + + - URI: `langs://problems/all` + +- **problem-detail** - 提供特定 LeetCode 题目的详情 + + - URI: `problem://{titleSlug}` + - 参数: + - `titleSlug`: LeetCode URL 中显示的题目标识符 + +- **problem-solution** - 提供特定题解文章的完整内容 + - 全球站 URI: `solution://{topicId}` + - 参数: + - `topicId`: 题解文章的唯一主题 ID + - 中国站 URI: `solution://{slug}` + - 参数: + - `slug`: 题解文章的唯一标识符 + +## 认证 + +访问用户特定数据需要 LeetCode 会话认证: + +1. 登录 LeetCode([全球站](https://leetcode.com) 或 [中国站](https://leetcode.cn)) +2. 从浏览器开发者工具中提取 `LEETCODE_SESSION` cookie +3. 使用 `--session` 标志或 `LEETCODE_SESSION` 环境变量配置服务器 + +## 响应格式 + +所有工具都返回具有以下结构的 JSON 格式响应: + +```json +{ + "content": [ + { + "type": "text", + "text": "JSON_DATA_STRING" + } + ] +} +``` + +`JSON_DATA_STRING` 包含请求的数据或失败请求的错误消息。 + +## 许可证 + +本项目采用 MIT 许可证。 From 48184e2fd742203ed056bdc797fe8342ce1e5ce9 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Sun, 20 Apr 2025 16:38:02 +0800 Subject: [PATCH 07/27] fix: update lint-staged configuration to include JSX and additional file types --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index bf714b5..c8a8184 100644 --- a/package.json +++ b/package.json @@ -33,9 +33,12 @@ "url": "git+https://github.com/jinzcdev/leetcode-mcp-server.git" }, "lint-staged": { - "*.{js,ts}": [ + "*.{js,ts,jsx,tsx}": [ "prettier --write", "eslint --fix" + ], + "*.{md,json,yml,yaml,html,css}": [ + "prettier --write" ] }, "dependencies": { From 21a0bd740e05195a0d3d9ce53e350dc7c7a4ce33 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Sun, 20 Apr 2025 16:38:27 +0800 Subject: [PATCH 08/27] feat: add create and update note functionalities for LeetCode CN --- README.md | 12 +++ README_zh-CN.md | 14 +++ src/leetcode/graphql/cn/note-queries.ts | 53 +++++++++++ src/leetcode/leetcode-base-service.ts | 34 ++++++++ src/leetcode/leetcode-cn-service.ts | 95 +++++++++++++++++++- src/leetcode/leetcode-global-service.ts | 25 ++++++ src/mcp/tools/note-tools.ts | 111 ++++++++++++++++++++++++ 7 files changed, 343 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index da04742..7c19a4d 100644 --- a/README.md +++ b/README.md @@ -132,6 +132,8 @@ Command-line arguments take precedence over environment variables when both are | ---------------- | :----: | :-: | :-----------: | ----------------------------------------------------- | | **search_notes** | ❌ | ✅ | ✅ | Searches for user notes with filtering options | | **get_note** | ❌ | ✅ | ✅ | Retrieves notes for a specific problem by question ID | +| **create_note** | ❌ | ✅ | ✅ | Creates a new note for a specific problem | +| **update_note** | ❌ | ✅ | ✅ | Updates an existing note with new content | ### Solutions @@ -217,6 +219,16 @@ Command-line arguments take precedence over environment variables when both are - `questionId`: The question ID of the LeetCode problem (string, required) - `limit`: Maximum number of notes to return (number, optional, default: 10) - `skip`: Number of notes to skip (number, optional, default: 0) +- **create_note** - Creates a new note for a specific LeetCode problem + + - `questionId`: The question ID of the LeetCode problem (string, required) + - `content`: The content of the note, supports markdown format (string, required) + - `summary`: An optional short summary or title for the note (string, optional) + +- **update_note** - Updates an existing note with new content or summary + - `noteId`: The ID of the note to update (string, required) + - `content`: The new content for the note, supports markdown format (string, required) + - `summary`: An optional new short summary or title for the note (string, optional) ### Solutions diff --git a/README_zh-CN.md b/README_zh-CN.md index f916d55..25ce3bb 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -132,6 +132,8 @@ npm run build && node build/index.js --site global | ---------------- | :----: | :----: | :------: | ------------------------------ | | **search_notes** | ❌ | ✅ | ✅ | 使用过滤选项搜索用户笔记 | | **get_note** | ❌ | ✅ | ✅ | 通过题目 ID 获取特定题目的笔记 | +| **create_note** | ❌ | ✅ | ✅ | 为特定题目创建新笔记 | +| **update_note** | ❌ | ✅ | ✅ | 使用新内容更新现有笔记 | ### 题解 @@ -214,10 +216,22 @@ npm run build && node build/index.js --site global - `orderBy`:返回笔记的排序顺序(枚举:"ASCENDING"、"DESCENDING",可选,默认:"DESCENDING") - **get_note** - 获取特定 LeetCode 题目的用户笔记 + - `questionId`:LeetCode 题目的题目 ID(字符串,必需) - `limit`:返回的最大笔记数量(数字,可选,默认:10) - `skip`:要跳过的笔记数量(数字,可选,默认:0) +- **create_note** - 为特定 LeetCode 题目创建新笔记 + + - `questionId`:LeetCode 题目的题目 ID(字符串,必需) + - `content`:笔记内容,支持 markdown 格式(字符串,必需) + - `summary`:可选的笔记简短摘要或标题(字符串,可选) + +- **update_note** - 使用新内容或摘要更新现有笔记 + - `noteId`:要更新的笔记 ID(字符串,必需) + - `content`:笔记的新内容,支持 markdown 格式(字符串,必需) + - `summary`:可选的新简短摘要或标题(字符串,可选) + ### 题解 - **list_problem_solutions** - 获取特定题目的社区题解文章列表 diff --git a/src/leetcode/graphql/cn/note-queries.ts b/src/leetcode/graphql/cn/note-queries.ts index 8e41eae..b8ebfc4 100644 --- a/src/leetcode/graphql/cn/note-queries.ts +++ b/src/leetcode/graphql/cn/note-queries.ts @@ -60,3 +60,56 @@ query noteOneTargetCommonNote( } } }`; + +/** + * GraphQL mutation for creating a new note on LeetCode CN + * + * @param content - Content of the note + * @param noteType - Type of note (e.g., "COMMON_QUESTION") + * @param targetId - ID of the target object (e.g., question ID) + * @param summary - Optional summary of the note + */ +export const NOTE_CREATE_MUTATION = ` +mutation noteCreateCommonNote( + $content: String! + $noteType: NoteCommonTypeEnum! + $targetId: String! + $summary: String! +) { + noteCreateCommonNote( + content: $content + noteType: $noteType + targetId: $targetId + summary: $summary + ) { + note { + id + content + targetId + } + ok + } +}`; + +/** + * GraphQL mutation for updating an existing note on LeetCode CN + * + * @param noteId - ID of the note to update + * @param content - New content for the note + * @param summary - Optional new summary for the note + */ +export const NOTE_UPDATE_MUTATION = ` +mutation noteUpdateUserNote( + $content: String! + $noteId: ID! + $summary: String! +) { + noteUpdateUserNote(content: $content, noteId: $noteId, summary: $summary) { + note { + id + content + targetId + } + ok + } +}`; diff --git a/src/leetcode/leetcode-base-service.ts b/src/leetcode/leetcode-base-service.ts index 5404af4..38c5aec 100644 --- a/src/leetcode/leetcode-base-service.ts +++ b/src/leetcode/leetcode-base-service.ts @@ -207,4 +207,38 @@ export interface LeetCodeBaseService { limit?: number, skip?: number ): Promise; + + /** + * Creates a new note for a specific question on LeetCode. + * Note: This feature is only available on LeetCode CN. + * + * @param content - The content of the note + * @param noteType - The type of note (e.g., "COMMON_QUESTION") + * @param targetId - The ID of the target (e.g., question ID) + * @param summary - Optional summary of the note + * @returns Promise resolving to the created note data + * @throws Error if not implemented or feature not supported + */ + createUserNote( + content: string, + noteType: string, + targetId: string, + summary: string + ): Promise; + + /** + * Updates an existing note on LeetCode. + * Note: This feature is only available on LeetCode CN. + * + * @param noteId - The ID of the note to update + * @param content - The new content of the note + * @param summary - Optional new summary of the note + * @returns Promise resolving to the updated note data + * @throws Error if not implemented or feature not supported + */ + updateUserNote( + noteId: string, + content: string, + summary: string + ): Promise; } diff --git a/src/leetcode/leetcode-cn-service.ts b/src/leetcode/leetcode-cn-service.ts index 6b11b68..b69d485 100644 --- a/src/leetcode/leetcode-cn-service.ts +++ b/src/leetcode/leetcode-cn-service.ts @@ -1,7 +1,9 @@ import { Credential, LeetCodeCN } from "leetcode-query"; import { NOTE_AGGREGATE_QUERY, - NOTE_BY_QUESTION_ID_QUERY + NOTE_BY_QUESTION_ID_QUERY, + NOTE_CREATE_MUTATION, + NOTE_UPDATE_MUTATION } from "./graphql/cn/note-queries.js"; import { SEARCH_PROBLEMS_QUERY } from "./graphql/cn/search-problems.js"; import { SOLUTION_ARTICLE_DETAIL_QUERY } from "./graphql/cn/solution-article-detail.js"; @@ -463,6 +465,97 @@ export class LeetCodeCNService implements LeetCodeBaseService { } } + /** + * Creates a new note for a specific question on LeetCode CN. + * Available only on LeetCode CN platform. + * + * @param content - The content of the note + * @param noteType - The type of note (e.g., "COMMON_QUESTION") + * @param targetId - The ID of the target (e.g., question ID) + * @param summary - Optional summary of the note + * @returns Promise resolving to the created note data + */ + async createUserNote( + content: string, + noteType: string, + targetId: string, + summary: string + ): Promise { + if (!this.isAuthenticated()) { + throw new Error("Authentication required to create notes"); + } + + try { + const variables = { + content, + noteType, + targetId, + summary: summary || "" + }; + + return await this.leetCodeApi + .graphql({ + query: NOTE_CREATE_MUTATION, + variables + }) + .then((response) => { + return ( + response.data?.noteCreateCommonNote || { + ok: false, + note: null + } + ); + }); + } catch (error) { + console.error(`Error creating note:`, error); + throw error; + } + } + + /** + * Updates an existing note on LeetCode CN. + * Available only on LeetCode CN platform. + * + * @param noteId - The ID of the note to update + * @param content - The new content of the note + * @param summary - Optional new summary of the note + * @returns Promise resolving to the updated note data + */ + async updateUserNote( + noteId: string, + content: string, + summary: string + ): Promise { + if (!this.isAuthenticated()) { + throw new Error("Authentication required to update notes"); + } + + try { + const variables = { + noteId, + content, + summary: summary || "" + }; + + return await this.leetCodeApi + .graphql({ + query: NOTE_UPDATE_MUTATION, + variables + }) + .then((response) => { + return ( + response.data?.noteUpdateUserNote || { + ok: false, + note: null + } + ); + }); + } catch (error) { + console.error(`Error updating note:`, error); + throw error; + } + } + isAuthenticated(): boolean { return ( !!this.credential && diff --git a/src/leetcode/leetcode-global-service.ts b/src/leetcode/leetcode-global-service.ts index 446d3a8..23d0ebd 100644 --- a/src/leetcode/leetcode-global-service.ts +++ b/src/leetcode/leetcode-global-service.ts @@ -384,6 +384,31 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { throw new Error("Notes feature is not supported in LeetCode Global"); } + /** + * Note feature is not supported in LeetCode Global. + * This method is implemented to satisfy the interface but will always throw an error. + */ + async createUserNote( + content: string, + noteType: string, + targetId: string, + summary: string + ): Promise { + throw new Error("Notes feature is not supported in LeetCode Global"); + } + + /** + * Note feature is not supported in LeetCode Global. + * This method is implemented to satisfy the interface but will always throw an error. + */ + async updateUserNote( + noteId: string, + content: string, + summary: string + ): Promise { + throw new Error("Notes feature is not supported in LeetCode Global"); + } + isAuthenticated(): boolean { return ( !!this.credential && diff --git a/src/mcp/tools/note-tools.ts b/src/mcp/tools/note-tools.ts index 2ac51eb..773958d 100644 --- a/src/mcp/tools/note-tools.ts +++ b/src/mcp/tools/note-tools.ts @@ -149,6 +149,117 @@ export class NoteToolRegistry extends ToolRegistry { } } ); + + // Note creation tool (CN-specific, requires authentication) + this.server.tool( + "create_note", + "Creates a new note for a specific LeetCode problem, allowing users to save personal comments and observations for future reference (requires authentication, CN only)", + { + questionId: z + .string() + .describe( + "The question ID of the LeetCode problem to create a note for (e.g., '42' for 'Trapping Rain Water')" + ), + content: z + .string() + .describe( + "The content of the note (supports markdown format)" + ), + summary: z + .string() + .optional() + .default("") + .describe("An optional short summary or title for the note") + }, + async ({ questionId, content, summary = "" }) => { + try { + const data = await this.leetcodeService.createUserNote( + content, + "COMMON_QUESTION", + questionId, + summary + ); + + return { + content: [ + { + type: "text", + text: JSON.stringify({ + success: data.ok, + note: data.note + }) + } + ] + }; + } catch (error: any) { + return { + content: [ + { + type: "text", + text: JSON.stringify({ + error: "Failed to create note", + message: error.message + }) + } + ] + }; + } + } + ); + + // Note update tool (CN-specific, requires authentication) + this.server.tool( + "update_note", + "Updates an existing note with new content or summary, allowing users to refine their saved observations (requires authentication, CN only)", + { + noteId: z.string().describe("The ID of the note to update"), + content: z + .string() + .describe( + "The new content for the note (supports markdown format)" + ), + summary: z + .string() + .optional() + .default("") + .describe( + "An optional new short summary or title for the note" + ) + }, + async ({ noteId, content, summary = "" }) => { + try { + const data = await this.leetcodeService.updateUserNote( + noteId, + content, + summary + ); + + return { + content: [ + { + type: "text", + text: JSON.stringify({ + success: data.ok, + note: data.note + }) + } + ] + }; + } catch (error: any) { + return { + content: [ + { + type: "text", + text: JSON.stringify({ + error: "Failed to update note", + message: error.message + }) + } + ] + }; + } + } + ); } } From 9ea4dc4531dca680c2f5be021d3617475a424425 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Sun, 20 Apr 2025 22:25:59 +0800 Subject: [PATCH 09/27] feat: add fetchProblemSimplified method to LeetCode services and corresponding tests --- src/leetcode/leetcode-base-service.ts | 9 +++ src/leetcode/leetcode-cn-service.ts | 51 ++++++++++++++ src/leetcode/leetcode-global-service.ts | 51 ++++++++++++++ src/mcp/tools/problem-tools.ts | 5 +- tests/services/problem-services.test.ts | 88 +++++++++++++++++++++++++ 5 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 tests/services/problem-services.test.ts diff --git a/src/leetcode/leetcode-base-service.ts b/src/leetcode/leetcode-base-service.ts index 38c5aec..564b416 100644 --- a/src/leetcode/leetcode-base-service.ts +++ b/src/leetcode/leetcode-base-service.ts @@ -109,6 +109,15 @@ export interface LeetCodeBaseService { */ fetchDailyChallenge(): Promise; + /** + * Retrieves simplified information about a specific problem. + * Returns only the most useful fields for the user. + * + * @param titleSlug - Problem identifier/slug as used in the LeetCode URL + * @returns Promise resolving to the simplified problem details + */ + fetchProblemSimplified(titleSlug: string): Promise; + /** * Retrieves detailed information about a specific problem. * diff --git a/src/leetcode/leetcode-cn-service.ts b/src/leetcode/leetcode-cn-service.ts index b69d485..edcbb7c 100644 --- a/src/leetcode/leetcode-cn-service.ts +++ b/src/leetcode/leetcode-cn-service.ts @@ -206,6 +206,57 @@ export class LeetCodeCNService implements LeetCodeBaseService { } } + async fetchProblemSimplified(titleSlug: string): Promise { + try { + const problem = await this.fetchProblem(titleSlug); + if (!problem) { + throw new Error(`Problem ${titleSlug} not found`); + } + + const filteredTopicTags = + problem.topicTags?.map((tag: any) => tag.slug) || []; + + const filteredCodeSnippets = + problem.codeSnippets?.filter((snippet: any) => + ["cpp", "python3", "java"].includes(snippet.langSlug) + ) || []; + + let parsedSimilarQuestions: any[] = []; + if (problem.similarQuestions) { + try { + const allQuestions = JSON.parse(problem.similarQuestions); + parsedSimilarQuestions = allQuestions + .slice(0, 3) + .map((q: any) => ({ + titleSlug: q.titleSlug, + difficulty: q.difficulty + })); + } catch (e) { + console.error("Error parsing similarQuestions:", e); + } + } + + return { + titleSlug, + questionId: problem.questionId, + title: problem.title, + content: problem.content, + difficulty: problem.difficulty, + topicTags: filteredTopicTags, + codeSnippets: filteredCodeSnippets, + exampleTestcases: problem.exampleTestcases, + hints: problem.hints, + similarQuestions: parsedSimilarQuestions + }; + } catch (error) { + console.error( + `Error fetching simplified problem ${titleSlug}:`, + error + ); + throw error; + } + } + async searchProblems( category?: string, tags?: string[], diff --git a/src/leetcode/leetcode-global-service.ts b/src/leetcode/leetcode-global-service.ts index 23d0ebd..8c84c7a 100644 --- a/src/leetcode/leetcode-global-service.ts +++ b/src/leetcode/leetcode-global-service.ts @@ -192,6 +192,57 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { } } + async fetchProblemSimplified(titleSlug: string): Promise { + try { + const problem = await this.fetchProblem(titleSlug); + if (!problem) { + throw new Error(`Problem ${titleSlug} not found`); + } + + const filteredTopicTags = + problem.topicTags?.map((tag: any) => tag.slug) || []; + + const filteredCodeSnippets = + problem.codeSnippets?.filter((snippet: any) => + ["cpp", "python3", "java"].includes(snippet.langSlug) + ) || []; + + let parsedSimilarQuestions: any[] = []; + if (problem.similarQuestions) { + try { + const allQuestions = JSON.parse(problem.similarQuestions); + parsedSimilarQuestions = allQuestions + .slice(0, 3) + .map((q: any) => ({ + titleSlug: q.titleSlug, + difficulty: q.difficulty + })); + } catch (e) { + console.error("Error parsing similarQuestions:", e); + } + } + + return { + titleSlug, + questionId: problem.questionId, + title: problem.title, + content: problem.content, + difficulty: problem.difficulty, + topicTags: filteredTopicTags, + codeSnippets: filteredCodeSnippets, + exampleTestcases: problem.exampleTestcases, + hints: problem.hints, + similarQuestions: parsedSimilarQuestions + }; + } catch (error) { + console.error( + `Error fetching simplified problem ${titleSlug}:`, + error + ); + throw error; + } + } + async searchProblems( category?: string, tags?: string[], diff --git a/src/mcp/tools/problem-tools.ts b/src/mcp/tools/problem-tools.ts index 7b4e457..bb5c3f2 100644 --- a/src/mcp/tools/problem-tools.ts +++ b/src/mcp/tools/problem-tools.ts @@ -43,7 +43,10 @@ export class ProblemToolRegistry extends ToolRegistry { ) }, async ({ titleSlug }) => { - const data = await this.leetcodeService.fetchProblem(titleSlug); + const data = + await this.leetcodeService.fetchProblemSimplified( + titleSlug + ); return { content: [ { diff --git a/tests/services/problem-services.test.ts b/tests/services/problem-services.test.ts new file mode 100644 index 0000000..b01ba7c --- /dev/null +++ b/tests/services/problem-services.test.ts @@ -0,0 +1,88 @@ +import { Credential, LeetCode, LeetCodeCN } from "leetcode-query"; +import { describe, expect, it } from "vitest"; +import { LeetCodeCNService } from "../../src/leetcode/leetcode-cn-service.js"; +import { LeetCodeGlobalService } from "../../src/leetcode/leetcode-global-service.js"; + +describe("LeetCode Problem Services", () => { + describe("LeetCodeGlobalService", () => { + const credential = new Credential(); + const leetCodeApi = new LeetCode(credential); + const service = new LeetCodeGlobalService(leetCodeApi, credential); + + describe("fetchProblemSimplified", () => { + it("should return simplified problem data", async () => { + const titleSlug = "two-sum"; + const result = await service.fetchProblemSimplified(titleSlug); + + expect(result).toBeDefined(); + expect(result.titleSlug).toBe(titleSlug); + expect(result.title).toBe("Two Sum"); + expect(result.questionId).toBeDefined(); + expect(result.questionFrontendId).toBeDefined(); + expect(result.content).toBeDefined(); + expect(result.difficulty).toBeDefined(); + expect(Array.isArray(result.topicTags)).toBe(true); + expect(Array.isArray(result.codeSnippets)).toBe(true); + expect(result.hints).toBeDefined(); + + if (result.similarQuestions) { + expect(Array.isArray(result.similarQuestions)).toBe(true); + } + }, 30000); + + it("should handle invalid problems correctly", async () => { + const invalidSlug = `invalid-problem-${Date.now()}`; + + try { + await service.fetchProblemSimplified(invalidSlug); + expect(true).toBe(false); + } catch (error) { + expect(error).toBeDefined(); + } + }, 30000); + }); + }); + + describe("LeetCodeCNService", () => { + const credential = new Credential(); + const leetCodeApi = new LeetCodeCN(credential); + const service = new LeetCodeCNService(leetCodeApi, credential); + + describe("fetchProblemSimplified", () => { + it("should return simplified problem data", async () => { + const titleSlug = "two-sum"; + const result = await service.fetchProblemSimplified(titleSlug); + + expect(result).toBeDefined(); + expect(result.titleSlug).toBe(titleSlug); + expect(result.questionId).toBeDefined(); + expect(result.questionFrontendId).toBeDefined(); + expect(result.title).toBeDefined(); + expect(result.content).toBeDefined(); + expect(result.difficulty).toBeDefined(); + expect(Array.isArray(result.topicTags)).toBe(true); + expect(Array.isArray(result.codeSnippets)).toBe(true); + expect(result.hints).toBeDefined(); + + if (result.similarQuestions) { + expect(Array.isArray(result.similarQuestions)).toBe(true); + } + + console.log( + `Successfully fetched simplified data for ${titleSlug}` + ); + }, 30000); + + it("should handle invalid problems correctly", async () => { + const invalidSlug = `invalid-problem-${Date.now()}`; + + try { + await service.fetchProblemSimplified(invalidSlug); + expect(true).toBe(false); + } catch (error) { + expect(error).toBeDefined(); + } + }, 30000); + }); + }); +}); From 2e1fc057cdf572226718d8cdea1995f5d3baad0c Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Sun, 20 Apr 2025 23:44:05 +0800 Subject: [PATCH 10/27] feat: integrate pino for structured logging and add logger utility - Added pino and pino-pretty to package.json for logging. - Created a logger utility in src/utils/logger.ts to handle logging configurations for production and development environments. - Replaced console.log and console.error statements with logger methods in various service files (leetcode-cn-service.ts, leetcode-global-service.ts). - Updated tests to use logger for logging messages instead of console.log. - Improved error handling in services by removing try-catch blocks where appropriate and using promises directly. --- package-lock.json | 228 +++++++- package.json | 4 +- src/index.ts | 7 +- src/leetcode/leetcode-cn-service.ts | 635 +++++++++-------------- src/leetcode/leetcode-global-service.ts | 422 ++++++--------- src/utils/logger.ts | 30 ++ tests/services/problem-services.test.ts | 24 +- tests/services/solution-services.test.ts | 54 +- 8 files changed, 717 insertions(+), 687 deletions(-) create mode 100644 src/utils/logger.ts diff --git a/package-lock.json b/package-lock.json index ed7fc42..37f0878 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.8.0", - "@rollup/rollup-linux-x64-gnu": "*", "leetcode-query": "^2.0.0", "minimist": "^1.2.8", + "pino": "^9.6.0", "ts-node": "^10.9.2", "zod": "^3.24.2" }, @@ -30,6 +30,7 @@ "globals": "^16.0.0", "husky": "^9.1.7", "lint-staged": "^15.5.1", + "pino-pretty": "^13.0.0", "prettier": "^3.5.3", "prettier-plugin-organize-imports": "^4.1.0", "tsc-watch": "6.2.1", @@ -1069,6 +1070,15 @@ "node": ">=12" } }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "dev": true, @@ -1346,6 +1356,16 @@ "node": ">= 8" } }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmmirror.com/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/debug": { "version": "4.4.0", "license": "MIT", @@ -1423,6 +1443,16 @@ "node": ">= 0.8" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/environment": { "version": "1.1.0", "dev": true, @@ -1837,6 +1867,13 @@ "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, + "node_modules/fast-copy": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/fast-copy/-/fast-copy-3.0.2.tgz", + "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "dev": true, @@ -1883,6 +1920,22 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmmirror.com/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, "node_modules/fastq": { "version": "1.19.1", "dev": true, @@ -2118,6 +2171,13 @@ "node": ">= 0.4" } }, + "node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "dev": true, + "license": "MIT" + }, "node_modules/http-errors": { "version": "2.0.0", "license": "MIT", @@ -2263,6 +2323,16 @@ "version": "2.0.0", "license": "ISC" }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/js-yaml": { "version": "4.1.0", "dev": true, @@ -2689,6 +2759,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/on-finished": { "version": "2.4.1", "license": "MIT", @@ -2870,6 +2949,68 @@ "node": ">=0.10" } }, + "node_modules/pino": { + "version": "9.6.0", + "resolved": "https://registry.npmmirror.com/pino/-/pino-9.6.0.tgz", + "integrity": "sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", + "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-pretty": { + "version": "13.0.0", + "resolved": "https://registry.npmmirror.com/pino-pretty/-/pino-pretty-13.0.0.tgz", + "integrity": "sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.2", + "fast-safe-stringify": "^2.1.1", + "help-me": "^5.0.0", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pump": "^3.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^4.0.1", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", + "license": "MIT" + }, "node_modules/pkce-challenge": { "version": "4.1.0", "license": "MIT", @@ -2952,6 +3093,22 @@ } } }, + "node_modules/process-warning": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/proxy-addr": { "version": "2.0.7", "license": "MIT", @@ -2977,6 +3134,17 @@ "node": ">= 0.10" } }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "dev": true, @@ -3017,6 +3185,12 @@ ], "license": "MIT" }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" + }, "node_modules/range-parser": { "version": "1.2.1", "license": "MIT", @@ -3037,6 +3211,15 @@ "node": ">= 0.8" } }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "dev": true, @@ -3194,10 +3377,26 @@ ], "license": "MIT" }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "license": "MIT" }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/semver": { "version": "7.7.1", "dev": true, @@ -3369,6 +3568,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/sonic-boom": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/sonic-boom/-/sonic-boom-4.2.0.tgz", + "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "dev": true, @@ -3388,6 +3596,15 @@ "node": "*" } }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/stackback": { "version": "0.0.2", "dev": true, @@ -3499,6 +3716,15 @@ "url": "https://opencollective.com/synckit" } }, + "node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "license": "MIT", + "dependencies": { + "real-require": "^0.2.0" + } + }, "node_modules/through": { "version": "2.3.8", "dev": true, diff --git a/package.json b/package.json index c8a8184..5516ee9 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "@modelcontextprotocol/sdk": "^1.8.0", "leetcode-query": "^2.0.0", "minimist": "^1.2.8", + "pino": "^9.6.0", "ts-node": "^10.9.2", "zod": "^3.24.2" }, @@ -64,7 +65,8 @@ "tsc-watch": "6.2.1", "typescript": "^5.8.3", "typescript-eslint": "^8.29.1", - "vitest": "^3.1.1" + "vitest": "^3.1.1", + "pino-pretty": "^13.0.0" }, "optionalDependencies": { "@rollup/rollup-linux-x64-gnu": "^4.40.0" diff --git a/src/index.ts b/src/index.ts index 021c809..b7fdb64 100644 --- a/src/index.ts +++ b/src/index.ts @@ -14,6 +14,7 @@ import { registerNoteTools } from "./mcp/tools/note-tools.js"; import { registerProblemTools } from "./mcp/tools/problem-tools.js"; import { registerSolutionTools } from "./mcp/tools/solution-tools.js"; import { registerUserTools } from "./mcp/tools/user-tools.js"; +import logger from "./utils/logger.js"; /** * Parses and validates command line arguments for the LeetCode MCP Server. @@ -32,7 +33,7 @@ function parseArgs() { }); if (args.help) { - console.log(`LeetCode MCP Server - Model Context Protocol server for LeetCode + logger.info(`LeetCode MCP Server - Model Context Protocol server for LeetCode Usage: leetcode-mcp-server [options] @@ -49,7 +50,7 @@ function parseArgs() { }; if (options.site !== "global" && options.site !== "cn") { - console.error("The site must be either 'global' or 'cn'"); + logger.error("The site must be either 'global' or 'cn'"); process.exit(1); } @@ -103,6 +104,6 @@ async function main() { } main().catch((error) => { - console.error("Failed to start LeetCode MCP Server:", error); + logger.error("Failed to start LeetCode MCP Server:", error); process.exit(1); }); diff --git a/src/leetcode/leetcode-cn-service.ts b/src/leetcode/leetcode-cn-service.ts index edcbb7c..c2c94de 100644 --- a/src/leetcode/leetcode-cn-service.ts +++ b/src/leetcode/leetcode-cn-service.ts @@ -1,4 +1,5 @@ import { Credential, LeetCodeCN } from "leetcode-query"; +import logger from "../utils/logger.js"; import { NOTE_AGGREGATE_QUERY, NOTE_BY_QUESTION_ID_QUERY, @@ -30,27 +31,14 @@ export class LeetCodeCNService implements LeetCodeBaseService { "Authentication required to fetch submission details" ); } - try { - return await this.leetCodeApi.submissionDetail(id.toString()); - } catch (error) { - console.error( - `Error fetching submission detail for ID ${id}:`, - error - ); - throw error; - } + return await this.leetCodeApi.submissionDetail(id.toString()); } async fetchUserStatus(): Promise { if (!this.isAuthenticated()) { throw new Error("Authentication required to fetch user status"); } - try { - return await this.leetCodeApi.userStatus(); - } catch (error) { - console.error(`Error fetching user status:`, error); - throw error; - } + return await this.leetCodeApi.userStatus(); } async fetchUserAllSubmissions(options: { @@ -66,59 +54,46 @@ export class LeetCodeCNService implements LeetCodeBaseService { "Authentication required to fetch user submissions" ); } - try { - return await this.leetCodeApi.graphql({ - variables: { - limit: options.limit, - offset: options.offset, - questionSlug: options.questionSlug, - lang: options.lang, - status: options.status - }, - query: ` - query submissionList( - $offset: Int! - $limit: Int! - $lastKey: String - $questionSlug: String - $lang: String - $status: SubmissionStatusEnum + return await this.leetCodeApi.graphql({ + variables: { + limit: options.limit, + offset: options.offset, + questionSlug: options.questionSlug, + lang: options.lang, + status: options.status + }, + query: ` + query submissionList( + $offset: Int! + $limit: Int! + $lastKey: String + $questionSlug: String + $lang: String + $status: SubmissionStatusEnum + ) { + submissionList( + offset: $offset + limit: $limit + lastKey: $lastKey + questionSlug: $questionSlug + lang: $lang + status: $status ) { - submissionList( - offset: $offset - limit: $limit - lastKey: $lastKey - questionSlug: $questionSlug - lang: $lang - status: $status - ) { - lastKey - hasNext - submissions { - id - title - status - statusDisplay - lang - langName: langVerboseName - runtime - timestamp - url - isPending - memory - frontendId - submissionComment { - comment - flagType - } - } + lastKey + hasNext + submissions { + id + title + status + lang + runtime + url + memory + frontendId } - }` - }); - } catch (error) { - console.error(`Error fetching all user's submissions:`, error); - throw error; - } + } + }` + }); } async fetchUserRecentSubmissions( @@ -130,131 +105,82 @@ export class LeetCodeCNService implements LeetCodeBaseService { ); } - /** - * 中国版 LeetCode API 仅支持获取最近 AC 的提交记录 - * @param username - * @param limit - * @returns - */ async fetchUserRecentACSubmissions( username: string, limit?: number ): Promise { - try { - return await this.leetCodeApi.recent_submissions(username); - } catch (error) { - console.error( - `Error fetching recent AC submissions for ${username}:`, - error - ); - throw error; - } + return await this.leetCodeApi.recent_submissions(username); } async fetchUserProfile(username: string): Promise { - try { - return await this.leetCodeApi.user(username); - } catch (error) { - console.error( - `Error fetching user profile for ${username}:`, - error - ); - throw error; - } + return await this.leetCodeApi.user(username); } async fetchUserContestRanking( username: string, attended: boolean = true ): Promise { - try { - const contestInfo = - await this.leetCodeApi.user_contest_info(username); - if (contestInfo.userContestRankingHistory && attended) { - contestInfo.userContestRankingHistory = - contestInfo.userContestRankingHistory.filter( - (contest: any) => { - return contest && contest.attended; - } - ); - } - return contestInfo; - } catch (error) { - console.error( - `Error fetching user contest ranking for ${username}:`, - error - ); - throw error; + const contestInfo = await this.leetCodeApi.user_contest_info(username); + if (contestInfo.userContestRankingHistory && attended) { + contestInfo.userContestRankingHistory = + contestInfo.userContestRankingHistory.filter((contest: any) => { + return contest && contest.attended; + }); } + return contestInfo; } async fetchDailyChallenge(): Promise { - try { - return await this.leetCodeApi.daily(); - } catch (error) { - console.error("Error fetching daily challenge:", error); - throw error; - } + return await this.leetCodeApi.daily(); } async fetchProblem(titleSlug: string): Promise { - try { - return await this.leetCodeApi.problem(titleSlug); - } catch (error) { - console.error(`Error fetching problem ${titleSlug}:`, error); - throw error; - } + return await this.leetCodeApi.problem(titleSlug); } async fetchProblemSimplified(titleSlug: string): Promise { - try { - const problem = await this.fetchProblem(titleSlug); - if (!problem) { - throw new Error(`Problem ${titleSlug} not found`); - } + const problem = await this.fetchProblem(titleSlug); + if (!problem) { + throw new Error(`Problem ${titleSlug} not found`); + } - const filteredTopicTags = - problem.topicTags?.map((tag: any) => tag.slug) || []; - - const filteredCodeSnippets = - problem.codeSnippets?.filter((snippet: any) => - ["cpp", "python3", "java"].includes(snippet.langSlug) - ) || []; - - let parsedSimilarQuestions: any[] = []; - if (problem.similarQuestions) { - try { - const allQuestions = JSON.parse(problem.similarQuestions); - parsedSimilarQuestions = allQuestions - .slice(0, 3) - .map((q: any) => ({ - titleSlug: q.titleSlug, - difficulty: q.difficulty - })); - } catch (e) { - console.error("Error parsing similarQuestions:", e); - } + const filteredTopicTags = + problem.topicTags?.map((tag: any) => tag.slug) || []; + + const filteredCodeSnippets = + problem.codeSnippets?.filter((snippet: any) => + ["cpp", "python3", "java"].includes(snippet.langSlug) + ) || []; + + let parsedSimilarQuestions: any[] = []; + if (problem.similarQuestions) { + try { + const allQuestions = JSON.parse(problem.similarQuestions); + parsedSimilarQuestions = allQuestions + .slice(0, 3) + .map((q: any) => ({ + titleSlug: q.titleSlug, + difficulty: q.difficulty + })); + } catch (e) { + logger.error("Error parsing similarQuestions:", { + error: e + }); } - - return { - titleSlug, - questionId: problem.questionId, - title: problem.title, - content: problem.content, - difficulty: problem.difficulty, - topicTags: filteredTopicTags, - codeSnippets: filteredCodeSnippets, - exampleTestcases: problem.exampleTestcases, - hints: problem.hints, - similarQuestions: parsedSimilarQuestions - }; - } catch (error) { - console.error( - `Error fetching simplified problem ${titleSlug}:`, - error - ); - throw error; } + + return { + titleSlug, + questionId: problem.questionId, + title: problem.title, + content: problem.content, + difficulty: problem.difficulty, + topicTags: filteredTopicTags, + codeSnippets: filteredCodeSnippets, + exampleTestcases: problem.exampleTestcases, + hints: problem.hints, + similarQuestions: parsedSimilarQuestions + }; } async searchProblems( @@ -265,33 +191,28 @@ export class LeetCodeCNService implements LeetCodeBaseService { offset: number = 0, searchKeywords?: string ): Promise { - try { - const filters: any = {}; - if (difficulty) { - filters.difficulty = difficulty.toUpperCase(); - } - if (tags && tags.length > 0) { - filters.tags = tags; - } - if (searchKeywords) { - filters.searchKeywords = searchKeywords; - } + const filters: any = {}; + if (difficulty) { + filters.difficulty = difficulty.toUpperCase(); + } + if (tags && tags.length > 0) { + filters.tags = tags; + } + if (searchKeywords) { + filters.searchKeywords = searchKeywords; + } - const response = await this.leetCodeApi.graphql({ - query: SEARCH_PROBLEMS_QUERY, - variables: { - categorySlug: category, - limit, - skip: offset, - filters - } - }); + const response = await this.leetCodeApi.graphql({ + query: SEARCH_PROBLEMS_QUERY, + variables: { + categorySlug: category, + limit, + skip: offset, + filters + } + }); - return response.data?.problemsetQuestionList; - } catch (error) { - console.error("Error searching problems:", error); - throw error; - } + return response.data?.problemsetQuestionList; } async fetchUserProgressQuestionList(options?: { @@ -305,19 +226,15 @@ export class LeetCodeCNService implements LeetCodeBaseService { "Authentication required to fetch user progress question list" ); } - try { - const filters = { - skip: options?.offset || 0, - limit: options?.limit || 20, - questionStatus: options?.questionStatus as any, - difficulty: options?.difficulty as any[] - }; - - return await this.leetCodeApi.user_progress_questions(filters); - } catch (error) { - console.error("Error fetching user progress question list:", error); - throw error; - } + + const filters = { + skip: options?.offset || 0, + limit: options?.limit || 20, + questionStatus: options?.questionStatus as any, + difficulty: options?.difficulty as any[] + }; + + return await this.leetCodeApi.user_progress_questions(filters); } /** @@ -331,61 +248,52 @@ export class LeetCodeCNService implements LeetCodeBaseService { questionSlug: string, options?: any ): Promise { - try { - const variables: any = { - questionSlug, - first: options?.limit || 5, - skip: options?.skip || 0, - orderBy: options?.orderBy || "DEFAULT", - userInput: options?.userInput, - tagSlugs: options?.tagSlugs ?? [] - }; - - return await this.leetCodeApi - .graphql({ - query: SOLUTION_ARTICLES_QUERY, - variables - }) - .then((res) => { - const questionSolutionArticles = - res.data?.questionSolutionArticles; - if (!questionSolutionArticles) { - return { - totalNum: 0, - hasNextPage: false, - articles: [] - }; - } - const data = { - totalNum: questionSolutionArticles?.totalNum || 0, - hasNextPage: - questionSolutionArticles?.pageInfo?.hasNextPage || - false, - articles: - questionSolutionArticles?.edges - ?.map((edge: any) => { - if ( - edge?.node && - edge.node.topic?.id && - edge.node.slug - ) { - edge.node.articleUrl = `https://leetcode.cn/problems/${questionSlug}/solutions/${edge.node.topic.id}/${edge.node.slug}`; - } - return edge.node; - }) - .filter((node: any) => node && node.canSee) || - [] + const variables: any = { + questionSlug, + first: options?.limit || 5, + skip: options?.skip || 0, + orderBy: options?.orderBy || "DEFAULT", + userInput: options?.userInput, + tagSlugs: options?.tagSlugs ?? [] + }; + + return await this.leetCodeApi + .graphql({ + query: SOLUTION_ARTICLES_QUERY, + variables + }) + .then((res) => { + const questionSolutionArticles = + res.data?.questionSolutionArticles; + if (!questionSolutionArticles) { + return { + totalNum: 0, + hasNextPage: false, + articles: [] }; - - return data; - }); - } catch (error) { - console.error( - `Error fetching solutions for ${questionSlug}:`, - error - ); - throw error; - } + } + const data = { + totalNum: questionSolutionArticles?.totalNum || 0, + hasNextPage: + questionSolutionArticles?.pageInfo?.hasNextPage || + false, + articles: + questionSolutionArticles?.edges + ?.map((edge: any) => { + if ( + edge?.node && + edge.node.topic?.id && + edge.node.slug + ) { + edge.node.articleUrl = `https://leetcode.cn/problems/${questionSlug}/solutions/${edge.node.topic.id}/${edge.node.slug}`; + } + return edge.node; + }) + .filter((node: any) => node && node.canSee) || [] + }; + + return data; + }); } /** @@ -395,24 +303,18 @@ export class LeetCodeCNService implements LeetCodeBaseService { * @returns Promise resolving to the solution detail data */ async fetchSolutionArticleDetail(slug: string): Promise { - try { - return await this.leetCodeApi - .graphql({ - query: SOLUTION_ARTICLE_DETAIL_QUERY, - variables: { - slug - } - }) - .then((res) => { - return res.data?.solutionArticle; - }); - } catch (error) { - console.error( - `Error fetching solution detail for slug ${slug}:`, - error - ); - throw error; - } + const data = await this.leetCodeApi + .graphql({ + query: SOLUTION_ARTICLE_DETAIL_QUERY, + variables: { + slug + } + }) + .then((res) => { + return res.data?.solutionArticle; + }); + logger.info(data); + return data; } /** @@ -438,32 +340,27 @@ export class LeetCodeCNService implements LeetCodeBaseService { throw new Error("Authentication required to fetch user notes"); } - try { - const variables = { - aggregateType: options.aggregateType, - keyword: options.keyword, - orderBy: options.orderBy || "DESCENDING", - limit: options.limit || 20, - skip: options.skip || 0 - }; - - return await this.leetCodeApi - .graphql({ - query: NOTE_AGGREGATE_QUERY, - variables - }) - .then((response) => { - return ( - response.data?.noteAggregateNote || { - count: 0, - userNotes: [] - } - ); - }); - } catch (error) { - console.error(`Error fetching user notes:`, error); - throw error; - } + const variables = { + aggregateType: options.aggregateType, + keyword: options.keyword, + orderBy: options.orderBy || "DESCENDING", + limit: options.limit || 20, + skip: options.skip || 0 + }; + + return await this.leetCodeApi + .graphql({ + query: NOTE_AGGREGATE_QUERY, + variables + }) + .then((response) => { + return ( + response.data?.noteAggregateNote || { + count: 0, + userNotes: [] + } + ); + }); } /** @@ -486,34 +383,26 @@ export class LeetCodeCNService implements LeetCodeBaseService { ); } - try { - const variables = { - noteType: "COMMON_QUESTION", - questionId: questionId, - limit, - skip - }; - - return await this.leetCodeApi - .graphql({ - query: NOTE_BY_QUESTION_ID_QUERY, - variables - }) - .then((response) => { - return ( - response.data?.noteOneTargetCommonNote || { - count: 0, - userNotes: [] - } - ); - }); - } catch (error) { - console.error( - `Error fetching notes for question ${questionId}:`, - error - ); - throw error; - } + const variables = { + noteType: "COMMON_QUESTION", + questionId: questionId, + limit, + skip + }; + + return await this.leetCodeApi + .graphql({ + query: NOTE_BY_QUESTION_ID_QUERY, + variables + }) + .then((response) => { + return ( + response.data?.noteOneTargetCommonNote || { + count: 0, + userNotes: [] + } + ); + }); } /** @@ -536,31 +425,26 @@ export class LeetCodeCNService implements LeetCodeBaseService { throw new Error("Authentication required to create notes"); } - try { - const variables = { - content, - noteType, - targetId, - summary: summary || "" - }; - - return await this.leetCodeApi - .graphql({ - query: NOTE_CREATE_MUTATION, - variables - }) - .then((response) => { - return ( - response.data?.noteCreateCommonNote || { - ok: false, - note: null - } - ); - }); - } catch (error) { - console.error(`Error creating note:`, error); - throw error; - } + const variables = { + content, + noteType, + targetId, + summary: summary || "" + }; + + return await this.leetCodeApi + .graphql({ + query: NOTE_CREATE_MUTATION, + variables + }) + .then((response) => { + return ( + response.data?.noteCreateCommonNote || { + ok: false, + note: null + } + ); + }); } /** @@ -581,30 +465,25 @@ export class LeetCodeCNService implements LeetCodeBaseService { throw new Error("Authentication required to update notes"); } - try { - const variables = { - noteId, - content, - summary: summary || "" - }; - - return await this.leetCodeApi - .graphql({ - query: NOTE_UPDATE_MUTATION, - variables - }) - .then((response) => { - return ( - response.data?.noteUpdateUserNote || { - ok: false, - note: null - } - ); - }); - } catch (error) { - console.error(`Error updating note:`, error); - throw error; - } + const variables = { + noteId, + content, + summary: summary || "" + }; + + return await this.leetCodeApi + .graphql({ + query: NOTE_UPDATE_MUTATION, + variables + }) + .then((response) => { + return ( + response.data?.noteUpdateUserNote || { + ok: false, + note: null + } + ); + }); } isAuthenticated(): boolean { diff --git a/src/leetcode/leetcode-global-service.ts b/src/leetcode/leetcode-global-service.ts index 8c84c7a..833cc79 100644 --- a/src/leetcode/leetcode-global-service.ts +++ b/src/leetcode/leetcode-global-service.ts @@ -1,4 +1,5 @@ import { Credential, LeetCode } from "leetcode-query"; +import logger from "../utils/logger.js"; import { SEARCH_PROBLEMS_QUERY } from "./graphql/global/search-problems.js"; import { SOLUTION_ARTICLE_DETAIL_QUERY } from "./graphql/global/solution-article-detail.js"; import { SOLUTION_ARTICLES_QUERY } from "./graphql/global/solution-articles.js"; @@ -24,27 +25,14 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { "Authentication required to fetch user submission detail" ); } - try { - return await this.leetCodeApi.submission(id); - } catch (error) { - console.error( - `Error fetching submission detail for id ${id}:`, - error - ); - throw error; - } + return await this.leetCodeApi.submission(id); } async fetchUserStatus(): Promise { if (!this.isAuthenticated()) { throw new Error("Authentication required to fetch user status"); } - try { - return await this.leetCodeApi.whoami(); - } catch (error) { - console.error(`Error fetching user status:`, error); - throw error; - } + return await this.leetCodeApi.whoami(); } async fetchUserAllSubmissions(options: { @@ -60,17 +48,12 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { "Authentication required to fetch user submissions" ); } - try { - const submissions = await this.leetCodeApi.submissions({ - offset: options.offset ?? 0, - limit: options.limit ?? 20, - slug: options.questionSlug - }); - return { submissions }; - } catch (error) { - console.error(`Error fetching user submissions:`, error); - throw error; - } + const submissions = await this.leetCodeApi.submissions({ + offset: options.offset ?? 0, + limit: options.limit ?? 20, + slug: options.questionSlug + }); + return { submissions }; } /** @@ -83,15 +66,7 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { username: string, limit?: number ): Promise { - try { - return await this.leetCodeApi.recent_submissions(username, limit); - } catch (error) { - console.error( - `Error fetching recent submissions for ${username}:`, - error - ); - throw error; - } + return await this.leetCodeApi.recent_submissions(username, limit); } /** @@ -104,143 +79,100 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { username: string, limit?: number ): Promise { - try { - return await this.leetCodeApi.graphql({ - query: ` - query ($username: String!, $limit: Int) { - recentAcSubmissionList(username: $username, limit: $limit) { - id - title - titleSlug - time - timestamp - statusDisplay - lang - } + return await this.leetCodeApi.graphql({ + query: ` + query ($username: String!, $limit: Int) { + recentAcSubmissionList(username: $username, limit: $limit) { + id + title + titleSlug + time + timestamp + statusDisplay + lang } + } - `, - variables: { - username, - limit - } - }); - } catch (error) { - console.error( - `Error fetching recent submissions for ${username}:`, - error - ); - throw error; - } + `, + variables: { + username, + limit + } + }); } async fetchUserProfile(username: string): Promise { - try { - const profile = await this.leetCodeApi.user(username); - return profile; - } catch (error) { - console.error( - `Error fetching user profile for ${username}:`, - error - ); - throw error; - } + const profile = await this.leetCodeApi.user(username); + return profile; } async fetchUserContestRanking( username: string, attended: boolean = true ): Promise { - try { - const contestInfo = - await this.leetCodeApi.user_contest_info(username); - if (contestInfo.userContestRankingHistory && attended) { - contestInfo.userContestRankingHistory = - contestInfo.userContestRankingHistory.filter( - (contest: any) => { - return contest && contest.attended; - } - ); - } - return contestInfo; - } catch (error) { - console.error( - `Error fetching user contest ranking for ${username}:`, - error - ); - throw error; + const contestInfo = await this.leetCodeApi.user_contest_info(username); + if (contestInfo.userContestRankingHistory && attended) { + contestInfo.userContestRankingHistory = + contestInfo.userContestRankingHistory.filter((contest: any) => { + return contest && contest.attended; + }); } + return contestInfo; } async fetchDailyChallenge(): Promise { - try { - const dailyChallenge = await this.leetCodeApi.daily(); - return dailyChallenge; - } catch (error) { - console.error("Error fetching daily challenge:", error); - throw error; - } + const dailyChallenge = await this.leetCodeApi.daily(); + return dailyChallenge; } async fetchProblem(titleSlug: string): Promise { - try { - const problem = await this.leetCodeApi.problem(titleSlug); - return problem; - } catch (error) { - console.error(`Error fetching problem ${titleSlug}:`, error); - throw error; - } + const problem = await this.leetCodeApi.problem(titleSlug); + return problem; } async fetchProblemSimplified(titleSlug: string): Promise { - try { - const problem = await this.fetchProblem(titleSlug); - if (!problem) { - throw new Error(`Problem ${titleSlug} not found`); - } + const problem = await this.fetchProblem(titleSlug); + if (!problem) { + throw new Error(`Problem ${titleSlug} not found`); + } - const filteredTopicTags = - problem.topicTags?.map((tag: any) => tag.slug) || []; - - const filteredCodeSnippets = - problem.codeSnippets?.filter((snippet: any) => - ["cpp", "python3", "java"].includes(snippet.langSlug) - ) || []; - - let parsedSimilarQuestions: any[] = []; - if (problem.similarQuestions) { - try { - const allQuestions = JSON.parse(problem.similarQuestions); - parsedSimilarQuestions = allQuestions - .slice(0, 3) - .map((q: any) => ({ - titleSlug: q.titleSlug, - difficulty: q.difficulty - })); - } catch (e) { - console.error("Error parsing similarQuestions:", e); - } + const filteredTopicTags = + problem.topicTags?.map((tag: any) => tag.slug) || []; + + const filteredCodeSnippets = + problem.codeSnippets?.filter((snippet: any) => + ["cpp", "python3", "java"].includes(snippet.langSlug) + ) || []; + + let parsedSimilarQuestions: any[] = []; + if (problem.similarQuestions) { + try { + const allQuestions = JSON.parse(problem.similarQuestions); + parsedSimilarQuestions = allQuestions + .slice(0, 3) + .map((q: any) => ({ + titleSlug: q.titleSlug, + difficulty: q.difficulty + })); + } catch (e) { + logger.error("Error parsing similarQuestions:", { + error: e + }); } - - return { - titleSlug, - questionId: problem.questionId, - title: problem.title, - content: problem.content, - difficulty: problem.difficulty, - topicTags: filteredTopicTags, - codeSnippets: filteredCodeSnippets, - exampleTestcases: problem.exampleTestcases, - hints: problem.hints, - similarQuestions: parsedSimilarQuestions - }; - } catch (error) { - console.error( - `Error fetching simplified problem ${titleSlug}:`, - error - ); - throw error; } + + return { + titleSlug, + questionId: problem.questionId, + title: problem.title, + content: problem.content, + difficulty: problem.difficulty, + topicTags: filteredTopicTags, + codeSnippets: filteredCodeSnippets, + exampleTestcases: problem.exampleTestcases, + hints: problem.hints, + similarQuestions: parsedSimilarQuestions + }; } async searchProblems( @@ -251,33 +183,28 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { offset: number = 0, searchKeywords?: string ): Promise { - try { - const filters: any = {}; - if (difficulty) { - filters.difficulty = difficulty.toUpperCase(); - } - if (tags && tags.length > 0) { - filters.tags = tags; - } - if (searchKeywords) { - filters.searchKeywords = searchKeywords; - } + const filters: any = {}; + if (difficulty) { + filters.difficulty = difficulty.toUpperCase(); + } + if (tags && tags.length > 0) { + filters.tags = tags; + } + if (searchKeywords) { + filters.searchKeywords = searchKeywords; + } - const response = await this.leetCodeApi.graphql({ - query: SEARCH_PROBLEMS_QUERY, - variables: { - categorySlug: category, - limit, - skip: offset, - filters - } - }); + const response = await this.leetCodeApi.graphql({ + query: SEARCH_PROBLEMS_QUERY, + variables: { + categorySlug: category, + limit, + skip: offset, + filters + } + }); - return response.data?.problemsetQuestionList; - } catch (error) { - console.error("Error searching problems:", error); - throw error; - } + return response.data?.problemsetQuestionList; } async fetchUserProgressQuestionList(options?: { @@ -291,19 +218,15 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { "Authentication required to fetch user progress question list" ); } - try { - const filters = { - skip: options?.offset || 0, - limit: options?.limit || 20, - questionStatus: options?.questionStatus as any, - difficulty: options?.difficulty as any[] - }; - - return await this.leetCodeApi.user_progress_questions(filters); - } catch (error) { - console.error("Error fetching user progress question list:", error); - throw error; - } + + const filters = { + skip: options?.offset || 0, + limit: options?.limit || 20, + questionStatus: options?.questionStatus as any, + difficulty: options?.difficulty as any[] + }; + + return await this.leetCodeApi.user_progress_questions(filters); } /** @@ -317,61 +240,52 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { questionSlug: string, options?: any ): Promise { - try { - const variables: any = { - questionSlug, - first: options?.limit || 5, - skip: options?.skip || 0, - orderBy: options?.orderBy || "HOT", - userInput: options?.userInput, - tagSlugs: options?.tagSlugs ?? [] - }; - - return await this.leetCodeApi - .graphql({ - query: SOLUTION_ARTICLES_QUERY, - variables - }) - .then((res) => { - const ugcArticleSolutionArticles = - res.data?.ugcArticleSolutionArticles; - if (!ugcArticleSolutionArticles) { - return { - totalNum: 0, - hasNextPage: false, - articles: [] - }; - } - const data = { - totalNum: ugcArticleSolutionArticles?.totalNum || 0, - hasNextPage: - ugcArticleSolutionArticles?.pageInfo?.hasNextPage || - false, - articles: - ugcArticleSolutionArticles?.edges - ?.map((edge: any) => { - if ( - edge?.node && - edge.node.topicId && - edge.node.slug - ) { - edge.node.articleUrl = `https://leetcode.com/problems/${questionSlug}/solutions/${edge.node.topicId}/${edge.node.slug}`; - } - return edge.node; - }) - .filter((node: any) => node && node.canSee) || - [] + const variables: any = { + questionSlug, + first: options?.limit || 5, + skip: options?.skip || 0, + orderBy: options?.orderBy || "HOT", + userInput: options?.userInput, + tagSlugs: options?.tagSlugs ?? [] + }; + + return await this.leetCodeApi + .graphql({ + query: SOLUTION_ARTICLES_QUERY, + variables + }) + .then((res) => { + const ugcArticleSolutionArticles = + res.data?.ugcArticleSolutionArticles; + if (!ugcArticleSolutionArticles) { + return { + totalNum: 0, + hasNextPage: false, + articles: [] }; - - return data; - }); - } catch (error) { - console.error( - `Error fetching solutions for ${questionSlug}:`, - error - ); - throw error; - } + } + const data = { + totalNum: ugcArticleSolutionArticles?.totalNum || 0, + hasNextPage: + ugcArticleSolutionArticles?.pageInfo?.hasNextPage || + false, + articles: + ugcArticleSolutionArticles?.edges + ?.map((edge: any) => { + if ( + edge?.node && + edge.node.topicId && + edge.node.slug + ) { + edge.node.articleUrl = `https://leetcode.com/problems/${questionSlug}/solutions/${edge.node.topicId}/${edge.node.slug}`; + } + return edge.node; + }) + .filter((node: any) => node && node.canSee) || [] + }; + + return data; + }); } /** @@ -381,24 +295,16 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { * @returns Promise resolving to the solution detail data */ async fetchSolutionArticleDetail(topicId: string): Promise { - try { - return await this.leetCodeApi - .graphql({ - query: SOLUTION_ARTICLE_DETAIL_QUERY, - variables: { - topicId - } - }) - .then((response) => { - return response.data?.ugcArticleSolutionArticle; - }); - } catch (error) { - console.error( - `Error fetching solution detail for topic ${topicId}:`, - error - ); - throw error; - } + return await this.leetCodeApi + .graphql({ + query: SOLUTION_ARTICLE_DETAIL_QUERY, + variables: { + topicId + } + }) + .then((response) => { + return response.data?.ugcArticleSolutionArticle; + }); } /** diff --git a/src/utils/logger.ts b/src/utils/logger.ts new file mode 100644 index 0000000..48be656 --- /dev/null +++ b/src/utils/logger.ts @@ -0,0 +1,30 @@ +import { pino } from "pino"; + +const prodConfig = { + level: "info", + formatters: { + level: (label: string) => ({ level: label.toUpperCase() }) + }, + timestamp: () => `,"timestamp":"${new Date().toISOString()}"`, + messageKey: "message", + nestedKey: "payload" +}; + +const devConfig = { + level: "debug", + transport: { + target: "pino-pretty", + options: { + colorize: true, + translateTime: "SYS:yyyy-mm-dd HH:MM:ss.l", + ignore: "pid,hostname", + messageKey: "message" + } + } +}; + +const logger = pino( + process.env.NODE_ENV === "production" ? prodConfig : devConfig +); + +export default logger; diff --git a/tests/services/problem-services.test.ts b/tests/services/problem-services.test.ts index b01ba7c..567873f 100644 --- a/tests/services/problem-services.test.ts +++ b/tests/services/problem-services.test.ts @@ -2,6 +2,7 @@ import { Credential, LeetCode, LeetCodeCN } from "leetcode-query"; import { describe, expect, it } from "vitest"; import { LeetCodeCNService } from "../../src/leetcode/leetcode-cn-service.js"; import { LeetCodeGlobalService } from "../../src/leetcode/leetcode-global-service.js"; +import logger from "../../src/utils/logger.js"; describe("LeetCode Problem Services", () => { describe("LeetCodeGlobalService", () => { @@ -18,7 +19,6 @@ describe("LeetCode Problem Services", () => { expect(result.titleSlug).toBe(titleSlug); expect(result.title).toBe("Two Sum"); expect(result.questionId).toBeDefined(); - expect(result.questionFrontendId).toBeDefined(); expect(result.content).toBeDefined(); expect(result.difficulty).toBeDefined(); expect(Array.isArray(result.topicTags)).toBe(true); @@ -32,13 +32,9 @@ describe("LeetCode Problem Services", () => { it("should handle invalid problems correctly", async () => { const invalidSlug = `invalid-problem-${Date.now()}`; - - try { - await service.fetchProblemSimplified(invalidSlug); - expect(true).toBe(false); - } catch (error) { - expect(error).toBeDefined(); - } + await expect( + service.fetchProblemSimplified(invalidSlug) + ).rejects.toThrow(`Problem ${invalidSlug} not found`); }, 30000); }); }); @@ -56,7 +52,6 @@ describe("LeetCode Problem Services", () => { expect(result).toBeDefined(); expect(result.titleSlug).toBe(titleSlug); expect(result.questionId).toBeDefined(); - expect(result.questionFrontendId).toBeDefined(); expect(result.title).toBeDefined(); expect(result.content).toBeDefined(); expect(result.difficulty).toBeDefined(); @@ -68,7 +63,7 @@ describe("LeetCode Problem Services", () => { expect(Array.isArray(result.similarQuestions)).toBe(true); } - console.log( + logger.info( `Successfully fetched simplified data for ${titleSlug}` ); }, 30000); @@ -76,12 +71,9 @@ describe("LeetCode Problem Services", () => { it("should handle invalid problems correctly", async () => { const invalidSlug = `invalid-problem-${Date.now()}`; - try { - await service.fetchProblemSimplified(invalidSlug); - expect(true).toBe(false); - } catch (error) { - expect(error).toBeDefined(); - } + await expect( + service.fetchProblemSimplified(invalidSlug) + ).rejects.toBeDefined(); }, 30000); }); }); diff --git a/tests/services/solution-services.test.ts b/tests/services/solution-services.test.ts index 0af9d54..3e90ded 100644 --- a/tests/services/solution-services.test.ts +++ b/tests/services/solution-services.test.ts @@ -2,6 +2,7 @@ import { Credential, LeetCode, LeetCodeCN } from "leetcode-query"; import { describe, expect, it } from "vitest"; import { LeetCodeCNService } from "../../src/leetcode/leetcode-cn-service.js"; import { LeetCodeGlobalService } from "../../src/leetcode/leetcode-global-service.js"; +import logger from "../../src/utils/logger.js"; describe("LeetCode Solution Services", () => { describe("LeetCodeGlobalService", () => { @@ -43,12 +44,13 @@ describe("LeetCode Solution Services", () => { it("should handle errors properly for invalid slugs", async () => { const invalidSlug = `invalid-slug-${Date.now()}`; - try { + const data = await service.fetchQuestionSolutionArticles(invalidSlug); - expect(true).toBe(false); - } catch (error) { - expect(error).toBeDefined(); - } + + expect(data).toBeDefined(); + expect(data.totalNum).toBe(0); + expect(data.articles).toBeDefined(); + expect(data.articles.length).toBe(0); }, 30000); }); @@ -63,19 +65,18 @@ describe("LeetCode Solution Services", () => { !solutionsResult.edges || solutionsResult.edges.length === 0 ) { - console.log( + logger.info( "No solutions found for two-sum, skipping test" ); return; } const topicId = solutionsResult.edges[0].node.topic.id; - console.log(`Using topicId: ${topicId} for detail fetch`); + logger.info(`Using topicId: ${topicId} for detail fetch`); const result = await service.fetchSolutionArticleDetail(topicId); - expect(result).toBeDefined(); expect(result).toBeDefined(); expect(result.title).toBeDefined(); expect(result.content).toBeDefined(); @@ -83,13 +84,9 @@ describe("LeetCode Solution Services", () => { it("should handle errors properly for invalid topicIds", async () => { const invalidTopicId = `invalid-topic-${Date.now()}`; - - try { - await service.fetchSolutionArticleDetail(invalidTopicId); - expect(true).toBe(false); - } catch (error) { - expect(error).toBeDefined(); - } + await expect( + service.fetchSolutionArticleDetail(invalidTopicId) + ).resolves.toBeNull(); }, 30000); }); }); @@ -110,7 +107,7 @@ describe("LeetCode Solution Services", () => { expect(result.totalNum).toBeTypeOf("number"); expect(Array.isArray(result.articles)).toBe(true); - console.log( + logger.info( `Found ${result.totalNum} solutions for ${questionSlug} on CN` ); }, 30000); @@ -134,13 +131,13 @@ describe("LeetCode Solution Services", () => { it("should handle errors properly for invalid slugs", async () => { const invalidSlug = `invalid-slug-${Date.now()}`; - - try { + const data = await service.fetchQuestionSolutionArticles(invalidSlug); - expect(true).toBe(false); - } catch (error) { - expect(error).toBeDefined(); - } + + expect(data).toBeDefined(); + expect(data.totalNum).toBe(0); + expect(data.articles).toBeDefined(); + expect(data.articles.length).toBe(0); }, 30000); }); @@ -155,14 +152,14 @@ describe("LeetCode Solution Services", () => { !solutionsResult.edges || solutionsResult.edges.length === 0 ) { - console.log( + logger.info( "No solutions found for two-sum on CN, skipping test" ); return; } const slug = solutionsResult.edges[0].node.slug; - console.log(`Using slug: ${slug} for detail fetch on CN`); + logger.info(`Using slug: ${slug} for detail fetch on CN`); const result = await service.fetchSolutionArticleDetail(slug); @@ -174,12 +171,9 @@ describe("LeetCode Solution Services", () => { it("should handle errors properly for invalid slugs", async () => { const invalidSlug = `invalid-slug-${Date.now()}`; - try { - await service.fetchSolutionArticleDetail(invalidSlug); - expect(true).toBe(false); - } catch (error) { - expect(error).toBeDefined(); - } + await expect( + service.fetchSolutionArticleDetail(invalidSlug) + ).resolves.toBeNull(); }, 30000); }); }); From 5a9fae5e078255f4c42032cb103400d37acd2042 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Mon, 21 Apr 2025 00:39:42 +0800 Subject: [PATCH 11/27] feat: update logger configuration --- .github/workflows/npm-publish.yml | 21 +++++++++++++++++---- package.json | 2 +- src/utils/logger.ts | 21 ++------------------- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index 870a287..fc50f83 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -16,9 +16,22 @@ jobs: with: node-version: 20 registry-url: https://registry.npmjs.org/ - - run: npm ci - - run: npm test - - run: npm run build - - run: npm publish + cache: "npm" + - name: Install dependencies + run: npm ci + - name: Run tests + run: npm test + - name: Build package + run: npm run build + - name: Check package version matches release + run: | + PKG_VERSION=$(node -p "require('./package.json').version") + GITHUB_REF_VERSION=${GITHUB_REF#refs/tags/v} + if [ "$PKG_VERSION" != "$GITHUB_REF_VERSION" ]; then + echo "::error::Package version ($PKG_VERSION) does not match release tag ($GITHUB_REF_VERSION)" + exit 1 + fi + - name: Publish to NPM + run: npm publish --provenance --access public env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff --git a/package.json b/package.json index 5516ee9..817765b 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "algorithm" ], "scripts": { - "test": "vitest run", + "test": "vitest run | pino-pretty", "test:watch": "vitest watch", "build": "tsc && chmod u+x build/index.js", "start": "node build/index.js", diff --git a/src/utils/logger.ts b/src/utils/logger.ts index 48be656..672fd54 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -1,6 +1,6 @@ import { pino } from "pino"; -const prodConfig = { +const logger = pino({ level: "info", formatters: { level: (label: string) => ({ level: label.toUpperCase() }) @@ -8,23 +8,6 @@ const prodConfig = { timestamp: () => `,"timestamp":"${new Date().toISOString()}"`, messageKey: "message", nestedKey: "payload" -}; - -const devConfig = { - level: "debug", - transport: { - target: "pino-pretty", - options: { - colorize: true, - translateTime: "SYS:yyyy-mm-dd HH:MM:ss.l", - ignore: "pid,hostname", - messageKey: "message" - } - } -}; - -const logger = pino( - process.env.NODE_ENV === "production" ? prodConfig : devConfig -); +}); export default logger; From 7b4b0f5772f2f8766f229d37f6b41461f376bd98 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Mon, 21 Apr 2025 00:51:55 +0800 Subject: [PATCH 12/27] feat: update version to v1.0.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 37f0878..b4b73c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@jinzcdev/leetcode-mcp-server", - "version": "0.1.1", + "version": "1.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@jinzcdev/leetcode-mcp-server", - "version": "0.1.1", + "version": "1.0.1", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.8.0", diff --git a/package.json b/package.json index 817765b..e4dea35 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@jinzcdev/leetcode-mcp-server", "description": "MCP Server for LeetCode API (supports leetcode.com and leetcode.cn)", - "version": "0.1.1", + "version": "1.0.1", "author": "jinzcdev", "main": "./build/index.js", "keywords": [ From ff6cf117f4abc5aeb761e7e09abfed4135a246dd Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Fri, 25 Apr 2025 09:27:35 +0800 Subject: [PATCH 13/27] docs: update the README --- README.md | 48 +++++++++++++++++++++++++++++++++++------------- README_zh-CN.md | 49 ++++++++++++++++++++++++++++++++++++------------- 2 files changed, 71 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 7c19a4d..eea8c39 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,29 @@ npm run build && node build/index.js --site global ### Visual Studio Code Integration -Add the following JSON configuration to your User Settings (JSON) file Code. Access this by pressing `Ctrl/Cmd + Shift + P` and searching for `Preferences: Open User Settings (JSON)`. +Add the following JSON configuration to your User Settings (JSON) file. Access this by pressing `Ctrl/Cmd + Shift + P` and searching for `Preferences: Open User Settings (JSON)`. + +#### Option 1: Using Environment Variables + +```json +{ + "mcp": { + "servers": { + "leetcode": { + "type": "stdio", + "command": "npx", + "args": ["-y", "@jinzcdev/leetcode-mcp-server"], + "env": { + "LEETCODE_SITE": "global", + "LEETCODE_SESSION": "" + } + } + } + } +} +``` + +#### Option 2: Using Command Line Arguments ```json { @@ -90,18 +112,18 @@ Add the following JSON configuration to your User Settings (JSON) file Code. Acc For LeetCode China site, modify the `--site` parameter to `cn`. -## Environment Variables - -The server supports the following environment variables: - -- `LEETCODE_SITE`: LeetCode API endpoint ('global' or 'cn') -- `LEETCODE_SESSION`: LeetCode session cookie for authenticated API access - -**Priority Note**: -Command-line arguments take precedence over environment variables when both are specified. For example: - -- If `LEETCODE_SITE=cn` is set but you run `leetcode-mcp-server --site global`, the server will use `global`. -- If `LEETCODE_SESSION` exists but you provide `--session "new_cookie"`, the command-line session value will be used. +> [!TIP] +> +> The server supports the following environment variables: +> +> - `LEETCODE_SITE`: LeetCode API endpoint ('global' or 'cn') +> - `LEETCODE_SESSION`: LeetCode session cookie for authenticated API access +> +> **Priority Note**: +> Command-line arguments take precedence over environment variables when both are specified. For example: +> +> - If `LEETCODE_SITE=cn` is set but you run `leetcode-mcp-server --site global`, the server will use `global`. +> - If `LEETCODE_SESSION` exists but you provide `--session "new_cookie"`, the command-line session value will be used. ## Available Tools diff --git a/README_zh-CN.md b/README_zh-CN.md index 25ce3bb..a270fbc 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -65,7 +65,29 @@ npm run build && node build/index.js --site global ### Visual Studio Code 集成 -在您的用户设置 (JSON) 文件中添加以下 JSON 配置。通过按 `Ctrl/Cmd + Shift + P` 并搜索 `Preferences: Open User Settings (JSON)` 来访问此文件。 +在您的用户设置 (JSON) 文件中添加以下配置。通过按 `Ctrl/Cmd + Shift + P` 并搜索 `Preferences: Open User Settings (JSON)` 来访问此文件。 + +#### 方式一:使用环境变量 + +```json +{ + "mcp": { + "servers": { + "leetcode": { + "type": "stdio", + "command": "npx", + "args": ["-y", "@jinzcdev/leetcode-mcp-server"], + "env": { + "LEETCODE_SITE": "global", + "LEETCODE_SESSION": "<您的 LEETCODE 会话 COOKIE>" + } + } + } + } +} +``` + +#### 方式二:使用命令行参数 ```json { @@ -90,18 +112,19 @@ npm run build && node build/index.js --site global 对于 LeetCode 中国站点,请将 `--site` 参数修改为 `cn`。 -## 环境变量 - -服务器支持以下环境变量: - -- `LEETCODE_SITE`:LeetCode API 端点('global' 或 'cn') -- `LEETCODE_SESSION`:用于授权 API 访问的 LeetCode 会话 cookie - -**优先级说明**: -当同时指定命令行参数和环境变量时,命令行参数优先。例如: - -- 如果设置了 `LEETCODE_SITE=cn` 但您运行 `leetcode-mcp-server --site global`,服务器将使用 `global`。 -- 如果存在 `LEETCODE_SESSION` 但您提供了 `--session "new_cookie"`,将使用命令行中的会话值。 +> [!TIP] +> +> 服务支持以下环境变量: +> +> - `LEETCODE_SITE`:LeetCode API 端点('global' 或 'cn') +> - `LEETCODE_SESSION`:用于授权 API 访问的 LeetCode 会话 cookie +> +> **优先级说明**: +> +> 当同时指定命令行参数和环境变量时,命令行参数优先。例如: +> +> - 如果设置了 `LEETCODE_SITE=cn` 但您运行 `leetcode-mcp-server --site global`,服务器将使用 `global`。 +> - 如果存在 `LEETCODE_SESSION` 但您提供了 `--session "new_cookie"`,将使用命令行中的参数值。 ## 可用工具 From cfb8df7257a2bee199dacd122e816140563ee4e8 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Fri, 25 Apr 2025 11:25:10 +0800 Subject: [PATCH 14/27] feat(userStatus): simplify user status response in LeetCode services --- src/leetcode/leetcode-cn-service.ts | 10 +++++++++- src/leetcode/leetcode-global-service.ts | 9 ++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/leetcode/leetcode-cn-service.ts b/src/leetcode/leetcode-cn-service.ts index c2c94de..58f2c47 100644 --- a/src/leetcode/leetcode-cn-service.ts +++ b/src/leetcode/leetcode-cn-service.ts @@ -38,7 +38,15 @@ export class LeetCodeCNService implements LeetCodeBaseService { if (!this.isAuthenticated()) { throw new Error("Authentication required to fetch user status"); } - return await this.leetCodeApi.userStatus(); + return await this.leetCodeApi.userStatus().then((res) => { + return { + isSignedIn: res?.isSignedIn ?? false, + username: res?.username ?? "", + avatar: res?.avatar ?? "", + isAdmin: res?.isAdmin ?? false, + useTranslation: res?.useTranslation ?? false + }; + }); } async fetchUserAllSubmissions(options: { diff --git a/src/leetcode/leetcode-global-service.ts b/src/leetcode/leetcode-global-service.ts index 833cc79..9e7bdbf 100644 --- a/src/leetcode/leetcode-global-service.ts +++ b/src/leetcode/leetcode-global-service.ts @@ -32,7 +32,14 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { if (!this.isAuthenticated()) { throw new Error("Authentication required to fetch user status"); } - return await this.leetCodeApi.whoami(); + return await this.leetCodeApi.whoami().then((res) => { + return { + isSignedIn: res?.isSignedIn ?? false, + username: res?.username ?? "", + avatar: res?.avatar ?? "", + isAdmin: res?.isAdmin ?? false + }; + }); } async fetchUserAllSubmissions(options: { From 285dfd839cd5ef1acca367a837763aa97287faa2 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Fri, 25 Apr 2025 14:48:25 +0800 Subject: [PATCH 15/27] feat: simplify user profile response and question list structure --- src/leetcode/leetcode-cn-service.ts | 66 +++++++++++++++++++++---- src/leetcode/leetcode-global-service.ts | 33 ++++++++++++- 2 files changed, 89 insertions(+), 10 deletions(-) diff --git a/src/leetcode/leetcode-cn-service.ts b/src/leetcode/leetcode-cn-service.ts index 58f2c47..e7c4449 100644 --- a/src/leetcode/leetcode-cn-service.ts +++ b/src/leetcode/leetcode-cn-service.ts @@ -121,7 +121,44 @@ export class LeetCodeCNService implements LeetCodeBaseService { } async fetchUserProfile(username: string): Promise { - return await this.leetCodeApi.user(username); + const originalProfile = await this.leetCodeApi.user(username); + + if (!originalProfile || !originalProfile.userProfilePublicProfile) { + return originalProfile; + } + + const publicProfile = originalProfile.userProfilePublicProfile || {}; + const userProfile = publicProfile.profile || {}; + const skillSet = userProfile.skillSet || {}; + + const simplifiedProfile = { + username: userProfile.userSlug, + questionProgress: originalProfile.userProfileUserQuestionProgress, + siteRanking: publicProfile.siteRanking, + profile: { + userSlug: userProfile.userSlug, + realName: userProfile.realName, + userAvatar: userProfile.userAvatar, + globalLocation: userProfile.globalLocation, + school: userProfile.school?.name, + socialAccounts: (userProfile.socialAccounts || []).filter( + (account: any) => !!account.profileUrl + ), + skillSet: { + topics: (skillSet.topics || []).map( + (topic: any) => topic.slug + ), + topicAreaScores: (skillSet.topicAreaScores || []).map( + (item: any) => ({ + slug: item.topicArea?.slug, + score: item.score + }) + ) + } + } + }; + + return simplifiedProfile; } async fetchUserContestRanking( @@ -210,17 +247,28 @@ export class LeetCodeCNService implements LeetCodeBaseService { filters.searchKeywords = searchKeywords; } - const response = await this.leetCodeApi.graphql({ + const { data } = await this.leetCodeApi.graphql({ query: SEARCH_PROBLEMS_QUERY, - variables: { - categorySlug: category, - limit, - skip: offset, - filters - } + variables: { categorySlug: category, limit, skip: offset, filters } }); - return response.data?.problemsetQuestionList; + const questionList = data?.problemsetQuestionList; + if (!questionList) { + return { hasMore: false, total: 0, questions: [] }; + } + + return { + hasMore: questionList.hasMore, + total: questionList.total, + questions: questionList.questions.map((q: any) => ({ + title: q.title, + titleCn: q.titleCn, + titleSlug: q.titleSlug, + difficulty: q.difficulty, + acRate: q.acRate, + topicTags: q.topicTags.map((tag: any) => tag.slug) + })) + }; } async fetchUserProgressQuestionList(options?: { diff --git a/src/leetcode/leetcode-global-service.ts b/src/leetcode/leetcode-global-service.ts index 9e7bdbf..2b00def 100644 --- a/src/leetcode/leetcode-global-service.ts +++ b/src/leetcode/leetcode-global-service.ts @@ -110,6 +110,21 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { async fetchUserProfile(username: string): Promise { const profile = await this.leetCodeApi.user(username); + if (profile && profile.matchedUser) { + const { matchedUser } = profile; + + return { + username: matchedUser.username, + realName: matchedUser.profile.realName, + userAvatar: matchedUser.profile.userAvatar, + countryName: matchedUser.profile.countryName, + githubUrl: matchedUser.githubUrl, + company: matchedUser.profile.company, + school: matchedUser.profile.school, + ranking: matchedUser.profile.ranking, + totalSubmissionNum: matchedUser.submitStats?.totalSubmissionNum + }; + } return profile; } @@ -211,7 +226,23 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { } }); - return response.data?.problemsetQuestionList; + const questionList = response.data?.problemsetQuestionList; + if (!questionList) { + return { + total: 0, + questions: [] + }; + } + return { + total: questionList.total, + questions: questionList.questions.map((question: any) => ({ + title: question.title, + titleSlug: question.titleSlug, + difficulty: question.difficulty, + acRate: question.acRate, + topicTags: question.topicTags.map((tag: any) => tag.slug) + })) + }; } async fetchUserProgressQuestionList(options?: { From f371f2c6f96e79f5c40436ab011fc3a5d7e3c869 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Fri, 25 Apr 2025 14:50:30 +0800 Subject: [PATCH 16/27] 1.1.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4b73c2..1c0b4aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@jinzcdev/leetcode-mcp-server", - "version": "1.0.1", + "version": "1.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@jinzcdev/leetcode-mcp-server", - "version": "1.0.1", + "version": "1.1.0", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.8.0", diff --git a/package.json b/package.json index e4dea35..792e2a7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@jinzcdev/leetcode-mcp-server", "description": "MCP Server for LeetCode API (supports leetcode.com and leetcode.cn)", - "version": "1.0.1", + "version": "1.1.0", "author": "jinzcdev", "main": "./build/index.js", "keywords": [ From 0920a0ebc28b485ccdb931e550551b73a10dc444 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Fri, 25 Apr 2025 16:19:14 +0800 Subject: [PATCH 17/27] docs: add new features --- README.md | 7 ++++--- README_zh-CN.md | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index eea8c39..cc0e433 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,11 @@ The LeetCode MCP Server is a [Model Context Protocol (MCP)](https://modelcontext ## Features -- 🌐 **Multi-site Support**: Supports both leetcode.com and leetcode.cn platforms -- 📊 **Problem Data Retrieval**: Obtain detailed problem descriptions, constraints, examples, and solution approaches +- 🌐 **Multi-site Support**: Compatible with both leetcode.com (Global) and leetcode.cn (China) +- 📊 **Problem Data Retrieval**: Obtain detailed problem descriptions, constraints, examples, official editorials, and ​user-submitted solutions - 👤 **User Data Access**: Retrieve user profiles, submission history, and contest performance -- 🔍 **Advanced Search Capabilities**: Filter problems by tags, difficulty levels, and categories +- 🔒 **​Private Data Access**: Create and query user notes, track problem-solving progress, and analyze submission details (AC/WA analysis) +- 🔍 **Advanced Search Capabilities**: Filter problems by tags, difficulty levels, categories, and keywords - 📅 **Daily Challenge Access**: Easily access daily challenge problems ## Prerequisites diff --git a/README_zh-CN.md b/README_zh-CN.md index a270fbc..41ef325 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -14,10 +14,11 @@ LeetCode MCP Server 是一个基于 [模型上下文协议 (MCP)](https://modelc ## 特性 -- 🌐 **多站点支持**:同时支持 `leetcode.com` 和 `leetcode.cn` 平台 -- 📊 ​**题目数据获取**:获取详细的题目描述、约束条件、示例和题解 +- 🌐 **多站点支持**:同时支持 `leetcode.com`(全球)和 `leetcode.cn`(中国)站点 +- 📊 ​**题目数据获取**:获取详细的题目描述、约束条件、示例、官方题解和用户提交的解答 - 👤 **用户数据访问**:检索用户资料、提交历史和竞赛表现 -- 🔍 **高级搜索功能**:按标签、难度级别和分类筛选题目 +- 🔒 **私有数据访问**:创建和查询用户笔记,跟踪题目解答进度,分析提交详情(AC/WA 报告) +- 🔍 **高级搜索功能**:按标签、难度级别、分类和关键字筛选题目 - 📅 **每日一题获取**:轻松访问每日一题 ## 前提条件 From fe637bf38e95813d34c6b996be6c39cb97b8a372 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Fri, 25 Apr 2025 18:11:53 +0800 Subject: [PATCH 18/27] docs: improve clarity in multi-site support description --- README.md | 2 +- README_zh-CN.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cc0e433..7612180 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The LeetCode MCP Server is a [Model Context Protocol (MCP)](https://modelcontext ## Features -- 🌐 **Multi-site Support**: Compatible with both leetcode.com (Global) and leetcode.cn (China) +- 🌐 **Multi-site Support**: Support​ both leetcode.com (Global) and leetcode.cn (China) platforms - 📊 **Problem Data Retrieval**: Obtain detailed problem descriptions, constraints, examples, official editorials, and ​user-submitted solutions - 👤 **User Data Access**: Retrieve user profiles, submission history, and contest performance - 🔒 **​Private Data Access**: Create and query user notes, track problem-solving progress, and analyze submission details (AC/WA analysis) diff --git a/README_zh-CN.md b/README_zh-CN.md index 41ef325..603b80e 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -14,7 +14,7 @@ LeetCode MCP Server 是一个基于 [模型上下文协议 (MCP)](https://modelc ## 特性 -- 🌐 **多站点支持**:同时支持 `leetcode.com`(全球)和 `leetcode.cn`(中国)站点 +- 🌐 **多站点支持**:同时支持 leetcode.com(全球)和 leetcode.cn(中国)站点 - 📊 ​**题目数据获取**:获取详细的题目描述、约束条件、示例、官方题解和用户提交的解答 - 👤 **用户数据访问**:检索用户资料、提交历史和竞赛表现 - 🔒 **私有数据访问**:创建和查询用户笔记,跟踪题目解答进度,分析提交详情(AC/WA 报告) From a43ac8e4b2ed695c8cf78bfcba7489a63a7a6001 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Mon, 5 May 2025 18:32:17 +0800 Subject: [PATCH 19/27] fix(logging): improve error logging format in LeetCode services --- src/index.ts | 2 +- src/leetcode/leetcode-cn-service.ts | 8 ++------ src/leetcode/leetcode-global-service.ts | 4 +--- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/index.ts b/src/index.ts index b7fdb64..8b94913 100644 --- a/src/index.ts +++ b/src/index.ts @@ -104,6 +104,6 @@ async function main() { } main().catch((error) => { - logger.error("Failed to start LeetCode MCP Server:", error); + logger.error("Failed to start LeetCode MCP Server: %s", error); process.exit(1); }); diff --git a/src/leetcode/leetcode-cn-service.ts b/src/leetcode/leetcode-cn-service.ts index e7c4449..20b144d 100644 --- a/src/leetcode/leetcode-cn-service.ts +++ b/src/leetcode/leetcode-cn-service.ts @@ -208,9 +208,7 @@ export class LeetCodeCNService implements LeetCodeBaseService { difficulty: q.difficulty })); } catch (e) { - logger.error("Error parsing similarQuestions:", { - error: e - }); + logger.error("Error parsing similarQuestions: %s", e); } } @@ -359,7 +357,7 @@ export class LeetCodeCNService implements LeetCodeBaseService { * @returns Promise resolving to the solution detail data */ async fetchSolutionArticleDetail(slug: string): Promise { - const data = await this.leetCodeApi + return await this.leetCodeApi .graphql({ query: SOLUTION_ARTICLE_DETAIL_QUERY, variables: { @@ -369,8 +367,6 @@ export class LeetCodeCNService implements LeetCodeBaseService { .then((res) => { return res.data?.solutionArticle; }); - logger.info(data); - return data; } /** diff --git a/src/leetcode/leetcode-global-service.ts b/src/leetcode/leetcode-global-service.ts index 2b00def..c23c744 100644 --- a/src/leetcode/leetcode-global-service.ts +++ b/src/leetcode/leetcode-global-service.ts @@ -177,9 +177,7 @@ export class LeetCodeGlobalService implements LeetCodeBaseService { difficulty: q.difficulty })); } catch (e) { - logger.error("Error parsing similarQuestions:", { - error: e - }); + logger.error("Error parsing similarQuestions: %s", e); } } From 5c5ee6f90124d61203b1bbcb8b71df71df6fdcf6 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Mon, 5 May 2025 18:38:35 +0800 Subject: [PATCH 20/27] feat(tests): add fetchDailyChallenge test --- tests/services/problem-services.test.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/services/problem-services.test.ts b/tests/services/problem-services.test.ts index 567873f..863dd92 100644 --- a/tests/services/problem-services.test.ts +++ b/tests/services/problem-services.test.ts @@ -10,6 +10,17 @@ describe("LeetCode Problem Services", () => { const leetCodeApi = new LeetCode(credential); const service = new LeetCodeGlobalService(leetCodeApi, credential); + describe("fetchDailyChallenge", () => { + it("should return daily challenge data", async () => { + const result = await service.fetchDailyChallenge(); + + expect(result).toBeDefined(); + expect(result.question).toBeDefined(); + expect(result.question.title).toBeDefined(); + expect(result.question.questionId).toBeDefined(); + }, 30000); + }); + describe("fetchProblemSimplified", () => { it("should return simplified problem data", async () => { const titleSlug = "two-sum"; @@ -44,6 +55,17 @@ describe("LeetCode Problem Services", () => { const leetCodeApi = new LeetCodeCN(credential); const service = new LeetCodeCNService(leetCodeApi, credential); + describe("fetchDailyChallenge", () => { + it("should return daily challenge data", async () => { + service.fetchDailyChallenge().then((result) => { + expect(result).toBeDefined(); + expect(result.question).toBeDefined(); + expect(result.question.title).toBeDefined(); + expect(result.question.questionId).toBeDefined(); + }); + }, 30000); + }); + describe("fetchProblemSimplified", () => { it("should return simplified problem data", async () => { const titleSlug = "two-sum"; From 422baff8a7201afc2348f78803e2d23ff4268926 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Mon, 5 May 2025 20:33:48 +0800 Subject: [PATCH 21/27] docs: update README for project build and server run instructions --- README.md | 7 +++++-- README_zh-CN.md | 19 +++++++++++-------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 7612180..5c5e91e 100644 --- a/README.md +++ b/README.md @@ -58,8 +58,11 @@ git clone https://github.com/jinzcdev/leetcode-mcp-server.git # Navigate to the project directory cd leetcode-mcp-server -# Build and run the server -npm run build && node build/index.js --site global +# Build the project +npm install && npm run build + +# Run the server +node build/index.js --site global ``` ## Usage diff --git a/README_zh-CN.md b/README_zh-CN.md index 603b80e..d8b830d 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -42,11 +42,11 @@ npx -y @smithery/cli install @jinzcdev/leetcode-mcp-server --client claude # 从 npm 安装 npm install @jinzcdev/leetcode-mcp-server -g -# 使用全球站点配置运行 -npx -y @jinzcdev/leetcode-mcp-server --site global +# 使用中国站点配置运行 +npx -y @jinzcdev/leetcode-mcp-server --site cn # 使用认证运行(访问私有数据) -npx -y @jinzcdev/leetcode-mcp-server --site global --session <您的 LEETCODE 会话 COOKIE> +npx -y @jinzcdev/leetcode-mcp-server --site cn --session <您的 LEETCODE 会话 COOKIE> ``` 或者,您可以克隆仓库并在本地运行: @@ -58,8 +58,11 @@ git clone https://github.com/jinzcdev/leetcode-mcp-server.git # 导航到项目目录 cd leetcode-mcp-server -# 构建并运行服务器 -npm run build && node build/index.js --site global +# 构建项目 +npm install && npm run build + +# 运行服务器 +node build/index.js --site cn ``` ## 使用方法 @@ -79,7 +82,7 @@ npm run build && node build/index.js --site global "command": "npx", "args": ["-y", "@jinzcdev/leetcode-mcp-server"], "env": { - "LEETCODE_SITE": "global", + "LEETCODE_SITE": "cn", "LEETCODE_SESSION": "<您的 LEETCODE 会话 COOKIE>" } } @@ -101,7 +104,7 @@ npm run build && node build/index.js --site global "-y", "@jinzcdev/leetcode-mcp-server", "--site", - "global", + "cn", "--session", "<您的 LEETCODE 会话 COOKIE>" ] @@ -111,7 +114,7 @@ npm run build && node build/index.js --site global } ``` -对于 LeetCode 中国站点,请将 `--site` 参数修改为 `cn`。 +对于 LeetCode 全球站点,请将 `--site` 参数修改为 `global`。 > [!TIP] > From a02eb37a0e3af504db76d1b6babfef6d71a68856 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Thu, 29 May 2025 11:09:03 +0800 Subject: [PATCH 22/27] fix(lint): update ESLint ignores and refine Prettier format command --- eslint.config.js | 3 +++ package.json | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/eslint.config.js b/eslint.config.js index 5779092..8004052 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -5,6 +5,9 @@ import globals from "globals"; import tseslint from "typescript-eslint"; export default defineConfig([ + { + ignores: ["**/build/**", "**/dist/**", "**/node_modules/**"] + }, { files: ["**/*.{js,mjs,cjs,ts}"], plugins: { js }, diff --git a/package.json b/package.json index 792e2a7..5ea22fd 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "build": "tsc && chmod u+x build/index.js", "start": "node build/index.js", "dev": "tsc-watch --onSuccess \"node build/index.js\"", - "format": "prettier --write . --ignore-path .gitignore", + "format": "prettier --write .", "prepare": "husky" }, "bin": { From 46b85ffe731f55c13da5490ebf2886db5493ca76 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Sat, 31 May 2025 21:56:18 +0800 Subject: [PATCH 23/27] chore(docker): update Dockerfile to use Node.js 20 and streamline build process --- Dockerfile | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 33ed963..b87dbe6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,4 @@ -# Generated by https://smithery.ai. See: https://smithery.ai/docs/config#dockerfile -FROM node:lts-alpine +FROM node:20-alpine AS builder # Create app directory WORKDIR /app @@ -16,12 +15,21 @@ COPY . . # Build the application RUN npm run build +# Use Node.js 20 Alpine as the base image for the runtime stage +FROM node:20-alpine AS runner + +# Set the working directory for the runtime stage +WORKDIR /app + +# Copy the built application and dependencies from the builder stage +COPY --from=builder /app/package*.json ./ +COPY --from=builder /app/build ./build + +RUN npm install --ignore-scripts --omit=dev + +# Define environment variables ENV LEETCODE_SITE=global \ LEETCODE_SESSION= -# Expose any port if needed (MCP uses stdio, so not required for now) - # Set the default command -CMD node build/index.js \ - --site ${LEETCODE_SITE:-global} \ - --session ${LEETCODE_SESSION} +ENTRYPOINT ["node","build/index.js"] From 9fa9ddb88c8166d1bae4f20352de8f32dedd09e7 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Sat, 31 May 2025 21:56:53 +0800 Subject: [PATCH 24/27] docs: update README for Node.js version requirement and environment variable defaults --- README.md | 8 ++++---- README_zh-CN.md | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 5c5e91e..28441c3 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ The LeetCode MCP Server is a [Model Context Protocol (MCP)](https://modelcontext ## Prerequisites -1. Node.js runtime environment +1. Node.js (v20.x or above) 2. (Optional) LeetCode session cookie for authenticated API access ## Installation @@ -118,10 +118,10 @@ For LeetCode China site, modify the `--site` parameter to `cn`. > [!TIP] > -> The server supports the following environment variables: +> The server supports the following optional environment variables: > -> - `LEETCODE_SITE`: LeetCode API endpoint ('global' or 'cn') -> - `LEETCODE_SESSION`: LeetCode session cookie for authenticated API access +> - `LEETCODE_SITE`: LeetCode API endpoint ('global' or 'cn', default: 'global') +> - `LEETCODE_SESSION`: LeetCode session cookie for authenticated API access (default: empty) > > **Priority Note**: > Command-line arguments take precedence over environment variables when both are specified. For example: diff --git a/README_zh-CN.md b/README_zh-CN.md index d8b830d..1d263c8 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -23,7 +23,7 @@ LeetCode MCP Server 是一个基于 [模型上下文协议 (MCP)](https://modelc ## 前提条件 -1. Node.js 运行环境 +1. Node.js (v20.x 或更高版本) 2. (可选)LeetCode 会话 cookie,用于授权访问 API ## 安装 @@ -118,10 +118,10 @@ node build/index.js --site cn > [!TIP] > -> 服务支持以下环境变量: +> 服务支持以下可选的环境变量: > -> - `LEETCODE_SITE`:LeetCode API 端点('global' 或 'cn') -> - `LEETCODE_SESSION`:用于授权 API 访问的 LeetCode 会话 cookie +> - `LEETCODE_SITE`:LeetCode API 端点('global' 或 'cn',默认为 'global') +> - `LEETCODE_SESSION`:用于授权 API 访问的 LeetCode 会话 cookie(默认为空) > > **优先级说明**: > From 24aec23938c758f694447ad0742729bd9752d34e Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Sat, 31 May 2025 22:20:30 +0800 Subject: [PATCH 25/27] chore: upgrade dependencies - update vitest to version 3.1.3 and vite to version 6.3.5 - bump rollup-linux-x64-gnu to 4.40.1 --- package-lock.json | 1781 ++++++++++++++++++++++++++++++++++++--------- package.json | 5 +- 2 files changed, 1440 insertions(+), 346 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1c0b4aa..57b6c9e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,14 +36,17 @@ "tsc-watch": "6.2.1", "typescript": "^5.8.3", "typescript-eslint": "^8.29.1", - "vitest": "^3.1.1" + "vite": "^6.3.5", + "vitest": "^3.1.3" }, "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "^4.40.0" + "@rollup/rollup-linux-x64-gnu": "^4.40.1" } }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" @@ -52,10 +55,78 @@ "node": ">=12" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", - "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", "cpu": [ "arm64" ], @@ -69,8 +140,350 @@ "node": ">=18" } }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.6.0", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, "license": "MIT", "dependencies": { @@ -88,6 +501,8 @@ }, "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { @@ -99,6 +514,8 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "license": "MIT", "engines": { @@ -107,6 +524,8 @@ }, "node_modules/@eslint/config-array": { "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -119,7 +538,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.1", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -127,7 +548,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.12.0", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -139,6 +562,8 @@ }, "node_modules/@eslint/eslintrc": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "license": "MIT", "dependencies": { @@ -161,6 +586,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", "engines": { @@ -171,15 +598,22 @@ } }, "node_modules/@eslint/js": { - "version": "9.24.0", + "version": "9.27.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.27.0.tgz", + "integrity": "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==", "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, "node_modules/@eslint/object-schema": { "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -187,30 +621,23 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.8", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", + "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.13.0", + "@eslint/core": "^0.14.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.13.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@fetch-impl/cross-fetch": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@fetch-impl/cross-fetch/-/cross-fetch-1.0.0.tgz", + "integrity": "sha512-vNvwtCQ7yruvpYnp1i/4paVi/icrGYx9O4eHNDYorjTAFg78bhitO0l39opJSVfsTKqyWqj3+2+YenoGhZOCJA==", "license": "MIT", "peerDependencies": { "@fetch-impl/fetcher": "^1.0.0", @@ -219,10 +646,14 @@ }, "node_modules/@fetch-impl/fetcher": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@fetch-impl/fetcher/-/fetcher-1.0.0.tgz", + "integrity": "sha512-UPUN9Yfjnk513Vc08iNW8/9L1nSwQMsTx6nOvmjPNfU2Rtbew/2KgAbQDPuoL6PrNgEmEmmyeM29BkcVBpt3gQ==", "license": "MIT" }, "node_modules/@humanfs/core": { "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -231,6 +662,8 @@ }, "node_modules/@humanfs/node": { "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -243,6 +676,8 @@ }, "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -255,6 +690,8 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -266,7 +703,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.2", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -279,6 +718,8 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -286,10 +727,14 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", @@ -297,16 +742,19 @@ } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.8.0", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.12.0.tgz", + "integrity": "sha512-m//7RlINx1F3sz3KqwY1WWzVgTcYX52HYk4bJ1hkBXV3zccAEth+jRvG8DBRrdaQuRsPAJOx2MH3zaHNCKL7Zg==", "license": "MIT", "dependencies": { + "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", - "cross-spawn": "^7.0.3", + "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", - "pkce-challenge": "^4.1.0", + "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" @@ -317,6 +765,8 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { @@ -329,6 +779,8 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { @@ -337,6 +789,8 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { @@ -348,20 +802,22 @@ } }, "node_modules/@pkgr/core": { - "version": "0.2.2", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.4.tgz", + "integrity": "sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==", "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/pkgr" } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz", - "integrity": "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz", + "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==", "cpu": [ "arm" ], @@ -373,9 +829,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz", - "integrity": "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz", + "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==", "cpu": [ "arm64" ], @@ -387,7 +843,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.39.0", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz", + "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==", "cpu": [ "arm64" ], @@ -399,9 +857,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz", - "integrity": "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz", + "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==", "cpu": [ "x64" ], @@ -413,9 +871,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz", - "integrity": "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz", + "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==", "cpu": [ "arm64" ], @@ -427,9 +885,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz", - "integrity": "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz", + "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==", "cpu": [ "x64" ], @@ -441,9 +899,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz", - "integrity": "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz", + "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==", "cpu": [ "arm" ], @@ -455,9 +913,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz", - "integrity": "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz", + "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==", "cpu": [ "arm" ], @@ -469,9 +927,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz", - "integrity": "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz", + "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==", "cpu": [ "arm64" ], @@ -483,9 +941,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz", - "integrity": "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz", + "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==", "cpu": [ "arm64" ], @@ -497,9 +955,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz", - "integrity": "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz", + "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==", "cpu": [ "loong64" ], @@ -511,9 +969,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz", - "integrity": "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz", + "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==", "cpu": [ "ppc64" ], @@ -525,9 +983,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz", - "integrity": "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz", + "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==", "cpu": [ "riscv64" ], @@ -539,9 +997,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz", - "integrity": "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz", + "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==", "cpu": [ "riscv64" ], @@ -553,9 +1011,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz", - "integrity": "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz", + "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==", "cpu": [ "s390x" ], @@ -567,9 +1025,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz", - "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz", + "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==", "cpu": [ "x64" ], @@ -580,9 +1038,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz", - "integrity": "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz", + "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==", "cpu": [ "x64" ], @@ -594,9 +1052,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz", - "integrity": "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz", + "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==", "cpu": [ "arm64" ], @@ -608,9 +1066,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz", - "integrity": "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz", + "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==", "cpu": [ "ia32" ], @@ -622,9 +1080,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz", - "integrity": "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz", + "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==", "cpu": [ "x64" ], @@ -637,56 +1095,74 @@ }, "node_modules/@tsconfig/node10": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/minimist": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { - "version": "22.14.0", + "version": "22.15.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.24.tgz", + "integrity": "sha512-w9CZGm9RDjzTh/D+hFwlBJ3ziUaVw7oufKA3vOFSOZlzmW9AkZnfjPb+DLnrV6qtgL/LNmP0/2zBNCFHL3F0ng==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.29.1", + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.0.tgz", + "integrity": "sha512-CACyQuqSHt7ma3Ns601xykeBK/rDeZa3w6IS6UtMQbixO5DWy+8TilKkviGDH6jtWCo8FGRKEK5cLLkPvEammQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.29.1", - "@typescript-eslint/type-utils": "8.29.1", - "@typescript-eslint/utils": "8.29.1", - "@typescript-eslint/visitor-keys": "8.29.1", + "@typescript-eslint/scope-manager": "8.33.0", + "@typescript-eslint/type-utils": "8.33.0", + "@typescript-eslint/utils": "8.33.0", + "@typescript-eslint/visitor-keys": "8.33.0", "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -696,20 +1172,32 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "@typescript-eslint/parser": "^8.33.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/@typescript-eslint/parser": { - "version": "8.29.1", + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.33.0.tgz", + "integrity": "sha512-JaehZvf6m0yqYp34+RVnihBAChkqeH+tqqhS0GuX1qgPpwLvmTPheKEs6OeCK6hVJgXZHJ2vbjnC9j119auStQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.29.1", - "@typescript-eslint/types": "8.29.1", - "@typescript-eslint/typescript-estree": "8.29.1", - "@typescript-eslint/visitor-keys": "8.29.1", + "@typescript-eslint/scope-manager": "8.33.0", + "@typescript-eslint/types": "8.33.0", + "@typescript-eslint/typescript-estree": "8.33.0", + "@typescript-eslint/visitor-keys": "8.33.0", "debug": "^4.3.4" }, "engines": { @@ -724,31 +1212,71 @@ "typescript": ">=4.8.4 <5.9.0" } }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.33.0.tgz", + "integrity": "sha512-d1hz0u9l6N+u/gcrk6s6gYdl7/+pp8yHheRTqP6X5hVDKALEaTn8WfGiit7G511yueBEL3OpOEpD+3/MBdoN+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.33.0", + "@typescript-eslint/types": "^8.33.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.29.1", + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.33.0.tgz", + "integrity": "sha512-LMi/oqrzpqxyO72ltP+dBSP6V0xiUb4saY7WLtxSfiNEBI8m321LLVFU9/QDJxjDQG9/tjSqKz/E3380TEqSTw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.29.1", - "@typescript-eslint/visitor-keys": "8.29.1" + "@typescript-eslint/types": "8.33.0", + "@typescript-eslint/visitor-keys": "8.33.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.0.tgz", + "integrity": "sha512-sTkETlbqhEoiFmGr1gsdq5HyVbSOF0145SYDJ/EQmXHtKViCaGvnyLqWFFHtEXoS0J1yU8Wyou2UGmgW88fEug==", + "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.29.1", + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.33.0.tgz", + "integrity": "sha512-lScnHNCBqL1QayuSrWeqAL5GmqNdVUQAAMTaCwdYEdWfIrSrOGzyLGRCHXcCixa5NK6i5l0AfSO2oBSjCjf4XQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.29.1", - "@typescript-eslint/utils": "8.29.1", + "@typescript-eslint/typescript-estree": "8.33.0", + "@typescript-eslint/utils": "8.33.0", "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -763,7 +1291,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.29.1", + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.33.0.tgz", + "integrity": "sha512-DKuXOKpM5IDT1FA2g9x9x1Ug81YuKrzf4mYX8FAVSNu5Wo/LELHWQyM1pQaDkI42bX15PWl0vNPt1uGiIFUOpg==", "dev": true, "license": "MIT", "engines": { @@ -775,18 +1305,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.29.1", + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.0.tgz", + "integrity": "sha512-vegY4FQoB6jL97Tu/lWRsAiUUp8qJTqzAmENH2k59SJhw0Th1oszb9Idq/FyyONLuNqT1OADJPXfyUNOR8SzAQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.29.1", - "@typescript-eslint/visitor-keys": "8.29.1", + "@typescript-eslint/project-service": "8.33.0", + "@typescript-eslint/tsconfig-utils": "8.33.0", + "@typescript-eslint/types": "8.33.0", + "@typescript-eslint/visitor-keys": "8.33.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -801,6 +1335,8 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { @@ -809,6 +1345,8 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -822,14 +1360,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.29.1", + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.33.0.tgz", + "integrity": "sha512-lPFuQaLA9aSNa7D5u2EpRiqdAUhzShwGg/nhpBlc4GR6kcTABttCuyjFs8BcEZ8VWrjCBof/bePhP3Q3fS+Yrw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.29.1", - "@typescript-eslint/types": "8.29.1", - "@typescript-eslint/typescript-estree": "8.29.1" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.33.0", + "@typescript-eslint/types": "8.33.0", + "@typescript-eslint/typescript-estree": "8.33.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -844,11 +1384,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.29.1", + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.0.tgz", + "integrity": "sha512-7RW7CMYoskiz5OOGAWjJFxgb7c5UNjTG292gYhWeOAcFmYCtVCSqjqSBj5zMhxbXo2JOW95YYrUWJfU0zrpaGQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/types": "8.33.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -860,14 +1402,14 @@ } }, "node_modules/@vitest/expect": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/@vitest/expect/-/expect-3.1.1.tgz", - "integrity": "sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.4.tgz", + "integrity": "sha512-xkD/ljeliyaClDYqHPNCiJ0plY5YIcM0OlRiZizLhlPmpXWpxnGMyTZXOHFhFeG7w9P5PBeL4IdtJ/HeQwTbQA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.1.1", - "@vitest/utils": "3.1.1", + "@vitest/spy": "3.1.4", + "@vitest/utils": "3.1.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, @@ -876,13 +1418,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/@vitest/mocker/-/mocker-3.1.1.tgz", - "integrity": "sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.4.tgz", + "integrity": "sha512-8IJ3CvwtSw/EFXqWFL8aCMu+YyYXG2WUSrQbViOZkWTKTVicVwZ/YiEZDSqD00kX+v/+W+OnxhNWoeVKorHygA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.1.1", + "@vitest/spy": "3.1.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, @@ -903,9 +1445,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/@vitest/pretty-format/-/pretty-format-3.1.1.tgz", - "integrity": "sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.4.tgz", + "integrity": "sha512-cqv9H9GvAEoTaoq+cYqUTCGscUjKqlJZC7PRwY5FMySVj5J+xOm1KQcCiYHJOEzOKRUhLH4R2pTwvFlWCEScsg==", "dev": true, "license": "MIT", "dependencies": { @@ -916,13 +1458,13 @@ } }, "node_modules/@vitest/runner": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/@vitest/runner/-/runner-3.1.1.tgz", - "integrity": "sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.4.tgz", + "integrity": "sha512-djTeF1/vt985I/wpKVFBMWUlk/I7mb5hmD5oP8K9ACRmVXgKTae3TUOtXAEBfslNKPzUQvnKhNd34nnRSYgLNQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.1.1", + "@vitest/utils": "3.1.4", "pathe": "^2.0.3" }, "funding": { @@ -930,13 +1472,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/@vitest/snapshot/-/snapshot-3.1.1.tgz", - "integrity": "sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.4.tgz", + "integrity": "sha512-JPHf68DvuO7vilmvwdPr9TS0SuuIzHvxeaCkxYcCD4jTk67XwL45ZhEHFKIuCm8CYstgI6LZ4XbwD6ANrwMpFg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.1.1", + "@vitest/pretty-format": "3.1.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" }, @@ -945,9 +1487,9 @@ } }, "node_modules/@vitest/spy": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/@vitest/spy/-/spy-3.1.1.tgz", - "integrity": "sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.4.tgz", + "integrity": "sha512-Xg1bXhu+vtPXIodYN369M86K8shGLouNjoVI78g8iAq2rFoHFdajNvJJ5A/9bPMFcfQqdaCpOgWKEoMQg/s0Yg==", "dev": true, "license": "MIT", "dependencies": { @@ -958,13 +1500,13 @@ } }, "node_modules/@vitest/utils": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/@vitest/utils/-/utils-3.1.1.tgz", - "integrity": "sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.4.tgz", + "integrity": "sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.1.1", + "@vitest/pretty-format": "3.1.4", "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" }, @@ -974,6 +1516,8 @@ }, "node_modules/accepts": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { "mime-types": "^3.0.0", @@ -985,6 +1529,8 @@ }, "node_modules/acorn": { "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -995,6 +1541,8 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -1003,6 +1551,8 @@ }, "node_modules/acorn-walk": { "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "license": "MIT", "dependencies": { "acorn": "^8.11.0" @@ -1013,7 +1563,8 @@ }, "node_modules/ajv": { "version": "6.12.6", - "dev": true, + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -1028,6 +1579,8 @@ }, "node_modules/ansi-escapes": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, "license": "MIT", "dependencies": { @@ -1042,6 +1595,8 @@ }, "node_modules/ansi-regex": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { @@ -1051,18 +1606,38 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/arg": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/assertion-error": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/assertion-error/-/assertion-error-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", @@ -1072,7 +1647,7 @@ }, "node_modules/atomic-sleep": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", "license": "MIT", "engines": { @@ -1081,11 +1656,15 @@ }, "node_modules/balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/body-parser": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", @@ -1104,6 +1683,8 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { @@ -1113,6 +1694,8 @@ }, "node_modules/braces": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { @@ -1124,6 +1707,8 @@ }, "node_modules/bytes": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -1131,7 +1716,7 @@ }, "node_modules/cac": { "version": "6.7.14", - "resolved": "https://registry.npmmirror.com/cac/-/cac-6.7.14.tgz", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "license": "MIT", @@ -1141,6 +1726,8 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -1152,6 +1739,8 @@ }, "node_modules/call-bound": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -1166,6 +1755,8 @@ }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { @@ -1174,7 +1765,7 @@ }, "node_modules/chai": { "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/chai/-/chai-5.2.0.tgz", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", "dev": true, "license": "MIT", @@ -1191,6 +1782,8 @@ }, "node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -1204,23 +1797,9 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/check-error": { "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/check-error/-/check-error-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, "license": "MIT", @@ -1230,6 +1809,8 @@ }, "node_modules/cli-cursor": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", "dependencies": { @@ -1244,6 +1825,8 @@ }, "node_modules/cli-truncate": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, "license": "MIT", "dependencies": { @@ -1259,6 +1842,8 @@ }, "node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1270,16 +1855,22 @@ }, "node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, "license": "MIT" }, "node_modules/commander": { "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", "dev": true, "license": "MIT", "engines": { @@ -1288,11 +1879,15 @@ }, "node_modules/concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, "node_modules/content-disposition": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -1303,6 +1898,8 @@ }, "node_modules/content-type": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -1310,6 +1907,8 @@ }, "node_modules/cookie": { "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -1317,6 +1916,8 @@ }, "node_modules/cookie-signature": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", "engines": { "node": ">=6.6.0" @@ -1324,6 +1925,8 @@ }, "node_modules/cors": { "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "license": "MIT", "dependencies": { "object-assign": "^4", @@ -1335,10 +1938,14 @@ }, "node_modules/create-require": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "license": "MIT" }, "node_modules/cross-fetch": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", + "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", "license": "MIT", "dependencies": { "node-fetch": "^2.7.0" @@ -1346,6 +1953,8 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -1358,7 +1967,7 @@ }, "node_modules/dateformat": { "version": "4.6.3", - "resolved": "https://registry.npmmirror.com/dateformat/-/dateformat-4.6.3.tgz", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", "dev": true, "license": "MIT", @@ -1367,7 +1976,9 @@ } }, "node_modules/debug": { - "version": "4.4.0", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -1383,7 +1994,7 @@ }, "node_modules/deep-eql": { "version": "5.0.2", - "resolved": "https://registry.npmmirror.com/deep-eql/-/deep-eql-5.0.2.tgz", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, "license": "MIT", @@ -1393,11 +2004,15 @@ }, "node_modules/deep-is": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "node_modules/depd": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -1405,6 +2020,8 @@ }, "node_modules/diff": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -1412,6 +2029,8 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -1424,20 +2043,28 @@ }, "node_modules/duplexer": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true, "license": "MIT" }, "node_modules/ee-first": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, "node_modules/emoji-regex": { "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true, "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -1445,7 +2072,7 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", - "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "license": "MIT", @@ -1455,6 +2082,8 @@ }, "node_modules/environment": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, "license": "MIT", "engines": { @@ -1466,6 +2095,8 @@ }, "node_modules/es-define-property": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -1473,20 +2104,24 @@ }, "node_modules/es-errors": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -1496,9 +2131,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.2", - "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.2.tgz", - "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1509,39 +2144,43 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.2", - "@esbuild/android-arm": "0.25.2", - "@esbuild/android-arm64": "0.25.2", - "@esbuild/android-x64": "0.25.2", - "@esbuild/darwin-arm64": "0.25.2", - "@esbuild/darwin-x64": "0.25.2", - "@esbuild/freebsd-arm64": "0.25.2", - "@esbuild/freebsd-x64": "0.25.2", - "@esbuild/linux-arm": "0.25.2", - "@esbuild/linux-arm64": "0.25.2", - "@esbuild/linux-ia32": "0.25.2", - "@esbuild/linux-loong64": "0.25.2", - "@esbuild/linux-mips64el": "0.25.2", - "@esbuild/linux-ppc64": "0.25.2", - "@esbuild/linux-riscv64": "0.25.2", - "@esbuild/linux-s390x": "0.25.2", - "@esbuild/linux-x64": "0.25.2", - "@esbuild/netbsd-arm64": "0.25.2", - "@esbuild/netbsd-x64": "0.25.2", - "@esbuild/openbsd-arm64": "0.25.2", - "@esbuild/openbsd-x64": "0.25.2", - "@esbuild/sunos-x64": "0.25.2", - "@esbuild/win32-arm64": "0.25.2", - "@esbuild/win32-ia32": "0.25.2", - "@esbuild/win32-x64": "0.25.2" + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" } }, "node_modules/escape-html": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -1552,18 +2191,20 @@ } }, "node_modules/eslint": { - "version": "9.24.0", + "version": "9.27.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.27.0.tgz", + "integrity": "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", - "@eslint/config-helpers": "^0.2.0", - "@eslint/core": "^0.12.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.24.0", - "@eslint/plugin-kit": "^0.2.7", + "@eslint/js": "9.27.0", + "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -1611,18 +2252,25 @@ } }, "node_modules/eslint-config-prettier": { - "version": "10.1.2", + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz", + "integrity": "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==", "dev": true, "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, "peerDependencies": { "eslint": ">=7.0.0" } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.6", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.0.tgz", + "integrity": "sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==", "dev": true, "license": "MIT", "dependencies": { @@ -1652,6 +2300,8 @@ }, "node_modules/eslint-scope": { "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1667,6 +2317,8 @@ }, "node_modules/eslint-visitor-keys": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1678,6 +2330,8 @@ }, "node_modules/espree": { "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1694,6 +2348,8 @@ }, "node_modules/esquery": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -1705,6 +2361,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1716,6 +2374,8 @@ }, "node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -1724,7 +2384,7 @@ }, "node_modules/estree-walker": { "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", @@ -1734,6 +2394,8 @@ }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -1742,6 +2404,8 @@ }, "node_modules/etag": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -1749,6 +2413,8 @@ }, "node_modules/event-stream": { "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", "dev": true, "license": "MIT", "dependencies": { @@ -1763,10 +2429,14 @@ }, "node_modules/eventemitter3": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "license": "MIT" }, "node_modules/eventsource": { - "version": "3.0.6", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", "license": "MIT", "dependencies": { "eventsource-parser": "^3.0.1" @@ -1776,7 +2446,9 @@ } }, "node_modules/eventsource-parser": { - "version": "3.0.1", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.2.tgz", + "integrity": "sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -1784,6 +2456,8 @@ }, "node_modules/execa": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "license": "MIT", "dependencies": { @@ -1806,7 +2480,7 @@ }, "node_modules/expect-type": { "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/expect-type/-/expect-type-1.2.1.tgz", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", "dev": true, "license": "Apache-2.0", @@ -1816,6 +2490,8 @@ }, "node_modules/express": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", "dependencies": { "accepts": "^2.0.0", @@ -1856,6 +2532,8 @@ }, "node_modules/express-rate-limit": { "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", "license": "MIT", "engines": { "node": ">= 16" @@ -1869,23 +2547,28 @@ }, "node_modules/fast-copy": { "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/fast-copy/-/fast-copy-3.0.2.tgz", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==", "dev": true, "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "dev": true, + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-diff": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true, "license": "Apache-2.0" }, "node_modules/fast-glob": { "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -1901,6 +2584,8 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -1912,17 +2597,20 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "dev": true, + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "node_modules/fast-redact": { "version": "3.5.0", - "resolved": "https://registry.npmmirror.com/fast-redact/-/fast-redact-3.5.0.tgz", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", "license": "MIT", "engines": { @@ -1931,13 +2619,15 @@ }, "node_modules/fast-safe-stringify": { "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true, "license": "MIT" }, "node_modules/fastq": { "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, "license": "ISC", "dependencies": { @@ -1946,6 +2636,8 @@ }, "node_modules/file-entry-cache": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1957,6 +2649,8 @@ }, "node_modules/fill-range": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -1968,6 +2662,8 @@ }, "node_modules/finalhandler": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -1983,6 +2679,8 @@ }, "node_modules/find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { @@ -1998,6 +2696,8 @@ }, "node_modules/flat-cache": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { @@ -2010,11 +2710,15 @@ }, "node_modules/flatted": { "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, "node_modules/forwarded": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -2022,6 +2726,8 @@ }, "node_modules/fresh": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -2029,12 +2735,17 @@ }, "node_modules/from": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", "dev": true, "license": "MIT" }, "node_modules/fsevents": { "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -2046,6 +2757,8 @@ }, "node_modules/function-bind": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2053,6 +2766,8 @@ }, "node_modules/get-east-asian-width": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", "dev": true, "license": "MIT", "engines": { @@ -2064,6 +2779,8 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -2086,6 +2803,8 @@ }, "node_modules/get-proto": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -2097,6 +2816,8 @@ }, "node_modules/get-stream": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "license": "MIT", "engines": { @@ -2108,6 +2829,8 @@ }, "node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -2118,7 +2841,9 @@ } }, "node_modules/globals": { - "version": "16.0.0", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", + "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", "dev": true, "license": "MIT", "engines": { @@ -2130,6 +2855,8 @@ }, "node_modules/gopd": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -2140,11 +2867,15 @@ }, "node_modules/graphemer": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, "node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -2153,6 +2884,8 @@ }, "node_modules/has-symbols": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -2163,6 +2896,8 @@ }, "node_modules/hasown": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -2173,13 +2908,15 @@ }, "node_modules/help-me": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/help-me/-/help-me-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", "dev": true, "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "license": "MIT", "dependencies": { "depd": "2.0.0", @@ -2194,6 +2931,8 @@ }, "node_modules/human-signals": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2202,6 +2941,8 @@ }, "node_modules/husky": { "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, "license": "MIT", "bin": { @@ -2216,6 +2957,8 @@ }, "node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -2226,6 +2969,8 @@ }, "node_modules/ignore": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -2234,6 +2979,8 @@ }, "node_modules/import-fresh": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2249,6 +2996,8 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -2257,10 +3006,14 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/ipaddr.js": { "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -2268,6 +3021,8 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -2276,6 +3031,8 @@ }, "node_modules/is-fullwidth-code-point": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, "license": "MIT", "engines": { @@ -2287,6 +3044,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -2298,6 +3057,8 @@ }, "node_modules/is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", "engines": { @@ -2306,10 +3067,14 @@ }, "node_modules/is-promise": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, "node_modules/is-stream": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "license": "MIT", "engines": { @@ -2321,11 +3086,13 @@ }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/joycon": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/joycon/-/joycon-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", "dev": true, "license": "MIT", @@ -2335,6 +3102,8 @@ }, "node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", "dependencies": { @@ -2346,21 +3115,28 @@ }, "node_modules/json-buffer": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { @@ -2369,6 +3145,8 @@ }, "node_modules/leetcode-query": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/leetcode-query/-/leetcode-query-2.0.0.tgz", + "integrity": "sha512-kIX2YZq/XTRx53VObr4D39u9nSEnBUl3aCoYQEzTusuo97Oo3EfjryvyN6esqwqtfYa2AeSy/glsKVVxyTAcXw==", "license": "MIT", "dependencies": { "@fetch-impl/cross-fetch": "^1.0.0", @@ -2379,6 +3157,8 @@ }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2391,6 +3171,8 @@ }, "node_modules/lilconfig": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, "license": "MIT", "engines": { @@ -2401,7 +3183,9 @@ } }, "node_modules/lint-staged": { - "version": "15.5.1", + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.2.tgz", + "integrity": "sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==", "dev": true, "license": "MIT", "dependencies": { @@ -2428,6 +3212,8 @@ }, "node_modules/lint-staged/node_modules/chalk": { "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "dev": true, "license": "MIT", "engines": { @@ -2438,7 +3224,9 @@ } }, "node_modules/listr2": { - "version": "8.3.2", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", + "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2455,6 +3243,8 @@ }, "node_modules/locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -2469,11 +3259,15 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/log-update": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "license": "MIT", "dependencies": { @@ -2492,6 +3286,8 @@ }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", "engines": { @@ -2503,6 +3299,8 @@ }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", "dev": true, "license": "MIT", "dependencies": { @@ -2517,6 +3315,8 @@ }, "node_modules/log-update/node_modules/slice-ansi": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", "dev": true, "license": "MIT", "dependencies": { @@ -2532,14 +3332,14 @@ }, "node_modules/loupe": { "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/loupe/-/loupe-3.1.3.tgz", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", "dev": true, "license": "MIT" }, "node_modules/magic-string": { "version": "0.30.17", - "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "license": "MIT", @@ -2549,14 +3349,20 @@ }, "node_modules/make-error": { "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "license": "ISC" }, "node_modules/map-stream": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", "dev": true }, "node_modules/math-intrinsics": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -2564,6 +3370,8 @@ }, "node_modules/media-typer": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -2571,6 +3379,8 @@ }, "node_modules/merge-descriptors": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", "engines": { "node": ">=18" @@ -2581,11 +3391,15 @@ }, "node_modules/merge-stream": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", "engines": { @@ -2594,6 +3408,8 @@ }, "node_modules/micromatch": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -2606,6 +3422,8 @@ }, "node_modules/mime-db": { "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -2613,6 +3431,8 @@ }, "node_modules/mime-types": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -2623,6 +3443,8 @@ }, "node_modules/mimic-fn": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "license": "MIT", "engines": { @@ -2634,6 +3456,8 @@ }, "node_modules/mimic-function": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "license": "MIT", "engines": { @@ -2645,6 +3469,8 @@ }, "node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -2656,6 +3482,8 @@ }, "node_modules/minimist": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2663,10 +3491,14 @@ }, "node_modules/ms": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -2684,11 +3516,15 @@ }, "node_modules/natural-compare": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, "node_modules/negotiator": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -2696,11 +3532,15 @@ }, "node_modules/node-cleanup": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", + "integrity": "sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==", "dev": true, "license": "MIT" }, "node_modules/node-fetch": { "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -2719,6 +3559,8 @@ }, "node_modules/npm-run-path": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2733,6 +3575,8 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", "engines": { @@ -2744,6 +3588,8 @@ }, "node_modules/object-assign": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -2751,6 +3597,8 @@ }, "node_modules/object-inspect": { "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -2761,7 +3609,7 @@ }, "node_modules/on-exit-leak-free": { "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", "license": "MIT", "engines": { @@ -2770,6 +3618,8 @@ }, "node_modules/on-finished": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -2780,6 +3630,8 @@ }, "node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -2787,6 +3639,8 @@ }, "node_modules/onetime": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2801,6 +3655,8 @@ }, "node_modules/optionator": { "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { @@ -2815,22 +3671,10 @@ "node": ">= 0.8.0" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate/node_modules/p-limit": { + "node_modules/p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2843,10 +3687,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate/node_modules/yocto-queue": { - "version": "0.1.0", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { "node": ">=10" }, @@ -2856,6 +3705,8 @@ }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { @@ -2867,6 +3718,8 @@ }, "node_modules/parseurl": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -2874,6 +3727,8 @@ }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -2882,6 +3737,8 @@ }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { "node": ">=8" @@ -2889,6 +3746,8 @@ }, "node_modules/path-to-regexp": { "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", "license": "MIT", "engines": { "node": ">=16" @@ -2896,14 +3755,14 @@ }, "node_modules/pathe": { "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, "node_modules/pathval": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/pathval/-/pathval-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, "license": "MIT", @@ -2913,6 +3772,8 @@ }, "node_modules/pause-stream": { "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", "dev": true, "license": [ "MIT", @@ -2924,11 +3785,15 @@ }, "node_modules/picocolors": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -2940,6 +3805,8 @@ }, "node_modules/pidtree": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, "license": "MIT", "bin": { @@ -2950,9 +3817,9 @@ } }, "node_modules/pino": { - "version": "9.6.0", - "resolved": "https://registry.npmmirror.com/pino/-/pino-9.6.0.tgz", - "integrity": "sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==", + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.7.0.tgz", + "integrity": "sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==", "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0", @@ -2960,7 +3827,7 @@ "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", - "process-warning": "^4.0.0", + "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", @@ -2973,7 +3840,7 @@ }, "node_modules/pino-abstract-transport": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", "license": "MIT", "dependencies": { @@ -2982,7 +3849,7 @@ }, "node_modules/pino-pretty": { "version": "13.0.0", - "resolved": "https://registry.npmmirror.com/pino-pretty/-/pino-pretty-13.0.0.tgz", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.0.0.tgz", "integrity": "sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==", "dev": true, "license": "MIT", @@ -3007,12 +3874,14 @@ }, "node_modules/pino-std-serializers": { "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", "license": "MIT" }, "node_modules/pkce-challenge": { - "version": "4.1.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", "license": "MIT", "engines": { "node": ">=16.20.0" @@ -3020,6 +3889,8 @@ }, "node_modules/postcss": { "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, "funding": [ { @@ -3047,6 +3918,8 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -3055,6 +3928,8 @@ }, "node_modules/prettier": { "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", "dev": true, "license": "MIT", "bin": { @@ -3069,6 +3944,8 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, "license": "MIT", "dependencies": { @@ -3080,6 +3957,8 @@ }, "node_modules/prettier-plugin-organize-imports": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.1.0.tgz", + "integrity": "sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3094,9 +3973,9 @@ } }, "node_modules/process-warning": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/process-warning/-/process-warning-4.0.1.tgz", - "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", "funding": [ { "type": "github", @@ -3111,6 +3990,8 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -3122,6 +4003,8 @@ }, "node_modules/ps-tree": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", + "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", "dev": true, "license": "MIT", "dependencies": { @@ -3136,7 +4019,7 @@ }, "node_modules/pump": { "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.2.tgz", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dev": true, "license": "MIT", @@ -3147,7 +4030,8 @@ }, "node_modules/punycode": { "version": "2.3.1", - "dev": true, + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", "engines": { "node": ">=6" @@ -3155,6 +4039,8 @@ }, "node_modules/qs": { "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -3168,6 +4054,8 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -3187,12 +4075,14 @@ }, "node_modules/quick-format-unescaped": { "version": "4.0.4", - "resolved": "https://registry.npmmirror.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", "license": "MIT" }, "node_modules/range-parser": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -3200,6 +4090,8 @@ }, "node_modules/raw-body": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -3213,7 +4105,7 @@ }, "node_modules/real-require": { "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/real-require/-/real-require-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", "license": "MIT", "engines": { @@ -3222,6 +4114,8 @@ }, "node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { @@ -3230,6 +4124,8 @@ }, "node_modules/restore-cursor": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", "dependencies": { @@ -3245,6 +4141,8 @@ }, "node_modules/restore-cursor/node_modules/onetime": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3259,6 +4157,8 @@ }, "node_modules/reusify": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { @@ -3268,11 +4168,15 @@ }, "node_modules/rfdc": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true, "license": "MIT" }, "node_modules/rollup": { - "version": "4.39.0", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz", + "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==", "dev": true, "license": "MIT", "dependencies": { @@ -3286,45 +4190,33 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.39.0", - "@rollup/rollup-android-arm64": "4.39.0", - "@rollup/rollup-darwin-arm64": "4.39.0", - "@rollup/rollup-darwin-x64": "4.39.0", - "@rollup/rollup-freebsd-arm64": "4.39.0", - "@rollup/rollup-freebsd-x64": "4.39.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.39.0", - "@rollup/rollup-linux-arm-musleabihf": "4.39.0", - "@rollup/rollup-linux-arm64-gnu": "4.39.0", - "@rollup/rollup-linux-arm64-musl": "4.39.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.39.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0", - "@rollup/rollup-linux-riscv64-gnu": "4.39.0", - "@rollup/rollup-linux-riscv64-musl": "4.39.0", - "@rollup/rollup-linux-s390x-gnu": "4.39.0", - "@rollup/rollup-linux-x64-gnu": "4.39.0", - "@rollup/rollup-linux-x64-musl": "4.39.0", - "@rollup/rollup-win32-arm64-msvc": "4.39.0", - "@rollup/rollup-win32-ia32-msvc": "4.39.0", - "@rollup/rollup-win32-x64-msvc": "4.39.0", + "@rollup/rollup-android-arm-eabi": "4.41.1", + "@rollup/rollup-android-arm64": "4.41.1", + "@rollup/rollup-darwin-arm64": "4.41.1", + "@rollup/rollup-darwin-x64": "4.41.1", + "@rollup/rollup-freebsd-arm64": "4.41.1", + "@rollup/rollup-freebsd-x64": "4.41.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", + "@rollup/rollup-linux-arm-musleabihf": "4.41.1", + "@rollup/rollup-linux-arm64-gnu": "4.41.1", + "@rollup/rollup-linux-arm64-musl": "4.41.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-musl": "4.41.1", + "@rollup/rollup-linux-s390x-gnu": "4.41.1", + "@rollup/rollup-linux-x64-gnu": "4.41.1", + "@rollup/rollup-linux-x64-musl": "4.41.1", + "@rollup/rollup-win32-arm64-msvc": "4.41.1", + "@rollup/rollup-win32-ia32-msvc": "4.41.1", + "@rollup/rollup-win32-x64-msvc": "4.41.1", "fsevents": "~2.3.2" } }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", - "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/router": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -3339,6 +4231,8 @@ }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -3361,6 +4255,8 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -3379,7 +4275,7 @@ }, "node_modules/safe-stable-stringify": { "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", "engines": { @@ -3388,17 +4284,21 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/secure-json-parse": { "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/semver": { - "version": "7.7.1", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { @@ -3410,6 +4310,8 @@ }, "node_modules/send": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", "dependencies": { "debug": "^4.3.5", @@ -3430,6 +4332,8 @@ }, "node_modules/serve-static": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", @@ -3443,10 +4347,14 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -3457,6 +4365,8 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { "node": ">=8" @@ -3464,6 +4374,8 @@ }, "node_modules/side-channel": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3481,6 +4393,8 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3495,6 +4409,8 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -3511,6 +4427,8 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -3528,11 +4446,15 @@ }, "node_modules/siginfo": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, "node_modules/signal-exit": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -3544,6 +4466,8 @@ }, "node_modules/slice-ansi": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3559,6 +4483,8 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", "engines": { @@ -3570,7 +4496,7 @@ }, "node_modules/sonic-boom": { "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/sonic-boom/-/sonic-boom-4.2.0.tgz", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", "license": "MIT", "dependencies": { @@ -3579,6 +4505,8 @@ }, "node_modules/source-map-js": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -3587,6 +4515,8 @@ }, "node_modules/split": { "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", "dev": true, "license": "MIT", "dependencies": { @@ -3598,7 +4528,7 @@ }, "node_modules/split2": { "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/split2/-/split2-4.2.0.tgz", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "license": "ISC", "engines": { @@ -3607,11 +4537,15 @@ }, "node_modules/stackback": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, "node_modules/statuses": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -3619,11 +4553,15 @@ }, "node_modules/std-env": { "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", "dev": true, "license": "MIT" }, "node_modules/stream-combiner": { "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", "dev": true, "license": "MIT", "dependencies": { @@ -3632,6 +4570,8 @@ }, "node_modules/string-argv": { "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, "license": "MIT", "engines": { @@ -3640,6 +4580,8 @@ }, "node_modules/string-width": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3656,6 +4598,8 @@ }, "node_modules/strip-ansi": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3670,6 +4614,8 @@ }, "node_modules/strip-final-newline": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "license": "MIT", "engines": { @@ -3681,6 +4627,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { @@ -3692,6 +4640,8 @@ }, "node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -3702,12 +4652,13 @@ } }, "node_modules/synckit": { - "version": "0.11.3", + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.6.tgz", + "integrity": "sha512-2pR2ubZSV64f/vqm9eLPz/KOvR9Dm+Co/5ChLgeHl0yEDRc6h5hXHoxEQH8Y5Ljycozd3p1k5TTSVdzYGkPvLw==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.2.1", - "tslib": "^2.8.1" + "@pkgr/core": "^0.2.4" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -3718,7 +4669,7 @@ }, "node_modules/thread-stream": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/thread-stream/-/thread-stream-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", "license": "MIT", "dependencies": { @@ -3727,24 +4678,73 @@ }, "node_modules/through": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true, "license": "MIT" }, "node_modules/tinybench": { "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, "license": "MIT" }, "node_modules/tinyexec": { "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/tinyexec/-/tinyexec-0.3.2.tgz", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true, "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", + "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tinypool": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/tinypool/-/tinypool-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", "dev": true, "license": "MIT", @@ -3754,7 +4754,7 @@ }, "node_modules/tinyrainbow": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, "license": "MIT", @@ -3764,7 +4764,7 @@ }, "node_modules/tinyspy": { "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/tinyspy/-/tinyspy-3.0.2.tgz", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, "license": "MIT", @@ -3774,6 +4774,8 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3785,6 +4787,8 @@ }, "node_modules/toidentifier": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", "engines": { "node": ">=0.6" @@ -3792,10 +4796,14 @@ }, "node_modules/tr46": { "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, "node_modules/ts-api-utils": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, "license": "MIT", "engines": { @@ -3807,6 +4815,8 @@ }, "node_modules/ts-node": { "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -3848,6 +4858,8 @@ }, "node_modules/tsc-watch": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-6.2.1.tgz", + "integrity": "sha512-GLwdz5Dy9K3sVm3RzgkLcyDpl5cvU9HEcE1A3gf5rqEwlUe7gDLxNCgcuNEw3zoKOiegMo3LnbF1t6HLqxhrSA==", "dev": true, "license": "MIT", "dependencies": { @@ -3866,13 +4878,10 @@ "typescript": "*" } }, - "node_modules/tslib": { - "version": "2.8.1", - "dev": true, - "license": "0BSD" - }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -3884,6 +4893,8 @@ }, "node_modules/type-is": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { "content-type": "^1.0.5", @@ -3896,6 +4907,8 @@ }, "node_modules/typescript": { "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -3906,13 +4919,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.29.1", + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.33.0.tgz", + "integrity": "sha512-5YmNhF24ylCsvdNW2oJwMzTbaeO4bg90KeGtMjUw0AGtHksgEPLRTUil+coHwCfiu4QjVJFnjp94DmU6zV7DhQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.29.1", - "@typescript-eslint/parser": "8.29.1", - "@typescript-eslint/utils": "8.29.1" + "@typescript-eslint/eslint-plugin": "8.33.0", + "@typescript-eslint/parser": "8.33.0", + "@typescript-eslint/utils": "8.33.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3928,10 +4943,14 @@ }, "node_modules/undici-types": { "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/unpipe": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -3939,7 +4958,8 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "dev": true, + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -3947,25 +4967,32 @@ }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "license": "MIT" }, "node_modules/vary": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/vite": { - "version": "6.2.6", - "resolved": "https://registry.npmmirror.com/vite/-/vite-6.2.6.tgz", - "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", "postcss": "^8.5.3", - "rollup": "^4.30.1" + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" @@ -4029,15 +5056,15 @@ } }, "node_modules/vite-node": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/vite-node/-/vite-node-3.1.1.tgz", - "integrity": "sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.4.tgz", + "integrity": "sha512-6enNwYnpyDo4hEgytbmc6mYWHXDHYEn0D1/rw4Q+tnHUGtKTJsn8T1YkX6Q18wI5LCrS8CTYlBaiCqxOy2kvUA==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", "debug": "^4.4.0", - "es-module-lexer": "^1.6.0", + "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0" }, @@ -4051,32 +5078,61 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", + "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/vitest": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/vitest/-/vitest-3.1.1.tgz", - "integrity": "sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.4.tgz", + "integrity": "sha512-Ta56rT7uWxCSJXlBtKgIlApJnT6e6IGmTYxYcmxjJ4ujuZDI59GUQgVDObXXJujOmPDBYXHK1qmaGtneu6TNIQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "3.1.1", - "@vitest/mocker": "3.1.1", - "@vitest/pretty-format": "^3.1.1", - "@vitest/runner": "3.1.1", - "@vitest/snapshot": "3.1.1", - "@vitest/spy": "3.1.1", - "@vitest/utils": "3.1.1", + "@vitest/expect": "3.1.4", + "@vitest/mocker": "3.1.4", + "@vitest/pretty-format": "^3.1.4", + "@vitest/runner": "3.1.4", + "@vitest/snapshot": "3.1.4", + "@vitest/spy": "3.1.4", + "@vitest/utils": "3.1.4", "chai": "^5.2.0", "debug": "^4.4.0", - "expect-type": "^1.2.0", + "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", - "std-env": "^3.8.1", + "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.13", "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.1.1", + "vite-node": "3.1.4", "why-is-node-running": "^2.3.0" }, "bin": { @@ -4092,8 +5148,8 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.1.1", - "@vitest/ui": "3.1.1", + "@vitest/browser": "3.1.4", + "@vitest/ui": "3.1.4", "happy-dom": "*", "jsdom": "*" }, @@ -4123,10 +5179,14 @@ }, "node_modules/webidl-conversions": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "license": "BSD-2-Clause" }, "node_modules/whatwg-url": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "license": "MIT", "dependencies": { "tr46": "~0.0.3", @@ -4135,6 +5195,8 @@ }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -4148,6 +5210,8 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { @@ -4163,6 +5227,8 @@ }, "node_modules/word-wrap": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { @@ -4171,6 +5237,8 @@ }, "node_modules/wrap-ansi": { "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4187,6 +5255,8 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", "engines": { @@ -4198,28 +5268,49 @@ }, "node_modules/wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/yaml": { - "version": "2.7.1", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" } }, "node_modules/yn": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zod": { - "version": "3.24.2", + "version": "3.25.34", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.34.tgz", + "integrity": "sha512-lZHvSc2PpWdcfpHlyB33HA9nqP16GpC9IpiG4lYq9jZCJVLZNnWd6Y1cj79bcLSBKTkxepfpjckPv5Y5VOPlwA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -4227,6 +5318,8 @@ }, "node_modules/zod-to-json-schema": { "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", "license": "ISC", "peerDependencies": { "zod": "^3.24.1" diff --git a/package.json b/package.json index 5ea22fd..964faac 100644 --- a/package.json +++ b/package.json @@ -65,10 +65,11 @@ "tsc-watch": "6.2.1", "typescript": "^5.8.3", "typescript-eslint": "^8.29.1", - "vitest": "^3.1.1", + "vitest": "^3.1.3", + "vite": "^6.3.5", "pino-pretty": "^13.0.0" }, "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "^4.40.0" + "@rollup/rollup-linux-x64-gnu": "^4.40.1" } } From 513a666d09dce50f34f27383d0d857f752fc3bb8 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Sat, 31 May 2025 23:24:03 +0800 Subject: [PATCH 26/27] feat(note-tools): rename summary parameter to title for clarity --- src/mcp/tools/note-tools.ts | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/mcp/tools/note-tools.ts b/src/mcp/tools/note-tools.ts index 773958d..6ef5ba4 100644 --- a/src/mcp/tools/note-tools.ts +++ b/src/mcp/tools/note-tools.ts @@ -165,19 +165,19 @@ export class NoteToolRegistry extends ToolRegistry { .describe( "The content of the note (supports markdown format)" ), - summary: z + title: z .string() .optional() .default("") - .describe("An optional short summary or title for the note") + .describe("An short title or summary for the note") }, - async ({ questionId, content, summary = "" }) => { + async ({ questionId, content, title = "" }) => { try { const data = await this.leetcodeService.createUserNote( content, "COMMON_QUESTION", questionId, - summary + title ); return { @@ -210,28 +210,26 @@ export class NoteToolRegistry extends ToolRegistry { // Note update tool (CN-specific, requires authentication) this.server.tool( "update_note", - "Updates an existing note with new content or summary, allowing users to refine their saved observations (requires authentication, CN only)", + "Updates an existing note with new content or title, allowing users to refine their saved observations (requires authentication, CN only)", { noteId: z.string().describe("The ID of the note to update"), content: z .string() + .default("") .describe( "The new content for the note (supports markdown format)" ), - summary: z + title: z .string() - .optional() .default("") - .describe( - "An optional new short summary or title for the note" - ) + .describe("An new short title or summary for the note") }, - async ({ noteId, content, summary = "" }) => { + async ({ noteId, content, title = "" }) => { try { const data = await this.leetcodeService.updateUserNote( noteId, content, - summary + title ); return { From e5f27259542f95bc26abd5c881234aeeae4853d6 Mon Sep 17 00:00:00 2001 From: jinzcdev Date: Sat, 31 May 2025 23:26:49 +0800 Subject: [PATCH 27/27] 1.2.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 57b6c9e..34f05a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@jinzcdev/leetcode-mcp-server", - "version": "1.1.0", + "version": "1.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@jinzcdev/leetcode-mcp-server", - "version": "1.1.0", + "version": "1.2.0", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.8.0", diff --git a/package.json b/package.json index 964faac..360d2e3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@jinzcdev/leetcode-mcp-server", "description": "MCP Server for LeetCode API (supports leetcode.com and leetcode.cn)", - "version": "1.1.0", + "version": "1.2.0", "author": "jinzcdev", "main": "./build/index.js", "keywords": [