diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 13c943fd55..922b7431c9 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,8 +1,16 @@ // For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: -// https://github.com/devcontainers/images/blob/v0.3.24/src/javascript-node/.devcontainer/devcontainer.json +// https://github.com/devcontainers/images/blob/v0.4.19/src/typescript-node/.devcontainer/devcontainer.json { - "name": "Node.js", - "image": "mcr.microsoft.com/devcontainers/javascript-node:22-bookworm", + "name": "Node.js & TypeScript", + "image": "mcr.microsoft.com/devcontainers/typescript-node:24-bookworm", + "features": { + "ghcr.io/devcontainers/features/docker-in-docker": { + "version": "latest" + }, + "ghcr.io/devcontainers/features/github-cli": { + "version": "latest" + } + }, // Configure tool-specific properties. "customizations": { @@ -23,16 +31,12 @@ }, // Use 'forwardPorts' to make a list of ports inside the container available locally. - "forwardPorts": [1200, 3000], + "forwardPorts": [1200], "portsAttributes": { "1200": { "label": "app port", "onAutoForward": "notify" - }, - "3000": { - "label": "docs port", - "onAutoForward": "notify" } }, @@ -46,17 +50,8 @@ // Disable auto start dev env since codespaces sometimes fails to attach to the terminal // "postAttachCommand": { // "app": "pnpm i", - // // "docs": "pnpm -C website start" // }, - // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. - "remoteUser": "node", - "features": { - "ghcr.io/devcontainers/features/docker-in-docker": { - "version": "latest" - }, - "ghcr.io/devcontainers/features/github-cli": { - "version": "latest" - } - } + // Set `remoteUser` to `root` to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. + "remoteUser": "node" } diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml index bcd4fa29e7..e84fe847d4 100644 --- a/.github/workflows/docker-release.yml +++ b/.github/workflows/docker-release.yml @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-latest needs: check-env if: needs.check-env.outputs.check-docker == 'true' - timeout-minutes: 60 + timeout-minutes: 120 permissions: packages: write id-token: write diff --git a/.github/workflows/ghcr-cleanup.yml b/.github/workflows/ghcr-cleanup.yml deleted file mode 100644 index 6966982866..0000000000 --- a/.github/workflows/ghcr-cleanup.yml +++ /dev/null @@ -1,273 +0,0 @@ -name: 'Clean up GHCR Packages' - -on: - # 每小时执行一次(快速清理模式) - schedule: - - cron: '0 * * * *' - # Docker 发布完成后自动触发 - workflow_run: - workflows: ['Docker Release'] - types: - - completed - # 支持手动触发 - workflow_dispatch: - inputs: - dry_run: - description: 'Dry run mode (preview only, no actual deletion)' - required: false - type: boolean - default: false - retention_days: - description: 'Number of days to keep package versions' - required: false - type: number - default: 30 - -jobs: - cleanup: - runs-on: ubuntu-latest - timeout-minutes: 120 - permissions: - packages: write - contents: read - steps: - - name: Checkout repository - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - - - name: Cleanup old GHCR package versions - env: - GITHUB_TOKEN: ${{ secrets.PAT }} - DRY_RUN: ${{ github.event.inputs.dry_run || 'false' }} - RETENTION_DAYS: ${{ github.event.inputs.retention_days || '30' }} - PACKAGE_NAME: rsshub - OWNER: ${{ github.repository_owner }} - run: | - set -e - - echo "==================================================" - echo "GHCR Package Cleanup (High-Performance Mode)" - echo "==================================================" - echo "Package: ghcr.io/${OWNER}/${PACKAGE_NAME}" - echo "Retention period: ${RETENTION_DAYS} days" - echo "Dry run mode: ${DRY_RUN}" - echo "Using PAT: Enhanced rate limits (5000 req/hour)" - echo "Parallel workers: 10" - echo "Target: ~4000 deletions per hour" - echo "==================================================" - echo "" - - # 计算截止日期(UTC时间) - CUTOFF_DATE=$(date -u -d "${RETENTION_DAYS} days ago" +%Y-%m-%dT%H:%M:%SZ) - CUTOFF_TIMESTAMP=$(date -d "${CUTOFF_DATE}" +%s) - - echo "Current time (UTC): $(date -u +%Y-%m-%dT%H:%M:%SZ)" - echo "Cutoff date (UTC): ${CUTOFF_DATE}" - echo "" - - # 创建临时目录 - TEMP_DIR=$(mktemp -d) - - echo "Fetching package versions (fast mode)..." - - # 快速获取前1000个版本(最多10页) - gh api --paginate \ - -H "Accept: application/vnd.github+json" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - "/orgs/${OWNER}/packages/container/${PACKAGE_NAME}/versions?per_page=100" \ - --jq '.[] | select((.created_at | strptime("%Y-%m-%dT%H:%M:%SZ") | mktime) < '"$CUTOFF_TIMESTAMP"') | .id' \ - 2>/dev/null > "${TEMP_DIR}/to_delete.txt" || \ - gh api --paginate \ - -H "Accept: application/vnd.github+json" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - "/users/${OWNER}/packages/container/${PACKAGE_NAME}/versions?per_page=100" \ - --jq '.[] | select((.created_at | strptime("%Y-%m-%dT%H:%M:%SZ") | mktime) < '"$CUTOFF_TIMESTAMP"') | .id' \ - > "${TEMP_DIR}/to_delete.txt" - - TOTAL_TO_DELETE=$(wc -l < "${TEMP_DIR}/to_delete.txt" 2>/dev/null | tr -d ' ' || echo "0") - - # 使用 PAT 后提高每次运行的删除上限 - # PAT rate limit: 5000 req/hour,使用并行处理可以更高效 - MAX_PER_RUN=4000 - - if [[ $TOTAL_TO_DELETE -gt $MAX_PER_RUN ]]; then - echo "Found ${TOTAL_TO_DELETE} versions to delete" - echo "Limiting to ${MAX_PER_RUN} this run (optimized for PAT rate limits)" - head -n $MAX_PER_RUN "${TEMP_DIR}/to_delete.txt" > "${TEMP_DIR}/to_delete_limited.txt" - mv "${TEMP_DIR}/to_delete_limited.txt" "${TEMP_DIR}/to_delete.txt" - DELETED_COUNT=$MAX_PER_RUN - REMAINING=$((TOTAL_TO_DELETE - MAX_PER_RUN)) - else - DELETED_COUNT=$TOTAL_TO_DELETE - REMAINING=0 - fi - - echo "==================================================" - echo "Analysis Complete" - echo "==================================================" - echo "Versions to delete this run: ${DELETED_COUNT}" - if [[ $REMAINING -gt 0 ]]; then - echo "Remaining for future runs: ${REMAINING}" - RUNS_NEEDED=$(( (REMAINING + MAX_PER_RUN - 1) / MAX_PER_RUN )) - echo "Estimated additional runs needed: ${RUNS_NEEDED}" - fi - echo "" - - if [[ $DELETED_COUNT -eq 0 ]]; then - echo "✅ No versions need to be deleted." - rm -rf "$TEMP_DIR" - exit 0 - fi - - # 显示一些样本 - echo "Sample of versions to delete:" - head -n 5 "${TEMP_DIR}/to_delete.txt" | while read -r version_id; do - echo " Version ID: ${version_id}" - done || true - - if [[ $DELETED_COUNT -gt 5 ]]; then - echo " ... and $((DELETED_COUNT - 5)) more versions" - fi - echo "" - - if [[ "$DRY_RUN" == "true" ]]; then - echo "⚠️ DRY RUN MODE - No versions were actually deleted" - echo " To perform actual deletion, set dry_run to false" - rm -rf "$TEMP_DIR" - exit 0 - fi - - echo "Starting deletion (high-performance parallel mode)..." - echo "⚠️ Using parallel processing with 10 workers" - echo "⚠️ Optimized for PAT rate limits (5000 req/hour)" - echo "" - - START_TIME=$(date +%s) - - # 创建结果目录(避免并发写入同一文件) - mkdir -p "${TEMP_DIR}/results" - - # 定义删除函数(用于并行执行) - delete_version() { - # 关闭 set -e,确保错误不会导致进程异常退出 - set +e - - local version_id=$1 - local OWNER=$2 - local PACKAGE_NAME=$3 - local TEMP_DIR=$4 - local MAX_RETRIES=3 - local RETRY_COUNT=0 - local SUCCESS=false - - while [[ $RETRY_COUNT -lt $MAX_RETRIES ]] && [[ "$SUCCESS" == "false" ]]; do - # 尝试组织 API - DELETE_RESULT=$(gh api \ - --method DELETE \ - -H "Accept: application/vnd.github+json" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - "/orgs/${OWNER}/packages/container/${PACKAGE_NAME}/versions/${version_id}" 2>&1 || echo "ORG_DELETE_FAILED") - - # 如果组织 API 失败,尝试用户 API(使用字符串匹配避免管道) - if [[ "$DELETE_RESULT" == "ORG_DELETE_FAILED" ]] || [[ "$DELETE_RESULT" == *"Not Found"* ]]; then - DELETE_RESULT=$(gh api \ - --method DELETE \ - -H "Accept: application/vnd.github+json" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - "/users/${OWNER}/packages/container/${PACKAGE_NAME}/versions/${version_id}" 2>&1 || echo "DELETE_FAILED") - fi - - # 检查是否成功 - if [[ "$DELETE_RESULT" == *"FAILED"* ]] || [[ -n "$DELETE_RESULT" ]]; then - # 检查是否是速率限制错误(使用字符串匹配避免管道) - if [[ "$DELETE_RESULT" == *"rate limit"* ]]; then - RETRY_COUNT=$((RETRY_COUNT + 1)) - if [[ $RETRY_COUNT -lt $MAX_RETRIES ]]; then - sleep 10 - else - # 每个进程写入独立文件,避免并发冲突 - touch "${TEMP_DIR}/results/error_${version_id}" 2>/dev/null - return 1 - fi - else - touch "${TEMP_DIR}/results/error_${version_id}" 2>/dev/null - return 1 - fi - else - SUCCESS=true - # 每个进程写入独立文件,避免并发冲突 - touch "${TEMP_DIR}/results/success_${version_id}" 2>/dev/null - return 0 - fi - done - - return 1 - } - - # 导出函数和变量供 xargs 使用 - export -f delete_version - export OWNER PACKAGE_NAME TEMP_DIR - - # 使用 xargs 并行删除(10个并行worker) - # 关闭 set -e 避免子进程因错误退出导致 broken pipe - cat "${TEMP_DIR}/to_delete.txt" | \ - xargs -P 10 -I {} bash -c 'set +e; delete_version "$@"' _ {} "$OWNER" "$PACKAGE_NAME" "$TEMP_DIR" - - # 统计结果(统计独立文件数量) - SUCCESS_COUNT=0 - ERROR_COUNT=0 - - if [[ -d "${TEMP_DIR}/results" ]]; then - SUCCESS_COUNT=$(find "${TEMP_DIR}/results" -name "success_*" 2>/dev/null | wc -l | tr -d ' ' || echo "0") - ERROR_COUNT=$(find "${TEMP_DIR}/results" -name "error_*" 2>/dev/null | wc -l | tr -d ' ' || echo "0") - fi - - PROCESSED=$((SUCCESS_COUNT + ERROR_COUNT)) - - END_TIME=$(date +%s) - TOTAL_TIME=$((END_TIME - START_TIME)) - - # 避免除以零 - if [[ $TOTAL_TIME -gt 0 ]]; then - ACTUAL_RATE=$((PROCESSED * 3600 / TOTAL_TIME)) - else - ACTUAL_RATE=0 - fi - - echo "" - echo "==================================================" - echo "Cleanup Complete (High-Performance Mode)" - echo "==================================================" - echo "Versions successfully deleted: ${SUCCESS_COUNT}" - echo "Versions failed to delete: ${ERROR_COUNT}" - echo "Total processed: ${PROCESSED}" - echo "Total time: ${TOTAL_TIME} seconds ($((TOTAL_TIME / 60)) minutes)" - echo "Actual rate: ${ACTUAL_RATE} deletions/hour" - echo "Performance improvement: ~4-5x faster than serial mode" - - if [[ $REMAINING -gt 0 ]]; then - echo "" - echo "ℹ️ Note: This was a partial cleanup run." - echo " Remaining versions will be deleted in the next scheduled run." - echo " Estimated runs needed: $(( (REMAINING + MAX_PER_RUN - 1) / MAX_PER_RUN ))" - fi - - if [[ $ERROR_COUNT -gt 0 ]]; then - echo "" - echo "Errors encountered: ${ERROR_COUNT} versions failed to delete" - echo "Sample of failed version IDs:" - find "${TEMP_DIR}/results" -name "error_*" 2>/dev/null | head -n 5 | while read -r error_file; do - version_id=$(basename "$error_file" | sed 's/^error_//') - echo " - Version ID: ${version_id}" - done || true - fi - - echo "==================================================" - - # 清理临时文件 - rm -rf "$TEMP_DIR" - - # 如果错误率超过50%,返回失败状态 - if [[ $ERROR_COUNT -gt $((SUCCESS_COUNT / 2)) ]]; then - echo "⚠️ High error rate detected" - exit 1 - fi diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 48e745c8e8..613cf2484d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -11,24 +11,6 @@ on: types: [opened, reopened, synchronize, edited] jobs: - # eslint: - # name: ESLint - # if: ${{ github.event_name == 'push' || github.event_name == 'pull_request' }} - # runs-on: ubuntu-latest - # timeout-minutes: 5 - # steps: - # - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - # - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 - # with: - # version: 9 - # - uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 - # with: - # node-version: lts/* - # cache: 'pnpm' - # - run: pnpm i - # - name: Lint - # run: pnpm run lint - # https://github.com/actions/starter-workflows/blob/main/code-scanning/eslint.yml eslint-warning: name: Lint diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index f4079c4186..0000000000 --- a/.gitpod.yml +++ /dev/null @@ -1,36 +0,0 @@ -image: gitpod/workspace-node-lts - -ports: - - port: 1200 - onOpen: notify - visibility: public - - port: 3000 - onOpen: notify - visibility: public - -tasks: - - name: deps - before: | - sudo apt update - sudo apt install -y ca-certificates fonts-liberation libasound2 libatk-bridge2.0-0 libatk1.0-0 libatspi2.0-0 libcairo2 libcups2 libdbus-1-3 libexpat1 libgbm1 libglib2.0-0 libnspr4 libnss3 libpango-1.0-0 libx11-6 libxcb1 libxcomposite1 libxdamage1 libxext6 libxfixes3 libxkbcommon0 libxrandr2 wget xdg-util - sudo apt install -y redis-server - init: pnpm i && pnpm rb && pnpx rebrowser-puppeteer browsers install chrome - - name: app - command: pnpm run dev - openMode: tab-after - # - name: docs - # command: | - # cd website - # pnpm run start - # openMode: tab-after - -vscode: - extensions: - - cweijan.vscode-database-client2 # you may need to rollback to v5.3.1 or below in **VS Code Desktop** - - dbaeumer.vscode-eslint - - eamodio.gitlens - - EditorConfig.EditorConfig - - esbenp.prettier-vscode - - sonarsource.sonarlint-vscode - # - VASubasRaj.flashpost and KeyRunner.keyrunner are not available on Open VSX, Thunder Client is paywalled in WSL/Codespaces/SSH > 2.30.0 - # - ZihanLi.at-helper not available on Open VSX diff --git a/Dockerfile b/Dockerfile index 4d7c07908d..e2c0c41fbe 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22-bookworm AS dep-builder +FROM node:24-bookworm AS dep-builder # Here we use the non-slim image to provide build-time deps (compilers and python), thus no need to install later. # This effectively speeds up qemu-based cross-build. @@ -33,7 +33,7 @@ FROM debian:bookworm-slim AS dep-version-parser # This stage is necessary to limit the cache miss scope. # With this stage, any modification to package.json won't break the build cache of the next two stages as long as the # version unchanged. -# node:22-bookworm-slim is based on debian:bookworm-slim so this stage would not cause any additional download. +# node:24-bookworm-slim is based on debian:bookworm-slim so this stage would not cause any additional download. WORKDIR /ver COPY ./package.json /app/ @@ -45,7 +45,7 @@ RUN \ # --------------------------------------------------------------------------------------------------------------------- -FROM node:22-bookworm-slim AS docker-minifier +FROM node:24-bookworm-slim AS docker-minifier # The stage is used to further reduce the image size by removing unused files. WORKDIR /minifier @@ -82,7 +82,7 @@ RUN \ # --------------------------------------------------------------------------------------------------------------------- -FROM node:22-bookworm-slim AS chromium-downloader +FROM node:24-bookworm-slim AS chromium-downloader # This stage is necessary to improve build concurrency and minimize the image size. # Yeah, downloading Chromium never needs those dependencies below. @@ -115,7 +115,7 @@ RUN \ # --------------------------------------------------------------------------------------------------------------------- -FROM node:22-bookworm-slim AS app +FROM node:24-bookworm-slim AS app LABEL org.opencontainers.image.authors="https://github.com/DIYgod/RSSHub" diff --git a/eslint.config.mjs b/eslint.config.mjs index 8dbefd2842..956f95781e 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -300,7 +300,7 @@ export default [ 'n/no-unsupported-features/node-builtins': [ 'error', { - version: '^22.16.0 || ^24.0.0', + version: '^24', allowExperimental: true, ignores: [], }, diff --git a/lib/routes/bilibili/wasm-exec.ts b/lib/routes/bilibili/wasm-exec.ts index 909eed76fc..47b4a7fd92 100644 --- a/lib/routes/bilibili/wasm-exec.ts +++ b/lib/routes/bilibili/wasm-exec.ts @@ -147,7 +147,6 @@ }; } - if (!globalThis.crypto) { throw new Error('globalThis.crypto is not available, polyfill required (crypto.getRandomValues only)'); } @@ -373,7 +372,6 @@ // func getRandomData(r []byte) 'runtime.getRandomData': (sp) => { sp >>>= 0; - crypto.getRandomValues(loadSlice(sp + 8)); }, diff --git a/package.json b/package.json index 2d0d87a312..f96c29ec71 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "header-generator": "2.1.77", "hono": "4.10.5", "html-to-text": "9.0.5", - "http-cookie-agent": "6.0.8", + "http-cookie-agent": "7.0.2", "https-proxy-agent": "7.0.6", "iconv-lite": "0.7.0", "imapflow": "1.1.1", @@ -131,7 +131,7 @@ "tsx": "4.20.6", "twitter-api-v2": "1.27.0", "ufo": "1.6.1", - "undici": "6.22.0", + "undici": "7.16.0", "uuid": "13.0.0", "winston": "3.18.3", "xxhash-wasm": "1.1.0", @@ -197,9 +197,9 @@ "vitest": "2.1.9", "yaml-eslint-parser": "1.3.0" }, - "packageManager": "pnpm@10.20.0+sha512.cf9998222162dd85864d0a8102e7892e7ba4ceadebbf5a31f9c2fce48dfce317a9c53b9f6464d1ef9042cba2e02ae02a9f7c143a2b438cd93c91840f0192b9dd", + "packageManager": "pnpm@10.22.0+sha512.bf049efe995b28f527fd2b41ae0474ce29186f7edcb3bf545087bd61fbbebb2bf75362d1307fda09c2d288e1e499787ac12d4fcb617a974718a6051f2eee741c", "engines": { - "node": ">=22" + "node": "^24" }, "pnpm": { "onlyBuiltDependencies": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2c0bea6164..34682b8e75 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -127,8 +127,8 @@ importers: specifier: 9.0.5 version: 9.0.5 http-cookie-agent: - specifier: 6.0.8 - version: 6.0.8(tough-cookie@5.1.2)(undici@6.22.0) + specifier: 7.0.2 + version: 7.0.2(tough-cookie@5.1.2)(undici@7.16.0) https-proxy-agent: specifier: 7.0.6 version: 7.0.6 @@ -259,8 +259,8 @@ importers: specifier: 1.6.1 version: 1.6.1 undici: - specifier: 6.22.0 - version: 6.22.0 + specifier: 7.16.0 + version: 7.16.0 uuid: specifier: 13.0.0 version: 13.0.0 @@ -420,7 +420,7 @@ importers: version: 2.4.3(typescript@5.9.3) node-network-devtools: specifier: 1.0.29 - version: 1.0.29(undici@6.22.0)(utf-8-validate@5.0.10) + version: 1.0.29(undici@7.16.0)(utf-8-validate@5.0.10) prettier: specifier: 3.6.2 version: 3.6.2 @@ -3936,12 +3936,12 @@ packages: http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - http-cookie-agent@6.0.8: - resolution: {integrity: sha512-qnYh3yLSr2jBsTYkw11elq+T361uKAJaZ2dR4cfYZChw1dt9uL5t3zSUwehoqqVb4oldk1BpkXKm2oat8zV+oA==} - engines: {node: '>=18.0.0'} + http-cookie-agent@7.0.2: + resolution: {integrity: sha512-aHaES6SOFtnSlmWu0yEaaQvu+QexUG2gscSAvMhJ7auzW8r/jYOgGrzuAm9G9nHbksuhz7Lw4zOwDHmfQaxZvw==} + engines: {node: '>=20.0.0'} peerDependencies: tough-cookie: ^4.0.0 || ^5.0.0 - undici: ^5.11.0 || ^6.0.0 + undici: ^7.0.0 peerDependenciesMeta: undici: optional: true @@ -5815,10 +5815,6 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - undici@6.22.0: - resolution: {integrity: sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==} - engines: {node: '>=18.17'} - undici@7.16.0: resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} engines: {node: '>=20.18.1'} @@ -10088,12 +10084,12 @@ snapshots: http-cache-semantics@4.2.0: {} - http-cookie-agent@6.0.8(tough-cookie@5.1.2)(undici@6.22.0): + http-cookie-agent@7.0.2(tough-cookie@5.1.2)(undici@7.16.0): dependencies: agent-base: 7.1.4 tough-cookie: 5.1.2 optionalDependencies: - undici: 6.22.0 + undici: 7.16.0 http-proxy-agent@7.0.2: dependencies: @@ -10929,13 +10925,13 @@ snapshots: dependencies: write-file-atomic: 1.3.4 - node-network-devtools@1.0.29(undici@6.22.0)(utf-8-validate@5.0.10): + node-network-devtools@1.0.29(undici@7.16.0)(utf-8-validate@5.0.10): dependencies: bufferutil: 4.0.9 iconv-lite: 0.6.3 inspector: 0.5.0 open: 8.4.2 - undici: 6.22.0 + undici: 7.16.0 ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - utf-8-validate @@ -12134,8 +12130,6 @@ snapshots: undici-types@7.16.0: {} - undici@6.22.0: {} - undici@7.16.0: {} unicode-canonical-property-names-ecmascript@2.0.1: {}