diff --git a/.github/ISSUE_TEMPLATE/1_BUG_REPORT.md b/.github/ISSUE_TEMPLATE/1_BUG_REPORT.md deleted file mode 100644 index 66ce1ee7d8..0000000000 --- a/.github/ISSUE_TEMPLATE/1_BUG_REPORT.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -name: 问题上报 -about: 如果你在使用过程中发现问题,请使用此模板。 -labels: Bug ---- - - - -- [ ] 你是否在现有 [Issue列表](/docmirror/dev-sidecar/issues) 中搜索过相同问题,但未找到? - -### Ⅰ. 请说明操作系统及DS的版本号: - -1. 操作系统:? -2. DS版本号:? - -### Ⅱ. 问题描述: - -### Ⅲ. 期望的结果: - -### Ⅳ. 如何复现问题? - -1. xxx -2. xxx -3. xxx - -### Ⅴ. 请提供相关的错误日志,尽可能的详细:(日志文件在 `${user.home}/.dev-sidecar/logs/` 目录下) - -
-点击查看日志 - -```log - -``` -
- -### Ⅵ. 有必要时,请提供 `${user.home}/.dev-sidecar/running.json` 文件内容: - - - -
-点击查看运行参数 - -```json - -``` -
diff --git a/.github/ISSUE_TEMPLATE/2_STYLE_ISSUE.md b/.github/ISSUE_TEMPLATE/2_STYLE_ISSUE.md deleted file mode 100644 index 76fc08abfe..0000000000 --- a/.github/ISSUE_TEMPLATE/2_STYLE_ISSUE.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -name: 样式问题 -about: 如果你发现了一些页面样式问题,请使用此模板。 -labels: Style Issue ---- - - - -- [ ] 你是否在现有 [Issue列表](/docmirror/dev-sidecar/issues) 中搜索过相同问题,但未找到? - -### Ⅰ. 请说明操作系统及DS的版本号: - -1. 操作系统:? -2. DS版本号:? - -### Ⅱ. 样式问题描述: - -### Ⅲ. 样式问题截图: diff --git a/.github/ISSUE_TEMPLATE/3_CONFIG_ISSUES.md b/.github/ISSUE_TEMPLATE/3_CONFIG_ISSUES.md deleted file mode 100644 index 4badff53a2..0000000000 --- a/.github/ISSUE_TEMPLATE/3_CONFIG_ISSUES.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -name: 配置问题 -about: 如果你不知道如何配置DS来访问某个网站,请使用这个模板。 -labels: Config Issue ---- - -### Ⅰ. 你对哪个功能的配置不了解? - - - -- [ ] 拦截设置: - - [ ] redirect - - [ ] proxy - - [ ] sni - - [ ] success - - [ ] abort - - [ ] cache - - [ ] options - - [ ] script - - [ ] requestReplace - - [ ] responseReplace -- [ ] DNS设置和IP测速 -- [ ] 系统代理 -- [ ] 远程配置 -- [ ] 应用: - - [ ] NPM加速 - - [ ] Git代理 - - [ ] PIP加速 - - [ ] 增强功能 - -### Ⅱ. 请详细描述你的问题: - -### Ⅲ. 有必要时,请提供 `${user.home}/.dev-sidecar/running.json` 文件内容: - - - -
-点击查看运行参数 - -```json - -``` -
diff --git a/.github/ISSUE_TEMPLATE/4_FEATURE_REQUEST.md b/.github/ISSUE_TEMPLATE/4_FEATURE_REQUEST.md deleted file mode 100644 index 31e9254258..0000000000 --- a/.github/ISSUE_TEMPLATE/4_FEATURE_REQUEST.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -name: 提新需求 -about: 如果你想提出一个新需求,请使用此模板。 -labels: Feature Request ---- - -### Ⅰ. 请描述你想要的新功能: - - - -### Ⅱ. 请描述你心目中新功能的样子: - - - -### Ⅲ. 你希望该新功能修复哪个issue? - - diff --git a/.github/ISSUE_TEMPLATE/5_OTHERS.md b/.github/ISSUE_TEMPLATE/5_OTHERS.md deleted file mode 100644 index 17c291f373..0000000000 --- a/.github/ISSUE_TEMPLATE/5_OTHERS.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -name: 其他问题 -about: 如果不是以上问题,请使用此模板。 ---- - -### 请详细描述你的问题、需求或建议: diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index c71ffbd56e..0000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,9 +0,0 @@ -### Ⅰ. 描述此PR的作用: - -### Ⅱ. 此PR修复了哪个issue吗? - - - -### Ⅲ. 界面变化截屏 - - diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md deleted file mode 100644 index f511e7afaf..0000000000 --- a/.github/copilot-instructions.md +++ /dev/null @@ -1,48 +0,0 @@ -# Copilot instructions for dev-sidecar - -## Commands - -- Dependency management: - - Install dependencies for the entire workspace from the repository root using `pnpm install`. Avoid using `npm install` for dependency installation in this project. - - If `pnpm install` reports dependency conflicts or version mismatches, update the relevant `package.json` entries to compatible versions (or adjust `peerDependencies`), then re-run `pnpm install`. - -- Linting: - - Lint the repository from the root with `pnpm lint`. - - Auto-fix lint issues from the root with `pnpm lint:fix`. - - If `pnpm lint` or `pnpm lint:fix` fails, review the reported errors and manually fix the files indicated by the linter, then re-run the command. - -- Testing: - - Run package tests where they live: - - `pnpm --filter @docmirror/dev-sidecar test` - - `pnpm --filter @docmirror/mitmproxy test` - - Run a single test file by passing it after `--`, for example: - - `pnpm --filter @docmirror/dev-sidecar test -- test/regex.test.js` - - `pnpm --filter @docmirror/mitmproxy test -- test/proxyTest.js` - -- GUI development and packaging (from `packages/gui`): - - `npm run electron` - - `npm run electron:build` - - `npm run serve` - - `npm run lint` - - For GUI debugging: run `npm run electron` and open the Electron developer tools (application menu View → Toggle Developer Tools or the platform shortcut) to inspect renderer pages, console logs, and IPC traffic. - -## High-level architecture - -- This is a pnpm workspace monorepo with four packages: - - `packages/core`: shared app logic, config, shell helpers, system proxy handling, and plugin/module code. - - `packages/mitmproxy`: the HTTP(S) proxy, DNS, interception, PAC, and response/request rewrite layer. - - `packages/gui`: the Electron + Vue 2 desktop app. - - `packages/cli`: a small CLI entrypoint that loads user config and starts the proxy service. -- `packages/core/src/index.js` exposes the main API and owns process-level error handling plus config/state wiring. -- `packages/mitmproxy/src/index.js` creates the proxy server(s), applies proxy options, and reports status/errors back to the host process. -- `packages/gui/src/background.js` is the Electron main process: it loads config, creates the main window, tray, IPC bridges, and Windows-specific power-monitor behavior. -- Renderer code lives under `packages/gui/src/view/`; IPC/bridge code lives under `packages/gui/src/bridge/`. -- The CLI reads `packages/cli/src/user_config.json5`, prints a banner, and starts the core API with the mitmproxy service path. - -## Repo-specific conventions - -- Most runtime code in `core`, `mitmproxy`, and `cli` uses CommonJS; GUI code is the Electron/Vue app and is organized around the Electron main process plus renderer/bridge split. -- Keep GUI source imports aligned with the existing file layout and `.js` module naming used in the Electron entrypoints. -- Preserve the startup/shutdown flow: ensure the sequence remains where `core` initializes and manages the proxy lifecycle, `mitmproxy` performs network interception, and the GUI communicates exclusively through IPC bridges and the `core` API; avoid direct cross-component calls that bypass these boundaries. -- Native/module setup matters here: the repo uses a root `.npmrc` with a PhantomJS mirror and C++17 build flags for native modules. -- The project documents Node 22.x, Python 3.11/setuptools, and VS 2022 C++ tooling as the expected local environment for Windows builds. diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml deleted file mode 100644 index 6a662b6bb9..0000000000 --- a/.github/workflows/build-and-release.yml +++ /dev/null @@ -1,565 +0,0 @@ -name: "Build And Release" - -on: - push: - branches: - - release* - paths-ignore: - - "_script/**" - - "doc/**" - - "**/*.md" - - "**/.gitignore" - - "**/LICENSE" - workflow_dispatch: - -jobs: - # job 1 - build-and-upload: - runs-on: ${{ contains(matrix.os, '-arm') && matrix.os || format('{0}-latest', matrix.os) }} - env: - ELECTRON_CACHE: ${{ github.workspace }}/.cache/electron - ELECTRON_BUILDER_CACHE: ${{ github.workspace }}/.cache/electron-builder - strategy: - fail-fast: false - matrix: - os: - - windows - - ubuntu - # - ubuntu-24.04-arm - - macos - node: - - 22 - steps: - - name: "Checkout" - uses: actions/checkout@v4.1.7 - with: - submodules: true - fetch-depth: 0 - - - name: "Setup pnpm" - uses: pnpm/action-setup@v4 - - - name: 'Setup Node.js "${{ matrix.node }}.x" environment' - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node }} - registry-url: https://npm.pkg.github.com/ - cache: pnpm - - - name: "Setup Python environment, because of electron-builder install-app-deps requires Python setup tools" - uses: actions/setup-python@v5 - with: - python-version: "3.10" - - - name: "Get package info" - id: package-info - uses: luizfelipelaviola/get-package-info@v1 - with: - path: ./packages/gui - - - name: "Print" - run: | - echo "version = ${{ steps.package-info.outputs.version }}"; - echo "github.ref_type = ${{ github.ref_type }}"; - echo "github.ref = ${{ github.ref }}"; - echo "github.ref_name = ${{ github.ref_name }}"; - - - name: "npm -v | pnpm -v | python --version" - run: | - echo "======================================================================"; - echo "npm -v"; - echo "--------------------"; - npm -v; - - echo "======================================================================"; - echo "pnpm -v"; - echo "--------------------"; - pnpm -v; - - echo "======================================================================"; - echo "python --version"; - echo "--------------------"; - python --version; - - - name: "Setup electron cache" - uses: actions/cache@v4 - with: - path: ${{ github.workspace }}/.cache/electron - key: ${{ runner.os }}-electron-cache-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-electron-cache- - - - name: "Setup electron-builder cache" - uses: actions/cache@v4 - with: - path: ${{ github.workspace }}/.cache/electron-builder - key: ${{ runner.os }}-electron-builder-cache-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-electron-builder-cache- - - - name: "Set C++17 compiler flags (non-Windows)" - if: ${{ matrix.os != 'windows' }} - run: | - echo "CXXFLAGS=-std=c++17" >> $GITHUB_ENV - echo "CFLAGS=-std=c11" >> $GITHUB_ENV - - - name: "Set C++17 compiler flags (Windows)" - if: ${{ matrix.os == 'windows' }} - run: | - echo "CL=/std:c++17" >> $env:GITHUB_ENV - - - name: "'pnpm install' Because we need to install optional dependencies" - run: | - echo "======================================================================"; - dir || ls -lah; - - echo "======================================================================"; - echo "pnpm install"; - echo "--------------------"; - pnpm install; - - - name: "test packages/core" - run: | - cd packages/core; - pnpm run test; - - - name: "test packages/mitmproxy" - run: | - cd packages/mitmproxy; - pnpm run test; - - - name: "Cache Flatpak runtime (Linux)" - if: ${{ matrix.os == 'ubuntu' }} - id: cache-flatpak-runtime - uses: actions/cache@v4 - with: - path: ~/.local/share/flatpak - key: flatpak-runtime-freedesktop-21.08 - - - name: "Install Flatpak tooling (Linux)" - if: ${{ matrix.os == 'ubuntu' }} - run: | - sudo apt-get update -y - sudo apt-get install -y flatpak flatpak-builder xdg-desktop-portal appstream fuse3 - # Allow flatpak-builder's bwrap sandbox to create user namespaces on Ubuntu 24.04 - sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 - # Remove bwrap AppArmor profile if present; it can block sandbox operations beyond userns - sudo apparmor_parser -R /etc/apparmor.d/bwrap 2>/dev/null || true - flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo - if [ "${{ steps.cache-flatpak-runtime.outputs.cache-hit }}" != "true" ]; then - flatpak install --user -y flathub org.freedesktop.Platform//21.08 org.freedesktop.Sdk//21.08 - fi - flatpak --version - flatpak-builder --version - - - name: "Cache Flatpak runtime (Linux ARM64)" - if: ${{ matrix.os == 'ubuntu-24.04-arm' }} - id: cache-flatpak-runtime-linux-arm64 - uses: actions/cache@v4 - with: - path: ~/.local/share/flatpak - key: flatpak-runtime-freedesktop-21.08 - - - name: "Install Flatpak tooling (Linux ARM64)" - if: ${{ matrix.os == 'ubuntu-24.04-arm' }} - run: | - sudo apt-get update -y - sudo apt-get install -y flatpak flatpak-builder xdg-desktop-portal appstream fuse3 - # Allow flatpak-builder's bwrap sandbox to create user namespaces on Ubuntu 24.04 - sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 - # Remove bwrap AppArmor profile if present; it can block sandbox operations beyond userns - sudo apparmor_parser -R /etc/apparmor.d/bwrap 2>/dev/null || true - flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo - if [ "${{ steps.cache-flatpak-runtime-linux-arm64.outputs.cache-hit }}" != "true" ]; then - flatpak install --user -y flathub org.freedesktop.Platform//21.08 org.freedesktop.Sdk//21.08 - fi - flatpak --version - flatpak-builder --version - - - name: "Special preparation for Linux ARM64 build" - if: ${{ matrix.os == 'ubuntu-24.04-arm' }} - run: | - echo "======================================================================"; - echo "Run _script/linux-arm64-prepare.sh"; - echo "--------------------"; - bash _script/linux-arm64-prepare.sh; - - - name: "npm run electron:build (Windows/macOS)" - if: ${{ matrix.os != 'ubuntu' }} - run: | - echo "======================================================================"; - echo "cd packages/gui"; - echo "--------------------"; - cd packages/gui; - dir || ls -lah; - - echo "======================================================================"; - echo "npm run electron:build"; - echo "--------------------"; - npm run electron:build; - - - name: "npm run electron:build (Linux & Linux ARM64)" - if: ${{ matrix.os == 'ubuntu' || matrix.os == 'ubuntu-24.04-arm' }} - env: - DEBUG: "@malept/flatpak-bundler" - run: | - echo "======================================================================"; - echo "cd packages/gui"; - echo "--------------------"; - cd packages/gui; - ls -lah; - - echo "======================================================================"; - echo "npm run electron:build"; - echo "--------------------"; - dbus-run-session -- npm run electron:build; - - - name: 'Print dir "packages/gui/dist_electron/"' - run: | - echo "======================================================================"; - echo "cd packages/gui/dist_electron"; - echo "--------------------"; - cd packages/gui/dist_electron; - dir || ls -lah; - - # Rename artifacts - - name: "Rename artifacts - Windows" - if: ${{ matrix.os == 'windows' }} - run: | - cd packages/gui/dist_electron; - ren DevSidecar-${{ steps.package-info.outputs.version }}-x64.exe DevSidecar-${{ steps.package-info.outputs.version }}-windows-x86_64.exe; - ren DevSidecar-${{ steps.package-info.outputs.version }}-ia32.exe DevSidecar-${{ steps.package-info.outputs.version }}-windows-ia32.exe; - ren DevSidecar-${{ steps.package-info.outputs.version }}-arm64.exe DevSidecar-${{ steps.package-info.outputs.version }}-windows-arm64.exe; - dir; - - name: "Rename artifacts - Linux" - if: ${{ matrix.os == 'ubuntu' }} - run: | - cd packages/gui/dist_electron; - mv DevSidecar-${{ steps.package-info.outputs.version }}-amd64.deb DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.deb; - mv DevSidecar-${{ steps.package-info.outputs.version }}-x86_64.AppImage DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.AppImage; - mv DevSidecar-${{ steps.package-info.outputs.version }}-x64.tar.gz DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.tar.gz; - mv DevSidecar-${{ steps.package-info.outputs.version }}-x86_64.rpm DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.rpm; - # mv DevSidecar-${{ steps.package-info.outputs.version }}-x86_64.flatpak DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.flatpak; - #------------------------------------------------------------------------------------------------------------------------- - mv DevSidecar-${{ steps.package-info.outputs.version }}-arm64.deb DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.deb; - mv DevSidecar-${{ steps.package-info.outputs.version }}-arm64.AppImage DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.AppImage; - mv DevSidecar-${{ steps.package-info.outputs.version }}-arm64.tar.gz DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.tar.gz; - mv DevSidecar-${{ steps.package-info.outputs.version }}-aarch64.rpm DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.rpm; - # arm64 flatpak is on Linux ARM64 runner - #------------------------------------------------------------------------------------------------------------------------- - mv DevSidecar-${{ steps.package-info.outputs.version }}-armv7l.deb DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.deb; - mv DevSidecar-${{ steps.package-info.outputs.version }}-armv7l.AppImage DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.AppImage; - mv DevSidecar-${{ steps.package-info.outputs.version }}-armv7l.tar.gz DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.tar.gz; - mv DevSidecar-${{ steps.package-info.outputs.version }}-armv7l.rpm DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.rpm; - # armv7l flatpak is on Linux ARM64 runner - ls -lah; - - name: "Rename artifacts - Linux ARM64" - if: ${{ matrix.os == 'ubuntu-24.04-arm' }} - run: | - mv DevSidecar-${{ steps.package-info.outputs.version }}-arm64.flatpak DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.flatpak; - #------------------------------------------------------------------------------------------------------------------------- - mv DevSidecar-${{ steps.package-info.outputs.version }}-armv7l.flatpak DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.flatpak; - ls -lah; - - name: "Rename artifacts - macOS" - if: ${{ matrix.os == 'macos' }} - run: | - cd packages/gui/dist_electron; - mv DevSidecar-${{ steps.package-info.outputs.version }}-x64.dmg DevSidecar-${{ steps.package-info.outputs.version }}-macos-x86_64.dmg; - mv DevSidecar-${{ steps.package-info.outputs.version }}-arm64.dmg DevSidecar-${{ steps.package-info.outputs.version }}-macos-arm64.dmg; - mv DevSidecar-${{ steps.package-info.outputs.version }}-universal.dmg DevSidecar-${{ steps.package-info.outputs.version }}-macos-universal.dmg; - ls -lah; - - # region Upload artifacts - Windows - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-windows-x86_64.exe" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'windows' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-windows-x86_64.exe - name: "DevSidecar-${{ steps.package-info.outputs.version }}-windows-x86_64.exe" - if-no-files-found: error - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-windows-ia32.exe" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'windows' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-windows-ia32.exe - name: "DevSidecar-${{ steps.package-info.outputs.version }}-windows-ia32.exe" - if-no-files-found: error - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-windows-arm64.exe" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'windows' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-windows-arm64.exe - name: "DevSidecar-${{ steps.package-info.outputs.version }}-windows-arm64.exe" - if-no-files-found: error - # endregion Upload artifacts - Windows - - # region Upload artifacts - Linux - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.deb" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.deb - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.deb" - if-no-files-found: error - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.AppImage" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.AppImage - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.AppImage" - if-no-files-found: error - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.tar.gz" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.tar.gz - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.tar.gz" - if-no-files-found: error - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.rpm" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.rpm - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.rpm" - if-no-files-found: error - # - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.flatpak" - # uses: actions/upload-artifact@v4.4.0 - # if: ${{ matrix.os == 'ubuntu' }} - # with: - # path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.flatpak - # name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.flatpak" - # if-no-files-found: error - - # ------------------------------------------------------------------------------------------------------------------------- - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.deb" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.deb - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.deb" - if-no-files-found: error - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.AppImage" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.AppImage - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.AppImage" - if-no-files-found: error - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.tar.gz" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.tar.gz - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.tar.gz" - if-no-files-found: error - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.rpm" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.rpm - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.rpm" - if-no-files-found: error - - # ------------------------------------------------------------------------------------------------------------------------- - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.deb" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.deb - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.deb" - if-no-files-found: error - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.AppImage" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.AppImage - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.AppImage" - if-no-files-found: error - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.tar.gz" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.tar.gz - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.tar.gz" - if-no-files-found: error - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.rpm" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.rpm - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.rpm" - if-no-files-found: error - # endregion Upload artifacts - Linux - - # region Upload artifacts - Linux ARM64 - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.flatpak" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu-24.04-arm' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.flatpak - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.flatpak" - if-no-files-found: error - # ------------------------------------------------------------------------------------------------------------------------- - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.flatpak" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu-24.04-arm' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.flatpak - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.flatpak" - if-no-files-found: error - # endregion Upload artifacts - Linux ARM64 - - # Upload artifacts - macOS - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-macos-x86_64.dmg" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'macos' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-macos-x86_64.dmg - name: "DevSidecar-${{ steps.package-info.outputs.version }}-macos-x86_64.dmg" - if-no-files-found: error - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-macos-arm64.dmg" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'macos' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-macos-arm64.dmg - name: "DevSidecar-${{ steps.package-info.outputs.version }}-macos-arm64.dmg" - if-no-files-found: error - - name: "Upload DevSidecar-${{ steps.package-info.outputs.version }}-macos-universal.dmg" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'macos' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ steps.package-info.outputs.version }}-macos-universal.dmg - name: "DevSidecar-${{ steps.package-info.outputs.version }}-macos-universal.dmg" - if-no-files-found: error - - # job 2 - download-and-release: - runs-on: ubuntu-latest - needs: - - build-and-upload - steps: - - name: "Checkout" - uses: actions/checkout@v4.1.7 - - - name: "Get package info" - id: package-info - uses: luizfelipelaviola/get-package-info@v1 - with: - path: ./packages/gui - - - name: 'Make "release" dir' - run: mkdir release - - # Download artifacts - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-windows-x86_64.exe" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-windows-x86_64.exe" - path: release - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-windows-ia32.exe" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-windows-ia32.exe" - path: release - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-windows-arm64.exe" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-windows-arm64.exe" - path: release - # ------------------------------------------------------------------------------------------------------------------------- - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.deb" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.deb" - path: release - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.AppImage" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.AppImage" - path: release - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.tar.gz" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.tar.gz" - path: release - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.rpm" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.rpm" - path: release - #- name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.flatpak" - # uses: actions/download-artifact@v4.1.8 - # with: - # name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-x86_64.flatpak" - # path: release - # ------------------------------------------------------------------------------------------------------------------------- - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.deb" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.deb" - path: release - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.AppImage" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.AppImage" - path: release - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.tar.gz" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.tar.gz" - path: release - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.rpm" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-arm64.rpm" - path: release - # ------------------------------------------------------------------------------------------------------------------------- - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.deb" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.deb" - path: release - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.AppImage" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.AppImage" - path: release - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.tar.gz" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.tar.gz" - path: release - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.rpm" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-linux-armv7l.rpm" - path: release - # ------------------------------------------------------------------------------------------------------------------------- - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-macos-x86_64.dmg" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-macos-x86_64.dmg" - path: release - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-macos-arm64.dmg" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-macos-arm64.dmg" - path: release - - name: "Download DevSidecar-${{ steps.package-info.outputs.version }}-macos-universal.dmg" - uses: actions/download-artifact@v4.1.8 - with: - name: "DevSidecar-${{ steps.package-info.outputs.version }}-macos-universal.dmg" - path: release - - - name: 'Print files from "release" dir' - run: | - ls -lah release; - - - name: "Create a draft release" - uses: wangliang181230/github-action-ghr@master - env: - GITHUB_TOKEN: ${{ github.token }} - GHR_PATH: release/ - GHR_TITLE: ${{ github.ref_name }} - GHR_REPLACE: true - GHR_DRAFT: true \ No newline at end of file diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml deleted file mode 100644 index 3316db6c27..0000000000 --- a/.github/workflows/codeql.yml +++ /dev/null @@ -1,103 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL Advanced" - -on: - push: - branches: [ "master" ] - pull_request: - branches: [ "master" ] - schedule: - - cron: '37 23 * * *' - workflow_dispatch: - - -jobs: - analyze: - name: Analyze (${{ matrix.language }}) - # Runner size impacts CodeQL analysis time. To learn more, please see: - # - https://gh.io/recommended-hardware-resources-for-running-codeql - # - https://gh.io/supported-runners-and-hardware-resources - # - https://gh.io/using-larger-runners (GitHub.com only) - # Consider using larger runners or machines with greater resources for possible analysis time improvements. - runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} - permissions: - # required for all workflows - security-events: write - - # required to fetch internal or private CodeQL packs - packages: read - - # only required for workflows in private repositories - actions: read - contents: read - - strategy: - fail-fast: false - matrix: - include: - - language: actions - build-mode: none - - language: javascript-typescript - build-mode: none - # CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift' - # Use `c-cpp` to analyze code written in C, C++ or both - # Use 'java-kotlin' to analyze code written in Java, Kotlin or both - # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both - # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, - # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. - # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how - # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - # Add any setup steps before running the `github/codeql-action/init` action. - # This includes steps like installing compilers or runtimes (`actions/setup-node` - # or others). This is typically only required for manual builds. - # - name: Setup runtime (example) - # uses: actions/setup-example@v1 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v4 - with: - languages: ${{ matrix.language }} - build-mode: ${{ matrix.build-mode }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - - # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality - - # If the analyze step fails for one of the languages you are analyzing with - # "We were unable to automatically build your code", modify the matrix above - # to set the build mode to "manual" for that language. Then modify this step - # to build your code. - # ℹ️ Command-line programs to run using the OS shell. - # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - - name: Run manual build steps - if: matrix.build-mode == 'manual' - shell: bash - run: | - echo 'If you are using a "manual" build mode for one or more of the' \ - 'languages you are analyzing, replace this with the commands to build' \ - 'your code, for example:' - echo ' make bootstrap' - echo ' make release' - exit 1 - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4 - with: - category: "/language:${{matrix.language}}" diff --git a/.github/workflows/defender-for-devops.yml b/.github/workflows/defender-for-devops.yml deleted file mode 100644 index 12f76f47b2..0000000000 --- a/.github/workflows/defender-for-devops.yml +++ /dev/null @@ -1,51 +0,0 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. -# -# Microsoft Security DevOps (MSDO) is a command line application which integrates static analysis tools into the development cycle. -# MSDO installs, configures and runs the latest versions of static analysis tools -# (including, but not limited to, SDL/security and compliance tools). -# -# The Microsoft Security DevOps action is currently in beta and runs on the windows-latest queue, -# as well as Windows self hosted agents. ubuntu-latest support coming soon. -# -# For more information about the action , check out https://github.com/microsoft/security-devops-action -# -# Please note this workflow do not integrate your GitHub Org with Microsoft Defender For DevOps. You have to create an integration -# and provide permission before this can report data back to azure. -# Read the official documentation here : https://learn.microsoft.com/en-us/azure/defender-for-cloud/quickstart-onboard-github - -name: "Microsoft Defender For Devops" - -permissions: - contents: read - security-events: write - -on: - push: - branches: [ "master" ] - pull_request: - branches: [ "master" ] - schedule: - - cron: '36 8 * * 1' - -jobs: - MSDO: - # currently only windows latest is supported - runs-on: windows-latest - - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-dotnet@v4 - with: - dotnet-version: | - 5.0.x - 6.0.x - - name: Run Microsoft Security DevOps - uses: microsoft/security-devops-action@v1.6.0 - id: msdo - - name: Upload results to Security tab - uses: github/codeql-action/upload-sarif@v3 - with: - sarif_file: ${{ steps.msdo.outputs.sarifFile }} diff --git a/.github/workflows/npm-run-electron.yml b/.github/workflows/npm-run-electron.yml deleted file mode 100644 index ee2b66848e..0000000000 --- a/.github/workflows/npm-run-electron.yml +++ /dev/null @@ -1,124 +0,0 @@ -name: "npm run electron" - -on: - push: - branches: - - run* - - test* - - release* - paths-ignore: - - "_script/**" - - "doc/**" - - "**/*.md" - - "**/.gitignore" - - "**/LICENSE" - workflow_dispatch: - -jobs: - npm-run-electron: - runs-on: ${{ contains(matrix.os, '-arm') && matrix.os || format('{0}-latest', matrix.os) }} - env: - ELECTRON_CACHE: ${{ github.workspace }}/.cache/electron - ELECTRON_BUILDER_CACHE: ${{ github.workspace }}/.cache/electron-builder - strategy: - fail-fast: false - matrix: - os: - - windows - - ubuntu - # - ubuntu-24.04-arm # 因难以申请到 ARM64 runner而放弃;注意该系统名称不应使用latest后缀 - - macos - node: - - 22 - steps: - - name: "Checkout" - uses: actions/checkout@v4.1.7 - with: - submodules: true - fetch-depth: 0 - - - name: "Setup pnpm" - uses: pnpm/action-setup@v4 - - - name: 'Setup Node.js "${{ matrix.node }}.x" environment' - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node }} - registry-url: https://npm.pkg.github.com/ - cache: pnpm - - - name: "Setup Python environment, because of electron-builder install-app-deps requires Python setup tools" - uses: actions/setup-python@v5 - with: - python-version: "3.10" - - - name: "Print" - run: | - echo "github.ref_type = ${{ github.ref_type }}"; - echo "github.ref = ${{ github.ref }}"; - echo "github.ref_name = ${{ github.ref_name }}"; - - - name: "npm -v | pnpm -v | python --version" - run: | - echo "======================================================================"; - echo "npm -v"; - echo "--------------------"; - npm -v; - - echo "======================================================================"; - echo "pnpm -v"; - echo "--------------------"; - pnpm -v; - - echo "======================================================================"; - echo "python --version"; - echo "--------------------"; - python --version; - - - name: "Setup electron cache" - uses: actions/cache@v4 - with: - path: ${{ github.workspace }}/.cache/electron - key: ${{ runner.os }}-electron-cache-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-electron-cache- - - - name: "Setup electron-builder cache" - uses: actions/cache@v4 - with: - path: ${{ github.workspace }}/.cache/electron-builder - key: ${{ runner.os }}-electron-builder-cache-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-electron-builder-cache- - - - name: "Set C++17 compiler flags (Linux / macOS)" - if: ${{ matrix.os != 'windows' }} - run: | - echo "CXXFLAGS=-std=c++17" >> $GITHUB_ENV - echo "CFLAGS=-std=c11" >> $GITHUB_ENV - - - name: "Set C++17 compiler flags (Windows)" - if: ${{ matrix.os == 'windows' }} - run: | - echo "CL=/std:c++17" >> $env:GITHUB_ENV - - - name: "pnpm install" - run: | - echo "======================================================================"; - dir || ls -lah; - - echo "======================================================================"; - echo "pnpm install"; - echo "--------------------"; - pnpm install; - - - name: "npm run electron" - working-directory: packages/gui - run: | - echo "======================================================================"; - dir || ls -lah; - - echo "======================================================================"; - echo "npm run electron"; - echo "--------------------"; - npm run electron; diff --git a/.github/workflows/publish-to-aur.yml b/.github/workflows/publish-to-aur.yml deleted file mode 100644 index f1d846f75b..0000000000 --- a/.github/workflows/publish-to-aur.yml +++ /dev/null @@ -1,127 +0,0 @@ -name: "Publish To AUR" - -on: - release: - types: - - published - workflow_dispatch: - inputs: - version: - description: "Package version to publish (e.g. 2.0.2). Leave empty to use the latest release tag." - required: false - type: string - -jobs: - publish-to-aur: - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - name: "Checkout" - uses: actions/checkout@v4.1.7 - - # ── Resolve version ────────────────────────────────────────────────────── - - name: "Resolve version" - id: version - run: | - if [[ -n "${{ inputs.version }}" ]]; then - VERSION="${{ inputs.version }}" - else - # Strip leading 'v' from the release tag (e.g. v2.0.2 → 2.0.2) - VERSION="${GITHUB_REF_NAME#v}" - fi - echo "version=${VERSION}" >> "$GITHUB_OUTPUT" - echo "Resolved version: ${VERSION}" - - # ── Download release assets and compute SHA256 checksums ───────────────── - - name: "Download Linux x86_64 tar.gz and compute SHA256" - id: sha256_x86_64 - run: | - VERSION="${{ steps.version.outputs.version }}" - URL="https://github.com/docmirror/dev-sidecar/releases/download/v${VERSION}/DevSidecar-${VERSION}-linux-x86_64.tar.gz" - echo "Downloading: ${URL}" - curl -fsSL -o /tmp/dev-sidecar-x86_64.tar.gz "${URL}" - SHA256=$(sha256sum /tmp/dev-sidecar-x86_64.tar.gz | awk '{print $1}') - echo "sha256=${SHA256}" >> "$GITHUB_OUTPUT" - echo "x86_64 SHA256: ${SHA256}" - - - name: "Download Linux aarch64 tar.gz and compute SHA256" - id: sha256_aarch64 - run: | - VERSION="${{ steps.version.outputs.version }}" - URL="https://github.com/docmirror/dev-sidecar/releases/download/v${VERSION}/DevSidecar-${VERSION}-linux-arm64.tar.gz" - echo "Downloading: ${URL}" - curl -fsSL -o /tmp/dev-sidecar-aarch64.tar.gz "${URL}" - SHA256=$(sha256sum /tmp/dev-sidecar-aarch64.tar.gz | awk '{print $1}') - echo "sha256=${SHA256}" >> "$GITHUB_OUTPUT" - echo "aarch64 SHA256: ${SHA256}" - - # ── Update PKGBUILD ─────────────────────────────────────────────────────── - - name: "Update PKGBUILD with new version and checksums" - run: | - VERSION="${{ steps.version.outputs.version }}" - SHA256_X86_64="${{ steps.sha256_x86_64.outputs.sha256 }}" - SHA256_AARCH64="${{ steps.sha256_aarch64.outputs.sha256 }}" - - PKGBUILD="packages/aur/PKGBUILD" - - # Update pkgver - sed -i "s/^pkgver=.*/pkgver=${VERSION}/" "${PKGBUILD}" - - # Reset pkgrel to 1 on every new upstream version - sed -i "s/^pkgrel=.*/pkgrel=1/" "${PKGBUILD}" - - # Update checksums - sed -i "s/^sha256sums_x86_64=.*/sha256sums_x86_64=('${SHA256_X86_64}')/" "${PKGBUILD}" - sed -i "s/^sha256sums_aarch64=.*/sha256sums_aarch64=('${SHA256_AARCH64}')/" "${PKGBUILD}" - - echo "======== Updated PKGBUILD ========" - cat "${PKGBUILD}" - - # ── Push to AUR via git + SSH ───────────────────────────────────────────── - - name: "Set up SSH key for AUR" - run: | - install -dm700 ~/.ssh - - # Write the private key - echo "${{ secrets.AUR_SSH_PRIVATE_KEY }}" > ~/.ssh/aur_id - chmod 600 ~/.ssh/aur_id - - # Trust AUR's host key - ssh-keyscan -t rsa,ecdsa,ed25519 aur.archlinux.org >> ~/.ssh/known_hosts 2>/dev/null - chmod 644 ~/.ssh/known_hosts - - # SSH config: use this key for AUR (printf avoids heredoc indentation issues) - printf 'Host aur.archlinux.org\n IdentityFile ~/.ssh/aur_id\n User aur\n' >> ~/.ssh/config - chmod 600 ~/.ssh/config - - - name: "Clone AUR repository" - run: | - git clone ssh://aur@aur.archlinux.org/dev-sidecar-bin.git /tmp/aur-dev-sidecar-bin - - - name: "Copy PKGBUILD and generate .SRCINFO" - run: | - cp packages/aur/PKGBUILD /tmp/aur-dev-sidecar-bin/PKGBUILD - - # Generate .SRCINFO via helper script (makepkg is not available on the ubuntu - # runner since pacman is not installed) - cd /tmp/aur-dev-sidecar-bin - python3 "$GITHUB_WORKSPACE/packages/aur/gen_srcinfo.py" - - - name: "Commit and push to AUR" - run: | - cd /tmp/aur-dev-sidecar-bin - - git config user.name "${{ vars.AUR_USERNAME }}" - git config user.email "${{ vars.AUR_EMAIL }}" - - git add PKGBUILD .SRCINFO - - # Only commit if there are actual changes - if git diff --cached --quiet; then - echo "No changes to commit – AUR is already up to date." - else - git commit -m "Update to v${{ steps.version.outputs.version }}" - git push - echo "Successfully pushed to AUR." - fi diff --git a/.github/workflows/test-and-upload.yml b/.github/workflows/test-and-upload.yml deleted file mode 100644 index 830ed480d4..0000000000 --- a/.github/workflows/test-and-upload.yml +++ /dev/null @@ -1,460 +0,0 @@ -name: "Test And Upload" - -on: - push: - branches: - - master - - 1.x - - develop - - test* - - fix* - paths-ignore: - - "_script/**" - - "doc/**" - - "**/*.md" - - "**/.gitignore" - - "**/LICENSE" - pull_request: - branches: - - master - - develop - - 1.x - paths-ignore: - - "_script/**" - - "doc/**" - - "**/*.md" - - "**/.gitignore" - - "**/LICENSE" - workflow_dispatch: - -jobs: - test-and-upload: - runs-on: ${{ contains(matrix.os, '-arm') && matrix.os || format('{0}-latest', matrix.os) }} - env: - ELECTRON_CACHE: ${{ github.workspace }}/.cache/electron - ELECTRON_BUILDER_CACHE: ${{ github.workspace }}/.cache/electron-builder - VUE_APP_PUBLISH_CHANNEL: beta - strategy: - fail-fast: false - matrix: - os: - - windows - - ubuntu - # - ubuntu-24.04-arm - - macos - node: - - 22 - steps: - - name: "Checkout" - uses: actions/checkout@v4.1.7 - with: - submodules: true - fetch-depth: 0 - - - name: "Setup pnpm" - uses: pnpm/action-setup@v4 - - - name: 'Setup Node.js "${{ matrix.node }}.x" environment' - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node }} - registry-url: https://npm.pkg.github.com/ - cache: pnpm - - - name: "Setup Python environment, because of electron-builder install-app-deps requires Python setup tools" - uses: actions/setup-python@v5 - with: - python-version: "3.10" - - - name: "Get package info" - id: package-info - uses: luizfelipelaviola/get-package-info@v1 - with: - path: ./packages/gui - - - name: "Compute beta build version" - shell: bash - run: | - BASE_VERSION="${{ steps.package-info.outputs.version }}" - BUILD_VERSION="${BASE_VERSION}-beta.${{ github.run_number }}" - echo "BUILD_VERSION=${BUILD_VERSION}" >> "$GITHUB_ENV" - - - name: "Apply beta version to packages/gui/package.json" - shell: bash - run: | - node -e "const fs=require('fs');const p='packages/gui/package.json';const j=JSON.parse(fs.readFileSync(p,'utf8'));j.version=process.env.BUILD_VERSION;fs.writeFileSync(p,JSON.stringify(j,null,2)+'\\n');console.log('set gui version to',j.version);" - - - name: "Print" - run: | - echo "version = ${{ steps.package-info.outputs.version }}"; - echo "build version = ${{ env.BUILD_VERSION }}"; - echo "github.ref_type = ${{ github.ref_type }}"; - echo "github.ref = ${{ github.ref }}"; - echo "github.ref_name = ${{ github.ref_name }}"; - - - name: "npm -v | pnpm -v | python --version" - run: | - echo "======================================================================"; - echo "npm -v"; - echo "--------------------"; - npm -v; - - echo "======================================================================"; - echo "pnpm -v"; - echo "--------------------"; - pnpm -v; - - echo "======================================================================"; - echo "python --version"; - echo "--------------------"; - python --version; - - - name: "Setup electron cache" - uses: actions/cache@v4 - with: - path: ${{ github.workspace }}/.cache/electron - key: ${{ runner.os }}-electron-cache-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-electron-cache- - - - name: "Setup electron-builder cache" - uses: actions/cache@v4 - with: - path: ${{ github.workspace }}/.cache/electron-builder - key: ${{ runner.os }}-electron-builder-cache-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-electron-builder-cache- - - - name: "Set C++17 compiler flags (non-Windows)" - if: ${{ matrix.os != 'windows' }} - run: | - echo "CXXFLAGS=-std=c++17" >> $GITHUB_ENV - echo "CFLAGS=-std=c11" >> $GITHUB_ENV - - - name: "Set C++17 compiler flags (Windows)" - if: ${{ matrix.os == 'windows' }} - run: | - echo "CL=/std:c++17" >> $env:GITHUB_ENV - - - name: "'pnpm install' Because we need to install optional dependencies" - run: | - echo "======================================================================"; - dir || ls -lah; - - echo "======================================================================"; - echo "pnpm install"; - echo "--------------------"; - pnpm install; - - - name: "test packages/core" - run: | - cd packages/core; - pnpm run test; - - - name: "test packages/mitmproxy" - run: | - cd packages/mitmproxy; - pnpm run test; - - - name: "Cache Flatpak runtime (Linux)" - if: ${{ matrix.os == 'ubuntu' }} - id: cache-flatpak-runtime - uses: actions/cache@v4 - with: - path: ~/.local/share/flatpak - key: flatpak-runtime-freedesktop-21.08 - - - name: "Install Flatpak tooling (Linux)" - if: ${{ matrix.os == 'ubuntu' }} - run: | - sudo apt-get update -y - sudo apt-get install -y flatpak flatpak-builder xdg-desktop-portal appstream fuse3 - # Allow flatpak-builder's bwrap sandbox to create user namespaces on Ubuntu 24.04 - sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 - # Remove bwrap AppArmor profile if present; it can block sandbox operations beyond userns - sudo apparmor_parser -R /etc/apparmor.d/bwrap 2>/dev/null || true - flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo - if [ "${{ steps.cache-flatpak-runtime.outputs.cache-hit }}" != "true" ]; then - flatpak install --user -y flathub org.freedesktop.Platform//21.08 org.freedesktop.Sdk//21.08 - fi - flatpak --version - flatpak-builder --version - - - name: "Cache Flatpak runtime (Linux ARM64)" - if: ${{ matrix.os == 'ubuntu-24.04-arm' }} - id: cache-flatpak-runtime-linux-arm64 - uses: actions/cache@v4 - with: - path: ~/.local/share/flatpak - key: flatpak-runtime-freedesktop-21.08 - - - name: "Install Flatpak tooling (Linux ARM64)" - if: ${{ matrix.os == 'ubuntu-24.04-arm' }} - run: | - sudo apt-get update -y - sudo apt-get install -y flatpak flatpak-builder xdg-desktop-portal appstream fuse3 - # Allow flatpak-builder's bwrap sandbox to create user namespaces on Ubuntu 24.04 - sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 - # Remove bwrap AppArmor profile if present; it can block sandbox operations beyond userns - sudo apparmor_parser -R /etc/apparmor.d/bwrap 2>/dev/null || true - flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo - if [ "${{ steps.cache-flatpak-runtime-linux-arm64.outputs.cache-hit }}" != "true" ]; then - flatpak install --user -y flathub org.freedesktop.Platform//21.08 org.freedesktop.Sdk//21.08 - fi - flatpak --version - flatpak-builder --version - - - name: "Special preparation for Linux ARM64 build" - if: ${{ matrix.os == 'ubuntu-24.04-arm' }} - run: | - echo "======================================================================"; - echo "Run _script/linux-arm64-prepare.sh"; - echo "--------------------"; - bash _script/linux-arm64-prepare.sh; - - - name: "npm run electron:build (Windows/macOS)" - if: ${{ matrix.os != 'ubuntu' }} - run: | - echo "======================================================================"; - echo "cd packages/gui"; - echo "--------------------"; - cd packages/gui; - dir || ls -lah; - - echo "======================================================================"; - echo "npm run electron:build"; - echo "--------------------"; - npm run electron:build; - - - name: "npm run electron:build (Linux & Linux ARM64)" - if: ${{ matrix.os == 'ubuntu' || matrix.os == 'ubuntu-24.04-arm' }} - env: - DEBUG: "@malept/flatpak-bundler" - run: | - echo "======================================================================"; - echo "cd packages/gui"; - echo "--------------------"; - cd packages/gui; - ls -lah; - - echo "======================================================================"; - echo "npm run electron:build"; - echo "--------------------"; - dbus-run-session -- npm run electron:build; - - - name: 'Print dir "packages/gui/dist_electron/"' - run: | - echo "======================================================================"; - echo "cd packages/gui/dist_electron"; - echo "--------------------"; - cd packages/gui/dist_electron; - dir || ls -lah; - - # Rename artifacts - - name: "Rename artifacts - Windows" - if: ${{ matrix.os == 'windows' }} - run: | - cd packages/gui/dist_electron; - ren DevSidecar-${{ env.BUILD_VERSION }}-x64.exe DevSidecar-${{ env.BUILD_VERSION }}-windows-x86_64.exe; - ren DevSidecar-${{ env.BUILD_VERSION }}-ia32.exe DevSidecar-${{ env.BUILD_VERSION }}-windows-ia32.exe; - ren DevSidecar-${{ env.BUILD_VERSION }}-arm64.exe DevSidecar-${{ env.BUILD_VERSION }}-windows-arm64.exe; - dir; - - name: "Rename artifacts - Linux" - if: ${{ matrix.os == 'ubuntu' }} - run: | - cd packages/gui/dist_electron; - mv DevSidecar-${{ env.BUILD_VERSION }}-amd64.deb DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.deb; - mv DevSidecar-${{ env.BUILD_VERSION }}-x86_64.AppImage DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.AppImage; - mv DevSidecar-${{ env.BUILD_VERSION }}-x64.tar.gz DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.tar.gz; - mv DevSidecar-${{ env.BUILD_VERSION }}-x86_64.rpm DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.rpm; - # mv DevSidecar-${{ env.BUILD_VERSION }}-x86_64.flatpak DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.flatpak; - #------------------------------------------------------------------------------------------------------------------------- - mv DevSidecar-${{ env.BUILD_VERSION }}-arm64.deb DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.deb; - mv DevSidecar-${{ env.BUILD_VERSION }}-arm64.AppImage DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.AppImage; - mv DevSidecar-${{ env.BUILD_VERSION }}-arm64.tar.gz DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.tar.gz; - mv DevSidecar-${{ env.BUILD_VERSION }}-aarch64.rpm DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.rpm; - # arm64 flatpak is on Linux ARM64 runner - #------------------------------------------------------------------------------------------------------------------------- - mv DevSidecar-${{ env.BUILD_VERSION }}-armv7l.deb DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.deb; - mv DevSidecar-${{ env.BUILD_VERSION }}-armv7l.AppImage DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.AppImage; - mv DevSidecar-${{ env.BUILD_VERSION }}-armv7l.tar.gz DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.tar.gz; - mv DevSidecar-${{ env.BUILD_VERSION }}-armv7l.rpm DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.rpm; - # armv7l flatpak is on Linux ARM64 runner - ls -lah; - - name: "Rename artifacts - Linux ARM64" - if: ${{ matrix.os == 'ubuntu-24.04-arm' }} - run: | - mv DevSidecar-${{ env.BUILD_VERSION }}-arm64.flatpak DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.flatpak; - #------------------------------------------------------------------------------------------------------------------------- - mv DevSidecar-${{ env.BUILD_VERSION }}-armv7l.flatpak DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.flatpak; - ls -lah; - - name: "Rename artifacts - macOS" - if: ${{ matrix.os == 'macos' }} - run: | - cd packages/gui/dist_electron; - mv DevSidecar-${{ env.BUILD_VERSION }}-x64.dmg DevSidecar-${{ env.BUILD_VERSION }}-macos-x86_64.dmg; - mv DevSidecar-${{ env.BUILD_VERSION }}-arm64.dmg DevSidecar-${{ env.BUILD_VERSION }}-macos-arm64.dmg; - mv DevSidecar-${{ env.BUILD_VERSION }}-universal.dmg DevSidecar-${{ env.BUILD_VERSION }}-macos-universal.dmg; - ls -lah; - - # region Upload artifacts - Windows - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-windows-x86_64.exe" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'windows' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-windows-x86_64.exe - name: "DevSidecar-${{ env.BUILD_VERSION }}-windows-x86_64.exe" - if-no-files-found: error - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-windows-ia32.exe" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'windows' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-windows-ia32.exe - name: "DevSidecar-${{ env.BUILD_VERSION }}-windows-ia32.exe" - if-no-files-found: error - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-windows-arm64.exe" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'windows' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-windows-arm64.exe - name: "DevSidecar-${{ env.BUILD_VERSION }}-windows-arm64.exe" - if-no-files-found: error - # endregion Upload artifacts - Windows - - # region Upload artifacts - Linux - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.deb" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.deb - name: "DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.deb" - if-no-files-found: error - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.AppImage" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.AppImage - name: "DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.AppImage" - if-no-files-found: error - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.tar.gz" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.tar.gz - name: "DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.tar.gz" - if-no-files-found: error - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.rpm" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.rpm - name: "DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.rpm" - if-no-files-found: error - # - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.flatpak" - # uses: actions/upload-artifact@v4.4.0 - # if: ${{ matrix.os == 'ubuntu' }} - # with: - # path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.flatpak - # name: "DevSidecar-${{ env.BUILD_VERSION }}-linux-x86_64.flatpak" - # if-no-files-found: error - # ------------------------------------------------------------------------------------------------------------------------- - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.deb" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.deb - name: "DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.deb" - if-no-files-found: error - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.AppImage" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.AppImage - name: "DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.AppImage" - if-no-files-found: error - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.tar.gz" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.tar.gz - name: "DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.tar.gz" - if-no-files-found: error - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.rpm" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.rpm - name: "DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.rpm" - if-no-files-found: error - # ------------------------------------------------------------------------------------------------------------------------- - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.deb" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.deb - name: "DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.deb" - if-no-files-found: error - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.AppImage" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.AppImage - name: "DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.AppImage" - if-no-files-found: error - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.tar.gz" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.tar.gz - name: "DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.tar.gz" - if-no-files-found: error - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.rpm" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.rpm - name: "DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.rpm" - if-no-files-found: error - # endregion Upload artifacts - Linux - - # region Upload artifacts - Linux ARM64 - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.flatpak" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu-24.04-arm' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.flatpak - name: "DevSidecar-${{ env.BUILD_VERSION }}-linux-arm64.flatpak" - if-no-files-found: error - # ------------------------------------------------------------------------------------------------------------------------- - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.flatpak" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'ubuntu-24.04-arm' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.flatpak - name: "DevSidecar-${{ env.BUILD_VERSION }}-linux-armv7l.flatpak" - if-no-files-found: error - # endregion Upload artifacts - Linux ARM64 - - # Upload artifacts - macOS - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-macos-x86_64.dmg" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'macos' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-macos-x86_64.dmg - name: "DevSidecar-${{ env.BUILD_VERSION }}-macos-x86_64.dmg" - if-no-files-found: error - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-macos-arm64.dmg" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'macos' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-macos-arm64.dmg - name: "DevSidecar-${{ env.BUILD_VERSION }}-macos-arm64.dmg" - if-no-files-found: error - - name: "Upload DevSidecar-${{ env.BUILD_VERSION }}-macos-universal.dmg" - uses: actions/upload-artifact@v4.4.0 - if: ${{ matrix.os == 'macos' }} - with: - path: packages/gui/dist_electron/DevSidecar-${{ env.BUILD_VERSION }}-macos-universal.dmg - name: "DevSidecar-${{ env.BUILD_VERSION }}-macos-universal.dmg" - if-no-files-found: error - # endregion Upload artifacts - macOS \ No newline at end of file diff --git a/.gitignore b/.gitignore index 9c2bd50023..a547bf36d8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,21 +1,24 @@ -# IntelliJ project files -.idea -*.iml +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* -# vscode settings files -.vscode +node_modules +dist +dist-ssr +*.local -# Mac +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea .DS_Store - -# Node files -node_modules/ -*.lock -package-lock.json - -# Other files -out -gen -*.log -*.lnk -.venv \ No newline at end of file +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.npmrc b/.npmrc deleted file mode 100644 index f3906d7a20..0000000000 --- a/.npmrc +++ /dev/null @@ -1,9 +0,0 @@ -shamefully-hoist=true -phantomjs_cdnurl=https://npmmirror.com/mirrors/phantomjs -# Native modules (e.g. @parcel/watcher) require C++17. -# In CI, CXXFLAGS=-std=c++17 (Linux/macOS) and CL=/std:c++17 (Windows) are -# set before `pnpm install` so node-gyp compiles with the correct standard. -# For local builds on Linux/macOS you may need: -export CXXFLAGS="-std=c++17" -# For local builds on Windows you may need: -export CL="/std:c++17" diff --git a/.python-version b/.python-version deleted file mode 100644 index 902b2c90c8..0000000000 --- a/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.11 \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000000..cf4385bdd0 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "Vue.volar", + "tauri-apps.tauri-vscode", + "rust-lang.rust-analyzer" + ] +} diff --git a/LICENSE b/LICENSE deleted file mode 100644 index a612ad9813..0000000000 --- a/LICENSE +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/README.md b/README.md index 3d6d045235..819d634266 100644 --- a/README.md +++ b/README.md @@ -1,476 +1,15 @@ -# dev-sidecar +# DevSidecar (Tauri Rewrite) -开发者边车,命名取自service-mesh的service-sidecar,意为为开发者打辅助的边车工具(以下简称ds) -通过本地代理的方式将https请求代理到一些国内的加速通道上 +> Electron → Tauri + Vue 3 + shadcn-vue -GitHub stars -[![Star History Chart](https://api.star-history.com/svg?repos=docmirror/dev-sidecar&type=date&legend=top-left)](https://www.star-history.com/#docmirror/dev-sidecar&type=date&legend=top-left) -> Gitee上的同步项目已被封禁,请认准本项目唯一官方仓库地址[https://github.com/docmirror/dev-sidecar](https://github.com/docmirror/dev-sidecar) 【狗头保命】 -> -> 我将继续奋战在开源一线,为社区贡献更多更好的开源项目。 -> -> 感兴趣的可以关注我的主页 [【github】](https://github.com/greper) [【gitee】](https://gitee.com/greper) +```bash +# 安装依赖 +npm install -## 打个广告 +# 启动开发环境 +npm run tauri dev -> [https://github.com/certd/certd](https://github.com/certd/certd) -> -> 我的开源证书管理工具项目,全自动申请和部署证书,有需求的可以去试试,帮忙点个star - -## 重要提醒 - -> ------------------------------重要提醒1--------------------------------- -> -> 注意:由于electron无法监听windows的关机事件,开着ds情况下直接重启电脑,会导致无法上网,你可以手动启动ds即可恢复网络,你也可以将ds设置为开机自启。 -> -> 关于此问题的更多讨论请前往:[https://github.com/docmirror/dev-sidecar/issues/109](https://github.com/docmirror/dev-sidecar/issues/109) -> -> 注:此问题已在 `1.8.9` 版本中得到解决。 - -> ------------------------------重要提醒2--------------------------------- -> -> 注意:本应用启动会自动修改系统代理,所以会与其他代理软件有冲突,一起使用时请谨慎使用。 -> -> 与 `Watt Toolkit(原Steam++)` 共用时,请以hosts模式启动Watt Toolkit -> -> 与 `TUN网卡模式运行的游戏加速器` 可以共用 -> -> 本应用主要目的在于直连访问github,如果你已经有飞机了,那建议还是不要用这个自行车(ds)了 - -## 一、 特性 - -### 1.1、 dns优选(解决\*\*\*污染问题) - -- 根据网络状况智能解析最佳域名ip地址,获取最佳网络速度 -- 解决一些网站和库无法访问或访问速度慢的问题 -- 建议遇到打开比较慢的国外网站,可以优先尝试将该域名添加到dns设置中(注意:被\*\*\*封杀的无效) - -### 1.2、 请求拦截 - -- 拦截打不开的网站,代理到加速镜像站点上去。 -- 可配置多个镜像站作为备份 -- 具备测速机制,当访问失败或超时之后,自动切换到备用站点,使得目标服务高可用 - -### 1.3、 github加速 - -- github 直连加速 (通过修改sni实现,感谢 [fastGithub](https://github.com/dotnetcore/FastGithub) 提供的思路) -- release、source、zip下载加速 -- clone 加速 -- 头像加速 -- 解决readme中图片引用无法加载的问题 -- gist.github.com 加速 -- 解决git push 偶尔失败需要输入账号密码的问题(fatal: TaskCanceledException encountered / fatal: HttpRequestException encountered) -- raw/blame加速 - -> 以上部分功能通过 `X.I.U` 的油猴脚本实现, 以下是仓库和脚本下载链接,大家可以去支持一下。 -> -> - [https://github.com/XIU2/UserScript](https://github.com/XIU2/UserScript) -> - [https://greasyfork.org/scripts/412245](https://greasyfork.org/scripts/412245) -> -> 由于此脚本在ds中是打包在本地的,更新会不及时,你可以直接通过浏览器安装油猴插件使用此脚本,从而获得最新更新(ds本地的可以通过 `加速服务->基本设置->启用脚本` 进行关闭)。 - -### 1.4、 Stack Overflow 加速 - -- 将ajax.google.com代理到加速CDN上 -- recaptcha 图片验证码加速 - -### 1.5、 npm加速 - -- 支持开启npm代理 -- 官方与淘宝npm registry一键切换 -- 某些npm install的时候,并且使用cnpm也无法安装时,可以尝试开启npm代理再试 - -**_安全警告_**: - -- 请勿使用来源不明的服务/远程配置地址,有隐私和账号泄露风险 -- 本应用及服务/默认远程配置端承诺不收集任何信息。介意者请使用安全模式。 - -## 二、快速开始 - -支持windows、Mac、Linux(Ubuntu) - -### 2.1、DevSidecar桌面应用 - -#### 1)下载安装包 - -- release下载 - [Github Release](https://github.com/docmirror/dev-sidecar/releases) - -> Windows: 请选择DevSidecar-x.x.x-windows-universal.exe -> -> Mac: 请选择DevSidecar-x.x.x-macos-universal.dmg -> -> Debian系及其他支持deb安装包的Linux: 请选择DevSidecar-x.x.x-linux-[架构].deb -> -> 其他Linux: 请选择DevSidecar-x.x.x-linux-[架构].AppImage (未做测试,不保证能用) - -> linux安装说明请参考 [linux安装文档](./doc/linux.md) - -> 注意:由于没有买应用证书,所以应用在下载安装时会有“未知发行者”等安全提示,选择保留即可。 - -#### 2)安装后打开 - -界面应大致如下图所示: - -> 注意:mac版安装需要在“系统偏好设置->安全性与隐私->通用”中解锁并允许应用安装 - -![](./doc/index.png) - -#### 3)安装根证书 - -第一次打开会提示安装证书,根据提示操作即可 - -更多有关根证书的说明,请参考 [为什么要安装根证书?](./doc/caroot.md) - -> 根证书是本地随机生成的,所以不用担心根证书的安全问题(本应用不收集任何用户信息) -> -> 你也可以在加速服务设置中自定义根证书(PEM格式的证书与私钥) - -> 火狐浏览器需要[手动安装证书](#3火狐浏览器火狐浏览器不走系统的根证书需要在选项中添加根证书) - -#### 4)开始加速吧 - -去试试打开github、huggingface、docker hub吧 - -### 2.2、开启前 vs 开启后 - -| | 开启前 | 开启后 | -| -------- | ------------------------------ | ------------------------------------------------- | -| 头像 | ![](./doc/avatar2.png) | ![](./doc/avatar1.png) | -| clone | ![](./doc/clone-before.png) | ![](./doc/clone.png) | -| zip 下载 | ![](./doc/download-before.png) | ![](./doc/download.png)秒下的,实在截不到速度的图 | - -## 三、模式说明 - -### 3.1、安全模式 - -- 此模式:关闭拦截、关闭增强、不使用远程配置、开启dns优选、开启测速 -- 最安全,无需安装证书,可以在浏览器地址栏左侧查看域名证书 -- 功能也最弱,只有特性1,相当于查询github的国外ip,手动改hosts一个意思。 -- github的可访问性不稳定,取决于IP测速,如果有绿色ip存在,就 `有可能` 可以直连访问。 - ![](./doc/speed.png) - -### 3.2、默认模式 - -- 此模式:开启拦截、关闭增强、使用远程配置、开启dns优选、开启测速 -- 需要安装证书,通过修改sni直连访问github -- 功能上包含特性1/2/3/4。 - -## 四、 最佳实践 - -- 把dev-sidecar一直开着就行了(注意部分版本的windows下开着ds重启电脑,可能会无法上网,重新打开ds即可。) -- 建议遇到打开比较慢的国外网站,可以尝试将该域名添加到dns设置中(注意:被\*\*\*封杀的无效) - -### 其他加速 - -#### 1)git clone 加速 - -- 方式1:快捷复制: - - > 开启脚本支持,然后在复制clone链接下方,即可复制到加速链接 - -- 方式2: - - > 1. 使用方式:用实际的名称替换 `{}` 的内容,即可加速clone [https://hub.fastgit.org/{username}/{reponame}.git](https://hub.fastgit.org/%7Busername%7D/%7Breponame%7D.git) - > 2. clone 出来的 remote "origin" 为fastgit的地址,需要手动改回来 - > 3. 你也可以直接使用他们的clone加速工具 [fgit-go](https://github.com/FastGitORG/fgit-go) - -#### 2)`github.com` 的镜像网站(注意:部分镜像网站不能登录) - -> 1. ~~[hub.fastgit.org](https://hub.fastgit.org/) (2024/11/18:这个好像失效了?)~~ -> 2. ~~[github.com.cnpmjs.org](https://github.com.cnpmjs.org/) 这个很容易超限(2024/11/18:这个好像失效了?)~~ -> 3. [bgithub.xyz](https://bgithub.xyz/)(edge浏览器可能报毒) -> 4. [kkgithub.com](https://kkgithub.com/)(目前正在维护中) - -## 五、api - -### 5.1、拦截配置 - -没有配置域名的不会拦截,其他根据配置进行拦截处理。 - -在【加速服务-拦截设置】中配置,格式如下:(更多内容参见[wiki](https://github.com/docmirror/dev-sidecar/wiki/%E5%8A%A0%E9%80%9F%E6%9C%8D%E5%8A%A1%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E)) - -```json -{ - // 要拦截的域名 - "github.com": { - // 需要拦截url的正则表达式 - "/.*/.*/releases/download/": { - // 拦截类型 - // "redirect": "url", // 临时重定向(url会变,一些下载资源可以通过此方式配置) - // "proxy": "url", // 代理(url不会变,没有跨域问题) - // "abort": true, // 取消请求(适用于被***封锁的资源,找不到替代,直接取消请求,快速失败,节省时间) - // "success": true, // 直接返回成功请求(某些请求不想发出去,可以伪装成功返回) - // "cacheDays": 1, // GET请求的使用缓存,单位:天(常用于一些静态资源) - // "options": true, // OPTIONS请求直接返回成功请求(该功能存在一定风险,请谨慎使用) - // "optionsMaxAge": 2592000, // OPTIONS请求缓存时间,默认:2592000(一个月) - - // 拦截配置示例: - "redirect": "download.fastgit.org" - }, - ".*": { - "proxy": "github.com", - "sni": "baidu.com" // 修改sni,规避***握手拦截 - } - }, - "ajax.googleapis.com": { - ".*": { - "proxy": "ajax.loli.net", // 代理请求,url不会变 - "backup": ["ajax.proxy.ustclug.org"], // 备份,当前代理请求失败后,将会切换到备用地址 - "test": "ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js", - "replace": "/(.*)/xxx" // 当加速地址的链接和原链接不是完全相同时,可以通过正则表达式replace,此时proxy通过$1$2来重组url, proxy:'ajax.loli.net/xxx/$1' - } - }, - "clients*.google.com": { - ".*": { - "abort": true // 取消请求,被***封锁的资源,找不到替代,直接取消请求,快速失败,节省时间 - } - } -} -``` - -### 5.2、DNS优选配置 - -某些域名解析出来的ip会无法访问,(比如api.github.com会被解析到新加坡的ip上,新加坡的服务器在上午挺好,到了晚上就卡死,基本不可用) - -通过从dns上获取ip列表,切换不同的ip进行尝试,最终会挑选到一个最快的ip(该功能需要事先配置好所用DNS),更多说明参见[wiki](https://github.com/docmirror/dev-sidecar/wiki/%E5%8A%A0%E9%80%9F%E6%9C%8D%E5%8A%A1%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E) - -```json -{ - "dns": { - "mapping": { - "api.github.com": "cloudflare", // "解决push的时候需要输入密码的问题", - "gist.github.com": "cloudflare", // 解决gist无法访问的问题 - "*.githubusercontent.com": "cloudflare" // 解决github头像经常下载不到的问题 - } - } -} -``` - -注意:暂时只支持IPv4的解析 - -## 六、问题排查 - -### 6.1、dev-sidecar的前两个开关没有处于打开状态 - -1. 尝试将开关按钮手动打开 -2. 请尝试右键dev-sidecar图标,点退出。再重新打开 -3. 如果还不行,请将日志发送给作者 - -如果是mac系统,可能是下面的原因 - -#### 1)Mac系统使用时,首页的系统代理开关无法打开 - -出现这个问题可能是没有开启系统代理命令的执行权限 - -``` -networksetup -setwebproxy 'WiFi' 127.0.0.1 31181 -#看是否有如下错误提示 -** Error: Command requires admin privileges. -``` - -如果有上面的错误提示,请尝试如下方法: - -> 取消访问偏好设置需要管理员密码 -> -> 系统偏好设置—>安全性与隐私—> 通用—> 高级—> 访问系统范围的偏好设置需要输入管理员密码(取消勾选) - -### 6.2、没有加速效果 - -1. 本应用默认仅开启https加速,一般足够覆盖需求。 - 如果你访问的是仅支持http协议的网站,请手动在【系统代理】中打开【代理HTTP请求】 -2. 检查浏览器是否装了什么插件,与ds有冲突 -3. 检查是否安装了其他代理软件,与ds有冲突 -4. 请确认浏览器的代理设置为使用IE代理/或者使用系统代理状态 -5. 可以尝试换个浏览器试试 -6. 请确认网络代理设置处于勾选状态 - 正常情况下ds在“系统代理”开关打开时,会自动设置系统代理。 - -### 6.3、浏览器打开提示证书不受信任 - -![](./doc/crt-error.png) - -一般是证书安装位置不对,重新安装根证书后,重启浏览器 - -#### 1)windows: 请确认证书已正确安装在“本地计算机-将所有的证书都放入下列存储:受信任的根证书颁发机构”下 - -#### 2)mac: 请确认证书已经被安装并已经设置信任 - -#### 3)火狐浏览器:火狐浏览器不走系统的根证书,需要在选项中添加根证书 - -1. 火狐浏览器->选项->隐私与安全->证书->查看证书 - ![](./doc/Firefox/1.png) -2. 证书颁发机构->导入 -3. 选择证书文件 `C:\Users(用户)\Administrator(你的账号)\.dev-sidecar\dev-sidecar.ca.crt`(Mac或linux为 `~/.dev-sidecar` 目录) - ![](./doc/Firefox/2.png) -4. 勾选信任由此证书颁发机构来标识网站,确定即可 - ![](./doc/Firefox/3.png) - -### 6.4、打开github显示连接超时 - -```html -DevSidecar Warning: Error: www.github.com:443, 代理请求超时 -``` - -1. 检查测速界面github.com是否有ip ,如果没有ip,则可能是由于你的网络提供商封锁了dns服务商的ip(试试能否ping通:1.1.1.1 / 9.9.9.9 ) -2. 如果是安全模式,则是因为不稳定导致的,等一会再刷新试试 -3. 如果是增强模式,则是由于访问人数过多,正常现象 - -### 6.5、查看日志是否有报错 - -如果还是不行,请在下方加官方QQ群或提issue,附上服务日志(server.log)以便进行分析 - -日志打开方式:加速服务->右边日志按钮->打开日志文件夹 - -![](./doc/log.png) - -### 6.6、某些原本可以打开的网站打不开了 - -1. 可以尝试关闭pac -2. 可以将域名加入白名单 - -### 6.7、应用意外关闭导致没有网络了 - -应用开启后会自动修改系统代理设置,正常退出会自动关闭系统代理 -当应用意外关闭时,可能会因为没有将系统代理恢复,从而导致完全无法上网。 - -对于此问题有如下几种解决方案可供选择: - -1. 重新打开应用即可(右键应用托盘图标可完全退出,将会正常关闭系统代理设置) -2. 如果应用被卸载了,此时需要[手动关闭系统代理设置](./doc/recover.md) -3. 如果你是因为开着ds的情况下重启电脑导致无法上网,你可以设置ds为开机自启 - -### 6.8、卸载应用后上不了网,git请求不了 - -如果你在卸载应用前,没有正常退出app,就有可能无法上网。请按如下步骤操作恢复您的网络: - -1、关闭系统代理设置,参见:[手动关闭系统代理设置](./doc/recover.md) -2、执行下面的命令关闭git的代理设置(如果你开启过 `Git.exe代理` 的开关) - -```shell -git config --global --unset http.proxy -git config --global --unset https.proxy -git config --global --unset http.sslVerify -``` - -3、执行下面的命令关闭npm的代理设置(如果你开启过npm加速的开关) - -```shell -npm config delete proxy -npm config delete https-proxy -``` - -### 6.9、其他问题 - -请查阅[wiki](https://github.com/docmirror/dev-sidecar/wiki) - -也可以查阅[有文档tag的issue](https://github.com/docmirror/dev-sidecar/issues?q=is%3Aissue%20label%3ADocumentation),它们被开发者认证为相当于文档级别的参考issue。 - -## 七、在其他程序使用 - -- [java程序使用](./doc/other.md#Java程序使用) - -## 八、贡献代码 - -### 8.1、准备环境 - -#### 1)安装 `nodejs` 及其他环境 - -推荐安装 nodejs `22.x.x` 的版本,其他版本未做测试 - -Windows上需要msvc,推荐使用VS 2022(node-gyp对VS 2026支持可能存在问题),安装时选择C++桌面开发工作负载即可。 - -另外还需要带distutils的python,推荐安装自带setuptools的python 3.11版本。如果本地有uv,则可以简单的运行以下命令 - -```shell -uv init . -uv sync -.venv/Scripts/activate.ps1 # for windows pwsh -.venv/Scripts/activate.bat # for windows cmd -source .venv/bin/activate # for linux/mac -``` - -这会根据.python-version文件自动安装python 3.11版本。如不想使用python 3.11,也可删除.python-version文件,pyproject.toml已经指定了所需依赖。 - -#### 2)安装 `pnpm` - -运行如下命令即可安装: - -```shell -npm install -g pnpm --registry=https://registry.npmmirror.com -``` - -### 8.2、开发调试模式启动 - -运行如下命令即可开发模式启动 - -```shell -# 拉取代码 -git clone https://github.com/docmirror/dev-sidecar - -cd dev-sidecar - -# 注意不要使用 `npm install` 来安装依赖,因为 `pnpm` 会自动安装依赖 -pnpm install - -# 运行DevSidecar -cd packages/gui -npm run electron - -``` - -> 如果electron依赖包下载不动,可以开启ds的npm加速 -> 如果pnpm install只是单纯卡住,大概是因为你忘记进python环境了 - -### 8.3、打包成可执行文件 - -```shell -# 先执行上面的步骤,然后运行如下命令打包成可执行文件 -npm run electron:build -``` - -### 8.4、提交pr - -如果你想将你的修改贡献出来,请提交pr - -## 九、联系作者 - -欢迎bug反馈,需求建议,技术交流等 - -加官方QQ群(请备注dev-sidecar,或简称DS) - -- QQ 1群:390691483,人数:500 / 500(满) -- QQ 2群:[667666069](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=n4nksr4sji93vZtD5e8YEHRT6qbh6VyQ&authKey=XKBZnzmoiJrAFyOT4V%2BCrgX5c13ds59b84g%2FVRhXAIQd%2FlAiilsuwDRGWJct%2B570&noverify=0&group_code=667666069),人数:500 / 500(满) -- QQ 3群:419807815,人数:500 / 500(满) -- QQ 4群:[438148299](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=i_NCBB5f_Bkm2JsEV1tLs2TkQ79UlCID&authKey=nMsVJbJ6P%2FGNO7Q6vsVUadXRKnULUURwR8zvUZJnP3IgzhHYPhYdcBCHvoOh8vYr&noverify=0&group_code=438148299),人数:1004 / 2000(推荐) -- QQ 5群:[767622917](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=nAWi_Rxj7mM4Unp5LMiatmUWhGimtbcB&authKey=aswmlWGjbt3GIWXtvjB2GJqqAKuv7hWjk6UBs3MTb%2Biyvr%2Fsbb1kA9CjF6sK7Hgg&noverify=0&group_code=767622917),人数:200 / 500 - -## 十、求star - -我的其他项目求star - -- [fast-crud](https://github.com/fast-crud/fast-crud) : 开发crud快如闪电 -- [certd](https://github.com/certd/certd) : 让你的证书永不过期 -- [trident-sync](https://github.com/handsfree-work/trident-sync) : 二次开发项目同步升级工具 - -## 十一、感谢 - -本项目曾使用lerna包管理工具 - -[![lerna](https://img.shields.io/badge/maintained%20with-lerna-cc00ff.svg)](https://lerna.js.org/) - -本项目参考如下开源项目 - -- [node-mitmproxy](https://github.com/wuchangming/node-mitmproxy) -- [ReplaceGoogleCDN](https://github.com/justjavac/ReplaceGoogleCDN) - -特别感谢 - -- [github增强油猴脚本](https://greasyfork.org/zh-CN/scripts/412245-github-%E5%A2%9E%E5%BC%BA-%E9%AB%98%E9%80%9F%E4%B8%8B%E8%BD%BD) 本项目部分加速功能完全复制该脚本。 -- [中国域名白名单](https://github.com/pluwen/china-domain-allowlist),本项目的系统代理排除域名功能中,使用了该白名单。 - -本项目部分加速资源由如下组织提供 - -- [FastGit UK](https://fastgit.org/) +# 构建生产版本 +npm run tauri build diff --git "a/_script/0\343\200\201updateDependencies.bat" "b/_script/0\343\200\201updateDependencies.bat" deleted file mode 100644 index 84a238f0df..0000000000 --- "a/_script/0\343\200\201updateDependencies.bat" +++ /dev/null @@ -1,15 +0,0 @@ -node -v - -# 安装ncu -# npm install -g npm-check-updates - -cd ../packages/core -ncu -u - -# cd ../packages/gui -# ncu -u - -# cd ../packages/mitmproxy -# ncu -u - -cmd diff --git "a/_script/1\343\200\201setupEnv.bat" "b/_script/1\343\200\201setupEnv.bat" deleted file mode 100644 index 7fb29b1291..0000000000 --- "a/_script/1\343\200\201setupEnv.bat" +++ /dev/null @@ -1,6 +0,0 @@ -node -v - -cd ../ -npm install -g pnpm --registry=https://registry.npmmirror.com - -cmd diff --git "a/_script/2\343\200\201installProject.bat" "b/_script/2\343\200\201installProject.bat" deleted file mode 100644 index 51d12d3e82..0000000000 --- "a/_script/2\343\200\201installProject.bat" +++ /dev/null @@ -1,7 +0,0 @@ -node -v - -cd ../ -chcp 65001 -pnpm install --registry=https://registry.npmmirror.com - -cmd diff --git "a/_script/3\343\200\201buildAndRun.bat" "b/_script/3\343\200\201buildAndRun.bat" deleted file mode 100644 index 86fa14a1bc..0000000000 --- "a/_script/3\343\200\201buildAndRun.bat" +++ /dev/null @@ -1,7 +0,0 @@ -node -v - -cd ../packages/gui -chcp 65001 -npm run electron - -cmd diff --git "a/_script/4.1\343\200\201runTestCore.bat" "b/_script/4.1\343\200\201runTestCore.bat" deleted file mode 100644 index 08374b3e86..0000000000 --- "a/_script/4.1\343\200\201runTestCore.bat" +++ /dev/null @@ -1,6 +0,0 @@ -node -v - -cd ../packages/core -pnpm run test - -cmd diff --git "a/_script/4.2\343\200\201runTestMitmproxy.bat" "b/_script/4.2\343\200\201runTestMitmproxy.bat" deleted file mode 100644 index 24a0ba45c8..0000000000 --- "a/_script/4.2\343\200\201runTestMitmproxy.bat" +++ /dev/null @@ -1,6 +0,0 @@ -node -v - -cd ../packages/mitmproxy -pnpm run test - -cmd diff --git "a/_script/5\343\200\201generateSetupFile.bat" "b/_script/5\343\200\201generateSetupFile.bat" deleted file mode 100644 index 3d8e253493..0000000000 --- "a/_script/5\343\200\201generateSetupFile.bat" +++ /dev/null @@ -1,10 +0,0 @@ -node -v - -cd ../packages/gui - -if not exist "dist_electron" mkdir "dist_electron" -start dist_electron - -npm run electron:build - -cmd diff --git a/_script/electron-dev.mjs b/_script/electron-dev.mjs deleted file mode 100644 index 1c2d67ff15..0000000000 --- a/_script/electron-dev.mjs +++ /dev/null @@ -1,110 +0,0 @@ -import { spawn } from 'node:child_process' -import { createRequire } from 'node:module' -import process from 'node:process' -import { setTimeout as delay } from 'node:timers/promises' - -const guiDir = process.cwd() -const require = createRequire(import.meta.url) - -const devServerUrl = 'http://localhost:8080' -const state = { - closing: false, - devServer: null, - electron: null, -} - -function spawnCommand (entry, args = [], extraEnv = {}) { - return spawn(entry, args, { - cwd: guiDir, - env: { ...process.env, ...extraEnv }, - shell: false, - stdio: 'inherit', - windowsHide: false, - }) -} - -function resolveVueCliServiceBin () { - return require.resolve('@vue/cli-service/bin/vue-cli-service.js', { - paths: [guiDir], - }) -} - -function resolveElectronBin () { - return require('electron') -} - -async function waitForServer (url, child) { - const timeoutAt = Date.now() + 120000 - - while (Date.now() < timeoutAt) { - if (child.exitCode != null || child.signalCode != null) { - throw new Error('Dev server exited before it became ready') - } - - try { - const response = await fetch(url, { method: 'GET' }) - if (response.ok || response.status >= 200) { - return - } - } catch { - // Keep polling until the dev server is reachable. - } - - await delay(500) - } - - throw new Error(`Timed out waiting for ${url}`) -} - -function stopChild (child) { - if (!child || child.exitCode != null || child.signalCode != null) { - return - } - - child.kill('SIGTERM') -} - -async function shutdown (code = 0) { - if (state.closing) { - return - } - - state.closing = true - stopChild(state.electron) - stopChild(state.devServer) - process.exitCode = code -} - -process.on('SIGINT', () => { - void shutdown(0) -}) -process.on('SIGTERM', () => { - void shutdown(0) -}) - -async function main () { - const vueCliServiceBin = resolveVueCliServiceBin() - const electronBin = resolveElectronBin() - - state.devServer = spawnCommand(process.execPath, [vueCliServiceBin, 'serve', '--port', '8080']) - state.devServer.on('exit', (code, signal) => { - if (!state.closing) { - void shutdown(code ?? (signal ? 1 : 0)) - } - }) - - try { - await waitForServer(devServerUrl, state.devServer) - state.electron = spawnCommand(electronBin, ['.'], { - WEBPACK_DEV_SERVER_URL: devServerUrl, - }) - state.electron.on('exit', (code, signal) => { - void shutdown(code ?? (signal ? 1 : 0)) - }) - } catch (error) { - console.error(error) - await shutdown(1) - } -} - -void main() diff --git a/_script/linux-arm64-prepare.sh b/_script/linux-arm64-prepare.sh deleted file mode 100644 index 3dc9a2ba7d..0000000000 --- a/_script/linux-arm64-prepare.sh +++ /dev/null @@ -1,4 +0,0 @@ -cd $GITHUB_WORKSPACE/packages/gui -rm vue.config.js -cp linux-arm64.vue.config.js vue.config.js -cd $GITHUB_WORKSPACE \ No newline at end of file diff --git a/doc/Firefox/1.png b/doc/Firefox/1.png deleted file mode 100644 index b868d52cad..0000000000 Binary files a/doc/Firefox/1.png and /dev/null differ diff --git a/doc/Firefox/2.png b/doc/Firefox/2.png deleted file mode 100644 index 1a90cfbe87..0000000000 Binary files a/doc/Firefox/2.png and /dev/null differ diff --git a/doc/Firefox/3.png b/doc/Firefox/3.png deleted file mode 100644 index c0979859a8..0000000000 Binary files a/doc/Firefox/3.png and /dev/null differ diff --git a/doc/avatar1.png b/doc/avatar1.png deleted file mode 100644 index 623aa93641..0000000000 Binary files a/doc/avatar1.png and /dev/null differ diff --git a/doc/avatar2.png b/doc/avatar2.png deleted file mode 100644 index 680f09bc66..0000000000 Binary files a/doc/avatar2.png and /dev/null differ diff --git a/doc/caroot.md b/doc/caroot.md deleted file mode 100644 index e996b965c7..0000000000 --- a/doc/caroot.md +++ /dev/null @@ -1,59 +0,0 @@ -# 关于信任根证书的说明 - -## 一、为什么要信任根证书。 - -要回答这个问题需要先掌握下面两个知识点 - -### 知识点1:什么是根证书 - -[百度百科-什么是根证书](https://baike.baidu.com/item/%E6%A0%B9%E8%AF%81%E4%B9%A6/9874620?fr=aladdin) - -当访问目标网站是https协议时,服务器会发送一个由根证书签发的网站ssl证书给浏览器,让浏览器用这个ssl证书给数据加密。 -浏览器需要先验证这个证书的真伪,之后才会使用证书加密。 -证书的真伪是通过验证证书的签发机构的证书是否可信,一直追溯到最初始的签发机构的证书(根证书)。 -浏览器只需信任根证书,间接的就信任了这条证书链下签发的所有证书。 - -windows、mac、linux或者浏览器他们都内置了市面上可信的大型证书颁发机构的根证书。 - -### 知识点2:中间人攻击 - -本应用的实现原理如下图: - -![](./flow.jpg) - -> 简单来说就是DevSidecar在本地启动了一个代理服务器帮你访问目标网站。 -> 实际上就是 [中间人攻击](https://baike.baidu.com/item/%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/1739730?fr=aladdin) 的原理,只是本应用没有用它来干坏事,而是帮助开发者加速目标网站的访问。 - -### 现在可以回答为什么要信任根证书 - -当目标网站不需要加速拦截时,直接走TCP转发,不需要中间人攻击,没有安全风险,在此不多做讨论。 - -当目标网站需要拦截时(例如github),就需要通过中间人攻击修改请求或者请求其他替代网站,从而达到加速的目的。 - -例如加速github就需要修改如下几处 - -1. 直连访问github需要修改tls握手时的sni域名,规避\*\*\*的sni阻断问题。 -2. asserts.github.com等静态资源拦截替换成fastgit.org的镜像地址 - -DevSidecar在第一次启动时会在本地随机生成一份根证书,当有用户访问github时,就用这份根证书来签发一份假的叫github.com的证书。 -如果浏览器事先信任了这份根证书,那么就可以正常访问DevSidecar返回的网页内容了。 - -## 二、信任根证书有安全风险吗 - -1. 根证书是DevSidecar第一次启动时本地随机生成的,除了你这台电脑没人知道这份根证书的内容。 -2. 代理请求目标网站时会校验目标网站的证书(除非关闭了`代理校验ssl`)。 - -> 两段链路都是安全的,所以信任根证书没有问题。 -> 但如果应用本身来源不明,或者`拦截配置`里的替代网站作恶,则有安全风险。 - -> 对于应用来源风险: -> 请勿从未知网站下载DevSidecar应用,认准官方版本发布地址 -> [Github Release](https://github.com/docmirror/dev-sidecar/releases) -> -> 或者从源码自行编译安装 - -> 对于拦截配置里的替代网站风险: -> -> 1. 尽量缩小替代配置的范围 -> 2. 不使用来源不明的镜像地址,尽量使用知名度较高的镜像地址 -> 3. 你甚至可以将其他拦截配置全部删除,只保留github相关配置 diff --git a/doc/chatgpt2.png b/doc/chatgpt2.png deleted file mode 100644 index 3805596700..0000000000 Binary files a/doc/chatgpt2.png and /dev/null differ diff --git a/doc/clone-before.png b/doc/clone-before.png deleted file mode 100644 index a9dedd7679..0000000000 Binary files a/doc/clone-before.png and /dev/null differ diff --git a/doc/clone.png b/doc/clone.png deleted file mode 100644 index 2d5866d2e6..0000000000 Binary files a/doc/clone.png and /dev/null differ diff --git a/doc/crt-error.png b/doc/crt-error.png deleted file mode 100644 index 79646c4deb..0000000000 Binary files a/doc/crt-error.png and /dev/null differ diff --git a/doc/download-before.png b/doc/download-before.png deleted file mode 100644 index ba13c0b6dc..0000000000 Binary files a/doc/download-before.png and /dev/null differ diff --git a/doc/download.png b/doc/download.png deleted file mode 100644 index b79c2f0e32..0000000000 Binary files a/doc/download.png and /dev/null differ diff --git a/doc/flow.jpg b/doc/flow.jpg deleted file mode 100644 index 1703c00881..0000000000 Binary files a/doc/flow.jpg and /dev/null differ diff --git a/doc/gitee.png b/doc/gitee.png deleted file mode 100644 index 7e7e48d795..0000000000 Binary files a/doc/gitee.png and /dev/null differ diff --git a/doc/index.png b/doc/index.png deleted file mode 100644 index 9c3424164b..0000000000 Binary files a/doc/index.png and /dev/null differ diff --git a/doc/linux.md b/doc/linux.md deleted file mode 100644 index 74294c7af8..0000000000 --- a/doc/linux.md +++ /dev/null @@ -1,70 +0,0 @@ -# Linux 支持 - -`Linux`使用说明,目前仅官方支持`Ubuntu x86_64 GNOME桌面版(原版)`,其他`Linux`未测试 - -> 注意:需要开启 [sudo 免密支持](https://www.jianshu.com/p/5d02428f313d),否则请自行安装证书 - -## 一、安装 - -### 1.1. Ubuntu / Debian或其衍生版(未测试) - -- 下载`DevSidecar-x.x.x.deb` -- 使用 root 执行命令安装 `dpkg -i DevSidecar-x.x.x.deb` -- 去应用列表里面找到 dev-sidecar 应用,打开即可 - -### 1.2. 其他基于glibc的Linux系统(未测试) - -- 下载 `DevSidecar-x.x.x.AppImage` -- 设置可执行权限 `chmod +x DevSidecar-x.x.x.AppImage` -- 双击运行 - -### 1.3. 特殊的Linux系统(如Alpine和Chimera Linux) - -> 此处默认用户有较专业的Linux知识,故不详细描述,请参考并自行试验 -- 创建Debian(最方便且省空间)容器,可使用distrobox(推荐),接下来以此为例说明 -- 下载deb包并在容器内安装 -- 穿透系统设置: - 在容器内 `/usr/bin/gsettings` 文件写入: - - ```bash - #!/bin/sh - distrobox-host-exec gsettings "$@" - ``` - 并设置可执行权限 - - 简化版命令(请在容器内执行): - ``` - echo -e '#!/bin/sh\ndistrobox-host-exec gsettings "$@"' >/usr/bin/gsettings - ``` -- 使用命令启动应用,使用“自动安装证书”功能,回到终端,找到输出里含有 `sudo` 的两句命令,复制到主系统执行,如失败(或使用其他证书系统),请自行安装证书,可参考 [议题 #204](https://github.com/docmirror/dev-sidecar/issues/204) - -### 1.4. 版本选择 - -不同CPU架构,选择对应的版本,如果安装失败,请下载 `universal` 版本 - - -## 二、证书安装 - -默认模式和增强模式需要系统信任CA证书。 -由于Linux上火狐和Chrome都不走系统证书,所以除了安装系统证书之外,还需要给浏览器安装证书 - -### 2.1. 系统证书安装 - -根据弹出的提示: - -- 点击首页右上角“安装根证书”按钮 -- 点击“点此去安装” -- 提示安装成功即可 - -### 2.2. 火狐浏览器安装证书 - -- 火狐浏览器->选项->隐私与安全->证书->查看证书 -- 证书颁发机构->导入 -- 选择证书文件在 `~/.dev-sidecar` 目录下 -- 勾选信任由此证书颁发机构来标识网站,确定即可 - -### 2.3. Chrome浏览器安装证书 - -证书文件目录为 `~/.dev-sidecar` - -![](../packages/gui/public/setup-linux.png) diff --git a/doc/log.png b/doc/log.png deleted file mode 100644 index 33e71f9bbc..0000000000 Binary files a/doc/log.png and /dev/null differ diff --git a/doc/mac-proxy.png b/doc/mac-proxy.png deleted file mode 100644 index 25ffdca801..0000000000 Binary files a/doc/mac-proxy.png and /dev/null differ diff --git a/doc/me.png b/doc/me.png deleted file mode 100644 index ad62080325..0000000000 Binary files a/doc/me.png and /dev/null differ diff --git a/doc/other.md b/doc/other.md deleted file mode 100644 index 02a95c3ce1..0000000000 --- a/doc/other.md +++ /dev/null @@ -1,27 +0,0 @@ -# 其他程序使用 - -## Java程序使用 - -> 由 [Enaium](https://github.com/Enaium) 提供,未做验证,可供参考 - -1. 先通过keytool安装证书: - - ```shell - keytool -import -alias dev-sidecar -keystore "jdk路径\security\cacerts" -file 用户目录\.dev-sidecar\dev-sidecar.ca.crt - ``` - 默认密码为 `changeit` - -2. 启动时还需要设置参数,例: - - ```shell - java -Dhttp.proxyHost=localhost -Dhttp.proxyPort=31181 -Dhttps.proxyHost=localhost -Dhttps.proxyPort=31181 -jar xxxx.jar - ``` - -3. Gradle还需在`用户目录/.gradle/gradle.properties`创建配置文件: - - ```properties - systemProp.http.proxyHost=localhost - systemProp.http.proxyPort=31181 - systemProp.https.proxyHost=localhost - systemProp.https.proxyPort=31181 - ``` diff --git a/doc/proxy.png b/doc/proxy.png deleted file mode 100644 index eda48eaa8b..0000000000 Binary files a/doc/proxy.png and /dev/null differ diff --git a/doc/qq_group.png b/doc/qq_group.png deleted file mode 100644 index 978236f9ce..0000000000 Binary files a/doc/qq_group.png and /dev/null differ diff --git a/doc/recover.md b/doc/recover.md deleted file mode 100644 index 7baf4ed012..0000000000 --- a/doc/recover.md +++ /dev/null @@ -1,26 +0,0 @@ -# 卸载与恢复网络 - -由于应用启动后会自动设置系统代理,正常退出时会关闭系统代理。 -当应用意外关闭,或者未正常退出后被卸载,此时会因为系统代理没有恢复从而导致完全上不了网。 -目前electron在windows系统上无法监听系统重启事件。更多相关资料 [electron issues](https://github.com/electron/electron/pull/24261) - -## 恢复代理设置 - -### 1、windows 代理关闭 - -如何打开查看windows代理设置: - -- win10: 开始->设置->网络和Internet->最下方代理 -- win7: 开始->控制面板->网络和Internet->网络和共享中心->左下角Internet选项->连接选项卡->局域网设置 - -![windows](./proxy.png) - -### 2、mac 代理关闭 - -网络->网卡->代理->去掉http和https的两个勾 - -![](./mac-proxy.png) - -### 3、Linux(Ubuntu) - -网络->代理->选择禁用 diff --git a/doc/setup.png b/doc/setup.png deleted file mode 100644 index a6a44deaf8..0000000000 Binary files a/doc/setup.png and /dev/null differ diff --git a/doc/speed.png b/doc/speed.png deleted file mode 100644 index 2dcc008135..0000000000 Binary files a/doc/speed.png and /dev/null differ diff --git a/doc/wiki/Home.md b/doc/wiki/Home.md deleted file mode 100644 index d5d9594ec8..0000000000 --- a/doc/wiki/Home.md +++ /dev/null @@ -1,52 +0,0 @@ -> **给作者打个广告:**
-> [https://github.com/certd/certd](https://github.com/certd/certd) 我的开源证书管理工具项目,全自动申请和部署证书,有需求的可以去试试,帮忙点个star - -> 注:Wiki还在完善中,敬请期待更多内容。
-> 说明:以下文档均以最新版本进行编写,请下载最新版DS后,再参考以下文档使用!
- -# 一、下载安装: - -访问 https://github.com/docmirror/dev-sidecar/releases 页面,下载对应操作系统的安装程序进行安装。 - -如安装有问题,请查看 [各平台安装说明](https://github.com/docmirror/dev-sidecar/wiki/%E5%90%84%E5%B9%B3%E5%8F%B0%E5%AE%89%E8%A3%85%E8%AF%B4%E6%98%8E) - -# 二、功能使用说明: - -1. [`加速服务`使用说明](https://github.com/docmirror/dev-sidecar/wiki/%E5%8A%A0%E9%80%9F%E6%9C%8D%E5%8A%A1%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E) -2. 系统代理使用说明: -3. 通用功能使用说明: - 1. 开机自启动: - 2. 远程配置: - 3. 主题设置: - 4. 窗口设置: - 5. 检查更新: -4. 应用使用说明: - 1. NPM加速: - 2. Git.exe加速: - 3. PIP加速: - 4. 彩蛋(功能增强): -5. 帮助中心 -6. 反馈问题 - -# 三、解决问题: - -1. [解决Github访问不了或速度很慢的问题](https://github.com/docmirror/dev-sidecar/wiki/%E8%A7%A3%E5%86%B3Github%E8%AE%BF%E9%97%AE%E4%B8%8D%E4%BA%86%E6%88%96%E9%80%9F%E5%BA%A6%E5%BE%88%E6%85%A2%E7%9A%84%E9%97%AE%E9%A2%98) -2. [Linux安装证书失败的避坑](https://github.com/docmirror/dev-sidecar/issues/238) -3. [解决Linux(deb)系统下无法安装根证书的问题](https://github.com/docmirror/dev-sidecar/issues/135) -4. [在Arch/Fedora下的证书安装](https://github.com/docmirror/dev-sidecar/issues/204) -5. [Mac安装:`无法打开“dev-sidecar”,因为无法验证开发者。` 的解决方案](https://github.com/docmirror/dev-sidecar/issues/147) -6. [在 WSL 中的使用方法](https://github.com/docmirror/dev-sidecar/issues/73) - -[> 点击前往Issue区查找更多帮助信息](https://github.com/docmirror/dev-sidecar/issues) - -# 四、DevSidecar技术交流群 - -- QQ 1群:[390691483](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=hIG_VClE1CU2gHuLSSTaazMlo6M760iL&authKey=5VUMMwzH5FeabLDbZNZJbqmZk1gfmB%2B%2FlotO%2Brszz%2BW3E8xwKD2hTg2%2FV2LJEKL7&noverify=0&group_code=390691483),人数:496 / 500 -- QQ 2群:[667666069](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=n4nksr4sji93vZtD5e8YEHRT6qbh6VyQ&authKey=XKBZnzmoiJrAFyOT4V%2BCrgX5c13ds59b84g%2FVRhXAIQd%2FlAiilsuwDRGWJct%2B570&noverify=0&group_code=667666069),人数:488 / 500 -- QQ 3群:[419807815](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=zRkm0eHUhRmWWJA5O35C7BOKPZ4_gmrz&authKey=X9JHezR1BOalcEmvV6If04TN%2BIbzjAayBDaOSiuOg1SPpPguA7RqoLSHVEeo7A4e&noverify=0&group_code=419807815),人数:494 / 500 -- QQ 4群:[438148299](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=i_NCBB5f_Bkm2JsEV1tLs2TkQ79UlCID&authKey=nMsVJbJ6P%2FGNO7Q6vsVUadXRKnULUURwR8zvUZJnP3IgzhHYPhYdcBCHvoOh8vYr&noverify=0&group_code=438148299),人数:295 / 1000 -- QQ 5群:[767622917](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=nAWi_Rxj7mM4Unp5LMiatmUWhGimtbcB&authKey=aswmlWGjbt3GIWXtvjB2GJqqAKuv7hWjk6UBs3MTb%2Biyvr%2Fsbb1kA9CjF6sK7Hgg&noverify=0&group_code=767622917),人数:068 / 200(new) - -# 五、版本更新日志 - -https://github.com/docmirror/dev-sidecar/releases diff --git "a/doc/wiki/\345\212\240\351\200\237\346\234\215\345\212\241\344\275\277\347\224\250\350\257\264\346\230\216.md" "b/doc/wiki/\345\212\240\351\200\237\346\234\215\345\212\241\344\275\277\347\224\250\350\257\264\346\230\216.md" deleted file mode 100644 index c46b72f04b..0000000000 --- "a/doc/wiki/\345\212\240\351\200\237\346\234\215\345\212\241\344\275\277\347\224\250\350\257\264\346\230\216.md" +++ /dev/null @@ -1,179 +0,0 @@ -# 1. 加速服务: - -1. 什么是 `加速服务`? - - - `加速服务` 即 `代理服务`,它通过中间人攻击的方式,将网络请求拦截下来,并经过DNS加速、修改、重定向、代理等一系列的功能,达到加速访问、或访问原本无法访问的站点等目的。
-2. 如何启动加速服务:
- - 点击首页的【代理服务】右侧的开关按钮,即可启动/关闭加速服务。
- - 点击首页的【系统代理】右侧的开关按钮,即可将dev-sidecar设置/不设置为系统默认代理。(系统只能有一个默认代理,在将dev-sidecar与其他网络辅助软件共用时请谨慎开启本开关)
- - 点击首页的【NPM加速】和【Git.exe代理】右侧的开关按钮,即可启动/关闭dev-sidecar为对应软件提供的加速服务。如果你的电脑上并未安装NPM或Git,则这两个按钮将不可用,这是正常情况。 - - -# 2. 根证书使用说明: - -1. 什么是根证书:TODO -2. [为什么需要安装根证书这么高风险性的步骤](https://github.com/docmirror/dev-sidecar/blob/master/doc/caroot.md) -3. 如何安装根证书:参见dev-sidecar【首页】的【安装根证书】按钮(注意Firefox浏览器还需要一次手动导入根证书) - -# 3. 模式: - -1. 安全模式:TODO -2. 默认模式:TODO -3. 增强模式(彩蛋):TODO - -# 4. 拦截功能使用和配置说明: - -## 4.1. 拦截器类型: - -### 1)请求拦截器: -| 请求拦截器名称 | 拦截器配置名 | 请求拦截优先级 | 作用 | -| ----------------- | -------------- | ------------- | --------- | -| OPTIONS请求拦截器 | options | 101 | 直接响应200,不发送该OPTIONS请求 | -| 快速成功拦截器 | success | 102 | 直接响应200,不发送该请求 | -| 快速失败拦截器 | abort | 103 | 直接响应403,不发送该请求 | -| 缓存请求拦截器 | cacheXxx | 104 | 如果缓存还生效,直接响应304,不发送该请求
如果缓存已过期或无缓存,则发送请求
注:只对GET请求生效! | -| 重定向拦截器 | redirect | 105 | 重定向到指定地址,直接响应302,不发送该请求 | -| 请求篡改拦截器 | requestReplace | 111 | 篡改请求头,达到想要的目的 | -| 代理拦截器 | proxy | 121 | 将请求转发到指定地址 | -| SNI拦截器 | sni | 122 | 设置 `servername`,用于避开GFW | - -### 2)响应拦截器: -| 响应拦截器名称 | 拦截器配置名 | 响应拦截优先级 | 作用 | -| ---------------- | --------------- | ------------- | --------- | -| OPTIONS响应拦截器 | options | 201 | 设置跨域所需的响应头,避免被浏览器的跨域策略阻拦 | -| 缓存响应拦截器 | cacheXxx | 202 | 设置缓存所需的响应头,使浏览器缓存当前请求
注:只对GET请求生效! | -| 响应篡改拦截器 | responseReplace | 203 | 篡改响应头,避免被浏览器的安全策略阻拦 | -| 脚本拦截器 | script | 211 | 注入JavaScript脚本到页面中,如:Github油猴脚本 | - -## 4.2. 拦截配置说明书: - -TODO:内容待完善 - -# 5. 域名白名单: - -选择哪些域名不会被dev-sidecar处理。 - -**注意:** 该设置与【系统代理-自定义排除域名】的区别在于: - -1. 前者只是被dev-sidecar自身忽略,后者则是写入系统设置、不会被(任何的)系统代理处理,在手动修改系统代理设置时务必小心后者可能残留的作用! -2. 在条目较多时,前者的性能不如后者,可能产生明显延迟。
- -在config.json的 `proxy.excludeIpList:object` 中设置,**该字段**格式如下:
-> 注意:这里点号用来作为JSON object嵌套关系的缩写,冒号指明该条目的类型(主要用来区分object和list),并没有哪一个Object的key为 `proxy.excludeIpList`。为避免歧义,配置中object和list的key总不应包含点号。下同) - -```json -{ - "proxy": { - "excludeIpList": { - "example1.com": true, - "example2.com": false, - "example3.com": null, - "example4.com": { - "desc1": "域名对应字段设置为false时会被处理,null会移除现有设置(多用于远程配置)", - "desc2": "其他情况下就和设置true一样,不会被处理。因而你可以像这样插入注释", - "desc3": "同样的技巧可以用在其他本应设置一个bool值的地方", - "desc4": "原则上来说config.json不支持//形式的注释,但下文为了方便阅读,还是这么写了" - } - } - } -} -``` - -# 6. DNS服务管理: - -用来配置在dev-sidecar中需要的指定DNS,出于保密和可靠起见建议使用DoH和DoT。
-在 `server.dns.provider:object` 中设置,**其中的每个条目** 格式如下: - -## 6.1. 配置 `DNS-over-HTTPS`(简称DoH): -> 注:并非被所有DNS支持,但是保证只要能使用就一定匿名且可靠的DNS服务。 - -```json -"cloudflare": { - "type": "https", // 如果server上以"https://"开头指明了协议,就不需要写type了 - "server": "https://1.1.1.1/dns-query", - "cacheSize": 1000 -} -``` - -## 6.2. 配置 `DNS-over-TLS`(简称DoT): -> 并非被所有DNS支持,但是保证只要能使用就一定匿名且可靠的DNS服务。 - -```json -"cloudflareTLS": { - "type": "tls", // 如果server上以"tls://"开头指明了协议,就不需要写type了 - "server": "1.1.1.1", - "port": 853, // 不配置时,默认端口为:853 - "servername": "cloudflare-dns.com", // 需要伪造成的SNI - //"sni": "cloudflare-dns.com", // SNI缩写配置 - "cacheSize": 1000 -} -``` - -## 6.3. 配置 `TCP` 的DNS服务: -> 并非被所有DNS支持,该方法既不保密也不可靠 - -```json -"googleTCP": { - "type": "tcp", // 如果server上以"tcp://"开头指明了协议,就不需要写type了 - "server": "8.8.8.8", - "port": 53, // 不配置时,默认端口为:53 - "cacheSize": 1000 -} -``` - -## 6.4. 配置 `UDP` 的DNS服务: -> 所有DNS服务器均支持UDP方式,但该方法既不保密也不可靠 - -```json -"google": { - "type": "udp", // 如果server上以"udp://"开头指明了协议,就不需要写type了 - "server": "8.8.8.8", - "port": 53, // 不配置时,默认端口为:53 - "cacheSize": 1000 -} -``` - -# 7. DNS设置: - -选择哪些域名需要使用指定的DNS(需要先在【DNS服务管理】中设置)获取IP。
-在config.json中的 `server.dns.mapping:key-value` 中设置,**其中的每个条目**格式如下: - -```json -"*.example.com": "your-dns-name" -``` - -# 8. IP预设置: - -为一些DNS无法获取的域名手动设置ip,起到类似于hosts的作用(仅在dev-sidecar开启时生效)。
-在config.json中的 `server.preSetIpList:object` 中设置,**其中的每个条目**格式如下: - -```json -{ - "example.com": { - "1.1.1.1": true, // 如果有多个IP,可以继续添加 - "1.0.0.1": false, // 指定为false时,不使用该IP - "2.2.2.2": { - "desc": "这样可以合法的在配置中插入注释。上面使用的//注释方式在文件中是不允许的" - } - } -} -``` - -# 9. IP测速: - -用来对从指定的DNS与IP预设置中获取到的IP测试TCP延迟,也可以用来测试DoH和DoT服务器的可用性,后者操作如下:先在【DNS服务管理】中配置好需要测试的DNS设置,然后在【IP测速】里添加一个没有设置【IP预设置】的辅助域名,并选择使用需检测的DNS进行解析。
-对于DoH/DoT而言,由于答案不能被篡改和窃听,所以辅助域名要么获得真实IP(说明可用)要么没有收到答案(说明不可用)。该方法不适用于常规TCP/UDP的DNS,因为它们没有加密,即使收到答案也可能被篡改而不可用)。
-在config.json中的 `server.dns.speedTest:object`中设置,**该条目** 格式如下: - -```json -"speedTest": { - "hostnameList": [ - "example1.com", - "example2.com" - ], - "dnsProviders": [ - "your-DNS-name-used-in-test1", - "your-DNS-name-used-in-test2" - ] -} -``` diff --git "a/doc/wiki/\345\220\204\345\271\263\345\217\260\345\256\211\350\243\205\350\257\264\346\230\216.md" "b/doc/wiki/\345\220\204\345\271\263\345\217\260\345\256\211\350\243\205\350\257\264\346\230\216.md" deleted file mode 100644 index 0c4733ed23..0000000000 --- "a/doc/wiki/\345\220\204\345\271\263\345\217\260\345\256\211\350\243\205\350\257\264\346\230\216.md" +++ /dev/null @@ -1,6 +0,0 @@ -|平台|安装说明 | -|---|---| -| 【Windows】 | 下载后提示无法验证发行者时,选择保留即可
注意:开着ds重启电脑会导致无法上网,你可以再次打开ds,然后右键小图标退出ds即可。[更多说明](https://github.com/docmirror/dev-sidecar/issues/109)| -| 【Mac】 |安装时提示无法验证开发者时,请先取消
然后去系统偏好设置->安全与隐私->下方已阻止使用DevSidecar
选择仍要打开 | -| 【Ubuntu】 | [安装说明](https://github.com/docmirror/dev-sidecar/blob/master/doc/linux.md)| -|【其他Linux】| | \ No newline at end of file diff --git "a/doc/wiki/\350\247\243\345\206\263Github\350\256\277\351\227\256\344\270\215\344\272\206\346\210\226\351\200\237\345\272\246\345\276\210\346\205\242\347\232\204\351\227\256\351\242\230.md" "b/doc/wiki/\350\247\243\345\206\263Github\350\256\277\351\227\256\344\270\215\344\272\206\346\210\226\351\200\237\345\272\246\345\276\210\346\205\242\347\232\204\351\227\256\351\242\230.md" deleted file mode 100644 index 444c8d4d92..0000000000 --- "a/doc/wiki/\350\247\243\345\206\263Github\350\256\277\351\227\256\344\270\215\344\272\206\346\210\226\351\200\237\345\272\246\345\276\210\346\205\242\347\232\204\351\227\256\351\242\230.md" +++ /dev/null @@ -1,11 +0,0 @@ -> 注:请使用 `v2.0.0-RC2` 及以上版本,下载地址:https://github.com/docmirror/dev-sidecar/releases - -目前,Github通过预设置的IP来访问的,选取测速排在前的IP。 - -可是,虽然IP测速延迟很低,但是依然会存在不同地区访问部分预设IP不通或很慢的问题。 - -如果碰到此问题,可以通过将预设IP设置为 `false` 来禁用访问慢的IP,以此达到切换IP的目的,如下图: -如果访问还慢,再将测速排在第1的IP再禁用掉,以此循环,将访问慢的IP都禁掉,直到选取到的IP访问Github速度很快为止。 - -> 假如:测速排第1的IP为 `20.27.177.113`,则将其配置为 `false`,或者删除该IP -![输入图片说明](https://foruda.gitee.com/images/1737713514504282222/96a679f9_1895865.png "屏幕截图") diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index 46f5abf62b..0000000000 --- a/eslint.config.js +++ /dev/null @@ -1,28 +0,0 @@ -import antfu from '@antfu/eslint-config' - -export default antfu( - { - vue: { - vueVersion: 2, - }, - rules: { - 'style/brace-style': ['error', '1tbs'], - 'style/space-before-function-paren': ['error', 'always'], - 'import/newline-after-import': 'off', - 'import/first': 'off', - 'perfectionist/sort-imports': 'off', - 'node/prefer-global/buffer': 'off', - 'node/prefer-global/process': 'off', - 'no-console': 'off', - }, - ignores: [ - '**/build/*', - '**/dist_electron', - ], - formatters: { - css: true, - html: true, - markdown: 'prettier', - }, - }, -) diff --git a/index.html b/index.html new file mode 100644 index 0000000000..db525296f1 --- /dev/null +++ b/index.html @@ -0,0 +1,14 @@ + + + + + + + dev-sidecar + + + +
+ + + diff --git a/package.json b/package.json index f9924d4f95..bde6964955 100644 --- a/package.json +++ b/package.json @@ -1,29 +1,26 @@ { - "name": "dev-sidecar-parent", + "name": "dev-sidecar", + "private": true, + "version": "0.1.0", "type": "module", - "private": false, - "packageManager": "pnpm@9.13.2", - "author": "Greper", - "license": "MPL-2.0", "scripts": { - "lint": "eslint .", - "lint:fix": "eslint . --fix" + "dev": "vite", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview", + "tauri": "tauri" }, - "devDependencies": { - "@antfu/eslint-config": "^3.16.0", - "eslint": "^10.2.1", - "eslint-plugin-format": "^0.1.3" + "dependencies": { + "@tailwindcss/vite": "^4.3.0", + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-opener": "^2", + "tailwindcss": "^4.3.0", + "vue": "^3.5.13" }, - "pnpm": { - "supportedArchitectures": { - "os": [ - "current" - ], - "cpu": [ - "x64", - "arm64", - "ia32" - ] - } + "devDependencies": { + "@tauri-apps/cli": "^2", + "@vitejs/plugin-vue": "^5.2.1", + "typescript": "~5.6.2", + "vite": "^6.0.3", + "vue-tsc": "^2.1.10" } } diff --git a/packages/aur/PKGBUILD b/packages/aur/PKGBUILD deleted file mode 100644 index fb401197f6..0000000000 --- a/packages/aur/PKGBUILD +++ /dev/null @@ -1,54 +0,0 @@ -# Maintainer: Greper -pkgname=dev-sidecar-bin -pkgver=2.0.2 -pkgrel=1 -pkgdesc="给开发者的边车辅助工具,通过代理的方式来改善国内访问github等境外网站的情况" -arch=('x86_64' 'aarch64') -url="https://github.com/docmirror/dev-sidecar" -license=('MPL-2.0') -depends=('libnotify' 'libappindicator-gtk3' 'libxtst' 'nss' 'libxss' 'gtk3') -provides=('dev-sidecar') -conflicts=('dev-sidecar') -options=('!strip') - -source_x86_64=("https://github.com/docmirror/dev-sidecar/releases/download/v${pkgver}/DevSidecar-${pkgver}-linux-x86_64.tar.gz") -source_aarch64=("https://github.com/docmirror/dev-sidecar/releases/download/v${pkgver}/DevSidecar-${pkgver}-linux-arm64.tar.gz") - -sha256sums_x86_64=('SKIP') -sha256sums_aarch64=('SKIP') - -package() { - local _installdir="${pkgdir}/opt/${pkgname%-bin}" - - install -dm755 "${_installdir}" - cp -r "${srcdir}/"* "${_installdir}/" - - # chrome-sandbox must be setuid root - if [[ -f "${_installdir}/chrome-sandbox" ]]; then - chmod 4755 "${_installdir}/chrome-sandbox" - fi - - # symlink the main executable into PATH - install -dm755 "${pkgdir}/usr/bin" - ln -sf "/opt/${pkgname%-bin}/dev-sidecar" "${pkgdir}/usr/bin/dev-sidecar" - - # desktop entry - install -dm755 "${pkgdir}/usr/share/applications" - cat > "${pkgdir}/usr/share/applications/dev-sidecar.desktop" << EOF -[Desktop Entry] -Name=DevSidecar -Comment=给开发者的边车辅助工具 -Exec=/opt/dev-sidecar/dev-sidecar %U -Icon=dev-sidecar -Terminal=false -Type=Application -Categories=Utility;System; -StartupNotify=true -EOF - - # application icon (if provided by the package) - if [[ -f "${_installdir}/resources/app/public/logo/linux.png" ]]; then - install -Dm644 "${_installdir}/resources/app/public/logo/linux.png" \ - "${pkgdir}/usr/share/pixmaps/dev-sidecar.png" - fi -} diff --git a/packages/aur/gen_srcinfo.py b/packages/aur/gen_srcinfo.py deleted file mode 100644 index e8abd8ab0b..0000000000 --- a/packages/aur/gen_srcinfo.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python3 -"""Generate .SRCINFO from PKGBUILD for AUR publishing. - -This script is used by the publish-to-aur GitHub Actions workflow because -makepkg/pacman are not available on Ubuntu runners. - -Run it from the directory that contains PKGBUILD: - python3 gen_srcinfo.py -""" - -import pathlib -import re - -pkgbuild = pathlib.Path("PKGBUILD").read_text() - - -def extract(var): - m = re.search(rf"^{var}=(.+)", pkgbuild, re.MULTILINE) - return m.group(1).strip().strip("'\"") if m else "" - - -pkgname = extract("pkgname") -pkgver = extract("pkgver") -pkgrel = extract("pkgrel") -pkgdesc = extract("pkgdesc").strip("'\"") -arch_line = re.search(r"^arch=\((.+)\)", pkgbuild, re.MULTILINE).group(1) -archs = re.findall(r"'([^']+)'", arch_line) -url = extract("url") -license_ = re.search(r"^license=\('([^']+)'\)", pkgbuild, re.MULTILINE).group(1) -depends_m = re.search(r"^depends=\((.+?)\)", pkgbuild, re.MULTILINE | re.DOTALL) -depends = re.findall(r"'([^']+)'", depends_m.group(1)) if depends_m else [] -provides_m = re.search(r"^provides=\('([^']+)'\)", pkgbuild, re.MULTILINE) -provides = [provides_m.group(1)] if provides_m else [] -conflicts_m = re.search(r"^conflicts=\('([^']+)'\)", pkgbuild, re.MULTILINE) -conflicts = [conflicts_m.group(1)] if conflicts_m else [] - -src_x86 = re.search(r'^source_x86_64=\("([^"]+)"\)', pkgbuild, re.MULTILINE) -src_aarch = re.search(r'^source_aarch64=\("([^"]+)"\)', pkgbuild, re.MULTILINE) -sha_x86 = re.search(r"^sha256sums_x86_64=\('([^']+)'\)", pkgbuild, re.MULTILINE) -sha_aarch = re.search(r"^sha256sums_aarch64=\('([^']+)'\)", pkgbuild, re.MULTILINE) - -lines = [] -lines.append("# Generated by gen_srcinfo.py") -lines.append(f"pkgbase = {pkgname}") -lines.append(f"\tpkgdesc = {pkgdesc}") -lines.append(f"\tpkgver = {pkgver}") -lines.append(f"\tpkgrel = {pkgrel}") -lines.append(f"\turl = {url}") -for a in archs: - lines.append(f"\tarch = {a}") -lines.append(f"\tlicense = {license_}") -for d in depends: - lines.append(f"\tdepends = {d}") -for p in provides: - lines.append(f"\tprovides = {p}") -for c in conflicts: - lines.append(f"\tconflicts = {c}") -if src_x86: - lines.append(f"\tsource_x86_64 = {src_x86.group(1)}") -if sha_x86: - lines.append(f"\tsha256sums_x86_64 = {sha_x86.group(1)}") -if src_aarch: - lines.append(f"\tsource_aarch64 = {src_aarch.group(1)}") -if sha_aarch: - lines.append(f"\tsha256sums_aarch64 = {sha_aarch.group(1)}") -lines.append("") -lines.append(f"pkgname = {pkgname}") - -pathlib.Path(".SRCINFO").write_text("\n".join(lines) + "\n") -print(".SRCINFO generated:") -print("\n".join(lines)) diff --git a/packages/cli/LICENSE b/packages/cli/LICENSE deleted file mode 100644 index a612ad9813..0000000000 --- a/packages/cli/LICENSE +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/packages/cli/cli.js b/packages/cli/cli.js deleted file mode 100755 index 8fa39e70ba..0000000000 --- a/packages/cli/cli.js +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env node - -require('./src') diff --git a/packages/cli/package.json b/packages/cli/package.json deleted file mode 100644 index f5218a8fb9..0000000000 --- a/packages/cli/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "@docmirror/dev-sidecar-cli", - "version": "2.1.0", - "private": false, - "description": "给开发者的加速代理工具", - "author": "docmirror.cn", - "license": "MPL-2.0", - "keywords": [ - "dev-sidecar", - "github加速", - "google加速", - "代理" - ], - "main": "src/index.js", - "bin": "./cli.js", - "scripts": { - "start": "node ./src" - }, - "dependencies": { - "@docmirror/dev-sidecar": "workspace:*", - "@docmirror/mitmproxy": "workspace:*" - } -} diff --git a/packages/cli/src/banner.txt b/packages/cli/src/banner.txt deleted file mode 100644 index c025095feb..0000000000 --- a/packages/cli/src/banner.txt +++ /dev/null @@ -1,8 +0,0 @@ - ____ _____ _ __ - / __ \___ _ __ / ___/(_)___/ /__ _________ ______ - / / / / _ \ | / /_____\__ \/ / __ / _ \/ ___/ __ `/ ___/ - / /_/ / __/ |/ /_____/__/ / / /_/ / __/ /__/ /_/ / / -/_____/\___/|___/ /____/_/\__,_/\___/\___/\__,_/_/ - - -==================== 开发者边车 ==================== diff --git a/packages/cli/src/index.js b/packages/cli/src/index.js deleted file mode 100644 index b45cab80bf..0000000000 --- a/packages/cli/src/index.js +++ /dev/null @@ -1,37 +0,0 @@ -const fs = require('node:fs') -const DevSidecar = require('@docmirror/dev-sidecar') -const jsonApi = require('@docmirror/mitmproxy/src/json') - -// 启动服务 -const mitmproxyPath = './mitmproxy' -async function startup () { - const banner = fs.readFileSync('./banner.txt') - console.log(banner.toString()) - - const configPath = './user_config.json5' - if (fs.existsSync(configPath)) { - const file = fs.readFileSync(configPath) - let userConfig - try { - userConfig = jsonApi.parse(file.toString()) - console.info(`读取和解析 user_config.json5 成功:${configPath}`) - } catch (e) { - console.error(`读取或解析 user_config.json5 失败: ${configPath}, error:`, e) - userConfig = {} - } - DevSidecar.api.config.set(userConfig) - } - - await DevSidecar.api.startup({ mitmproxyPath }) - console.log('dev-sidecar 已启动') -} - -async function onClose () { - console.log('on sigint ') - await DevSidecar.api.shutdown() - console.log('on closed ') - process.exit(0) -} -process.on('SIGINT', onClose) - -startup() diff --git a/packages/cli/src/mitmproxy.js b/packages/cli/src/mitmproxy.js deleted file mode 100644 index da527295fe..0000000000 --- a/packages/cli/src/mitmproxy.js +++ /dev/null @@ -1,31 +0,0 @@ -const fs = require('node:fs') -const path = require('node:path') -const server = require('@docmirror/mitmproxy') -const jsonApi = require('@docmirror/mitmproxy/src/json') -const log = require('@docmirror/mitmproxy/src/utils/util.log.server') // 当前脚本是在 server 的进程中执行的,所以使用 mitmproxy 中的logger - -const home = process.env.USER_HOME || process.env.HOME || 'C:/Users/Administrator/' - -let configPath -if (process.argv && process.argv.length >= 3) { - configPath = process.argv[2] -} else { - configPath = path.join(home, '.dev-sidecar/running.json') -} - -const configJson = fs.readFileSync(configPath) -log.info('读取 running.json by cli 成功:', configPath) -let config -try { - config = jsonApi.parse(configJson.toString()) -} catch (e) { - log.error(`running.json 文件内容格式不正确,文件路径:${configPath},文件内容: ${configJson.toString()}, error:`, e) - config = {} -} -// const scriptDir = '../../gui/extra/scripts/' -// config.setting.script.defaultDir = path.join(__dirname, scriptDir) -// const pacFilePath = '../../gui/extra/pac/pac.txt' -// config.plugin.overwall.pac.customPacFilePath = path.join(__dirname, pacFilePath) -config.setting.rootDir = path.join(__dirname, '../../gui/') -log.info(`start mitmproxy by cli, configPath: ${configPath}`) -server.start(config) diff --git a/packages/cli/src/user_config.json5 b/packages/cli/src/user_config.json5 deleted file mode 100644 index 56afb1fdd0..0000000000 --- a/packages/cli/src/user_config.json5 +++ /dev/null @@ -1,42 +0,0 @@ -{ - "app": { - "autoStart": { - "enabled": true - }, - "mode": "default" - }, - "plugin": { - "node": { - "setting": { - "yarnRegistry": "null" - } - }, - "git": { - "enabled": true - }, - "overwall": { - "enabled": false, - "targets": { - "*gagedigital.com": true, - "*yonsz.net": true, - "*bootstrapcdn.com": true, - "*cloudflare.com": true, - "help.yonsz.net": true - } - } - }, - "server": { - "intercepts": { - "dev-sidecar.docmirror.cn": { - ".*": { - "proxy": "dev-sidecar-preview.docmirror.cn" - } - }, - "test1111.gagedigital.com": { - ".*": { - "proxy": "test1.gagedigital.com" - } - } - } - } -} diff --git a/packages/core/LICENSE b/packages/core/LICENSE deleted file mode 100644 index a612ad9813..0000000000 --- a/packages/core/LICENSE +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/packages/core/index.js b/packages/core/index.js deleted file mode 100644 index c8541605a4..0000000000 --- a/packages/core/index.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = require('./src') - -// TODO 这是一个解谜游戏 ↓ ↓ ↓ ↓ ↓ ↓ ,如果你破解了它,请不要公开,好好用它来学习和查资料吧(特别注意:为了你的人身安全,请不要用它来查看和发表不当言论,你懂得)。 -/** - \u0061\u0048\u0052\u0030\u0063\u0044\u006f\u0076\u004c\u0032\u0052\u006c\u0064\u0069\u0031\u007a\u0061\u0057\u0052\u006c\u0059\u0032\u0046\u0079\u004c\u006d\u0052\u0076\u0059\u0032\u0031\u0070\u0063\u006e\u004a\u0076\u0063\u0069\u0035\u006a\u0062\u0069\u0039\u0035\u0062\u0033\u0056\u006d\u0061\u0057\u0035\u006b\u0061\u0058\u0051\u0076\u0061\u0057\u0035\u006b\u005a\u0058\u0067\u0075\u0061\u0048\u0052\u0074\u0062\u0041\u003d\u003d - */ -// 这个项目里有一点点解谜提示: https://github.com/fast-crud/fast-crud (打开拉到最下面) diff --git a/packages/core/package.json b/packages/core/package.json deleted file mode 100644 index 7fbfb0b603..0000000000 --- a/packages/core/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "@docmirror/dev-sidecar", - "version": "2.1.0", - "private": false, - "description": "给开发者的加速代理工具", - "author": "docmirror.cn", - "license": "MPL-2.0", - "keywords": [ - "dev-sidecar", - "github加速", - "google加速", - "代理" - ], - "main": "src/index.js", - "scripts": { - "test": "mocha" - }, - "dependencies": { - "@starknt/sysproxy": "^0.0.3", - "@vscode/sudo-prompt": "^9.3.2", - "fix-path": "^3.0.0", - "iconv-lite": "^0.6.3", - "lodash": "^4.18.1", - "log4js": "^6.9.1", - "node-powershell": "^4.0.0", - "request": "^2.88.2", - "spawn-sync": "^2.0.0", - "winreg": "^1.2.5" - }, - "devDependencies": { - "chai": "^4.5.0", - "mocha": "^8.4.0" - } -} diff --git a/packages/core/src/config-api.js b/packages/core/src/config-api.js deleted file mode 100644 index c0aed46604..0000000000 --- a/packages/core/src/config-api.js +++ /dev/null @@ -1,300 +0,0 @@ -const fs = require('node:fs') -const jsonApi = require('@docmirror/mitmproxy/src/json') -const lodash = require('lodash') -const request = require('request') -const defConfig = require('./config/index.js') -const mergeApi = require('./merge.js') -const Shell = require('./shell') -const log = require('./utils/util.log.core') -const configLoader = require('./config/local-config-loader') - -let configTarget = lodash.cloneDeep(defConfig) - -function get () { - return configTarget -} - -let timer -const configApi = { - async startAutoDownloadRemoteConfig () { - if (timer != null) { - clearInterval(timer) - } - const download = async () => { - try { - await configApi.downloadRemoteConfig() - configApi.reload() - } catch (e) { - log.error('定时下载远程配置并重载配置失败', e) - } - } - await download() - timer = setInterval(download, 24 * 60 * 60 * 1000) // 1天 - }, - async downloadRemoteConfig () { - if (get().app.remoteConfig.enabled !== true) { - // 删除保存的远程配置文件 - configApi.deleteRemoteConfigFile() - configApi.deleteRemoteConfigFile('_personal') - return - } - - const remoteConfig = get().app.remoteConfig - await configApi.doDownloadRemoteConfig(remoteConfig.url) - await configApi.doDownloadRemoteConfig(remoteConfig.personalUrl, '_personal') - }, - doDownloadRemoteConfig (remoteConfigUrl, suffix = '') { - if (!remoteConfigUrl) { - // 删除保存的远程配置文件 - configApi.deleteRemoteConfigFile(suffix) - return - } - - return new Promise((resolve, reject) => { - log.info('开始下载远程配置:', remoteConfigUrl) - - const headers = { - 'Cache-Control': 'no-cache', // 禁止使用缓存 - 'Pragma': 'no-cache', // 禁止使用缓存 - } - if (remoteConfigUrl.startsWith('https://raw.githubusercontent.com/')) { - headers['Server-Name'] = 'baidu.com' - } - request(remoteConfigUrl, { headers }, (error, response, body) => { - if (error) { - log.error(`下载远程配置失败: ${remoteConfigUrl}, error:`, error, ', response:', response, ', body:', body) - reject(error) - return - } - if (response && response.statusCode === 200) { - if (body == null || body.length < 2) { - log.warn('下载远程配置成功,但内容为空:', remoteConfigUrl) - resolve() - return - } else { - log.info('下载远程配置成功:', remoteConfigUrl) - } - - // 尝试解析远程配置,如果解析失败,则不保存它 - let remoteConfig - try { - remoteConfig = jsonApi.parse(body) - } catch { - log.error(`远程配置内容格式不正确, url: ${remoteConfigUrl}, body: ${body}`) - remoteConfig = null - } - - if (remoteConfig != null) { - const remoteSavePath = configLoader.getRemoteConfigPath(suffix) - try { - fs.writeFileSync(remoteSavePath, body) - log.info('保存远程配置文件成功:', remoteSavePath) - } catch (e) { - log.error('保存远程配置文件失败:', remoteSavePath, ', error:', e) - reject(new Error(`保存远程配置文件失败: ${e.message}`)) - return - } - } else { - log.warn('远程配置对象为空:', remoteConfigUrl) - } - - resolve() - } else { - log.error(`下载远程配置失败: ${remoteConfigUrl}, response:`, response, ', body:', body) - - let message - if (response) { - message = `下载远程配置失败: ${remoteConfigUrl}, message: ${response.statusMessage}, code: ${response.statusCode}` - } else { - message = `下载远程配置失败: response: ${response}` - } - reject(new Error(message)) - } - }) - }) - }, - deleteRemoteConfigFile (suffix = '') { - const remoteSavePath = configLoader.getRemoteConfigPath(suffix) - if (fs.existsSync(remoteSavePath)) { - fs.unlinkSync(remoteSavePath) - log.info('删除远程配置文件成功:', remoteSavePath) - } - }, - readRemoteConfigStr (suffix = '') { - try { - const path = configLoader.getRemoteConfigPath(suffix) - if (fs.existsSync(path)) { - const file = fs.readFileSync(path) - log.info('读取远程配置文件内容成功:', path) - return file.toString() - } else { - log.info('远程配置文件不存在:', path) - } - } catch (e) { - log.error('读取远程配置文件内容失败:', e) - } - - return '{}' - }, - /** - * 保存自定义的 config - * @param newConfig - */ - save (newConfig) { - // 对比默认config的异同 - const defConfig = configApi.cloneDefault() - - // 如果开启了远程配置,则读取远程配置,合并到默认配置中 - if (get().app.remoteConfig.enabled === true) { - if (get().app.remoteConfig.url) { - mergeApi.doMerge(defConfig, configLoader.getRemoteConfig()) - } - if (get().app.remoteConfig.personalUrl) { - mergeApi.doMerge(defConfig, configLoader.getRemoteConfig('_personal')) - } - } - - // 计算新配置与默认配置(启用远程配置时,含远程配置)的差异 - const diffConfig = mergeApi.doDiff(defConfig, newConfig) - - // 将差异作为用户配置保存到 config.json 中 - const configPath = configLoader.getUserConfigPath() - try { - fs.writeFileSync(configPath, jsonApi.stringify(diffConfig)) - log.info('保存 config.json 自定义配置文件成功:', configPath) - } catch (e) { - log.error('保存 config.json 自定义配置文件失败:', configPath, ', error:', e) - throw e - } - - // 重载配置 - const allConfig = configApi.set(diffConfig) - - return { - diffConfig, - allConfig, - } - }, - doMerge: mergeApi.doMerge, - doDiff: mergeApi.doDiff, - /** - * 读取 config.json 后,合并配置 - */ - reload () { - const userConfig = configLoader.getUserConfig() - return configApi.set(userConfig) || {} - }, - update (partConfig) { - const newConfig = lodash.merge(configApi.get(), partConfig) - configApi.save(newConfig) - }, - get, - set (newConfig) { - if (newConfig == null) { - log.warn('newConfig 为空,不做任何操作') - return configTarget - } - return configApi.load(newConfig) - }, - load (newConfig) { - const config = configLoader.getConfigFromFiles(newConfig, defConfig) - configTarget = config - return config - }, - cloneDefault () { - return lodash.cloneDeep(defConfig) - }, - addDefault (key, defValue) { - lodash.set(defConfig, key, defValue) - }, - // 移除用户配置,用于恢复出厂设置功能 - async removeUserConfig () { - const configPath = configLoader.getUserConfigPath() - if (fs.existsSync(configPath)) { - // 读取 config.json 文件内容 - const fileOriginalStr = fs.readFileSync(configPath).toString() - - // 判断文件内容是否为空或空配置 - const fileStr = fileOriginalStr.replace(/\s/g, '') - if (fileStr.length < 5) { - try { - fs.writeFileSync(configPath, '{}') - } catch (e) { - log.warn('简化用户配置文件失败:', configPath, ', error:', e) - } - return false // config.json 内容为空,或为空json - } - - // 备份用户自定义配置文件 - const bakConfigPath = `${configPath}.${Date.now()}.bak.json` - try { - fs.writeFileSync(bakConfigPath, fileOriginalStr) - log.info('备份用户配置文件成功:', bakConfigPath) - } catch (e) { - log.error('备份用户配置文件失败:', bakConfigPath, ', error:', e) - throw e - } - // 原配置文件内容设为空 - try { - fs.writeFileSync(configPath, '{}') - } catch (e) { - log.error('初始化用户配置文件失败:', configPath, ', error:', e) - throw e - } - - // 重新加载配置 - configApi.load(null) - - return true // 删除并重新加载配置成功 - } else { - return false // config.json 文件不存在 - } - }, - resetDefault (key) { - if (key) { - let value = lodash.get(defConfig, key) - value = lodash.cloneDeep(value) - lodash.set(configTarget, key, value) - } else { - configTarget = lodash.cloneDeep(defConfig) - } - return configTarget - }, - async getVariables (type) { - const method = type === 'npm' ? Shell.getNpmEnv : Shell.getSystemEnv - const currentMap = await method() - const list = [] - const map = configTarget.variables[type] - for (const key in map) { - const exists = currentMap[key] != null - list.push({ - key, - value: map[key], - exists, - }) - } - return list - }, - async setVariables (type) { - const list = await configApi.getVariables(type) - const noSetList = list.filter((item) => { - return !item.exists - }) - if (noSetList.length > 0) { - const context = { - root_ca_cert_path: configApi.get().server.setting.rootCaFile.certPath, - } - for (const item of noSetList) { - if (item.value.includes('${')) { - for (const key in context) { - item.value = item.value.replace(new RegExp(`\\$\\{${key}\\}`, 'g'), context[key]) - } - } - } - const method = type === 'npm' ? Shell.setNpmEnv : Shell.setSystemEnv - return method({ list: noSetList }) - } - }, -} - -module.exports = configApi diff --git a/packages/core/src/config/index.js b/packages/core/src/config/index.js deleted file mode 100644 index 4036d94abe..0000000000 --- a/packages/core/src/config/index.js +++ /dev/null @@ -1,472 +0,0 @@ -const path = require('node:path') -const configLoader = require('./local-config-loader') - -function getRootCaCertPath () { - return path.join(configLoader.getUserBasePath(), '/dev-sidecar.ca.crt') -} - -function getRootCaKeyPath () { - return path.join(configLoader.getUserBasePath(), '/dev-sidecar.ca.key.pem') -} - -const defaultConfig = { - app: { - metaInfo: { - updateLog: 'GUI v2.0.2自带配置', - version: 202604122348, - id: 'internal', - }, - mode: 'default', - autoStart: { - enabled: false, - }, - remoteConfig: { - enabled: true, - // 共享远程配置地址 - url: 'https://raw.giteeusercontent.com/wangliang181230/dev-sidecar-config/raw/main/remote_config.json', - // 个人远程配置地址 - personalUrl: '', - }, - startShowWindow: true, // 启动时是否打开窗口:true=打开窗口, false=隐藏窗口 - needCheckHideWindow: true, // 是否需要在隐藏窗口时做检查 - showHideShortcut: 'Alt + S', // 显示/隐藏窗口快捷键 - windowSize: { width: 900, height: 750 }, // 启动时,窗口的尺寸 - theme: 'dark', // 主题:light=亮色, dark=暗色 - autoChecked: true, // 是否自动检查更新 - skipPreRelease: true, // 是否忽略预发布版本 - dock: { - hideWhenWinClose: false, - }, - closeStrategy: 0, - showShutdownTip: true, - - // 日志相关配置 - logFileSavePath: path.join(configLoader.getUserBasePath(), '/logs'), // 日志文件保存路径 - keepLogFileCount: 15, // 保留日志文件数 - maxLogFileSize: 1, // 最大日志文件大小 - maxLogFileSizeUnit: 'GB', // 最大日志文件大小单位 - }, - server: { - enabled: true, - host: '127.0.0.1', - port: 31181, - fakeServerMaxLength: 100, // fakeServer的最大缓存数量 - setting: { - NODE_TLS_REJECT_UNAUTHORIZED: true, - verifySsl: true, - script: { - enabled: true, - defaultDir: './extra/scripts/', - }, - userBasePath: configLoader.getUserBasePath(), - rootCaFile: { - certPath: getRootCaCertPath(), - keyPath: getRootCaKeyPath(), - }, - - // 默认超时时间配置 - defaultTimeout: 20000, // 请求超时时间 - defaultKeepAliveTimeout: 30000, // 连接超时时间 - - // 指定域名超时时间配置 - timeoutMapping: { - 'github.com': { - timeout: 20000, - keepAliveTimeout: 30000, - }, - }, - - // 慢速IP延迟时间:测速超过该值时,则视为延迟高,显示为橙色 - lowSpeedDelay: 200, - }, - compatible: { - // **** 自定义兼容配置 **** // - // connect阶段所需的兼容性配置 - connect: { - // 参考配置(无path) - // 'xxx.xxx.xxx.xxx:443': { - // ssl: false - // } - }, - // request阶段所需的兼容性配置 - request: { - // 参考配置(配置方式同 `拦截配置`) - // 'xxx.xxx.xxx.xxx:443': { - // '.*': { - // rejectUnauthorized: false - // } - // } - }, - }, - intercept: { - enabled: true, - }, - intercepts: { - 'github.com': { - '.*': { - sni: 'baidu.com', - }, - '^(/[\\w-.]+){2,}/?(\\?.*)?$': { - // 篡改猴插件地址,以下是高速镜像地址 - tampermonkeyScript: 'https://raw.giteeusercontent.com/wangliang181230/dev-sidecar-config/raw/main/tampermonkey.js', - // Github油猴脚本地址,以下是高速镜像地址 - script: 'https://raw.giteeusercontent.com/wangliang181230/dev-sidecar-config/raw/main/GithubEnhanced-High-Speed-Download.user.js', - remark: '注:上面所使用的脚本地址,为高速镜像地址。', - desc: '油猴脚本:高速下载 Git Clone/SSH、Release、Raw、Code(ZIP) 等文件 (公益加速)、项目列表单文件快捷下载、添加 git clone 命令', - }, - // 以下三项暂时先注释掉,因为已经有油猴脚本提供高速下载地址了。 - // '/.*/.*/releases/download/': { - // redirect: 'gh.api.99988866.xyz/https://github.com', - // desc: 'release文件加速下载跳转地址' - // }, - // '/.*/.*/archive/': { - // redirect: 'gh.api.99988866.xyz/https://github.com' - // }, - // 以下代理地址不支持该类资源的代理,暂时注释掉 - // '/.*/.*/blame/': { - // redirect: 'gh.api.99988866.xyz/https://github.com' - // }, - '/fluidicon.png': { - cacheDays: 365, - desc: 'Github那只猫的图片,缓存1年', - }, - '^(/[^/]+){2}/pull/\\d+/open_with_menu.*$': { - cacheDays: 7, - desc: 'PR详情页:标题右边那个Code按钮的HTML代码请求地址,感觉上应该可以缓存。暂时先设置为缓存7天', - }, - '^((/[^/]+){2,})/raw((/[^/]+)+\\.(jpg|jpeg|png|gif))(\\?.*)?$': { - // eslint-disable-next-line no-template-curly-in-string - proxy: 'https://raw.githubusercontent.com${m[1]}${m[3]}', - sni: 'baidu.com', - cacheDays: 7, - desc: '仓库内图片,重定向改为代理,并缓存7天。', - }, - '^((/[^/]+){2,})/raw((/[^/]+)+\\.js)(\\?.*)?$': { - // eslint-disable-next-line no-template-curly-in-string - proxy: 'https://raw.githubusercontent.com${m[1]}${m[3]}', - sni: 'baidu.com', - responseReplace: { headers: { 'content-type': 'application/javascript; charset=utf-8' } }, - desc: '仓库内脚本,重定向改为代理,并设置响应头Content-Type。作用:方便script拦截器直接使用,避免引起跨域问题和脚本内容限制问题。', - }, - }, - 'github.githubassets.com': { - '.*': { - sni: 'baidu.com', - }, - }, - 'camo.githubusercontent.com': { - '^[a-zA-Z0-9/]+(\\?.*)?$': { - cacheDays: 365, - desc: '图片,缓存1年', - }, - }, - 'collector.github.com': { - '.*': { - sni: 'baidu.com', - }, - }, - 'customer-stories-feed.github.com': { - '.*': { proxy: 'customer-stories-feed.fastgit.org' }, - }, - 'user-images.githubusercontent.com': { - '^/.*\\.png(\\?.*)?$': { - cacheDays: 365, - desc: '用户在PR或issue等内容中上传的图片,缓存1年。注:每张图片都有唯一的ID,不会重复,可以安心缓存', - }, - }, - 'private-user-images.githubusercontent.com': { - '^/.*\\.png(\\?.*)?$': { - cacheDays: 30, - cacheHours: null, - desc: '用户在PR或issue等内容中上传的图片,缓存30天', - }, - }, - 'avatars.githubusercontent.com': { - '^/u/\\d+(\\?.*)?$': { - cacheDays: 365, - desc: '用户头像,缓存1年', - }, - }, - 'api.github.com': { - '^/_private/browser/stats$': { - success: true, - desc: 'github的访问速度分析上传,没有必要,直接返回成功', - }, - '.*': { - sni: 'baidu.com', - }, - }, - '*.docker.com': { - '.*': { - sni: 'baidu.com', - }, - }, - 'login.docker.com': { - '/favicon.ico': { - proxy: 'hub.docker.com', - sni: 'baidu.com', - desc: '登录页面的ico,采用hub.docker.com的', - }, - }, - // google cdn - 'www.google.com': { - '/recaptcha/.*': { proxy: 'www.recaptcha.net' }, - // '.*': { - // proxy: 'gg.docmirror.top/_yxorp', - // desc: '呀,被你发现了,偷偷的用,别声张' - // } - }, - 'www.gstatic.com': { - '/recaptcha/.*': { proxy: 'www.recaptcha.net' }, - }, - 'ajax.googleapis.com': { - '.*': { - proxy: 'ajax.proxy.ustclug.org', - backup: ['gapis.geekzu.org'], - test: 'ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js', - }, - }, - 'fonts.googleapis.com': { - '.*': { - proxy: 'fonts.googleapis.cn', - backup: ['fonts.loli.net'], - test: 'https://fonts.googleapis.com/css?family=Oswald', - }, - }, - 'fonts.gstatic.com': { - '.*': { - proxy: 'fonts-gstatic.proxy.ustclug.org', - backup: ['gstatic.loli.net'], - test: 'https://fonts.googleapis.com/css?family=Oswald', - }, - }, - 'themes.googleapis.com': { - '.*': { - proxy: 'themes.loli.net', - backup: ['themes.proxy.ustclug.org'], - }, - }, - 'themes.googleusercontent.com': { - '.*': { proxy: 'google-themes.proxy.ustclug.org' }, - }, - 'clients*.google.com': { '.*': { abort: false, desc: '设置abort:true可以快速失败,节省时间' } }, - 'www.googleapis.com': { '.*': { abort: false, desc: '设置abort:true可以快速失败,节省时间' } }, - 'lh*.googleusercontent.com': { '.*': { abort: false, desc: '设置abort:true可以快速失败,节省时间' } }, - // mapbox-node-binary.s3.amazonaws.com/sqlite3/v5.0.0/napi-v3-win32-x64.tar.gz - '*.s3.1amazonaws1.com': { - '/sqlite3/.*': { - redirect: 'npmmirror.com/mirrors', - }, - }, - // 'packages.elastic.co': { '.*': { proxy: 'elastic.proxy.ustclug.org' } }, - // 'ppa.launchpad.net': { '.*': { proxy: 'launchpad.proxy.ustclug.org' } }, - // 'archive.cloudera.com': { '.*': { regexp: '/cdh5/.*', proxy: 'cloudera.proxy.ustclug.org' } }, - // 'downloads.lede-project.org': { '.*': { proxy: 'lede.proxy.ustclug.org' } }, - // 'downloads.openwrt.org': { '.*': { proxy: 'openwrt.proxy.ustclug.org' } }, - // 'secure.gravatar.com': { '.*': { proxy: 'gravatar.proxy.ustclug.org' } }, - '*.carbonads.com': { - '/carbon.*': { - abort: true, - desc: '广告拦截', - }, - }, - '*.buysellads.com': { - '/ads/.*': { - abort: true, - desc: '广告拦截', - }, - }, - }, - // 预设置IP列表 - preSetIpList: { - 'github.com': { - '4.237.22.38': true, - '20.26.156.215': true, - '20.27.177.113': true, - '20.87.245.0': true, - '20.200.245.247': true, - '20.201.28.151': true, - '20.205.243.166': true, - '140.82.113.3': true, - '140.82.114.4': true, - '140.82.116.3': true, - '140.82.116.4': true, - '140.82.121.3': true, - '140.82.121.4': true, - }, - 'api.github.com': { - '20.26.156.210': true, - '20.27.177.116': true, - '20.87.245.6': true, - '20.200.245.245': true, - '20.201.28.148': true, - '20.205.243.168': true, - '20.248.137.49': true, - '140.82.112.5': true, - '140.82.113.6': true, - '140.82.116.6': true, - '140.82.121.6': true, - }, - 'codeload.github.com': { - '20.26.156.216': true, - '20.27.177.114': true, - '20.87.245.7': true, - '20.200.245.246': true, - '20.201.28.149': true, - '20.205.243.165': true, - '20.248.137.55': true, - '140.82.113.9': true, - '140.82.114.10': true, - '140.82.116.10': true, - '140.82.121.9': true, - }, - '*.githubusercontent.com': { - '146.75.92.133': true, - '199.232.88.133': true, - '199.232.144.133': true, - }, - 'viewscreen.githubusercontent.com': { - '140.82.112.21': true, - '140.82.112.22': true, - '140.82.113.21': true, - '140.82.113.22': true, - '140.82.114.21': true, - '140.82.114.22': true, - }, - 'github.io': { - '185.199.108.153': true, - '185.199.109.153': true, - '185.199.110.153': true, - '185.199.111.153': true, - }, - '*.githubassets.com': { - '185.199.108.154': true, - '185.199.109.154': true, - '185.199.110.154': true, - '185.199.111.154': true, - }, - '^(analytics|ghcc)\\.githubassets\\.com$': { - '185.199.108.153': true, - '185.199.110.153': true, - '185.199.109.153': true, - '185.199.111.153': true, - }, - '*.pixiv.net': { - // 以下为 `cdn-origin.pixiv.net` 域名的IP - '210.140.139.154': true, - '210.140.139.157': true, - '210.140.139.160': true, - }, - 'hub.docker.com': { - '44.221.37.199': true, - '52.44.227.212': true, - '54.156.140.159': true, - }, - 'sessions-bugsnag.docker.com': { - '44.221.37.199': true, - '52.44.227.212': true, - '54.156.140.159': true, - }, - }, - whiteList: { - '*.cn': true, - 'cn.*': true, - '*china*': true, - '*.dingtalk.com': true, - '*.apple.com': true, - '*.microsoft.com': true, - '*.alipay.com': true, - '*.qq.com': true, - '*.baidu.com': true, - '192.168.*': true, - }, - dns: { - providers: { - safe360: { - server: 'tls://dot.360.cn', - forSNI: true, - }, - aliyun: { - server: 'tls://dns.alidns.com', - }, - cloudflare: { - server: 'https://1.1.1.1/dns-query', - }, - quad9: { - server: 'https://9.9.9.9/dns-query', - }, - rubyfish: { - server: 'https://rubyfish.cn/dns-query', - }, - }, - mapping: { - '*.github.com': 'quad9', - '*github*.com': 'quad9', - '*.github.io': 'quad9', - '*.docker.com': 'quad9', - '*.stackoverflow.com': 'quad9', - '*.electronjs.org': 'quad9', - '*.amazonaws.com': 'quad9', - '*.yarnpkg.com': 'quad9', - '*.cloudfront.net': 'quad9', - '*.cloudflare.com': 'quad9', - 'img.shields.io': 'quad9', - '*.vuepress.vuejs.org': 'quad9', - '*.gh.docmirror.top': 'quad9', - '*.v2ex.com': 'quad9', - '*.pypi.org': 'quad9', - '*.jetbrains.com': 'quad9', - '*.azureedge.net': 'quad9', - }, - /* - * 原本是想将 mapping 中的数据结构由 string 改为 object,但是这样会导致新的配置无法向下兼容,所以将family配置,放到下面的 familyMapping 中 - * - * @param family 可选值:4(只查询IPv4地址,默认值)、6(只查询IPv6地址)......暂不支持同时查IPv4和IPv6地址 - * @since 2.0.2 - */ - familyMapping: { - '*.github.com': '4', - '*github*.com': '4', - '*.github.io': '4', - '*.docker.com': '4', - '*.stackoverflow.com': '4', - '*.electronjs.org': '4', - '*.amazonaws.com': '4', - '*.yarnpkg.com': '4', - '*.cloudfront.net': '4', - '*.cloudflare.com': '4', - 'img.shields.io': '4', - '*.vuepress.vuejs.org': '4', - '*.gh.docmirror.top': '4', - '*.v2ex.com': '4', - '*.pypi.org': '4', - '*.jetbrains.com': '4', - '*.azureedge.net': '4', - }, - speedTest: { - enabled: true, - interval: 300000, - hostnameList: ['github.com'], - dnsProviders: ['cloudflare', 'safe360', 'rubyfish'], - }, - }, - }, - proxy: {}, - plugin: {}, - help: { - dataList: [ - { - title: '查看DevSidecar的说明文档(Wiki)', - url: 'https://github.com/docmirror/dev-sidecar/wiki', - }, - { - title: '为了展示更多帮助信息,请启用 “远程配置” 功能!!!', - }, - ], - }, -} - -// 从本地文件中加载配置 -defaultConfig.configFromFiles = configLoader.getConfigFromFiles(configLoader.getUserConfig(), defaultConfig) - -module.exports = defaultConfig diff --git a/packages/core/src/config/local-config-loader.js b/packages/core/src/config/local-config-loader.js deleted file mode 100644 index 2b8ca875ef..0000000000 --- a/packages/core/src/config/local-config-loader.js +++ /dev/null @@ -1,127 +0,0 @@ -const fs = require('node:fs') -const path = require('node:path') -const lodash = require('lodash') -const jsonApi = require('@docmirror/mitmproxy/src/json') -const mergeApi = require('../merge') -const logOrConsole = require('../utils/util.log-or-console') - -function getUserBasePath (autoCreate = true) { - const userHome = process.env.USERPROFILE || process.env.HOME || '/' - const dir = path.resolve(userHome, './.dev-sidecar') - - // 自动创建目录 - if (autoCreate && !fs.existsSync(dir)) { - fs.mkdirSync(dir) - } - - return dir -} - -function loadConfigFromFile (configFilePath) { - if (configFilePath == null) { - logOrConsole.error('配置文件地址为空') - return {} - } - - if (!fs.existsSync(configFilePath)) { - logOrConsole.info('配置文件不存在:', configFilePath) - return {} // 文件不存在,返回空配置 - } - - // 读取配置文件 - let configStr - try { - configStr = fs.readFileSync(configFilePath) - } catch (e) { - logOrConsole.error('读取配置文件失败:', configFilePath, ', error:', e) - return {} - } - - // 解析配置文件 - try { - const config = jsonApi.parse(configStr) - logOrConsole.info('读取配置文件成功:', configFilePath) - return config - } catch (e) { - logOrConsole.error(`解析配置文件失败,文件内容格式不正确,文件路径: ${configFilePath},文件内容:${configStr},error:`, e) - return {} - } -} - -function getUserConfigPath () { - const dir = getUserBasePath() - - // 兼容1.7.3及以下版本的配置文件处理逻辑 - const newFilePath = path.join(dir, '/config.json') - const oldFilePath = path.join(dir, '/config.json5') - if (!fs.existsSync(newFilePath) && fs.existsSync(oldFilePath)) { - return oldFilePath // 如果新文件不存在,但旧文件存在,则返回旧文件路径 - } - - return newFilePath -} - -function getUserConfig () { - const configFilePath = getUserConfigPath() - return loadConfigFromFile(configFilePath) -} - -function getRemoteConfigPath (suffix = '') { - const dir = getUserBasePath() - return path.join(dir, `/remote_config${suffix}.json5`) -} - -function getRemoteConfig (suffix = '') { - const remoteConfigFilePath = getRemoteConfigPath(suffix) - return loadConfigFromFile(remoteConfigFilePath) -} - -function getAutomaticCompatibleConfigPath () { - const dir = getUserBasePath() - return path.join(dir, '/automaticCompatibleConfig.json') -} - -/** - * 从文件读取配置 - * - * @param userConfig 用户配置 - * @param defaultConfig 默认配置 - */ -function getConfigFromFiles (userConfig, defaultConfig) { - const merged = userConfig != null ? lodash.cloneDeep(userConfig) : {} - - const personalRemoteConfig = getRemoteConfig('_personal') - const shareRemoteConfig = getRemoteConfig() - - mergeApi.doMerge(merged, personalRemoteConfig) // 先合并一次个人远程配置,使配置顺序在前 - mergeApi.doMerge(merged, shareRemoteConfig) // 先合并一次共享远程配置,使配置顺序在前 - mergeApi.doMerge(merged, defaultConfig) // 合并默认配置,顺序排在最后 - mergeApi.doMerge(merged, shareRemoteConfig) // 再合并一次共享远程配置,使配置生效 - mergeApi.doMerge(merged, personalRemoteConfig) // 再合并一次个人远程配置,使配置生效 - - if (userConfig != null) { - mergeApi.doMerge(merged, userConfig) // 再合并一次用户配置,使用户配置重新生效 - } - - // 删除为null及[delete]的项 - mergeApi.deleteNullItems(merged) - - logOrConsole.info('加载及合并远程配置完成') - return merged -} - -module.exports = { - getUserBasePath, - - loadConfigFromFile, - - getUserConfigPath, - getUserConfig, - - getRemoteConfigPath, - getRemoteConfig, - - getAutomaticCompatibleConfigPath, - - getConfigFromFiles, -} diff --git a/packages/core/src/config/remote_config.json5 b/packages/core/src/config/remote_config.json5 deleted file mode 100644 index 380e048ec6..0000000000 --- a/packages/core/src/config/remote_config.json5 +++ /dev/null @@ -1,226 +0,0 @@ -{ - "server": { - "compatible": { - "connect": { - "218.18.106.132:443": { - "ssl": true - } - }, - "request": { - "218.18.106.132:443": { - "rejectUnauthorized": false - } - } - }, - "intercepts": { - "github.com": { - "^(/[\\w-.]+){2,}/?(\\?.*)?$": { - "tampermonkeyScript": "https://raw.giteeusercontent.com/wangliang181230/dev-sidecar-config/raw/main/tampermonkey.js", - "script": "https://raw.giteeusercontent.com/wangliang181230/dev-sidecar-config/raw/main/GithubEnhanced-High-Speed-Download.user.js" - }, - "^(/[^/]+){2}/releases/download/.*$": { - "redirect": "ghp.ci/https://github.com", - "desc": "release文件加速下载重定向地址" - }, - "^(/[^/]+){2}/archive/.*\\.(zip|tar.gz)$": { - "redirect": "ghp.ci/https://github.com", - "desc": "release源代码加速下载重定向地址" - }, - "^((/[^/]+){2,})/raw((/[^/]+)+\\.(jpg|jpeg|png|gif))(\\?.*)?$": { - "sni": "baidu.com" // proxy拦截器不会使用 .* 中的sni配置,故补充此配置 - }, - "^((/[^/]+){2,})/raw((/[^/]+)+\\.js)(\\?.*)?$": { - "sni": "baidu.com" // proxy拦截器不会使用 .* 中的sni配置,故补充此配置 - } - }, - "api.github.com": { - ".*": { - "sni": "baidu.com" - } - }, - "github.githubassets.com": { - ".*": { - "sni": "baidu.com" - } - }, - "avatars.githubusercontent.com": { - ".*": { - "sni": "baidu.com" - } - }, - "camo.githubusercontent.com": { - ".*": { - "sni": "baidu.com" - } - }, - "collector.github.com": { - ".*": { - "sni": "baidu.com" - } - }, - "www.gstatic.com": { - "/recaptcha/.*": { - "proxy": "www.recaptcha.net" - } - } - }, - "preSetIpList": { - "github.com": [ - "4.237.22.38", - "20.26.156.215", - "20.27.177.113", - "20.87.245.0", - "20.200.245.247", - "20.201.28.151", - "20.205.243.166", - "140.82.113.3", - "140.82.114.4", - "140.82.116.3", - "140.82.116.4", - "140.82.121.3", - "140.82.121.4" - ], - "hub.docker.com": null // 1.8.2版本中,该域名的预设IP有问题,现在远程配置中删除 - }, - "dns": { - "mapping": { - "*.jetbrains.com": "quad9", - "*.azureedge.net": "quad9", - "*.stackoverflow.com": "quad9" - }, - "speedTest": { - "interval": 300000 - } - }, - "whiteList": { - "*.icloud.com": true, - "*.lenovo.net": true - } - }, - "proxy": { - "remoteDomesticDomainAllowListFileUrl": "https://raw.kkgithub.com/pluwen/china-domain-allowlist/main/allow-list.sorl", - "excludeIpList": { - // Github文件上传所使用的域名,被DS代理会导致文件上传经常失败,从系统代理中排除掉 - "objects-origin.githubusercontent.com": true, - // Github通过Actions上传的文件,下载时所需的域名,从系统代理中排除掉,否则下载会失败 - "*.windows.net": true, - // Github下载release文件的高速镜像地址 - "*.ghproxy.net": true, - "*.ghp.ci": true, - "*.kkgithub.com": true, - - // Github建站域名 - "*.github.io": true, - - // bilibili相关 - "*.bilicomic.com": true, - - // 中国移动云盘登录API - "[2049:8c54:813:10c::140]": true, - "[2409:8a0c:a442:ff40:a51f:4b9c:8b41:25ea]": true, - "[2606:2800:147:120f:30c:1ba0:fc6:265a]": true, - // 移动云盘相关 - "*.cmicapm.com": true, - - // cloudflare:排除以下域名,cloudflare的人机校验会更快,成功率更高。 - "*.cloudflare.com": true, - "*.cloudflare-cn.com": true, - - // VS相关 - "*.microsoftonline.com": true, // 此域名不排除的话,部分功能将出现异常 - "*.msecnd.net": true, - "*.msedge.net": true, - - // 卡巴斯基升级域名 - "*kaspersky*.com": true, - "*.upd.kaspersky.com": true, - - // sandbox沙盒域名 - "*.sandboxie-plus.com": true, - - // 无忧论坛 - "*.wuyou.net": true, - - // python建图包域名(浏览器) - "*.pyecharts.org": true, - - // 教育网站 - "*.bcloudlink.com": true, - - // 奇迹秀(资源) - "*.qijishow.com": true, - - // Z-Library - "*.z-lib.fo": true, - - // Finalshell(Linux学习网) - "*.finalshell.com": true, - - // MineBBS(我的世界中文论坛) - "*.minebbs.com": true, - - // 我的世界插件网 - "*.spigotmc.org": true, - - // bd测试 - "*.virustotal.com": true, - - // 未知 - "*.youdemai.com": true, - "*.casualthink.com": true, - "44.239.165.12": true, - "3.164.110.117": true - } - }, - "plugin": { - "overwall": { - "targets": { - "*.github.com": true, - "*github*.com": true, - "*.nodejs.org": true, - "*.npmjs.com": true, - "*.wikimedia.org": true, - "*.v2ex.com": true, - "*.azureedge.net": true, - "*.cloudfront.net": true, - "*.bing.com": true, - "*.discourse-cdn.com": true, - "*.gravatar.com": true, - "*.docker.com": true, - "*.vueuse.org": true, - "*.elastic.co": true, - "*.optimizely.com": true, - "*.stackpathcdn.com": true, - "*.fastly.net": true, - "*.cloudflare.com": true, - "*.233v2.com": true, - "*.v2fly.org": true, - "*.telegram.org": true, - "*.amazon.com": true, - "*.googleapis.com": true, - "*.google-analytics.com": true, - "*.cloudflareinsights.com": true, - "*.intlify.dev": true, - "*.segment.io": true, - "*.shields.io": true, - "*.jsdelivr.net": true, - "*.z-library.sk": true, - "*.zlibrary*.se": true, - - // 维基百科 - "*.wikipedia-on-ipfs.org": true, - - // ChatGPT - "*.oaiusercontent.com": true, // 在ChatGPT中生成文件并下载所需的域名 - - // Pixiv相关 - "*.pixiv.org": true, - "*.fanbox.cc": true, - "*.onesignal.com": true // pixiv站点,会加载该域名下的js脚本 - }, - "pac": { - "pacFileUpdateUrl": "https://raw.kkgithub.com/gfwlist/gfwlist/master/gfwlist.txt" - } - } - } -} diff --git a/packages/core/src/event.js b/packages/core/src/event.js deleted file mode 100644 index 3f5c47832b..0000000000 --- a/packages/core/src/event.js +++ /dev/null @@ -1,41 +0,0 @@ -const listener = {} -let index = 1 -function register (channel, handle, order = 10) { - let handles = listener[channel] - if (handles == null) { - handles = listener[channel] = [] - } - handles.push({ id: index, handle, order }) - handles.sort((a, b) => { - return a.order - b.order - }) - return index++ -} -function fire (channel, event) { - const handles = listener[channel] - if (handles == null) { - return - } - for (const item of handles) { - item.handle(event) - } -} - -function unregister (id) { - for (const key in listener) { - const handlers = listener[key] - for (let i = 0; i < handlers.length; i++) { - const handle = handlers[i] - if (handle.id === id) { - handlers.splice(i, 1) - return - } - } - } -} -const EventHub = { - register, - fire, - unregister, -} -module.exports = EventHub diff --git a/packages/core/src/expose.js b/packages/core/src/expose.js deleted file mode 100644 index 20dfb3f89b..0000000000 --- a/packages/core/src/expose.js +++ /dev/null @@ -1,143 +0,0 @@ -const lodash = require('lodash') -const config = require('./config-api') -const event = require('./event') -const modules = require('./modules') -const shell = require('./shell') -const status = require('./status') -const log = require('./utils/util.log.core') - -const context = { - config, - shell, - status, - event, - log, -} - -function setupPlugin (key, plugin, context, config) { - const pluginConfig = plugin.config - const PluginClass = plugin.plugin - const pluginStatus = plugin.status - const api = PluginClass(context) - config.addDefault(key, pluginConfig) - if (pluginStatus) { - lodash.set(status, key, pluginStatus) - } - return api -} - -const proxy = setupPlugin('proxy', modules.proxy, context, config) -const plugin = {} -for (const key in modules.plugin) { - const target = modules.plugin[key] - const api = setupPlugin(`plugin.${key}`, target, context, config) - plugin[key] = api -} -config.resetDefault() -const server = modules.server -const serverStart = server.start - -function newServerStart ({ mitmproxyPath }) { - return serverStart({ mitmproxyPath, plugins: plugin }) -} -server.start = newServerStart -async function startup ({ mitmproxyPath }) { - const conf = config.get() - if (conf.server.enabled) { - try { - await server.start({ mitmproxyPath }) - } catch (err) { - log.error('代理服务启动失败:', err) - } - } - if (conf.proxy.enabled) { - try { - await proxy.start() - } catch (err) { - log.error('开启系统代理失败:', err) - } - } - try { - const plugins = [] - for (const key in plugin) { - if (conf.plugin[key].enabled) { - const start = async () => { - try { - await plugin[key].start() - log.info(`插件【${key}】已启动`) - } catch (err) { - log.error(`插件【${key}】启动失败:`, err) - } - } - plugins.push(start()) - } - } - if (plugins && plugins.length > 0) { - await Promise.all(plugins) - } - } catch (err) { - log.error('开启插件失败:', err) - } -} - -async function shutdown () { - try { - const plugins = [] - for (const key in plugin) { - if (status.plugin[key] && status.plugin[key].enabled && plugin[key].close) { - const close = async () => { - try { - await plugin[key].close() - log.info(`插件【${key}】已关闭`) - } catch (err) { - log.error(`插件【${key}】关闭失败:`, err) - } - } - plugins.push(close()) - } - } - if (plugins.length > 0) { - await Promise.all(plugins) - } - } catch (error) { - log.error('插件关闭失败:', error) - } - - if (status.proxy.enabled) { - try { - await proxy.close() - log.info('系统代理已关闭') - } catch (err) { - log.error('系统代理关闭失败:', err) - } - } - if (status.server.enabled) { - try { - await server.close() - log.info('代理服务已关闭') - } catch (err) { - log.error('代理服务关闭失败:', err) - } - } -} - -const api = { - startup, - shutdown, - status: { - get () { - return status - }, - }, - config, - event, - shell, - server, - proxy, - plugin, - log, -} -module.exports = { - status, - api, -} diff --git a/packages/core/src/index.js b/packages/core/src/index.js deleted file mode 100644 index a5d007720a..0000000000 --- a/packages/core/src/index.js +++ /dev/null @@ -1,15 +0,0 @@ -const expose = require('./expose.js') -const log = require('./utils/util.log.core') -// process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' - -// 避免异常崩溃 -process.on('uncaughtException', (err) => { - log.error('Process Uncaught Exception:', err) -}) - -process.on('unhandledRejection', (reason, p) => { - log.error('Process Unhandled Rejection at: Promise:', p, ', reason:', reason) - // application specific logging, throwing an error, or other logic here -}) - -module.exports = expose diff --git a/packages/core/src/merge.js b/packages/core/src/merge.js deleted file mode 100644 index 79256807ae..0000000000 --- a/packages/core/src/merge.js +++ /dev/null @@ -1,87 +0,0 @@ -const lodash = require('lodash') - -/** - * 找出 newObj 相对于 oldObj 有差异的部分 - * - * @param oldObj - * @param newObj - * @returns {{}|*} - */ -function doDiff (oldObj, newObj) { - if (newObj == null) { - return oldObj - } - - // 临时的对象,用于找出被删除的数据 - const tempObj = { ...oldObj } - // 删除空项,使差异对象更干净一些,体现出用户自定义内容 - deleteNullItems(tempObj) - - // 保存差异的对象 - const diffObj = {} - - // 读取新对象,并解析 - for (const key in newObj) { - const newValue = newObj[key] - const oldValue = oldObj[key] - - // 新值不为空,旧值为空时,直接取新值 - if (newValue != null && oldValue == null) { - diffObj[key] = newValue - continue - } - // 新旧值相等时,忽略 - if (lodash.isEqual(newValue, oldValue)) { - delete tempObj[key] - continue - } - // 新的值为数组时,直接取新值 - if (lodash.isArray(newValue)) { - diffObj[key] = newValue - delete tempObj[key] - continue - } - - // 新的值为对象时,递归合并 - if (lodash.isObject(newValue)) { - diffObj[key] = doDiff(oldValue, newValue) - delete tempObj[key] - continue - } - - // 基础类型,直接覆盖 - delete tempObj[key] - diffObj[key] = newValue - } - - // tempObj 里面剩下的是被删掉的数据 - lodash.forEach(tempObj, (oldValue, key) => { - // 将被删除的属性设置为null,目的是为了merge时,将被删掉的对象设置为null,达到删除的目的 - diffObj[key] = null - }) - - return diffObj -} - -function deleteNullItems (target) { - lodash.forEach(target, (item, key) => { - if (item == null || item === '[delete]') { - delete target[key] - } - if (lodash.isObject(item)) { - deleteNullItems(item) - } - }) -} - -module.exports = { - doMerge (oldObj, newObj) { - return lodash.mergeWith(oldObj, newObj, (objValue, srcValue) => { - if (lodash.isArray(objValue)) { - return srcValue - } - }) - }, - doDiff, - deleteNullItems, -} diff --git a/packages/core/src/modules/index.js b/packages/core/src/modules/index.js deleted file mode 100644 index c93790a8a1..0000000000 --- a/packages/core/src/modules/index.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - server: require('./server'), - proxy: require('./proxy'), - plugin: require('./plugin'), -} diff --git a/packages/core/src/modules/plugin/free-eye/README.md b/packages/core/src/modules/plugin/free-eye/README.md deleted file mode 100644 index d416297d8a..0000000000 --- a/packages/core/src/modules/plugin/free-eye/README.md +++ /dev/null @@ -1,74 +0,0 @@ -# 网络审查检测器 - -FreeEye 是一个用 JavaScript 编写的网络审查检测器,自动化检测网络环境并推荐可能的规避方法。 - -为中国大陆用户设计,但也可用于其他地区。 - -希望使得用户能够使用本工具回答以下问题: - -1. 我的网络是被审查了,还是只是出现了异常故障? -2. 使用了哪些审查手段? -3. 有哪些规避方法可以绕过这些审查? - -## 使用方法 - -前提条件是你需要在设备上安装 `node.js`。 - -启动向导的方法: - -```bash -git clone https://github.com/cute-omega/free-eye.git -cd free-eye -npm install -npm start -``` - -(如果你不准备进行开发,可以跳过 `npm install`并直接运行 `npm start`;中国大陆用户可能需要设置npm镜像) - -不同测试的代码位于 `checkpoints/` 目录中。每个测试都有唯一的 `tag` 标识。单个测试的参数在 `config.json` 文件中设置,使用测试的 tag 作为键: - -```json -{ - "tag": { - // 测试特定的参数 - } - // ... -} -``` - -## 测试 - -### Route(路由) - -通过尝试创建一个套接字并连接到一个非本地地址,检测设备是否具有互联网连通性。 - -### DNS - -使用系统的 DNS 解析器尝试解析允许和被封锁的主机名。测试被封锁主机名是否存在 DNS 缓存投毒。 - -### TCP - -尝试与已知允许和已知被封锁的 IP 地址建立 TCP 连接。 - -### TLS - -尝试与已知允许但可能遭受审查的 IP 地址(例如对中国用户来说的“干净”的外国 IP)完成 TLS 握手。测试内容包括: - -- 不带任何 SNI 的握手 -- 带已知允许的 SNI 的握手 -- 带已知被封锁的 SNI 的握手 - -还测试将 TLS 记录分片作为一种规避方法,通过尝试对被封锁的 SNI 进行握手但分片 ClientHello 来实现。 - -## 编写你自己的测试 - -如果你想编写自定义测试,只需实现 `template.js` 中描述的接口,将测试模块保存到 `checkpoints/` 目录,并在 `config.json` 中添加该测试的参数。 - -## 相关项目 - -本项目受到来自 [wallpunch/wizard](https://github.com/wallpunch/wizard) 的启发; -用作 [docmirror/dev-sidecar](https://github.com/docmirror/dev-sidecar) 中的网络检测插件。 - ---- - -不论在哪里,人们的目光都应该是自由的。 diff --git a/packages/core/src/modules/plugin/free-eye/checkpoints/dns.js b/packages/core/src/modules/plugin/free-eye/checkpoints/dns.js deleted file mode 100644 index 25dddc3757..0000000000 --- a/packages/core/src/modules/plugin/free-eye/checkpoints/dns.js +++ /dev/null @@ -1,152 +0,0 @@ -import { randomBytes } from 'node:crypto' -import { promises as dns } from 'node:dns' -import { TestGroup } from '../template.js' -import { FAMILY_VALUES, getCensorsString, getResultIcon } from '../utils.js' - -class DnsTester extends TestGroup { - /** - * A test group to assess the system's DNS resolver - */ - constructor (globalConfig, globalResults) { - super(globalConfig, globalResults, 'DNS') - } - - static getTestTag () { - return 'DNS' - } - - static getPrereqs () { - return ['Route'] - } - - getDefaultResults () { - return { - IPv4: false, - IPv6: false, - } - } - - checkIfShouldSkip (globalResults) { - /** - * Skip this test if all routing tests failed - */ - let skip = true - for (const family in FAMILY_VALUES) { - if (Object.values(globalResults.Route[family]).includes(true)) { - this.results[family] = {} - skip = false - } - } - if (skip) { - return 'no routable networks' - } - return null - } - - async startTest () { - this.testPrefix = `${randomBytes(30).toString('hex')}.` - console.log(`Using POISON test prefix: ${this.testPrefix}`) - - for (const family in FAMILY_VALUES) { - if (this.results[family] === false) { - continue // not routable - } - for (const host of this.config.allow) { - this.startResolveTest(host, family, false) - } - for (const host of this.config.block) { - this.startResolveTest(host, family, true) - } - } - } - - async startResolveTest (host, family, testPoison) { - const testPrefs = [''] - if (testPoison) { - testPrefs.push(this.testPrefix) - } - for (const prefix of testPrefs) { - this.startTestThread( - DnsTester.resolveThread, - [family, prefix + host], - `${family}, ${host}${prefix ? ', POISON' : ''}`, - this.config.timeout, - ) - } - } - - logResults () { - let resStr = '' - for (const [family, results] of Object.entries(this.results)) { - if (results === false) { - continue - } - this.results[family] = true - const allowList = this.config.allow - const allowOkCnt = allowList.reduce((sum, host) => sum + (results[host] || 0), 0) - const allowTotal = allowList.length - let resIcon - if (allowOkCnt === allowTotal) { // DNS can resolve - resIcon = getResultIcon(true) - } else if (allowOkCnt === 0) { // DNS can't resolve - resIcon = getResultIcon(false) - this.results[family] = false - } else { // test inconclusive - resIcon = getResultIcon(null, `resolved ${allowOkCnt}/${allowTotal}`) - } - resStr += `${family}: DNS ${resIcon}\n` - - const censors = [] - const blockList = this.config.block - const blockOkCnt = blockList.reduce((sum, host) => sum + (results[host] || 0), 0) - const blockTotal = blockList.length - if (blockOkCnt < blockTotal) { - censors.push(`DNS blocking: ${blockTotal - blockOkCnt}/${blockTotal} blocked`) - } - - const blockPoisonCnt = blockList.reduce((sum, host) => sum + (results[this.testPrefix + host] || 0), 0) - if (blockPoisonCnt > 0) { - censors.push(`DNS poisoning: ${blockPoisonCnt}/${blockTotal} poisoned`) - } - resStr += getCensorsString(censors) - } - return resStr - } - - static async resolveThread (timeout, logger, results, family, host) { - if (results[family] === false) { - return // Not routable - } - results[family][host] = 0 // default to failed - try { - let records - if (FAMILY_VALUES[family] === 4) { - records = await dns.resolve4(host) - } else { - records = await dns.resolve6(host) - } - if (!timeout.isSet) { - logger(`Got ${records.length} records`) - results[family][host] = 1 - } else { - logger(`Timeout occurred for ${host}`) - } - } catch (error) { - if (!timeout.isSet) { - logger(`Failed with error: ${error.message}`) - results[family][host] = 0 // explicitly set to failed - } else { - logger(`Timeout occurred for ${host}`) - } - } - } -} - -function getClientTests () { - return [DnsTester] -} - -export default { - DnsTester, - getClientTests, -} diff --git a/packages/core/src/modules/plugin/free-eye/checkpoints/route.js b/packages/core/src/modules/plugin/free-eye/checkpoints/route.js deleted file mode 100644 index 4eb1100561..0000000000 --- a/packages/core/src/modules/plugin/free-eye/checkpoints/route.js +++ /dev/null @@ -1,142 +0,0 @@ -import { createSocket } from 'node:dgram' -import { createConnection } from 'node:net' -import { TestGroup } from '../template.js' -import { FAMILY_VALUES, getResultIcon, PROTOCOL_VALUES } from '../utils.js' - -const ROUTE_TEST_DGRAM = Buffer.from('122401000000000000000006676f6f676c6503636f6d0000010001', 'hex') - -class RouteTester extends TestGroup { - /** - * A test group to assess the system's routing capability - */ - constructor (globalConfig, globalResults) { - super(globalConfig, globalResults, 'Route') - } - - static getTestTag () { - return 'Route' - } - - getDefaultResults () { - return { - IPv4: { - TCP: false, - UDP: false, - }, - IPv6: { - TCP: false, - UDP: false, - }, - } - } - - async startTest () { - for (const family in FAMILY_VALUES) { - for (const protocol in PROTOCOL_VALUES) { - const dst = [this.config.addrs[family], this.config.port] - this.startTestThread( - RouteTester.routeThread, - [family, protocol, dst], - `${family}, ${protocol}`, - this.config.timeout, - ) - } - } - } - - logResults () { - let resStr = '' - for (const family in FAMILY_VALUES) { - resStr += `${family}: ` - for (const protocol in PROTOCOL_VALUES) { - const resIcon = this.results[family][protocol] ? getResultIcon(true) : getResultIcon(false) - resStr += `${protocol} ${resIcon} ` - } - resStr += '\n' - } - return resStr - } - - static async routeThread (timeout, logger, results, family, protocol, dst) { - let sock - try { - logger('Creating socket...') - if (protocol === 'TCP') { - sock = createConnection({ - host: dst[0], - port: dst[1], - family: FAMILY_VALUES[family] === 4 ? 4 : 6, - }) - } else { // UDP - sock = createSocket({ - type: FAMILY_VALUES[family] === 4 ? 'udp4' : 'udp6', - }) - } - - if (timeout.isSet) { - if (sock) { - if (protocol === 'UDP') { - sock.close() - } else { - sock.destroy() - } - } - return - } - - if (protocol === 'TCP') { - logger(`Connecting socket to ${dst[0]}:${dst[1]}`) - await new Promise((resolve, reject) => { - sock.connect(dst[1], dst[0], resolve) - sock.on('error', reject) - sock.on('timeout', () => reject(new Error('timeout'))) - }) - } else { // UDP - logger(`Sending datagram to ${dst[0]}:${dst[1]}`) - sock.send(ROUTE_TEST_DGRAM, 0, ROUTE_TEST_DGRAM.length, dst[1], dst[0]) - } - if (protocol === 'UDP') { - sock.close() - } else { - sock.destroy() - } - } catch (error) { - if (!timeout.isSet) { - logger(`Failed with exception: ${error.message}`) - // For routing test, connection errors often mean the network is routable - // but the service is not available (e.g., TCP to DNS port) - if (error.code === 'ECONNREFUSED' || error.code === 'EINVAL' || error.code === 'ENETUNREACH' || error.message.includes('timeout')) { - logger('Routing successful!') - results[family][protocol] = true - if (sock) { - if (protocol === 'UDP') { - sock.close() - } else { - sock.destroy() - } - } - return - } - } - if (sock) { - if (protocol === 'UDP') { - sock.close() - } else { - sock.destroy() - } - } - return - } - logger('Routing successful!') - results[family][protocol] = true - } -} - -function getClientTests () { - return [RouteTester] -} - -export default { - RouteTester, - getClientTests, -} diff --git a/packages/core/src/modules/plugin/free-eye/checkpoints/tcp.js b/packages/core/src/modules/plugin/free-eye/checkpoints/tcp.js deleted file mode 100644 index 32c353f69b..0000000000 --- a/packages/core/src/modules/plugin/free-eye/checkpoints/tcp.js +++ /dev/null @@ -1,164 +0,0 @@ -import { createConnection } from 'node:net' -import { TestGroup } from '../template.js' -import { FAMILY_VALUES, getCensorsString, getResultIcon } from '../utils.js' - -class TcpTester extends TestGroup { - /** - * A test group to assess the system's ability to establish - * TCP connections - */ - constructor (globalConfig, globalResults) { - super(globalConfig, globalResults, 'TCP') - } - - static getTestTag () { - return 'TCP' - } - - static getPrereqs () { - return ['Route'] - } - - getDefaultResults () { - return { - IPv4: false, - IPv6: false, - } - } - - checkIfShouldSkip (globalResults) { - /** - * Skip if TCP routing tests all failed - */ - let skip = true - for (const family in FAMILY_VALUES) { - if (globalResults.Route[family].TCP) { - this.results[family] = {} - skip = false - } - } - if (skip) { - return 'no routable TCP networks' - } - return null - } - - async startTest () { - for (const family in FAMILY_VALUES) { - if (this.results[family] === false) { - continue // not routable - } - for (const port of this.config.ports) { - this.results[family][port] = {} - const addrs = this.config.addrs[family] - for (const key of ['allow', 'block']) { - for (const addr of addrs[key]) { - this.startTestThread( - TcpTester.tcpThread, - [family, port, addr], - `${key}, ${addr}:${port}`, - this.config.timeout, - ) - } - } - } - } - } - - logResults () { - let resStr = '' - for (const [family, portRes] of Object.entries(this.results)) { - if (portRes === false) { - continue - } - resStr += `${family}: ` - const censors = [] - const addrs = this.config.addrs[family] - for (const [port, results] of Object.entries(portRes)) { - const dstTag = `TCP:${port}` - const allowList = addrs.allow - const allowOkCnt = allowList.reduce((sum, addr) => sum + (results[addr] === null ? 1 : 0), 0) - const allowTotal = allowList.length - let resIcon - if (allowOkCnt === allowTotal) { // can connect - resIcon = getResultIcon(true) - } else if (allowOkCnt === 0) { // can't connect - resIcon = getResultIcon(false) - } else { // test inconclusive - resIcon = getResultIcon(null, `connected ${allowOkCnt}/${allowTotal}`) - } - resStr += `${dstTag} ${resIcon} ` - - const blockList = addrs.block - const blocksTotal = blockList.length - - const timeoutCnt = blockList.reduce((sum, addr) => sum + (results[addr] === 'timeout' ? 1 : 0), 0) - if (timeoutCnt > 0) { - censors.push(`Blocked ${dstTag} handshake timeouts: ${timeoutCnt}/${blocksTotal} timeouts`) - } - - const errorCnt = blockList.reduce((sum, addr) => sum + (results[addr] === 'error' ? 1 : 0), 0) - if (errorCnt > 0) { - censors.push(`Blocked ${dstTag} handshake errors: ${errorCnt}/${blocksTotal} errors`) - } - } - resStr += `\n${getCensorsString(censors)}` - } - return resStr - } - - static async tcpThread (timeout, logger, results, family, port, addr) { - results[family][port][addr] = 'timeout' - - const sock = createConnection({ - host: addr, - port, - family: FAMILY_VALUES[family] === 4 ? 4 : 6, - }) - - // Set socket timeout - sock.setTimeout(1000) // 1 second timeout - - if (timeout.isSet) { - sock.destroy() - return - } - - try { - const dst = `${addr}:${port}` - logger(`Connecting socket to ${dst}`) - await new Promise((resolve, reject) => { - sock.on('connect', resolve) - sock.on('error', reject) - sock.on('timeout', () => reject(new Error('timeout'))) - }) - if (timeout.isSet) { - sock.destroy() - return - } - } catch (error) { - if (!timeout.isSet) { - logger(`Failed with exception: ${error.message}`) - if (error.message === 'timeout') { - results[family][port][addr] = 'timeout' - } else { - results[family][port][addr] = 'error' - } - } - sock.destroy() - return - } - logger('Connected!') - results[family][port][addr] = null - sock.destroy() - } -} - -function getClientTests () { - return [TcpTester] -} - -export default { - TcpTester, - getClientTests, -} diff --git a/packages/core/src/modules/plugin/free-eye/checkpoints/tls.js b/packages/core/src/modules/plugin/free-eye/checkpoints/tls.js deleted file mode 100644 index dd09610db7..0000000000 --- a/packages/core/src/modules/plugin/free-eye/checkpoints/tls.js +++ /dev/null @@ -1,190 +0,0 @@ -import net from 'node:net' -import tls from 'node:tls' -import { TestGroup } from '../template.js' -import { FAMILY_VALUES, getCensorsString, getResultIcon, LogColors } from '../utils.js' - -const SNI_TEST_STRATEGIES = ['none', 'allow', 'block', 'frag'] - -class TlsTester extends TestGroup { - /** - * A test group to assess the system's ability to - * establish TLS connections - */ - constructor (globalConfig, globalResults) { - super(globalConfig, globalResults, 'TLS') - } - - static getTestTag () { - return 'TLS' - } - - static getPrereqs () { - return ['Route', 'TCP'] - } - - getDefaultResults () { - return { - IPv4: false, - IPv6: false, - } - } - - checkIfShouldSkip (globalResults) { - /** - * Skip if TCP test failed - */ - let skip = true - for (const family in FAMILY_VALUES) { - const tcpRes = globalResults.TCP && globalResults.TCP[family] - if (tcpRes && tcpRes[443] && Object.values(tcpRes[443]).includes(null)) { - this.results[family] = {} - skip = false - } - } - if (skip) { - return 'cannot make TCP connections' - } - return null - } - - async startTest () { - for (const family in FAMILY_VALUES) { - if (this.results[family] === false) { - continue - } - const addr = this.config.addrs[family] - if (!addr) { - this.results[family] = false - continue - } - this.results[family] = this.results[family] || {} - for (const strategy of SNI_TEST_STRATEGIES) { - let sni = null - if (strategy === 'allow') { - sni = this.config.snis.allow - } else if (strategy === 'block' || strategy === 'frag') { - sni = this.config.snis.block - } - this.startTestThread( - TlsTester.tlsThread, - [family, addr, sni, strategy], - `${family}, ${strategy}`, - this.config.timeout, - ) - } - } - } - - logResults () { - let resStr = '' - for (const [family, results] of Object.entries(this.results)) { - if (results === false) { - continue - } - resStr += `${family}: ` - const noneIcon = getResultIcon(results.none === null) - resStr += `IP-only ${noneIcon} ` - const allowIcon = getResultIcon(results.allow === null) - resStr += `SNI ${allowIcon}\n` - - const censors = [] - const blockRes = results.block - if (blockRes !== null) { - censors.push(`Blocked SNI handshake ${blockRes}`) - } - resStr += getCensorsString(censors) - - const fragRes = results.frag - if (fragRes === null) { - resStr += ` Circumvention found: ${LogColors.GREEN}TLS record fragmentation${LogColors.RESET}\n` - } else if (fragRes) { - resStr += ` ${LogColors.RED}TLS record fragmentation ${fragRes}${LogColors.RESET}\n` - } else { - resStr += ' TLS record fragmentation test inconclusive\n' - } - } - return resStr - } - - static async tlsThread (timeout, logger, results, family, addr, sni, strategy) { - results[family][strategy] = 'timeout' - - const sock = net.createConnection({ - host: addr, - port: 443, - family: FAMILY_VALUES[family] === 4 ? 4 : 6, - }) - sock.setTimeout(1000) - - if (timeout.isSet) { - sock.destroy() - return - } - - try { - const dst = `${addr}:443` - logger(`Connecting socket to ${dst}`) - await new Promise((resolve, reject) => { - sock.on('connect', resolve) - sock.on('error', reject) - sock.on('timeout', () => reject(new Error('timeout'))) - }) - } catch (error) { - if (!timeout.isSet) { - logger(`Connect failed with exception: ${error.message}`) - results[family][strategy] = error.message === 'timeout' ? 'timeout' : 'error' - } - sock.destroy() - return - } - - let errMsg = null - try { - logger('Attempting TLS handshake') - await new Promise((resolve, reject) => { - const tlsSock = tls.connect({ - socket: sock, - servername: sni || undefined, - rejectUnauthorized: false, - }, resolve) - tlsSock.on('error', (error) => { - logger(`TLS error: ${error.code} - ${error.message}`) - if (strategy === 'block' && error.code === 'ERR_SSL_SSLV3_ALERT_HANDSHAKE_FAILURE') { - resolve() - } else if ((strategy === 'allow' || strategy === 'none') && error.code === 'ECONNRESET') { - resolve() - } else { - reject(error) - } - }) - }) - } catch (error) { - if (error.code !== 'ERR_SSL_SSLV3_ALERT_HANDSHAKE_FAILURE') { - errMsg = error.message - } - } - - if (timeout.isSet) { - sock.destroy() - return - } - - if (errMsg === null) { - logger('TLS handshake complete!') - results[family][strategy] = null - } else { - logger(`TLS handshake failed with error: ${errMsg}`) - results[family][strategy] = 'error' - } - sock.destroy() - } -} - -function getClientTests () { - return [TlsTester] -} - -export default { - TlsTester, - getClientTests, -} diff --git a/packages/core/src/modules/plugin/free-eye/client.js b/packages/core/src/modules/plugin/free-eye/client.js deleted file mode 100644 index e7f08410c0..0000000000 --- a/packages/core/src/modules/plugin/free-eye/client.js +++ /dev/null @@ -1,147 +0,0 @@ -import fs from 'node:fs' -import { createRequire } from 'node:module' -import path from 'node:path' -import utils from './utils.js' - -const printHeader = (utils && utils.printHeader) || (utils && utils.default && utils.default.printHeader) - -const TEST_PACKAGE_DIR = 'checkpoints' -const PLUGIN_RELATIVE_PATH = path.join('packages', 'core', 'src', 'modules', 'plugin', 'free-eye') - -function locatePluginRoot () { - const localConfig = path.join(__dirname, 'config.json') - if (fs.existsSync(localConfig)) { - return __dirname - } - - let current = __dirname - for (let i = 0; i < 8; i += 1) { - const candidate = path.join(current, PLUGIN_RELATIVE_PATH) - if (fs.existsSync(path.join(candidate, 'config.json'))) { - return candidate - } - const parent = path.dirname(current) - if (parent === current) { - break - } - current = parent - } - return __dirname -} - -const PLUGIN_ROOT = locatePluginRoot() -const pluginRequire = createRequire(path.join(PLUGIN_ROOT, 'index.js')) - -function resolveTestsDir (customDir) { - const fallbackDir = path.join(PLUGIN_ROOT, TEST_PACKAGE_DIR) - if (!customDir) { - return fallbackDir - } - if (path.isAbsolute(customDir)) { - return fs.existsSync(customDir) ? customDir : fallbackDir - } - const candidate = path.join(PLUGIN_ROOT, customDir) - return fs.existsSync(candidate) ? candidate : fallbackDir -} - -async function loadAllTests (testsDir, globalConfig) { - const tests = [] - const resolvedDir = resolveTestsDir(testsDir) - if (!fs.existsSync(resolvedDir)) { - throw new Error(`Tests directory not found: ${resolvedDir}`) - } - const files = fs.readdirSync(resolvedDir).filter(file => file.endsWith('.js') && file !== '__init__.js') - - for (const file of files) { - const modulePath = path.join(resolvedDir, file) - - const module = pluginRequire(modulePath) - const getClientTests = module.getClientTests || (module.default && module.default.getClientTests) - if (typeof getClientTests === 'function') { - for (const testCls of getClientTests()) { - if (testCls.getTestTag() in globalConfig) { - tests.push(testCls) - } - } - } - } - return tests -} - -function getNextTest (todoTests, doneTests) { - for (const testCls of todoTests) { - let allPrereqsDone = true - for (const testTag of testCls.getPrereqs()) { - if (!doneTests.includes(testTag)) { - allPrereqsDone = false - break - } - } - if (allPrereqsDone) { - return testCls - } - } - return null -} - -async function runTests (options = {}) { - const { testsDir, config } = options - - const globalConfig = (config && typeof config === 'object') ? config : null - if (!globalConfig) { - throw new Error('FreeEye runtime config is required.') - } - - const globalResults = {} - const summaries = [] - const todoTests = await loadAllTests(testsDir, globalConfig) - console.log( - `Loaded ${todoTests.length} tests: ${ - todoTests.map(t => t.getTestTag()).join(' ')}`, - ) - - const doneTests = [] - while (todoTests.length > 0) { - const TestCls = getNextTest(todoTests, doneTests) - if (!TestCls) { - break - } - - const testGroup = new TestCls(globalConfig, globalResults) - const testTag = testGroup.testTag - const summary = { tag: testTag, skipped: false } - printHeader(`${testTag} Test`, false) - if (testGroup.skipReason === null) { - const [testTime, testResults] = await testGroup.runTest() - summary.duration = testTime - summary.output = testResults - summary.resultSnapshot = testGroup.results - printHeader(`${testTag} Results: (done in ${testTime.toFixed(3)}s)`, true) - console.log(testResults) - } else { - summary.skipped = true - summary.skipReason = testGroup.skipReason - summary.output = `Test skipped because ${testGroup.skipReason}` - console.log(summary.output) - } - summaries.push(summary) - todoTests.splice(todoTests.indexOf(TestCls), 1) - doneTests.push(testTag) - } - console.log('All tests complete!') - return { - results: globalResults, - summaries, - totalTests: summaries.length, - completedTests: summaries.filter(item => !item.skipped).length, - } -} - -if (require.main === module) { - runTests().catch((error) => { - console.error(error) - process.exitCode = 1 - }) -} - -export default { runTests } diff --git a/packages/core/src/modules/plugin/free-eye/config.js b/packages/core/src/modules/plugin/free-eye/config.js deleted file mode 100644 index 138224b8a6..0000000000 --- a/packages/core/src/modules/plugin/free-eye/config.js +++ /dev/null @@ -1,18 +0,0 @@ -import mainConfig from '../../../config/index.js' - -export default { - name: '网络检测', - statusOff: true, - enabled: false, - tip: '运行网络检测来评估当前网络环境', - startup: {}, - // FreeEye 自带一套 tests(位于本目录的 checkpoints/), - // 这里保留最小配置以便在 dev-sidecar 中显示和切换插件。 - setting: { - testsDir: 'checkpoints', - // 默认网络请求超时时间(秒),插件内部的测试可以参考或覆盖 - defaultTimeout: 3, - // 复用主配置里的 free_eye 默认值,避免重复维护两份配置 - config: (mainConfig.configFromFiles ? mainConfig.configFromFiles.plugin.free_eye : mainConfig.plugin.free_eye), - }, -} diff --git a/packages/core/src/modules/plugin/free-eye/index.js b/packages/core/src/modules/plugin/free-eye/index.js deleted file mode 100644 index 5777de939d..0000000000 --- a/packages/core/src/modules/plugin/free-eye/index.js +++ /dev/null @@ -1,157 +0,0 @@ -import fs from 'node:fs' -import path from 'node:path' -import clientModule from './client.js' - -const runTests = clientModule.runTests -import freeEyeConfig from './config.js' - -const PLUGIN_STATUS_KEY = 'plugin.free_eye' - -const FreeEyePlugin = function (context) { - const { config, event, log } = context - let lastResult = null - - const resolvePath = (targetPath, defaultRelative) => { - const fallback = path.join(__dirname, defaultRelative) - if (!targetPath) { - return fallback - } - if (path.isAbsolute(targetPath)) { - return targetPath - } - const candidates = [ - path.join(__dirname, targetPath), - path.join(process.cwd(), targetPath), - ] - for (const candidate of candidates) { - if (fs.existsSync(candidate)) { - return candidate - } - } - return fallback - } - - const emitStatus = (key, value) => { - event.fire('status', { key, value }) - } - - const captureLogs = async (executor) => { - const logs = [] - const originalLog = console.log - const originalError = console.error - const push = (level, args) => { - const message = args.map((item) => { - if (item instanceof Error) { - return item.stack || item.message - } - if (typeof item === 'object') { - try { - return JSON.stringify(item) - } catch (err) { - return String(item) - } - } - return String(item) - }).join(' ') - logs.push({ level, message, timestamp: Date.now() }) - // Also write to system log so it follows configured logging format - if (level === 'error') { - log.error(message) - } else { - log.info(message) - } - } - console.log = (...args) => { - push('info', args) - originalLog(...args) - } - console.error = (...args) => { - push('error', args) - originalError(...args) - } - try { - const result = await executor() - return { result, logs } - } finally { - console.log = originalLog - console.error = originalError - } - } - - const storeResult = (payload) => { - lastResult = payload - emitStatus(`${PLUGIN_STATUS_KEY}.result`, lastResult) - } - - const executeTests = async () => { - const currentConfig = config.get() - const setting = currentConfig.plugin.free_eye.setting || {} - try { - const { result, logs } = await captureLogs(() => runTests(setting)) - const payload = { - finishedAt: new Date().toISOString(), - totalTests: result.totalTests, - completedTests: result.completedTests, - summaries: result.summaries, - results: result.results, - logs, - } - storeResult(payload) - return payload - } catch (err) { - const payload = { - finishedAt: new Date().toISOString(), - error: err.message, - } - storeResult(payload) - throw err - } - } - - const api = { - async start () { - emitStatus(`${PLUGIN_STATUS_KEY}.enabled`, true) - log.info('启动【FreeEye】插件') - try { - return await executeTests() - } catch (err) { - log.error('FreeEye runTests failed:', err) - throw err - } - }, - - async close () { - emitStatus(`${PLUGIN_STATUS_KEY}.enabled`, false) - log.info('关闭【FreeEye】插件') - }, - - async restart () { - await api.close() - return api.start() - }, - - isEnabled () { - const pluginConfig = config.get().plugin.free_eye - return pluginConfig && pluginConfig.enabled - }, - - async run () { - return executeTests() - }, - - async getLastResult () { - return lastResult - }, - } - return api -} - -export default { - key: 'free_eye', - config: freeEyeConfig, - status: { - enabled: false, - result: null, - }, - plugin: FreeEyePlugin, -} diff --git a/packages/core/src/modules/plugin/free-eye/template.js b/packages/core/src/modules/plugin/free-eye/template.js deleted file mode 100644 index 7e91b1b2ff..0000000000 --- a/packages/core/src/modules/plugin/free-eye/template.js +++ /dev/null @@ -1,143 +0,0 @@ -import { performance } from 'node:perf_hooks' - -class TestThread { - /** - * A single test that should be run in its own thread and - * preempted when its timeout is reached - */ - constructor (func, args, logHdr, timeout, results) { - this.logHdr = logHdr - this.log('Starting test...') - - this.timeoutEvent = { isSet: false } - this.results = results - this.startTime = performance.now() - this.timeout = timeout * 1000 // convert to ms - - // Start the async function and store the promise - this.runPromise = this.run(func, args) - } - - log (s) { - console.log(this.logHdr + s) - } - - async run (func, args) { - const timeoutPromise = new Promise((_, reject) => { - setTimeout(() => { - this.timeoutEvent.isSet = true - reject(new Error('Test timed out!')) - }, this.timeout) - }) - - try { - await Promise.race([ - func(this.timeoutEvent, this.log.bind(this), this.results, ...args), - timeoutPromise, - ]) - } catch (error) { - if (error.message === 'Test timed out!') { - this.log('Test timed out!') - } else { - this.log(`Test failed: ${error.message}`) - } - } - } -} - -class TestGroup { - /** - * A group of related tests that can be run in parallel. - */ - constructor (globalConfig, globalResults, testTag) { - this.testTag = testTag - this.startTime = performance.now() - this.config = globalConfig[testTag] - this.threads = [] - - this.results = this.getDefaultResults() - globalResults[testTag] = this.results - this.skipReason = this.checkIfShouldSkip(globalResults) - } - - /** - * Return a string identifying this test group - */ - static getTestTag () { - return '' - } - - /** - * Return the tags of other tests this test relies on - */ - static getPrereqs () { - return [] - } - - /** - * Return this test's default (i.e. all failed) results - */ - getDefaultResults () { - return {} - } - - checkIfShouldSkip (globalResults) { - /** - * If earlier results indicate this test shouldn't be run - * return a string indicating why (otherwise return null) - */ - return null - } - - async runTest () { - /** - * Wait for all running test threads to complete or - * timeout, then log the results and return a summary. - */ - await this.startTest() - // Wait for all threads to complete - await Promise.all(this.threads.map(thread => thread.runPromise)) - const testResults = this.logResults() - const testTime = (performance.now() - this.startTime) / 1000 // convert to seconds - return [testTime, testResults] - } - - async startTest () { - /** - * Implemented by subclasses to create the test threads - */ - // To be implemented by subclasses - } - - startTestThread (func, args, logTag, timeout) { - /** - * Create a new test thread in this test group - */ - const threadIdx = this.threads.length - const logHdr = `${this.testTag} #${threadIdx} (${logTag}): ` - const thread = new TestThread(func, args, logHdr, timeout, this.results) - this.threads.push(thread) - } - - logResults () { - /** - * Log the results of the completed test threads and - * return a string summarizing the results. - */ - return '' - } -} - -function getClientTests () { - /** - * Return a list of TestGroup classes defined in this - * module that clients should run - */ - return [] -} - -export default { - TestThread, - TestGroup, - getClientTests, -} diff --git a/packages/core/src/modules/plugin/free-eye/utils.js b/packages/core/src/modules/plugin/free-eye/utils.js deleted file mode 100644 index 134f332162..0000000000 --- a/packages/core/src/modules/plugin/free-eye/utils.js +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Various utility functions shared by tests - */ - -// Linking socket constants to human-readable strings -const FAMILY_VALUES = { - IPv4: 4, - IPv6: 6, -} -const PROTOCOL_VALUES = { - TCP: 'tcp', - UDP: 'udp', -} - -class LogColors { - /** - * ANSI color codes for pretty terminal output - * Update: Dev-sidecar doesn't support ANSI color codes in its console output. - */ - static RESET = '' - static RED = '' - static GREEN = '' - static YELLOW = '' - static BLUE = '' - static MAGENTA = '' - static CYAN = '' - static WHITE = '' -} - -const DISPLAY_WIDTH = 50 - -function printHeader (title, isRes) { // test start, test res - const sep = `\n${'='.repeat(DISPLAY_WIDTH)}\n` - console.log( - (isRes ? LogColors.MAGENTA : LogColors.CYAN) - + sep + title.padStart(Math.floor((DISPLAY_WIDTH + title.length) / 2)).padEnd(DISPLAY_WIDTH) + sep - + LogColors.RESET, - ) -} - -function getResultIcon (success, infoStr = null) { - let resColor, resIcon - if (success === true) { - resColor = LogColors.GREEN - resIcon = '✔' - } else if (success === false) { - resColor = LogColors.RED - resIcon = '✖' - } else { // test inconclusive - resColor = LogColors.YELLOW - resIcon = '?' - } - if (infoStr !== null) { - resIcon += ` ${infoStr}` - } - return `(${resColor}${resIcon}${LogColors.RESET})` -} - -function getCensorsString (censors) { - let resStr = '' - if (censors && censors.length > 0) { - for (const c of censors) { - resStr += ` Censorship detected: ${LogColors.RED}${c}${LogColors.RESET}\n` - } - } else { - resStr += ' No censorship detected\n' - } - return resStr -} - -export default { - FAMILY_VALUES, - PROTOCOL_VALUES, - LogColors, - DISPLAY_WIDTH, - printHeader, - getResultIcon, - getCensorsString, -} diff --git a/packages/core/src/modules/plugin/git/config.js b/packages/core/src/modules/plugin/git/config.js deleted file mode 100644 index 1713b95d55..0000000000 --- a/packages/core/src/modules/plugin/git/config.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - name: 'Git.exe代理', - enabled: false, - tip: '如果你没有安装git命令行则不需要启动它', - setting: { - sslVerify: true, // Git.exe 是否关闭sslVerify,true=关闭 false=开启 - noProxyUrls: { - 'https://gitee.com': true, // 码云 - 'https://e.coding.net': true, // Coding(腾讯云) - 'https://codeup.aliyun.com': true, // 云效 Codeup (阿里云) - }, - }, -} diff --git a/packages/core/src/modules/plugin/git/index.js b/packages/core/src/modules/plugin/git/index.js deleted file mode 100644 index 402341bfe1..0000000000 --- a/packages/core/src/modules/plugin/git/index.js +++ /dev/null @@ -1,91 +0,0 @@ -const pluginConfig = require('./config') - -const Plugin = function (context) { - const { config, shell, event, log } = context - const pluginApi = { - async start () { - const ip = '127.0.0.1' - const port = config.get().server.port - await pluginApi.setProxy(ip, port) - return { ip, port } - }, - - async close () { - return pluginApi.unsetProxy() - }, - - async restart () { - await pluginApi.close() - await pluginApi.start() - }, - - isEnabled () { - return config.get().plugin.git.enabled - }, - - async save (newConfig) { - }, - - async setProxy (ip, port) { - const cmds = [ - `git config --global http.proxy http://${ip}:${port - 1} `, - `git config --global https.proxy http://${ip}:${port} `, - ] - - if (config.get().plugin.git.setting.sslVerify === true) { - cmds.push('git config --global http.sslVerify false ') - } - - if (config.get().plugin.git.setting.noProxyUrls != null) { - for (const url in config.get().plugin.git.setting.noProxyUrls) { - cmds.push(`git config --global http."${url}".proxy "" `) - } - } - - const ret = await shell.exec(cmds, { type: 'cmd' }) - event.fire('status', { key: 'plugin.git.enabled', value: true }) - log.info('开启【Git】代理成功') - - return ret - }, - - // 当手动修改过 `~/.gitconfig` 时,`unset` 可能会执行失败,所以除了第一条命令外,其他命令都添加了try-catch,防止关闭Git代理失败 - async unsetProxy () { - const ret = await shell.exec(['git config --global --unset http.proxy '], { type: 'cmd' }) - - try { - await shell.exec(['git config --global --unset https.proxy '], { type: 'cmd' }) - } catch { - } - - if (config.get().plugin.git.setting.sslVerify === true) { - try { - await shell.exec(['git config --global --unset http.sslVerify '], { type: 'cmd' }) - } catch { - } - } - - if (config.get().plugin.git.setting.noProxyUrls != null) { - for (const url in config.get().plugin.git.setting.noProxyUrls) { - try { - await shell.exec([`git config --global --unset http."${url}".proxy `], { type: 'cmd' }) - } catch { - } - } - } - event.fire('status', { key: 'plugin.git.enabled', value: false }) - log.info('关闭【Git】代理成功') - return ret - }, - } - return pluginApi -} - -module.exports = { - key: 'git', - config: pluginConfig, - status: { - enabled: false, - }, - plugin: Plugin, -} diff --git a/packages/core/src/modules/plugin/index.js b/packages/core/src/modules/plugin/index.js deleted file mode 100644 index c5d50f79a1..0000000000 --- a/packages/core/src/modules/plugin/index.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - node: require('./node'), - git: require('./git'), - pip: require('./pip'), - overwall: require('./overwall'), -} diff --git a/packages/core/src/modules/plugin/node/config.js b/packages/core/src/modules/plugin/node/config.js deleted file mode 100644 index 9a02451a51..0000000000 --- a/packages/core/src/modules/plugin/node/config.js +++ /dev/null @@ -1,44 +0,0 @@ -module.exports = { - name: 'NPM加速', - enabled: false, - tip: '如果你没有安装nodejs则不需要启动它', - startup: { - variables: true, - }, - setting: { - 'command': 'npm', - 'strict-ssl': true, - 'cafile': false, - 'NODE_EXTRA_CA_CERTS': false, - 'NODE_TLS_REJECT_UNAUTHORIZED': false, - 'registry': 'https://registry.npmjs.org', // 可以选择切换官方或者淘宝镜像 - 'registryList': { - taobao: { - name: 'taobao镜像', - value: 'https://registry.npmmirror.com', - }, - ustclug: { - name: '中国科学技术大学镜像', - value: 'https://npmreg.proxy.ustclug.org', - }, - }, - 'yarnRegistry': 'default', - 'yarnRegistryList': { - taobao: { - name: 'taobao镜像', - value: 'https://registry.npmmirror.com', - }, - }, - }, - variables: { - phantomjs_cdnurl: 'https://npmmirror.com/mirrors/phantomjs', - chromedriver_cdnurl: 'https://npmmirror.com/mirrors/chromedriver', - sass_binary_site: 'https://npmmirror.com/mirrors/node-sass', - ELECTRON_MIRROR: 'https://npmmirror.com/mirrors/electron/', - NVM_NODEJS_ORG_MIRROR: 'https://npmmirror.com/mirrors/node', - CHROMEDRIVER_CDNURL: 'https://npmmirror.com/mirrors/chromedriver', - OPERADRIVER: 'https://npmmirror.com/mirrors/operadriver', - ELECTRON_BUILDER_BINARIES_MIRROR: 'https://npmmirror.com/mirrors/electron-builder-binaries/', - PYTHON_MIRROR: 'https://npmmirror.com/mirrors/python', - }, -} diff --git a/packages/core/src/modules/plugin/node/index.js b/packages/core/src/modules/plugin/node/index.js deleted file mode 100644 index 1f060cdaab..0000000000 --- a/packages/core/src/modules/plugin/node/index.js +++ /dev/null @@ -1,196 +0,0 @@ -const jsonApi = require('@docmirror/mitmproxy/src/json') -const nodeConfig = require('./config') - -const NodePlugin = function (context) { - const { config, shell, event, log } = context - const nodeApi = { - async start () { - try { - await nodeApi.setVariables() - } catch (err) { - log.warn('set variables error:', err) - } - - const ip = '127.0.0.1' - const port = config.get().server.port - await nodeApi.setProxy(ip, port) - return { ip, port } - }, - - async close () { - return nodeApi.unsetProxy() - }, - - async restart () { - await nodeApi.close() - await nodeApi.start() - }, - - async save (newConfig) { - await nodeApi.setVariables() - }, - async getNpmEnv () { - const command = config.get().plugin.node.setting.command || 'npm' - - const ret = await shell.exec([`${command} config list --json`], { type: 'cmd' }) - if (ret != null) { - const json = ret.substring(ret.indexOf('{')) - return jsonApi.parse(json) - } - return {} - }, - - async setNpmEnv (list) { - const command = config.get().plugin.node.setting.command || 'npm' - - const cmds = [] - for (const item of list) { - if (item.value != null && item.value.length > 0 && item.value !== 'default' && item.value !== 'null') { - cmds.push(`${command} config set ${item.key} ${item.value}`) - } else { - cmds.push(`${command} config delete ${item.key}`) - } - } - return await shell.exec(cmds, { type: 'cmd' }) - }, - - async unsetNpmEnv (list) { - const command = config.get().plugin.node.setting.command || 'npm' - - const cmds = [] - for (const item of list) { - cmds.push(`${command} config delete ${item} `) - } - return await shell.exec(cmds, { type: 'cmd' }) - }, - - async setYarnEnv (list) { - const cmds = [] - log.debug('yarn set:', JSON.stringify(list)) - for (const item of list) { - if (item.value != null && item.value.length > 0 && item.value !== 'default' && item.value !== 'null') { - cmds.push(`yarn config set ${item.key} ${item.value}`) - } else { - cmds.push(`yarn config delete ${item.key}`) - } - } - return await shell.exec(cmds, { type: 'cmd' }) - }, - - async unsetYarnEnv (list) { - const cmds = [] - for (const item of list) { - cmds.push(`yarn config delete ${item} `) - } - return await shell.exec(cmds, { type: 'cmd' }) - }, - - async getVariables () { - const currentMap = await nodeApi.getNpmEnv() - const list = [] - const map = config.get().plugin.node.variables - for (const key in map) { - const exists = currentMap[key] != null - list.push({ - key, - value: map[key], - oldValue: currentMap[key], - exists, - hadSet: currentMap[key] === map[key], - }) - } - return list - }, - - async setVariables () { - const list = await nodeApi.getVariables() - const noSetList = list.filter((item) => { - return !item.exists - }) - if (noSetList.length > 0) { - return nodeApi.setNpmEnv(noSetList) - } - }, - - async setRegistry ({ registry, type }) { - if (type === 'npm') { - await nodeApi.setNpmEnv([{ key: 'registry', value: registry }]) - } else { - await nodeApi.setYarnEnv([{ key: 'registry', value: registry }]) - } - return true - }, - - async setProxy (ip, port) { - const command = config.get().plugin.node.setting.command || 'npm' - - const cmds = [ - `${command} config set proxy=http://${ip}:${port - 1}`, - `${command} config set https-proxy=http://${ip}:${port}`, - ] - - const env = [] - - /** - * 'strict-ssl': false, - * 'cafile': true, - * 'NODE_EXTRA_CA_CERTS': true, - * 'NODE_TLS_REJECT_UNAUTHORIZED': false - */ - const nodeConfig = config.get().plugin.node - const rootCaCertFile = config.get().server.setting.rootCaFile.certPath - if (nodeConfig.setting['strict-ssl']) { - cmds.push(`${command} config set strict-ssl false`) - } - if (nodeConfig.setting.cafile) { - cmds.push(`${command} config set cafile "${rootCaCertFile}"`) - } - - if (nodeConfig.setting.NODE_EXTRA_CA_CERTS) { - cmds.push(`${command} config set NODE_EXTRA_CA_CERTS "${rootCaCertFile}"`) - env.push({ key: 'NODE_EXTRA_CA_CERTS', value: rootCaCertFile }) - } - - if (nodeConfig.setting.NODE_TLS_REJECT_UNAUTHORIZED) { - cmds.push(`${command} config set NODE_TLS_REJECT_UNAUTHORIZED 0`) - env.push({ key: 'NODE_TLS_REJECT_UNAUTHORIZED', value: '0' }) - } - - const ret = await shell.exec(cmds, { type: 'cmd' }) - if (env.length > 0) { - await shell.setSystemEnv({ list: env }) - } - event.fire('status', { key: 'plugin.node.enabled', value: true }) - log.info('开启【NPM】代理成功') - - return ret - }, - - async unsetProxy () { - const command = config.get().plugin.node.setting.command || 'npm' - - const cmds = [ - `${command} config delete proxy`, - `${command} config delete https-proxy`, - `${command} config delete strict-ssl`, - `${command} config delete cafile`, - `${command} config delete NODE_EXTRA_CA_CERTS`, - `${command} config delete NODE_TLS_REJECT_UNAUTHORIZED`, - ] - const ret = await shell.exec(cmds, { type: 'cmd' }) - event.fire('status', { key: 'plugin.node.enabled', value: false }) - log.info('关闭【NPM】代理成功') - return ret - }, - } - return nodeApi -} - -module.exports = { - key: 'node', - config: nodeConfig, - status: { - enabled: false, - }, - plugin: NodePlugin, -} diff --git a/packages/core/src/modules/plugin/overwall/config.js b/packages/core/src/modules/plugin/overwall/config.js deleted file mode 100644 index 870cae95d5..0000000000 --- a/packages/core/src/modules/plugin/overwall/config.js +++ /dev/null @@ -1,48 +0,0 @@ -module.exports = { - name: '梯子', - enabled: false, // 默认关闭梯子 - server: {}, - serverDefault: { - 'ow-prod.docmirror.top': { - port: 443, - path: 'X2dvX292ZXJfd2FsbF8', - password: 'dev_sidecar_is_666', - }, - }, - targets: { - '*.github.com': true, - '*github*.com': true, - '*.wikimedia.org': true, - '*.v2ex.com': true, - '*.azureedge.net': true, - '*.cloudfront.net': true, - '*.bing.com': true, - '*.discourse-cdn.com': true, - '*.gravatar.com': true, - '*.docker.com': true, - '*.vueuse.org': true, - '*.elastic.co': true, - '*.optimizely.com': true, - '*.stackpathcdn.com': true, - '*.fastly.net': true, - '*.cloudflare.com': true, - '*.233v2.com': true, - '*.v2fly.org': true, - '*.telegram.org': true, - '*.amazon.com': true, - '*.googleapis.com': true, - '*.google-analytics.com': true, - '*.cloudflareinsights.com': true, - '*.intlify.dev': true, - '*.segment.io': true, - '*.shields.io': true, - '*.jsdelivr.net': true, - }, - pac: { - enabled: true, - autoUpdate: true, - pacFileUpdateUrl: 'https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt', - pacFileAbsolutePath: null, // 自定义 pac.txt 文件位置,可以是本地文件路径 - pacFilePath: './extra/pac/pac.txt', // 内置 pac.txt 文件路径 - }, -} diff --git a/packages/core/src/modules/plugin/overwall/index.js b/packages/core/src/modules/plugin/overwall/index.js deleted file mode 100644 index 7842449815..0000000000 --- a/packages/core/src/modules/plugin/overwall/index.js +++ /dev/null @@ -1,53 +0,0 @@ -const pluginConfig = require('./config') - -const Plugin = function (context) { - const { config, shell, event, log } = context - const api = { - async start () { - // event.fire('status', { key: 'plugin.overwall.enabled', value: true }) - }, - - async close () { - // event.fire('status', { key: 'plugin.overwall.enabled', value: false }) - }, - - async restart () { - await api.close() - await api.start() - }, - - async overrideRunningConfig_bak (serverConfig) { - const conf = config.get().plugin.overwall - if (!conf || !conf.enabled || !conf.targets) { - return - } - const server = conf.server - let i = 0 - let main - const backup = [] - for (const key in server) { - if (i === 0) { - main = key - } else { - backup.push(key) - } - i++ - } - for (const key in conf.targets) { - serverConfig.intercepts[key] = { - '.*': { - proxy: `${main}/\${host}`, - backup, - }, - } - } - }, - } - return api -} - -module.exports = { - key: 'overwall', - config: pluginConfig, - plugin: Plugin, -} diff --git a/packages/core/src/modules/plugin/pip/config.js b/packages/core/src/modules/plugin/pip/config.js deleted file mode 100644 index 49e799406a..0000000000 --- a/packages/core/src/modules/plugin/pip/config.js +++ /dev/null @@ -1,55 +0,0 @@ -module.exports = { - name: 'PIP加速', - statusOff: true, - enabled: null, // 没有开关 - tip: '如果你没有安装pip则不需要启动它', - startup: { - }, - setting: { - command: 'pip', - trustedHost: 'pypi.org', - registry: 'https://pypi.org/simple/', // 可以选择切换官方或者淘宝镜像 - registryList: { - aliyun: { - name: '阿里镜像', - value: 'https://mirrors.aliyun.com/pypi/simple/', - }, - baidu: { - name: '百度镜像', - value: 'https://mirror.baidu.com/pypi/simple/', - }, - douban: { - name: '豆瓣镜像', - value: 'http://pypi.douban.com/simple/', - }, - sohu: { - name: '搜狐镜像', - value: 'http://mirrors.sohu.com/Python/', - }, - ustclug: { - name: '中科大镜像', - value: 'https://pypi.mirrors.ustc.edu.cn/simple/', - }, - bfsu: { - name: '北京外国语大学镜像', - value: 'https://mirrors.bfsu.edu.cn/pypi/web/simple/', - }, - nju: { - name: '南京大学镜像', - value: 'https://mirror.nju.edu.cn/pypi/web/simple/', - }, - tsinghua: { - name: '清华大学镜像', - value: 'https://pypi.tuna.tsinghua.edu.cn/simple/', - }, - hust: { - name: '华中科大镜像', - value: 'https://mirrors.hust.edu.cn/pypi/web/simple/', - }, - sdut: { - name: '山东理工大学镜像', - value: 'http://pypi.sdutlinux.org/', - }, - }, - }, -} diff --git a/packages/core/src/modules/plugin/pip/index.js b/packages/core/src/modules/plugin/pip/index.js deleted file mode 100644 index 1f8a5003a2..0000000000 --- a/packages/core/src/modules/plugin/pip/index.js +++ /dev/null @@ -1,93 +0,0 @@ -const pipConfig = require('./config') - -const PipPlugin = function (context) { - const { config, shell, event, log } = context - const api = { - async start () { - await api.setRegistry({ registry: config.get().plugin.pip.setting.registry }) - await api.setTrustedHost(config.get().plugin.pip.setting.trustedHost) - }, - - async close () { - }, - - async restart () { - await api.close() - await api.start() - }, - - async save (newConfig) { - }, - - async getPipEnv () { - const command = config.get().plugin.pip.setting.command - let ret = await shell.exec([`${command} config list`], { type: 'cmd' }) - if (ret != null) { - ret = ret.trim() - const lines = ret.split('\n') - const vars = {} - for (const line of lines) { - if (!line.startsWith('global')) { - continue - } - const key = line.substring(0, line.indexOf('=')).trim() - let value = line.substring(line.indexOf('=') + 1).trim() - if (value.startsWith('\'')) { - value = value.slice(1, -1) - } - vars[key] = value - } - return vars - } - return {} - }, - - async setPipEnv (list) { - const command = config.get().plugin.pip.setting.command - const cmds = [] - for (const item of list) { - if (item.value != null) { - cmds.push(`${command} config set global.${item.key} ${item.value}`) - } else { - cmds.push(`${command} config unset global.${item.key}`) - } - } - return await shell.exec(cmds, { type: 'cmd' }) - }, - - async unsetPipEnv (list) { - const command = config.get().plugin.pip.setting.command - const cmds = [] - for (const item of list) { - cmds.push(`${command} config unset global.${item} `) - } - return await shell.exec(cmds, { type: 'cmd' }) - }, - - async setRegistry ({ registry }) { - await api.setPipEnv([{ key: 'index-url', value: registry }]) - return true - }, - - async setTrustedHost (host) { - await api.setPipEnv([{ key: 'trusted-host', value: host }]) - return true - }, - - async setProxy (ip, port) { - }, - - async unsetProxy () { - }, - } - return api -} - -module.exports = { - key: 'pip', - config: pipConfig, - status: { - enabled: false, - }, - plugin: PipPlugin, -} diff --git a/packages/core/src/modules/proxy/index.js b/packages/core/src/modules/proxy/index.js deleted file mode 100644 index 7fdd7810d2..0000000000 --- a/packages/core/src/modules/proxy/index.js +++ /dev/null @@ -1,245 +0,0 @@ -const ProxyPlugin = function (context) { - const { config, event, shell, log } = context - const api = { - async start () { - return api.setProxy() - }, - - async close () { - return api.unsetProxy() - }, - - async restart () { - await api.close() - await api.start() - }, - - async setProxy () { - const ip = '127.0.0.1' - const port = config.get().server.port - const proxyConfig = config.get().proxy || {} - const setEnv = proxyConfig.setEnv ?? false - await shell.setSystemProxy({ ip, port, setEnv }) - log.info(`开启系统代理成功:${ip}:${port}`) - event.fire('status', { key: 'proxy.enabled', value: true }) - return { ip, port } - }, - - async unsetProxy (setEnv) { - if (setEnv == null) { - const proxyConfig = config.get().proxy || {} - setEnv = proxyConfig.setEnv ?? false - } - try { - await shell.setSystemProxy({ setEnv }) - event.fire('status', { key: 'proxy.enabled', value: false }) - log.info('关闭系统代理成功') - return true - } catch (err) { - log.error('关闭系统代理失败:', err) - return false - } - }, - - async setEnableLoopback () { - await shell.enableLoopback() - log.info('打开EnableLoopback成功') - return true - }, - } - return api -} -module.exports = { - key: 'proxy', - config: { - enabled: true, - name: '系统代理', - use: 'local', - other: [], - proxyHttp: false, // false=只代理HTTPS请求 true=同时代理HTTP和HTTPS请求 - setEnv: false, - - // 排除国内域名 所需配置 - excludeDomesticDomainAllowList: true, // 是否排除国内域名,默认:需要排除 - autoUpdateDomesticDomainAllowList: true, // 是否自动更新国内域名 - remoteDomesticDomainAllowListFileUrl: 'https://raw.githubusercontent.com/pluwen/china-domain-allowlist/refs/heads/main/allow-list.sorl', - domesticDomainAllowListFileAbsolutePath: null, // 自定义 domestic-domain-allowlist.txt 文件位置,可以是本地文件路径 - domesticDomainAllowListFilePath: './extra/proxy/domestic-domain-allowlist.txt', // 内置国内域名文件 - - // 自定义系统代理排除列表 - excludeIpList: { - // region 常用国内可访问域名 - - // 中国大陆 - '*.cn': true, - 'cn.*': true, - '*china*': true, - - // Github加速源:以下加速源代理后反而出现问题,从系统代理中排除掉 - '*.kkgithub.com': true, - '*.ghproxy.*': true, - - // Github ssh - 'ssh.github.com': true, - - // DeepL - 'www.deepl.com': true, - - // CSDN - '*.csdn.net': true, - - // 360 so - '*.so.com': true, - - // 百度 - '*.baidu.com': true, - '*.baiducontent.com': true, - '*.bdimg.com': true, - '*.bdstatic.com': true, - '*.bdydns.com': true, - - // 腾讯 - '*.tencent.com': true, - '*.qq.com': true, - '*.weixin.com': true, - '*.weixinbridge.com': true, - '*.wechat.com': true, - '*.idqqimg.com': true, - '*.gtimg.com': true, - '*.qpic.com': true, - '*.qlogo.com': true, - '*.myapp.com': true, - - // 阿里 - '*.aliyun.com': true, - '*.alipay.com': true, - '*.taobao.com': true, - '*.tmall.com': true, - '*.alipayobjects.com': true, - '*.dingtalk.com': true, - '*.mmstat.com': true, - '*.alicdn.com': true, - '*.hdslb.com': true, - - // Gitee - 'gitee.com': true, - '*.gitee.com': true, - '*.gitee.io': true, - '*.giteeusercontent.com': true, - - // Mozilla Firefox - '*.mozilla.org': true, - '*.mozilla.com': true, - '*.mozilla.net': true, - '*.firefox.com': true, - '*.firefox.org': true, - '*.mozillademos.org': true, - '*.mozillians.org': true, - '*.mozillians.net': true, - '*.mozillians.com': true, - - // OSS - '*.sonatype.org': true, - // Maven镜像 - '*.maven.org': true, - // Maven Repository - '*.mvnrepository.com': true, - - // 苹果 - '*.apple.com': true, - '*.icloud.com': true, - - // 微软 - '*.microsoft.com': true, - '*.windows.com': true, - '*.office.com': true, - '*.office.net': true, - '*.live.com': true, - '*.msn.com': true, - - // WPS - '*.wps.com': true, - '*.wps.net': true, - '*.ksord.com': true, - - // 奇虎 - '*.qihoo.com': true, - '*.qihucdn.com': true, - // 360 - '*.360.com': true, - '*.360safe.com': true, - '*.360buyimg.com': true, - '*.360buy.com': true, - - // 京东 - '*.jd.com': true, - '*.jcloud.com': true, - '*.jcloudcs.com': true, - '*.jcloudcache.com': true, - '*.jcloudcdn.com': true, - '*.jcloudlb.com': true, - - // 哔哩哔哩 - '*.bilibili.com': true, - '*.bilivideo.com': true, - '*.biliapi.net': true, - - // 移动 - '*.10086.com': true, - '*.10086cloud.com': true, - - // 移动:139邮箱 - '*.139.com': true, - - // 迅雷 - '*.xunlei.com': true, - - // 网站ICP备案查询 - '*.icpapi.com': true, - - // Navicat - '*.navicat.com': true, - - // Github文件上传所使用的域名,被DS代理会导致文件上传经常失败,从系统代理中排除掉 - 'objects-origin.githubusercontent.com': true, - - // cloudflare:排除以下域名,cloudflare的人机校验会更快,成功率更高。 - 'challenges.cloudflare.com': true, - - // endregion - - // 本地地址,无需代理 - 'localhost': true, - 'localhost.*': true, // 部分VPN会在host中添加这种格式的域名指向127.0.0.1,所以也排除掉 - '127.*.*.*': true, - 'test.*': true, // 本地开发时,测试用的虚拟域名格式,无需代理 - - // 服务器端常用地址,无需代理 - '10.*.*.*': true, - '172.16.*.*': true, - '172.17.*.*': true, - '172.18.*.*': true, - '172.19.*.*': true, - '172.20.*.*': true, - '172.21.*.*': true, - '172.22.*.*': true, - '172.23.*.*': true, - '172.24.*.*': true, - '172.25.*.*': true, - '172.26.*.*': true, - '172.27.*.*': true, - '172.28.*.*': true, - '172.29.*.*': true, - '172.30.*.*': true, - '172.31.*.*': true, - - // 局域网地址,无需代理 - '192.168.*.*': true, - }, - }, - status: { - enabled: false, - proxyTarget: '', - }, - plugin: ProxyPlugin, -} diff --git a/packages/core/src/modules/server/index.js b/packages/core/src/modules/server/index.js deleted file mode 100644 index e6226ae618..0000000000 --- a/packages/core/src/modules/server/index.js +++ /dev/null @@ -1,151 +0,0 @@ -const fork = require('node:child_process').fork -const fs = require('node:fs') -const path = require('node:path') -const lodash = require('lodash') -const config = require('../../config-api') -const event = require('../../event') -const status = require('../../status') -const jsonApi = require('@docmirror/mitmproxy/src/json') -const log = require('../../utils/util.log.core') - -let server = null -function fireStatus (status) { - event.fire('status', { key: 'server.enabled', value: status }) -} -function sleep (time) { - return new Promise((resolve) => { - setTimeout(() => { - resolve() - }, time) - }) -} -const serverApi = { - async startup () { - if (config.get().server.startup) { - return this.start(config.get().server) - } - }, - async shutdown () { - if (status.server) { - return this.close() - } - }, - async start ({ mitmproxyPath, plugins }) { - const allConfig = config.get() - const serverConfig = lodash.cloneDeep(allConfig.server) - - const intercepts = serverConfig.intercepts - const dnsMapping = serverConfig.dns.mapping - - if (allConfig.plugin) { - lodash.each(allConfig.plugin, (value) => { - const plugin = value - if (!plugin.enabled) { - return - } - if (plugin.intercepts) { - lodash.merge(intercepts, plugin.intercepts) - } - if (plugin.dns) { - lodash.merge(dnsMapping, plugin.dns) - } - }) - } - - if (allConfig.app) { - serverConfig.app = allConfig.app - } - - if (serverConfig.intercept.enabled === false) { - // 如果设置为关闭拦截 - serverConfig.intercepts = {} - } - - for (const key in plugins) { - const plugin = plugins[key] - if (plugin.overrideRunningConfig) { - plugin.overrideRunningConfig(serverConfig) - } - } - serverConfig.plugin = allConfig.plugin - - if (allConfig.proxy && allConfig.proxy.enabled) { - serverConfig.proxy = allConfig.proxy - } - - // fireStatus('ing') // 启动中 - const basePath = serverConfig.setting.userBasePath - const runningConfigPath = path.join(basePath, '/running.json') - try { - fs.writeFileSync(runningConfigPath, jsonApi.stringify(serverConfig)) - log.info('保存 running.json 运行时配置文件成功:', runningConfigPath) - } catch (e) { - log.error('保存 running.json 运行时配置文件失败:', runningConfigPath, ', error:', e) - throw e - } - const serverProcess = fork(mitmproxyPath, [runningConfigPath]) - server = { - id: serverProcess.pid, - process: serverProcess, - close () { - serverProcess.send({ type: 'action', event: { key: 'close' } }) - }, - } - serverProcess.on('beforeExit', (code) => { - log.warn('server process beforeExit, code:', code) - }) - serverProcess.on('SIGPIPE', (code, signal) => { - log.warn(`server process SIGPIPE, code: ${code}, signal:`, signal) - }) - serverProcess.on('exit', (code, signal) => { - log.warn(`server process exit, code: ${code}, signal:`, signal) - }) - serverProcess.on('uncaughtException', (err, origin) => { - log.error('server process uncaughtException:', err) - }) - serverProcess.on('message', (msg) => { - log.debug('收到子进程消息:', JSON.stringify(msg)) - if (msg.type === 'status') { - fireStatus(msg.event) - } else if (msg.type === 'error') { - let code = '' - if (msg.event.code) { - code = msg.event.code - } - fireStatus(false) // 启动失败 - event.fire('error', { key: 'server', value: code, error: msg.event, message: msg.message }) - } else if (msg.type === 'speed') { - event.fire('speed', msg.event) - } - }) - return { port: serverConfig.port } - }, - async kill () { - if (server) { - server.process.kill('SIGINT') - await sleep(1000) - } - fireStatus(false) - }, - async close () { - return await serverApi.kill() - }, - async restart ({ mitmproxyPath }) { - await serverApi.kill() - await serverApi.start({ mitmproxyPath }) - }, - getServer () { - return server - }, - getSpeedTestList () { - if (server) { - server.process.send({ type: 'speed', event: { key: 'getList' } }) - } - }, - reSpeedTest () { - if (server) { - server.process.send({ type: 'speed', event: { key: 'reTest' } }) - } - }, -} -module.exports = serverApi diff --git a/packages/core/src/shell/index.js b/packages/core/src/shell/index.js deleted file mode 100644 index 398814e2fe..0000000000 --- a/packages/core/src/shell/index.js +++ /dev/null @@ -1,26 +0,0 @@ -const enableLoopback = require('./scripts/enable-loopback') -const extraPath = require('./scripts/extra-path') -const getNpmEnv = require('./scripts/get-npm-env') -const getSystemEnv = require('./scripts/get-system-env') -const killByPort = require('./scripts/kill-by-port') -const setNpmEnv = require('./scripts/set-npm-env') -const setSystemEnv = require('./scripts/set-system-env') -const setSystemProxy = require('./scripts/set-system-proxy') -const setupCa = require('./scripts/setup-ca') -const shell = require('./shell') - -module.exports = { - killByPort, - setupCa, - getSystemEnv, - setSystemEnv, - getNpmEnv, - setNpmEnv, - setSystemProxy, - enableLoopback, - extraPath, - async exec (cmds, args) { - return shell.getSystemShell().exec(cmds, args) - }, - getSystemPlatform: shell.getSystemPlatform, -} diff --git a/packages/core/src/shell/scripts/enable-loopback.js b/packages/core/src/shell/scripts/enable-loopback.js deleted file mode 100644 index 2547824bc0..0000000000 --- a/packages/core/src/shell/scripts/enable-loopback.js +++ /dev/null @@ -1,45 +0,0 @@ -/** - */ -const Shell = require('../shell') -const extraPath = require('./extra-path') -const sudoPrompt = require('@vscode/sudo-prompt') -const log = require('../../utils/util.log.core') -const execute = Shell.execute - -const executor = { - windows (exec) { - const loopbackPath = extraPath.getEnableLoopbackPath() - const sudoCommand = [`"${loopbackPath}"`] - - const options = { - name: 'EnableLoopback', - } - return new Promise((resolve, reject) => { - sudoPrompt.exec( - sudoCommand.join(' '), - options, - (error, _, stderr) => { - if (stderr) { - log.error(`[sudo-prompt] 发生错误: ${stderr}`) - } - - if (error) { - reject(error) - } else { - resolve(undefined) - } - }, - ) - }) - }, - async linux (exec, { port }) { - throw new Error('不支持此操作') - }, - async mac (exec, { port }) { - throw new Error('不支持此操作') - }, -} - -module.exports = async function (args) { - return execute(executor, args) -} diff --git a/packages/core/src/shell/scripts/extra-path/EnableLoopback.exe b/packages/core/src/shell/scripts/extra-path/EnableLoopback.exe deleted file mode 100644 index 1dcac711e7..0000000000 Binary files a/packages/core/src/shell/scripts/extra-path/EnableLoopback.exe and /dev/null differ diff --git a/packages/core/src/shell/scripts/extra-path/index.js b/packages/core/src/shell/scripts/extra-path/index.js deleted file mode 100644 index 35be70893e..0000000000 --- a/packages/core/src/shell/scripts/extra-path/index.js +++ /dev/null @@ -1,26 +0,0 @@ -const path = require('node:path') -const log = require('../../../utils/util.log.core') - -function getExtraPath () { - let extraPath = process.env.DS_EXTRA_PATH - log.info('extraPath:', extraPath) - if (!extraPath) { - extraPath = __dirname - } - return extraPath -} - -function getProxyExePath () { - const extraPath = getExtraPath() - return path.join(extraPath, 'sysproxy.exe') -} - -function getEnableLoopbackPath () { - const extraPath = getExtraPath() - return path.join(extraPath, 'EnableLoopback.exe') -} - -module.exports = { - getProxyExePath, - getEnableLoopbackPath, -} diff --git a/packages/core/src/shell/scripts/extra-path/sysproxy.exe b/packages/core/src/shell/scripts/extra-path/sysproxy.exe deleted file mode 100644 index 979858ba78..0000000000 Binary files a/packages/core/src/shell/scripts/extra-path/sysproxy.exe and /dev/null differ diff --git a/packages/core/src/shell/scripts/get-npm-env.js b/packages/core/src/shell/scripts/get-npm-env.js deleted file mode 100644 index 593eff5c1a..0000000000 --- a/packages/core/src/shell/scripts/get-npm-env.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * 获取环境变量 - */ -const jsonApi = require('@docmirror/mitmproxy/src/json') -const Shell = require('../shell') - -const execute = Shell.execute - -const executor = { - async windows (exec) { - const ret = await exec(['npm config list --json'], { type: 'cmd' }) - if (ret != null) { - const json = ret.substring(ret.indexOf('{')) - return jsonApi.parse(json) - } - return {} - }, - async linux (exec, { port }) { - throw new Error('暂未实现此功能') - }, - async mac (exec, { port }) { - throw new Error('暂未实现此功能') - }, -} - -module.exports = async function (args) { - return execute(executor, args) -} diff --git a/packages/core/src/shell/scripts/get-system-env.js b/packages/core/src/shell/scripts/get-system-env.js deleted file mode 100644 index 0cfbd87ff0..0000000000 --- a/packages/core/src/shell/scripts/get-system-env.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * 获取环境变量 - */ -const Shell = require('../shell') - -const execute = Shell.execute - -const executor = { - async windows (exec) { - const ret = await exec(['set'], { type: 'cmd' }) - const map = {} - if (ret != null) { - const lines = ret.split('\r\n') - for (const item of lines) { - const kv = item.split('=') - if (kv.length > 1) { - map[kv[0].trim()] = kv[1].trim() - } - } - } - return map - }, - async linux (exec, { port }) { - throw new Error('暂未实现此功能') - }, - async mac (exec, { port }) { - throw new Error('暂未实现此功能') - }, -} - -module.exports = async function (args) { - return execute(executor, args) -} diff --git a/packages/core/src/shell/scripts/kill-by-port.js b/packages/core/src/shell/scripts/kill-by-port.js deleted file mode 100644 index 108d571ccc..0000000000 --- a/packages/core/src/shell/scripts/kill-by-port.js +++ /dev/null @@ -1,23 +0,0 @@ -const Shell = require('../shell') - -const execute = Shell.execute - -const executor = { - async windows (exec, { port }) { - const cmds = [`for /f "tokens=5" %a in ('netstat -aon ^| find ":${port}" ^| find "LISTENING"') do (taskkill /f /pid %a /t & exit /B) `] - await exec(cmds, { type: 'cmd' }) - return true - }, - async linux (exec, { port }) { - await exec(`kill \`lsof -i:${port} |grep 'dev-sidecar\\|electron\\|@docmirro' |awk '{print $2}'\``) - return true - }, - async mac (exec, { port }) { - await exec(`kill \`lsof -i:${port} |grep 'dev-side\\|Elect' |awk '{print $2}'\``) - return true - }, -} - -module.exports = async function (args) { - return execute(executor, args) -} diff --git a/packages/core/src/shell/scripts/set-npm-env.js b/packages/core/src/shell/scripts/set-npm-env.js deleted file mode 100644 index e80855d1ca..0000000000 --- a/packages/core/src/shell/scripts/set-npm-env.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * 设置环境变量 - */ -const Shell = require('../shell') - -const execute = Shell.execute - -const executor = { - async windows (exec, { list }) { - const cmds = [] - for (const item of list) { - cmds.push(`npm config set ${item.key} ${item.value}`) - } - return await exec(cmds, { type: 'cmd' }) - }, - async linux (exec, { port }) { - throw new Error('暂未实现此功能') - }, - async mac (exec, { port }) { - throw new Error('暂未实现此功能') - }, -} - -module.exports = async function (args) { - return execute(executor, args) -} diff --git a/packages/core/src/shell/scripts/set-system-env.js b/packages/core/src/shell/scripts/set-system-env.js deleted file mode 100644 index 5ef5c07277..0000000000 --- a/packages/core/src/shell/scripts/set-system-env.js +++ /dev/null @@ -1,88 +0,0 @@ -/** - * 设置环境变量 - */ -const Shell = require('../shell') - -const execute = Shell.execute - -const executor = { - async windows (exec, { list }) { - const psCmdsMachine = [] - const psCmdsUser = [] - for (const item of list) { - const v = item.value == null ? '' : String(item.value) - // escape single quotes for PowerShell single-quoted string - const escaped = v.replace(/'/g, "''") - psCmdsMachine.push(`[Environment]::SetEnvironmentVariable('${item.key}', '${escaped}', 'Machine')`) - psCmdsUser.push(`[Environment]::SetEnvironmentVariable('${item.key}', '${escaped}', 'User')`) - } - - // Wrap whole flow and return structured result so caller can show detailed errors - try { - let ret - let appliedScope = null - try { - ret = await exec(psCmdsMachine, { type: 'ps' }) - appliedScope = 'Machine:PowerShell' - } catch (eMachine) { - // try User scope via PowerShell - try { - ret = await exec(psCmdsUser, { type: 'ps' }) - appliedScope = 'User:PowerShell' - } catch (eUser) { - // PowerShell attempts failed; fallback to setx via cmd - const cmdsSetxMachine = [] - const cmdsSetxUser = [] - for (const item of list) { - const v = item.value == null ? '' : String(item.value) - // basic escape for double quotes in cmd - const escaped = v.replace(/"/g, '\\"') - cmdsSetxMachine.push(`setx ${item.key} "${escaped}" /M`) - cmdsSetxUser.push(`setx ${item.key} "${escaped}"`) - } - try { - ret = await exec(cmdsSetxMachine, { type: 'cmd' }) - appliedScope = 'Machine:setx' - } catch (eSetxMachine) { - try { - ret = await exec(cmdsSetxUser, { type: 'cmd' }) - appliedScope = 'User:setx' - } catch (eSetxUser) { - // all attempts failed — include all error messages - const combined = [eMachine, eUser, eSetxMachine, eSetxUser].map(e => (e && e.message) || String(e)).join(' | ') - return { success: false, error: 'Failed to set environment variables', details: combined } - } - } - } - } - - // inject into current process so subsequent exec/child processes can inherit immediately - let envUpdateError = null - try { - for (const item of list) { - if (item.value == null) { - delete process.env[item.key] - } else { - process.env[item.key] = String(item.value) - } - } - } catch (e) { - envUpdateError = e.message || String(e) - } - - return { success: true, scope: appliedScope, output: ret, envUpdateError } - } catch (finalErr) { - return { success: false, error: finalErr.message || String(finalErr), details: finalErr.stack } - } - }, - async linux (exec, { port }) { - throw new Error('暂未实现此功能') - }, - async mac (exec, { port }) { - throw new Error('暂未实现此功能') - }, -} - -module.exports = async function (args) { - return execute(executor, args) -} diff --git a/packages/core/src/shell/scripts/set-system-proxy/index.js b/packages/core/src/shell/scripts/set-system-proxy/index.js deleted file mode 100644 index 630152ca34..0000000000 --- a/packages/core/src/shell/scripts/set-system-proxy/index.js +++ /dev/null @@ -1,525 +0,0 @@ -/** - * 获取环境变量 - */ -const fs = require('node:fs') -const path = require('node:path') -const request = require('request') -const Registry = require('winreg') -const sudoPrompt = require('@vscode/sudo-prompt') -const log = require('../../../utils/util.log.core') -const Shell = require('../../shell') -const extraPath = require('../extra-path') -const dateUtil = require('../../../utils/util.date') - -const execute = Shell.execute -const execFile = Shell.execFile - -let config = null -function loadConfig () { - if (config == null) { - config = require('../../../config-api.js') - } -} - -function getDomesticDomainAllowListTmpFilePath () { - return path.join(config.get().server.setting.userBasePath, '/domestic-domain-allowlist.txt') -} - -async function downloadDomesticDomainAllowListAsync () { - loadConfig() - - const remoteFileUrl = config.get().proxy.remoteDomesticDomainAllowListFileUrl - log.info('开始下载远程 domestic-domain-allowlist.txt 文件:', remoteFileUrl) - request(remoteFileUrl, (error, response, body) => { - if (error) { - log.error(`下载远程 domestic-domain-allowlist.txt 文件失败: ${remoteFileUrl}, error:`, error, ', response:', response, ', body:', body) - return - } - if (response && response.statusCode === 200) { - if (body == null || body.length < 100) { - log.warn('下载远程 domestic-domain-allowlist.txt 文件成功,但内容为空或内容太短,判断为无效的 domestic-domain-allowlist.txt 文件:', remoteFileUrl, ', body:', body) - return - } else { - log.info('下载远程 domestic-domain-allowlist.txt 文件成功:', remoteFileUrl) - } - - let fileTxt = body - try { - if (!fileTxt.includes('*.')) { - fileTxt = Buffer.from(fileTxt, 'base64').toString('utf8') - // log.debug('解析 base64 后的 domestic-domain-allowlist:', fileTxt) - } - } catch { - if (!fileTxt.includes('*.')) { - log.error(`远程 domestic-domain-allowlist.txt 文件内容即不是base64格式,也不是要求的格式,url: ${remoteFileUrl},body: ${body}`) - return - } - } - - // 保存到本地 - saveDomesticDomainAllowListFile(fileTxt) - } else { - log.error(`下载远程 domestic-domain-allowlist.txt 文件失败: ${remoteFileUrl}, response:`, response, ', body:', body) - } - }) -} - -function loadLastModifiedTimeFromTxt (fileTxt) { - const matched = fileTxt.match(/(?<=; Update Date: )[^\r\n]+/g) - if (matched && matched.length > 0) { - try { - return new Date(matched[0]) - } catch { - return null - } - } -} - -// 保存 国内域名白名单 内容到 `~/domestic-domain-allowlist.txt` 文件中 -function saveDomesticDomainAllowListFile (fileTxt) { - const filePath = getDomesticDomainAllowListTmpFilePath() - try { - fs.writeFileSync(filePath, fileTxt.replaceAll(/\r\n?/g, '\n')) - log.info('保存 domestic-domain-allowlist.txt 文件成功:', filePath) - } catch (e) { - log.error('保存 domestic-domain-allowlist.txt 文件失败:', filePath, ', error:', e) - return - } - - // 尝试解析和修改 domestic-domain-allowlist.txt 文件时间 - const lastModifiedTime = loadLastModifiedTimeFromTxt(fileTxt) - if (lastModifiedTime) { - fs.stat(filePath, (err, _stats) => { - if (err) { - log.error('修改 domestic-domain-allowlist.txt 文件时间失败:', err) - return - } - - // 修改文件的访问时间和修改时间为当前时间 - fs.utimes(filePath, lastModifiedTime, lastModifiedTime, (utimesErr) => { - if (utimesErr) { - log.error('修改 domestic-domain-allowlist.txt 文件时间失败:', utimesErr) - } else { - log.info(`'${filePath}' 文件的修改时间已更新为其最近更新时间 '${dateUtil.format(lastModifiedTime, false)}'`) - } - }) - }) - } -} - -function getDomesticDomainAllowList () { - loadConfig() - - if (!config.get().proxy.excludeDomesticDomainAllowList) { - return null - } - - // 判断是否需要自动更新国内域名 - let fileAbsolutePath = config.get().proxy.domesticDomainAllowListFileAbsolutePath - if (!fileAbsolutePath && config.get().proxy.autoUpdateDomesticDomainAllowList) { - // 异步下载,下载成功后,下次系统代理生效 - downloadDomesticDomainAllowListAsync().then() - } - - // 加载本地文件 - if (!fileAbsolutePath) { - const tmpFilePath = getDomesticDomainAllowListTmpFilePath() - if (fs.existsSync(tmpFilePath)) { - // 如果临时文件已存在,则使用临时文件 - fileAbsolutePath = tmpFilePath - log.info('读取已下载的 domestic-domain-allowlist.txt 文件:', fileAbsolutePath) - } else { - // 如果临时文件不存在,则使用内置文件 - log.info('__dirname:', __dirname) - fileAbsolutePath = path.join(__dirname, '../', config.get().proxy.domesticDomainAllowListFilePath) - log.info('读取内置的 domestic-domain-allowlist.txt 文件:', fileAbsolutePath) - } - } else { - log.info('读取自定义路径的 domestic-domain-allowlist.txt 文件:', fileAbsolutePath) - } - - try { - return fs.readFileSync(fileAbsolutePath).toString() - } catch (e) { - log.error(`读取 domestic-domain-allowlist.txt 文件失败: ${fileAbsolutePath}, error:`, e) - return null - } -} - -function getProxyExcludeIpStr (split) { - const proxyExcludeIpConfig = config.get().proxy.excludeIpList - - let excludeIpStr = '' - for (const ip in proxyExcludeIpConfig) { - if (proxyExcludeIpConfig[ip] === true) { - excludeIpStr += ip + split - } - } - - // 排除国内域名 - // log.debug('系统代理排除域名(excludeIpStr):', excludeIpStr) - if (config.get().proxy.excludeDomesticDomainAllowList) { - try { - const domesticDomainAllowList = getDomesticDomainAllowList() - if (domesticDomainAllowList) { - const domesticDomainList = (`\n${domesticDomainAllowList}`).replaceAll(/[\r\n]+/g, '\n').match(/(?<=\n)(?:[\w\-.*]+|\[[\w:]+\])(?=\n)/g) - if (domesticDomainList && domesticDomainList.length > 0) { - for (const domesticDomain of domesticDomainList) { - if (proxyExcludeIpConfig[domesticDomain] !== false) { - excludeIpStr += domesticDomain + split - } else { - log.info('系统代理排除列表拼接国内域名时,跳过域名,系统代理将继续代理它:', domesticDomain) - } - } - log.info('系统代理排除列表拼接国内域名成功') - } else { - log.info('国内域名为空,不进行系统代理排除列表拼接国内域名') - } - } - } catch (e) { - log.error('系统代理排除列表拼接国内域名失败:', e) - } - } - - return excludeIpStr -} - -function parseMacNetworkServiceByDevice (networkServiceOrder, device) { - if (!networkServiceOrder || !device) { - return null - } - const lines = networkServiceOrder.split(/\r?\n/) - for (let i = 0; i < lines.length; i++) { - if (lines[i].includes(`Device: ${device}`)) { - for (let j = i - 1; j >= 0; j--) { - const serviceLine = lines[j].trim() - const markerIndex = serviceLine.indexOf(') ') - if (serviceLine.startsWith('(') && markerIndex > 0) { - return serviceLine.slice(markerIndex + 2).trim() - } - } - } - } - return null -} - -function parseMacRouteDevice (routeOutput) { - if (!routeOutput) { - return null - } - const routeLines = routeOutput.split(/\r?\n/) - for (const routeLine of routeLines) { - const trimmedLine = routeLine.trim() - if (trimmedLine.startsWith('interface:')) { - return trimmedLine.slice('interface:'.length).trim() || null - } - } - return null -} - -function pickMacNetworkService (listAllNetworkServicesOutput) { - if (!listAllNetworkServicesOutput) { - return null - } - const services = listAllNetworkServicesOutput - .split(/\r?\n/) - .map(item => item.replace(/^\*/, '').trim()) - .filter(item => item && !item.startsWith('An asterisk (*) denotes')) - if (services.length === 0) { - return null - } - const preferredServices = ['Wi-Fi', 'WiFi', 'Ethernet'] - for (const preferredService of preferredServices) { - const matched = services.find(item => item === preferredService) - if (matched) { - return matched - } - } - return services[0] -} - -async function getMacNetworkService (exec) { - try { - const routeOutput = await exec('route -n get 0.0.0.0') - const device = parseMacRouteDevice(routeOutput) - if (device) { - log.info('macOS 代理服务检测:当前网络设备:', device) - try { - const networkServiceOrder = await exec('networksetup -listnetworkserviceorder') - const matchedService = parseMacNetworkServiceByDevice(networkServiceOrder, device) - if (matchedService) { - log.info('macOS 代理服务检测:通过设备名匹配到网络服务:', matchedService) - return matchedService - } - log.warn('macOS 代理服务检测:未通过设备名匹配到网络服务,尝试备用方法') - } catch (e) { - log.warn('macOS 代理服务检测:获取网络服务列表失败:', e.message, ',尝试备用方法') - } - } else { - log.warn('macOS 代理服务检测:未检测到当前网络设备,尝试备用方法') - } - } catch (e) { - log.warn('macOS 代理服务检测:获取路由信息失败:', e.message, ',尝试备用方法') - } - - try { - const allServicesOutput = await exec('networksetup -listallnetworkservices') - const fallbackService = pickMacNetworkService(allServicesOutput) - if (fallbackService) { - log.info('macOS 代理服务检测:通过服务列表备用方法找到网络服务:', fallbackService) - return fallbackService - } - log.warn('macOS 代理服务检测:未通过服务列表找到可用网络服务') - } catch (e) { - log.warn('macOS 代理服务检测:获取所有网络服务列表失败:', e.message) - } - - throw new Error('未找到可用的 macOS 网络服务,无法设置系统代理') -} - -// macOS exit code 14 = "You don't have permission to change the system preferences." -const MACOS_NETWORKSETUP_PERMISSION_ERROR_CODE = 14 - -/** - * POSIX single-quote escaping: wraps `arg` in single quotes, escaping any - * embedded single quotes with the '\''-idiom. This prevents shell - * metacharacter expansion regardless of the character set of the value. - * @param {string|number} arg - * @returns {string} - */ -function shellEscapeArg (arg) { - return "'" + String(arg).replace(/'/g, "'\\''") + "'" -} - -/** - * Strict-validate a proxy host (IPv4 / IPv6 / hostname) and throw if the - * value looks suspicious. This is a defence-in-depth guard for the sudo - * execution path; the primary protection is `shellEscapeArg`. - */ -function validateProxyIp (ip) { - if (typeof ip !== 'string' || !/^[\w.\-:[\]]+$/.test(ip)) { - throw new Error(`无效的代理 IP 地址: ${ip}`) - } -} - -/** - * Strict-validate a TCP port number. - */ -function validateProxyPort (port) { - const n = Number(port) - if (!Number.isInteger(n) || n < 1 || n > 65535) { - throw new Error(`无效的代理端口号: ${port}`) - } -} - -function sudoExecMac (cmd) { - return new Promise((resolve, reject) => { - log.info('以管理员权限执行命令:', cmd) - sudoPrompt.exec(cmd, { name: 'dev-sidecar' }, (error, stdout, stderr) => { - if (stderr) { - log.warn('以管理员权限执行命令,stderr:', stderr) - } - if (error) { - log.error('以管理员权限执行命令失败:', error) - reject(error) - } else { - resolve(stdout) - } - }) - }) -} - -const executor = { - async windows (exec, params = {}) { - const { ip, port, setEnv } = params - if (ip != null) { // 设置代理 - // 延迟加载config - loadConfig() - - log.info('开始设置windows系统代理:', ip, port, setEnv) - - // https - let proxyAddr = `https=http://${ip}:${port}` - // http - if (config.get().proxy.proxyHttp) { - proxyAddr = `http=http://${ip}:${port - 1};${proxyAddr}` - } - - // 读取排除域名 - const excludeIpStr = getProxyExcludeIpStr(';') - // 设置代理,同时设置排除域名 - try { - require('@starknt/sysproxy').triggerManualProxyByUrl(true, proxyAddr, excludeIpStr, true) - log.info(`设置windows系统代理成功: ${proxyAddr} ......(省略排除IP列表)`) - } catch (e1) { - log.warn('设置windows系统代理失败:执行 `@starknt/sysproxy` 失败,现尝试通过执行 `sysproxy.exe global ...` 来设置系统代理!\r\n捕获的异常:', e1) - - const proxyPath = extraPath.getProxyExePath() - const execFun = 'global' - try { - await execFile(proxyPath, [execFun, proxyAddr, excludeIpStr]) - log.info(`设置windows系统代理成功,执行的命令:${proxyPath} ${execFun} ${proxyAddr} ......(省略排除IP列表)`) - } catch (e2) { - log.error(`设置windows系统代理失败,执行的命令:${proxyPath} ${execFun} ${proxyAddr} ......(省略排除IP列表), error:`, e2) - throw e1 // 将上面的异常抛出 - } - } - - if (setEnv) { - // 设置全局代理所需的环境变量 - try { - await exec(`echo '设置环境变量 HTTPS_PROXY${config.get().proxy.proxyHttp ? '、HTTP_PROXY' : ''}'`) - - log.info(`开启系统代理的同时设置环境变量:HTTPS_PROXY = "http://${ip}:${port}/"`) - await exec(`setx HTTPS_PROXY "http://${ip}:${port}/"`) - - if (config.get().proxy.proxyHttp) { - log.info(`开启系统代理的同时设置环境变量:HTTP_PROXY = "http://${ip}:${port - 1}/"`) - await exec(`setx HTTP_PROXY "http://${ip}:${port - 1}/"`) - } - - // await addClearScriptIni() - } catch (e) { - log.error('设置环境变量 HTTPS_PROXY、HTTP_PROXY 失败:', e) - } - } - - return true - } else { // 关闭代理 - try { - log.info('开始关闭windows系统代理') - require('@starknt/sysproxy').triggerManualProxy(false, '', 0, '') - log.info('关闭windows系统代理成功') - } catch (e1) { - log.error('关闭windows系统代理失败:执行 `@starknt/sysproxy` 失败,现尝试通过执行 `sysproxy.exe set 1` 来关闭系统代理!\r\n捕获的异常:', e1) - - try { - const proxyPath = extraPath.getProxyExePath() - await execFile(proxyPath, ['set', '1']) - log.info('关闭windows系统代理成功,执行的命令:sysproxy.exe set 1') - } catch (e2) { - log.error('关闭windows系统代理失败,执行的命令:sysproxy.exe set 1, error:', e2) - throw e1 // 将上面的异常抛出 - } - } - - try { - await exec('echo \'删除环境变量 HTTPS_PROXY、HTTP_PROXY\'') - const regKey = new Registry({ // new operator is optional - hive: Registry.HKCU, // open registry hive HKEY_CURRENT_USER - key: '\\Environment', // key containing autostart programs - }) - regKey.get('HTTPS_PROXY', (err) => { - if (!err) { - regKey.remove('HTTPS_PROXY', async (err) => { - if (err) { - log.warn('删除环境变量 HTTPS_PROXY 失败:', err) - } else { - await exec('setx DS_REFRESH "1"') - } - }) - } - }) - regKey.get('HTTP_PROXY', (err) => { - if (!err) { - regKey.remove('HTTP_PROXY', async (err) => { - if (err) { - log.warn('删除环境变量 HTTP_PROXY 失败:', err) - } - }) - } - }) - } catch (e) { - log.error('删除环境变量 HTTPS_PROXY、HTTP_PROXY 失败:', e) - } - - return true - } - }, - async linux (exec, params = {}) { - const { ip, port } = params - if (ip != null) { // 设置代理 - // 延迟加载config - loadConfig() - - // https - const setProxyCmd = [ - 'gsettings set org.gnome.system.proxy mode manual', - `gsettings set org.gnome.system.proxy.https host ${ip}`, - `gsettings set org.gnome.system.proxy.https port ${port}`, - ] - // http - if (config.get().proxy.proxyHttp) { - setProxyCmd.push(`gsettings set org.gnome.system.proxy.http host ${ip}`) - setProxyCmd.push(`gsettings set org.gnome.system.proxy.http port ${port - 1}`) - } else { - setProxyCmd.push('gsettings set org.gnome.system.proxy.http host \'\'') - setProxyCmd.push('gsettings set org.gnome.system.proxy.http port 0') - } - - // 设置排除域名(ignore-hosts) - const excludeIpStr = getProxyExcludeIpStr('\', \'') - setProxyCmd.push(`gsettings set org.gnome.system.proxy ignore-hosts "['${excludeIpStr}']"`) - - await exec(setProxyCmd) - } else { // 关闭代理 - const setProxyCmd = [ - 'gsettings set org.gnome.system.proxy mode none', - ] - await exec(setProxyCmd) - } - }, - async mac (exec, params = {}) { - const wifiAdaptor = await getMacNetworkService(exec) - const { ip, port } = params - - let cmds - if (ip != null) { // 设置代理 - // 延迟加载config - loadConfig() - - // https - cmds = [`networksetup -setsecurewebproxy "${wifiAdaptor}" ${ip} ${port}`] - // http - if (config.get().proxy.proxyHttp) { - cmds.push(`networksetup -setwebproxy "${wifiAdaptor}" ${ip} ${port - 1}`) - } else { - cmds.push(`networksetup -setwebproxystate "${wifiAdaptor}" off`) - } - - // 设置排除域名 - const excludeIpStr = getProxyExcludeIpStr('" "') - cmds.push(`networksetup -setproxybypassdomains "${wifiAdaptor}" "${excludeIpStr}"`) - } else { // 关闭代理 - // https + http - cmds = [ - `networksetup -setsecurewebproxystate "${wifiAdaptor}" off`, - `networksetup -setwebproxystate "${wifiAdaptor}" off`, - ] - } - - // 先尝试直接执行;若因权限不足(exit code 14)失败,弹出系统授权对话框后重试 - try { - for (const cmd of cmds) { - await exec(cmd) - } - } catch (e) { - if (e.code === MACOS_NETWORKSETUP_PERMISSION_ERROR_CODE) { - log.warn('networksetup 命令需要管理员权限(exit code 14),正在弹出系统授权对话框...') - await sudoExecMac(cmds.join(' && ')) - log.info('以管理员权限执行 networksetup 命令成功') - } else { - throw e - } - } - }, -} - -const setSystemProxy = async function (args) { - return execute(executor, args) -} - -module.exports = setSystemProxy -module.exports.parseMacNetworkServiceByDevice = parseMacNetworkServiceByDevice -module.exports.parseMacRouteDevice = parseMacRouteDevice -module.exports.pickMacNetworkService = pickMacNetworkService diff --git a/packages/core/src/shell/scripts/set-system-proxy/refresh-internet.js b/packages/core/src/shell/scripts/set-system-proxy/refresh-internet.js deleted file mode 100644 index 23f8b57ccb..0000000000 --- a/packages/core/src/shell/scripts/set-system-proxy/refresh-internet.js +++ /dev/null @@ -1,14 +0,0 @@ -const script = ` -$signature = @' -[DllImport("wininet.dll", SetLastError = true, CharSet=CharSet.Auto)] -public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength); -'@ - -$INTERNET_OPTION_SETTINGS_CHANGED = 39 -$INTERNET_OPTION_REFRESH = 37 -$type = Add-Type -MemberDefinition $signature -Name wininet -Namespace pinvoke -PassThru -$a = $type::InternetSetOption(0, $INTERNET_OPTION_SETTINGS_CHANGED, 0, 0) -$b = $type::InternetSetOption(0, $INTERNET_OPTION_REFRESH, 0, 0) -$a -and $b -` -module.exports = script diff --git a/packages/core/src/shell/scripts/setup-ca.js b/packages/core/src/shell/scripts/setup-ca.js deleted file mode 100644 index fba07fdcb8..0000000000 --- a/packages/core/src/shell/scripts/setup-ca.js +++ /dev/null @@ -1,25 +0,0 @@ -const Shell = require('../shell') - -const execute = Shell.execute - -const executor = { - async windows (exec, { certPath }) { - const cmds = [`start "" "${certPath}"`] - await exec(cmds, { type: 'cmd' }) - return true - }, - async linux (exec, { certPath }) { - const cmds = [`sudo cp ${certPath} /usr/local/share/ca-certificates`, 'sudo update-ca-certificates '] - await exec(cmds) - return true - }, - async mac (exec, { certPath }) { - const cmds = [`open "${certPath}"`] - await exec(cmds, { type: 'cmd' }) - return true - }, -} - -module.exports = async function (args) { - return execute(executor, args) -} diff --git a/packages/core/src/shell/shell.js b/packages/core/src/shell/shell.js deleted file mode 100644 index 6d35d90701..0000000000 --- a/packages/core/src/shell/shell.js +++ /dev/null @@ -1,174 +0,0 @@ -const childProcess = require('node:child_process') -const os = require('node:os') -const fixPath = require('fix-path') -const PowerShell = require('node-powershell') -const log = require('../utils/util.log.core') - -fixPath() - -class SystemShell { - static async exec (cmds, args) { - throw new Error('You have to implement the method exec!') - } -} - -class LinuxSystemShell extends SystemShell { - static async exec (cmds) { - if (typeof cmds === 'string') { - cmds = [cmds] - } - for (const cmd of cmds) { - await childExec(cmd, { shell: '/bin/bash' }) - } - } -} - -class DarwinSystemShell extends SystemShell { - static async exec (cmds) { - if (typeof cmds === 'string') { - cmds = [cmds] - } - let ret - for (const cmd of cmds) { - ret = await childExec(cmd) - } - return ret - } -} - -class WindowsSystemShell extends SystemShell { - static async exec (cmds, args = { }) { - let { type } = args - type = type || 'ps' - if (typeof cmds === 'string') { - cmds = [cmds] - } - if (type === 'ps') { - const ps = new PowerShell({ - executionPolicy: 'Bypass', - noProfile: true, - }) - - for (const cmd of cmds) { - ps.addCommand(cmd) - } - - try { - return await ps.invoke() - } finally { - ps.dispose() - } - } else { - await childExecCmdWindows('chcp 65001', args) - let ret - for (const cmd of cmds) { - ret = await childExecCmdWindows(cmd, args) - } - return ret - } - } -} - -function childExecCmdWindows (cmd, options = {}) { - return new Promise((resolve, reject) => { - const execOptions = { ...options } - delete execOptions.type - delete execOptions.printErrorLog - - log.info('shell:', cmd) - childProcess.execFile('cmd.exe', ['/d', '/s', '/c', cmd], execOptions, (error, stdout, stderr) => { - if (error) { - if (options.printErrorLog !== false) { - log.error('cmd 命令执行错误:\n===>\ncommands:', cmd, '\n error:', error, '\n<===') - } - reject(new Error(stderr)) - } else { - resolve(stdout.replace('Active code page: 65001\r\n', '')) - } - }) - }) -} - -function childExec (composeCmds, options = {}) { - return new Promise((resolve, reject) => { - log.info('shell:', composeCmds) - childProcess.exec(composeCmds, options, (error, stdout, stderr) => { - if (error) { - if (options.printErrorLog !== false) { - log.error('cmd 命令执行错误:\n===>\ncommands:', composeCmds, '\n error:', error, '\n<===') - } - const err = new Error(`${stderr || error.message} (command: ${composeCmds})`) - err.code = error.code - reject(err) - } else { - // log.info('cmd 命令完成:', stdout) - resolve(stdout.replace('Active code page: 65001\r\n', '')) - } - // log.info('关闭 cmd') - // ps.kill('SIGINT') - }) - }) -} - -function getSystemShell () { - switch (getSystemPlatform(true)) { - case 'mac': - return DarwinSystemShell - case 'linux': - return LinuxSystemShell - case 'windows': - return WindowsSystemShell - default: - throw new Error(`UNKNOWN OS TYPE ${os.platform()}`) - } -} - -function getSystemPlatform (throwIfUnknown = false) { - switch (os.platform()) { - case 'darwin': - return 'mac' - case 'linux': - return 'linux' - case 'win32': - return 'windows' - case 'win64': - return 'windows' - default: - log.error(`UNKNOWN OS TYPE: ${os.platform()}`) - if (throwIfUnknown) { - throw new Error(`UNKNOWN OS TYPE '${os.platform()}'`) - } else { - return 'unknown-os' - } - } -} - -async function execute (executor, args) { - return executor[getSystemPlatform(true)](getSystemShell().exec, args) -} - -async function execFile (file, args, options) { - return new Promise((resolve, reject) => { - try { - childProcess.execFile(file, args, options, (err, stdout) => { - if (err) { - log.error('文件执行出错:', file, err) - reject(err) - return - } - log.debug('文件执行成功:', file) - resolve(stdout) - }) - } catch (e) { - log.error('文件执行出错:', file, e) - reject(e) - } - }) -} - -module.exports = { - getSystemShell, - getSystemPlatform, - execute, - execFile, -} diff --git a/packages/core/src/status.js b/packages/core/src/status.js deleted file mode 100644 index 99fe8133d5..0000000000 --- a/packages/core/src/status.js +++ /dev/null @@ -1,16 +0,0 @@ -const lodash = require('lodash') -const event = require('./event') -const log = require('./utils/util.log.core') - -const status = { - server: { enabled: false }, - proxy: {}, - plugin: {}, -} - -event.register('status', (event) => { - lodash.set(status, event.key, event.value) - log.info('status changed:', event) -}, -999) - -module.exports = status diff --git a/packages/core/src/utils/util.date.js b/packages/core/src/utils/util.date.js deleted file mode 100644 index f5dd821fbe..0000000000 --- a/packages/core/src/utils/util.date.js +++ /dev/null @@ -1,23 +0,0 @@ -module.exports = { - - format (date, needMill = true) { - if (date == null) { - return 'null' - } - - const year = date.getFullYear() // 获取年份 - const month = (date.getMonth() + 1).toString().padStart(2, '0') // 获取月份(注意月份从 0 开始计数) - const day = date.getDate().toString().padStart(2, '0') // 获取天数 - const hours = date.getHours().toString().padStart(2, '0') // 获取小时 - const minutes = date.getMinutes().toString().padStart(2, '0') // 获取分钟 - const seconds = date.getSeconds().toString().padStart(2, '0') // 获取秒数 - const milliseconds = needMill ? `.${date.getMilliseconds().toString().padStart(3, '0')}` : '' // 获取毫秒 - - return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}${milliseconds}` - }, - - now (needMill = true) { - return this.format(new Date(), needMill) - }, - -} diff --git a/packages/core/src/utils/util.log-or-console.js b/packages/core/src/utils/util.log-or-console.js deleted file mode 100644 index 9195a83443..0000000000 --- a/packages/core/src/utils/util.log-or-console.js +++ /dev/null @@ -1,89 +0,0 @@ -const dateUtil = require('./util.date') - -let log = console - -// 将console中的日志缓存起来,当setLogger时,将控制台的日志写入日志文件 -let backupLogs = [] - -function backup (fun, args) { - if (backupLogs === null) { - return - } - - try { - backupLogs.push({ - fun, - args, - time: dateUtil.format(new Date()), - }) - - // 最多缓存 100 条 - if (backupLogs.length > 100) { - backupLogs = backupLogs.slice(1) - } - } catch { - } -} - -function printBackups () { - if (backupLogs === null || log === console) { - return - } - - try { - const backups = backupLogs - backupLogs = null // 先置空历史消息对象,再记录日志 - - for (const item of backups) { - log[item.fun](...[`[${item.time}] console -`, ...item.args]) - } - } catch { - } -} - -function _doLog (fun, args) { - if (log === console) { - log[fun](...[`[${fun.toUpperCase()}]`, ...args]) - backup(fun, args) // 控制台日志备份起来 - } else { - log[fun](...args) - } -} - -module.exports = { - setLogger (logger) { - if (logger == null) { - log.error('logger 不能为空') - return - } - - if (logger === log) { - return - } - - log = logger - - if (log !== console) { - try { - if (backupLogs && backupLogs.length > 0) { - log.info('[util.log-or-console.js] 日志系统已初始化完成,现开始将历史控制台信息记录到日志文件中:') - printBackups() - } - } catch { - } - } - }, - - debug (...args) { - _doLog('debug', args) - }, - info (...args) { - _doLog('info', args) - }, - warn (...args) { - _doLog('warn', args) - }, - error (...args) { - _doLog('error', args) - }, -} diff --git a/packages/core/src/utils/util.log.core.js b/packages/core/src/utils/util.log.core.js deleted file mode 100644 index bc0a904362..0000000000 --- a/packages/core/src/utils/util.log.core.js +++ /dev/null @@ -1,5 +0,0 @@ -const loggerFactory = require('./util.logger') - -const logger = loggerFactory.getLogger('core') - -module.exports = logger diff --git a/packages/core/src/utils/util.logger.js b/packages/core/src/utils/util.logger.js deleted file mode 100644 index a953895d5e..0000000000 --- a/packages/core/src/utils/util.logger.js +++ /dev/null @@ -1,94 +0,0 @@ -const path = require('node:path') -const log4js = require('log4js') -const logOrConsole = require('./util.log-or-console') -const defaultConfig = require('../config/index.js') -const configFromFiles = defaultConfig.configFromFiles - -// 日志级别 -const level = process.env.NODE_ENV === 'development' ? 'debug' : 'info' - -function getDefaultConfigBasePath () { - if (configFromFiles.app.logFileSavePath) { - let logFileSavePath = configFromFiles.app.logFileSavePath - if (logFileSavePath.endsWith('/') || logFileSavePath.endsWith('\\')) { - logFileSavePath = logFileSavePath.slice(0, -1) - } - // eslint-disable-next-line no-template-curly-in-string - return logFileSavePath.replace('${userBasePath}', configFromFiles.server.setting.userBasePath) - } else { - return path.join(configFromFiles.server.setting.userBasePath, '/logs') - } -} - -// 日志文件目录 -const basePath = getDefaultConfigBasePath() - -// 通用日志配置 -const appenderConfig = { - type: 'file', - pattern: 'yyyy-MM-dd', - compress: true, // 压缩日志文件 - keepFileExt: true, // 保留日志文件扩展名为 .log - backups: Math.ceil(configFromFiles.app.keepLogFileCount) || defaultConfig.app.keepLogFileCount, // 保留日志文件数 - maxLogSize: Math.ceil((configFromFiles.app.maxLogFileSize || defaultConfig.app.maxLogFileSize) * 1024 * 1024 * (configFromFiles.app.maxLogFileSizeUnit === 'GB' ? 1024 : 1)), // 目前单位只有GB和MB -} - -let log = null - -// 设置一组日志配置 -function log4jsConfigure (categories) { - if (log != null) { - log.error('当前进程已经设置过日志配置,无法再设置更多日志配置:', categories) - return - } - - const config = { - appenders: { - std: { type: 'stdout' }, - }, - categories: { - default: { appenders: ['std'], level }, - }, - } - - for (const category of categories) { - config.appenders[category] = { ...appenderConfig, filename: path.join(basePath, `/${category}.log`) } - config.categories[category] = { appenders: [category, 'std'], level } - } - - log4js.configure(config) - - // 拿第一个日志类型来logger并设置到log变量中 - log = log4js.getLogger(categories[0]) - logOrConsole.setLogger(log) - - log.info(`设置日志配置完成,进程ID: ${process.pid},categories:[${categories}],config:`, JSON.stringify(config)) -} - -module.exports = { - getLogger (category) { - if (!category) { - if (log) { - log.error('未指定日志类型,无法配置并获取日志对象!!!') - } - throw new Error('未指定日志类型,无法配置并获取日志对象!!!') - } - - if (category === 'core' || category === 'gui') { - // core 和 gui 的日志配置,因为它们在同一进程中,所以一起配置,且只能配置一次 - if (log == null) { - log4jsConfigure(['core', 'gui']) - } - - return log4js.getLogger(category) - } else { - if (log == null) { - log4jsConfigure([category]) - } else if (category !== log.category) { - log.error(`当前进程已经设置过日志配置,无法再设置 "${category}" 的配置,先临时返回 "${log.category}" 的 log 进行日志记录。如果与其他类型的日志在同一进程中写入,请参照 core 和 gui 一起配置`) - } - - return log - } - }, -} diff --git a/packages/core/src/utils/util.version.js b/packages/core/src/utils/util.version.js deleted file mode 100644 index c084e64b17..0000000000 --- a/packages/core/src/utils/util.version.js +++ /dev/null @@ -1,84 +0,0 @@ -function parseVersion (version) { - const matched = version.match(/^v?(\d{1,2}(?:\.\d{1,2})*)[.-]?(.*)$/) - if (!matched) { - throw new Error(`Invalid version string: ${version}`) - } - const versionInfo = { - versions: matched[1].split('.'), // 版本号数组 - pre: matched[2], // 预发布版本号 - } - - // 将 versions 中的数字字符串转为数字 - for (let i = 0; i < versionInfo.versions.length; i++) { - versionInfo.versions[i] = Number.parseInt(versionInfo.versions[i]) - } - - return versionInfo -} - -/** - * 比较版本号 - * - * @param onlineVersion 线上版本号 - * @param currentVersion 当前版本号 - * @param log 日志对象 - * @returns {number} 比较线上版本号是否为更新的版本,大于0=是|0=相等|小于0=否|-999=出现异常,比较结果未知 - */ -function isNewVersion (onlineVersion, currentVersion, log = null) { - if (onlineVersion === currentVersion) { - return 0 - } - - try { - const onlineVersionObj = parseVersion(onlineVersion) - const curVersionObj = parseVersion(currentVersion) - - const { versions: versions1 } = onlineVersionObj - const { versions: versions2 } = curVersionObj - - if (versions1.length !== versions2.length) { - // 短的数组补0 - if (versions1.length < versions2.length) { - for (let i = versions1.length; i < versions2.length; i++) { - versions1.push(0) - } - } else if (versions1.length > versions2.length) { - for (let i = versions2.length; i < versions1.length; i++) { - versions2.push(0) - } - } - } - - // 版本数组比对 - for (let i = 0; i < versions1.length; i++) { - if (versions1[i] > versions2[i]) { - return i + 1 // 为新版本,需要更新 - } else if (versions1[i] < versions2[i]) { - return -(i + 1) // 为旧版本,无需更新 - } - } - - // 版本号相同,继续比对预发布版本号 - if (onlineVersionObj.pre && curVersionObj.pre) { - // 都为预发布版本时,直接比较预发布版本号字符串的大小 - if (onlineVersionObj.pre > curVersionObj.pre) { - return 101 - } else if (onlineVersionObj.pre < curVersionObj.pre) { - return -101 - } - } else if (!onlineVersionObj.pre && curVersionObj.pre) { - // 线上为正式版本,当前版本为预发布版本,需要更新 - return 102 - } else if (onlineVersionObj.pre && !curVersionObj.pre) { - // 线上为预发布版本,当前版本为正式版本,无需更新 - return -102 - } - - return 0 // 相同版本,无需更新 - } catch (e) { - (log || console).error(`比对版本失败,当前版本号:${currentVersion},线上版本号:${onlineVersion}, error:`, e) - return -999 // 比对异常 - } -} - -module.exports = { isNewVersion } diff --git a/packages/core/test/configTest.js b/packages/core/test/configTest.js deleted file mode 100644 index 40142b3375..0000000000 --- a/packages/core/test/configTest.js +++ /dev/null @@ -1,20 +0,0 @@ -// const config = require('../src/config-api') -// -// config.set({ -// server: { -// intercepts: { -// 'github1.githubassets.com': { -// '.*': { -// redirect: 'assets.fastgit.org', -// test: 'https://github.githubassets.com/favicons/favicon.svg', -// desc: '静态资源加速' -// } -// }, -// 'github.githubassets.com': null -// } -// } -// }) -// -// console.log(config.get()) -// -// config.reload() diff --git a/packages/core/test/httpsVerifyTest.js b/packages/core/test/httpsVerifyTest.js deleted file mode 100644 index eafa99819c..0000000000 --- a/packages/core/test/httpsVerifyTest.js +++ /dev/null @@ -1,41 +0,0 @@ -// const https = require('node:https') -// -// process.env.NODE_TLS_REJECT_UNAUTHORIZED = '1' -// -// function request () { -// return new Promise((resolve, reject) => { -// const options = { -// hostname: 'test1.gagedigital.com', -// port: 443, -// path: '/ssltest.php', -// method: 'GET', -// rejectUnauthorized: true, -// } -// console.log('ssl test: gagedigital') -// const req = https.request(options, (res) => { -// console.log('statusCode:', res.statusCode) -// console.log('headers:', res.headers) -// -// res.on('data', (d) => { -// process.stdout.write(d) -// resolve() -// }) -// }) -// -// req.on('error', (e) => { -// console.error(e) -// reject(e) -// }) -// req.end() -// }) -// } -// // eslint-disable-next-line no-undef -// describe('ssl.verify', () => { -// // eslint-disable-next-line no-undef -// it('regex.test.js', async () => { -// // https.request('https://test1.gagedigital.com/ssltest.php') -// await request() -// -// // expect(ret).be.ok -// }) -// }) diff --git a/packages/core/test/macProxyTest.js b/packages/core/test/macProxyTest.js deleted file mode 100644 index 58af7b0b9b..0000000000 --- a/packages/core/test/macProxyTest.js +++ /dev/null @@ -1,19 +0,0 @@ -const assert = require('node:assert') - -// const childProcess = require('child_process') -// const util = require('util') -// const exec = util.promisify(childProcess.exec) -// -// async function test () { -// const wifiAdaptor = (await exec('sh -c "networksetup -listnetworkserviceorder | grep `route -n get 0.0.0.0 | grep \'interface\' | cut -d \':\' -f2` -B 1 | head -n 1 | cut -d \' \' -f2"')).stdout.trim() -// -// await exec(`networksetup -setwebproxystate '${wifiAdaptor}' off`) -// return await exec(`networksetup -setsecurewebproxystate '${wifiAdaptor}' off`) -// } -// test().then((ret) => { -// console.log('haha', ret) -// }) -let wifiAdaptor = '(151) test' -wifiAdaptor = wifiAdaptor.substring(wifiAdaptor.indexOf(' ')).trim() -console.log(wifiAdaptor) -assert.strictEqual(wifiAdaptor, 'test') diff --git a/packages/core/test/mergeTest.js b/packages/core/test/mergeTest.js deleted file mode 100644 index 6da6290e85..0000000000 --- a/packages/core/test/mergeTest.js +++ /dev/null @@ -1,92 +0,0 @@ -const assert = require('node:assert') -const lodash = require('lodash') -const mergeApi = require('../src/merge.js') - -// 默认配置 -const defConfig = { - a: { - aa: { value: 1 }, - bb: { value: 2 }, - }, - b: { c: 2 }, - c: 1, - d: [1, 2, 3], - e: { - aa: 2, - ee: 5, - }, - f: { - x: 1, - }, - g: [1, 2], - h: null, - i: null, -} - -// 自定义配置 -const customConfig = { - a: { - bb: { value: 2 }, - cc: { value: 3 }, - }, - b: { c: 2 }, - c: null, - d: [1, 2, 3, 4], - e: { - aa: 2, - ee: 5, - ff: 6, - }, - f: {}, - g: [1, 2], - h: null, -} - -// doDiff -const doDiffResult = mergeApi.doDiff(defConfig, customConfig) -console.log('doDiffResult:', JSON.stringify(doDiffResult, null, 2)) -console.log('\r') -// 校验doDiff结果 -const doDiffExpect = { - a: { - aa: null, - cc: { value: 3 }, - }, - c: null, - d: [1, 2, 3, 4], - e: { - ff: 6, - }, - f: { - x: null, - }, -} -console.log('check diff result:', lodash.isEqual(doDiffResult, doDiffExpect)) -console.log('\r') - -// doMerge -const doMergeResult = mergeApi.doMerge(defConfig, doDiffResult) -// delete null item -mergeApi.deleteNullItems(doMergeResult) -console.log('running:', JSON.stringify(doMergeResult, null, 2)) -// 校验doMerge结果 -const doMergeExpect = { - a: { - bb: { value: 2 }, - cc: { value: 3 }, - }, - b: { c: 2 }, - d: [1, 2, 3, 4], - e: { - aa: 2, - ee: 5, - ff: 6, - }, - f: {}, - g: [1, 2], -} - -const result = lodash.isEqual(doMergeResult, doMergeExpect) -console.log('check merge result:', result) -console.log('\r') -assert.strictEqual(result, true) diff --git a/packages/core/test/regex.test.js b/packages/core/test/regex.test.js deleted file mode 100644 index 08d40350d3..0000000000 --- a/packages/core/test/regex.test.js +++ /dev/null @@ -1,16 +0,0 @@ -const assert = require('node:assert') -const expect = require('chai').expect -// eslint-disable-next-line no-undef -describe('test', () => { - // eslint-disable-next-line no-undef - it('regexp', () => { - const test = '^/[^/]+/[^/]+(?:/releases(?:/.*)?)?$' - const reg = new RegExp(test) - - const ret = reg.test('/docmirror/dev-sidecar/releases/tag') - console.log(ret) - assert.strictEqual(ret, true) - - expect(ret).be.ok - }) -}) diff --git a/packages/core/test/requestTest.js b/packages/core/test/requestTest.js deleted file mode 100644 index 07a077ce59..0000000000 --- a/packages/core/test/requestTest.js +++ /dev/null @@ -1,24 +0,0 @@ -const HttpsAgent = require('@docmirror/mitmproxy/src/lib/proxy/common/ProxyHttpsAgent') -const request = require('request') - -const options = { - url: 'https://raw.githubusercontent.com/docmirror/dev-sidecar/refs/heads/master/packages/core/src/config/remote_config.json5', - // url: 'https://raw.giteeusercontent.com/wangliang181230/dev-sidecar-config/raw/main/remote_config.json', - servername: 'baidu.com', - agent: new HttpsAgent({ - keepAlive: true, - timeout: 20000, - keepAliveTimeout: 30000, - rejectUnauthorized: false, - }), -} -if (options.agent.options) { - options.agent.options.rejectUnauthorized = false - console.info('options.agent.options.rejectUnauthorized = false') -} - -request(options, (error, response, body) => { - console.info('error:', error, '\n---------------------------------------------------------------------------\n' - + 'response:', response, '\n---------------------------------------------------------------------------\n' - + 'body:', body) -}) diff --git a/packages/core/test/setSystemProxyMacTest.js b/packages/core/test/setSystemProxyMacTest.js deleted file mode 100644 index a7abbe3c54..0000000000 --- a/packages/core/test/setSystemProxyMacTest.js +++ /dev/null @@ -1,79 +0,0 @@ -const assert = require('node:assert') -const setSystemProxy = require('../src/shell/scripts/set-system-proxy') - -// eslint-disable-next-line no-undef -describe('set-system-proxy mac helpers', () => { - // eslint-disable-next-line no-undef - it('should parse service by device from listnetworkserviceorder output', () => { - const networkServiceOrder = ` -(1) Wi-Fi -(Hardware Port: Wi-Fi, Device: en0) -(2) Thunderbolt Bridge -(Hardware Port: Thunderbolt Bridge, Device: bridge0) -`.trim() - const service = setSystemProxy.parseMacNetworkServiceByDevice(networkServiceOrder, 'en0') - assert.strictEqual(service, 'Wi-Fi') - assert.strictEqual(setSystemProxy.parseMacNetworkServiceByDevice('', 'en0'), null) - assert.strictEqual(setSystemProxy.parseMacNetworkServiceByDevice(networkServiceOrder, ''), null) - }) - - // eslint-disable-next-line no-undef - it('should parse route device from route output', () => { - const routeOutput = ` -route to: default -interface: en0 -flags: -`.trim() - const device = setSystemProxy.parseMacRouteDevice(routeOutput) - assert.strictEqual(device, 'en0') - assert.strictEqual(setSystemProxy.parseMacRouteDevice(''), null) - assert.strictEqual(setSystemProxy.parseMacRouteDevice(null), null) - }) - - // eslint-disable-next-line no-undef - it('should fallback to preferred Wi-Fi service when available', () => { - const listAllNetworkServicesOutput = ` -USB 10/100/1000 LAN -Wi-Fi -Thunderbolt Bridge -`.trim() - const service = setSystemProxy.pickMacNetworkService(listAllNetworkServicesOutput) - assert.strictEqual(service, 'Wi-Fi') - }) - - // eslint-disable-next-line no-undef - it('should fallback to first service when preferred service is unavailable', () => { - const listAllNetworkServicesOutput = ` -USB 10/100/1000 LAN -Thunderbolt Bridge -`.trim() - const service = setSystemProxy.pickMacNetworkService(listAllNetworkServicesOutput) - assert.strictEqual(service, 'USB 10/100/1000 LAN') - }) - - // eslint-disable-next-line no-undef - it('should support disabled service prefix and empty input', () => { - const listAllNetworkServicesOutput = ` -*Wi-Fi -Thunderbolt Bridge -`.trim() - const service = setSystemProxy.pickMacNetworkService(listAllNetworkServicesOutput) - assert.strictEqual(service, 'Wi-Fi') - assert.strictEqual(setSystemProxy.pickMacNetworkService(''), null) - assert.strictEqual(setSystemProxy.pickMacNetworkService(null), null) - }) - - // eslint-disable-next-line no-undef - it('should ignore the "An asterisk" header line produced by networksetup -listallnetworkservices', () => { - const fullOutput = `An asterisk (*) denotes that a network service is disabled. -Ethernet -Wi-Fi -Thunderbolt Bridge` - assert.strictEqual(setSystemProxy.pickMacNetworkService(fullOutput), 'Wi-Fi') - - const fullOutputEthernetOnly = `An asterisk (*) denotes that a network service is disabled. -Ethernet -Thunderbolt Bridge` - assert.strictEqual(setSystemProxy.pickMacNetworkService(fullOutputEthernetOnly), 'Ethernet') - }) -}) diff --git a/packages/core/test/urlTest.js b/packages/core/test/urlTest.js deleted file mode 100644 index 948776d752..0000000000 --- a/packages/core/test/urlTest.js +++ /dev/null @@ -1,12 +0,0 @@ -// const URL = require('node:url') -// -// const url = 'https://github.com:8080/aaa?x=1#s=2' -// -// const urlObj = new URL.URL(url) -// console.log('new URL.URL(url) -> ', urlObj) -// -// // eslint-disable-next-line node/no-deprecated-api -// const urlObj2 = URL.parse(url) -// console.log('\nURL.parse(url) -> ', urlObj2) -// -// console.log('\n`urlObj.pathname + urlObj.search === urlObj2.path` =', urlObj.pathname + urlObj.search === urlObj2.path) diff --git a/packages/core/test/versionTest.js b/packages/core/test/versionTest.js deleted file mode 100644 index 4dbd5494c2..0000000000 --- a/packages/core/test/versionTest.js +++ /dev/null @@ -1,41 +0,0 @@ -const assert = require('node:assert') -const { isNewVersion } = require('../src/utils/util.version.js') - -function testIsNewVersion (onlineVersion, currentVersion, expected) { - const ret = isNewVersion(onlineVersion, currentVersion) - console.log(ret >= 0 ? ` ${ret}` : `${ret}`) - assert.strictEqual(ret, expected) -} - -testIsNewVersion('2.0.0', '2.0.0', 0) - -testIsNewVersion('2.0.0', '1.0.0', 1) -testIsNewVersion('1.0.0', '2.0.0', -1) - -testIsNewVersion('2.1.0', '2.0.0', 2) -testIsNewVersion('2.0.0', '2.1.0', -2) - -testIsNewVersion('2.0.1', '2.0.0', 3) -testIsNewVersion('2.0.10', '2.0.2', 3) -testIsNewVersion('2.0.10.1', '2.0.2.2', 3) -testIsNewVersion('2.0.10-RC1', '2.0.2-RC2', 3) -testIsNewVersion('2.0.0', '2.0.1', -3) - -testIsNewVersion('2.0.0.1', '2.0.0', 4) -testIsNewVersion('2.0.0.1', '2.0.0.X', 4) -testIsNewVersion('2.0.0', '2.0.0.1', -4) - -testIsNewVersion('2.0.0.9.1', '2.0.0.9', 5) -testIsNewVersion('2.0.0.9', '2.0.0.9.1', -5) - -testIsNewVersion('2.0.0-RC2', '2.0.0-RC1', 101) -testIsNewVersion('2.0.0-RC1', '2.0.0-RC2', -101) - -testIsNewVersion('2.0.0', '2.0.0-RC1', 102) -testIsNewVersion('2.0.0-RC1', '2.0.0', -102) - -testIsNewVersion('2.0.0.0', '2.0.0', 0) - -testIsNewVersion('x', 'v', -999) - -console.log('版本测试通过') diff --git a/packages/gui/.editorconfig b/packages/gui/.editorconfig deleted file mode 100644 index 7053c49a04..0000000000 --- a/packages/gui/.editorconfig +++ /dev/null @@ -1,5 +0,0 @@ -[*.{js,jsx,ts,tsx,vue}] -indent_style = space -indent_size = 2 -trim_trailing_whitespace = true -insert_final_newline = true diff --git a/packages/gui/.env b/packages/gui/.env deleted file mode 100644 index 55c49958bf..0000000000 --- a/packages/gui/.env +++ /dev/null @@ -1,2 +0,0 @@ -VUE_APP_PUBLISH_URL=http://dev-sidecar.docmirror.cn/update/ -VUE_APP_PUBLISH_PROVIDER=generic diff --git a/packages/gui/.gitignore b/packages/gui/.gitignore deleted file mode 100644 index a1010b6745..0000000000 --- a/packages/gui/.gitignore +++ /dev/null @@ -1,28 +0,0 @@ -.DS_Store -node_modules -/dist - - -# local env files -.env.local -.env.*.local - -# Log files -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* - -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? -*.lock -*.log -#Electron-builder output -/dist_electron -/config diff --git a/packages/gui/LICENSE b/packages/gui/LICENSE deleted file mode 100644 index a612ad9813..0000000000 --- a/packages/gui/LICENSE +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/packages/gui/README.md b/packages/gui/README.md deleted file mode 100644 index 6d550671a7..0000000000 --- a/packages/gui/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# dev-sidecar-gui - -## Project setup - -You should always refer to the [main README](../../README.md) for instructions on how to set up the project. - -### Customize configuration - -See [Configuration Reference](https://cli.vuejs.org/config/). diff --git a/packages/gui/babel.config.cjs b/packages/gui/babel.config.cjs deleted file mode 100644 index 0a932f18f5..0000000000 --- a/packages/gui/babel.config.cjs +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - presets: [ - '@vue/babel-preset-jsx', - ], -} diff --git a/packages/gui/build/icons/0x0.png b/packages/gui/build/icons/0x0.png deleted file mode 100644 index d838fc66bc..0000000000 Binary files a/packages/gui/build/icons/0x0.png and /dev/null differ diff --git a/packages/gui/build/icons/1024x1024.png b/packages/gui/build/icons/1024x1024.png deleted file mode 100644 index 7788ada187..0000000000 Binary files a/packages/gui/build/icons/1024x1024.png and /dev/null differ diff --git a/packages/gui/build/icons/128x128.png b/packages/gui/build/icons/128x128.png deleted file mode 100644 index ac7e1cb3ca..0000000000 Binary files a/packages/gui/build/icons/128x128.png and /dev/null differ diff --git a/packages/gui/build/icons/16x16.png b/packages/gui/build/icons/16x16.png deleted file mode 100644 index c77fedad72..0000000000 Binary files a/packages/gui/build/icons/16x16.png and /dev/null differ diff --git a/packages/gui/build/icons/24x24.png b/packages/gui/build/icons/24x24.png deleted file mode 100644 index c2faa1ed22..0000000000 Binary files a/packages/gui/build/icons/24x24.png and /dev/null differ diff --git a/packages/gui/build/icons/256x256.png b/packages/gui/build/icons/256x256.png deleted file mode 100644 index dc41d74302..0000000000 Binary files a/packages/gui/build/icons/256x256.png and /dev/null differ diff --git a/packages/gui/build/icons/32x32.png b/packages/gui/build/icons/32x32.png deleted file mode 100644 index 4712b92875..0000000000 Binary files a/packages/gui/build/icons/32x32.png and /dev/null differ diff --git a/packages/gui/build/icons/32x32@2x.png b/packages/gui/build/icons/32x32@2x.png deleted file mode 100644 index 983d8fffd6..0000000000 Binary files a/packages/gui/build/icons/32x32@2x.png and /dev/null differ diff --git a/packages/gui/build/icons/48x48.png b/packages/gui/build/icons/48x48.png deleted file mode 100644 index 7f3fb8ebf8..0000000000 Binary files a/packages/gui/build/icons/48x48.png and /dev/null differ diff --git a/packages/gui/build/icons/512x512.png b/packages/gui/build/icons/512x512.png deleted file mode 100644 index ed4e3f6381..0000000000 Binary files a/packages/gui/build/icons/512x512.png and /dev/null differ diff --git a/packages/gui/build/icons/64x64.png b/packages/gui/build/icons/64x64.png deleted file mode 100644 index 983d8fffd6..0000000000 Binary files a/packages/gui/build/icons/64x64.png and /dev/null differ diff --git a/packages/gui/build/icons/icon.icns b/packages/gui/build/icons/icon.icns deleted file mode 100644 index 39bee01a76..0000000000 Binary files a/packages/gui/build/icons/icon.icns and /dev/null differ diff --git a/packages/gui/build/icons/icon.ico b/packages/gui/build/icons/icon.ico deleted file mode 100644 index d285f9783a..0000000000 Binary files a/packages/gui/build/icons/icon.ico and /dev/null differ diff --git a/packages/gui/build/mac/0x0.png b/packages/gui/build/mac/0x0.png deleted file mode 100644 index 0702bbd3ed..0000000000 Binary files a/packages/gui/build/mac/0x0.png and /dev/null differ diff --git a/packages/gui/build/mac/128x128.png b/packages/gui/build/mac/128x128.png deleted file mode 100644 index 904834a588..0000000000 Binary files a/packages/gui/build/mac/128x128.png and /dev/null differ diff --git a/packages/gui/build/mac/16x16.png b/packages/gui/build/mac/16x16.png deleted file mode 100644 index 8f7e5e4ca4..0000000000 Binary files a/packages/gui/build/mac/16x16.png and /dev/null differ diff --git a/packages/gui/build/mac/24x24.png b/packages/gui/build/mac/24x24.png deleted file mode 100644 index 182ec32359..0000000000 Binary files a/packages/gui/build/mac/24x24.png and /dev/null differ diff --git a/packages/gui/build/mac/256x256.png b/packages/gui/build/mac/256x256.png deleted file mode 100644 index 1b07afab56..0000000000 Binary files a/packages/gui/build/mac/256x256.png and /dev/null differ diff --git a/packages/gui/build/mac/32x32.png b/packages/gui/build/mac/32x32.png deleted file mode 100644 index 705381a975..0000000000 Binary files a/packages/gui/build/mac/32x32.png and /dev/null differ diff --git a/packages/gui/build/mac/48x48.png b/packages/gui/build/mac/48x48.png deleted file mode 100644 index 1b81879c87..0000000000 Binary files a/packages/gui/build/mac/48x48.png and /dev/null differ diff --git a/packages/gui/build/mac/512x512.png b/packages/gui/build/mac/512x512.png deleted file mode 100644 index 0702bbd3ed..0000000000 Binary files a/packages/gui/build/mac/512x512.png and /dev/null differ diff --git a/packages/gui/build/mac/64x64.png b/packages/gui/build/mac/64x64.png deleted file mode 100644 index 6ff4bd55d3..0000000000 Binary files a/packages/gui/build/mac/64x64.png and /dev/null differ diff --git a/packages/gui/build/mac/icon.icns b/packages/gui/build/mac/icon.icns deleted file mode 100644 index 3fec87ac82..0000000000 Binary files a/packages/gui/build/mac/icon.icns and /dev/null differ diff --git a/packages/gui/build/mac/icon.ico b/packages/gui/build/mac/icon.ico deleted file mode 100644 index f2e2683b0c..0000000000 Binary files a/packages/gui/build/mac/icon.ico and /dev/null differ diff --git a/packages/gui/electron-builder.config.cjs b/packages/gui/electron-builder.config.cjs deleted file mode 100644 index 9a860b31e5..0000000000 --- a/packages/gui/electron-builder.config.cjs +++ /dev/null @@ -1,104 +0,0 @@ -const publishUrl = process.env.VUE_APP_PUBLISH_URL -const publishProvider = process.env.VUE_APP_PUBLISH_PROVIDER - -/** @type {import('electron-builder').Configuration} */ -module.exports = { - appId: 'dev-sidecar', - productName: 'dev-sidecar', - artifactName: 'DevSidecar-${version}-${arch}.${ext}', - copyright: 'Copyright © 2020-' + new Date().getFullYear() + ' Greper, WangLiang, CuteOmega', - directories: { - output: 'dist_electron', - buildResources: 'build', - }, - files: [ - { - from: 'dist', - to: 'dist', - filter: [ - '**/*', - '!win-*/**/*', - '!mac-*/**/*', - '!linux-*/**/*', - '!*.zip', - '!*.dmg', - '!*.blockmap', - '!*.exe', - '!*.AppImage', - '!*.deb', - '!*.rpm', - '!*.tar.gz', - '!*.flatpak', - '!builder-*.yml', - '!builder-*.yaml', - ], - }, - 'src/**/*', - 'package.json', - 'extra/**/*', - ], - extraResources: [ - { - from: 'extra', - to: 'extra', - }, - ], - afterPack: './pkg/after-pack.cjs', - afterAllArtifactBuild: './pkg/after-all-artifact-build.cjs', - nsis: { - oneClick: false, - perMachine: true, - allowElevation: true, - allowToChangeInstallationDirectory: true, - }, - win: { - icon: 'build/icons/', - target: [ - { - target: 'nsis', - arch: ['x64', 'ia32', 'arm64'], - }, - ], - }, - linux: { - icon: 'build/mac/', - target: [ - { - target: 'deb', - arch: ['x64', 'arm64', 'armv7l'], - }, - { - target: 'AppImage', - arch: ['x64', 'arm64', 'armv7l'], - }, - { - target: 'tar.gz', - arch: ['x64', 'arm64', 'armv7l'], - }, - { - target: 'rpm', - arch: ['x64', 'arm64', 'armv7l'], - }, - { - target: 'flatpak', - arch: ['x64'], - }, - ], - appId: 'cn.docmirror.DevSidecar', - category: 'System', - }, - mac: { - icon: './build/mac/icon.icns', - target: { - target: 'dmg', - arch: ['x64', 'arm64', 'universal'], - }, - category: 'public.app-category.developer-tools', - }, - publish: publishProvider - ? { - provider: publishProvider, - url: publishUrl, - } - : undefined, -} diff --git a/packages/gui/extra/EnableLoopback.exe b/packages/gui/extra/EnableLoopback.exe deleted file mode 100644 index 1dcac711e7..0000000000 Binary files a/packages/gui/extra/EnableLoopback.exe and /dev/null differ diff --git a/packages/gui/extra/icons/1024x1024.png b/packages/gui/extra/icons/1024x1024.png deleted file mode 100644 index 7788ada187..0000000000 Binary files a/packages/gui/extra/icons/1024x1024.png and /dev/null differ diff --git a/packages/gui/extra/icons/128x128.png b/packages/gui/extra/icons/128x128.png deleted file mode 100644 index ac7e1cb3ca..0000000000 Binary files a/packages/gui/extra/icons/128x128.png and /dev/null differ diff --git a/packages/gui/extra/icons/16x16-black.png b/packages/gui/extra/icons/16x16-black.png deleted file mode 100644 index 7c77181d68..0000000000 Binary files a/packages/gui/extra/icons/16x16-black.png and /dev/null differ diff --git a/packages/gui/extra/icons/16x16.png b/packages/gui/extra/icons/16x16.png deleted file mode 100644 index c77fedad72..0000000000 Binary files a/packages/gui/extra/icons/16x16.png and /dev/null differ diff --git a/packages/gui/extra/icons/24x24.png b/packages/gui/extra/icons/24x24.png deleted file mode 100644 index c2faa1ed22..0000000000 Binary files a/packages/gui/extra/icons/24x24.png and /dev/null differ diff --git a/packages/gui/extra/icons/256x256.png b/packages/gui/extra/icons/256x256.png deleted file mode 100644 index dc41d74302..0000000000 Binary files a/packages/gui/extra/icons/256x256.png and /dev/null differ diff --git a/packages/gui/extra/icons/32x32.png b/packages/gui/extra/icons/32x32.png deleted file mode 100644 index 4712b92875..0000000000 Binary files a/packages/gui/extra/icons/32x32.png and /dev/null differ diff --git a/packages/gui/extra/icons/48x48.png b/packages/gui/extra/icons/48x48.png deleted file mode 100644 index 7f3fb8ebf8..0000000000 Binary files a/packages/gui/extra/icons/48x48.png and /dev/null differ diff --git a/packages/gui/extra/icons/512x512-2.png b/packages/gui/extra/icons/512x512-2.png deleted file mode 100644 index 0702bbd3ed..0000000000 Binary files a/packages/gui/extra/icons/512x512-2.png and /dev/null differ diff --git a/packages/gui/extra/icons/512x512.png b/packages/gui/extra/icons/512x512.png deleted file mode 100644 index ed4e3f6381..0000000000 Binary files a/packages/gui/extra/icons/512x512.png and /dev/null differ diff --git a/packages/gui/extra/icons/64x64.png b/packages/gui/extra/icons/64x64.png deleted file mode 100644 index 983d8fffd6..0000000000 Binary files a/packages/gui/extra/icons/64x64.png and /dev/null differ diff --git a/packages/gui/extra/icons/icon.icns b/packages/gui/extra/icons/icon.icns deleted file mode 100644 index 39bee01a76..0000000000 Binary files a/packages/gui/extra/icons/icon.icns and /dev/null differ diff --git a/packages/gui/extra/icons/icon.ico b/packages/gui/extra/icons/icon.ico deleted file mode 100644 index d285f9783a..0000000000 Binary files a/packages/gui/extra/icons/icon.ico and /dev/null differ diff --git a/packages/gui/extra/icons/tray-icon.png b/packages/gui/extra/icons/tray-icon.png deleted file mode 100644 index 3b7ce27cae..0000000000 Binary files a/packages/gui/extra/icons/tray-icon.png and /dev/null differ diff --git a/packages/gui/extra/icons/tray/icon-black.png b/packages/gui/extra/icons/tray/icon-black.png deleted file mode 100644 index 986cd32edb..0000000000 Binary files a/packages/gui/extra/icons/tray/icon-black.png and /dev/null differ diff --git a/packages/gui/extra/icons/tray/icon-black@2x.png b/packages/gui/extra/icons/tray/icon-black@2x.png deleted file mode 100644 index 55feb7504b..0000000000 Binary files a/packages/gui/extra/icons/tray/icon-black@2x.png and /dev/null differ diff --git a/packages/gui/extra/icons/tray/icon-black@3x.png b/packages/gui/extra/icons/tray/icon-black@3x.png deleted file mode 100644 index a782c26544..0000000000 Binary files a/packages/gui/extra/icons/tray/icon-black@3x.png and /dev/null differ diff --git a/packages/gui/extra/icons/tray/icon-white.png b/packages/gui/extra/icons/tray/icon-white.png deleted file mode 100644 index fe6ba9c53b..0000000000 Binary files a/packages/gui/extra/icons/tray/icon-white.png and /dev/null differ diff --git a/packages/gui/extra/icons/tray/icon-white@2x.png b/packages/gui/extra/icons/tray/icon-white@2x.png deleted file mode 100644 index 3114858388..0000000000 Binary files a/packages/gui/extra/icons/tray/icon-white@2x.png and /dev/null differ diff --git a/packages/gui/extra/icons/tray/icon-white@3x.png b/packages/gui/extra/icons/tray/icon-white@3x.png deleted file mode 100644 index 62a495ecc3..0000000000 Binary files a/packages/gui/extra/icons/tray/icon-white@3x.png and /dev/null differ diff --git a/packages/gui/extra/icons/tray/icon.png b/packages/gui/extra/icons/tray/icon.png deleted file mode 100644 index c77fedad72..0000000000 Binary files a/packages/gui/extra/icons/tray/icon.png and /dev/null differ diff --git a/packages/gui/extra/icons/tray/icon@2x.png b/packages/gui/extra/icons/tray/icon@2x.png deleted file mode 100644 index 4712b92875..0000000000 Binary files a/packages/gui/extra/icons/tray/icon@2x.png and /dev/null differ diff --git a/packages/gui/extra/icons/tray/icon@3x.png b/packages/gui/extra/icons/tray/icon@3x.png deleted file mode 100644 index 7f3fb8ebf8..0000000000 Binary files a/packages/gui/extra/icons/tray/icon@3x.png and /dev/null differ diff --git a/packages/gui/extra/pac/pac.txt b/packages/gui/extra/pac/pac.txt deleted file mode 100644 index f1bbe1fb43..0000000000 --- a/packages/gui/extra/pac/pac.txt +++ /dev/null @@ -1,4303 +0,0 @@ -[AutoProxy 0.2.9] -! Checksum: mXjV7BDZyJY5tDH1GYLiIA -! Expires: 6h -! Title: GFWList4LL -! GFWList with EVERYTHING included -! Last Modified: Thu, 09 Apr 2026 11:10:05 +0000 -! -! HomePage: https://github.com/gfwlist/gfwlist -! License: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt -! GFWList is unlikely to fully comprise the real -! rules being deployed inside GFW system. We try -! our best to keep the list up to date. Please -! contact us regarding URL submission / removal, -! or suggestion / enhancement at issue tracker: -! https://github.com/gfwlist/gfwlist/issues/. - -!---------403/451/503/520 & URL Redirects--------- -||blogjav.net -||zoominfo.com -||ptwxz.com -||miuipolska.pl -||piaotia.com -||wunderground.com -||500px.com -||500px.org -!--ehentai -|http://85.17.73.31/ -||afreecatv.com -||agnesb.fr -||airitilibrary.com -||abematv.akamaized.net -||linear-abematv.akamaized.net -||vod-abematv.akamaized.net -||akiba-web.com -||altrec.com -||amazonvideo.com -||angela-merkel.de -||angola.org -||anthropic.com -||apartmentratings.com -||apartments.com -||arena.taipei -||assets.bwbx.io -||assimp.org -||athenaeizou.com -||bankmobilevibe.com -||banorte.com -||beeg.com -||global.bing.com -||booktopia.com.au -||boysmaster.com -||bynet.co.il -||byrut.org -||carfax.com -||casinobellini.com -||centauro.com.br -||chobit.cc -||ciciai.com -||cici.com -||claude.ai -||clearsurance.com -||cnbeta.com.tw -||counter.social -||costco.com -||coze.com -||crossfire.co.kr -||crunchyroll.com -||d2pass.com -||darpa.mil -||dawangidc.com -||deezer.com -||desipro.de -||discord.com -||discord.gg -||discordapp.com -||discordapp.net -||dish.com -|http://img.dlsite.jp/ -||dm530.net -||dmhy.org -||dmm.co.jp -|http://www.dmm.com/netgame -||dnvod.tv -||dubox.com -||dvdpac.com -||eesti.ee -||esurance.com -||expekt.com -||extmatrix.com -||fakku.net -||fastpic.ru -||filesor.com -||financetwitter.com -||flipboard.com -||flitto.com -||fnac.be -||fnac.com -||funkyimg.com -||fxnetworks.com -||g-area.org -||gettyimages.ca -||gettyimages.us -||gettyimages.hk -||gettyimages.in -||gettyimages.ae -||gettyimages.de -||gettyimages.it -||getuploader.com -||ghidra-sre.org -||glass8.eu -||glype.com -||go141.com -||hautelook.com -||hautelookcdn.com -||wego.here.com -||grok.com -||hmoegirl.com -||hmvdigital.ca -||hmvdigital.com -||homedepot.com -||hoovers.com -||hulu.com -||huluim.com -|http://secure.hustler.com -|http://hustlercash.com -|http://www.hustlercash.com -||hybrid-analysis.com -||cdn*.i-scmp.com -||ilbe.com -||ilovelongtoes.com -||imlive.co -||javhub.net -||javhuge.com -||javlibrary.com -||jcpenney.com -||jims.net -||tv.jtbc.joins.com -||jukujo-club.com -||juliepost.com -||kawaiikawaii.jp -||kendatire.com -||khatrimaza.org -||kkbox.com -||leisurepro.com -||lifemiles.com -||lih.kg -||longtoes.com -||lovetvshow.com -||lpsg.com -||lrfz.com -|http://www.m-sport.co.uk -||macgamestore.com -||madonna-av.com -||mandiant.com -||mangafox.com -||mangafox.me -||manta.com -||matome-plus.com -||matome-plus.net -||mattwilcox.net -||metarthunter.com -||mfxmedia.com -||miraheze.org -||mojim.com -||kb.monitorware.com -||monster.com -||moodyz.com -||moonbingo.com -||mos.ru -||addons.mozilla.org/*-*/firefox/addon/ublock-origin/* -||addons.mozilla.org/firefox/downloads/file/*/ublock_origin-*.xpi -||msha.gov -||www.msn.com -||muzu.tv -||mvg.jp -||mybet.com -||mypikpak.com -||nationwide.com -||neo-miracle.com -||netflix.com -||netflix.net -||nflximg.com -||nflximg.net -||nflxext.com -||nflxso.net -||nflxvideo.net -||nic.gov -|http://mo.nightlife141.com -||purpose.nike.com -||noxinfluencer.com -||nordstrom.com -||nordstromimage.com -||nordstromrack.com -||nottinghampost.com -||npsboost.com -||ntdtv.cz -||nusatrip.com -||nuuvem.com -||bbs.nyinfor.com -||olehdtv.com -||omni7.jp -||onapp.com -||ontrac.com -||openai.com -||pandora.com -||parkansky.com -||phmsociety.org -|http://*.pimg.tw/ -||podcast.co -||popai.pro -||primevideo.com -||proyectoclubes.com -||pure18.com -||qq.co.za -||r18.com -|http://radiko.jp -||ramcity.com.au -||rateyourmusic.com -||rd.com -|https://riseup.net -||sadistic-v.com -||isc.sans.edu -|http://cdn*.search.xxx/ -||shiksha.com -||slacker.com -||sm-miracle.com -||soylentnews.org -||spotify.com -||spreadshirt.es -||springboardplatform.com -||superpages.com -||swagbucks.com -||switch1.jp -||tapanwap.com -||gsp.target.com -||login.target.com -||rcam.target.com -||technews.tw -||freeterabox.com -||terabox.com -||thinkgeek.com -||thebodyshop-usa.com -||tma.co.jp -||tracfone.com -||tryheart.jp -||turntable.fm -||twerkingbutt.com -||ulop.net -||uukanshu.com -||vegasred.com -||vevo.com -||vip-enterprise.com -|http://viu.tv/ch/ -|http://viu.tv/encore/ -||vmpsoft.com -||wanz-factory.com -||ssl.webpack.de -||weebly.com -||wheretowatch.com -||wingamestore.com -||wizcrafts.net -||wowhead.com -||vod.wwe.com -||xfinity.com -||xiaomi.eu -||youwin.com -||ytn.co.kr -||zamimg.com -||zattoo.com -||zim.vn -||zozotown.com -!##############General List Start############### -!-------------------Coin Pool------------------- -||c3pool.com -||unmineable.com -||666pool.cn -||antpool.com -||crazypool.org -||cruxpool.com -||miningpoolhub.com -||huobipool.com -||poolbinance.com -||hiveon.net -||sparkpool.com -||flypool.org -||nanopool.org -||xnpool.com -||beepool.com -||zhizhu.top -||spiderpool.com -||uupool.cn -||flexpool.io -||beepool.org -||dpool.top -||okpool.me -||binancezh.cc -||btc.com -||r-pool.net -||w-pool.com -!----------------------IDN---------------------- -||xn--kcrv3utim32hx9f6qe.com -||xn--1jqvh729avzfcy2d8ummib.com -||xn--9iqy04a7fi01l.com -||xn--u2u927b.com -||xn--11xs86f.icu -||xn--4gq171p.com -||xn--czq75pvv1aj5c.org -||xn--i2ru8q2qg.com -||xn--noss43i.com -||xn--oiq.cc -||xn--p8j9a0d9c9a.xn--q9jyb4c -||xn--9pr62r24a.com -@@/^https?:\/\/(?=.*?(2x3|ni5|j5o))[a-z0-9.-]+\.xn--ngstr-lra8j\.com$ -||xn--ngstr-lra8j.com -!-----------------DNS Poisoning----------------- -!---Amazon--- -||cdn-images.mailchimp.com -||abebooks.com -||9cache.com -||9gag.com -||agro.hk -||share.america.gov -||apkmirror.com -||arte.tv -||artstation.com -||bangdream.space -||behance.net -||bird.so -||bitterwinter.org -||bnn.co -||businessinsider.com -||bwgyhw.com -||castbox.fm -||clyp.it -||cmcn.org -||cmx.im -||dailyview.tw -||daum.net -||depositphotos.com -||disconnect.me -||documentingreality.com -||doubibackup.com -||encyclopedia.com -||fangeqiang.com -||fanqiangdang.com -||feedx.net -||flyzy2005.com -||foreignpolicy.com -||free-ss.site -||freehongkong.org -||blog.fuckgfw233.org -||g0v.social -||globalvoices.org -||glorystar.me -||goregrish.com -||hanime.tv -||hbo.com -||spaces.hightail.com -||hkgalden.com -||hkgolden.com -||hudson.org -||ipfs.io -||japantimes.co.jp -||jiji.com -||jintian.net -||jinx.com -||joinmastodon.org -||liangzhichuanmei.com -||lighti.me -||lightyearvpn.com -||lihkg.com -||line-scdn.net -||i.lithium.com -||cloud.mail.ru -||cdn-images.mailchimp.com -||mastodon.cloud -||mastodon.host -||mastodon.social -||mastodon.xyz -||matters.news -||me.me -||metart.com -||mohu.club -||msa-it.org -||goo.ne.jp -||nikkei.com -||nitter.cc -||nitter.net -||niu.moe -||now.com -||openvpn.org -||onejav.com -||paste.ee -||my.pcloud.com -||picacomic.com -||pincong.rocks -||pixiv.net -||pixiv.org -||pixivsketch.net -||potato.im -||premproxy.com -||prism-break.org -||proton.me -||protonvpn.com -||api.pureapk.com -||quora.com -||quoracdn.net -||qz.com -||cdn.seatguru.com -||redd.it -||redditspace.com -||reddit.com -||reddithelp.com -|http://redditlist.com -||redditmedia.com -||redditstatic.com -||rixcloud.com -||rixcloud.us -||rsdlmonitor.com -||shadowsocks.be -||tn1.shemalez.com -||tn2.shemalez.com -||tn3.shemalez.com -||static.shemalez.com -||six-degrees.io -||softfamous.com -||sosreader.com -||sspanel.net -||supchina.com -||teddysun.com -||textnow.me -||tineye.com -||top10vpn.com -||tubepornclassic.com -||uku.im -||unseen.is -||cn.uptodown.com -||uraban.me -||vrsmash.com -||vultryhw.com -||scache.vzw.com -||scache1.vzw.com -||scache2.vzw.com -||ss7.vzw.com -||ssr.tools -||steemit.com -||taiwanjustice.net -||tinc-vpn.org -||u15.info -||washingtonpost.com -||wenzhao.ca -||whatsonweibo.com -||wire.com -||xm.com -||xuehua.us -||yes-news.com -||yigeni.com -||you-get.org -||zzcloud.me -!---Digital Currency Exchange(CRYPTO)--- -||aex.com -||allcoin.com -||adcex.com -||bcex.ca -||bibox.com -||big.one -||bigone.com -||binance.com -||bit-z.com -||bitz.ai -||bitbay.net -||bitcoinworld.com -||bitfinex.com -||bithumb.com -||bitmex.com -||bnbstatic.com -||btc98.com -||btcbank.bank -||btctrade.im -||bybit.com -||c2cx.com -||chaoex.com -||cobinhood.com -||coinbase.com -||coinbene.com -||coinex.com -||coingecko.com -||coingi.com -||coinmarketcap.com -||coinrail.co.kr -||cointiger.com -||cointobe.com -||coinut.com -||discoins.com -||dragonex.io -||ebtcbank.com -||etherdelta.com -||ethermine.org -||etherscan.io -||exmo.com -||exrates.me -||f2pool.com -||fatbtc.com -||ftx.com -||gate.io -||gatecoin.com -||hbg.com -||hitbtc.com -||hotcoin.com -||htx.com -||huobi.co -||huobi.com -||huobi.me -||huobi.li -||huobi.pro -||huobi.sc -||huobipro.com -||bx.in.th -||jex.com -||kex.com -||kraken.com -||kspcoin.com -||kucoin.com -||lbank.info -||liquiditytp.com -||livecoin.net -||localbitcoins.com -||mercatox.com -||oanda.com -||obyte.org -||oex.com -||okex.com -||okx.com -||opensea.io -||otcbtc.com -||paxful.com -||poolin.com -||simpleswap.io -||solv.finance -||topbtc.com -||tronscan.org -||xbtce.com -||yobit.net -||zb.com -!----------------Frauds & Scams----------------- -!!---Content Farm(fake 500 error)--- -||read01.com -||kknews.cc -||china-mmm.net -!---------------------Groups-------------------- -!!---Masterdon--- -||bgme.me -||o3o.ca -||go5.dev -||me.ns.ci -||moresci.sale -||social.edu.ci -||mstdn.social -||douchi.space -||slashine.onl -||social.datalabour.com -||mastodon.online -!!---Amazon--- -||payments-jp.amazon.com -||amazon.co.jp -||s3-ap-*.amazonaws.com -||s3.eu-central-1.amazonaws.com -||s3-eu-central-1.amazonaws.com -||s3.us-east-1.amazonaws.com -||s3-ap-northeast-2.amazonaws.com -||s3.ap-northeast-2.amazonaws.com -||s3-ap-northeast-1.amazonaws.com -||s3-ap-southeast-1.amazonaws.com -||s3-ap-southeast-2.amazonaws.com -!!---AOL--- -||video.aol.com -||search.aol.com -www.aolnews.com -!!---AvMoo--- -||avmo.pw -||avmoo.pw -!!---BBC--- -||bbc.com -||bbc.co.uk -||bbci.co.uk -||bbcchinese.com -!!---Bloomberg--- -||bloomberg.cn -||bloomberg.com -||bloomberg.de -||bloombergview.com -!!--Cloudflare-- -||cloudflarestatus.com -||pages.dev -||workers.dev -||one.one.one.one -||cloudflare-dns.com -||dns.cloudflare.com -!!---Dynu--- -||dynu.com -!!---Facebook--- -||accountkit.com -||cdninstagram.com -||f8.com -||facebook.com -||facebook.de -||facebook.design -||connect.facebook.net -||facebook.hu -||facebook.in -||facebook.nl -||facebook.se -||facebookmail.com -||fb.com -||fb.me -||fb.watch -||fbcdn.net -||fbsbx.com -||fbaddins.com -||fbworkmail.com -||instagram.com -||m.me -||messenger.com -||meta.com -||oculus.com -||oculuscdn.com -||rocksdb.org -||parse.com -||thefacebook.com -||threads.net -||whatsapp.com -||whatsapp.net -!!---Fandom--- -||auntology.fandom.com -||hongkong.fandom.com -!!---FTChinese--- -||ftchinese.com -!!---Google--- -||google.dev -||ai.studio -||chromium.org -||goog -||gle -||google -||doc.new -||form.new -||forms.new -||sheet.new -||sheets.new -||spreadsheet.new -||site.new -||sites.new -||website.new -||slides.new -||deck.new -||presentation.new -||googleapis.com -||1e100.net -||466453.com -||abc.xyz -||admob.com -||adsense.com -||advertisercommunity.com -||agoogleaday.com -||ampproject.org -||android.com -||androidify.com -||androidtv.com -||api.ai -||appspot.com -||autodraw.com -||blogblog.com -/^https?:\/\/[^\/]+blogspot\.(.*)/ -||business.page -!--||capitalg.com -||certificate-transparency.org -||chrome.com -||chromecast.com -||chromeexperiments.com -||chromestatus.com -||cloudfunctions.net -||crbug.com -||creativelab5.com -||crrev.com -||data-vocabulary.org -||debug.com -||deepmind.com -||deja.com -||digisfera.com -||docker.com -||docs.new -||duck.com -||feedburner.com -||firebaseio.com -||crashlytics.com -||g.co -||gcr.io -||get.app -||get.dev -||get.how -||get.page -||getmdl.io -||getoutline.org -||ggpht.com -||gmail.com -||gmodules.com -||godoc.org -||golang.org -||goo.gl -||google.com -||google.ac -||google.ad -||google.ae -||google.af -||google.ai -||google.al -||google.am -||google.as -||google.at -||google.az -||google.ba -||google.be -||google.bf -||google.bg -||google.bi -||google.bj -||google.bs -||google.bt -||google.by -||google.ca -||google.cat -||google.cd -||google.cf -||google.cg -||google.ch -||google.ci -||google.cl -||google.cm -||google.co.ao -||google.co.bw -||google.co.ck -||google.co.cr -||google.co.id -||google.co.il -||google.co.in -||google.co.jp -||google.co.ke -||google.co.kr -||google.co.ls -||google.co.ma -||google.co.mz -||google.co.nz -||google.co.th -||google.co.tz -||google.co.ug -||google.co.uk -||google.co.uz -||google.co.ve -||google.co.vi -||google.co.za -||google.co.zm -||google.co.zw -||google.com.af -||google.com.ag -||google.com.ai -||google.com.ar -||google.com.au -||google.com.bd -||google.com.bh -||google.com.bn -||google.com.bo -||google.com.br -||google.com.bz -||google.com.co -||google.com.cu -||google.com.cy -||google.com.do -||google.com.ec -||google.com.eg -||google.com.et -||google.com.fj -||google.com.gh -||google.com.gi -||google.com.gt -||google.com.hk -||google.com.jm -||google.com.kh -||google.com.kw -||google.com.lb -||google.com.ly -||google.com.mm -||google.com.mt -||google.com.mx -||google.com.my -||google.com.na -||google.com.nf -||google.com.ng -||google.com.ni -||google.com.np -||google.com.om -||google.com.pa -||google.com.pe -||google.com.pg -||google.com.ph -||google.com.pk -||google.com.pr -||google.com.py -||google.com.qa -||google.com.sa -||google.com.sb -||google.com.sg -||google.com.sl -||google.com.sv -||google.com.tj -||google.com.tr -||google.com.tw -||google.com.ua -||google.com.uy -||google.com.vc -||google.com.vn -||google.cv -||google.cz -||google.de -||google.dk -||google.dm -||google.dz -||google.ee -||google.es -||google.eu -||google.fi -||google.fm -||google.fr -||google.ga -||google.ge -||google.gg -||google.gl -||google.gm -||google.gp -||google.gr -||google.gy -||google.hk -||google.hn -||google.hr -||google.ht -||google.hu -||google.ie -||google.im -||google.iq -||google.is -||google.it -||google.it.ao -||google.je -||google.jo -||google.kg -||google.ki -||google.kz -||google.la -||google.li -||google.lk -||google.lt -||google.lu -||google.lv -||google.md -||google.me -||google.mg -||google.mk -||google.ml -||google.mn -||google.ms -||google.mu -||google.mv -||google.mw -||google.mx -||google.ne -||google.nl -||google.no -||google.nr -||google.nu -||google.org -||google.pl -||google.pn -||google.ps -||google.pt -||google.ro -||google.rs -||google.ru -||google.rw -||google.sc -||google.se -||google.sh -||google.si -||google.sk -||google.sm -||google.sn -||google.so -||google.sr -||google.st -||google.td -||google.tg -||google.tk -||google.tl -||google.tm -||google.tn -||google.to -||google.tt -||google.us -||google.vg -||google.vn -||google.vu -||google.ws -||googleapps.com -||googleartproject.com -||googleblog.com -||googlebot.com -||googlechinawebmaster.com -||googlecode.com -||googlecommerce.com -||googledomains.com -||googlearth.com -||googleearth.com -||googledrive.com -||googlefiber.net -||googlegroups.com -||googlehosted.com -||googleideas.com -||googleinsidesearch.com -||googlemail.com -||googlemashups.com -||googlepagecreator.com -||googleplay.com -||googleplus.com -||googlescholar.com -||googlesource.com -||googleusercontent.com -||googlevideo.com -||googleweblight.com -||googlezip.net -||gstatic.com -||gvt1.com -||gvt3.com -||gwtproject.org -||html5rocks.com -||iam.soy -||igoogle.com -||itasoftware.com -||like.com -||madewithcode.com -||material.io -||on2.com -||panoramio.com -||picasaweb.com -||pki.goog -||plus.codes -||polymer-project.org -||questvisual.com -||admin.recaptcha.net -||api.recaptcha.net -||api-secure.recaptcha.net -||api-verify.recaptcha.net -||redhotlabs.com -||savethedate.foo -||schema.org -||shattered.io -|http://sipml5.org/ -||snapseed.com -||synergyse.com -||teachparentstech.org -||tensorflow.org -||tfhub.dev -||thinkwithgoogle.com -||tiltbrush.com -||translate.goog -||ua5v.com -||urchin.com -||usercontent.goog -||waveprotocol.org -||waymo.com -||web.dev -||webmproject.org -||webpkgcache.com -||webrtc.org -||whatbrowser.org -||whats.new -||widevine.com -||withgoogle.com -||withyoutube.com -||x.company -||youtu.be -||youtube.com -||youtube-nocookie.com -||youtubeeducation.com -||youtubegaming.com -||youtubekids.com -||yt.be -||ytimg.com -||zynamics.com -!!---Microsoft--- -||copilot.microsoft.com -!!---NaughtyAmerica--- -||naughtyamerica.com -!!---NYTimes--- -||nyt.com -||nytcn.me -||nytco.com -|http://nyti.ms/ -||nytimes.com -||nytimg.com -||nytstyle.com -!!---Steam--- -||steamcommunity.com -||store.steampowered.com -||api.steampowered.com -||steamstatic.com -!!---Telegram--- -!!!---Domain--- -||tx.me -||tg.dev -||telega.one -||cdn-telegram.org -||comments.app -||graph.org -||legra.ph -||quiz.directory -||t.me -||updates.tdesktop.com -||telegram.dog -||telegram.me -||telegram.org -||telegram.space -||telegramdownload.com -||telegra.ph -||telesco.pe -!!!---IP--- -!!---Tiktok--- -||tiktok.com -||tiktokv.com -||tiktokv.us -||tiktokcdn-us.com -||tiktokcdn.com -||tiktokcdn-eu.com -!!---Twitch--- -||jtvnw.net -||ttvnw.net -||twitch.tv -||twitchcdn.net -!!---Twitter/X--- -||periscope.tv -||pscp.tv -||t.co -||tweetdeck.com -||twimg.com -||twitpic.com -||twitter.com -||twitter.jp -||vine.co -||x.com - -!!---Taiwan--- -||twgov.tw -||gov.tw -@@||www.gov.tw -||gov.taipei -||li.taipei -||teco-hk.org -||teco-mo.org -||kinmen.org.tw -!!---USA--- -||americorps.gov -||dma.mil -||jpl.nasa.gov -||pds.nasa.gov -||pacom.mil -||soc.mil -||solarsystem.nasa.gov -iipdigital.usembassy.gov -||uscg.mil -||usfk.mil -|http://tarr.uspto.gov/ -||tsdr.uspto.gov -!!---V2EX--- -||v2ex.com -!!---VOA--- -||voacambodia.com -||voachineseblog.com -||voacantonese.com -||voachinese.com -||voaindonesia.com -||voanews.com -||voatibetan.com -||voatibetanenglish.com -!!---Wikia--- -||zh.ecdm.wikia.com -||evchk.wikia.com -!-------------Wikipedia Related------------- -!!Emergency need only(IP/Port block usage)!! -!------0------ -||mediawiki.org -!------1------ -||wikidata.org -!------2------ -||wikimedia.org -!------3------ -||wikibooks.org -!------4------ -||wikiversity.org -!------5------ -||wikisource.org -!------6------ -||zh.wikiquote.org -!------7------ -||wikinews.org -!------8------ -||wikivoyage.org -!------9------ -||wiktionary.org -!----Main----- -||wikipedia.org -||wmfusercontent.org -!!---Yahoo--- -||shopping.yahoo.co.jp -||auctions.yahoo.co.jp -||search.yahoo.co.jp -||yahoo.com.tw -||yahoo.com.hk -||yahoo.com -!------------------Numerics--------------------- -||996.icu -||ipfs.4everland.io -||91dasai.com -||i.111666.best -||1lib.sk -||2047.one -||69shuba.cx -||2049bbs.xyz -||611study.com -||18comic.org -||000webhost.com -|http://0rz.tw -||1-apple.com.tw -||1000giri.net -||10beasts.net -||10musume.com -||12bet.com -||12vpn.com -||12vpn.net -||1337x.to -||141jj.com -||1688.com.au -||173ng.com -||18board.com -||zhao.1984.city -||1984bbs.com -||1991way.com -||1point3acres.com -||1pondo.tv -||2008xianzhang.info -||2021hkcharter.com -||2047.name -||233abc.com -||24hrs.ca -||32red.com -||36rain.com -||404museum.com -||4bluestones.biz -||4everproxy.com -||4rbtv.com -||4shared.com -||51.ca -||51jav.org -||51luoben.com -||5278.cc -||611study.icu -||63i.com -||6do.news -||6do.world -||6park.com -||6parkbbs.com -||6parker.com -||6parknews.com -||7capture.com -|http://8-d.com -|http://85cc.us -||881903.com -||89-64.org -||8964museum.com -||8z1.net -||91porn.com -||91porny.com -||91vps.club -|http://991.com -||99btgc01.com -|http://99cn.info -||9bis.com -||9bis.net -||9news.com.au -!--------------------AA------------------------- -||annas-archive.gd -||annas-archive.gl -||annas-archive.pk -||archive-it.org -||aave.com -||arweave.org -||arena.ai -||akile.io -||aljazeera.net -||anuneko.com -||ai.dev -||adguard-vpn.com -||aoxvpn.com -||asianfanfics.com -||amuletmc.com -||abplive.com -||cdn.arstechnica.net -||aomedia.org -||aljazeera.com -||akinator.com -||av01.tv -||acg.rip -||a-normal-day.com -|http://aamacau.com -||abc.net.au -||abebooks.co.uk -||aboluowang.com -||about.me -||acast.com -||acevpn.com -|http://acg18.me -||acgbox.org -||acgkj.com -||acgnx.se -||activpn.com -||aculo.us -||addictedtocoffee.de -||addyoutube.com -|http://adpl.org.hk -||adult-sex-games.com -||advanscene.com -||advertfan.com -||aei.org -||aenhancers.com -||af.mil -|http://afantibbs.com -||afr.com -||aiosearch.com -||aiph.net -||airconsole.com -|http://download.aircrack-ng.org -||airvpn.org -||ait.org.tw -||aiweiweiblog.com -||www.ajsands.com -!!---Akamai--- -||a248.e.akamai.net -|https://fbcdn*.akamaihd.net/ -|http://akademiye.org/ug -||akiba-online.com -||akow.org -||alabout.com -|http://alanhou.com -||alasbarricadas.org -||alforattv.net -||alive.bar -||alkasir.com -||all4mom.org -||allconnected.co -||alldrawnsex.com -||allfinegirls.com -||allinfa.com -||allmovie.com -||alternate-tools.com -||alwaysdata.com -||alwaysdata.net -||alwaysvpn.com -||am730.com.hk -||ameblo.jp -||americangreencard.com -||amiblockedornot.com -|http://amitabhafoundation.us -||amnesty.org -||amnesty.org.hk -||amnestyusa.org -|http://andygod.com -||anchor.fm -||anchorfree.com -!--GHS -||ancsconf.org -||andfaraway.net -||android-x86.org -||androidapksfree.com -||angularjs.org -||aniscartujo.com -||anobii.com -||anonfiles.com -||anonymouse.org -|http://www.antd.org -||anthonycalzadilla.com -|http://antiwave.net -|http://anysex.com -||ao3.org -||aobo.com.au -|http://aofriend.com -||aomiwang.com -||apat1989.org -||apiary.io -||apigee.com -||apk.support -||apkcombo.com -||apkmonk.com -||apkplz.com -||apkpure.com -||apkpure.net -||appadvice.com -||appbrain.com -||appledaily.com -||appledaily.com.tw -|http://appshopper.com -||appsocks.net -||appsto.re -||aptoide.com -||archives.gov -||archive.fo -||archive.vn -||archive.is -||archive.li -||archive.md -||archive.org -||archive.ph -||archive.today -||archiveofourown.com -||archiveofourown.org -||arctosia.com -||areca-backup.org -||arethusa.su -||arlingtoncemetery.mil -||asacp.org -||asiaharvest.org -||asianage.com -||asianews.it -||asiansexdiary.com -||asiaone.com -||ask.com -||askstudent.com -||askynz.net -||aspi.org.au -||aspistrategist.org.au -||assembla.com -||astrill.com -||atc.org.au -|http://atchinese.com -||atlanta168.com -||atnext.com -||audacy.com -||av.movie -||avaaz.org -||avdb.in -||avdb.tv -||avg.com -||avgle.com -||avidemux.org -||avoision.com -||axios.com -||axureformac.com -||azirevpn.com -!--boxun.azurewebsites.net doesn't exist. -||boxun*.azurewebsites.net -!--------------------BB------------------------- -||bittorrent.com -||help.byspotify.com -||bitbaby.com -||bettergpt.chat -||bt4gprx.com -||bt4g.org -||betterhash.net -||binance.org -||bitget.com -||blackmagicdesign.com -||bearteach.com -||btbtt.me -||btbtt.co -||btbit.net -||betaclouds.net -||blocktempo.com -||blockcast.it -||www.bing.com -||bangumi.moe -||b-ok.cc -||babylonbee.com -||backchina.com -||bad.news -||badiucao.com -|http://*2.bahamut.com.tw -||baidu.jp -||baijie.org -||bailandaily.com -||baixing.me -||baizhi.org -||banana-vpn.com -||band.us -||bandcamp.com -||bandwagonhost.com -|http://bangchen.net -||bangkokpost.com -||bangyoulater.com -||bannedbook.org -|http://baramangaonline.com -||barnabu.co.uk -||barton.de -||bastillepost.com -||bayvoice.net -||bbchat.tv -||bb-chat.tv -||bebo.com -||beevpn.com -||beijing1989.com -||beijing2022.art -||beijingspring.com -|http://bell.wiki -||berlinerbericht.de -||berlintwitterwall.com -||bestvpn.com -||bestvpnanalysis.com -||bestvpnforchina.net -||bestvpnserver.com -||bestvpnservice.com -||bestvpnusa.com -||bet365.com -||betternet.co -||bettervpn.com -||bettween.com -||betvictor.com -||bfnn.org -||bfsh.hk -||bgvpn.com -||biblesforamerica.org -||vpl.bibliocommons.com -||biedian.me -||bigjapanesesex.com -||bignews.org -||bild.de -|http://biliworld.com -|http://bit.do -|http://bit.ly -||bitchute.com -||bitcointalk.org -||bitshare.com -||bitvise.com -||bl-doujinsouko.com -||bjzc.org -||blacked.com -||blackvpn.com -||blinkx.com -||blip.tv -||blockcn.com -||blockedbyhk.com -||blockless.com -||blog.de -|http://blog.jp -||blogcatalog.com -||blogcity.me -||blogger.com -||bloglines.com -||bloglovin.com -|http://blogtd.org -||bloodshed.net -||bootstrapcdn.com -||bloomfortune.com -||blubrry.com -||bmdru.com -||bnext.com.tw -||bnrmetal.com -||boardreader.com -||bod.asia -||bolehvpn.net -||boobstagram.com -||book.com.tw -||bookdepository.com -||books.com.tw -||bookwalker.com.tw -||borgenmagazine.com -||botanwang.com -||bowenpress.com -||app.box.com -||dl.box.net -||boxpn.com -||boxun.com -||boxun.tv -||br.st -||braumeister.org -||brave.com -||bravotube.net -||brazzers.com -||breached.to -||break.com -||breakgfw.com -||breakingtweets.com -||breakwall.net -||brill.com -||brizzly.com -||broadpressinc.com -||brookings.edu -||brutaltgp.com -||bsky.app -||bsky.network -||bsky.social -||bt95.com -||btdig.com -||btguard.com -||btku.me -||btku.org -||budaedu.org -||buffered.com -||bullguard.com -||bullog.org -||bullogger.com -||bumingbai.net -||bunbunhk.com -|http://busayari.com -||business-humanrights.org -||businesstoday.com.tw -|http://busu.org/news -||buzzorange.com -||buzzsprout.com -||bvpn.com -||bwh1.net -||bypasscensorship.org -!--------------------CC------------------------- -||cia.gov -||claude.com -||www.clashverge.dev -||clementine-player.org -||backend-v2.crixet.com -||cchostvps.xyz -||canva.com -||chatpdf.com -||chat.com -||ctinets.com -||covenantswatch.org.tw -||cpu-monkey.com -||coffeemanga.to -||ctinews.com -||cachefly.com -||cachefly.net -||cutout.pro -||cixiaoya.club -||campaign-archive.com -||chinauncensored.tv -||catbox.moe -||crosswall.org -||clipconverter.cc -||zh-hans.cfsh99.com -||colacloud.net -||ci-en.jp -||c-span.org -||c-spanvideo.org -||c-est-simple.com -||cableav.tv -||cablegatesearch.net -|http://cacnw.com -||cactusvpn.com -||calendarz.com -||camfrog.com -||campaignforuyghurs.org -||cams.com -|http://bbs.cantonese.asia/ -||canyu.org -||caobian.info -||caochangqing.com -||cap.org.hk -||caoporn.us -||posts.careerengine.us -||carrd.co -||cartoonmovement.com -|http://casatibet.org.mx -||cari.com.my -||caribbeancom.com -||carousell.com.hk -||catch22.net -|http://catchgod.com -||catholic.org.hk -||catholic.org.tw -||cato.org -||cattt.com -||caus.com -||cbc.ca -||southpark.cc.com -||cccat.cc -||cccat.co -||ccfd.org.tw -||cchere.com -||cclife.org -||cclifefl.org -||ccthere.com -||ccthere.net -|http://cgdepot.org -||cdbook.org -||cdef.org -||cdig.info -||cdjp.org -||cdp1998.org -||cdp2006.org -||cdpeu.org -||cdpuk.co.uk -||cdpweb.org -||cdpwu.org -||cdw.com -||cecc.gov -||cellulo.info -||cenews.eu -||centerforhumanreprod.com -||centralnation.com -|http://centurys.net -||cfr.org -||change.org -||changp.com -||channelnewsasia.com -||chanworld.org -||chaos.social -||character.ai -||chatgpt.com -||chaturbate.com -||checkgfw.com -||chengmingmag.com -||chenguangcheng.com -||chenpokong.com -||chenpokongvip.com -||cherrysave.com -||chhongbi.org -||china-week.com -||china101.com -||china18.org -||china21.com -||china21.org -||china5000.us -||chinaaffairs.org -||chinaaid.us -||chinaaid.org -||chinaaid.net -||chinachange.org -||chinachannel.hk -||chinademocrats.org -||chinadialogue.net -||chinadigitaltimes.net -||chinaelections.org -||chinafile.com -||chinafreepress.org -||chinagfw.org -||chinahorizon.org -||chinamule.com -|https://chinanewscenter.com -||chinapress.com.my -|http://china-review.com.ua -||chinasocialdemocraticparty.com -||chinasoul.org -||chinatopsex.com -||chinaworker.info -||chinese-memorial.org -||chinesedailynews.com -||chinesedemocracy.com -||chinesegay.org -||chinesen.de -||chinesenews.net.au -||chineseradioseattle.com -||chineseupress.com -||chingcheong.com -|http://chinman.net -||cnnews.chosun.com -|http://chrdnet.com -||christianfreedom.org -||christianstudy.com -||christiantimes.org.hk -||chrlawyers.hk -||cirosantilli.com -||citizencn.com -||citizenlab.ca -||citizenlab.org -|http://city365.ca -||citypopulation.de -||civicparty.hk -||civilhrfront.org -||civilmedia.tw -||civitai.com -||ck101.com -||classicalguitarblog.net -||clinica-tibet.ru -||app.cloudcone.com -||cloudflare-ipfs.com -||club1069.com -||clubhouseapi.com -||cmegroup.com -||cmi.org.tw -|http://www.cmoinc.org -||cmule.com -||cms.gov -|http://vpn.cmu.edu -|http://vpn.sv.cmu.edu -||cna.com.tw -||cnd.org -||cnpolitics.org -|http://cn-proxy.com -||coat.co.jp -||cochina.org -||codeshare.io -||codeskulptor.org -||cofacts.tw -||conoha.jp -|http://tosh.comedycentral.com -||comefromchina.com -||commentshk.com -||communistcrimes.org -||communitychoicecu.com -||comparitech.com -||compileheart.com -||cool18.com -||coolaler.com -||coolder.com -||coolloud.org.tw -||coolstuffinc.com -|http://cos-moe.com -|http://cosplayjav.pl -||cotweet.com -||coursehero.com -||cpj.org -|http://cq99.us -||crackle.com -||crazyshit.com -||crchina.org -||creaders.net -||cristyli.com -||croxyproxy.com -|http://crocotube.com -||crossvpn.net -||crucial.com -||blog.cryptographyengineering.com -||csdparty.com -||csis.org -||csmonitor.com -||csuchen.de -||csw.org.uk -||ct.org.tw -||ctitv.com.tw -||ctowc.org -||cts.com.tw -||ctwant.com -|http://library.usc.cuhk.edu.hk -|http://mjlsh.usc.cuhk.edu.hk -||cuiweiping.net -||culture.tw -||cumlouder.com -||curvefish.com -||cusp.hk -||cutscenes.net -||cw.com.tw -|http://forum.cyberctm.com -||cyberghostvpn.com -||cynscribe.com -||ifan.cz.cc -||mike.cz.cc -||nic.cz.cc -!--------------------DD------------------------- -||dns.sb -||doh.sb -||dot.sb -||download.dappcdn.com -||dazn.com -||darmau.co -||dockerstatus.com -||doom9.org -||dweb.link -||docker.io -||disneyplus.com -||ddex.io -||d.cash -||doubiyunbackup.com -||cloud.dify.ai -|http://d-fukyu.com -||d100.net -|http://d2bay.com -||dabr.co.uk -||dabr.mobi -||dabr.me -||dadazim.com -|http://daidostup.ru -||dailymail.co.uk -||dailymotion.com -||dailysabah.com -||dajiyuan.de -|http://dalailama.mn -||dalailama.ru -|http://dalailamacenter.org -||dalailamaworld.com -||dalianmeng.org -||daliulian.org -||danke4china.net -||darrenliuwei.com -||dashlane.com -|http://david-kilgour.com -||daxa.cn -||db.tt -||dbgjd.com -||dcard.tw -||ddc.com.tw -||deadhouse.org -||deadline.com -||deepai.org -||decodet.co -||delcamp.net -||demosisto.hk -||desc.se -||dessci.com -||deutsche-welle.de -||deviantart.com -||deviantart.net -||devio.us -||devpn.com -||devv.ai -||diaoyuislands.org -|http://digiland.tw/ -||diigo.com -||directcreative.com -||discuss.com.hk -||disp.cc -||disqus.com -||dit-inc.us -||diyin.org -||dizhuzhishang.com -||dl-laby.jp -||dlive.tv -||dlsite.com -||dlyoutube.com -||dmc.nico -||dmcdn.net -||dnscrypt.org -||dns2go.com -||dnssec.net -||dolc.de -||dolf.org.hk -||dongtaiwang.com -||dongtaiwang.net -||danbooru.donmai.us -||doosho.com -||doourbest.org -||dotplane.com -||dotsub.com -||dotvpn.com -||doub.io -||doublethinklab.org -||dougscripts.com -||doujincafe.com -|https://bartender.dowjones.com -||dpp.org.tw -||dpr.info -||dragonsprings.org -||drgan.net -||dropbooks.tv -||dropbox.com -||dropboxapi.com -||dropboxusercontent.com -|http://dscn.info -|http://dstk.dk -||dtiblog.com -||dtic.mil -||duckduckgo.com -||duckmylife.com -|http://duga.jp -||duihua.org -||duihuahrjournal.org -||duplicati.com -||duyaoss.com -||dvorak.org -||dw.com -||dw.de -||dw-world.com -|http://dw-world.de -||dwnews.com -||dwnews.net -||dynawebinc.com -||dysfz.cc -!--------------------EE------------------------- -||economist.com -||e621.net -||edx-cdn.org -||everipedia.org -||epochtimes.com.tw -||etherscan.com -||elconfidencial.com -||e-classical.com.tw -||e-gold.com -||e-hentai.org -|http://e-hentaidb.com -|http://e-zone.com.hk/discuz -||e123.hk -|http://earlytibet.com -||earthvpn.com -||eastasiaforum.org -|http://www.eastturkistan.net/ -||eastturkistangovernmentinexile.us -||fnc.ebc.net.tw -||news.ebc.net.tw -||ecfa.org.tw -||ecimg.tw -||edgecastcdn.net -||edubridge.com -||eevpn.com -|http://efukt.com -||eic-av.com -||eireinikotaerukai.com -||eksisozluk.com -||elgoog.im -||elpais.com -|http://emule-ed2k.com -|http://emulefans.com -||encrypt.me -||enewstree.com -||chinese.engadget.com -||englishfromengland.co.uk -||entermap.com -||epochhk.com -||epochtimes-bg.com -||epochtimes-romania.com -||epochtimes.co.il -||epochtimes.co.kr -||epochtimes.com -||epochtimes.de -||epochtimes.fr -||epochtimes.it -||epochtimes.jp -||epochtimes.ru -||epochtimes.se -||epochtimestr.com -||epochweek.com -||epochweekly.com -||eporner.com -||erights.net -||ernestmandel.org -||erodaizensyu.com -||erodoujinlog.com -||erodoujinworld.com -||eromanga-kingdom.com -||eromangadouzin.com -|http://eromon.net -||eslite.com -||etizer.org -||etokki.com -||etsy.com -||eurekavpt.com -||euronews.com -||apps.evozi.com -||evschool.net -||exchristian.hk -|http://blog.excite.co.jp -||exhentai.org -||exmormon.org -||expatshield.com -||expecthim.com -||exploader.net -||expressvpn.com -||eyevio.jp -||eyny.com -!--------------------FF------------------------- -||freedom.gov -||hyperbeam.com -||flowgpt.com -||forefront.ai -||flexclip.com -||freegpt.tech -||freegpt.es -||feedly.com -||fuckccp.xyz -||fuckccp.com -||furrybar.com -||forbes.com -||financialexpress.com -||fast.com -||factchecklab.org -||ft.com -||fuchsia.dev -||freess.org -||fril.jp -||free.com.tw -||froth.zone -||fanbox.cc -||free.bg -||f-droid.org -||facebookquotes4u.com -||faceless.me -|http://facesoftibetanselfimmolators.info -||facesofnyfw.com -||factpedia.org -|http://faith100.org -||faiththedog.info -||fallenark.com -||falsefire.com -||falunasia.info -|http://falunau.org -||falundafa-florida.org -||falundafa-nc.org -||falundafa-pa.net -||falundafaindia.org -||falunhr.org -||fanglizhi.info -||fangong.org -||fanhaolou.com -||fanqianghou.com -||fanqiangzhe.com -||fantv.hk -||famunion.com -||fanqiang.network -||fanswong.com -!--Fastly -||en.favotter.net -||global.ssl.fastly.net -||freetls.fastly.net -||nytimes.map.fastly.net -||fast.wistia.com -||fastestvpn.com -||fastssh.com -||faststone.org -||favstar.fm -||faz.net -||fc2cn.com -|http://uygur.fc2web.com/ -||feeder.co -||feelssh.com -|http://feitianacademy.org -||feixiaohao.com -||feministteacher.com -||fengzhenghu.com -||fengzhenghu.net -|http://ff.im -|http://fhreports.net -||figprayer.com -||fileflyer.com -|http://feeds.fileforum.com -||finchvpn.com -||findyoutube.com -||findyoutube.net -|http://firearmsworld.net -||relay.firefox.com -||fireofliberty.info -||fireofliberty.org -||firetweet.io -||open.firstory.me -||firstpost.com -||firstrade.com -||fish.audio -|http://fleursdeslettres.com -||flgjustice.org -||flickr.com -||staticflickr.com -||flipkart.com -||flog.tw -||flowhongkong.net -||flyvpn.com -|http://cn.fmnnow.com -|https://ss*.4sqi.net -|http://foxgay.com -||fringenetwork.com -||flecheinthepeche.fr -||fochk.org -||focustaiwan.tw -||fofg.org -||fooooo.com -||foreignaffairs.com -||fountmedia.io -||fourthinternational.org -||foxsub.com -|http://fpmt.org -||fpmtmexico.org -||fqrouter.com -||frank2019.me -||franklc.com -|http://freakshare.com -||freebrowser.org -||freedomhouse.org -||freedomsherald.org -||freegao.com -||freekazakhs.org -||freelotto.com -||freeoz.org -||freessh.us -||freebeacon.com -||freechinaweibo.com -||freenetproject.org -||freetibet.org -|http://freetibetanheroes.org -||freetribe.me -|http://freevpn.me -||freewallpaper4.me -||freewechat.com -||freeweibo.com -||freezhihu.org -||friendfeed.com -||friends-of-tibet.org -||friendsoftibet.org -|http://www.zensur.freerk.com -|http://adult.friendfinder.com -||fring.com -||frommel.net -||frontlinedefenders.org -||frootvpn.com -||fscked.org -||ftv.com.tw -||ftvnews.com.tw -|https://fulione.com -||fullerconsideration.com -||fullservicegame.com -||furinkan.com -||futuremessage.org -||fw.cm -||fxcm-chinese.com -!--------------------GG------------------------- -||gmgn.ai -||grokipedia.com -||gfwbao.com -||greatfirevpn.com -||garudalinux.org -||about.gitlab.com -||gitlab.net -|http://gmp4.com -||getsession.org -||gdaily.org -||gfwatch.org -||go-to-zlibrary.se -||gitbook.io -|http://g6hentai.com -||g-queen.com -||gab.com -||gabocorp.com -||gagaoolala.com -||galenwu.com -||game735.com -|http://wiki.gamerp.jp -||gamer.com.tw -||gamez.com.tw -||gaoming.net -||ganjing.com -||ganjingworld.com -|http://gaopi.net -||gartlive.com -||gather.com -||gaymap.cc -||images-gaytube.com -|http://gaywatch.com -||gazotube.com -||gcc.org.hk -||gclubs.com -||gcmasia.com -|http://gcpnews.com -||geek-art.net -||gekikame.com -|http://gelbooru.com -||generated.photos -||genius.com -||geph.io -||getastrill.com -||getcloak.com -||getfoxyproxy.org -||getgom.com -||geti2p.net -||getlantern.org -||getmalus.com -||getsync.com -||gettr.com -||gfsale.com -||gfw.press -||gfw.report -||ggssl.com -||ghostpath.com -||ghut.org -|http://giantessnight.com -||giga-web.jp -||girlbanker.com -||git.io -|http://softwaredownload.gitbooks.io -||raw.githack.com -!---GitHub--- -||github.blog -||github.com -||githubcopilot.com -||github.io -||githubusercontent.com -||githubassets.com -||gizlen.net -||gjczz.com -||glarity.app -||globaljihad.net -||globalrescue.net -||globalvoicesonline.org -||globalvpn.net -||gmgard.com -|http://www.gmiddle.com -|http://www.gmiddle.net -||suche.gmx.net -||gnci.org.hk -||gnews.org -||goagent.biz -||godaddy.com -||godfootsteps.org -||gofundme.com -||gohappy.com.tw -||goldbetsports.com -||golden-ages.org -||goldeneyevault.com -||goldenfrog.com -||goldwave.com -||gongm.in -||gooday.xyz -||goodhope.school -||goodnewsnetwork.org -||goodreads.com -||goodreaders.com -||goofind.com -||gopetition.com -||goreforum.com -||gotquestions.org -||gotrusted.com -||gotw.ca -||grammaly.com -||graphis.ne.jp -||graphql.org -||gravatar.com -||greatfirewallofchina.org -||greenpeace.org -||greasyfork.org -||greenvpn.net -||grindr.com -||ground.news -||gsearch.media -||gtricks.com -||gutteruncensored.com -||gvm.com.tw -||gwins.org -||gzone-anime.info -|http://ub0.cc -||gospelherald.com -|http://hk.gradconnection.com/ -||greatfire.org -||gtv.org -||gtv1.org -|http://gu-chu-sum.org -|http://guaguass.com -||guishan.org -||gumroad.com -||gunsamerica.com -|http://gvlib.com -!--------------------HH------------------------- -||v2.hysteria.network -||hembed.com -||www.hoyolab.com -||hbomax.com -||hicairo.com -||herominers.com -||hinet.net -||hindustantimes.com -||hanime1.me -||halktv.com.tr -||haiwaikan.com -||home.saxo -||hoy.tv -||h-china.org -|http://h-moe.com -||hackmd.io -||hackthatphone.net -||haijiao.com -||hakkatv.org.tw -|http://bbs.hanminzu.org/ -||hardsextube.com -||b.hatena.ne.jp -||hdtvb.net -|http://hdzog.com -||ordns.he.net -||heartyit.com -|http://hec.su -||hecaitou.net -||hechaji.com -||heeact.edu.tw -|http://hegre-art.com -||helixstudios.net -||helloandroid.com -||helloqueer.com -||helpeachpeople.com -||helpster.de -||id.heroku.com -||herokuapp.com -||heqinglian.net -||heritage.org -||hexieshe.com -||hexieshe.xyz -||hexxeh.net -||heyuedi.com -||hiccears.com -||hidden-advent.org -||hide.me -||hideipvpn.com -||hideman.net -||hidemy.name -||hidemyass.com -||hidemycomp.com -||highrockmedia.com -||hiitch.com -||hikinggfw.org -||himalayan-foundation.org -||himemix.com -|http://hitomi.la -|http://hk-pub.com -||hk01.com -||hkacg.com -||hkacg.net -||hkbookcity.com -||hkchronicles.com -||hkcnews.com -||hkcoc.com -||hkdc.us -||hket.com -||hkfaa.com -|https://m.hkgalden.com -||hkgpao.com -||hklts.org.hk -||hkmap.live -||hkopentv.com -||hkpeanut.com -||hkreporter.com -||hnjhj.com -||hojemacau.com.mo -||hola.com -||hola.org -||holyspiritspeaks.org -|http://homeservershow.com -|http://old.honeynet.org/scans/scan31/sub/doug_eric/spam_translation.html -||hongkongfp.com -||hongzhi.li -||honven.xyz -||hootsuite.com -||hoover.org -|http://hornytrip.com -||horrorporn.com -||hostloc.com -||hotair.com -||hotspotshield.com -||hottg.com -||hotvpn.com -||howtoforge.com -||hoxx.com -||hpjav.com -||hqcdp.org -||hqjapanesesex.com -||hrichina.org -||hrntt.org -||hrw.org -||hsex.men -||hsjp.net -||hsselite.com -||hst.net.tw -||htkou.net -||huaglad.com -||huanghuagang.org -||huaren.us -|http://huashangnews.com -||huayuworld.org -||huffingtonpost.com -||huffpost.com -||huggingface.co -||hugoroy.eu -||huhaitai.com -||huhamhire.com -||huhangfei.com -||humanparty.me -||humanrightspressawards.org -||hung-ya.com -||huping.net -||hutianyi.net -||hwayue.org.tw -||hxwk.org -||hyperrate.com -||hypothes.is -||ebook.hyread.com.tw -!--------------------II------------------------- -||investing.com -||idcflare.com -||interseclab.org -||ipify.org -||itiger.com -||itch.io -||infura.io -||president.ir -||gov.ir -||irna.ir -||arvanstorage.ir -||irangov.ir -||india.com -||indiatoday.in -||invidio.us -||improd.works -||illawarramercury.com.au -||imago-images.com -||i2p2.de -||i818hk.com -||iask.ca -||iavian.net -||ibvpn.com -||icedrive.net -||icij.org -||icl-fi.org -||icoco.com -||furbo.org -||iconpaper.org -||icu-project.org -||identi.ca -||idiomconnection.com -|http://www.idlcoyote.com -||idope.se -||ift.tt -||ifcss.org -|http://ift.tt -||ifreewares.com -||igcd.net -||igfw.net -||igvita.com -||iicns.com -||ilhamtohtiinstitute.org -||illusionfactory.com -||ilove80.be -||im88.tw -||imgchili.net -||imagefap.com -||imageflea.com -||imageglass.org -||imageshack.us -||imagevenue.com -||imagezilla.net -|http://imb.org -!--IMDB -||img.ly -||imgasd.com -||imgur.com -||imkev.com -||incloak.com -||incredibox.fr -||independent.co.uk -||indiablooms.com -||indiandefensenews.in -||indianarrative.com -||timesofindia.indiatimes.com -||indiemerch.com -||info-graf.fr -||inherit.live -||initiativesforchina.org -||inkbunny.net -||inkui.com -||inmediahk.net -||inoreader.com -||inote.tw -||insecam.org -|http://insecam.org -||inside.com.tw -||insidevoa.com -||institut-tibetain.org -||interactivebrokers.com -||internet.org -||internetfreedom.org -||internetpopculture.com -||inthenameofconfuciusmovie.com -||inxian.com -||ipdefenseforum.com -||ipfire.org -||iphone4hongkong.com -||iphonetaiwan.org -||iphonix.fr -||ipicture.ru -||ipjetable.net -|http://iportal.me -||ippotv.com -||ipredator.se -||iptvbin.com -||ipvanish.com -||ironpython.net -||ironsocket.com -||ishr.ch -|http://islam.org.hk -||islamhouse.com -||isaacmao.com -||isgreat.org -||ismaelan.com -||ismprofessional.net -||israbox.com -||issuu.com -||oversea.istarshine.com -||isupportuyghurs.org -||italiatibet.org -||itemfix.com -||itshidden.com -|http://itweet.net -||iuhrdf.org -||ivacy.com -||ivonblog.com -||ivpn.net -||iwara.tv -||ixquick.com -||iyouport.com -||iyouport.org -!--------------------JJ------------------------- -||jhelab.org -||justmysockscn.com -||justmysocks.net -||jav321.com -||javdb.com -||jifangge.com -||j.mp -||jable.tv -||blog.jackjia.com -||jamestown.org -||jamyangnorbu.com -||jan.ai -||japan-whores.com -||japanhdv.com -||javakiba.org -||javbus.com -||javfinder.ai -||javfor.me -||javmobile.net -||javseen.com -||jgoodies.com -||jiangweiping.com -||jiaoyou8.com -||hk.jiepang.com -||tw.jiepang.com -|http://jihadology.net -||jingpin.org -||jinrizhiyi.news -||jitouch.com -|http://jkb.cc -||jma.go.jp -||jmsc.hku.hk -|http://jmscult.com -||joachims.org -||joinclubhouse.com -||jornaldacidadeonline.com.br -||journalofdemocracy.org -||jsdelivr.net -||fiddle.jshell.net -||juliereyc.com -||junauza.com -||bbs.junglobal.net -|http://juoaa.com -||justhost.ru -||justmysocks1.net -||juziyue.com -||cdn.jwplayer.com -!--------------------KK------------------------- -||kingkong.com.tw -||kanald.com.tr -||kpkuang.org -||ka-wai.com -||kadokawa.co.jp -||kagyu.org.za -||kagyuoffice.org -||kagyuoffice.org.tw -||kakao.com -||kannewyork.com -||kanshifang.com -||kantie.org -||kaotic.com -||karayou.com -||kawase.com -||kebrum.com -||kenengba.com -||kepard.com -||keycdn.com -||kichiku-doujinko.com -||kik.com -|http://kindleren.com -|http://www.kindleren.com -||kingdomsalvation.org -||kingstone.com.tw -||kinokuniya.com -||killwall.com -||kindle4rss.com -||kinmen.travel -|http://kiwi.kz -||kk-whys.co.jp -||knowyourmeme.com -||kobo.com -||kobobooks.com -||kompozer.net -||konachan.com -||koolsolutions.com -||koornk.com -||koranmandarin.com -||kqes.net -|http://gojet.krtco.com.tw -||ktzhk.com -||kuaichedao.co -||kukuku.uk -||kurtmunger.com -||kwcg.ca -||kwongwah.com.my -||kxsw.life -||kzaobao.com -||kzeng.info -!--------------------LL------------------------- -||lovart.ai -||library-access.sk -||linux.do -||lmarena.ai -||lexica.art -||luckymobile.ca -||ludepress.com -||lingualeo.com -||ldplayer.tw -||ldplayer.net -||ltn.com.tw -||litenews.hk -||www.lorenzetti.com.br -||linktr.ee -||labiennale.org -||lagranepoca.com -||lala.im -||lama.com.tw -||lamayeshe.com -||lamnia.co.uk -||landofhope.tv -||laogai.org -||laogairesearch.org -||laqingdan.net -||larsgeorge.com -|http://lastcombat.com -||lastfm.es -||lausan.hk -||le-vpn.com -||leafyvpn.net -||ledger.com -||left21.hk -||lematin.ch -||lenwhite.com -||lesoir.be -||letscorp.net -|http://lhakar.org -||liangyou.net -||liaowangxizang.net -||liberal.org.hk -||libertysculpturepark.com -||libertytimes.com.tw -||libredd.it -||lighten.org.tw -||lightnovel.cn -||lilaoshibushinilaoshi.com -||line.me -||line-apps.com -||lingvodics.com -|http://link-o-rama.com -||linkedin.com -||linux.org.hk -||liquidvpn.com -||greatfire.us7.list-manage.com -||listennotes.com -||listentoyoutube.com -||liuxiaobo.net -||liuxiaotong.com -||liveleak.com -||livemint.com -||livestream.com -||livingstream.com -||livevideo.com -||chat.lmsys.org -||localdomain.ws -||lockestek.com -||secure.logmein.com -||logos.com.hk -||longtermly.net -||lookpic.com -|http://looktoronto.com -||lrip.org -||lsd.org.hk -||lsm.org -||lsmchinese.org -||lsmkorean.org -||luckydesigner.space -||lupm.org -||lushstories.com -||lvhai.org -||lvv2.com -|http://lyfhk.net -||lzjscript.com -||lzmtnews.org -!--------------------MM------------------------- -||mistral.ai -||manus.im -||meee.com.tw -||mosavi.io -||dcs-spotify.megaphone.fm -||mij.rip -||mji.rip -||mjj.rip -||mcusercontent.com -||metamask.io -||missav.ws -||news.mt.co.kr -||musixmatch.com -||mergersandinquisitions.com -||m.moegirl.org -||myjs.tw -||mercari.com -||mercari.jp -||mirror.xyz -||mywife.cc -||c.mi.com -||missav.com -||madou.club -||mahjongsoul.com -||mangabz.com -||mad-ar.ch -||madrau.com -||madthumbs.com -|http://maiplus.com -||mangmang.run -||manyvoices.news -||marc.info -||makemymood.com -||martau.com -||blog.martinoei.com -|http://martsangkagyuofficial.org -||marxist.net -||marxists.org -||matainja.com -||matrix.org -||matters.town -|http://mcaf.ee -||mcadforums.com -||md-t.org -||meansys.com -||mediachinese.com -||mediafreakcity.com -||medium.com -||mega.co.nz -||mega.io -||mega.nz -||megalodon.jp -||megaproxy.com -||megurineluka.com -||meizhong.blog -||meizhong.report -||memehk.com -||memes.tw -||mercdn.net -||mercyprophet.org -||meridian-trust.org -||meripet.com -||merit-times.com.tw -||wiki.metacubex.one -||metafilter.com -||meteorshowersonline.com -||metro.taipei -||metrolife.ca -||metroradio.com.hk -||mewe.com -||mgoon.com -||mgstage.com -||mh4u.org -||bbs.mikocon.com -||microvpn.com -||mihua.org -||mikanani.me -||mikesoltys.com -|http://mindrolling.org -||mingdemedia.org -||minghui.or.kr -||minghui.org -||minghui-school.org -||mingjinglishi.com -||mingjingnews.com -||mingjingtimes.com -||mingpao.com -||mingpaocanada.com -||mingpaomonthly.com -||mingpaonews.com -|http://mingpaony.com -|http://mingpaosf.com -||mingshengbao.com -||minhhue.net -||ministrybooks.org -||minzhuzhongguo.org -||miroguide.com -||mirrorbooks.com -||mirrormedia.mg -||thecenter.mit.edu -||scratch.mit.edu -||mitbbs.com -||mixero.com -||mixi.jp -||mixx.com -||mizzmona.com -||mlc.ai -||mlzs.work -||mmaaxx.com -||mobatek.net -||mobile01.com -||mobileways.de -|http://moby.to -||mod.io -||modernchinastudies.org -||moeerolibrary.com -||moeshare.cc -||mog.com -||mohu.rocks -||momoshop.com.tw -||mondex.org -||money-link.com.tw -|http://www.monlamit.org -||moon.fm -||moonbbs.com -||moptt.tw -||moneydj.com -||monica.im -||monitorchina.org -||monocloud.me -||morningsun.org -|http://motherless.com -||movements.org -||moviefap.com -||www.moztw.org -||mpettis.com -||mpfinance.com -||mpinews.com -||mrtweet.com -|http://mswe1.org -||mthruf.com -||mubi.com -||multiply.com -||mullvad.net -||muzi.com -||muzi.net -||mx981.com -||my-private-network.co.uk -||myaudiocast.com -||bbs.mychat.to -||mychinanews.com -||mycnnews.com -||mykomica.org -||myeclipseide.com -||myiphide.com -||mymoe.moe -||myparagliding.com -||mypopescu.com -||myspacecdn.com -!--------------------NN------------------------- -||assets.nxtrace.org -||nephobox.com -||namu.wiki -||nirsoft.net -||naver.com -||maven.neoforged.net -||nftstorage.link -||newindianexpress.com -||news18.com -||bbs.naixi.net -||nikke.hotcool.tw -||nikke-kr.com -||nikke-jp.com -||nikke-en.com -||netlify.app -||nightswatch.top -||nbyy.tv -||newthuhole.com -||naacoalition.org -||naitik.net -||nakido.com -||nalandabodhi.org -||nalandawest.org -||nanyang.com -||nanyangpost.com -||nat.moe -||national-lottery.co.uk -||nationalawakening.org -||nationalinterest.org -||nationalreview.com -||line.naver.jp -||navyfamily.navy.mil -||navyreserve.navy.mil -||usno.navy.mil -||nbcnews.com -|http://nbtvpn.com -||nchrd.org -||ncn.org -||etools.ncol.com -||ndi.org -||nekoslovakia.net -||neowin.net -||netalert.me -||netflav.com -||netme.cc -||netsarang.com -|http://newcenturymc.com -||newchen.com -||newhighlandvision.com -||newmitbbs.com -||news1.kr -||newsancai.com -||newsblur.com -||newsmax.com -||newstamago.com -||newstapa.org -||newstatesman.com -||newsweek.com -||newtalk.tw -||newyorker.com -||nexon.com -||nextdigital.com.hk -||nexton-net.jp -||nexttv.com.tw -||co.ng.mil -||nga.mil -||nhentai.net -||nicovideo.jp -||ninjaproxy.ninja -||niusnews.com -||njactb.org -||nlfreevpn.com -||nmsl.website -||nnews.eu -||gotdns.ch -|http://dynupdate.no-ip.com/ -||nobel.se -||nodeseek.com -||nokogiri.org -||nokola.com -||nordvpn.com -||nos.nl -||notepad-plus-plus.org -||nownews.com -||npa.go.jp -|http://npnt.me -|http://nradio.me -||nrk.no -||ntd.tv -||ntdtv.com -||ntdtv.com.tw -||cbs.ntu.edu.tw -||media.nu.nl -||nuexpo.com -||nurgo-software.com -||nutaku.net -||nutsvpn.work -||nvdst.com -|http://nvtongzhisheng.org -|http://nyaa.eu -||nyaa.si -||nybooks.com -||nypost.com -!--------------------OO------------------------- -||osmand.net -||oklink.com -||okcoin.com -||opencritic.com -||ooni.io -||ooni.org -||files.oaiusercontent.com -||octocaptcha.com -||oojj.de -||onevps.com -||onedrive.com -||olelive.com -||oann.com -||october-review.org -||odysee.com -||officeoftibet.com -|http://ofile.org -||ogaoga.org -||ogate.org -||ohmyrss.com -||ok.ru -||okayfreedom.com -||okk.tw -||olevod.com -||olumpo.com -||omct.org -||omnitalk.com -||omnitalk.org -||omny.fm -||on.cc -||onedrive.live.com -||onion.city -||onion.ly -||onlineyoutube.com -||onlygayvideo.com -|http://onlytweets.com -|http://onthehunt.com -||opendemocracy.net -||openid.net -||openleaks.org -||openstreetmap.org -||opentech.fund -||openvpn.net -||openwebster.com -|http://opus-gaming.com -||oricon.co.jp -||orient-doll.com -||orientaldaily.com.my -||orn.jp -||osfoora.com -||otto.de -||ourdearamy.com -||oursteps.com.au -||ourtv.hk -||overcast.fm -||overdaily.org -||overplay.net -||ovpn.com -|http://owl.li -|http://ht.ly -|http://htl.li -|http://mash.to -||owltail.com -||oxfordscholarship.com -|http://www.oxid.it -||ow.ly -||ozvoice.org -!--------------------PP------------------------- -||prompthero.com -||pdst.fm -||static.pocketcasts.com -||partnerstack.xyz -||podwise.ai -||picsart.com -||images.prismic.io -||api.palworldgame.com -||pewresearch.org -||privacyguides.org -||pancakeswap.finance -||img.picgo.net -||pornmate.com -||puredns.org -||polymarket.com -||pandafan.pub -||proxz.com -||potatso.com -||pendrivelinux.com -||paimon.moe -||photonmedia.net -||points-media.com -||pkuanvil.com -||pachosting.com -||pacopacomama.com -||page.link -||eriversoft.com -||pandapow.co -||pandavpn-jp.com -||pandavpnpro.com -||pao-pao.net -||parler.com -||parsevideo.com -||passion.com -||pastie.org -||blog.pathtosharepoint.com -||patreon.com -||patreonusercontent.com -||pawoo.net -||pbs.org -||pbworks.com -||developers.box.net -||wiki.oauth.net -||wiki.phonegap.com -||wiki.jqueryui.com -||pbxes.com -||pbxes.org -||pcgamestorrents.com -||pcij.org -||pct.org.tw -||pdproxy.com -||peace.ca -||peing.net -||pekingduck.org -|http://pemulihan.or.id -||pen.io -||blog.pentalogic.net -||pentoy.hk -||peoplenews.tw -||peopo.org -||perfect-privacy.com -||perplexity.ai -||phayul.com -||phncdn.com -||photodharma.net -||photofocus.com -||picacomiccn.com -||img*.picturedip.com -||picuki.com -||pigav.com -||pin-cong.com -||pin6.com -||ping.fm -||pinimg.com -||pinoy-n.com -||pinterest.com -||pinterest.com.mx -||pinterest.com.au -||pinterest.co.uk -||pinterest.cl -||pinterest.ca -||pinterest.at -||pinterest.de -||pinterest.es -||pinterest.fr -||pinterest.ie -||pinterest.it -||pinterest.jp -||pinterest.nz -||pinterest.ph -||pinterest.pt -||pinterest.se -||pixeldrain.com -||pixelqi.com -||css.pixnet.in -||pixnet.net -||pkqjiasu.com -||placemix.com -||play-asia.com -||playboy.com -||playboyplus.com -||player.fm -||playno1.com -||playpcesor.com -||plexvpn.pro -||plurk.com -||pmatehunter.com -||po2b.com -||podbean.com -||podictionary.com -||poe.com -||pokerstars.com -||pokerstars.net -||zh.pokerstrategy.com -||politicalchina.org -||poloniex.com -||polymerhk.com -||popvote.hk -||popxi.click -||popyard.org -||pornhd.com -||pornhub.com -|http://pornhubdeutsch.net -||pornrapidshare.com -|http://pornsharing.com -||pornstarbyface.com -||pornstarclub.com -||porntvblog.com -||poskotanews.com -||post76.com -||post852.com -||potvpn.com -||pourquoi.tw -||powercx.com -||www.powerpointninja.com -||ppy.sh -||presidentlee.tw -||cdn.printfriendly.com -||provpnaccounts.com -||proxfree.com -||proxynetwork.org.uk -||pubu.com.tw -||puffinbrowser.com -||pureinsight.org -||putty.org -!-------------Posterous----- -||calebelston.com -||blog.fizzik.com -||nf.id.au -||sogrady.me -||vatn.org -||ventureswell.com -||whereiswerner.com -||power.com -||powerapple.com -||prayforchina.net -||prcleader.org -||presentationzen.com -||prestige-av.com -||pritunl.com -||privacybox.de -||private.com -||privateinternetaccess.com -||privatepaste.com -||privatetunnel.com -||privatevpn.com -||privoxy.org -||procopytips.com -||project-syndicate.org -||prosiben.de -||proxomitron.info -||proxpn.com -||pshvpn.com -||psiphon.ca -||psiphon3.com -||pstatic.net -||pt.im -||ptt.cc -||pttgame.com -||main-ecnpaper-economist.content.pugpig.com -||pullfolio.co -||pureconcepts.net -||purepdf.com -||purevpn.com -||pursuestar.com -||pximg.net -||python.com.tw -!--------------------QQ------------------------- -|http://qmp4.com -||qianmo.tw -||qbittorrent.org -||qgirl.com.tw -||qianbai.tw -||qiandao.today -||qianglie.com -||qiangwaikan.com -||qi-gong.me -||qiangyou.org -||qiwen.lu -||qoos.com -||efksoft.com -||qstatus.com -||qtrac.eu -||quitccp.org -|http://quran.com -!--------------------RR------------------------- -||radiojar.com -||radio.co -||rustdesk.com -||rentry.co -||radmin-vpn.com -||rule34video.com -||r10s.jp -||rakuten.co.jp -||r0.ru -||radio-canada.ca -||radio-en-ligne.fr -||rael.org -||radio.garden -||radioaustralia.net.au -||radiohilight.net -||radioline.co -||radiovaticana.org -||radiovncr.com -||raggedbanner.com -||raidcall.com.tw -|https://raindrop.io/ -|http://raizoji.or.jp -|http://blog.ranxiang.com/ -!--|http://rapidgator.net/ -||rapidmoviez.com -||rapidvpn.com -||rarbgprx.org -||rationalwiki.org -||rawgit.com -||rawgithub.com -||rcinet.ca -||reabble.com -||readingtimes.com.tw -||readmoo.com -|http://readydown.com -||realcourage.org -||realitykings.com -||reason.com -|http://online.recoveryversion.org -||recoveryversion.com.tw -||red-lang.org -||redbubble.com -||redchinacn.net -||referer.us -||reflectivecode.com -||blog.reimu.net -||religionnews.com -||renminbao.com -||renyurenquan.org -|http://certificate.revocationcheck.com -||resilio.com -||reuters.com -||reutersmedia.net -||resistchina.org -||retweetrank.com -||rfa.org -||rferl.org -||rfi.fr -||rfi.my -||riku.me -||ritter.vg -||rlwlw.com -||rmbl.ws -||robustnessiskey.com -||rocket.chat -||rocket-inc.net -||rojo.com -||ronjoneswriter.com -||rolfoundation.org -||rolia.net -||rolsociety.org -||rou.video -||rsf.org -||rsf-chinese.org -||rsshub.app -||phosphation13.rssing.com -||rssmeme.com -||rtalabel.org -||rthk.hk -||rthk.org.hk -||rti.org.tw -||rti.tw -||rule34.xxx -||rumble.com -||rusvpn.com -||ruten.com.tw -||rutracker.net -||rutracker.org -|http://rxhj.net -!--------------------SS------------------------- -||shitjournal.org -||spacex.com -||stephaniered.com -||simianx.ai -||steamladder.com -||sora.com -||lt.sntp.uk -||solscan.io -||sina.com.hk -||swapspace.co -||storry.tv -||standard.co.uk -||sagernet.org -||simplex.chat -||soundon.fm -||ssrtool.com -||ssrshare.us -||secure.shadowsocks.nu -||synapse.org -||south-plus.net -||silvergatebank.com -||share-videos.se -||cdn.statically.io -||slides.com -||suno.com -||sydney.bing.com -||sehuatang.org -||singlelogin.se -||suno.ai -||syosetu.com -||s-cute.com -|http://www.s4miniarchive.com -||sacks.com -||sacom.hk -||sadpanda.us -||safechat.com -||safeguarddefenders.com -||safervpn.com -|http://saintyculture.com -||sakuralive.com -||salvation.org.hk -||cn.sandscotaicentral.com -||sankakucomplex.com -||sankei.com -||sanmin.com.tw -||savethesounds.info -||savetibet.de -||savetibet.org -||savetibetstore.org -||saveuighur.org -|http://sbme.me -||scmp.com -||scramble.io -||scribd.com -||scriptspot.com -||search.com -||searx.me -||seattlefdc.com -||secretchina.com -||secretgarden.no -||secretsline.biz -||secureservercdn.net -||securetunnel.com -|https://securityinabox.org -||securitykiss.com -||seed4.me -||news.seehua.com -||seevpn.com -||seezone.net -||sehuatang.net -||sensortower.com -||sesawe.net -||sethwklein.net -||setn.com -||sevenload.com -||sex.com -||sex3.com -||sex8.cc -||sexinsex.net -|http://*.sf.net -||sfshibao.com -||sftuk.org -||shadeyouvpn.com -||www.shadowsocks.com -||shadowsocks.com.hk -||shadowsocks.org -|http://cn.shafaqna.com -||shahit.biz -||sharecool.org -||shellfire.de -||shenyunperformingarts.org -||shenyunshop.com -||shenzhoufilm.com -||shenzhouzhengdao.org -||shixiao.org -||shizhao.org -||shodanhq.com -||shooshtime.com -||shopee.tw -||showwe.tw -||shutterstock.com -||shwchurch.org -|http://shwchurch3.com -||sidelinesnews.com -||signal.org -||simbolostwitter.com -||simplecd.org -||simplecd.me -||singaporepools.com.sg -||singtao.com -||singtaousa.com -||sinoca.com -||sinocast.com -||sinoants.com -||sinoinsider.com -||sis001.com -||sitekreator.com -||sitemaps.org -||sketchappsources.com -||skimtube.com -||lab.skk.moe -||skybet.com -|http://www.skype.com/intl/ -|http://www.skype.com/zh-Hant -||skyvegas.com -||xskywalker.com -||skyxvpn.com -||sleazyfork.org -||slheng.com -||slideshare.net -||slickvpn.com -||smartdnsproxy.com -||app.smartmailcloud.com -||smh.com.au -||smn.news -||sndcdn.com -||socialblade.com -||socks-proxy.net -||sockslist.net -|http://socrec.org -||softether.org -||softether-download.com -||cdn.softlayer.net -||sogclub.com -||sohcradio.com -||sorting-algorithms.com -||soup.io -||sobees.com -||softwarebychuck.com -||soh.tw -||sohfrance.org -||solana.com -||somee.com -||songjianjun.com -||nakedsecurity.sophos.com -||sos.org -||sosad.fun -|http://soubory.com -||soulcaliburhentai.net -||soundcloud.com -||soundofhope.org -||south-plus.org -||southmongolia.org -||southnews.com.tw -||sowers.org.hk -||spankbang.com -||spatial.io -||spb.com -||speakerdeck.com -||speedcat.me -||speedify.com -||spencertipping.com -||spendee.com -||spicevpn.com -||spideroak.com -||spotflux.com -||spreaker.com -||spring4u.info -||springwood.me -||sproutcore.com -||squirrelvpn.com -||ss-link.com -|http://ssglobal.co -||ssrshare.com -||sstm.moe -||sstmlt.moe -||sstmlt.net -||standupfortibet.org -||standwithhk.org -||starp2p.com -||startpage.com -|http://startuplivingchina.com -||static-economist.com -||stboy.net -||stc.com.sa -||steel-storm.com -||steganos.com -||sthoo.com -||stitcher.com -||storagenewsletter.com -||storm.mg -||stoptibetcrisis.net -||storj.io -||stoweboyd.com -||straitstimes.com -||straplessdildo.com -||streamable.com -||streamate.com -||streamingthe.net -||strongvpn.com -||studentsforafreetibet.org -||stumbleupon.com -||substack.com -||subhd.tv -||sugarsync.com -||sugumiru18.com -||suissl.com -||sumrando.com -||sundayguardianlive.com -||sunmedia.ca -||sunporno.com -||supervpn.net -|http://superzooi.com -|http://suprememastertv.com -||surfeasy.com -|http://surfeasy.com.au -||surfshark.com -||surrenderat20.net -||swissinfo.ch -||swissvpn.net -||switchvpn.net -||sydneytoday.com -||sylfoundation.org -||syncback.com -!--------------------TT------------------------- -||tor.eff.org -||tails.net -||bbc.pdn.tritondigital.com -||terobox.com -||temu.com -||trustwallet.com -||tap.io -||taptap.io -||talkatone.com -||tanks.gg -||thehansindia.com -||rtm.tnt-ea.com -||tellapart.com -||threads.com -||tg-me.com -||twkan.com -||tunein.streamguys1.com -||tou.tv -||tinyurl.com -||textnow.com -||token.im -||tokenlon.im -||tardigrade.io -||torrentgalaxy.to -||tomp3.cc -||tukaani.org -||thetatoken.org -||typeset.io -||thechasernews.co.uk -||hole.thu.monster -||thuhole.com -||t-g.com -||t66y.com -||esg.t91y.com -|http://taa-usa.org -||taaze.tw -|http://www.tablesgenerator.com/ -||taedp.org.tw -||tagwalk.com -||taipeisociety.org -||taipeitimes.com -||taisounds.com -||taiwanhot.net -||taiwanncf.org.tw -||taiwannews.com.tw -|http://www.taiwanonline.cc/ -||taiwantt.org.tw -||talkboxapp.com -||talkcc.com -||talkonly.net -||tanc.org -|http://taoism.net -||tapatalk.com -||taup.net -||taweet.com -||tbcollege.org -||tbsec.org -||tbsn.org -|http://tbssqh.org -||techviz.net -||teck.in -||tehrantimes.com -||tenor.com -||tenzinpalmo.com -||tew.org -||tfc-taiwan.org.tw -||tfiflve.com -||theatlantic.com -||theatrum-belli.com -||cn.theaustralian.com.au -||thebcomplex.com -||theblaze.com -||thebobs.com -||thechinacollection.org -||theconversation.com -|http://thedalailamamovie.com -||thediplomat.com -||thedw.us -||theepochtimes.com -||theguardian.com -||thegay.com -|http://thegioitinhoc.vn/ -||thehindu.com -||thehun.net -||theinitium.com -||thenewslens.com -||thepiratebay.org -||theporndude.com -||theportalwiki.com -||theprint.in -||threadreaderapp.com -||thesaturdaypaper.com.au -||thestandnews.com -||thetibetpost.com -||thetvdb.com -||thewgo.org -||thewirechina.com -|http://theync.com -||thinkingtaiwan.com -||thirdmill.org -||thisav.com -||thomasbernhard.org -||throughnightsfire.com -||thywords.com -||tiananmenduizhi.com -||tiananmenuniv.com -||tiananmenuniv.net -||tiandixing.org -||tianti.io -||tiantibooks.org -||tibet.com -||tibet.net -||tibet.nu -||tibet.org -||tibet.org.tw -||tibet.to -||tibet-envoy.eu -||tibet-initiative.de -|http://tibet3rdpole.org -||tibetaction.net -||tibetanbuddhistinstitute.org -||tibetancommunity.org -||tibetanentrepreneurs.org -||tibetanhealth.org -||tibetanliberation.org -|http://tibetancommunityuk.net -|http://tibetansports.org -|http://tibetanwomen.org -||tibetanyouthcongress.org -||tibetcorps.org -||tibetexpress.net -||tibetfocus.com -||tibetfund.org -||tibetgermany.de -||tibethouse.jp -||tibethouse.org -||tibethouse.us -||tibetmuseum.org -||tibetnetwork.org -||tibetoffice.ch -||tibetoffice.org -||tibetonline.com -||tibetoffice.com.au -||tibetonline.tv -||tibetoralhistory.org -||tibetpolicy.eu -||tibetrelieffund.co.uk -||tibetsociety.com -||tibetsun.com -||tibetsupportgroup.org -||tibetswiss.ch -||tibettelegraph.com -||tibettimes.net -||tibettruth.com -||tibetwrites.org -||tigervpn.com -|http://timdir.com -|http://time.com -||timesnownews.com -||timtales.com -||blog.tiney.com -||tingtalk.me -||tiny.cc -||tinychat.com -||tinypaste.com -||tipas.net -||tkcs-collins.com -||tmagazine.com -|http://tmi.me -|http://tmpp.org -||tnaflix.com -|http://tnp.org -||to-porno.com -||togetter.com -||tokyo-porn-tube.com -||tokyocn.com -|http://toppornsites.com -||toptoon.net -||torguard.net -||top.tv -||topsy.com -||toptip.ca -||torlock.com -||torproject.org -||torrentkitty.tv -||torrentprivacy.com -|http://torrentproject.se -||torrenty.org -||tortoisesvn.net -||torvpn.com -||totalvpn.com -||tpi.org.tw -||tradingview.com -||transparency.org -||treemall.com.tw -||trendsmap.com -||trouw.nl -||trt.net.tr -||truebuddha-md.org -||truthsocial.com -||tt1069.com -||tttan.com -||ttv.com.tw -||tube8.com -||tube911.com -|http://tubeislam.com -||tubewolf.com -||tuidang.org -|http://tumutanzi.com -||tumview.com -|http://tunein.com -||tunnelbear.com -||tunnelblick.net -||tunnelr.com -||tunsafe.com -||turbobit.net -||turbohide.com -||turkistantimes.com -|http://tushycash.com -||tuvpn.com -|http://tuzaijidi.com -|http://*.tuzaijidi.com -|http://tw01.org -||use.typekit.net -!---Tumblr--- -||tumblr.com -||lecloud.net -||slutmoonbeam.com -|http://blog.soylent.com -|http://tv.com -||mytvsuper.com -||tvbanywhere.com -||akamai.tvb.com -||inews-api.tvb.com -||news.tvbs.com.tw -||tvboxnow.com -||tvunetworks.com -|https://tw-blog.com -||twapperkeeper.com -||twaud.io -||twblogger.com -||tweepml.org -||tweetbackup.com -||tweetboard.com -|http://tweetcs.com -|http://deck.ly -||tweetedtimes.com -||tweetphoto.com -||tweetree.com -||tweettunnel.com -||tweetwally.com -||twelve.today -|http://tweez.net -||twftp.org -||twgreatdaily.com -||twibble.de -||twibs.com -|http://twicountry.org -|http://twiends.com -|http://twifan.com -||twiffo.com -||twipple.jp -||twip.me -||twishort.com -||twister.net.co -||twiggit.org -||twitiq.com -||twitlonger.com -|http://tl.gd/ -||twitoaster.com -||twitonmsn.com -||twitstat.com -||tweepguide.com -|http://twt.tl -||ads-twitter.com -||twttr.com -||twitter4j.org -||twittercounter.com -||twittergadget.com -||twitterkr.com -||twittermail.com -||twitterrific.com -||twittertim.es -||twitturk.com -||twitturly.com -|http://twtkr.com -||twreporter.org -||tycool.com -!--typepad -||typepad.com -||blog.expofutures.com -||contests.twilio.com -||typora.io -!--------------------UU------------------------- -||uniswap.org -||up.audio -||udomain.hk -||upbit.com -||demo.unlock-music.dev -||u9un.com -|http://ubddns.org -||uberproxy.net -||uc-japan.org -|http://china.ucanews.com/ -|http://hum*.uchicago.edu/faculty/ywang/history -||udn.com -||udn.com.tw -||uforadio.com.tw -!--ghs -||uhdwallpapers.org -||uhrp.org -||uighur.nl -||ultrasurf.us -||ultravpn.com -||ultravpn.fr -||unblock.cn.com -||unblock-us.com -|http://unblockdmm.com -||unblocksit.es -|http://uncyclopedia.hk -|http://uncyclopedia.tw -||underwoodammo.com -||unholyknight.com -||cldr.unicode.org -||unirule.cloud -||unknownspace.org -||unstable.icu -||unwire.hk -||uocn.org -||upghsbc.com -||upmedia.mg -|http://upornia.com -||uproxy.org -||uptodown.com -||urbandictionary.com -||urbansurvival.com -||urlborg.com -||urlparser.com -||usacn.com -||usaip.eu -||uscnpm.org -||uscardforum.com -||usma.edu -||ustibetcommittee.org -||ustream.tv -||utopianpal.com -||uujiasu.com -||uvwxyz.xyz -||uwants.com -||uyghur-j.org -||uyghuraa.org -||uyghuramerican.org -||uyghurbiz.org -||uyghurcongress.org -||uyghurpen.org -||uyghurstudies.org -||uyghurtribunal.com -|http://uymaarip.com/ -!--------------------VV------------------------- -||vimeocdn.com -||vpsxb.net -||vilanet.me -||vewas.net -||v2.help -||vocaroo.com -||vern.cc -||v2fly.org -||v2ray.com -||v2raycn.com -||valeursactuelles.com -||vansky.com -||vaticannews.va -||vcf-online.org -||vcfbuilder.org -||venetianmacao.com -||vercel.app -||verybs.com -||viber.com -||victimsofcommunism.org -||vid.me -||vidble.com -||videobam.com -||videomega.tv -||vilavpn.com -||vimeo.com -||vimperator.org -||vincnd.com -||vinniev.com -||virtualrealporn.com -||viu.com -||vivaldi.com -||vivthomas.com -||vjav.com -|http://vllcs.org -||vmixcore.com -||vnet.link -||vocus.cc -||voicettank.org -||vot.org -|http://vovo2000.com -||voxer.com -||vpn.ac -||vpn.net -||vpn4all.com -|http://vpnaccount.org -||vpnaccounts.com -||vpncup.com -|http://vpncoupons.com -||vpndada.com -||vpnforgame.net -||vpngate.jp -||vpngate.net -||vpnhub.com -||vpnmaster.com -||vpnmentor.com -||vpninja.net -||vpnjack.com -||vpnpick.com -||vpnpop.com -||vpnpronet.com -||vpnproxymaster.com -||vpnreactor.com -||vpnreviewz.com -||vpnsecure.me -||vpnshazam.com -||vpnshieldapp.com -||vpntunnel.com -||vpnuk.info -||vpnunlimitedapp.com -||vpnvip.com -||vporn.com -||vrchat.com -||vrporn.com -||vtunnel.com -||vuku.cc -!--------------------WW------------------------- -||wispbyte.com -||walletconnect.org -||wallzhihu.com -||wikis.tw -||weights.com -||wikiunblocked.org -||websdr.org -||wikipedia.com -||wxw.moe -||wxw.cat -||walletconnect.com -|https://w3s.link/ipfs -||work2icu.org -||wikiless.funami.tech -||waffle1999.com -||wainao.me -||wallmama.com -||wallpapercasa.com -||wallsttv.com -||waltermartin.com -||waltermartin.org -||www.wan-press.org -||wanderinghorse.net -||wangafu.net -||wangjinbo.org -||wango.org -||want-daily.com -||warroom.org -||waselpro.com -||watchinese.com -||watchout.tw -||wattpad.com -||watchmygf.net -||wav.tv -||waybig.com -||wd.bible -||wealth.com.tw -||wearn.com -|http://hkcoc.weather.com.hk -||hudatoriq.web.id -||web2project.net -|http://www.websnapr.com -|http://webwarper.net -||wechatlawsuit.com -||wefightcensorship.org -||weijingsheng.org -||weiming.info -|http://weisuo.ws -||welt.de -|http://wemigrate.org -||wengewang.org -||wenxuecity.com -||wenyunchao.com -||westca.com -||westernwolves.com -||westpoint.edu -||wezone.net -||wforum.com -||whatblocked.com -||wheelockslatin.com -||whoer.net -||whyx.org -||wikileaks.ch -||wikileaks.com -||wikileaks.de -||wikileaks.eu -||wikileaks.lu -||wikileaks.org -||wikileaks.pl -||wilsoncenter.org -||collateralmurder.com -||collateralmurder.org -||wikimapia.org -||wikiwand.com -||casino.williamhill.com -||sports.williamhill.com -||vegas.williamhill.com -||willw.net -||windscribe.com -||wingy.site -||wionews.com -||wiredbytes.com -||wiredpen.com -||wireguard.com -||wisevid.com -||whispersystems.org -||witopia.net -||wjbk.org -||wmflabs.org -||wn.com -||wnacg.com -||wnacg.org -||wo.tc -||woeser.com -||wokar.org -||wolfax.com -||wombo.ai -||woolyss.com -||woopie.jp -||woopie.tv -||workatruna.com -||workerempowerment.org -||worldvpn.net -||videopress.com -|http://*.wordpress.com -||chenshan20042005.wordpress.com -||chinaview.wordpress.com -||cnbbnews.wordpress.com -||freedominfonetweb.wordpress.com -||hka8964.wordpress.com -||hkanews.wordpress.com -||hqsbnet.wordpress.com -||hqsbonline.wordpress.com -||investigating.wordpress.com -||jobnewera.wordpress.com -||matthewdgreen.wordpress.com -||minghuiyw.wordpress.com -||wo3ttt.wordpress.com -||sujiatun.wordpress.com -||xijie.wordpress.com -||ifreechina.wordpress.com -||wp.com -||wowporn.com -||wowgirls.com -|http://woyaolian.org -||wpoforum.com -||writesonic.com -||wsj.com -||wsj.net -||wufafangwen.com -||wufi.org.tw -||wujieliulan.com -||wuw.red -||wwitv.com -!--------------------XX------------------------- -||xdaforums.com -||xcancel.com -||www.xicons.org -||x.ai -||xt.com -||xt.pub -||x.co -||x-berry.com -||x-art.com -||x-wall.org -||x3guide.com -||xbabe.com -||xbookcn.com -||xcafe.in -||xcity.jp -||xerotica.com -||xfxssr.me -||xgmyd.com -||xhamster.com -|http://xianjian.tw -||xiaolan.me -||xiaoma.org -||xiaohexie.com -||xiaxiaoqiang.net -|http://xing.com -||xinjiangpolicefiles.org -||xinmiao.com.hk -||xjp.cc -||xjtravelguide.com -||xml-training-guide.com -||xnxx.com -||xpud.org -||xtube.com -||xuchao.org -||xuchao.net -||xvideos.com -||xvideos-cdn.com -||xvideos.es -||xvbelink.com -||xvinlink.com -||xsden.info -||xxx.com -|http://xxx.xxx -||xxxx.com.au -|http://xxxymovies.com -!--------------------YY------------------------- -||yfsp.tv -||youmind.com -||yangzhi.org -||storage.yandex.net -||y2mate.com -||yadi.sk -||yakbutterblues.com -||yam.com -||yam.org.tw -||yande.re -||disk.yandex.com -||disk.yandex.ru -||yasni.co.uk -||yasukuni.or.jp -||news.ycombinator.com -||yeahteentube.com -||yecl.net -||yeelou.com -||yeeyi.com -||yegle.net -||yes123.com.tw -||yesasia.com -||yesasia.com.hk -|http://yes-news.com -||yespornplease.com -|http://yeyeclub.com -||yhcw.net -||yibaochina.com -||yidio.com -||s.yimg.com -||yipub.com -||yizhihongxing.com -||yobt.tv -||yogichen.org -||you.com -||youxu.info -||youjizz.com -||youmaker.com -||youpai.org -||yourepeat.com -||yousendit.com -||youporn.com -||youporngay.com -||yourlisten.com -||yourlust.com -||youversion.com -||yulghun.com -||yunchao.net -||yunomi.tokyo -||yvesgeleyn.com -||yyii.org -||yyjlymb.xyz -||yysub.net -||yzzk.com -!--------------------ZZ------------------------- -||zaochenbao.com -||z-library.ec -||z-library.sk -||z-lib.fm -||z-lib.gd -||z-lib.gl -||z-lib.fo -||zodgame.xyz -||zhongzidi.com -||zooqle.com -||z-lib.io -||z-lib.org -||zalmos.com -||zdnet.com.tw -||zello.com -||zenmate.com -||zenmate.com.ru -||zerohedge.com -||zeronet.io -||zhangtianliang.com -||zhanlve.org -||zhengjian.org -||zhengwunet.org -|http://zhenxiang.biz -|http://zhongguo.ca -||zhongguotese.net -||zhuatieba.com -||zhuichaguoji.org -||zi.media -||zillionk.com -||zinio.com -||zmedia.com.tw -||zmw.cn -||zonaeuropa.com -||zonghexinwen.com -||zoogvpn.com -||zootool.com -||zophar.net -||zorrovpn.com -||zpn.im -||zspeeder.me -||zuo.la -||zuobiao.me -||zuola.com -||zvereff.com -||zyxel.com -!##############General List End################# -!###########Supplemental List Start############# -!#############Supplemental List End############# -!################Whitelist Start################ -@@||firebase-settings.crashlytics.com -@@||cn.investing.com -@@||www.typepad.com -@@||static.typepad.com -@@||ci.android.com -@@||crl.pki.goog -@@||g2.gstatic.com -@@||g1.gstatic.com -@@||g0.gstatic.com -@@||checkin.gstatic.com -@@||i.pki.goog -@@||c.pki.goog -@@||o.pki.goog -@@||adservice.google.com -@@||dl.google.com -@@||tools.google.com -@@||clientservices.googleapis.com -@@||imasdk.googleapis.com -@@||fonts.googleapis.com -@@||update.googleapis.com -@@||safebrowsing.googleapis.com -@@||connectivitycheck.gstatic.com -@@||csi.gstatic.com -@@||fonts.gstatic.com -@@||ssl.gstatic.com -@@||www.gstatic.com -@@||ocsp.pki.goog -@@||www.ampproject.org -@@||cdn.ampproject.org -@@||cdn-china.ampproject.org -@@||redirector.gvt1.com -!################Whitelist End################## -!---------------------EOF----------------------- diff --git a/packages/gui/extra/proxy/domestic-domain-allowlist.txt b/packages/gui/extra/proxy/domestic-domain-allowlist.txt deleted file mode 100644 index 45c5302864..0000000000 --- a/packages/gui/extra/proxy/domestic-domain-allowlist.txt +++ /dev/null @@ -1,1218 +0,0 @@ -[SwitchyOmega Conditions] -; Require: SwitchyOmega >= 2.3.2 -; Update Date: 2024/12/01 -; Author: Pluwen -; Usage: https://github.com/FelisCatus/SwitchyOmega/wiki/RuleListUsage - -; IP 地址段 -10.*.*.* -100.64.*.* -127.*.*.* -172.16.*.* -192.168.*.* - -; cn 域名都不走代理 -*.cn - -; 其他域名 -*.00cdn.com -*.0daydown.com -*.0o0.ooo -*.10010.com -*.10086cloud.com -*.114la.com -*.114yygh.com -*.115.com -*.123pan.com -*.126.com -*.126.net -*.127.net -*.139.com -*.163.com -*.163yun.com -*.1688.com -*.17173.com -*.178.com -*.17ce.com -*.17font.com -*.17k.com -*.199it.com -*.1ptba.com -*.1qimg.com -*.1qmsg.com -*.1tpic.com -*.1year.cc -*.1years.cc -*.21cn.com -*.21tb.com -*.2345.com -*.2cto.com -*.3322.cc -*.3366.com -*.33ss.tech -*.360.com -*.360buy.com -*.360buyimg.com -*.360doc.com -*.360in.com -*.360safe.com -*.36kr.com -*.39.net -*.3dmgame.com -*.4399.com -*.51.la -*.51.net -*.5173.com -*.5173cdn.com -*.51cto.com -*.51job.com -*.51ym.me -*.52audio.com -*.52yuwan.com -*.56.com -*.58.com -*.58pic.com -*.591mogu.com -*.616pic.com -*.699pic.com -*.71.am -*.7k7k.com -*.8686c.com -*.86ps.com -*.91.com -*.91118.com -*.91mjw.com -*.99.com -*.a9vg.com -*.aaplimg.com -*.abchina.com -*.accuweather.com -*.acfun.tv -*.acg.rip -*.acg.tv -*.acggate.net -*.acgvideo.com -*.acs.org -*.aday01.com -*.adf.ly -*.agora.io -*.aicdn.com -*.aicheren.com -*.aicoinstorge.com -*.aipai.com -*.air-matters.com -*.air-matters.io -*.airbnb.com -*.aiwebcom.com -*.aixifan.com -*.aizhan.com -*.akadns.net -*.akamaihd.net -*.akamaized.net -*.akarin.me -*.akarin.top -*.aldwx.com -*.aliapp.org -*.alibaba-inc.com -*.alibaba.com -*.alibabacloud.com -*.alibabausercontent.com -*.alicdn.com -*.alicloudccp.com -*.alikunlun.com -*.alikunlun.net -*.alimama.com -*.alipan.com -*.alipay.com -*.alipayobjects.com -*.alisports.com -*.aliued.com -*.aliyun.com -*.aliyuncs.com -*.aliyundrive.com -*.aliyunpds.com -*.allhistory.com -*.alltuu.com -*.amap.com -*.amd.com -*.ancda.com -*.animebytes.tv -*.anjuke.com -*.anquan.org -*.ant.design -*.antfin-inc.com -*.antfin.com -*.antpcdn.com -*.anw.red -*.anyway.fm -*.anzhi.com -*.appclub.in -*.appgame.com -*.appinn.com -*.appinn.net -*.apple-cloudkit.com -*.apple.co -*.apple.com -*.appletuan.com -*.appstore.com -*.aps.org -*.archlinux.org -*.archlinuxcn.org -*.areyoucereal.com -*.arubanetworks.com -*.atomicstryker.net -*.augix.me -*.autonavi.com -*.awesome-hd.me -*.axhub.im -*.axshare.com -*.axure.org -*.axureux.com -*.b612.net -*.babybus.com -*.baidu.com -*.baidubcr.com -*.baiducontent.com -*.baidupan.com -*.baidupcs.com -*.baidustatic.com -*.baiduwp.com -*.baiduyundns.com -*.baiduyundns.net -*.baimiaoapp.com -*.bankcomm.com -*.baomihua.com -*.baomitu.com -*.baozoumanhua.com -*.battle.net -*.bbtree.com -*.bcebos.com -*.bcedns.com -*.bcedns.net -*.bcy.net -*.bdatu.com -*.bdimg.com -*.bdstatic.com -*.bdydns.com -*.bdydns.net -*.behe.com -*.beianbeian.com -*.beisen.com -*.beitaichufang.com -*.bejson.com -*.bendibao.com -*.bible.com -*.biliapi.com -*.biliapi.net -*.bilibili.com -*.bilibili.tv -*.bilicomic.com -*.biligame.com -*.biligame.net -*.bilivideo.com -*.bitbucket.org -*.blackyau.cc -*.blizzard.com -*.blogchina.com -*.blogjava.net -*.bluedoc.io -*.booking.com -*.bootcss.com -*.bqtalk.com -*.broadcasthe.net -*.bstatic.com -*.bt0.com -*.btdx8.com -*.btsync.org -*.btyingshi.com -*.bumimi.com -*.bybbs.org -*.bytecdntp.com -*.ca001.com -*.cachemoment.com -*.cailianpress.com -*.caiyunapp.com -*.camera360.com -*.ccb.com -*.ccgslb.com -*.ccgslb.net -*.cckefu.net -*.cckefu3.com -*.cctv.com -*.cctvpic.com -*.cdn-apple.com -*.cdn.hockeyapp.net -*.cdnbee.com -*.cdndm.com -*.cdndm5.com -*.cdnjs.com -*.cdnst.net -*.cdntip.com -*.cdog.me -*.ceair.com -*.cebbank.com -*.cee.network -*.chainnews.com -*.chaoxing.com -*.chdbits.co -*.china.com -*.chinanetcenter.com -*.chinaso.com -*.chinassl.net -*.chinaunix.net -*.chinauos.com -*.chinaz.com -*.chiphell.com -*.chongdiantou.com -*.chuangzaoshi.com -*.chuimg.com -*.chunyu.mobi -*.chunyuanfood.com -*.ciligod.com -*.citicbank.com -*.classix-unlimited.co.uk -*.cli.im -*.clouddn.com -*.cloudinary.com -*.cloudxns.net -*.cmbchina.com -*.cmbimg.com -*.cn-ki.net -*.cn.engadget.com -*.cnbeta.com -*.cnbetacdn.com -*.cnblogs.com -*.cnki.net -*.cnsageo.com -*.cnzz.com -*.cnzz.net -*.code4app.com -*.coding.io -*.coding.me -*.coding.net -*.coloros.com -*.comicat.org -*.coolapk.com -*.coolpad.com -*.cootekservice.com -*.cowtransfer.com -*.cqvip.com -*.csair.com -*.csdn.net -*.css-js.com -*.css.net -*.css.network -*.ct10000.com -*.ctrip.com -*.cupfox.app -*.d7vg.com -*.damengxiang.me -*.dandanplay.com -*.dangdang.com -*.daocloud.io -*.datagrand.com -*.dbankcdn.com -*.ddos.cc -*.ddrk.me -*.deepin.com -*.deepin.org -*.deepinos.org -*.deliwenku.com -*.dfcfw.com -*.dgtle.com -*.dianping.com -*.didialift.com -*.didiglobal.com -*.dilidili.com -*.dilidili.wang -*.dingtalk.com -*.dingtalkapps.com -*.diybeta.com -*.diyvm.com -*.dji.com -*.dji.net -*.dm5.com -*.dmzj.com -*.dns.com -*.dnspao.com -*.doc88.com -*.docer.com -*.docin.com -*.docschina.org -*.dopa.com -*.douban.* -*.douban.com -*.douban.fm -*.doubanio.com -*.doubleclick.net -*.douyin.com -*.douyu.com -*.douyutv.com -*.doyoo.net -*.doyoudo.com -*.dpfile.com -*.draw.io -*.drivergenius.com -*.dsxys.com -*.duanwenxue.com -*.duguletian.com -*.duokan.com -*.duoshao.app -*.duoshao.net -*.duoshuo.com -*.duowan.com -*.dwstatic.com -*.dxycdn.com -*.dygod.net -*.dytt8.net -*.easou.com -*.eastmoney.com -*.ecitic.com -*.edifier.com -*.eebbk.com -*.eeboard.com -*.eggjs.org -*.ele.me -*.elemecdn.com -*.elong.com -*.elsevier.com -*.empornium.me -*.enkj.com -*.epicgames.com -*.epubw.com -*.erp321.com -*.etao.com -*.eudic.net -*.ewei.com -*.fang.com -*.fatetypo.xyz -*.feiliao.com -*.feishucdn.com -*.feng.com -*.fengkongcloud.com -*.fengniao.com -*.ffalcon.com -*.figma.cool -*.figmachina.com -*.figmacn.com -*.fiio.com -*.fir.im -*.firefox.com -*.fj12379.com -*.fjdzyz.com -*.fjgdwl.com -*.fjhxbank.com -*.fliggy.com -*.flomoapp.com -*.flow.ci -*.flyertea.com -*.fnnas.com -*.fontke.com -*.foundertype.com -*.foxirj.com -*.frdic.com -*.freebuf.com -*.freeziti.com -*.fromgeek.com -*.futu5.com -*.futunn.com -*.fydeos.com -*.fzzfgjj.com -*.g-cores.com -*.galstars.net -*.gamersky.com -*.gandi.net -*.ganji.com -*.gank.io -*.gazellegames.net -*.gcores.com -*.geetest.com -*.geilicdn.com -*.getfedora.org -*.getpricetag.com -*.getui.com -*.gfan.com -*.gifshow.com -*.gitee.com -*.gitee.io -*.godic.net -*.golaravel.com -*.goofish.com -*.googletagmanager.com -*.gratisography.com -*.growingio.com -*.gtimg.com -*.guazi.com -*.guokr.com -*.gwdang.com -*.h-ui.net -*.h2os.com -*.hacpai.com -*.haitum.com -*.halyul.cc -*.hao123.com -*.haosou.com -*.happyeo.com -*.harmonyos.com -*.hasee.com -*.hdb.com -*.hdbits.org -*.hdchina.org -*.hddolby.com -*.hdfans.org -*.hdhome.org -*.hdsky.me -*.hdslb.com -*.hdslb.net -*.hejie.me -*.heweather.com -*.hexun.com -*.hexunimg.com -*.hicloud.com -*.hihonor.com -*.hikvision.com -*.hitv.com -*.hiwifi.com -*.homestyler.com -*.hommk.com -*.hongxiu.com -*.honor.com -*.hostbuf.com -*.hostker.com -*.hotmail.com -*.houxu.app -*.huaban.com -*.huabanimg.com -*.huanmusic.com -*.huanqiu.com -*.huawei.com -*.huaweicloud.com -*.huiji.wiki -*.huijistatic.com -*.huijiwiki.com -*.hujiang.com -*.huomao.com -*.hupu.com -*.huxiu.com -*.huxiucdn.com -*.huya.com -*.hxcdn.net -*.hxjyb.com -*.hy233.tv -*.i-meto.com -*.iapps.im -*.iaweg.com -*.iaxure.com -*.ibm.com -*.ibruce.info -*.ibucm.com -*.icetorrent.org -*.iciba.com -*.icloud-content.com -*.icloud.com -*.idqqimg.com -*.ieee.org -*.iesdouyin.com -*.ifanr.com -*.ifanr.in -*.ifdream.net -*.ifeng.com -*.ifengimg.com -*.ifigma.design -*.igamecj.com -*.iguoguo.net -*.iguxuan.com -*.iina.io -*.ijinshan.com -*.iknoworld.net -*.iknowwhatyoudownload.com -*.im9.com -*.imiku.me -*.imooc.com -*.imququ.com -*.indienova.com -*.infinitynewtab.com -*.infoq.com -*.installbi.me -*.intercomcdn.com -*.ip-api.com -*.ip-cdn.com -*.ip.la -*.ip.sb -*.ip138.com -*.ipip.net -*.iplaysoft.com -*.ipv6-test.com -*.iqihang.com -*.iqing.in -*.iqiyi.com -*.iqiyipic.com -*.irs01.com -*.isharepc.com -*.it168.com -*.iteye.com -*.ithome.com -*.itjuzi.com -*.jandan.net -*.java.com -*.javaeye.com -*.jb51.net -*.jcodecraeer.com -*.jd.com -*.jd.hk -*.jdkindle.com -*.jdpay.com -*.jetbrains.com -*.jfdaily.com -*.jfrft.com -*.jhdec.com -*.jianguoyun.com -*.jianshu.* -*.jianshu.com -*.jianshu.io -*.jianshuapi.com -*.jiathis.com -*.jidian.im -*.jiemian.com -*.jikexueyuan.com -*.jikipedia.com -*.jinshuju.net -*.jisuanke.com -*.jomodns.com -*.joyneop.xyz -*.joyyang.com -*.jpopsuki.eu -*.jqhtml.com -*.js.design -*.jsdelivr.com -*.juejin.im -*.juji.tv -*.kaiyanapp.com -*.kan300.com -*.kankan.com -*.kanzhun.com -*.kaspersky-labs.com -*.kcdnvip.com -*.ke.com -*.keepcdn.com -*.keepfrds.com -*.kekenet.com -*.kele5240.com -*.kf5.com -*.kingsoft.com -*.kkmh.com -*.kmf.com -*.knewone.com -*.knownsec.com -*.ksosoft.com -*.ksyun.com -*.ksyungslb.com -*.ku6.com -*.kuaidi100.com -*.kuaishou.com -*.kuaizhan.com -*.kugou.com -*.kujiale.com -*.kunlunaq.com -*.kunlunar.com -*.kunlunca.com -*.kunluncan.com -*.kunlunea.com -*.kunlungem.com -*.kunlungr.com -*.kunlunhuf.com -*.kunlunle.com -*.kunlunli.com -*.kunlunno.com -*.kunlunpi.com -*.kunlunra.com -*.kunlunsa.com -*.kunlunsc.com -*.kunlunsl.com -*.kunlunso.com -*.kunlunta.com -*.kunlunvi.com -*.kunlunwe.com -*.kyoceraconnect.com -*.lackar.com -*.lagou.com -*.lanhuapp.com -*.lanjinger.com -*.lany.me -*.lanyus.com -*.lanzous.com -*.lanzoux.com -*.laravel-china.org -*.layui.com -*.lbesec.com -*.le.com -*.lecloud.com -*.leetcode-cn.com -*.lemicp.com -*.lenovo.net -*.lenovomobile.com -*.letv.com -*.letvimg.com -*.lianjia.com -*.liantu.com -*.liaoxuefeng.com -*.licdn.com -*.liepin.com -*.lifan.ooo -*.likefont.com -*.lilithgames.com -*.linuxidc.com -*.livechina.com -*.liyin.date -*.lizhi.fm -*.lizhi.io -*.lkkdesign.com -*.lncld.net -*.locoy.com -*.locvps.com -*.lofter.com -*.loj.ac -*.loli.net -*.lolinet.com -*.longzhu.com -*.lucifr.com -*.ludashi.com -*.luogu.org -*.luojilab.com -*.luoo.net -*.lvmama.com -*.lwl12.com -*.ly.com -*.lyjsws.com -*.m-team.cc -*.macpaw.com -*.macrr.com -*.macw.com -*.macwk.com -*.madsrevolution.net -*.magi.com -*.mail4geek.com -*.manmanbuy.com -*.maoyan.com -*.maoyun.tv -*.masadora.net -*.mastergo.com -*.maxfox.me -*.mcbbs.net -*.mdnice.com -*.mdui.org -*.me.com -*.mediav.com -*.megvii.com -*.meican.com -*.meiin.com -*.meijutw.com -*.meipai.com -*.meiqia.com -*.meitu.com -*.meituan.com -*.meituan.net -*.meitudata.com -*.meitustat.com -*.meixincdn.com -*.meizu.com -*.mengniang.org -*.mgtv.com -*.mi-img.com -*.mi.com -*.miaopai.com -*.microbit.org -*.midifan.com -*.mikanani.me -*.minapp.com -*.mindstore.io -*.mingdao.com -*.miui.com -*.miwifi.com -*.mls-cdn.com -*.mmstat.com -*.mmtrix.com -*.mob.com -*.mobike.com -*.moe.im -*.moe123.net -*.moegirl.org -*.moetransit.com -*.mojidoc.com -*.moke.com -*.mokeedev.com -*.momentcdn.com -*.momoyu.cc -*.moonvy.com -*.morethan.tv -*.mozilla.org -*.mp4ba.cc -*.msftconnecttest.com -*.mtyun.com -*.mu6.me -*.mubu.com -*.muchong.com -*.mukewang.com -*.mumayi.com -*.muscache.com -*.mxhichina.com -*.myanonamouse.net -*.myapp.com -*.mydrivers.com -*.myip.la -*.myqcloud.com -*.myzaker.com -*.mzstatic.com -*.naixue.com -*.nanyangpt.com -*.nature.com -*.ncore.cc -*.nekonazo.com -*.netease.com -*.netease.im -*.netseer.com -*.netspeedtestmaster.com -*.newsmth.net -*.ngacn.cc -*.nim-lang-cn.org -*.nipic.com -*.nlark.com -*.nobook.com -*.nocode.com -*.now.sh -*.nowcoder.com -*.nowcoder.net -*.ntp.org -*.nuomi.com -*.nvidia.com -*.nyato.com -*.obsapp.com -*.oekaki.so -*.office.net -*.office365.com -*.okii.com -*.omico.me -*.onekbit.com -*.oneplus.com -*.oneplusbbs.com -*.onlinedown.net -*.open-open.com -*.open.cd -*.oppo.com -*.ops.moe -*.oracle.com -*.oray.com -*.oray.net -*.orayimg.com -*.oschina.io -*.oschina.net -*.ourbits.club -*.ourdvs.com -*.ourdvsss.com -*.oursketch.com -*.outlook.com -*.pag.art -*.paipai.com -*.panda.tv -*.panduoduo.net -*.paperpass.com -*.passthepopcorn.me -*.pc6.com -*.pcbeta.com -*.pdcicons.ml -*.pdim.gs -*.pengyou.com -*.pexels.com -*.pgyer.com -*.phonegap100.com -*.phpcomposer.com -*.piaoquantv.com -*.pingan.com -*.pingwest.com -*.planetmeican.com -*.plex.tv -*.polyfill.io -*.pomotodo.com -*.ppgame.com -*.pplink.link -*.ppsimg.com -*.pptv.com -*.privatehd.to -*.processon.com -*.psbc.com -*.psnine.com -*.pstatp.com -*.pterclub.com -*.pythonclub.org -*.qbox.me -*.qcc.com -*.qcloud.com -*.qcloudcdn.com -*.qcwgg.com -*.qdaily.com -*.qdan.me -*.qdmm.com -*.qeeyou.com -*.qhimg.com -*.qhmsg.com -*.qhres.com -*.qianxin.com -*.qichacha.com -*.qidian.com -*.qihucdn.com -*.qimiaomh.com -*.qingmang.me -*.qingting.fm -*.qiniu.com -*.qiniucdn.com -*.qiniudn.com -*.qiniudns.com -*.qiniup.com -*.qiniuts.com -*.qiuziti.com -*.qiyi.com -*.qiyipic.com -*.qiyukf.com -*.qnssl.com -*.qq.com -*.qqmail.com -*.qqurl.com -*.qqzzz.net -*.quanmingjiexi.com -*.qudong.com -*.qunar.com -*.qweather.com -*.qyer.com -*.qyerstatic.com -*.rapoo.com -*.rarbg.to -*.raychase.net -*.realme.com -*.redacted.ch -*.renren.com -*.renrenche.com -*.renrendoc.com -*.researchgate.net -*.rework.tools -*.rkecloud.com -*.rkidc.net -*.rlcdn.com -*.rom.mk -*.ronghub.com -*.rr.tv -*.rrfmn.com -*.rrimg.com -*.rsc.org -*.ruanmei.com -*.ruanyifeng.com -*.ruby-china.org -*.ruguoapp.com -*.runoob.com -*.s-reader.com -*.sandai.net -*.sankuai.com -*.sarm.net -*.sb.sb -*.sc115.com -*.sciencedirect.com -*.sciencemag.org -*.scofd.com -*.scomper.me -*.sdbeta.com -*.sdo.com -*.seafile.com -*.seele.tech -*.segmentfault.com -*.sekorm.com -*.servicewechat.com -*.sf-express.com -*.shejijia.com -*.shidianguji.com -*.shikezhi.com -*.shimo.im -*.shiyanlou.com -*.shssp.org -*.shxibank.com -*.shyywz.com -*.sigmaaldrich.com -*.sigujiexi.com -*.sina.com -*.sinaapp.com -*.since1989.org -*.siweiearth.com -*.sketchchina.com -*.slack.com -*.sm.ms -*.smart2pay.com -*.smartgslb.com -*.smartisan.com -*.smzdm.com -*.snapdrop.net -*.snssdk.com -*.snwx.com -*.so.com -*.sobot.com -*.sogo.com -*.sogou.com -*.sogoucdn.com -*.sohu-inc.com -*.sohu.com -*.sohucs.com -*.soku.com -*.solidot.org -*.songshuhui.net -*.soso.com -*.soufun.com -*.sourcegcdn.com -*.speedtest.net -*.springer.com -*.springerlink.com -*.springleaf-biomax.com -*.springsunday.net -*.sspai.com -*.stargame.com -*.staticdn.net -*.staticfile.org -*.steamcn.com -*.steamcontent.com -*.subhd.tv -*.sui.com -*.suning.com -*.surface.wiki -*.sznews.com -*.t.tt -*.taichi.graphics -*.taihe.com -*.takungpao.com -*.talkingdata.com -*.tangdou.com -*.tangdouddn.com -*.tanx.com -*.taobao.com -*.taobao.org -*.taobaocdn.com -*.tapdb.net -*.tapimg.com -*.taptap.com -*.tbcache.com -*.tcdn.qq.com -*.tcl.com -*.teambition.com -*.teamviewer.com -*.tencent-cloud.com -*.tencent-cloud.net -*.tencent.com -*.tencentmind.com -*.tengshiauto.com -*.tenpay.com -*.tenxcloud.com -*.test-ipv6.com -*.tgbus.com -*.thefuture.top -*.thomsonreuters.com -*.tianyancha.com -*.tietuku.com -*.tigerlust.com -*.tingyun.com -*.tinyservices.net -*.tinywow.com -*.tjupt.org -*.tmall.com -*.tmall.hk -*.todesk.com -*.tool.lu -*.tophub.today -*.totheglory.im -*.toushibao.com -*.toutiao.com -*.toutiao.io -*.toutiaoimg.com -*.tower.im -*.trontv.com -*.truevue.org -*.ttt.tt -*.tuchong.com -*.tudou.com -*.tuicool.com -*.tuna.moe -*.tuniu.com -*.typeisbeautiful.com -*.u9u9.com -*.ubuntukylin.com -*.ucweb.com -*.ucxinwen.com -*.udache.com -*.udacity.com -*.uedna.com -*.uigreat.com -*.uisdc.com -*.uisheji.com -*.umeng.com -*.umengcloud.com -*.umetrip.com -*.undraw.co -*.uning.com -*.upai.com -*.upaiyun.com -*.upyun.com -*.ustclug.org -*.uuu.moe -*.uxengine.net -*.v-56.com -*.vamaker.com -*.vaptcha.net -*.veryzhun.com -*.vhall.com -*.vhallyun.com -*.videojj.com -*.viosey.com -*.vip.com -*.visualhunt.com -*.visualstudio.com -*.vite.org -*.vjudge.net -*.vmall.com -*.vmware.com -*.voidcn.com -*.vostic.net -*.vpgame.com -*.vpgcdn.com -*.vpsmm.com -*.vss.im -*.vzan.com -*.wacai.com -*.waerfa.com -*.walklake.com -*.wallhaven.cc -*.wandoujia.com -*.wangsu.com -*.wanmei.com -*.weather.com -*.web.guoweishu.net -*.webfont.com -*.webofknowledge.com -*.wechat.com -*.weibo.com -*.weibocdn.com -*.weico.cc -*.weidian.com -*.weidown.com -*.weidunewtab.com -*.weiosx.com -*.weixinbridge.com -*.weiyun.com -*.westlakemuseum.com -*.whatismyip.com -*.wht.im -*.wiley.com -*.windows.com -*.windowsupdate.com -*.wisenjoy.com -*.wjx.top -*.wodemo.com -*.wolai.com -*.woozooo.com -*.woshipm.com -*.woyoo.com -*.wps.com -*.wscdns.com -*.wulihub.com -*.wxb.com -*.xbongbong.com -*.xclient.info -*.xdccpro.com -*.xf9168.com -*.xiachufang.com -*.xiami.com -*.xiami.net -*.xiaoe-tech.com -*.xiaoe-tools.com -*.xiaohongshu.com -*.xiaoka.tv -*.xiaomark.com -*.xiaomi.com -*.xiaomi.net -*.xiaomicp.com -*.xiaomiyoupin.com -*.xiaotu.io -*.xiazaiziti.com -*.ximalaya.com -*.xinhuanet.com -*.xiniu.com -*.xinquji.com -*.xitu.io -*.xiya.vip -*.xldns.net -*.xmac.app -*.xmcdn.com -*.xnpic.com -*.xpcha.com -*.xuanfengge.com -*.xueqiu.com -*.xuetangx.com -*.xujc.com -*.xunlei.com -*.xunyou.com -*.xx1t.com -*.xxsy.net -*.xycdn.com -*.xywy.com -*.yamibo.com -*.yangkeduo.com -*.yangwangauto.com -*.yaohuo.me -*.yd-jxt.com -*.ydstatic.com -*.yecdn.com -*.yesky.com -*.yeyfree.com -*.yfscdn.net -*.yfsvdn.net -*.yhd.com -*.yi2.net -*.yiche.com -*.yihaodianimg.com -*.yinxiang.com -*.yinyuetai.com -*.yizhibo.com -*.ykimg.com -*.ylmf.net -*.youdao.com -*.youku.com -*.youlebe.com -*.youzan.com -*.yunjiasu-cdn.net -*.yunpian.com -*.yunshipei.com -*.yuque.com -*.yuwantech.com -*.yxt.com -*.yy.com -*.z-bank.com -*.zaih.com -*.zanata.org -*.zanmeishi.com -*.zdic.net -*.zealer.com -*.zh.moegirl.org -*.zhan.com -*.zhangxinxu.com -*.zhangyao.name -*.zhangzishi.cc -*.zhanqi.tv -*.zhaopin.com -*.zhihu.com -*.zhihuishu.com -*.zhimap.com -*.zhimg.com -*.zhipin.com -*.zhiye.com -*.zhiziyun.com -*.zhongguose.com -*.zhuihd.com -*.zhujike.com -*.zijieapi.com -*.zimuzu.tv -*.zku.net -*.znyj365.com -*.zto.com diff --git a/packages/gui/extra/scripts/github.script b/packages/gui/extra/scripts/github.script deleted file mode 100644 index 3f5a79534f..0000000000 --- a/packages/gui/extra/scripts/github.script +++ /dev/null @@ -1,578 +0,0 @@ -// ==UserScript== -// @name Github Enhancement - High Speed Download -// @name:zh-CN Github 增强 - 高速下载 -// @name:zh-TW Github 增強 - 高速下載 -// @name:ru Улучшение GitHub – быстрое скачивание -// @version 2.6.37 -// @author X.I.U -// @description High-speed download of Git Clone/SSH, Release, Raw, Code(ZIP) and other files (Based on public welfare), project list file quick download (☁) -// @description:zh-CN 高速下载 Git Clone/SSH、Release、Raw、Code(ZIP) 等文件 (公益加速)、项目列表单文件快捷下载 (☁) -// @description:zh-TW 高速下載 Git Clone/SSH、Release、Raw、Code(ZIP) 等文件 (公益加速)、項目列表單文件快捷下載 (☁) -// @description:ru Высокоскоростная загрузка Git Clone/SSH, выпусков, изначальных файлов, кода (ZIP) и других файлов (на основе общественного благосостояния), быстрая загрузка файлов из списка проектов (☁) -// @match *://github.com/* -// @match *://hub.whtrys.space/* -// @match *://dgithub.xyz/* -// @match *://kkgithub.com/* -// @match *://github.site/* -// @match *://github.store/* -// @match *://bgithub.xyz/* -// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAACEUExURUxpcRgWFhsYGBgWFhcWFh8WFhoYGBgWFiUlJRcVFRkWFhgVFRgWFhgVFRsWFhgWFigeHhkWFv////////////r6+h4eHv///xcVFfLx8SMhIUNCQpSTk/r6+jY0NCknJ97e3ru7u+fn51BOTsPCwqGgoISDg6empmpoaK2srNDQ0FhXV3eXcCcAAAAXdFJOUwCBIZXMGP70BuRH2Ze/LpIMUunHkpQR34sfygAAAVpJREFUOMt1U+magjAMDAVb5BDU3W25b9T1/d9vaYpQKDs/rF9nSNJkArDA9ezQZ8wPbc8FE6eAiQUsOO1o19JolFibKCdHGHC0IJezOMD5snx/yE+KOYYr42fPSufSZyazqDoseTPw4lGJNOu6LBXVUPBG3lqYAOv/5ZwnNUfUifzBt8gkgfgINmjxOpgqUA147QWNaocLniqq3QsSVbQHNp45N/BAwoYQz9oUJEiE4GMGfoBSMj5gjeWRIMMqleD/CAzUHFqTLyjOA5zjNnwa4UCEZ2YK3khEcBXHjVBtEFeIZ6+NxYbPqWp1DLKV42t6Ujn2ydyiPi9nX0TTNAkVVZ/gozsl6FbrktkwaVvL2TRK0C8Ca7Hck7f5OBT6FFbLATkL2ugV0tm0RLM9fedDvhWstl8Wp9AFDjFX7yOY/lJrv8AkYuz7fuP8dv9izCYH+x3/LBnj9fYPBTpJDNzX+7cAAAAASUVORK5CYII= -// @grant GM_registerMenuCommand -// @grant GM_unregisterMenuCommand -// @grant GM_openInTab -// @grant GM_getValue -// @grant GM_setValue -// @grant GM_notification -// @grant GM_setClipboard -// @grant window.onurlchange -// @sandbox JavaScript -// @license GPL-3.0 License -// @run-at document-end -// @namespace https://greasyfork.org/scripts/412245 -// @supportURL https://github.com/XIU2/UserScript -// @homepageURL https://github.com/XIU2/UserScript -// ==/UserScript== - -(function() { - 'use strict'; - var menu_rawFast = GM_getValue('xiu2_menu_raw_fast'), menu_rawFast_ID, menu_rawDownLink_ID, menu_gitClone_ID, menu_customUrl_ID, menu_feedBack_ID; - const download_url_us = [ - ['https://gh.h233.eu.org/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@X.I.U/XIU2] 提供'], - //['https://gh.api.99988866.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.com/hunshcn/gh-proxy] 提供'], // 官方演示站用的人太多了 - //['https://ghproxy.1888866.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [WJQSERVER-STUDIO/ghproxy] 提供'],//挂了 - ['https://rapidgit.jjda.de5.net/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [热心网友] 提供'], - ['https://gh.ddlc.top/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@mtr-static-official] 提供'], // Error 1027 - //['https://gh2.yanqishui.work/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@HongjieCN] 提供'], // 错误 - //['https://dl.ghpig.top/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [feizhuqwq.com] 提供'], // ERR_SSL_VERSION_OR_CIPHER_MISMATCH - //['https://gh.flyinbug.top/gh/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [Mintimate] 提供'], // 错误 - //['https://gh.con.sh/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.con.sh] 提供'], // Suspent due to abuse report. - //['https://ghps.cc/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghps.cc] 提供'], // 提示 blocked - ['https://gh-proxy.org/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh-proxy.com] 提供'], - //['https://hk.gh-proxy.org/https://github.com', '其他', '[中国香港] - 该公益加速源由 [gh-proxy.com] 提供'], - ['https://cdn.gh-proxy.org/https://github.com', '其他', '[Fastly CDN] - 该公益加速源由 [gh-proxy.com] 提供'], - ['https://edgeone.gh-proxy.org/https://github.com', '其他', '[edgeone] - 该公益加速源由 [gh-proxy.com] 提供'], - ['https://cors.isteed.cc/github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@Lufs\'s] 提供'], - //['https://hub.gitmirror.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [GitMirror] 提供'], // 域名无解析 - //['https://down.sciproxy.com/github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [sciproxy.com] 提供'], // 522 - ['https://ghproxy.it/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@yionchilau] 提供'], - //['https://github.site', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@yionchilau] 提供'], // 挂了 - //['https://github.store', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@yionchilau] 提供'], // 挂了 - //['https://gh.jiasu.in/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@0-RTT] 提供'], // 404 - ['https://github.boki.moe/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [blog.boki.moe] 提供'], - //['https://github.moeyy.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [moeyy.cn] 提供'], // 墙了 - ['https://gh-proxy.net/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh-proxy.net] 提供'], - //['https://github.yongyong.online/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.yongyong.online] 提供'], // 空白 - //['https://ghdd.862510.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghdd.862510.xyz] 提供'], // turnstile token missing - ['https://gh.jasonzeng.dev/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.jasonzeng.dev] 提供'], - ['https://gh.monlor.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.monlor.com] 提供'], - ['https://fastgit.cc/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [fastgit.cc] 提供'], - ['https://github.tbedu.top/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.tbedu.top] 提供'], - //['https://github.geekery.cn/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.geekery.cn] 提供'], // 下载认证信息 用户名:123123 密 码:123123 - ['https://firewall.lxstd.org/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [firewall.lxstd.org] 提供'], - ['https://github.ednovas.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.ednovas.xyz] 提供'], - ['https://ghfile.geekertao.top/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghfile.geekertao.top] 提供'], - ['https://ghp.keleyaa.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghp.keleyaa.com] 提供'], // Error 1027 - //['https://github.wuzhij.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.wuzhij.com] 提供'], // 404 - ['https://gh.chjina.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.chjina.com] 提供'], - ['https://ghpxy.hwinzniej.top/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghpxy.hwinzniej.top] 提供'], - ['https://cdn.crashmc.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [cdn.crashmc.com] 提供'], - ['https://git.yylx.win/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [git.yylx.win] 提供'], - ['https://gitproxy.mrhjx.cn/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gitproxy.mrhjx.cn] 提供'], - ['https://ghproxy.cxkpro.top/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghproxy.cxkpro.top] 提供'], - ['https://gh.xxooo.cf/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.xxooo.cf] 提供'], - ['https://github.limoruirui.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.limoruirui.com] 提供'], - ['https://gh.idayer.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.idayer.com] 提供'], // Error 1027 - //['https://gh.zwnes.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.zwnes.xyz] 提供'], // 超时 - ['https://gh.llkk.cc/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh.llkk.cc] 提供'], - ['https://down.npee.cn/?https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [npee社区] 提供'], - ['https://raw.ihtw.moe/github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [raw.ihtw.moe] 提供'], - ['https://xget.xi-xu.me/gh', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.com/xixu-me/Xget] 提供'], - //['https://dgithub.xyz', '美国', '[美国 西雅图] - 该公益加速源由 [dgithub.xyz] 提供'], // 证书挂了 - //['https://gh-proxy.ygxz.in/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@一个小站 www.ygxz.in] 提供'], // 被蔷 - ['https://gh.nxnow.top/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [gh.nxnow.top] 提供'], - ['https://gh.zwy.one/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [gh.zwy.one] 提供'], - ['https://ghproxy.monkeyray.net/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [ghproxy.monkeyray.net] 提供'], - ['https://gh.xx9527.cn/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [gh.xx9527.cn] 提供'], - //], download_url = [ // 为了缓解非美国公益节点压力(考虑到很多人无视前面随机的美国节点),干脆也将其加入随机 - //['https://ghproxy.net/https://github.com', '英国', '[英国伦敦] - 该公益加速源由 [ghproxy.net] 提供 提示:希望大家尽量多使用美国节点(每次随机 负载均衡), 避免流量都集中到亚洲公益节点,减少成本压力,公益才能更持久~'], // 挂了 - ['https://ghfast.top/https://github.com', '其他', '[日本、韩国、新加坡、美国、德国等](CDN 不固定) - 该公益加速源由 [ghproxy.link] 提供 提示:希望大家尽量多使用美国节点(每次随机 负载均衡), 避免流量都集中到亚洲公益节点,减少成本压力,公益才能更持久~'], - ['https://wget.la/https://github.com', '其他', '[中国香港、中国台湾、日本、美国等](CDN 不固定) - 该公益加速源由 [ucdn.me] 提供 提示:希望大家尽量多使用美国节点(每次随机 负载均衡), 避免流量都集中到亚洲公益节点,减少成本压力,公益才能更持久~'], - //['https://hub.glowp.xyz/https://github.com', '其他', '[中国香港] - 该公益加速源由 [hub.glowp.xyz] 提供 提示:希望大家尽量多使用美国节点(每次随机 负载均衡), 避免流量都集中到亚洲公益节点,减少成本压力,公益才能更持久~'], - //['https://kkgithub.com', '其他', '[中国香港、日本、韩国、新加坡等] - 该公益加速源由 [help.kkgithub.com] 提供 提示:希望大家尽量多使用美国节点(每次随机 负载均衡), 避免流量都集中到亚洲公益节点,减少成本压力,公益才能更持久~'], // 404 - ], clone_url = [ - ['https://gitclone.com', '国内', '[中国 国内] - 该公益加速源由 [GitClone] 提供 - 缓存:有 - 首次比较慢,缓存后较快'], - //['https://kkgithub.com', '香港', '[中国香港、日本、新加坡等] - 该公益加速源由 [help.kkgithub.com] 提供'], // 超时 - //['https://gitdl.cn/https://github.com', '香港', '[中国香港] - 该公益加速源由 [gitdl] 提供'], // 输出文件错误 - //['https://gitproxy.click/https://github.com', '香港', '[中国 香港] - 该公益加速源由 [gitproxy.click] 提供'], - //['https://cdn.moran233.xyz/https://github.com', '香港', '[中国 香港] - 该公益加速源由 [cdn.moran233.xyz] 提供'], - //['https://hub.glowp.xyz/https://github.com', '香港', '[中国香港] - 该公益加速源由 [hub.glowp.xyz] 提供'], - ['https://wget.la/https://github.com', '香港', '[中国香港、中国台湾、日本、美国等](CDN 不固定) - 该公益加速源由 [ucdn.me] 提供'], - ['https://hk.gh-proxy.org/https://github.com', '香港', '[中国香港] - 该公益加速源由 [gh-proxy.com] 提供'], - ['https://ghfast.top/https://github.com', '韩国', '[日本、韩国、新加坡、美国、德国等](CDN 不固定) - 该公益加速源由 [ghproxy] 提供'], - //['https://gh.catmak.name/https://raw.githubusercontent.com', '韩国', '[韩国 首尔] - 该公益加速源由 [gh.catmak.name] 提供'], - ['https://githubfast.com', '韩国', '[韩国] - 该公益加速源由 [Github Fast] 提供'], - //['https://ghproxy.net/https://github.com', '日本', '[日本 大阪] - 该公益加速源由 [ghproxy.net] 提供'], // 挂了 - //['https://proxy.yaoyaoling.net/https://github.com', '日本', '[日本 东京] - 该公益加速源由 [proxy.yaoyaoling.net] 提供'], - //['https://g.blfrp.cn/https://github.com', '日本', '[日本 东京] - 该公益加速源由 [g.blfrp.cn] 提供'], - //['https://raw.bgithub.xyz', '荷兰', '[荷兰] - 该公益加速源由 [bgithub.xyz] 提供 - 缓存:有'], - //['https://ghproxy.1888866.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [WJQSERVER-STUDIO/ghproxy] 提供'], - //['https://github.moeyy.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [moeyy.cn] 提供'], // 墙了 - //['https://gh-proxy.net/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh-proxy.net] 提供'], - //['https://rapidgit.jjda.de5.net/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [热心网友] 提供'], - //['https://github.yongyong.online/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.yongyong.online] 提供'], - //['https://ghdd.862510.xyz/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghdd.862510.xyz] 提供'], - //['https://hub.gitmirror.com/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [GitMirror] 提供'], // 域名无解析 - //['https://gh-proxy.org/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh-proxy.com] 提供'], - //['https://cdn.gh-proxy.org/https://github.com', '其他', '[Fastly CDN] - 该公益加速源由 [gh-proxy.com] 提供'], - //['https://edgeone.gh-proxy.org/https://github.com', '其他', '[edgeone] - 该公益加速源由 [gh-proxy.com] 提供'], - //['https://ghproxy.it/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@yionchilau] 提供'], - //['https://github.site', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@yionchilau] 提供'], // 挂了 - //['https://github.store', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@yionchilau] 提供'], // 挂了 - //['https://gh.jiasu.in/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@0-RTT] 提供'], // 404 - //['https://github.boki.moe/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [blog.boki.moe] 提供'], - //['https://raw.ihtw.moe/github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [raw.ihtw.moe] 提供'], - //['https://xget.xi-xu.me/gh', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.com/xixu-me/Xget] 提供'], - //['https://dgithub.xyz', '美国', '[美国 西雅图] - 该公益加速源由 [dgithub.xyz] 提供'], - //['https://gh-proxy.ygxz.in/https://github.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@一个小站 www.ygxz.in] 提供'], // 被蔷 - //['https://hub.scholar.rr.nu', '美国', '[美国 纽约] - 该公益加速源由 [FastGit 群组成员] 提供'], // 证书到期 - ], clone_ssh_url = [ - ['ssh://git@ssh.github.com:443/', 'Github 原生', '[日本、新加坡等] - Github 官方提供的 443 端口的 SSH(依然是 SSH 协议),适用于限制访问 22 端口的网络环境'], - //['git@ssh.fastgit.org:', '香港', '[中国 香港] - 该公益加速源由 [FastGit] 提供'], // 挂了 - //['git@git.zhlh6.cn:', '美国', '[美国 洛杉矶]'] // 挂了 - ], raw_url = [ - ['https://raw.githubusercontent.com', 'Github 原生', '[日本 东京] - 缓存:无(或很短)'], - //['https://raw.kkgithub.com', '香港 1', '[中国香港、日本、新加坡等] - 该公益加速源由 [help.kkgithub.com] 提供 - 缓存:有'], // 超时 - //['https://jsd.proxy.aks.moe/gh', '香港 2', '[中国 香港] - 该公益加速源由 [cdn.akass.cn] 提供'], // 证书错误 - ['https://wget.la/https://raw.githubusercontent.com', '香港 1', '[中国香港、中国台湾、日本、美国等](CDN 不固定) - 该公益加速源由 [ucdn.me] 提供 - 缓存:无(或很短)'], - ['https://hk.gh-proxy.org/https://raw.githubusercontent.com', '香港 2', '[中国香港] - 该公益加速源由 [gh-proxy.com] 提供 - 缓存:有(官方注明 2 小时)'], - ['https://hub.glowp.xyz/https://raw.githubusercontent.com', '香港 3', '[中国香港] - 该公益加速源由 [hub.glowp.xyz] 提供 - 缓存:有'], - //['https://gitproxy.click/https://raw.githubusercontent.com', '香港', '[中国 香港] - 该公益加速源由 [gitproxy.click] 提供'], // 输出错误 - //['https://cdn.moran233.xyz/https://raw.githubusercontent.com', '香港', '[中国 香港] - 该公益加速源由 [cdn.moran233.xyz] 提供'], // 404 - //['https://gitdl.cn/https://raw.githubusercontent.com', '香港 3', '[中国香港] - 该公益加速源由 [gitdl] 提供 - 缓存:有'], // 输出文件错误 - ['https://ghfast.top/https://raw.githubusercontent.com', '韩国', '[日本、韩国、新加坡、美国、德国等](CDN 不固定) - 该公益加速源由 [ghproxy.link] 提供 - 缓存:无(或很短)'], - ['https://gh.catmak.name/https://raw.githubusercontent.com', '韩国', '[韩国 首尔] - 该公益加速源由 [gh.catmak.name] 提供'], - //['https://ghproxy.net/https://raw.githubusercontent.com', '日本 1', '[日本 大阪] - 该公益加速源由 [ghproxy.net] 提供 - 缓存:有(约 10 分钟)'], // 挂了 - ['https://fastly.jsdelivr.net/gh', '日本 1', '[日本 东京] - 该公益加速源由 [JSDelivr CDN] 提供 - 缓存:有 - 不支持大小超过 50 MB 的文件 - 不支持版本号格式的分支名(如 v1.2.3)'], - ['https://cdn.gh-proxy.org/https://raw.githubusercontent.com', '日本 2', '[Fastly CDN] - 该公益加速源由 [gh-proxy.com] 提供 - 缓存:有'], - //['https://jsdelivr.pai233.top/gh', '日本 3', '[日本 东京](Vercel Anycast) - 该公益加速源由 [blog.pai233.top] 提供 - 缓存:有'], // This deployment is temporarily paused - //['https://proxy.yaoyaoling.net/https://raw.githubusercontent.com', '日本', '[日本 东京] - 该公益加速源由 [proxy.yaoyaoling.net] 提供'], // 空白 - ['https://g.blfrp.cn/https://raw.githubusercontent.com', '日本 3', '[日本 东京] - 该公益加速源由 [g.blfrp.cn] 提供'], - //['https://raw.bgithub.xyz', '荷兰', '[荷兰] - 该公益加速源由 [bgithub.xyz] 提供 - 缓存:有'], - //['https://gcore.jsdelivr.net/gh', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [JSDelivr CDN] 提供 - 缓存:有 - 不支持大小超过 50 MB 的文件 - 不支持版本号格式的分支名(如 v1.2.3)'], // 变成 美国 Cloudflare CDN 了 - //['https://jsdelivr.b-cdn.net/gh', '其他', '[中国香港、中国台湾、日本、新加坡等](CDN 不固定) - 该公益加速源由 [@rttwyjz] 提供 - 缓存:有'], // 疑似 SNI 阻断 - //['https://xget.xi-xu.me/gh', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.com/xixu-me/Xget] 提供'], - //['https://ghproxy.1888866.xyz/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [WJQSERVER-STUDIO/ghproxy] 提供'], - //['https://github.moeyy.xyz/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [moeyy.cn] 提供 - 缓存:有(约 10 分钟)'], // 墙了 - //['https://gh-proxy.net/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh-proxy.net] 提供'], - //['https://rapidgit.jjda.de5.net/https://github.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [热心网友] 提供'], - //['https://github.yongyong.online/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [github.yongyong.online] 提供'], - //['https://ghdd.862510.xyz/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [ghdd.862510.xyz] 提供'], - //['https://raw.cachefly.998111.xyz', '其他 4', '[新加坡、日本、印度等](Anycast CDN 不固定) - 该公益加速源由 [@XxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX0] 提供 - 缓存:有(约 12 小时)'], // 证书到期 - //['https://ghproxy.it/https://raw.githubusercontent.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@yionchilau] 提供 - 缓存:无(或很短)'], - //['https://raw.github.site', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@yionchilau] 提供 - 缓存:无(或很短)'], // 挂了 - //['https://raw.github.store', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@yionchilau] 提供 - 缓存:无(或很短)'], // 挂了 - //['https://gh.jiasu.in/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [@0-RTT] 提供'], // 404 - //['https://github.boki.moe/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [blog.boki.moe] 提供 - 缓存:无(或很短)'], - //['https://gh-proxy.org/https://raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [gh-proxy.com] 提供 - 缓存:有'], - //['https://cdn.gh-proxy.org/https://raw.githubusercontent.com', '其他', '[Fastly CDN] - 该公益加速源由 [gh-proxy.com] 提供'], - //['https://edgeone.gh-proxy.org/https://raw.githubusercontent.com', '其他', '[edgeone] - 该公益加速源由 [gh-proxy.com] 提供'], - //['https://cdn.githubraw.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [githubraw.com] 提供 - 缓存:有(几乎永久)'], - //['https://raw.dgithub.xyz', '美国', '[美国 西雅图] - 该公益加速源由 [dgithub.xyz] 提供 - 缓存:无(或很短)'], - //['https://gh-proxy.ygxz.in//https://raw.githubusercontent.com', '美国', '[美国 洛杉矶] - 该公益加速源由 [@一个小站 www.ygxz.in] 提供 - 缓存:无(或很短)'], // 被蔷 - //['https://raw.nuaa.cf', '美国', '[美国 洛杉矶] - 该公益加速源由 [FastGit 群组成员] 提供'], // 证书到期 - //['https://raw.yzuu.cf', '美国', '[美国 纽约] - 该公益加速源由 [FastGit 群组成员] 提供'], // 证书到期 - //['https://hub.gitmirror.com/raw.githubusercontent.com', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [GitMirror] 提供 - 缓存:无(或很短)'], // 域名无解析 - //['https://jsdelivr-cdn.pencilnavrp.990989.xyz/gh', '美国', '[美国 Cloudflare CDN] - 该公益加速源由 [PencilNavigator] 提供 - 缓存:有'], - //['https://git.yumenaka.net/https://raw.githubusercontent.com', '美国', '[美国 圣何塞]'], // 连接超时 - ], svg = [ - '' - ], style = ['padding:0 6px; margin-right: -1px; border-radius: 2px; background-color: var(--XIU2-background-color); border-color: var(--borderColor-default); font-size: 11px; color: var(--XIU2-font-color);']; - - if (menu_rawFast == null){menu_rawFast = 1; GM_setValue('xiu2_menu_raw_fast', 1)}; - if (GM_getValue('menu_rawDownLink') == null){GM_setValue('menu_rawDownLink', true)}; - if (GM_getValue('menu_gitClone') == null){GM_setValue('menu_gitClone', true)}; - // 如果自定义加速源不存在或为空则忽略,如果自定义加速源地址存在,则添加到 raw_url、clone_url 数组中 - if (GM_getValue('custom_raw_url')) {raw_url.splice(1, 0, [GM_getValue('custom_raw_url'), '自定义', '[由你自定义的 Raw 加速源] 提示:点击浏览器右上角 Tampermonkey 扩展图标 - [ #️⃣ 自定义加速源 ] 即可轮流设置 Raw、Git Clone、Release/Code(ZIP) 的自定义加速源地址(留空代表不设置)。'])}; - if (GM_getValue('custom_clone_url')) {clone_url.unshift([GM_getValue('custom_clone_url'), '自定义', '[由你自定义的 Git Clone 加速源] 提示:点击浏览器右上角 Tampermonkey 扩展图标 - [ #️⃣ 自定义加速源 ] 即可轮流设置 Raw、Git Clone、Release/Code(ZIP) 的自定义加速源地址(留空代表不设置)。'])}; - registerMenuCommand(); - // 注册脚本菜单 - function registerMenuCommand() { - // 如果反馈菜单ID不是 null,则删除所有脚本菜单 - if (menu_feedBack_ID) {GM_unregisterMenuCommand(menu_rawFast_ID); GM_unregisterMenuCommand(menu_rawDownLink_ID); GM_unregisterMenuCommand(menu_gitClone_ID); GM_unregisterMenuCommand(menu_customUrl_ID); GM_unregisterMenuCommand(menu_feedBack_ID); menu_rawFast = GM_getValue('xiu2_menu_raw_fast');} - // 避免在减少 raw 数组后,用户储存的数据大于数组而报错 - if (menu_rawFast > raw_url.length - 1) menu_rawFast = 0 - if (GM_getValue('menu_rawDownLink')) menu_rawFast_ID = GM_registerMenuCommand(`${['0️⃣','1️⃣','2️⃣','3️⃣','4️⃣','5️⃣','6️⃣','7️⃣','8️⃣','9️⃣','🔟'][menu_rawFast]} [ ${raw_url[menu_rawFast][1]} ] 加速源 (☁) - 点击切换`, menu_toggle_raw_fast); - menu_rawDownLink_ID = GM_registerMenuCommand(`${GM_getValue('menu_rawDownLink')?'✅':'❌'} 项目列表单文件快捷下载 (☁)`, function(){if (GM_getValue('menu_rawDownLink') == true) {GM_setValue('menu_rawDownLink', false); GM_notification({text: `已关闭 [项目列表单文件快捷下载 (☁)] 功能\n(点击刷新网页后生效)`, timeout: 3500, onclick: function(){location.reload();}});} else {GM_setValue('menu_rawDownLink', true); GM_notification({text: `已开启 [项目列表单文件快捷下载 (☁)] 功能\n(点击刷新网页后生效)`, timeout: 3500, onclick: function(){location.reload();}});}registerMenuCommand();}); - menu_gitClone_ID = GM_registerMenuCommand(`${GM_getValue('menu_gitClone')?'✅':'❌'} 添加 git clone 命令`, function(){if (GM_getValue('menu_gitClone') == true) {GM_setValue('menu_gitClone', false); GM_notification({text: `已关闭 [添加 git clone 命令] 功能\n(点击刷新网页后生效)`, timeout: 3500, onclick: function(){location.reload();}});} else {GM_setValue('menu_gitClone', true); GM_notification({text: `已开启 [添加 git clone 命令] 功能\n(点击刷新网页后生效)`, timeout: 3500, onclick: function(){location.reload();}});}registerMenuCommand();}); - menu_customUrl_ID = GM_registerMenuCommand(`#️⃣ 自定义加速源`, function () { - // 定义三种自定义加速源的键名和描述 - const customKeys = [ - { key: 'custom_raw_url', desc: 'Raw 加速源', placeholder: 'https://example.com/https://raw.githubusercontent.com' }, - { key: 'custom_clone_url', desc: 'Git Clone 加速源', placeholder: 'https://example.com/https://github.com' }, - { key: 'custom_download_url', desc: 'Release/Code(ZIP) 加速源', placeholder: 'https://example.com/https://github.com' } - ]; - // 递归弹出输入框 - function promptCustomUrl(index = 0) { - if (index >= customKeys.length) {GM_notification({ text: '自定义加速源设置已完成!\n(点击刷新网页后生效)', timeout: 3500, onclick: function () { location.reload(); } });return;} - const { key, desc, placeholder } = customKeys[index]; - let current = GM_getValue(key, ''); - let input = prompt(`请输入自定义${desc}地址:\n- 当前:\n${current || '(未设置)'}\n\n- 示例:\n${placeholder}\n\n- 留空为不设置\n- 点击 [确定] 保存 并 继续设置下一个\n- 点击 [取消] 不保存 并 终止后续设置`,current); - if (input !== null) {GM_setValue(key, input.trim());promptCustomUrl(index + 1);}// 如果用户点击 取消 按钮,则不再继续弹出 - } - promptCustomUrl(); - }); - menu_feedBack_ID = GM_registerMenuCommand('💬 反馈 & 建议 [Github]', function () {window.GM_openInTab('https://github.com/XIU2/UserScript', {active: true,insert: true,setParent: true});window.GM_openInTab('https://greasyfork.org/zh-CN/scripts/412245/feedback', {active: true,insert: true,setParent: true});}); - } - - // 切换加速源 - function menu_toggle_raw_fast() { - // 如果当前加速源位置大于等于加速源总数,则改为第一个加速源,反之递增下一个加速源 - if (menu_rawFast >= raw_url.length - 1) {menu_rawFast = 0;} else {menu_rawFast += 1;} - GM_setValue('xiu2_menu_raw_fast', menu_rawFast); - delRawDownLink(); // 删除旧加速源 - addRawDownLink(); // 添加新加速源 - GM_notification({text: "已切换加速源为:" + raw_url[menu_rawFast][1], timeout: 3000}); // 提示消息 - registerMenuCommand(); // 重新注册脚本菜单 - }; - - colorMode(); // 适配白天/夜间主题模式 - setTimeout(addRawFile, 1000); // Raw 加速 - setTimeout(addRawDownLink, 2000); // Raw 单文件快捷下载(☁),延迟 2 秒执行,避免被 pjax 刷掉 - - // Tampermonkey v4.11 版本添加的 onurlchange 事件 grant,可以监控 pjax 等网页的 URL 变化 - if (window.onurlchange === undefined) addUrlChangeEvent(); - window.addEventListener('urlchange', function() { - colorMode(); // 适配白天/夜间主题模式 - if (location.pathname.indexOf('/releases')) addRelease(); // Release 加速 - setTimeout(addRawFile, 1000); // Raw 加速 - setTimeout(addRawDownLink, 2000); // Raw 单文件快捷下载(☁),延迟 2 秒执行,避免被 pjax 刷掉 - setTimeout(addRawDownLink_, 1000); // 在浏览器返回/前进时重新添加 Raw 下载链接(☁)鼠标事件 - }); - - - // Github Git Clone/SSH、Release、Download ZIP 改版为动态加载文件列表,因此需要监控网页元素变化 - const callback = (mutationsList, observer) => { - if (location.pathname.indexOf('/releases') > -1) { // Release - for (const mutation of mutationsList) { - for (const target of mutation.addedNodes) { - if (target.nodeType !== 1) return - if (target.tagName === 'DIV' && target.dataset.viewComponent === 'true' && target.classList[0] === 'Box') addRelease(); - } - } - } else if (document.querySelector('#repository-container-header:not([hidden])')) { // 项目首页 - for (const mutation of mutationsList) { - for (const target of mutation.addedNodes) { - if (target.nodeType !== 1) return - if (target.tagName === 'DIV' && target.parentElement && target.parentElement.id === '__primerPortalRoot__') { - addGitClone(target); - addGitCloneSSH(target); - addDownloadZIP(target); - //setTimeout(()=>{addDownloadZIP(target)}, 300); - } else if (target.tagName === 'DIV' && target.className.indexOf('LocalTab-module__') != -1) { - if (target.querySelector('input[value^="https:"]')) { - addGitCloneClear('.XIU2-GCS'); addGitClone(target); - } else if (target.querySelector('input[value^="git@"]')) { - addGitCloneClear('.XIU2-GC'); addGitCloneSSH(target); - } else if (target.querySelector('input[value^="gh "]')) { - addGitCloneClear('.XIU2-GC, .XIU2-GCS'); - } - } - } - } - } - }; - const observer = new MutationObserver(callback); - observer.observe(document, { childList: true, subtree: true }); - - - // download_url 随机几个美国加速源 - function get_New_download_url() { - //return download_url_us // 全输出调试用 - let minnum = 6; // 随机输出几个美国加速源 - if (GM_getValue('custom_download_url')) {minnum = 5;} // 如果有自定义加速源,则只随机输出 5 个美国加速源 - let shuffled = download_url_us.slice(0), i = download_url_us.length, min = i - minnum, temp, index; - while (i-- > min) {index = Math.floor((i + 1) * Math.random()); temp = shuffled[index]; shuffled[index] = shuffled[i]; shuffled[i] = temp;} - // 如果有自定义加速源,则将其添加到随机数组的开头 - if (GM_getValue('custom_download_url')) {return [[GM_getValue('custom_download_url'), '自定义', '[由你自定义的 Release/Code(ZIP) 加速源地址] 提示:点击浏览器右上角 Tampermonkey 扩展图标 - [ #️⃣ 自定义加速源 ] 即可轮流设置 Raw、Git Clone、Release/Code(ZIP) 的自定义加速源地址(留空代表不设置)。']].concat(shuffled.slice(min));} - return shuffled.slice(min) // 随机洗牌 download_url_us 数组并取前几个,然后将其合并至 download_url 数组 - // 为了缓解非美国公益节点压力(考虑到很多人无视前面随机的美国节点),干脆也将其加入随机 - } - - // Release - function addRelease() { - let html = document.querySelectorAll('.Box-footer'); if (html.length == 0 || location.pathname.indexOf('/releases') == -1) return - let divDisplay = 'margin-left: -90px;', new_download_url = get_New_download_url(); - if (document.documentElement.clientWidth > 755) {divDisplay = 'margin-top: -3px;margin-left: 8px;display: inherit;';}; // 调整小屏幕时的样式 - html[0].appendChild(document.createElement('style')).textContent = '@media (min-width: 768px) {.Box-footer li.Box-row>div>span.color-fg-muted {min-width: 27px !important;}}'; - for (const current of html) { - if (current.querySelector('.XIU2-RS')) continue - current.querySelectorAll('li.Box-row a').forEach(function (_this) { - let href = _this.href.split(location.host), - url = '', _html = `
`; - - for (let i=0;i${new_download_url[i][1]}` - } - _this.parentElement.nextElementSibling.insertAdjacentHTML('beforeend', _html + '
'); - }); - } - } - - - // Download ZIP - function addDownloadZIP(target) { - const html = target.querySelector('ul[class^=prc-ActionList-ActionList-]>li:last-child');if (!html) return - let href = html.querySelector('a[href^="/"][href$=".zip"]');if (!href || !href.getAttribute('href')) return - href = href.getAttribute('href'); - //const href_script = document.querySelector('react-partial[partial-name=repos-overview]>script[data-target="react-partial.embeddedData"]');if (!href_script) return - //const href = JSON.parse(href_script.textContent).props.initialPayload.overview.codeButton.local.platformInfo.zipballUrl - /*let href_slice = href_script.textContent.slice(href_script.textContent.indexOf('"zipballUrl":"')+14), - href = href_slice.slice(0, href_slice.indexOf('"')),*/ - let url = '', _html = '', new_download_url = get_New_download_url(); - - // 克隆原 Download ZIP 元素,并定位 标签 - let html_clone = html.cloneNode(true), - html_clone_a = html_clone.querySelector('a[href$=".zip"]'), - html_clone_span = html_clone.querySelector('span[id]'); - - for (let i=0;i{e.remove()}) - } - - // Git Clone - function addGitClone(target) { - let html = target.querySelector('input[value^="https:"]:not([title])');if (!html) return - let href_split = html.value.split(location.host)[1], - html_parent = '
', - url = '', _html = '', _gitClone = ''; - if (html.nextElementSibling) html.nextElementSibling.hidden = true; // 隐藏右侧复制按钮(考虑到能直接点击复制,就不再重复实现复制按钮事件了) - if (html.parentElement.nextElementSibling.tagName === 'P'){ - html.parentElement.nextElementSibling.textContent += ' (↑点击文字自动复制)' - } - if (GM_getValue('menu_gitClone')) {_gitClone='git clone '; html.value = _gitClone + html.value; html.setAttribute('value', html.value);} - // 克隆原 Git Clone 元素 - let html_clone = html.cloneNode(true); - for (let i=0;i' - } - html.parentElement.insertAdjacentHTML('afterend', _html); - if (html.parentElement.parentElement.className.indexOf('XIU2-GCP') === -1){ - html.parentElement.parentElement.classList.add('XIU2-GCP') - html.parentElement.parentElement.addEventListener('click', (e)=>{if (e.target.tagName === 'INPUT') {GM_setClipboard(e.target.value);}}) - } - } - - - // Git Clone SSH - function addGitCloneSSH(target) { - let html = target.querySelector('input[value^="git@"]:not([title])');if (!html) return - let href_split = html.value.split(':')[1], - html_parent = '
', - url = '', _html = '', _gitClone = ''; - html.nextElementSibling.hidden = true; // 隐藏右侧复制按钮(考虑到能直接点击复制,就不再重复实现复制按钮事件了) - if (html.parentElement.nextElementSibling.tagName === 'P'){ - html.parentElement.nextElementSibling.textContent += ' (↑点击自动复制)' - } - if (GM_getValue('menu_gitClone')) {_gitClone='git clone '; html.value = _gitClone + html.value; html.setAttribute('value', html.value);} - // 克隆原 Git Clone SSH 元素 - let html_clone = html.cloneNode(true); - for (let i=0;i' - } - html.parentElement.insertAdjacentHTML('afterend', _html); - if (html.parentElement.parentElement.className.indexOf('XIU2-GCP') === -1){ - html.parentElement.parentElement.classList.add('XIU2-GCP') - html.parentElement.parentElement.addEventListener('click', (e)=>{if (e.target.tagName === 'INPUT') {GM_setClipboard(e.target.value);}}) - } - } - - - // Raw - function addRawFile() { - let html = document.querySelector('a[data-testid="raw-button"]');if (!html) return - let href = location.href.replace(`https://${location.host}`,''), - href2 = href.replace('/blob/','/'), - url = '', _html = ''; - - for (let i=1;i${raw_url[i][1].replace(/ \d/,'')}` - } - if (document.querySelector('.XIU2-RF')) document.querySelectorAll('.XIU2-RF').forEach((e)=>{e.remove()}) - html.insertAdjacentHTML('afterend', _html); - } - - - // Raw 单文件快捷下载(☁) - function addRawDownLink() { - if (!GM_getValue('menu_rawDownLink')) return - // 如果不是项目文件页面,就返回,如果网页有 Raw 下载链接(☁)就返回 - let files = document.querySelectorAll('div.Box-row svg.octicon.octicon-file, .react-directory-filename-column>svg.color-fg-muted');if(files.length === 0) return;if (location.pathname.indexOf('/tags') > -1) return - let files1 = document.querySelectorAll('a.fileDownLink');if(files1.length > 0) return; - - // 鼠标指向则显示 - var mouseOverHandler = function(evt) { - let elem = evt.currentTarget, - aElm_new = elem.querySelectorAll('.fileDownLink'), - aElm_now = elem.querySelectorAll('svg.octicon.octicon-file, svg.color-fg-muted'); - aElm_new.forEach(el=>{el.style.cssText = 'display: inline'}); - aElm_now.forEach(el=>{el.style.cssText = 'display: none'}); - }; - - // 鼠标离开则隐藏 - var mouseOutHandler = function(evt) { - let elem = evt.currentTarget, - aElm_new = elem.querySelectorAll('.fileDownLink'), - aElm_now = elem.querySelectorAll('svg.octicon.octicon-file, svg.color-fg-muted'); - aElm_new.forEach(el=>{el.style.cssText = 'display: none'}); - aElm_now.forEach(el=>{el.style.cssText = 'display: inline'}); - }; - - // 循环添加 - files.forEach(function(fileElm) { - let trElm = fileElm.parentNode.parentNode, - cntElm_a = trElm.querySelector('[role="rowheader"] > .css-truncate.css-truncate-target.d-block.width-fit > a, .react-directory-truncate>a'), - Name = cntElm_a.innerText, - href = cntElm_a.getAttribute('href'), - href2 = href.replace('/blob/','/'), url = ''; - if ((raw_url[menu_rawFast][0].indexOf('/gh') + 3 === raw_url[menu_rawFast][0].length) && raw_url[menu_rawFast][0].indexOf('cdn.staticaly.com') === -1) { - url = raw_url[menu_rawFast][0] + href.replace('/blob/','@'); - } else { - url = raw_url[menu_rawFast][0] + href2; - } - - fileElm.insertAdjacentHTML('afterend', ``); - // 绑定鼠标事件 - trElm.onmouseover = mouseOverHandler; - trElm.onmouseout = mouseOutHandler; - }); - } - - - // 移除 Raw 单文件快捷下载(☁) - function delRawDownLink() { - if (!GM_getValue('menu_rawDownLink')) return - let aElm = document.querySelectorAll('.fileDownLink');if(aElm.length === 0) return; - aElm.forEach(function(fileElm) {fileElm.remove();}) - } - - - // 在浏览器返回/前进时重新添加 Raw 单文件快捷下载(☁)鼠标事件 - function addRawDownLink_() { - if (!GM_getValue('menu_rawDownLink')) return - // 如果不是项目文件页面,就返回,如果网页没有 Raw 下载链接(☁)就返回 - let files = document.querySelectorAll('div.Box-row svg.octicon.octicon-file, .react-directory-filename-column>svg.color-fg-muted');if(files.length === 0) return; - let files1 = document.querySelectorAll('a.fileDownLink');if(files1.length === 0) return; - - // 鼠标指向则显示 - var mouseOverHandler = function(evt) { - let elem = evt.currentTarget, - aElm_new = elem.querySelectorAll('.fileDownLink'), - aElm_now = elem.querySelectorAll('svg.octicon.octicon-file, svg.color-fg-muted'); - aElm_new.forEach(el=>{el.style.cssText = 'display: inline'}); - aElm_now.forEach(el=>{el.style.cssText = 'display: none'}); - }; - - // 鼠标离开则隐藏 - var mouseOutHandler = function(evt) { - let elem = evt.currentTarget, - aElm_new = elem.querySelectorAll('.fileDownLink'), - aElm_now = elem.querySelectorAll('svg.octicon.octicon-file, svg.color-fg-muted'); - aElm_new.forEach(el=>{el.style.cssText = 'display: none'}); - aElm_now.forEach(el=>{el.style.cssText = 'display: inline'}); - }; - // 循环添加 - files.forEach(function(fileElm) { - let trElm = fileElm.parentNode.parentNode; - // 绑定鼠标事件 - trElm.onmouseover = mouseOverHandler; - trElm.onmouseout = mouseOutHandler; - }); - } - - - // 适配白天/夜间主题模式 - function colorMode() { - let style_Add; - if (document.getElementById('XIU2-Github')) {style_Add = document.getElementById('XIU2-Github')} else {style_Add = document.createElement('style'); style_Add.id = 'XIU2-Github'; style_Add.type = 'text/css';} - let backColor = '#ffffff', fontColor = '#888888'; - - if (document.lastElementChild.dataset.colorMode === 'dark') { // 如果是夜间模式 - if (document.lastElementChild.dataset.darkTheme === 'dark_dimmed') { - backColor = '#272e37'; fontColor = '#768390'; - } else { - backColor = '#161a21'; fontColor = '#97a0aa'; - } - } else if (document.lastElementChild.dataset.colorMode === 'auto') { // 如果是自动模式 - if (window.matchMedia('(prefers-color-scheme: dark)').matches || document.lastElementChild.dataset.lightTheme.indexOf('dark') > -1) { // 如果浏览器是夜间模式 或 白天模式是 dark 的情况 - if (document.lastElementChild.dataset.darkTheme === 'dark_dimmed') { - backColor = '#272e37'; fontColor = '#768390'; - } else if (document.lastElementChild.dataset.darkTheme.indexOf('light') == -1) { // 排除夜间模式是 light 的情况 - backColor = '#161a21'; fontColor = '#97a0aa'; - } - } - } - - document.lastElementChild.appendChild(style_Add).textContent = `.XIU2-RS a {--XIU2-background-color: ${backColor}; --XIU2-font-color: ${fontColor};}`; - } - - - // 自定义 urlchange 事件(用来监听 URL 变化),针对非 Tampermonkey 油猴管理器 - function addUrlChangeEvent() { - history.pushState = ( f => function pushState(){ - var ret = f.apply(this, arguments); - window.dispatchEvent(new Event('pushstate')); - window.dispatchEvent(new Event('urlchange')); - return ret; - })(history.pushState); - - history.replaceState = ( f => function replaceState(){ - var ret = f.apply(this, arguments); - window.dispatchEvent(new Event('replacestate')); - window.dispatchEvent(new Event('urlchange')); - return ret; - })(history.replaceState); - - window.addEventListener('popstate',()=>{ // 点击浏览器的前进/后退按钮时触发 urlchange 事件 - window.dispatchEvent(new Event('urlchange')) - }); - } -})(); \ No newline at end of file diff --git a/packages/gui/extra/scripts/google.js b/packages/gui/extra/scripts/google.js deleted file mode 100644 index 41b9ad72e8..0000000000 --- a/packages/gui/extra/scripts/google.js +++ /dev/null @@ -1,20 +0,0 @@ -// ==UserScript== -// @name google增强 -// @version 1.2.4 -// @author Greper -// @description 去除ping链接 -// @match https://www.google.com/*/* -// @icon https://www.google.com/favicon.ico -// @license GPL-3.0 License -// @run-at document-end -// @namespace -// ==/UserScript== - -(function () { - console.log('google script loaded') - const aList = document.getElementsByTagName('a') - for (let i = 0; i <= aList.length; i++) { - console.log(aList[i].href) - aList[i].ping = undefined - } -})() diff --git a/packages/gui/extra/scripts/tampermonkey.script b/packages/gui/extra/scripts/tampermonkey.script deleted file mode 100644 index e9933868a7..0000000000 --- a/packages/gui/extra/scripts/tampermonkey.script +++ /dev/null @@ -1,722 +0,0 @@ -/** - * 篡改猴(Tampermonkey)| 油猴(Greasemonkey)浏览器脚本扩展 - * - * @version 0.1.8 - * @since 2024-09-27 14:24 - * @author 王良 / wangliang181230 - * @authorHomePage https://wangliang1024.cn - * @remark 当前脚本为仿照的版本,并非篡改猴插件的源码,仅供学习参考。 - * @description 篡改猴 (Tampermonkey) 是拥有 超过 1000 万用户 的最流行的浏览器扩展之一。 它适用于 Chrome、Microsoft Edge、Safari、Opera Next 和 Firefox。 - * 有些人也会把篡改猴(Tampermonkey)称作油猴(Greasemonkey),尽管后者只是一款仅适用于 Firefox 浏览器的浏览器扩展程序。 - * 它允许用户自定义并增强您最喜爱的网页的功能。用户脚本是小型 JavaScript 程序,可用于向网页添加新功能或修改现有功能。使用 篡改猴,您可以轻松在任何网站上创建、管理和运行这些用户脚本。 - * 例如,使用 篡改猴,您可以向网页添加一个新按钮,可以快速在社交媒体上分享链接,或自动填写带有个人信息的表格。在数字化时代,这特别有用,因为网页常常被用作访问广泛的服务和应用程序的用户界面。 - * 此外,篡改猴 使您轻松找到并安装其他用户创建的用户脚本。这意味着您可以快速轻松地访问为您喜爱的网页定制的广泛库,而无需花费数小时编写自己的代码。 - * 无论您是希望为您的站点添加新功能的 Web 开发人员,还是只是希望 改善在线体验的普通用户,篡改猴 都是您的工具箱中的一个很好的工具。 - * @homepageUrl https://www.tampermonkey.net - */ -'use strict'; -(function () { - const version = "0.1.8"; - const PRE = "DS-Tampermonkey:"; // 前缀 - const MENU_ID_PRE = PRE + "menu-"; - const icon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwEAQAAACtm+1PAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAJiS0dEAACqjSMyAAAACXBIWXMAAABIAAAASABGyWs+AAAL+UlEQVRo3tWaeXRUdZbHP7+qkI1ABIQJryoJEAkYaAJECBEEGhAIgiw2DAfBAUEE9MjixtjSKNotyICI4CggckCddsSWRZYASqvIIltQo0ADQdaEfctGSH3nj9/L0ggIkjPY95yqd+q9V/fe77339373e6vgX1zMtS4+2CRuzo+fDOl4IbfDY4H2DR7P3xjWMXAS8AKhV/lSDhC4htIwIOgq1y6BJwJCU/NWeb7PmBEem9a0wZ/fjX7/ob1DbgjA042jeq8YNtGcm/vQhqIkc8C8BYwBugHRYO4AfK6ztwHhZbRdAgqAY0Cwe+0MUAmo7DpfbFXAUaACEAH6EfgBWAlMBj0N3n2Kifx8fkqXPmM16ZWsj34RQPfHW7b7Ln5h14L0qNEmF8wa4EMww4BBwO/cVxVXQSzQyDoAwCmgEDjkRjsCOO7eH+m+ijNwAtgCOu1+5wdgB5AGehF4AtQKFA4hfbNeq/dpj54rntxU+6oAUucnZ+4cvDb24udhxlQHkwPmWzCfAqPAdASSgKZALOAB8lynzpeC+kU542aj2PolIBvYCnwPWgn8F2ggqDaoks1O8IA8JdT+/U/LVpeCKAHw7JdRvT8K2Z5SEIga7ekGxg8m2I3+h8AIMN2Be4B/c6NYFbsWKrnnKlwnAICTbpkVuZkoAHJtRvgYNBt4DNQcFAH6BgKfQGi/rNf63NVkwysf23IqWU4r908eUrA9qqMZCaYumBgwZ8HE2WhwAsxPQJQLOxg4dwMOX0sCQD6QBewHXQQzF7t+agLVLDhTE/I7Ro1e8fHkBjDgI9wiYGjleJ1e8OAQcxxMHpiKYM6DOQRkgFkF5mNguFs+ES6A8hKP62wd4A9gpoBZCXwDZjeYLDBeMGH2eGr4g0Me/Uu8SgBsWT7oYFFLc8BsAbMPWARmLTAPzNtA+3J09nolGcwsYCmY1e4r3fpVVGQObJk/6CC4a6Dec5u75cy+a4lZAp7XwbS09W+WAm1ugfNlZTOoLSgYtAECQ0HdoOKMLffv6tNsqQGIy8tNK5gc1tHzdzCvgycROOlG33uLAQBMAIVAYB3oKQi0hNBZeav2ZIZ3MgD+YxLHwPMteJ4Dc7d9fPIft9pzV74EJYDWQOAJCNwBpMAhjzFBAIoFTyGwDlvvtbl6q3ArpKnrU8D1LwwCOfaSB7CbUR0wrYB6QDTXvyn9f0gEUB+IAxMPph4lpe0peb8d+yirjI2+51Z7fZnEAzWAi4DARJQFgOt8ODYbxah/S1LJ9S/BftSpywEUS/GZ87fa4yv4FcBmAC4rIYALoMP2SB621f0tyUlK2w3ARNpjKbU4DJwF9mF7nJ3Yvue3IAHXn8PYDJTZmyyAO7HE4htsNxgNrAXa3mrPXdmI7XQPWu4gbMNHpeISKgDtA/5he3H9D2gBMBnYe4udzwTNxwb0K2ADtpz22Mt2I9sBZiOWynmwZfQB6Elsds5cQXEFoDWYRKAZkIJlYNcjF4E1rnM7sFk/XOZ6dWxnGopldqNAfwJ5gRXYdXpbGQAUArtBH9iNQt+6IOq6yi64qLdi6aEHSyODQJlgHgFqgRkKPIjdDK/EtncCfwO95epfC9qELZFdWHJTD0twggE/lgt0Bx4GkoFlwBNAw7IAjgGrgSO2WTLtQR2xpP1zYCkozY3KfjeC9cH0AMbacjN/diMWBQwC0xlIxNLFjaB04A17jw5jWdd/A31AS7HszmApa0MwDwG9XBAAna1P6gtMB2LKAtgBLALWgb52P2cBM0EfAgdsO8s2Sp8GB+zRTLftt9bZVsQsB1MdNARogt18QkFBbsksBDUCloDO2PLUBrfGC90sNLCVQD83q52xu3APoLGbsbvLAvjJdfwkmA6ge62zmgC0A02C0FZH61Wo/NXSwN93j/TGFY7iKadn0YKmEfmfNn05sMc71FRzo5hnCbh5Abt7XrJAtQuYB/orqIJ9kngWFM0Kq7p1Fp02nQ85e2J6Ye8K09QwrlGR03ZR7taau0wyaB6YUW7J3g0aCyoAllsABsAZI5k8MIuAVECgiUBvqBy57U/+/uOc9/ulBWoUFT12eVmPuD1mzNf/O2r5mbTH+xbtqzDe+MB4wKQBA9yIvgNqbw3rMHiHFr5YpcOMvya3nXL07e8On71cp+Sd2WF423sOtX7pyIVZKZ1YCmacLVvmgpJAOXBkvrErzRkk+RpKvvck30rJN1CKbqxJLd4av/zEXu94rkN6fpGYUefA7lzfD1J0uBS9V4rpKsXcL0VvlKKN5NshxUXuzu31XWLG9eg8X+gdn7Lw+Qf8ay4d9A2UfFsl3weSL1Zyequ0V3CSJOeY5Ksl+YIl3zqldNj+ZNL1GCkrwx5w+t8xdl9f3zLJ/5EUXUuKbij5P5B8f5PqpO/OfXSr0/9G9baIGzTJH6sUXxXJd5fkHJactmUBJEjOF5KzR3JGS4mb36l9o0ZKMtE/MSPWc/EF3wzJ30DyJ0u+uVKs5+ILve67vshfSRrXebO/80fJ2S05cyXnzrIAkiWns+R0k2qHnh4xNify+K81BJD41NT6zhbJ11/yDZOcdVKjFVPr34zOVzZEHq8z8vQI51HJSZWcOJWOVbiIXc5VIHz/7MMTK56tfjPGfv/AtC7e3UWzNBQ0DLyzi2a1/n5al5vR+Z8pZ6tXSp59mJPuiaNlLjqhkvO25CRKqUEtsm7GULHET9iU5HSVnJ5S3ZWbbng9XUl6V26R5bSSnOGSE1w2AwHgAgS9pzbvPp0+rTyMEbvpPEHYjnHxlj7loXL+7vRpwTvUhndKz5USmskQ1klNo17Jn1gexkKmnJhOEWDAk52dWB46w6LyJyr1RGTZc/9EKQMdysOMlcIHKkyjMhAJ6h9abgQ1aHrl6T8D4HGZV+5mT9WZg/2Ly8OQmR3/OhWwVPVS3B/KQ+fsbf7F+eNCFgB4WpYBENIobxW1QQWMe29O6xY3ayinuXfmxUP3dOMiEASXftd2yDGvd+bN6p2T0GqlljGOJhDSLm9VCYCg7IwZ+IDmcKb5oEkSvW7GUI9xnTx5y2ruYiQwBPK+rDHnoS+6PHIzOiV6nev8cD2aAfEQdCJjRgmAME9aU7YDSXA+tMOU7kXtdv5aQydjvOMPLnrpCCFg+oJ5GIiDzLUvvHT8OvuqK8n9Ge12nj9x70haAeshOHV5egmAxOR3o70TFUMeBBpBxt45jQe/GPnZrzGUmvF88rmkphPM8zb6DLat9fk6TSd0cZ5P/jU6H5kZ+dkP++c0DrQHvOD9UDF3jZj/z8FI3LUgzWnhbmjtpfht6yOe2Vot9kYMtdv3ZJL/a03yNZB8CyV/TclfR/KtlnxNJH+6JrX77MaaxGc2V4uNL1wf4YRJzhuS01JquG7u9J/dOOLO28/VSTs61WkjOW9KTjMpbsS+fve93S7hl9bEmOzI402i5r3sm64UX5jke1Xy15D8IZK/tuT3u616fck3RymNd817ecxz1+63JHp1ndEuIW7kvn5OqOSMcX0yR6c+nF7tyk+1rtuSM2vNzQ04vSRnquQMsRFM6PB5RkpSv+w3sksfsdnvhY7tYlpkNYh5tXuttadHOMNsm+vrK/nSJf89kj9W8reWfEWSL1/yDZKcfMl5Vqq1+PSIhJ9e7d45p0XWkezQscV6Z67wL05Z3i+7/oDVY/yxkjNScmbayNf6KjfQLT85s6zPP5sddItKzszYtOiT/HujRtMP+yvhbCAfzB5eCvcFThX9JXfnpXMVcy+9ab6gCpbI/xHwgXkOO1kYAOZ2SkaUeh9LUydiJ3/PAJnWg6C2ahN0R064d0Z4/dwfPVVViXHchx3XFADzIOzHrNca1O3Rc8nma/zQXSyj766xYvWrE/9xNn/g5KKB5gDDgRDsiOVyWYqljanYHyISwDRyQQTc7xViJx/bXG78FZCOHQ50u0xfDnawnAmsB+9Cxdy2aN7THbuPrTul3rHUy81f888egyvFzdn67KCDuUvaP1aUkrg9f2RYRzW77KYooKJr2IudQlTFznN87j2nsO3vaezgOBc7vj/Fz4ZmZj2Ezs1b5T20o0nIv69Kar5m/vh3pl/9zx7/8vJ/39rPvCQFiBIAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDEtMjlUMjM6NDM6MjcrMDE6MDDuWSV6AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTAxLTI5VDIzOjQzOjI3KzAxOjAwnwSdxgAAAFl0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9qYW5iL1Byb2pla3RlL3RhbXBlcm1vbmtleS9yZWwvaW1hZ2VzL2luY2x1ZGVzL3RhbXBlcm1vbmtleS5zdmf3en/XAAAAAElFTkSuQmCC"; - - const context = { - initialized: false, // 是否已经初始化 - defaultPluginOptions: {}, // 默认插件选项 - pluginOptions: {}, // 插件选项 - styleElement: null, // 插件样式元素 - pluginElement: null, // 插件元素 - arrowElement: null, // 箭头元素 - menusElement: null, // 菜单列表元素 - userMenusElement: null, // 用户菜单列表元素 - menus: {}, // 菜单集合 - menuIndex: 0, // 菜单索引,用于生成menuCmdId - lastNotification: null // 最后一次通知 - /* 最后一次通知的对象结构如下: - { - obj: null, // 通知对象,类型:Notification - options: null, // 通知选项 - timeout: null // 通知定时器 - } - */ - }; - - - // 创建插件API - const api = {}; - - // 监听页面关闭事件,用于关闭最后一个通知 - window.addEventListener("beforeunload", function (event) { - api.closeLastNotification(); - }); - - - //region DS自定义的API start - - // 获取上下文 - api.getContext = () => context; - - // 创建插件样式 - api.createPluginStyle = (options) => { - options = options || {}; - - // 创建一个新的 diff --git a/packages/gui/src/view/api.js b/packages/gui/src/view/api.js deleted file mode 100644 index 66e59c7a6b..0000000000 --- a/packages/gui/src/view/api.js +++ /dev/null @@ -1,70 +0,0 @@ -import { ipcRenderer, shell } from 'electron' -import lodash from 'lodash' -import path from 'path' - -let inited = false -let apiObj = null -export function apiInit (app) { - const invoke = (api, args) => { - return ipcRenderer.invoke('apiInvoke', [api, args]).catch((e) => { - const notification = app.config.globalProperties.$notification - if (notification) { - notification.error({ - message: 'Api invoke error', - description: e.message, - }) - } - throw e - }) - } - const send = (channel, message) => { - console.log('ipcRenderer.send, channel=', channel, ', message=', message) - return ipcRenderer.send(channel, message) - } - - apiObj = { - ipc: { - on (channel, callback) { - ipcRenderer.on(channel, callback) - }, - removeAllListeners (channel) { - ipcRenderer.removeAllListeners(channel) - }, - invoke, - postMessage (channel, ...args) { - ipcRenderer.postMessage(channel, ...args) - }, - send, - async openExternal (href) { - await shell.openExternal(href) - }, - openPath (file) { - shell.openPath(path.resolve(file)) - }, - }, - } - - const bindApi = (api, param1) => { - lodash.set(apiObj, api, (param2) => { - return invoke(api, param2 || param1) - }) - } - - if (!inited) { - return invoke('getApiList').then((list) => { - inited = true - for (const item of list) { - bindApi(item) - } - console.log('api inited:', apiObj) - return apiObj - }) - } - - return new Promise((resolve) => { - resolve(apiObj) - }) -} -export function useApi () { - return apiObj -} diff --git a/packages/gui/src/view/components/container.vue b/packages/gui/src/view/components/container.vue deleted file mode 100644 index 9964a456b6..0000000000 --- a/packages/gui/src/view/components/container.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - - - diff --git a/packages/gui/src/view/components/setup-ca.vue b/packages/gui/src/view/components/setup-ca.vue deleted file mode 100644 index 7abe56c915..0000000000 --- a/packages/gui/src/view/components/setup-ca.vue +++ /dev/null @@ -1,106 +0,0 @@ - - - diff --git a/packages/gui/src/view/components/tree-node.vue b/packages/gui/src/view/components/tree-node.vue deleted file mode 100644 index aac251e720..0000000000 --- a/packages/gui/src/view/components/tree-node.vue +++ /dev/null @@ -1,31 +0,0 @@ - - - diff --git a/packages/gui/src/view/composables/theme.js b/packages/gui/src/view/composables/theme.js deleted file mode 100644 index c5962619cd..0000000000 --- a/packages/gui/src/view/composables/theme.js +++ /dev/null @@ -1,3 +0,0 @@ -import { ref } from 'vue' - -export const colorTheme = ref('dark') diff --git a/packages/gui/src/view/index.js b/packages/gui/src/view/index.js deleted file mode 100644 index 0d498f02eb..0000000000 --- a/packages/gui/src/view/index.js +++ /dev/null @@ -1,20 +0,0 @@ -import modules from '../bridge/front' -import { apiInit, useApi } from './api' -import status from './status' - -export default { - initApi: apiInit, - async initPre (app, api) { - app.config.globalProperties.$api = api - const setting = await api.setting.load() - app.config.globalProperties.$global = { - setting, - config: await api.config.get(), - } - await status.install(app, api) - }, - initModules (app, router) { - const api = useApi() - modules.install(app, api, router) - }, -} diff --git a/packages/gui/src/view/mixins/plugin.js b/packages/gui/src/view/mixins/plugin.js deleted file mode 100644 index bff7b52f96..0000000000 --- a/packages/gui/src/view/mixins/plugin.js +++ /dev/null @@ -1,172 +0,0 @@ -import lodash from 'lodash' -import DsContainer from '../components/container' - -export default { - components: { - DsContainer, - }, - data () { - return { - key: undefined, - config: undefined, - status: {}, - labelCol: { span: 5 }, - wrapperCol: { span: 19 }, - resetDefaultLoading: false, - applyLoading: false, - systemPlatform: '', - } - }, - created () { - this.init() - }, - mounted () { - }, - methods: { - getKey () { - if (this.key) { - return this.key - } - throw new Error('请设置key') - }, - async init () { - this.status = this.$status - await this.reloadConfig() - this.printConfig('Init, ') - this.systemPlatform = await this.$api.info.getSystemPlatform() - - if (this.ready) { - return this.ready(this.config) - } - }, - async apply () { - if (this.applyLoading === true) { - return // 防重复提交 - } - this.applyLoading = true - try { - await this.applyBefore() - await this.saveConfig() - await this.applyAfter() - } finally { - this.applyLoading = false - } - }, - async applyBefore () { - - }, - async applyAfter () { - - }, - resetDefault () { - const key = this.getKey() - this.$confirm({ - title: '提示', - content: '确定要恢复默认设置吗?', - cancelText: '取消', - okText: '确定', - onOk: async () => { - this.resetDefaultLoading = true - try { - this.config = await this.$api.config.resetDefault(key) - if (this.ready) { - await this.ready(this.config) - } - await this.apply() - } finally { - this.resetDefaultLoading = false - } - }, - onCancel () {}, - }) - }, - saveConfig () { - const configCopy = lodash.cloneDeep(this.config) - return this.$api.config.save(configCopy).then((ret) => { - this.$message.success('设置已保存') - this.setConfig(ret.allConfig) - this.printConfig('After saveConfig(), ') - return ret - }) - }, - getConfig (key) { - const value = lodash.get(this.config, key) - if (value == null) { - return {} - } - return value - }, - setConfig (newConfig) { - this.config = newConfig - }, - printConfig (prefix = '') { - console.log(`${prefix}${this.key} page config:`, this.config, this.systemPlatform) - }, - getStatus (key) { - const value = lodash.get(this.status, key) - if (value == null) { - return {} - } - return value - }, - async reloadConfig () { - const config = await this.$api.config.reload() - this.setConfig(config) - }, - async reloadConfigAndRestart () { - if (this.$api.plugin.git.isEnabled()) { - await this.$api.plugin.git.close() - } - await this.reloadConfig() - this.printConfig('After reloadConfigAndRestart(), ') - if (this.status.server.enabled || this.status.proxy.enabled) { - await this.$api.proxy.restart() - await this.$api.server.restart() - if (this.$api.plugin.git.isEnabled()) { - await this.$api.plugin.git.start() - } - this.$message.success('代理服务和系统代理重启成功') - } else { - this.$message.info('代理服务和系统代理未启动,无需重启') - } - }, - isWindows () { - return this.systemPlatform === 'windows' - }, - isMac () { - return this.systemPlatform === 'mac' - }, - isLinux () { - return this.systemPlatform === 'linux' - }, - async openLog () { - const dir = await this.$api.info.getLogDir() - this.$api.ipc.openPath(dir) - }, - async focusFirst (ref) { - if (ref && ref.length != null) { - setTimeout(() => { - if (ref.length > 0) { - try { - ref[0].$el.querySelector('.ant-input').focus() - } catch (e) { - console.error('获取输入框焦点失败:', e) - } - } - }, 100) - } - }, - handleHostname (hostname) { - if (this.isNotHostname(hostname)) { - return '' - } - - // 移除所有空白符 - return hostname.replaceAll(/\s+/g, '') - }, - isNotHostname (hostname) { - // 暂时只判断数字 - return !hostname || /^[\d\s]+$/.test(hostname) - }, - }, -} diff --git a/packages/gui/src/view/pages/help.vue b/packages/gui/src/view/pages/help.vue deleted file mode 100644 index 64994feaec..0000000000 --- a/packages/gui/src/view/pages/help.vue +++ /dev/null @@ -1,46 +0,0 @@ - - - diff --git a/packages/gui/src/view/pages/index.vue b/packages/gui/src/view/pages/index.vue deleted file mode 100644 index 9c93a37b43..0000000000 --- a/packages/gui/src/view/pages/index.vue +++ /dev/null @@ -1,488 +0,0 @@ - - - - - diff --git a/packages/gui/src/view/pages/plugin/free-eye.vue b/packages/gui/src/view/pages/plugin/free-eye.vue deleted file mode 100644 index 5b68fe71df..0000000000 --- a/packages/gui/src/view/pages/plugin/free-eye.vue +++ /dev/null @@ -1,231 +0,0 @@ - - - - - diff --git a/packages/gui/src/view/pages/plugin/git.vue b/packages/gui/src/view/pages/plugin/git.vue deleted file mode 100644 index 4fa7911d83..0000000000 --- a/packages/gui/src/view/pages/plugin/git.vue +++ /dev/null @@ -1,141 +0,0 @@ - - - diff --git a/packages/gui/src/view/pages/plugin/node.vue b/packages/gui/src/view/pages/plugin/node.vue deleted file mode 100644 index d77fdff9a4..0000000000 --- a/packages/gui/src/view/pages/plugin/node.vue +++ /dev/null @@ -1,162 +0,0 @@ - - - diff --git a/packages/gui/src/view/pages/plugin/overwall.vue b/packages/gui/src/view/pages/plugin/overwall.vue deleted file mode 100644 index 39218de649..0000000000 --- a/packages/gui/src/view/pages/plugin/overwall.vue +++ /dev/null @@ -1,255 +0,0 @@ - - - - - diff --git a/packages/gui/src/view/pages/plugin/pip.vue b/packages/gui/src/view/pages/plugin/pip.vue deleted file mode 100644 index b267617df1..0000000000 --- a/packages/gui/src/view/pages/plugin/pip.vue +++ /dev/null @@ -1,105 +0,0 @@ - - - diff --git a/packages/gui/src/view/pages/proxy.vue b/packages/gui/src/view/pages/proxy.vue deleted file mode 100644 index a3c13b7366..0000000000 --- a/packages/gui/src/view/pages/proxy.vue +++ /dev/null @@ -1,233 +0,0 @@ - - - - - diff --git a/packages/gui/src/view/pages/server.vue b/packages/gui/src/view/pages/server.vue deleted file mode 100644 index cd352a2ff8..0000000000 --- a/packages/gui/src/view/pages/server.vue +++ /dev/null @@ -1,568 +0,0 @@ - - - - - diff --git a/packages/gui/src/view/pages/setting.vue b/packages/gui/src/view/pages/setting.vue deleted file mode 100644 index 240df00cb7..0000000000 --- a/packages/gui/src/view/pages/setting.vue +++ /dev/null @@ -1,531 +0,0 @@ - - - diff --git a/packages/gui/src/view/router/index.js b/packages/gui/src/view/router/index.js deleted file mode 100644 index b0173f28f2..0000000000 --- a/packages/gui/src/view/router/index.js +++ /dev/null @@ -1,26 +0,0 @@ -import Index from '../pages/index' -import Git from '../pages/plugin/git' -import Node from '../pages/plugin/node' -import Overwall from '../pages/plugin/overwall' -import Pip from '../pages/plugin/pip' -import FreeEye from '../pages/plugin/free-eye.vue' -import Proxy from '../pages/proxy' -import Server from '../pages/server' -import Setting from '../pages/setting' -import Help from '../pages/help' - -const routes = [ - { path: '/', redirect: '/index' }, - { path: '/index', component: Index }, - { path: '/server', component: Server }, - { path: '/proxy', component: Proxy }, - { path: '/setting', component: Setting }, - { path: '/help', component: Help }, - { path: '/plugin/node', component: Node }, - { path: '/plugin/git', component: Git }, - { path: '/plugin/pip', component: Pip }, - { path: '/plugin/free-eye', component: FreeEye }, - { path: '/plugin/overwall', component: Overwall }, -] - -export default routes diff --git a/packages/gui/src/view/router/menu.js b/packages/gui/src/view/router/menu.js deleted file mode 100644 index 07b0257892..0000000000 --- a/packages/gui/src/view/router/menu.js +++ /dev/null @@ -1,26 +0,0 @@ -export default function createMenus (app) { - const plugins = [ - { title: 'NPM加速', path: '/plugin/node', icon: 'like' }, - { title: 'Git.exe代理', path: '/plugin/git', icon: 'github' }, - { title: 'PIP加速', path: '/plugin/pip', icon: 'bulb' }, - { title: '网络检测', path: '/plugin/free-eye', icon: 'eye' }, - ] - const menus = [ - { title: '首页', path: '/index', icon: 'home' }, - { title: '加速服务', path: '/server', icon: 'thunderbolt' }, - { title: '系统代理', path: '/proxy', icon: 'deployment-unit' }, - { title: '设置', path: '/setting', icon: 'setting' }, - { title: '帮助中心', path: '/help', icon: 'star' }, - { - title: '应用', - path: '/plugin', - icon: 'api', - children: plugins, - }, - ] - const $global = app.$global || app.config?.globalProperties?.$global - if ($global?.setting?.overwall) { - plugins.push({ title: '增强功能', path: '/plugin/overwall', icon: 'global' }) - } - return menus -} diff --git a/packages/gui/src/view/status.js b/packages/gui/src/view/status.js deleted file mode 100644 index 6a0f65aad4..0000000000 --- a/packages/gui/src/view/status.js +++ /dev/null @@ -1,30 +0,0 @@ -import lodash from 'lodash' -import { reactive } from 'vue' - -const status = reactive({ - server: { - enabled: false, - }, - proxy: { - enabled: false, - }, - plugin: { - node: {}, - }, -}) -async function install (app, api) { - api.ipc.on('status', (event, message) => { - console.log('view on status', event, message) - const value = message.value - const key = message.key - lodash.set(status, key, value) - }) - const basicStatus = await api.status.get() - lodash.merge(status, basicStatus) - app.config.globalProperties.$status = status - return status -} -export default { - install, - status, -} diff --git a/packages/gui/src/view/style/index.scss b/packages/gui/src/view/style/index.scss deleted file mode 100644 index 7855749b60..0000000000 --- a/packages/gui/src/view/style/index.scss +++ /dev/null @@ -1,180 +0,0 @@ -.footer-bar { - padding: 10px; - text-align: right; - border-top: #eee 1px solid; -} - -.flex-l-r { - align-content: center; - display: flex; - justify-content: flex-end; - align-items: center; - - & > a { - align-content: center; - display: flex; - align-items: center; - } -} - -span.ant-input { - white-space: nowrap; - overflow: hidden; - vertical-align: middle; -} - -.w100 { - width: 100%; -} - -.mr10 { - margin-right: 10px; -} - -.mt-1 { - margin-top: -1px; -} -.mt-2 { - margin-top: -2px; -} -.mt5 { - margin-top: 5px; -} -.mt10 { - margin-top: 10px; -} -.mt20 { - margin-top: 20px; -} - -.ml5 { - margin-left: 5px; -} -.ml10 { - margin-left: 10px; -} - -ol { - margin-block-start: 0em; - margin-block-end: 0em; - padding-inline-start: 20px; -} - -.form-help { - font-size: 12px; - line-height: 15px; - color: #a1a1a1; - - i { - font-family: 'Microsoft YaHei', serif; - font-style: normal; - font-weight: bold; - } - - code { - padding: 0 0.4em; - } -} - -code { - font-size: 85%; - font-style: normal; - border-radius: 6px; - color: #888; - background-color: #f1f1f1; - margin-left: 0.2em; - margin-right: 0.2em; - padding: 0.2em 0.4em; - white-space: break-spaces; -} - -.ace_search_form .ace_searchbtn { - width: auto; - min-width: 27px; -} - -.ant-radio-button-wrapper { - margin-bottom: 3px; -} - -.ant-form-item-control { - line-height: 37px; -} - -hr { - border-width: 2px 0 0 0; - border-style: solid; - border-color: #eee; - width: 100%; -} - -.ant-modal-content { - background-color: #fbfbfb; -} - -.restore-factory-settings { - div { - padding-left: 1em; - } - span { - display: inline-block; - background-color: #eee; - padding: 2px 5px; - margin: 0 5px 5px 5px; - } -} - -.help-list { - ul { - padding-left: 10px; - - li { - list-style: none; - line-height: 30px; - - div { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - font-size: 14px; - } - - a { - color: #3990e0; - } - a:hover { - text-decoration: underline; - color: #2c9be5; - } - } - - // 嵌套列表 - ul { - padding-left: 20px; - } - } - - ul:first-child li:first-child div:first-child.title1 { - margin-top: 0; - } - - .title1 { - font-size: 18px; - font-weight: bold; - border-bottom: 1px solid #eee; - margin-top: 12px; - margin-bottom: 5px; - padding-bottom: 5px; - padding-left: 5px; - } - - .title2 { - font-size: 16px; - font-weight: bold; - margin-top: 10px; - } - - .console { - font-family: Consolas, arial, serif; - } -} diff --git a/packages/gui/src/view/style/theme/dark.scss b/packages/gui/src/view/style/theme/dark.scss deleted file mode 100644 index a31b81e923..0000000000 --- a/packages/gui/src/view/style/theme/dark.scss +++ /dev/null @@ -1,269 +0,0 @@ -/* 暗色主题 */ -$dark-logo: url('../../../../public/logo/logo-lang-light.svg'); -$dark-bg: #1e1f22; //背景 -$dark-bg-highlight: #333; //高亮块:背景 -$dark-text: #ddd; //字体颜色 -$dark-bd: #333; //边框和分隔线 -$dark-btn: #444; //按钮:边框和背景颜色 -$dark-input: #777; //输入框:背景色 -.theme-dark { - hr { - border-color: $dark-bd; - } - - /* 背景色和字体颜色 */ - .ds_layout, - .ant-layout, - .ds-container, - .ds-container .container-header, - .ant-layout-footer { - background-color: $dark-bg; - color: $dark-text; - } - div, - span, - label { - color: $dark-text; - } - .form-help { - color: #a1a1a1; - } - code { - color: #bbb; - background-color: #333; - } - - /* 高亮块:背景色和字体颜色 */ - /* 警告类型 */ - .ant-alert-warning { - background-color: $dark-bg-highlight; - border-color: $dark-bg-highlight; - color: $dark-text; - /* 关闭图标颜色 */ - .ant-alert-close-icon .anticon-close { - color: $dark-text; - } - } - /* 消息类型 */ - .ant-alert-info { - background-color: $dark-bg-highlight; - border-color: $dark-bg-highlight; - color: $dark-text; - } - - /* 边框和分隔线 */ - .ant-layout-has-sider, - .ant-layout-sider-children, - .ds-container .container-header, - .logo, - .footer-bar, - .ant-layout-footer, - .ant-tabs .ant-tabs-left-bar, - .ant-tabs .ant-tabs-left-content { - border-color: $dark-bd; - } - .ant-radio-button-wrapper:not(:first-child)::before { - background-color: #666; - } - .ant-divider { - background-color: $dark-bd; - } - - .help-list .title1 { - border-bottom-color: $dark-bd; - } - - /* 左侧 */ - /** 背景色 **/ - .ant-layout-sider { - background-color: $dark-bg; - } - /** Logo **/ - .logo { - background-image: $dark-logo; /* logo使用亮色的 */ - } - /** 菜单 **/ - .ant-menu { - background-color: $dark-bg; - color: $dark-text; - } - /* 菜单选中时,或鼠标移到菜单上时的样式 */ - .ant-menu-item:hover, - .ant-menu-submenu .ant-menu-submenu-title:hover, - .ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected { - background-color: $dark-bg-highlight; - color: #1890ff; - span { - color: #1890ff; - } - } - - /* 输入框、下拉框 */ - .ant-input, - .ant-input-number-input, - .ant-input-number, - .ant-select-selection, - .ant-input-group-addon { - background-color: $dark-input; - border-color: #aaa; - color: $dark-text; - &:hover, - &:focus { - border-color: #eee; - } - - &:focus { - box-shadow: 0 0 0 2px rgb(255 255 255 / 35%); - } - } - - /* 选中的下拉框 */ - .ant-select-open, - .ant-select-focused { - .ant-select-selection { - box-shadow: 0 0 0 2px rgb(255 255 255 / 35%); - } - } - - /* 卡片消息:IP测速 */ - .ant-card { - background-color: $dark-input; - border-color: $dark-input; - .ant-card-head { - border-bottom-color: #929292; - } - } - - /* 标签:未启用 */ - .ant-tag-red { - background-color: #4f4749; - border-color: #4f4749; - color: #bf8285; - } - /* 标签:已启用 */ - .ant-tag-green { - background-color: #505f5f; - border-color: #505f5f; - color: #90cb9f; - } - /* 标签:警告 */ - .ant-tag-orange { - background-color: #5a5750; - border-color: #5a5750; - color: #cfa572; - } - /* 标签:未知 */ - .ant-tag:not(.ant-tag-red, .ant-tag-green, .ant-tag-orange) { - background-color: #5a5a5a; - border-color: #5a5a5a; - color: #ccc; - } - - /* 按钮 */ - .ant-btn:not(.ant-btn-danger, .ant-btn-primary) { - background-color: $dark-btn; - border-color: $dark-btn; - color: $dark-text; - &:hover { - opacity: 0.8; - } - } - - /* 单选框:开关式 */ - .ant-switch:not(.ant-switch-checked) { - background-color: $dark-btn; - border-color: $dark-btn; - &:hover { - opacity: 0.8; - } - } - /* 单选框:按钮式 */ - .ant-radio-button-wrapper { - background-color: $dark-btn; - border-color: $dark-btn; - color: $dark-text; - &:hover { - opacity: 0.8; - } - } - - /* JSON编辑器:应用于拦截设置 */ - .jsoneditor-vue { - /*整个编辑框:背景色和边框*/ - div.jsoneditor { - background-color: $dark-bg-highlight; - border: none; - } - /* 头部菜单栏:边框 */ - div.jsoneditor-menu { - background-color: $dark-bg-highlight; - border-color: $dark-bg-highlight; - } - /* 内容区域左边:行号 */ - .ace_gutter { - background-color: #444; - .ace_gutter-cell { - color: #aaa; - } - } - /* 内容区域右边:JSON内容 */ - .ace_scroller { - background-color: #555; - } - /* key的颜色 */ - .ace_variable, - .ace_text-layer { - color: #eee; - } - /* 字符串值的颜色 */ - .ace_string, - .ace_cjk { - color: #a6eaa6; - } - .ace_constant { - /* 数字的颜色 */ - &.ace_numeric { - color: #ec9999; - } - /* 布尔值的颜色 */ - &.ace_language { - color: #f4c995; - } - } - /* 当前行高亮样式 */ - .ace_gutter-active-line, - .ace_marker-layer .ace_active-line { - background-color: #838774; - } - /* 选中行高亮样式 */ - .ace-jsoneditor { - .ace_marker-layer .ace_selection { - background-color: #8b2929; /* 同时应用于当前选中的搜索结果项的背景色,建议与搜索结果边框颜色保持一致 */ - } - - /* 光标颜色 */ - .ace_cursor { - border-left-color: #ddd; - } - } - /* 搜索框 */ - .ace_button, - button, - .ace_search_field { - color: #000; - } - /* 搜索结果 */ - .ace-jsoneditor .ace_marker-layer .ace_selected-word { - border-color: #8b2929; - } - } - - .search-bar { - div { - color: #000; - } - span { - color: #000; - } - } -} diff --git a/packages/gui/vue.config.cjs b/packages/gui/vue.config.cjs deleted file mode 100644 index 5f5662ffcc..0000000000 --- a/packages/gui/vue.config.cjs +++ /dev/null @@ -1,45 +0,0 @@ -const { defineConfig } = require('@vue/cli-service') -const webpack = require('webpack') - -const publishUrl = process.env.VUE_APP_PUBLISH_URL -if (publishUrl) { - console.log('Publish url:', publishUrl) -} - -module.exports = defineConfig({ - outputDir: 'dist', - publicPath: './', - pages: { - index: { - entry: 'src/main.js', - title: 'DevSidecar-给开发者的边车辅助工具', - }, - }, - lintOnSave: false, - configureWebpack: { - plugins: [ - new webpack.DefinePlugin({ 'global.GENTLY': true }), - ], - externals: { - electron: 'commonjs electron', - }, - resolve: { - fallback: { - path: require.resolve('path-browserify'), - fs: false, - }, - }, - module: { - rules: [ - { - test: /\.json5$/i, - loader: 'json5-loader', - options: { - esModule: false, - }, - type: 'javascript/auto', - }, - ], - }, - }, -}) diff --git a/packages/mitmproxy/LICENSE b/packages/mitmproxy/LICENSE deleted file mode 100644 index a612ad9813..0000000000 --- a/packages/mitmproxy/LICENSE +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/packages/mitmproxy/index.js b/packages/mitmproxy/index.js deleted file mode 100644 index a2958b789f..0000000000 --- a/packages/mitmproxy/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./src') diff --git a/packages/mitmproxy/package.json b/packages/mitmproxy/package.json deleted file mode 100644 index dda643c406..0000000000 --- a/packages/mitmproxy/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "@docmirror/mitmproxy", - "version": "2.1.0", - "private": false, - "description": "", - "author": "docmirror.cn", - "license": "MPL-2.0", - "keywords": [ - "dev-sidecar" - ], - "main": "src/index.js", - "scripts": { - "test": "mocha" - }, - "dependencies": { - "@docmirror/dev-sidecar": "workspace:*", - "agentkeepalive": "^4.6.0", - "axios": "^1.15.0", - "baidu-aip-sdk": "^4.16.16", - "dns-over-http": "^0.2.0", - "is-browser": "^2.1.0", - "json5": "^2.2.3", - "lodash": "^4.18.1", - "lru-cache": "~11.2.7", - "node-forge": "^1.4.0", - "stream-throttle": "^0.1.3", - "through2": "^4.0.2", - "tunnel-agent": "^0.6.0" - } -} diff --git a/packages/mitmproxy/src/index.js b/packages/mitmproxy/src/index.js deleted file mode 100644 index bdd6c67f5c..0000000000 --- a/packages/mitmproxy/src/index.js +++ /dev/null @@ -1,127 +0,0 @@ -const mitmproxy = require('./lib/proxy') -const proxyConfig = require('./lib/proxy/common/config') -const speedTest = require('./lib/speed/index.js') -const ProxyOptions = require('./options') -const log = require('./utils/util.log.server') -const { fireError, fireStatus } = require('./utils/util.process') - -let servers = [] - -const api = { - async start (config) { - const proxyOptions = ProxyOptions(config) - const setting = config.setting - if (setting) { - if (setting.userBasePath) { - proxyConfig.setDefaultCABasePath(setting.userBasePath) - } - } - - if (proxyOptions.setting && proxyOptions.setting.NODE_TLS_REJECT_UNAUTHORIZED === false) { - process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' - } else { - process.env.NODE_TLS_REJECT_UNAUTHORIZED = '1' - } - // log.info('启动代理服务时的配置:', JSON.stringify(proxyOptions, null, '\t')) - const newServers = mitmproxy.createProxy(proxyOptions, (server, port, host, ssl) => { - fireStatus(true) - log.info(`代理服务已启动:${host}:${port}, ssl: ${ssl}`) - }) - for (const newServer of newServers) { - newServer.on('close', () => { - log.info('server will closed ') - if (servers.includes(newServer)) { - servers = servers.filter(item => item !== newServer) - if (servers.length === 0) { - fireStatus(false) - } - } - }) - newServer.on('error', (e) => { - log.error('server error', e) - // newServer = null - fireError(e) - }) - } - servers = newServers - - registerProcessListener() - }, - async close () { - return new Promise((resolve, reject) => { - if (servers && servers.length > 0) { - for (const server of servers) { - server.close((err) => { - if (err) { - if (err.code === 'ERR_SERVER_NOT_RUNNING') { - log.info('代理服务未运行,无需关闭') - resolve() - } else { - log.error('代理服务关闭失败:', err) - reject(err) - } - return - } - - log.info('代理服务关闭成功') - resolve() - }) - } - servers = [] - } else { - log.info('server is null, no need to close.') - fireStatus(false) - resolve() - } - }) - }, -} - -function registerProcessListener () { - process.on('message', (msg) => { - log.info('child get msg:', JSON.stringify(msg)) - if (msg.type === 'action') { - api[msg.event.key](msg.event.params) - } else if (msg.type === 'speed') { - speedTest.action(msg.event) - } - }) - - process.on('SIGINT', () => { - log.info('on sigint : closed ') - process.exit(0) - }) - - // 避免异常崩溃 - process.on('uncaughtException', (err) => { - if (err.code === 'ECONNABORTED') { - // log.error(err.errno) - return - } - log.error('Process uncaughtException:', err) - }) - - process.on('unhandledRejection', (err, p) => { - log.info('Process unhandledRejection at: Promise', p, 'err:', err) - // application specific logging, throwing an error, or other logic here - }) - process.on('uncaughtExceptionMonitor', (err, origin) => { - log.info('Process uncaughtExceptionMonitor:', err, origin) - }) - process.on('exit', (code, signal) => { - log.info('代理服务进程被关闭:', code, signal) - }) - process.on('beforeExit', (code, signal) => { - log.info('Process beforeExit event with code: ', code, signal) - }) - process.on('SIGPIPE', (code, signal) => { - log.warn('sub Process SIGPIPE', code, signal) - }) -} - -module.exports = { - ...api, - config: proxyConfig, - log, - speedTest, -} diff --git a/packages/mitmproxy/src/json.js b/packages/mitmproxy/src/json.js deleted file mode 100644 index 844929471c..0000000000 --- a/packages/mitmproxy/src/json.js +++ /dev/null @@ -1,42 +0,0 @@ -const logOrConsole = require('@docmirror/dev-sidecar/src/utils/util.log-or-console') -let JSON5 = require('json5') -if (JSON5.default) { - JSON5 = JSON5.default -} - -module.exports = { - parse (str, defaultValue) { - if (str == null || str.length < 2) { - return defaultValue || {} - } - - str = str.toString() - - if (defaultValue != null) { - try { - return JSON5.parse(str) - } catch (e) { - logOrConsole.error(`JSON5解析失败: ${e.message},JSON内容:\r\n`, str) - return defaultValue - } - } else { - return JSON5.parse(str) - } - }, - stringify (obj) { - return JSON.stringify(obj, null, '\t') - }, - - // 仅用于记录日志时使用 - stringify2 (obj) { - try { - return JSON.stringify(obj) - } catch { - try { - return JSON5.stringify(obj) - } catch { - return obj - } - } - }, -} diff --git a/packages/mitmproxy/src/lib/choice/RequestCounter.js b/packages/mitmproxy/src/lib/choice/RequestCounter.js deleted file mode 100644 index d258ebc444..0000000000 --- a/packages/mitmproxy/src/lib/choice/RequestCounter.js +++ /dev/null @@ -1,3 +0,0 @@ -const { ChoiceCache } = require('./index') - -module.exports = new ChoiceCache() diff --git a/packages/mitmproxy/src/lib/choice/index.js b/packages/mitmproxy/src/lib/choice/index.js deleted file mode 100644 index f4510ebb8d..0000000000 --- a/packages/mitmproxy/src/lib/choice/index.js +++ /dev/null @@ -1,136 +0,0 @@ -const { LRUCache } = require('lru-cache') -const log = require('../../utils/util.log.server') - -const cacheSize = 1024 - -class ChoiceCache { - constructor () { - this.cache = new LRUCache({ - maxSize: cacheSize, - sizeCalculation: () => { - return 1 - }, - }) - } - - get (key) { - return this.cache.get(key) - } - - getOrCreate (key, backupList) { - log.info('get counter:', key) - let item = this.cache.get(key) - if (item == null) { - item = new DynamicChoice(key) - item.setBackupList(backupList) - this.cache.set(key, item) - } - return item - } -} - -class DynamicChoice { - constructor (key) { - this.key = key - this.countMap = {} /* ip -> count { value, total, error, keepErrorCount, successRate } */ - this.value = null // 当前使用的host - this.backupList = [] // 备选host列表 - this.createTime = new Date() - } - - doRank () { - // 将count里面根据成功率排序 - const countList = [] - for (const key in this.countMap) { - countList.push(this.countMap[key]) - } - - // 将countList根据成功率排序 - countList.sort((a, b) => { - return b.successRate - a.successRate - }) - - log.info('Do rank:', JSON.stringify(countList)) - - const newBackupList = countList.map(item => item.value) - this.setBackupList(newBackupList) - } - - /** - * 设置新的backup列表 - * @param newBackupList 新的backupList - */ - setBackupList (newBackupList) { - this.backupList = [...newBackupList] - let defaultTotal = newBackupList.length - for (const ip of newBackupList) { - if (!this.countMap[ip]) { - this.countMap[ip] = { value: ip, total: defaultTotal, error: 0, keepErrorCount: 0, successRate: 0.5 } - defaultTotal-- - } - } - this.value = this.backupList.shift() - this.doCount(this.value, false) - } - - countStart (value) { - this.doCount(value, false) - } - - /** - * 换下一个 - * @param count 计数器 - */ - changeNext (count) { - log.info('切换backup', count, this.backupList) - count.keepErrorCount = 0 // 清空连续失败 - count.total = 0 - count.error = 0 - - const valueBackup = this.value - if (this.backupList.length > 0) { - this.value = this.backupList.shift() - log.info(`切换backup完成: ${this.key}, ip: ${valueBackup} ➜ ${this.value}, this:`, this) - } else { - this.value = null - log.info(`切换backup完成: ${this.key}, backupList为空了,设置this.value: from '${valueBackup}' to null. this:`, this) - } - } - - /** - * 记录使用次数或错误次数 - * @param ip - * @param isError - */ - doCount (ip, isError) { - let count = this.countMap[ip] - if (count == null) { - count = this.countMap[ip] = { value: ip, total: 5, error: 0, keepErrorCount: 0, successRate: 1 } - } - - if (isError) { - count.error++ // 失败次数+1 - count.keepErrorCount++ // 累计连续失败次数+1 - } - count.total++ // 总次数+1 - - // 计算成功率 - count.successRate = 1.0 - (count.error / count.total) - - // 判断是否需要切换下一个 - if (isError && this.value === ip) { - if (count.keepErrorCount >= 3) { - // 连续错误3次,切换下一个 - this.changeNext(count) - } else if (count.successRate < 0.4) { - // 成功率小于40%,切换下一个 - this.changeNext(count) - } - } - } -} - -module.exports = { - DynamicChoice, - ChoiceCache, -} diff --git a/packages/mitmproxy/src/lib/dns/base.js b/packages/mitmproxy/src/lib/dns/base.js deleted file mode 100644 index 4d8e588c2c..0000000000 --- a/packages/mitmproxy/src/lib/dns/base.js +++ /dev/null @@ -1,228 +0,0 @@ -const { LRUCache } = require('lru-cache') -const log = require('../../utils/util.log.server') -const matchUtil = require('../../utils/util.match') -const { isIPv6 } = require('./util.ip') -const { DynamicChoice } = require('../choice/index') - -function mapToList (ipMap) { - const ipList = [] - for (const key in ipMap) { - const value = ipMap[key] - if (value && value !== 'false' && value !== '0') { // 配置为 ture 时才生效 - ipList.push(key) - } - } - return ipList -} - -const defaultCacheSize = 1024 - -class IpCache extends DynamicChoice { - constructor (hostname) { - super(hostname) - this.lookupCount = 0 - } - - /** - * 设置新的ipList - * - * @param newBackupList - */ - setBackupList (newBackupList) { - super.setBackupList(newBackupList) - this.lookupCount++ - } -} - -module.exports = class BaseDNS { - constructor (dnsServer, dnsFamily, dnsName, dnsType, cacheSize, preSetIpList) { - this.dnsName = dnsName - this.dnsType = dnsType - this.preSetIpList = preSetIpList - - this.cache = new LRUCache({ - maxSize: (cacheSize > 0 ? cacheSize : defaultCacheSize), - sizeCalculation: () => { - return 1 - }, - }) - - if (!dnsServer) { - return - } - this.dnsServer = dnsServer - this.dnsFamily = Number.parseInt(dnsFamily) || (isIPv6(dnsServer) ? 6 : 4) - this.dnsFamily = this.dnsFamily === 6 ? 6 : 4 // 避免值错误 - } - - count (hostname, ip, isError = true) { - const ipCache = this.cache.get(hostname) - if (ipCache) { - ipCache.doCount(ip, isError) - } - } - - async lookup (hostname, options = {}) { - try { - let ipCache = this.cache.get(hostname) - if (ipCache) { - const ip = ipCache.value - if (ip != null) { - if (options.ipChecker) { - if (options.ipChecker(ip)) { - ipCache.doCount(ip, false) - log.info(`[DNS-over-${this.dnsType} '${this.dnsName}'] 获取IP地址缓存: ${hostname} -> ${ip}(测试通过)`) - return ip - } else { - log.info(`[DNS-over-${this.dnsType} '${this.dnsName}'] 获取IP地址缓存: ${hostname} -> ${ip}(测试不通过)-> ${hostname}`) - return hostname - } - } else { - log.info(`[DNS-over-${this.dnsType} '${this.dnsName}'] 获取IP地址缓存: ${hostname} -> ${ip}`) - return ip - } - } else { - log.info(`[DNS-over-${this.dnsType} '${this.dnsName}'] 未获取到IP地址缓存: ${hostname}`) - } - } else { - ipCache = new IpCache(hostname) - this.cache.set(hostname, ipCache) - log.info(`[DNS-over-${this.dnsType} '${this.dnsName}'] 首次创建IP地址缓存区: ${hostname}`) - } - - const t = Date.now() - let ipList = await this._lookupWithPreSetIpList(hostname, options) - if (ipList == null) { - // 没有获取到ip - ipList = [] - } - ipList.push(hostname) // 把原域名加入到统计里去 - - ipCache.setBackupList(ipList) - - const ip = ipCache.value - log.info(`[DNS-over-${this.dnsType} '${this.dnsName}'] ${hostname} ➜ ${ip} (${Date.now() - t} ms), ipList: ${JSON.stringify(ipList)}, ipCache:`, JSON.stringify(ipCache)) - - if (options.ipChecker) { - if (ip != null && ip !== hostname && options.ipChecker(ip)) { - return ip - } - - for (const ip of ipList) { - if (ip !== hostname && options.ipChecker(ip)) { - return ip - } - } - } - - return ip != null ? ip : hostname - } catch (error) { - log.error(`[DNS-over-${this.dnsType} '${this.dnsName}'] cannot resolve hostname ${hostname}, error:`, error) - return hostname - } - } - - async _lookupWithPreSetIpList (hostname, options = {}) { - if (this.preSetIpList) { - // 获取当前域名的预设IP列表 - let hostnamePreSetIpList = matchUtil.matchHostname(this.preSetIpList, hostname, `matched preSetIpList(${this.dnsName})`) - if (hostnamePreSetIpList && (hostnamePreSetIpList.length > 0 || hostnamePreSetIpList.length === undefined)) { - if (hostnamePreSetIpList.length > 0) { - hostnamePreSetIpList = hostnamePreSetIpList.slice() // 复制一份列表数据,避免配置数据被覆盖 - } else { - hostnamePreSetIpList = mapToList(hostnamePreSetIpList) - } - - if (hostnamePreSetIpList.length > 0) { - hostnamePreSetIpList.isPreSet = true - log.info(`[DNS-over-PreSet '${this.dnsName}'] 获取到该域名的预设IP列表: ${hostname} - ${JSON.stringify(hostnamePreSetIpList)}`) - return hostnamePreSetIpList - } - } - } - - return await this._lookup(hostname, options) - } - - async _lookup (hostname, options = {}) { - const start = Date.now() - - options.family = Number.parseInt(options.family) === 6 ? 6 : 4 - const type = options.family === 6 ? 'AAAA' : 'A' - - let response - try { - // 执行DNS查询 - log.debug(`[DNS-over-${this.dnsType} '${this.dnsName}'] query start: ${hostname}`) - response = await this._doDnsQuery(hostname, type, start) - } catch { - // 异常日志在 _doDnsQuery已经打印过,这里就不再打印了 - return [] - } - - try { - const cost = Date.now() - start - log.debug(`[DNS-over-${this.dnsType} '${this.dnsName}'] query end: ${hostname}, cost: ${cost} ms, response:`, response) - - if (response == null || response.answers == null || response.answers.length == null || response.answers.length === 0) { - log.warn(`[DNS-over-${this.dnsType} '${this.dnsName}'] 没有该域名的IPv${options.family}地址: ${hostname}, cost: ${cost} ms, response:`, response) - return [] - } - - const ret = response.answers.filter(item => item.type === type).map(item => item.data) - if (ret.length === 0) { - log.info(`[DNS-over-${this.dnsType} '${this.dnsName}'] 没有该域名的IPv${options.family}地址: ${hostname}, cost: ${cost} ms`) - } else { - log.info(`[DNS-over-${this.dnsType} '${this.dnsName}'] 获取到该域名的IPv${options.family}地址: ${hostname} - ${JSON.stringify(ret)}, cost: ${cost} ms`) - } - - return ret - } catch (e) { - log.error(`[DNS-over-${this.dnsType} '${this.dnsName}'] 解读响应失败,response:`, response, ', error:', e) - return [] - } - } - - _doDnsQuery (hostname, type = 'A', start) { - if (start == null) { - start = Date.now() - } - - return new Promise((resolve, reject) => { - // 设置超时任务 - let isOver = false - const timeout = 8000 - const timeoutId = setTimeout(() => { - if (!isOver) { - isOver = true - log.error(`[DNS-over-${this.dnsType} '${this.dnsName}'] DNS查询超时, hostname: ${hostname}, sni: ${this.dnsServerName || '无'}, type: ${type}${this.dnsServer ? `, dnsServer: ${this.dnsServer}` : ''}${this.dnsServerPort ? `:${this.dnsServerPort}` : ''}, cost: ${Date.now() - start} ms`) - reject(new Error('DNS查询超时')) - } - }, timeout) - - try { - this._dnsQueryPromise(hostname, type) - .then((response) => { - isOver = true - clearTimeout(timeoutId) - resolve(response) - }) - .catch((e) => { - isOver = true - clearTimeout(timeoutId) - if (e.message === 'DNS查询超时') { - log.error(`[DNS-over-${this.dnsType} '${this.dnsName}'] DNS查询超时. hostname: ${hostname}, sni: ${this.dnsServerName || '无'}, type: ${type}${this.dnsServer ? `, dnsServer: ${this.dnsServer}` : ''}${this.dnsServerPort ? `:${this.dnsServerPort}` : ''}, cost: ${Date.now() - start} ms`) - } else { - log.error(`[DNS-over-${this.dnsType} '${this.dnsName}'] DNS查询错误, hostname: ${hostname}, sni: ${this.dnsServerName || '无'}, type: ${type}${this.dnsServer ? `, dnsServer: ${this.dnsServer}` : ''}${this.dnsServerPort ? `:${this.dnsServerPort}` : ''}, cost: ${Date.now() - start} ms, error:`, e) - } - reject(e) - }) - } catch (e) { - isOver = true - clearTimeout(timeoutId) - log.error(`[DNS-over-${this.dnsType} '${this.dnsName}'] DNS查询异常, hostname: ${hostname}, type: ${type}${this.dnsServer ? `, dnsServer: ${this.dnsServer}` : ''}${this.dnsServerPort ? `:${this.dnsServerPort}` : ''}, cost: ${Date.now() - start} ms, error:`, e) - reject(e) - } - }) - } -} diff --git a/packages/mitmproxy/src/lib/dns/https.js b/packages/mitmproxy/src/lib/dns/https.js deleted file mode 100644 index f9f2e23a4e..0000000000 --- a/packages/mitmproxy/src/lib/dns/https.js +++ /dev/null @@ -1,48 +0,0 @@ -const { promisify } = require('node:util') -const doh = require('dns-over-http') -const BaseDNS = require('./base') -const HttpsAgent = require('../proxy/common/ProxyHttpsAgent') -const Agent = require('../proxy/common/ProxyHttpAgent') - -const dohQueryAsync = promisify(doh.query) - -function createAgent (dnsServer) { - return new (dnsServer.startsWith('https:') ? HttpsAgent : Agent)({ - keepAlive: true, - timeout: 4000, - }) -} - -module.exports = class DNSOverHTTPS extends BaseDNS { - constructor (dnsName, cacheSize, preSetIpList, dnsServer, dnsFamily, dnsServerName) { - super(dnsServer.replace(/\s+/, ''), dnsFamily, dnsName, 'HTTPS', cacheSize, preSetIpList) - this.dnsServerName = dnsServerName - this.agent = createAgent(this.dnsServer) - } - - _dnsQueryPromise (hostname, type = 'A') { - // 请求参数 - const options = { - url: this.dnsServer, - agent: this.agent, - } - if (this.dnsServerName) { - // 设置SNI - options.servername = this.dnsServerName - options.rejectUnauthorized = false - } - if (this.dnsFamily === 6) { - options.family = 6 - } - - // DNS查询参数 - const questions = [ - { - type, - name: hostname, - }, - ] - - return dohQueryAsync(options, questions) - } -} diff --git a/packages/mitmproxy/src/lib/dns/index.js b/packages/mitmproxy/src/lib/dns/index.js deleted file mode 100644 index d1fddb640e..0000000000 --- a/packages/mitmproxy/src/lib/dns/index.js +++ /dev/null @@ -1,136 +0,0 @@ -const matchUtil = require('../../utils/util.match') -const ipUtil = require('./util.ip') -const log = require('../../utils/util.log.server') -const DNSOverPreSetIpList = require('./preset.js') -const DNSOverHTTPS = require('./https.js') -const DNSOverTLS = require('./tls.js') -const DNSOverTCP = require('./tcp.js') -const DNSOverUDP = require('./udp.js') - -module.exports = { - initDNS (dnsProviders, preSetIpList) { - const dnsMap = {} - - // 创建普通的DNS - for (const provider in dnsProviders) { - const conf = dnsProviders[provider] - - // 获取DNS服务器 - let server = conf.server || conf.host - if (server != null) { - server = server.replace(/\s+/, '') - } - if (!server) { - continue - } - - // 获取DNS类型 - let type = conf.type - if (type == null) { - if (server.startsWith('https://') || server.startsWith('http://')) { - type = 'https' - } else if (server.startsWith('tls://') || server.startsWith('dot://')) { - type = 'tls' - } else if (server.startsWith('tcp://')) { - type = 'tcp' - } else if (server.includes('://') && !server.startsWith('udp://')) { - throw new Error(`Unknown type DNS: ${server}, provider: ${provider}`) - } else { - type = 'udp' - } - } else { - type = type.replace(/\s+/, '').toLowerCase() - } - - // 获取DNS的Family值 - const family = conf.family - - // 创建DNS对象 - if (type === 'https' || type === 'doh' || type === 'dns-over-https') { - if (!server.includes('/')) { - server = `https://${server}/dns-query` - } - - // 基于 https - dnsMap[provider] = new DNSOverHTTPS(provider, conf.cacheSize, preSetIpList, server, family, conf.sni || conf.servername) - } else { - // 获取DNS端口 - let port = conf.port - - // 处理带协议的DNS服务地址 - if (server.includes('://')) { - server = server.split('://')[1] - } - // 处理带端口的DNS服务地址 - if (port == null && server.includes(':')) { - // 判断是否为IPv6并带端口号 - if (server.includes(']:')) { - [server, port] = server.split(']:') - server = server.substring(1) // 移除第一个字符 `[` - } else if (!ipUtil.isIPv6(server)) { - [server, port] = server.split(':') - } - } - - // 去除host两边的中括号,因为可能是IPv6配置 - server = server.replace(/[[\]]/g, '') - - if (type === 'tls' || type === 'dot' || type === 'dns-over-tls') { - // 基于 tls - dnsMap[provider] = new DNSOverTLS(provider, conf.cacheSize, preSetIpList, server, port, family, conf.sni || conf.servername) - } else if (type === 'tcp') { - // 基于 tcp - dnsMap[provider] = new DNSOverTCP(provider, conf.cacheSize, preSetIpList, server, port, family) - } else { - // 基于 udp - dnsMap[provider] = new DNSOverUDP(provider, conf.cacheSize, preSetIpList, server, port, family) - } - } - - if (conf.forSNI || conf.forSni) { - dnsMap.ForSNI = dnsMap[provider] - } - } - - // 创建预设IP的DNS - dnsMap.PreSet = new DNSOverPreSetIpList(preSetIpList) - if (dnsMap.ForSNI == null) { - dnsMap.ForSNI = dnsMap.PreSet - } - - log.info(`设置SNI默认使用的DNS为 '${dnsMap.ForSNI.dnsName}'(注:当某个域名配置了SNI但未配置DNS时,将默认使用该DNS)`) - - return dnsMap - }, - getDNSAndFamily (dnsConfig, hostname) { - // 1. 匹配 预设IP配置 - const hostnamePreSetIpList = matchUtil.matchHostname(dnsConfig.preSetIpList, hostname, 'matched preSetIpList(getDNSAndFamily)') - if (hostnamePreSetIpList) { - return { - dns: dnsConfig.dnsMap.PreSet, - } - } - - // 2. 读取域名对应的DNS配置 - const dnsData = matchUtil.matchHostname(dnsConfig.mapping, hostname, 'get dns data') - if (!dnsData) { - return null - } - - // 由于DNS中的usa已重命名为cloudflare,所以做以下处理,为了向下兼容 - let dns - if (dnsData.dnsName === 'usa' && dnsConfig.dnsMap.usa == null && dnsConfig.dnsMap.cloudflare != null) { - dns = dnsConfig.dnsMap.cloudflare - } else { - dns = dnsConfig.dnsMap[dnsData.dnsName] - if (!dns) { - return null - } - } - - return { - dns, - family: dnsData.family, - } - }, -} diff --git a/packages/mitmproxy/src/lib/dns/preset.js b/packages/mitmproxy/src/lib/dns/preset.js deleted file mode 100644 index ab31c90252..0000000000 --- a/packages/mitmproxy/src/lib/dns/preset.js +++ /dev/null @@ -1,11 +0,0 @@ -const BaseDNS = require('./base') - -module.exports = class DNSOverPreSetIpList extends BaseDNS { - constructor (preSetIpList) { - super(null, null, 'PreSet', 'PreSet', null, preSetIpList) - } - - async _lookup (_hostname, _options) { - return [] - } -} diff --git a/packages/mitmproxy/src/lib/dns/tcp.js b/packages/mitmproxy/src/lib/dns/tcp.js deleted file mode 100644 index 8961d37609..0000000000 --- a/packages/mitmproxy/src/lib/dns/tcp.js +++ /dev/null @@ -1,53 +0,0 @@ -const net = require('node:net') -const { Buffer } = require('node:buffer') -const dnsPacket = require('dns-packet') -const randi = require('random-int') -const BaseDNS = require('./base') - -const defaultPort = 53 // TCP类型的DNS服务默认端口号 - -module.exports = class DNSOverTCP extends BaseDNS { - constructor (dnsName, cacheSize, preSetIpList, dnsServer, dnsServerPort, dnsFamily) { - super(dnsServer.replace(/\s+/, ''), dnsFamily, dnsName, 'TCP', cacheSize, preSetIpList) - this.dnsServerPort = Number.parseInt(dnsServerPort) || defaultPort - } - - _dnsQueryPromise (hostname, type = 'A') { - return new Promise((resolve, reject) => { - // 构造 DNS 查询报文 - const packet = dnsPacket.encode({ - flags: dnsPacket.RECURSION_DESIRED, - type: 'query', - id: randi(0x0, 0xFFFF), - questions: [{ - type, - name: hostname, - }], - }) - - // --- TCP 查询 --- - const tcpClient = net.createConnection({ - host: this.dnsServer, - port: this.dnsServerPort, - family: this.dnsFamily, - }, () => { - // TCP DNS 报文前需添加 2 字节长度头 - const lengthBuffer = Buffer.alloc(2) - lengthBuffer.writeUInt16BE(packet.length) - tcpClient.write(Buffer.concat([lengthBuffer, packet])) - }) - - tcpClient.once('data', (data) => { - const length = data.readUInt16BE(0) - const response = dnsPacket.decode(data.subarray(2, 2 + length)) - resolve(response) - tcpClient.end() - }) - - tcpClient.once('error', (err) => { - reject(err) - tcpClient.end() - }) - }) - } -} diff --git a/packages/mitmproxy/src/lib/dns/tls.js b/packages/mitmproxy/src/lib/dns/tls.js deleted file mode 100644 index 84b6ca6103..0000000000 --- a/packages/mitmproxy/src/lib/dns/tls.js +++ /dev/null @@ -1,30 +0,0 @@ -const dnstls = require('./util/dns-over-tls') -const BaseDNS = require('./base') - -const defaultPort = 853 - -module.exports = class DNSOverTLS extends BaseDNS { - constructor (dnsName, cacheSize, preSetIpList, dnsServer, dnsServerPort, dnsFamily, dnsServerName) { - super(dnsServer.replace(/\s+/, ''), dnsFamily, dnsName, 'TLS', cacheSize, preSetIpList) - this.dnsServerPort = Number.parseInt(dnsServerPort) || defaultPort - this.dnsServerName = dnsServerName - } - - _dnsQueryPromise (hostname, type = 'A') { - const options = { - host: this.dnsServer, - port: this.dnsServerPort, - servername: this.dnsServerName || this.dnsServer, - family: this.dnsFamily, - rejectUnauthorized: !this.dnsServerName, - - name: hostname, - klass: 'IN', - type, - - timeout: 4000, - } - - return dnstls.query(options) - } -} diff --git a/packages/mitmproxy/src/lib/dns/udp.js b/packages/mitmproxy/src/lib/dns/udp.js deleted file mode 100644 index 3a1f3f2726..0000000000 --- a/packages/mitmproxy/src/lib/dns/udp.js +++ /dev/null @@ -1,62 +0,0 @@ -const dgram = require('node:dgram') -const dnsPacket = require('dns-packet') -const randi = require('random-int') -const BaseDNS = require('./base') - -const defaultPort = 53 // UDP类型的DNS服务默认端口号 - -module.exports = class DNSOverUDP extends BaseDNS { - constructor (dnsName, cacheSize, preSetIpList, dnsServer, dnsServerPort, dnsFamily) { - super(dnsServer.replace(/\s+/, ''), dnsFamily, dnsName, 'UDP', cacheSize, preSetIpList) - this.dnsServerPort = Number.parseInt(dnsServerPort) || defaultPort - - this.socketType = this.dnsFamily === 6 ? 'udp6' : 'udp4' - } - - _dnsQueryPromise (hostname, type = 'A') { - return new Promise((resolve, reject) => { - let isOver = false - const timeout = 5000 - let timeoutId = null - - // 构造 DNS 查询报文 - const packet = dnsPacket.encode({ - flags: dnsPacket.RECURSION_DESIRED, - type: 'query', - id: randi(0x0, 0xFFFF), - questions: [{ - type, - name: hostname, - }], - }) - - // 创建客户端 - const udpClient = dgram.createSocket(this.socketType, (msg, _rinfo) => { - isOver = true - clearTimeout(timeoutId) - - const response = dnsPacket.decode(msg) - resolve(response) - udpClient.close() - }) - - // 发送 UDP 查询 - udpClient.send(packet, 0, packet.length, this.dnsServerPort, this.dnsServer, (err, _bytes) => { - if (err) { - isOver = true - clearTimeout(timeoutId) - reject(err) - udpClient.close() - } - }) - - // 设置超时任务 - timeoutId = setTimeout(() => { - if (!isOver) { - reject(new Error('DNS查询超时')) - udpClient.close() - } - }, timeout) - }) - } -} diff --git a/packages/mitmproxy/src/lib/dns/util.ip.js b/packages/mitmproxy/src/lib/dns/util.ip.js deleted file mode 100644 index 3e70458f00..0000000000 --- a/packages/mitmproxy/src/lib/dns/util.ip.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - - isIPv6 (str) { - // 如果含[],则肯定是IPv6 - if (str.includes('[')) { - return true - } - - // 标准宽松 IPv6 正则 - const ipv6Pattern = /^(?:(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:|(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,5}(?::[0-9a-fA-F]{1,4}){1,2}|(?:[0-9a-fA-F]{1,4}:){1,4}(?::[0-9a-fA-F]{1,4}){1,3}|(?:[0-9a-fA-F]{1,4}:){1,3}(?::[0-9a-fA-F]{1,4}){1,4}|(?:[0-9a-fA-F]{1,4}:){1,2}(?::[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:(?::[0-9a-fA-F]{1,4}){1,6}|:(?:(?::[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(?::[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(?:ffff(?::0{1,4})?:)?(?:(?:25[0-5]|(?:2[0-4]|1?\d)?\d)\.){3}(?:25[0-5]|(?:2[0-4]|1?\d)?\d)|(?:[0-9a-fA-F]{1,4}:){1,4}:(?:(?:25[0-5]|(?:2[0-4]|1?\d)?\d)\.){3}(?:25[0-5]|(?:2[0-4]|1?\d)?\d))$/ - return ipv6Pattern.test(str.trim()) - }, - -} diff --git a/packages/mitmproxy/src/lib/dns/util/dns-over-tls.js b/packages/mitmproxy/src/lib/dns/util/dns-over-tls.js deleted file mode 100644 index fceea18b32..0000000000 --- a/packages/mitmproxy/src/lib/dns/util/dns-over-tls.js +++ /dev/null @@ -1,85 +0,0 @@ -/** - * 由于组件 `dns-over-tls@0.0.9` 不支持 `rejectUnauthorized` 和 `timeout` 两个参数,所以将源码复制过来,并简化了代码。 - */ -const dnsPacket = require('dns-packet') -const tls_1 = require('node:tls') -const randi = require('random-int') - -const TWO_BYTES = 2 - -function getDnsQuery ({ type, name, klass, id }) { - return { - id, - type: 'query', - flags: dnsPacket.RECURSION_DESIRED, - questions: [{ class: klass, name, type }], - } -} - -function query ({ host, servername, type, name, klass, port, family, rejectUnauthorized, timeout }) { - return new Promise((resolve, reject) => { - if (!host || !servername || !name) { - throw new Error('At least host, servername and name must be set.') - } - - let response = Buffer.alloc(0) - let packetLength = 0 - const dnsQuery = getDnsQuery({ id: randi(0x0, 0xFFFF), type, name, klass }) - const dnsQueryBuf = dnsPacket.streamEncode(dnsQuery) - const socket = tls_1.connect({ host, port, servername, family: Number.parseInt(family) === 6 ? 6 : 4, rejectUnauthorized, timeout }) - - // 超时处理 - let isFinished = false - let interval - if (timeout > 0) { - interval = setInterval(() => { - if (!isFinished) { - socket.destroy((...args) => { - console.info('socket destory callback args:', args) - }) - - reject(new Error('DNS查询超时')) - } - }, timeout) - } - - socket.on('secureConnect', () => socket.write(dnsQueryBuf)) - socket.on('data', (data) => { - if (timeout) { - isFinished = true - clearInterval(interval) - } - - try { - if (response.length === 0) { - packetLength = data.readUInt16BE(0) - if (packetLength < 12) { - reject(new Error('Below DNS minimum packet length (DNS Header is 12 bytes)')) - return - } - response = Buffer.from(data) - } else { - response = Buffer.concat([response, data]) - } - - if (response.length >= packetLength + TWO_BYTES) { - socket.destroy() - resolve(dnsPacket.streamDecode(response)) - } - } catch (e) { - socket.destroy() - reject(e) - } - }) - socket.on('error', (err) => { - if (timeout) { - isFinished = true - clearInterval(interval) - } - reject(err) - }) - }) -} - -exports.query = query -exports.default = { query } diff --git a/packages/mitmproxy/src/lib/interceptor/impl/req/OPTIONS.js b/packages/mitmproxy/src/lib/interceptor/impl/req/OPTIONS.js deleted file mode 100644 index 0cb58c3bf8..0000000000 --- a/packages/mitmproxy/src/lib/interceptor/impl/req/OPTIONS.js +++ /dev/null @@ -1,54 +0,0 @@ -const defaultAllowHeaders = '*' -const defaultAllowMethods = 'GET,POST,PUT,DELETE,HEAD,OPTIONS,PATCH' // CONNECT、TRACE被认为是不安全的请求,通常不建议允许跨域 - -function readConfig (config, defaultConfig) { - if (config) { - if (Array.isArray(config)) { - config = config.join(',') - } - } else { - config = defaultConfig - } - return config -} - -module.exports = { - name: 'options', - priority: 101, - requestIntercept (context, interceptOpt, req, res, ssl, next) { - const { rOptions, log } = context - - // 不是 OPTIONS 请求,或请求头中不含 origin 时,跳过当前拦截器 - if (rOptions.method !== 'OPTIONS' || !rOptions.headers.origin) { - return - } - - // 从请求头中获取跨域相关信息;如果不存在,则从配置中获取的值;如果还不存在,则使用默认值 - const allowHeaders = rOptions.headers['access-control-request-headers'] || readConfig(interceptOpt.optionsAllowHeaders, defaultAllowHeaders) - const allowMethods = rOptions.headers['access-control-request-method'] || readConfig(interceptOpt.optionsAllowMethods, defaultAllowMethods) - - const headers = { - // 允许跨域 - 'DS-Interceptor': 'options', - 'Access-Control-Allow-Origin': rOptions.headers.origin, - 'Access-Control-Allow-Headers': allowHeaders, - 'Access-Control-Allow-Methods': allowMethods, - 'Access-Control-Max-Age': interceptOpt.optionsMaxAge > 0 ? interceptOpt.optionsMaxAge : 2592000, // 默认有效一个月 - 'Date': new Date().toUTCString(), - } - - // 判断是否允许 - if (interceptOpt.optionsCredentials !== false && interceptOpt.optionsCredentials !== 'false') { - headers['Access-Control-Allow-Credentials'] = 'true' - } - - res.writeHead(200, headers) - res.end() - - log.info('options intercept:', (rOptions.original || rOptions).url) - return true // true代表请求结束 - }, - is (interceptOpt) { - return !!interceptOpt.options - }, -} diff --git a/packages/mitmproxy/src/lib/interceptor/impl/req/abort.js b/packages/mitmproxy/src/lib/interceptor/impl/req/abort.js deleted file mode 100644 index 2c6b094157..0000000000 --- a/packages/mitmproxy/src/lib/interceptor/impl/req/abort.js +++ /dev/null @@ -1,86 +0,0 @@ -module.exports = { - name: 'abort', - priority: 103, - requestIntercept (context, interceptOpt, req, res, ssl, next) { - const { rOptions, log } = context - - if (interceptOpt.abort === true || interceptOpt.abort === 'true') { - const headers = { - 'Content-Type': 'text/plain; charset=utf-8', - 'DS-Interceptor': 'abort', - } - - // headers.Access-Control-Allow-*:避免跨域问题 - if (rOptions.headers.origin) { - headers['Access-Control-Allow-Credentials'] = 'true' - headers['Access-Control-Allow-Origin'] = rOptions.headers.origin - } - - res.writeHead(403, headers) - res.write( - 'DevSidecar 403: Request abort.\n\n' - + ' This request is matched by abort intercept.\n\n' - + ' 因配置abort拦截器,本请求直接返回403禁止访问。', - ) - res.end() - - const url = `${rOptions.method} ➜ ${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${req.url}` - log.info('abort intercept:', url) - return true // true代表请求结束 - } else { - const response = interceptOpt.abort - - // status - const status = response.status || 403 - - // body - const body = response.html || response.json || response.script || response.css || response.text || response.body - || `DevSidecar ${status}: Request abort.\n\n` - + ' This request is matched by abort intercept.\n\n' - + ` 因配置abort拦截器,本请求直接返回${status}禁止访问。` - - // headers:浅拷贝配置中的 headers,避免将 origin 等请求级数据写入共享的拦截器配置对象 - const headers = { ...(response.headers || {}) } - headers['DS-Interceptor'] = 'abort' - // headers.Content-Type - if (status !== 204) { - // (1)如果没有Content-Type,根据response的内容自动设置 - if (!headers['Content-Type']) { - if (response.html != null) { - headers['Content-Type'] = 'text/html' - } else if (response.json != null) { - headers['Content-Type'] = 'application/json' - } else if (response.script != null) { - headers['Content-Type'] = 'application/javascript' - } else if (response.css != null) { - headers['Content-Type'] = 'text/css' - } else { - headers['Content-Type'] = 'text/plain' - } - } - // (2)如果Content-Type没有charset,自动设置为utf-8 - if (headers['Content-Type'] != null && !headers['Content-Type'].includes('charset')) { - headers['Content-Type'] += '; charset=utf-8' - } - } - // headers.Access-Control-Allow-*:避免跨域问题 - if (rOptions.headers.origin && !headers['Access-Control-Allow-Origin']) { - headers['Access-Control-Allow-Credentials'] = 'true' - headers['Access-Control-Allow-Origin'] = rOptions.headers.origin - } - - res.writeHead(status, headers) - if (status !== 204) { - res.write(body) - } - res.end() - - const url = `${rOptions.method} ➜ ${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${req.url}` - log.info('abort intercept:', url, ', response:', JSON.stringify(response)) - return true // true代表请求结束 - } - }, - is (interceptOpt) { - return !!interceptOpt.abort - }, -} diff --git a/packages/mitmproxy/src/lib/interceptor/impl/req/baiduOcr.js b/packages/mitmproxy/src/lib/interceptor/impl/req/baiduOcr.js deleted file mode 100644 index ee9f9b3661..0000000000 --- a/packages/mitmproxy/src/lib/interceptor/impl/req/baiduOcr.js +++ /dev/null @@ -1,203 +0,0 @@ -function getTomorrow () { - const now = new Date() - const tomorrow = new Date(now) - - // 设置日期为明天 - tomorrow.setDate(now.getDate() + 1) - // 重置时间为凌晨 0 点 0 分 0 秒 - tomorrow.setHours(0, 0, 0, 0) - - return tomorrow.getTime() -} -// function getNextMonth () { -// const now = new Date() -// const currentYear = now.getFullYear() -// const currentMonth = now.getMonth() -// -// // 如果当前月份是12月,年份增加1,并且月份设为0(1月) -// const nextMonth = (currentMonth + 1) % 12 -// const nextYear = nextMonth === 0 ? currentYear + 1 : currentYear -// -// return new Date(nextYear, nextMonth, 1, 0, 0, 0, 0).getTime() -// } - -const AipOcrClient = require('baidu-aip-sdk').ocr - -const AipOcrClientMap = {} -const apis = [ - 'accurateBasic', // 调用通用文字识别(高精度版) - 'accurate', // 调用通用文字识别(含位置高精度版) - 'handwriting', // 手写文字识别 -] -const limitMap = {} - -function createBaiduOcrClient (config) { - const key = config.id - if (AipOcrClientMap[key]) { - return AipOcrClientMap[key] - } - const client = new AipOcrClient(config.id, config.ak, config.sk) - AipOcrClientMap[key] = client - return client -} - -let count = 0 - -function getConfig (interceptOpt, tryCount, log) { - tryCount = tryCount || 1 - - let config - if (Array.isArray(interceptOpt.baiduOcr) && interceptOpt.baiduOcr.length > 0) { - config = interceptOpt.baiduOcr[count++ % interceptOpt.baiduOcr.length] - - if (tryCount < interceptOpt.baiduOcr.length) { - if (!config || !config.id || !config.ak || !config.sk) { - return getConfig(interceptOpt, tryCount + 1, log) // 递归找到有效的配置 - } - } - - // 避免count值过大,造成问题 - if (count >= 100000) { - count = 0 - } - } else { - config = interceptOpt.baiduOcr - tryCount = null // 将tryCount设置为null代表只有一个配置 - } - - if (!config || !config.id || !config.ak || !config.sk) { - return null // 没有配置或配置错误,直接返回null - } - - // 选择当前配置可用的API。 - // 注意:不将结果写入共享的 config 对象,而是作为局部变量返回,避免并发请求互相覆盖。 - let selectedApi = null - for (let i = 0; i < apis.length; i++) { - const api = apis[i] - if (!checkIsLimitConfig(config.id, api)) { - selectedApi = api - break - } - log.warn(`百度云账号 ${config.id} 的接口 ${api} 已超出限额`) - } - - // 如果当前配置的所有API均不可用,则返回null - if (selectedApi == null) { - if (tryCount == null) { - return null // 只配置了一个账号,没有更多账号可以选择了,直接返回null - } else { - if (tryCount < interceptOpt.baiduOcr.length) { - // 递归找到有效的配置 - return getConfig(interceptOpt, tryCount + 1, log) - } else { - return null - } - } - } - - return { config, api: selectedApi } -} - -function limitConfig (id, api) { - const key = `${id}_${api}` - limitMap[key] = getTomorrow() - // limitMap[key] = Date.now() + 5000 // 测试用,5秒后解禁 -} - -function checkIsLimitConfig (id, api) { - const key = `${id}_${api}` - const limitTime = limitMap[key] - return limitTime && limitTime > Date.now() -} - -module.exports = { - name: 'baiduOcr', - priority: 131, - requestIntercept (context, interceptOpt, req, res, ssl, next) { - const { rOptions, log } = context - - const headers = { - 'Content-Type': 'application/json; charset=utf-8', - } - - if (rOptions.headers.origin) { - headers['Access-Control-Allow-Credentials'] = 'true' - headers['Access-Control-Allow-Origin'] = rOptions.headers.origin - } - - // 获取配置(api 由 getConfig 以局部变量形式返回,不写入共享配置对象,并发安全) - const configResult = getConfig(interceptOpt, null, log) - if (!configResult) { - res.writeHead(200, headers) - res.write('{"error_code": 99917, "error_msg": "dev-sidecar中,未配置百度云账号,或所有百度云账号的免费额度都已用完!!!"}') - res.end() - return true - } - let { config, api } = configResult - api = api || apis[0] - - if (!config.id || !config.ak || !config.sk) { - res.writeHead(200, headers) - res.write('{"error_code": 999500, "error_msg": "dev-sidecar中,baiduOcr的 id 或 ak 或 sk 配置为空"}') - res.end() - return true - } - - headers['DS-Interceptor'] = `baiduOcr: id=${config.id}, api=${api}, account=${config.account}` - - // 获取图片的base64编码 - let imageBase64 = rOptions.path.substring(rOptions.path.indexOf('?') + 1) - if (!imageBase64) { - res.writeHead(200, headers) - res.write('{"error_code": 999400, "error_msg": "图片Base64参数为空"}') - res.end() - return true - } - imageBase64 = decodeURIComponent(imageBase64) - - // 调用百度云 "文字识别" 相关接口,根据 `api` 调用不同的接口 - const client = createBaiduOcrClient(config) - const options = { - recognize_granularity: 'big', - detect_direction: 'false', - paragraph: 'false', - probability: 'false', - ...(config.options || {}), - } - log.info('发起百度ocr请求', req.hostname) - client[api](imageBase64, options).then((result) => { - if (result.error_code != null) { - log.error('baiduOcr error:', result) - if (result.error_code === 17) { - // 当前百度云账号,达到当日调用次数上限 - limitConfig(config.id, api) - log.error(`当前百度云账号的接口 ${api},已达到当日调用次数上限,暂时禁用它,明天会自动放开:`, config) - } - } else { - log.info('baiduOcr success:', result) - } - - res.writeHead(200, headers) - res.write(JSON.stringify(result)) // 格式如:{"words_result":[{"words":"6525"}],"words_result_num":1,"log_id":1818877093747960000} - res.end() - if (next) { - next() // 异步执行完继续next - } - }).catch((err) => { - log.error('baiduOcr error:', err) - res.writeHead(200, headers) - res.write(`{"error_code": 999500, "error_msg": "${err}"}`) // 格式如:{"words_result":[{"words":"6525"}],"words_result_num":1,"log_id":1818877093747960000} - res.end() - if (next) { - next() // 异步执行完继续next - } - }) - - log.info('proxy baiduOcr: hostname:', req.hostname) - - return 'no-next' - }, - is (interceptOpt) { - return !!interceptOpt.baiduOcr - }, -} diff --git a/packages/mitmproxy/src/lib/interceptor/impl/req/cacheRequest.js b/packages/mitmproxy/src/lib/interceptor/impl/req/cacheRequest.js deleted file mode 100644 index 9bf200e0fb..0000000000 --- a/packages/mitmproxy/src/lib/interceptor/impl/req/cacheRequest.js +++ /dev/null @@ -1,110 +0,0 @@ -// 提前编译,避免在 getLastModifiedTimeFromIfModifiedSince 中重复创建 RegExp 对象 -const PURE_NUMBER_RE = /^\s*\d+\s*$/ - -function getMaxAge (interceptOpt) { - // 秒 - if (interceptOpt.cacheSeconds > 0 || interceptOpt.cacheMaxAge > 0 || interceptOpt.cache > 0) { - return interceptOpt.cacheSeconds || interceptOpt.cacheMaxAge || interceptOpt.cache - } - // 分钟 - if (interceptOpt.cacheMinutes > 0) { - return interceptOpt.cacheMinutes * 60 // 60:1分钟 - } - // 小时 - if (interceptOpt.cacheHours > 0) { - return interceptOpt.cacheHours * 3600 // 60 * 60 一小时 - } - // 天 - if (interceptOpt.cacheDays > 0) { - return interceptOpt.cacheDays * 86400 // 60 * 60 * 24 一天 - } - // 星期 - if (interceptOpt.cacheWeeks > 0) { - return interceptOpt.cacheWeeks * 604800 // 60 * 60 * 24 * 7 一周 - } - // 月 - if (interceptOpt.cacheMonths > 0) { - return interceptOpt.cacheMonths * 2592000 // 60 * 60 * 24 * 30 一个月 - } - // 年 - if (interceptOpt.cacheYears > 0) { - return interceptOpt.cacheYears * 31536000 // 60 * 60 * 24 * 365 一年 - } - - return null -} - -// 获取 lastModifiedTime 的方法 -function getLastModifiedTimeFromIfModifiedSince (rOptions, log) { - // 获取 If-Modified-Since 用于判断是否命中缓存 - const lastModified = rOptions.headers['if-modified-since'] - if (lastModified == null || lastModified.length === 0) { - return null // 没有lastModified,返回null - } - - // 优先尝试作为纯数字时间戳(毫秒)解析,避免 new Date() 将其当作无效日期而返回 NaN - if (PURE_NUMBER_RE.test(lastModified)) { - return Number.parseInt(lastModified, 10) - } - - // 再尝试作为日期字符串解析 - const time = new Date(lastModified).getTime() - if (Number.isNaN(time)) { - log.warn(`cache intercept: 解析 if-modified-since 失败: '${lastModified}'`) - return null - } - - return time -} - -module.exports = { - name: 'cacheRequest', - priority: 104, - requestIntercept (context, interceptOpt, req, res, ssl, next) { - const { rOptions, log } = context - - if (rOptions.method !== 'GET') { - return // 非GET请求,不拦截 - } - - // 获取 Cache-Control 用于判断是否禁用缓存 - const cacheControl = rOptions.headers['cache-control'] - if (cacheControl && (cacheControl.includes('no-cache') || cacheControl.includes('no-store'))) { - return // 当前请求指定要禁用缓存,跳过当前拦截器 - } - // 获取 Pragma 用于判断是否禁用缓存 - const pragma = rOptions.headers.pragma - if (pragma && (pragma.includes('no-cache') || pragma.includes('no-store'))) { - return // 当前请求指定要禁用缓存,跳过当前拦截器 - } - - // 最近编辑时间 - const lastModifiedTime = getLastModifiedTimeFromIfModifiedSince(rOptions, log) - if (lastModifiedTime == null) { - return // 没有 lastModified,不拦截 - } - - // 获取maxAge配置 - const maxAge = getMaxAge(interceptOpt) - // 判断缓存是否已过期 - const passTime = Date.now() - lastModifiedTime - if (passTime > maxAge * 1000) { - return // 缓存已过期,不拦截 - } - - // 缓存未过期,直接拦截请求并响应304 - res.writeHead(304, { - 'DS-Interceptor': `cache: ${maxAge}`, - }) - res.end() - - const url = `${rOptions.method} ➜ ${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${req.url}` - log.info('cache intercept:', url) - return true - }, - is (interceptOpt) { - const maxAge = getMaxAge(interceptOpt) - return maxAge != null && maxAge > 0 - }, - getMaxAge, -} diff --git a/packages/mitmproxy/src/lib/interceptor/impl/req/proxy.js b/packages/mitmproxy/src/lib/interceptor/impl/req/proxy.js deleted file mode 100644 index 236551aa16..0000000000 --- a/packages/mitmproxy/src/lib/interceptor/impl/req/proxy.js +++ /dev/null @@ -1,166 +0,0 @@ -const URL = require('node:url') - -const PLACEHOLDER_RE = /\$\{[^}]+\}/g - -function replacePlaceholder0 (url, matched, pre) { - if (matched) { - for (let i = 0; i < matched.length; i++) { - url = url.replace(`\${${pre}[${i}]}`, matched[i] || '') - } - if (matched.groups) { - for (const key in matched.groups) { - url = url.replace(`\${${key}}`, matched.groups[key] || '') - } - } - } - return url -} - -// 替换占位符 -function replacePlaceholder (url, rOptions, pathMatched, hostnameMatched) { - if (url.includes('${')) { - // eslint-disable-next-line no-template-curly-in-string - url = url.replace('${host}', rOptions.hostname) - - if (url.includes('${')) { - url = replacePlaceholder0(url, pathMatched, 'p') - url = replacePlaceholder0(url, hostnameMatched, 'h') - } - - // 移除多余的占位符 - if (url.includes('${')) { - url = url.replace(PLACEHOLDER_RE, '') - } - } - - return url -} - -function buildTargetUrl (rOptions, urlConf, interceptOpt, matched, hostnameMatched) { - let targetUrl - if (interceptOpt && interceptOpt.replace) { - const regexp = interceptOpt.compiledRegexp || (interceptOpt.compiledRegexp = new RegExp(interceptOpt.replace)) - targetUrl = rOptions.path.replace(regexp, urlConf) - } else if (urlConf.indexOf('http:') === 0 || urlConf.indexOf('https:') === 0) { - targetUrl = urlConf - } else { - let uri = rOptions.path - if (uri.indexOf('http:') === 0 || uri.indexOf('https:') === 0) { - // eslint-disable-next-line node/no-deprecated-api - const urlObj = URL.parse(uri) - uri = urlObj.path - } - targetUrl = urlConf + uri - } - - // 替换占位符 - targetUrl = replacePlaceholder(targetUrl, rOptions, matched, hostnameMatched) - - // 拼接协议 - targetUrl = targetUrl.indexOf('http:') === 0 || targetUrl.indexOf('https:') === 0 ? targetUrl : `${rOptions.protocol}//${targetUrl}` - - return targetUrl -} - -function doProxy (proxyConf, rOptions, req, interceptOpt, matched, hostnameMatched) { - // 获取代理目标地址 - const proxyTarget = buildTargetUrl(rOptions, proxyConf, interceptOpt, matched, hostnameMatched) - - // 替换rOptions的属性 - // eslint-disable-next-line node/no-deprecated-api - const urlObj = URL.parse(proxyTarget) - - // 备份原始请求参数,不包含 agent 和 headers(agent 是共享单例,headers 在代理转发时会被改写) - const { agent: _agent, headers: _headers, ...original } = rOptions - rOptions.original = original - - rOptions.protocol = urlObj.protocol - rOptions.hostname = urlObj.hostname - rOptions.host = urlObj.host - rOptions.headers.host = urlObj.host - rOptions.path = urlObj.path - if (urlObj.port) { - rOptions.port = Number.parseInt(urlObj.port) - } else { - rOptions.port = rOptions.protocol === 'https:' ? 443 : 80 - } - - return proxyTarget -} - -module.exports = { - name: 'proxy', - priority: 121, - replacePlaceholder, - buildTargetUrl, - doProxy, - requestIntercept (context, interceptOpt, req, res, ssl, next, matched, hostnameMatched) { - const { rOptions, log, RequestCounter } = context - - const originHostname = rOptions.hostname - - let proxyConf = interceptOpt.proxy - if (RequestCounter && interceptOpt.backup && interceptOpt.backup.length > 0) { - // 优选逻辑 - const backupList = [proxyConf] - for (const bk of interceptOpt.backup) { - backupList.push(bk) - } - const key = `${rOptions.hostname}/${interceptOpt.key}` - const count = RequestCounter.getOrCreate(key, backupList) - if (count.value == null) { - count.doRank() - } - if (count.value == null) { - log.error('`count.value` is null, the count:', count) - } else { - count.doCount(count.value) - proxyConf = count.value - context.requestCount = { - key, - value: count.value, - count, - } - } - } - - // 替换 rOptions 中的地址,并返回代理目标地址 - const proxyTarget = doProxy(proxyConf, rOptions, req, interceptOpt, matched, hostnameMatched) - - if (context.requestCount) { - log.info('proxy choice:', JSON.stringify(context.requestCount)) - } - - if (interceptOpt.sni) { - let unVerifySsl = rOptions.agent && rOptions.agent.options.rejectUnauthorized === false - - rOptions.servername = interceptOpt.sni - if (rOptions.agent && rOptions.agent.options.rejectUnauthorized && rOptions.agent.unVerifySslAgent) { - // rOptions.agent.options.rejectUnauthorized = false // 不能直接在agent上进行修改属性值,因为它采用了单例模式,所有请求共用这个对象的 - rOptions.agent = rOptions.agent.unVerifySslAgent - unVerifySsl = true - } - - const unVerifySslStr = unVerifySsl ? ', unVerifySsl' : '' - res.setHeader('DS-Interceptor', `proxy: ${proxyTarget}, sni: ${interceptOpt.sni}${unVerifySslStr}`) - log.info(`proxy intercept: hostname: ${originHostname}, target: ${proxyTarget}, sni replace servername: ${rOptions.servername}${unVerifySslStr}`) - } else if (interceptOpt.unVerifySsl === true) { - if (rOptions.agent && rOptions.agent.options.rejectUnauthorized && rOptions.agent.unVerifySslAgent) { - rOptions.agent = rOptions.agent.unVerifySslAgent - res.setHeader('DS-Interceptor', `proxy: ${proxyTarget}, unVerifySsl`) - log.info(`proxy intercept: hostname: ${originHostname}, target: ${proxyTarget}, unVerifySsl`) - } else { - res.setHeader('DS-Interceptor', `proxy: ${proxyTarget}, already unVerifySsl`) - log.info(`proxy intercept: hostname: ${originHostname}, target: ${proxyTarget}, already unVerifySsl`) - } - } else { - res.setHeader('DS-Interceptor', `proxy: ${proxyTarget}`) - log.info(`proxy intercept: hostname: ${originHostname}, target:${proxyTarget}`) - } - - return true - }, - is (interceptOpt) { - return !!interceptOpt.proxy - }, -} diff --git a/packages/mitmproxy/src/lib/interceptor/impl/req/redirect.js b/packages/mitmproxy/src/lib/interceptor/impl/req/redirect.js deleted file mode 100644 index 0a82ffce90..0000000000 --- a/packages/mitmproxy/src/lib/interceptor/impl/req/redirect.js +++ /dev/null @@ -1,37 +0,0 @@ -const proxyApi = require('./proxy') -const cacheRes = require('../res/cacheResponse') - -module.exports = { - name: 'redirect', - priority: 105, - requestIntercept (context, interceptOpt, req, res, ssl, next, matched, hostnameMatched) { - const { rOptions, log } = context - - // 获取重定向目标地址 - const redirect = proxyApi.buildTargetUrl(rOptions, interceptOpt.redirect, interceptOpt, matched, hostnameMatched) - - const headers = { - 'Location': redirect, - 'DS-Interceptor': 'redirect', - } - - // headers.Access-Control-Allow-*:避免跨域问题 - if (rOptions.headers.origin) { - headers['Access-Control-Allow-Credentials'] = 'true' - headers['Access-Control-Allow-Origin'] = rOptions.headers.origin - } - - // 同时使用缓存(如果配置了的话) - cacheRes.simpleHandle(interceptOpt, res) - - res.writeHead(302, headers) - res.end() - - const url = `${rOptions.method} ➜ ${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${req.url}` - log.info(`redirect intercept: ${url} ➜ ${redirect}`) - return true // true代表请求结束 - }, - is (interceptOpt) { - return interceptOpt.redirect // 如果配置中有redirect,那么这个配置是需要redirect拦截的 - }, -} diff --git a/packages/mitmproxy/src/lib/interceptor/impl/req/requestReplace.js b/packages/mitmproxy/src/lib/interceptor/impl/req/requestReplace.js deleted file mode 100644 index 3353671d3e..0000000000 --- a/packages/mitmproxy/src/lib/interceptor/impl/req/requestReplace.js +++ /dev/null @@ -1,57 +0,0 @@ -const REMOVE = '[remove]' - -const DS_DOWNLOAD_CHECK_RE = /DS_DOWNLOAD/i -const DS_DOWNLOAD_STRIP_RE = /[?&/]?DS_DOWNLOAD(=[^?&/]+)?$/i - -function replaceRequestHeaders (rOptions, headers, log) { - for (const key in headers) { - let value = headers[key] - if (value === REMOVE) { - value = null - } - - if (value) { - log.debug(`[DS-RequestReplace-Interceptor] replace '${key}': '${rOptions.headers[key.toLowerCase()]}' -> '${value}'`) - rOptions.headers[key.toLowerCase()] = value - } else if (rOptions.headers[key.toLowerCase()]) { - log.debug(`[DS-RequestReplace-Interceptor] remove '${key}': '${rOptions.headers[key.toLowerCase()]}'`) - delete rOptions.headers[key.toLowerCase()] - } - } - - log.debug(`[DS-RequestReplace-Interceptor] 最终headers: \r\n${JSON.stringify(rOptions.headers, null, '\t')}`) -} - -module.exports = { - name: 'requestReplace', - priority: 111, - requestIntercept (context, interceptOpt, req, res, ssl, next) { - const { rOptions, log } = context - - const requestReplaceConfig = interceptOpt.requestReplace - - let actions = '' - - // 替换请求头 - if (requestReplaceConfig.headers) { - replaceRequestHeaders(rOptions, requestReplaceConfig.headers, log) - actions += `${actions ? ',' : ''}headers` - } - - // 替换下载文件请求的请求地址(此功能主要是为了方便拦截配置) - // 注:要转换为下载请求,需要 responseReplace 拦截器的配合使用。 - if (requestReplaceConfig.doDownload && DS_DOWNLOAD_CHECK_RE.test(rOptions.path)) { - rOptions.doDownload = true - rOptions.path = rOptions.path.replace(DS_DOWNLOAD_STRIP_RE, '') - actions += `${actions ? ',' : ''}path:remove-DS_DOWNLOAD` - } - - res.setHeader('DS-RequestReplace-Interceptor', actions) - - const url = `${rOptions.method} ➜ ${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${req.url}` - log.info('requestReplace intercept:', url) - }, - is (interceptOpt) { - return !!interceptOpt.requestReplace - }, -} diff --git a/packages/mitmproxy/src/lib/interceptor/impl/req/sni.js b/packages/mitmproxy/src/lib/interceptor/impl/req/sni.js deleted file mode 100644 index 096cc7ce07..0000000000 --- a/packages/mitmproxy/src/lib/interceptor/impl/req/sni.js +++ /dev/null @@ -1,25 +0,0 @@ -module.exports = { - name: 'sni', - priority: 123, - requestIntercept (context, interceptOpt, req, res, ssl, next) { - const { rOptions, log } = context - - let unVerifySsl = rOptions.agent && rOptions.agent.options.rejectUnauthorized === false - - rOptions.servername = interceptOpt.sni - if (rOptions.agent && rOptions.agent.options.rejectUnauthorized && rOptions.agent.unVerifySslAgent) { - // rOptions.agent.options.rejectUnauthorized = false // 不能直接在agent上进行修改属性值,因为它采用了单例模式,所有请求共用这个对象的 - rOptions.agent = rOptions.agent.unVerifySslAgent - unVerifySsl = true - } - - const unVerifySslStr = unVerifySsl ? ', unVerifySsl' : '' - res.setHeader('DS-Interceptor', `sni: ${interceptOpt.sni}${unVerifySslStr}`) - - log.info(`sni intercept: sni replace servername: ${rOptions.hostname} ➜ ${rOptions.servername}${unVerifySslStr}`) - return true - }, - is (interceptOpt) { - return !!interceptOpt.sni && !interceptOpt.proxy // proxy生效时,sni不需要生效,因为proxy中也会使用sni覆盖 rOptions.servername - }, -} diff --git a/packages/mitmproxy/src/lib/interceptor/impl/req/success.js b/packages/mitmproxy/src/lib/interceptor/impl/req/success.js deleted file mode 100644 index a98dd0c293..0000000000 --- a/packages/mitmproxy/src/lib/interceptor/impl/req/success.js +++ /dev/null @@ -1,94 +0,0 @@ -const cacheRes = require('../res/cacheResponse') - -module.exports = { - name: 'success', - priority: 102, - requestIntercept (context, interceptOpt, req, res, ssl, next) { - const { rOptions, log } = context - - if (interceptOpt.success === true || interceptOpt.success === 'true') { - const headers = { - 'Content-Type': 'text/plain; charset=utf-8', - 'DS-Interceptor': 'success', - } - - // headers.Access-Control-Allow-*:避免跨域问题 - if (rOptions.headers.origin) { - headers['Access-Control-Allow-Credentials'] = 'true' - headers['Access-Control-Allow-Origin'] = rOptions.headers.origin - } - - // 同时使用缓存(如果配置了的话) - cacheRes.simpleHandle(interceptOpt, res) - - res.writeHead(200, headers) - res.write( - 'DevSidecar 200: Request success.\n\n' - + ' This request is matched by success intercept.\n\n' - + ' 因配置success拦截器,本请求直接返回200成功。', - ) - res.end() - - const url = `${rOptions.method} ➜ ${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${req.url}` - log.info('success intercept:', url) - return true // true代表请求结束 - } else { - const response = interceptOpt.success - - // status - const status = response.status || 200 - - // body - const body = response.html || response.json || response.script || response.css || response.text || response.body - || `DevSidecar ${status}: Request success.\n\n` - + ' This request is matched by success intercept.\n\n' - + ` 因配置success拦截器,本请求直接返回${status}成功。` - - // headers:浅拷贝配置中的 headers,避免将 origin 等请求级数据写入共享的拦截器配置对象 - const headers = { ...(response.headers || {}) } - headers['DS-Interceptor'] = 'success' - // headers.Content-Type - if (status !== 204) { - // (1)如果没有Content-Type,根据response的内容自动设置 - if (!headers['Content-Type']) { - if (response.html != null) { - headers['Content-Type'] = 'text/html' - } else if (response.json != null) { - headers['Content-Type'] = 'application/json' - } else if (response.script != null) { - headers['Content-Type'] = 'application/javascript' - } else if (response.css != null) { - headers['Content-Type'] = 'text/css' - } else { - headers['Content-Type'] = 'text/plain' - } - } - // (2)如果Content-Type没有charset,自动设置为utf-8 - if (headers['Content-Type'] != null && !headers['Content-Type'].includes('charset')) { - headers['Content-Type'] += '; charset=utf-8' - } - } - // headers.Access-Control-Allow-*:避免跨域问题 - if (rOptions.headers.origin && !headers['Access-Control-Allow-Origin']) { - headers['Access-Control-Allow-Credentials'] = 'true' - headers['Access-Control-Allow-Origin'] = rOptions.headers.origin - } - - // 同时使用缓存(如果配置了的话) - cacheRes.simpleHandle(interceptOpt, res) - - res.writeHead(status, headers) - if (status !== 204) { - res.write(body) - } - res.end() - - const url = `${rOptions.method} ➜ ${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${req.url}` - log.info('success intercept:', url, ', response:', JSON.stringify(response)) - return true // true代表请求结束 - } - }, - is (interceptOpt) { - return !!interceptOpt.success - }, -} diff --git a/packages/mitmproxy/src/lib/interceptor/impl/req/unVerifySsl.js b/packages/mitmproxy/src/lib/interceptor/impl/req/unVerifySsl.js deleted file mode 100644 index fc29afc0a2..0000000000 --- a/packages/mitmproxy/src/lib/interceptor/impl/req/unVerifySsl.js +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = { - name: 'unVerifySsl', - priority: 124, - requestIntercept (context, interceptOpt, req, res, ssl, next) { - const { rOptions, log } = context - - if (rOptions.agent && rOptions.agent.options.rejectUnauthorized && rOptions.agent.unVerifySslAgent) { - rOptions.agent = rOptions.agent.unVerifySslAgent - log.info(`unVerifySsl intercept: ${rOptions.hostname}, unVerifySsl`) - res.setHeader('DS-Interceptor', 'unVerifySsl') - } else { - log.info(`unVerifySsl intercept: ${rOptions.hostname}, already unVerifySsl`) - res.setHeader('DS-Interceptor', 'already unVerifySsl') - } - - return true - }, - is (interceptOpt) { - return interceptOpt.unVerifySsl === true || interceptOpt.ssl === false - }, -} diff --git a/packages/mitmproxy/src/lib/interceptor/impl/res/AfterOPTIONSHeaders.js b/packages/mitmproxy/src/lib/interceptor/impl/res/AfterOPTIONSHeaders.js deleted file mode 100644 index 55ce89c7b1..0000000000 --- a/packages/mitmproxy/src/lib/interceptor/impl/res/AfterOPTIONSHeaders.js +++ /dev/null @@ -1,31 +0,0 @@ -const responseReplaceApi = require('./responseReplace') - -module.exports = { - name: 'AfterOPTIONSHeaders', - desc: '开启了options.js功能时,正常请求时,会需要增加响应头 `Access-Control-Allow-Origin: xxx`', - priority: 201, - responseIntercept (context, interceptOpt, req, res, proxyReq, proxyRes, ssl, next) { - const { rOptions, log } = context - - if (rOptions.method === 'OPTIONS' || !rOptions.headers.origin) { - return - } - - const headers = { - 'Access-Control-Allow-Credentials': 'true', - 'Access-Control-Allow-Origin': rOptions.headers.origin, - 'Cross-Origin-Resource-Policy': interceptOpt.optionsCrossPolicy || 'cross-origin', - } - - // 替换响应头 - if (responseReplaceApi.replaceResponseHeaders({ ...headers }, res, proxyRes)) { - log.info('AfterOPTIONSHeaders intercept:', JSON.stringify(headers)) - res.setHeader('DS-AfterOPTIONSHeaders-Interceptor', '1') - } else { - res.setHeader('DS-AfterOPTIONSHeaders-Interceptor', '0') - } - }, - is (interceptOpt) { - return !!interceptOpt.options - }, -} diff --git a/packages/mitmproxy/src/lib/interceptor/impl/res/cacheResponse.js b/packages/mitmproxy/src/lib/interceptor/impl/res/cacheResponse.js deleted file mode 100644 index a7a469f786..0000000000 --- a/packages/mitmproxy/src/lib/interceptor/impl/res/cacheResponse.js +++ /dev/null @@ -1,123 +0,0 @@ -const cacheReq = require('../req/cacheRequest') - -const MAX_AGE_RE = /max-age=(\d+)/i - -module.exports = { - name: 'cacheResponse', - priority: 202, - responseIntercept (context, interceptOpt, req, res, proxyReq, proxyRes, ssl, next) { - const { rOptions, log } = context - - // 只有GET请求 - if (rOptions.method !== 'GET') { - return - } - - // 判断当前响应码是否不使用缓存 - if (interceptOpt.cacheExcludeStatusCodeList && interceptOpt.cacheExcludeStatusCodeList[`${proxyRes.statusCode}`]) { - return - } - - // 响应码为 200~303 时才进行缓存(可通过以下两个参数调整范围) - let minStatusCode = interceptOpt.cacheMinStatusCode || 200 - let maxStatusCode = interceptOpt.cacheMaxStatusCode || 303 - if (minStatusCode > maxStatusCode) { - const temp = minStatusCode - minStatusCode = maxStatusCode - maxStatusCode = temp - } - if (proxyRes.statusCode < minStatusCode || proxyRes.statusCode > maxStatusCode) { - // res.setHeader('DS-Cache-Response-Interceptor', `skip: 'method' or 'status' not match`) - return - } - - // 获取maxAge配置 - let maxAge = cacheReq.getMaxAge(interceptOpt) - // public 或 private - const cacheControlType = `${interceptOpt.cacheControlType || 'public'}, ` - // immutable属性 - const cacheImmutable = interceptOpt.cacheImmutable !== false && interceptOpt.cacheImmutable !== 'false' ? ', immutable' : '' - - // 获取原响应头中的cache-control、last-modified、expires - const originalHeaders = { - cacheControl: null, - lastModified: null, - expires: null, - etag: null, - } - for (let i = 0; i < proxyRes.rawHeaders.length; i += 2) { - // 尝试修改rawHeaders中的cache-control、last-modified、expires - if (proxyRes.rawHeaders[i].toLowerCase() === 'cache-control') { - originalHeaders.cacheControl = { value: proxyRes.rawHeaders[i + 1], valueIndex: i + 1 } - } else if (proxyRes.rawHeaders[i].toLowerCase() === 'last-modified') { - originalHeaders.lastModified = { value: proxyRes.rawHeaders[i + 1], valueIndex: i + 1 } - } else if (proxyRes.rawHeaders[i].toLowerCase() === 'expires') { - originalHeaders.expires = { value: proxyRes.rawHeaders[i + 1], valueIndex: i + 1 } - } else if (proxyRes.rawHeaders[i].toLowerCase() === 'etag') { - originalHeaders.etag = { value: proxyRes.rawHeaders[i + 1], valueIndex: i + 1 } - } - - // 如果已经设置了cache-control、last-modified、expires,则直接break - if (originalHeaders.cacheControl && originalHeaders.lastModified && originalHeaders.expires && originalHeaders.etag) { - break - } - } - - // 判断原max-age是否大于新max-age - if (originalHeaders.cacheControl) { - const maxAgeMatch = MAX_AGE_RE.exec(originalHeaders.cacheControl.value) - if (maxAgeMatch && Number.parseInt(maxAgeMatch[1]) > maxAge) { - if (interceptOpt.cacheImmutable !== false && !originalHeaders.cacheControl.value.includes('immutable')) { - maxAge = Number.parseInt(maxAgeMatch[1]) - } else { - const url = `${rOptions.method} ➜ ${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${req.url}` - res.setHeader('DS-Cache-Response-Interceptor', `skip: ${maxAgeMatch[1]} > ${maxAge}`) - log.info(`cache response intercept: skip: ${maxAgeMatch[1]} > ${maxAge}, url: ${url}`) - return - } - } - } - - // 替换用的头信息 - const now = new Date() - const replaceHeaders = { - cacheControl: `${cacheControlType}max-age=${maxAge + 1}${cacheImmutable}`, - lastModified: now.toUTCString(), - expires: new Date(now.getTime() + maxAge * 1000).toUTCString(), - } - // 开始替换 - // 替换cache-control - if (originalHeaders.cacheControl) { - proxyRes.rawHeaders[originalHeaders.cacheControl.valueIndex] = replaceHeaders.cacheControl - } else { - res.setHeader('Cache-Control', replaceHeaders.cacheControl) - } - // 替换last-modified - if (originalHeaders.lastModified) { - proxyRes.rawHeaders[originalHeaders.lastModified.valueIndex] = replaceHeaders.lastModified - } else { - res.setHeader('Last-Modified', replaceHeaders.lastModified) - } - // 替换expires - if (originalHeaders.expires) { - proxyRes.rawHeaders[originalHeaders.expires.valueIndex] = replaceHeaders.expires - } else { - res.setHeader('Expires', replaceHeaders.expires) - } - - res.setHeader('DS-Cache-Response-Interceptor', maxAge) - }, - is (interceptOpt) { - const maxAge = cacheReq.getMaxAge(interceptOpt) - return maxAge != null && maxAge > 0 - }, - // 简单处理方法 - simpleHandle (interceptOpt, res) { - const maxAge = cacheReq.getMaxAge(interceptOpt) - if (maxAge == null || maxAge <= 0) { - return - } - - res.setHeader('Cache-Control', `public, max-age=${maxAge + 1}, immutable`) - }, -} diff --git a/packages/mitmproxy/src/lib/interceptor/impl/res/responseReplace.js b/packages/mitmproxy/src/lib/interceptor/impl/res/responseReplace.js deleted file mode 100644 index e28504e5e2..0000000000 --- a/packages/mitmproxy/src/lib/interceptor/impl/res/responseReplace.js +++ /dev/null @@ -1,119 +0,0 @@ -const lodash = require('lodash') -const cacheReq = require('../req/cacheRequest') - -const REMOVE = '[remove]' - -const FILENAME_RE = /^.*\/([^/?]+)\/?(\?.*)?$/ - -// 替换响应头 -function replaceResponseHeaders (newHeaders, res, proxyRes) { - if (!newHeaders || lodash.isEmpty(newHeaders)) { - return null - } - - // 响应头Key统一转小写 - for (const headerKey in newHeaders) { - if (headerKey === headerKey.toLowerCase()) { - continue - } - - const value = newHeaders[headerKey] - delete newHeaders[headerKey] - newHeaders[headerKey.toLowerCase()] = value - } - - // 原先响应头 - const preHeaders = {} - - // 替换响应头 - const needDeleteKeys = [] - for (let i = 0; i < proxyRes.rawHeaders.length; i += 2) { - const headerKey = proxyRes.rawHeaders[i].toLowerCase() - - const newHeaderValue = newHeaders[headerKey] - if (newHeaderValue) { - if (newHeaderValue !== proxyRes.rawHeaders[i + 1]) { - preHeaders[headerKey] = proxyRes.rawHeaders[i + 1] // 先保存原先响应头 - if (newHeaderValue === REMOVE) { // 由于拦截配置中不允许配置null,会被删,所以配置一个 "[remove]",当作删除响应头的意思 - proxyRes.rawHeaders[i + 1] = '' - } else { - proxyRes.rawHeaders[i + 1] = newHeaderValue - } - } - needDeleteKeys.push(headerKey) - } - } - // 处理删除响应头 - for (const headerKey of needDeleteKeys) { - delete newHeaders[headerKey] - } - // 新增响应头 - for (const headerKey in newHeaders) { - const headerValue = newHeaders[headerKey] - if (headerValue == null || headerValue === REMOVE) { - continue - } - - res.setHeader(headerKey, newHeaders[headerKey]) - preHeaders[headerKey] = null // 标记原先响应头为null - } - - if (lodash.isEmpty(preHeaders)) { - return null - } - // 返回原先响应头 - return preHeaders -} - -module.exports = { - name: 'responseReplace', - priority: 203, - replaceResponseHeaders, - responseIntercept (context, interceptOpt, req, res, proxyReq, proxyRes, ssl, next) { - const { rOptions, log } = context - - if (proxyRes.statusCode !== 200) { - return - } - - const responseReplaceConfig = interceptOpt.responseReplace - - let actions = '' - - // 浅拷贝配置中的 headers - const replaceHeaders = { ...(responseReplaceConfig.headers || {}) } - - // 处理文件下载请求 - if (responseReplaceConfig.doDownload || rOptions.doDownload) { - const filename = (FILENAME_RE.exec(rOptions.path) || [])[1] || 'UNKNOWN_FILENAME' - // 设置文件下载响应头 - replaceHeaders['content-disposition'] = `attachment; filename="${encodeURIComponent(filename)}"` - // 设置文件类型 - if (replaceHeaders['content-type'] == null) { - replaceHeaders['content-type'] = 'application/octet-stream' - } - // 如果未手动配置需要缓存,则不允许使用缓存 - const maxAge = cacheReq.getMaxAge(interceptOpt) - if (maxAge == null || maxAge <= 0) { - replaceHeaders['cache-control'] = REMOVE - replaceHeaders['last-modified'] = REMOVE - replaceHeaders.expires = REMOVE - } - - actions += `${actions ? ',' : ''}download:${filename}` - } - - // 替换响应头 - if (replaceResponseHeaders(replaceHeaders, res, proxyRes)) { - actions += `${actions ? ',' : ''}headers` - } - - if (actions) { - res.setHeader('DS-ResponseReplace-Interceptor', actions) - log.info(`response intercept: ${actions}`) - } - }, - is (interceptOpt) { - return !!interceptOpt.responseReplace - }, -} diff --git a/packages/mitmproxy/src/lib/interceptor/impl/res/script.js b/packages/mitmproxy/src/lib/interceptor/impl/res/script.js deleted file mode 100644 index 6a8441ac29..0000000000 --- a/packages/mitmproxy/src/lib/interceptor/impl/res/script.js +++ /dev/null @@ -1,206 +0,0 @@ -const monkey = require('../../../monkey') -// const CryptoJs = require('crypto-js') -const lodash = require('lodash') -const log = require('../../../../utils/util.log.server') - -const SCRIPT_URL_PRE = '/____ds_script____/' // 内置脚本的请求地址前缀 -const SCRIPT_PROXY_URL_PRE = '/____ds_script_proxy____/' // 绝对地址脚本的伪脚本地址前缀 -const REMOVE = '[remove]' // 标记需要移除的头信息 - -function getScript (key, script) { - const scriptUrl = SCRIPT_URL_PRE + key - // const hash = CryptoJs.SHA256(script).toString(CryptoJs.enc.Base64) - // return `` - return `` -} -function getScriptByUrlOrPath (scriptUrlOrPath) { - return `` -} - -module.exports = { - name: 'script', - priority: 211, - responseIntercept (context, interceptOpt, req, res, proxyReq, proxyRes, ssl, next) { - const { rOptions, log, setting } = context - - // github特殊处理 - if (rOptions.hostname === 'github.com' && rOptions.headers['turbo-frame'] === 'repo-content-turbo-frame') { - return - } - - // 如果没有响应头 'content-type',或其值不是 'text/html',则不处理 - if (!proxyRes.headers['content-type'] || !proxyRes.headers['content-type'].includes('text/html')) { - res.setHeader('DS-Script-Interceptor', 'Not text/html') - return - } - - let keys = interceptOpt.script - if (typeof keys === 'string') { - keys = [keys] - } - try { - // 内置脚本列表 - const scripts = monkey.get(setting.script.dirAbsolutePath) - - let tags = '' - for (const key of keys) { - if (key === 'global' || key === 'tampermonkey') { - continue - } - - let scriptTag - - if (key.includes('/')) { - scriptTag = getScriptByUrlOrPath(key) // 1.绝对地址或相对地址(注意:当目标站点限制跨域脚本时,可使用相对地址,再结合proxy拦截器进行代理,可规避掉限制跨域脚本问题。) - } else { - const script = scripts[key] - if (script == null) { - continue - } - scriptTag = getScript(key, script.script) // 2.DS内置脚本 - } - - tags += `\r\n\t${scriptTag}` - } - - // 如果脚本为空,则不插入 - if (tags === '') { - return - } - - // 插入油猴脚本浏览器扩展 - if (typeof interceptOpt.tampermonkeyScript === 'string') { - tags = `\r\n\t${getScriptByUrlOrPath(interceptOpt.tampermonkeyScript)}${tags}` - } else { - tags = `\r\n\t${getScript('tampermonkey', scripts.tampermonkey.script)}${tags}` - } - - // github特殊处理: 增加一个假的js文件,避免github的js异步加载策略获得错误的根路径 - if (rOptions.hostname === 'github.com') { - tags += `\r\n\t${getScriptByUrlOrPath('https://github.githubassets.com/assets/fakefile.js')}` - } - - res.setHeader('DS-Script-Interceptor', 'true') - log.info(`script response intercept: insert script ${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${rOptions.path}`, ', head:', tags) - return { - head: `${tags}\r\n`, - } - } catch (err) { - try { - res.setHeader('DS-Script-Interceptor', 'error') - } catch (e) { - // ignore - } - log.error('load monkey script error', err) - } - }, - is (interceptOpt) { - return interceptOpt.script - }, - // 处理拦截配置:自动生成script拦截器所需的辅助配置,降低使用`script拦截器`配置绝对地址和相对地址时的门槛 - handleScriptInterceptConfig (intercepts) { - // 为了简化 script 拦截器配置脚本绝对地址,这里特殊处理一下 - for (const hostnamePattern in intercepts) { - const hostnameConfig = intercepts[hostnamePattern] - - const scriptProxy = {} - const handleScriptUrl = (scriptUrl, name, replaceScriptUrlFun) => { - if (scriptUrl.indexOf('https:') === 0 || scriptUrl.indexOf('http:') === 0) { - // 绝对地址 - const scriptKey = `${SCRIPT_PROXY_URL_PRE + scriptUrl.replace('.js', '').replace(/[\W_]+/g, '_')}.js` // 伪脚本地址:移除 script 中可能存在的特殊字符,并转为相对地址 - scriptProxy[scriptKey] = scriptUrl - log.info(`替换${name}配置值:'${scriptUrl}' -> '${scriptKey}'`) - if (typeof replaceScriptUrlFun === 'function') { - replaceScriptUrlFun(scriptKey) - } - } else if (scriptUrl.indexOf('/') === 0) { - // 相对地址 - scriptProxy[scriptUrl] = scriptUrl - } - } - - for (const pathPattern in hostnameConfig) { - const pathConfig = hostnameConfig[pathPattern] - // 处理 script 配置 - if (typeof pathConfig.script === 'object' && pathConfig.script.length > 0) { - for (let i = 0; i < pathConfig.script.length; i++) { - const scriptUrl = pathConfig.script[i] - handleScriptUrl(scriptUrl, 'script', (scriptKey) => { - pathConfig.script[i] = scriptKey - }) - } - } else if (typeof pathConfig.script === 'string') { - handleScriptUrl(pathConfig.script, 'script', (scriptKey) => { - pathConfig.script = scriptKey - }) - } - - // 处理 tampermonkeyScript 配置 - if (typeof pathConfig.tampermonkeyScript === 'string') { - handleScriptUrl(pathConfig.tampermonkeyScript, 'tampermonkey', (scriptKey) => { - pathConfig.tampermonkeyScript = scriptKey - }) - } - } - - // 自动创建脚本 - if (!lodash.isEmpty(scriptProxy)) { - for (const scriptKey in scriptProxy) { - if (scriptKey.indexOf(SCRIPT_PROXY_URL_PRE) === 0) { - // 绝对地址:新增代理配置 - const scriptUrl = scriptProxy[scriptKey] - - const pathPattern = `^${scriptKey.replace(/\./g, '\\.')}$` - if (hostnameConfig[pathPattern]) { - continue // 配置已经存在,按自定义配置优先 - } - hostnameConfig[pathPattern] = { - proxy: scriptUrl, - // 移除部分请求头,避免触发目标站点的拦截策略 - requestReplace: { - headers: { - host: REMOVE, - referer: REMOVE, - cookie: REMOVE, - }, - }, - // 替换和移除部分响应头,避免触发目标站点的阻止脚本加载策略 - responseReplace: { - headers: { - 'content-type': 'application/javascript; charset=utf-8', - 'set-cookie': REMOVE, - 'server': REMOVE, - }, - }, - cacheDays: 7, - desc: '为伪脚本文件设置代理地址,并设置响应头 `content-type: \'application/javascript; charset=utf-8\'`,同时缓存7天。', - } - - const obj = {} - obj[pathPattern] = hostnameConfig[pathPattern] - log.debug(`域名 '${hostnamePattern}' 拦截配置中,新增伪脚本地址的代理配置:`, JSON.stringify(obj, null, '\t')) - } else { - // 相对地址:新增响应头Content-Type替换配置 - if (hostnameConfig[scriptKey]) { - continue // 配置已经存在,按自定义配置优先 - } - - hostnameConfig[scriptKey] = { - responseReplace: { - headers: { - 'content-type': 'application/javascript; charset=utf-8', - }, - }, - cacheDays: 7, - desc: '为脚本设置响应头 `content-type: \'application/javascript; charset=utf-8\'`,同时缓存7天。', - } - - const obj = {} - obj[scriptKey] = hostnameConfig[scriptKey] - log.info(`域名 '${hostnamePattern}' 拦截配置中,新增目标脚本地址的响应头替换配置:`, JSON.stringify(obj, null, '\t')) - } - } - } - } - }, -} diff --git a/packages/mitmproxy/src/lib/interceptor/index.js b/packages/mitmproxy/src/lib/interceptor/index.js deleted file mode 100644 index c8255c5f1e..0000000000 --- a/packages/mitmproxy/src/lib/interceptor/index.js +++ /dev/null @@ -1,33 +0,0 @@ -// request interceptor impls -const OPTIONS = require('./impl/req/OPTIONS.js') -const success = require('./impl/req/success') -const abort = require('./impl/req/abort') -const cacheRequest = require('./impl/req/cacheRequest') -const redirect = require('./impl/req/redirect') - -const requestReplace = require('./impl/req/requestReplace') - -const proxy = require('./impl/req/proxy') -const sni = require('./impl/req/sni') -const unVerifySsl = require('./impl/req/unVerifySsl') - -const baiduOcr = require('./impl/req/baiduOcr') - -// response interceptor impls -const AfterOPTIONSHeaders = require('./impl/res/AfterOPTIONSHeaders') -const cacheResponse = require('./impl/res/cacheResponse') -const responseReplace = require('./impl/res/responseReplace') - -const script = require('./impl/res/script') - -module.exports = [ - // request interceptor impls - OPTIONS, success, abort, cacheRequest, redirect, - requestReplace, - proxy, sni, unVerifySsl, - baiduOcr, - - // response interceptor impls - AfterOPTIONSHeaders, cacheResponse, responseReplace, - script, -] diff --git a/packages/mitmproxy/src/lib/monkey/index.js b/packages/mitmproxy/src/lib/monkey/index.js deleted file mode 100644 index a87153d2a3..0000000000 --- a/packages/mitmproxy/src/lib/monkey/index.js +++ /dev/null @@ -1,130 +0,0 @@ -const fs = require('node:fs') -const path = require('node:path') -const log = require('../../utils/util.log.server') - -let scripts - -function buildScript (sc, content, scriptName) { - const scriptKey = `ds_${scriptName}${sc.version ? (`_${sc.version}`) : ''}:` - - // 代码1:监听事件 - const runAt = sc['run-at'] || 'document-end' - let eventStr - if (runAt === 'document-end') { - eventStr = 'document.addEventListener("DOMContentLoaded"' - } else { - eventStr = 'window.addEventListener("load"' - } - - // 代码2:初始化 - const options = { - name: sc.name, - version: sc.version, - icon: sc.icon, - } - const initStr = ` -const DS_init = (window.__ds_global__ || {})['DS_init'] -if (typeof DS_init === 'function') { -\tconsole.log("${scriptKey} do DS_init") -\tDS_init(${JSON.stringify(options)}); -} else { -\tconsole.log("${scriptKey} has no DS_init") -}` - - // 代码3:判断是否启用了脚本 - const checkEnabledStr = ` -if (!((window.__ds_global__ || {}).GM_getValue || (() => true))("ds_enabled", true)) { -\tconsole.log("${scriptKey} tampermonkey disabled") -\treturn -}` - - // 代码4:`GM_xxx` 方法读取 - let grantStr = '' - for (const item of sc.grant) { - if (grantStr.length > 0) { - grantStr += '\r\n' - } - - if (item.indexOf('.') > 0) { - grantStr += `${item} = (window.__ds_global__ || {})['${item}'];` - } else { - grantStr += `const ${item} = (window.__ds_global__ || {})['${item}'] || (() => {});` - } - } - - // 拼接脚本 - return `${eventStr}, () => {${ - initStr}\r\n${ - checkEnabledStr}\r\n\r\n${ - grantStr ? (`${grantStr}\r\n\r\n`) : '' - }${content - }\r\nconsole.log("${scriptKey} completed")` - + `\r\n})` - + `\r\nconsole.log("${scriptKey} loaded")` -} - -function loadScript (content, scriptName) { - // @grant GM_registerMenuCommand - // @grant GM_unregisterMenuCommand - // @grant GM_openInTab - // @grant GM_getValue - // @grant GM_setValue - // @grant GM_notification - const annoFlag = '// ==/UserScript==' - const arr = content.split(annoFlag) - const start = 0 - - const confStr = arr[start] - const confItemArr = confStr.split('\n') - const sc = { - grant: [], - match: [], - script: '', - } - for (const string of confItemArr) { - const reg = new RegExp('.*@(\\S+)\\s(.+)') - const ret = string.match(reg) - if (ret) { - const key = ret[1].trim() - const value = ret[2].trim() - if (key === 'grant') { - sc.grant.push(value) - } else if (key === 'match') { - sc.match.push(value) - } else { - sc[key] = value - } - } - } - const script = arr[start + 1].trim() - - sc.script = buildScript(sc, script, scriptName) - return sc -} - -function readFile (rootDir, script) { - log.info('read script, script root location:', path.resolve('./')) - const location = path.join(rootDir, `./${script}`) - log.info('read script, the script location:', location) - return fs.readFileSync(location).toString() -} - -const api = { - get (rootDir) { - if (scripts == null) { - return api.load(rootDir) - } - return scripts - }, - load (rootDir) { - scripts = {} - scripts.github = loadScript(readFile(rootDir, 'github.script'), 'github') - scripts.google = loadScript(readFile(rootDir, 'google.js'), 'google') - // scripts.jquery = { script: readFile(rootDir, 'jquery.min.js') } - scripts.tampermonkey = { script: readFile(rootDir, 'tampermonkey.script') } - return scripts - }, - loadScript, -} - -module.exports = api diff --git a/packages/mitmproxy/src/lib/proxy/common/ProxyHttpAgent.js b/packages/mitmproxy/src/lib/proxy/common/ProxyHttpAgent.js deleted file mode 100644 index ce8dcbc836..0000000000 --- a/packages/mitmproxy/src/lib/proxy/common/ProxyHttpAgent.js +++ /dev/null @@ -1,13 +0,0 @@ -const AgentOrigin = require('agentkeepalive') - -module.exports = class Agent extends AgentOrigin { - // Hacky - getName (option) { - let name = AgentOrigin.prototype.getName.call(this, option) - name += ':' - if (option.customSocketId) { - name += option.customSocketId - } - return name - } -} diff --git a/packages/mitmproxy/src/lib/proxy/common/ProxyHttpsAgent.js b/packages/mitmproxy/src/lib/proxy/common/ProxyHttpsAgent.js deleted file mode 100644 index c0a560f8f8..0000000000 --- a/packages/mitmproxy/src/lib/proxy/common/ProxyHttpsAgent.js +++ /dev/null @@ -1,13 +0,0 @@ -const HttpsAgentOrigin = require('agentkeepalive').HttpsAgent - -module.exports = class HttpsAgent extends HttpsAgentOrigin { - // Hacky - getName (option) { - let name = HttpsAgentOrigin.prototype.getName.call(this, option) - name += ':' - if (option.customSocketId) { - name += option.customSocketId - } - return name - } -} diff --git a/packages/mitmproxy/src/lib/proxy/common/config.js b/packages/mitmproxy/src/lib/proxy/common/config.js deleted file mode 100644 index 617fbc9cea..0000000000 --- a/packages/mitmproxy/src/lib/proxy/common/config.js +++ /dev/null @@ -1,31 +0,0 @@ -const path = require('node:path') - -const config = exports - -config.defaultHost = '127.0.0.1' -config.defaultPort = 31181 -config.defaultMaxLength = 100 - -config.caCertFileName = 'dev-sidecar.ca.crt' -config.caKeyFileName = 'dev-sidecar.ca.key.pem' -config.caName = 'DevSidecar - This certificate is generated locally' -config.caBasePath = buildDefaultCABasePath() - -config.getDefaultCABasePath = function () { - return config.caBasePath -} -config.setDefaultCABasePath = function (path) { - config.caBasePath = path -} -function buildDefaultCABasePath () { - const userHome = process.env.USERPROFILE || process.env.HOME || '/' - return path.resolve(userHome, './.dev-sidecar') -} - -config.getDefaultCACertPath = function () { - return path.resolve(config.getDefaultCABasePath(), config.caCertFileName) -} - -config.getDefaultCAKeyPath = function () { - return path.resolve(config.getDefaultCABasePath(), config.caKeyFileName) -} diff --git a/packages/mitmproxy/src/lib/proxy/common/util.js b/packages/mitmproxy/src/lib/proxy/common/util.js deleted file mode 100644 index eaacc95270..0000000000 --- a/packages/mitmproxy/src/lib/proxy/common/util.js +++ /dev/null @@ -1,234 +0,0 @@ -const URL = require('node:url') -const tunnelAgent = require('tunnel-agent') -const log = require('../../../utils/util.log.server') -const matchUtil = require('../../../utils/util.match') -const Agent = require('./ProxyHttpAgent') -const HttpsAgent = require('./ProxyHttpsAgent') - -// 匹配形如 `[::1]` 或 `[::1]:443` 的 IPv6 地址(带或不带端口) -const IPv6_HOST_RE = /^(\[[^\]]+\])(?::(\d+))?$/ - -const util = exports - -const httpsAgentCache = {} -const httpAgentCache = {} - -let socketId = 0 - -let httpsOverHttpAgent, httpOverHttpsAgent, httpsOverHttpsAgent - -function getTimeoutConfig (hostname, serverSetting) { - const timeoutMapping = serverSetting.timeoutMapping - - const timeoutConfig = matchUtil.matchHostname(timeoutMapping, hostname, 'get timeoutConfig') || {} - - return { - timeout: timeoutConfig.timeout || serverSetting.defaultTimeout || 20000, - keepAliveTimeout: timeoutConfig.keepAliveTimeout || serverSetting.defaultKeepAliveTimeout || 30000, - } -} - -function createHttpsAgent (timeoutConfig, verifySsl) { - const key = `${timeoutConfig.timeout}-${timeoutConfig.keepAliveTimeout}` - if (!httpsAgentCache[key]) { - verifySsl = !!verifySsl - - // 证书回调函数 - const checkServerIdentity = (host, cert) => { - log.info(`checkServerIdentity: ${host}, CN: ${cert.subject.CN}, C: ${cert.subject.C || cert.issuer.C}, ST: ${cert.subject.ST || cert.issuer.ST}, bits: ${cert.bits}`) - } - - const agent = new HttpsAgent({ - keepAlive: true, - timeout: timeoutConfig.timeout, - keepAliveTimeout: timeoutConfig.keepAliveTimeout, - checkServerIdentity, - rejectUnauthorized: verifySsl, - }) - - agent.unVerifySslAgent = new HttpsAgent({ - keepAlive: true, - timeout: timeoutConfig.timeout, - keepAliveTimeout: timeoutConfig.keepAliveTimeout, - checkServerIdentity, - rejectUnauthorized: false, - }) - - httpsAgentCache[key] = agent - log.info('创建 HttpsAgent 成功, timeoutConfig:', timeoutConfig, ', verifySsl:', verifySsl) - } - return httpsAgentCache[key] -} - -function createHttpAgent (timeoutConfig) { - const key = `${timeoutConfig.timeout}-${timeoutConfig.keepAliveTimeout}` - if (!httpAgentCache[key]) { - httpAgentCache[key] = new Agent({ - keepAlive: true, - timeout: timeoutConfig.timeout, - keepAliveTimeout: timeoutConfig.keepAliveTimeout, - }) - log.info('创建 HttpAgent 成功, timeoutConfig:', timeoutConfig) - } - return httpAgentCache[key] -} - -function createAgent (protocol, timeoutConfig, verifySsl) { - return protocol === 'https:' - ? createHttpsAgent(timeoutConfig, verifySsl) - : createHttpAgent(timeoutConfig) -} - -util.parseHostnameAndPort = (host, defaultPort) => { - let arr = host.match(IPv6_HOST_RE) // 尝试解析IPv6 - if (arr) { - arr = arr.slice(1) - if (arr[1]) { - arr[1] = Number.parseInt(arr[1], 10) - } - } else { - arr = host.split(':') - if (arr.length > 1) { - arr[1] = Number.parseInt(arr[1], 10) - } - } - - if (defaultPort > 0 && (arr.length === 1 || arr[1] === undefined)) { - arr[1] = defaultPort - } else if (arr.length === 2 && arr[1] === undefined) { - arr.pop() - } - - return arr -} - -util.getOptionsFromRequest = (req, ssl, externalProxy = null, serverSetting, compatibleConfig = null) => { - // eslint-disable-next-line node/no-deprecated-api - const urlObj = URL.parse(req.url) - const defaultPort = ssl ? 443 : 80 - const protocol = ssl ? 'https:' : 'http:' - const headers = Object.assign({}, req.headers) - let externalProxyUrl = null - - if (externalProxy) { - if (typeof externalProxy === 'string') { - externalProxyUrl = externalProxy - } else if (typeof externalProxy === 'function') { - try { - externalProxyUrl = externalProxy(req, ssl) - } catch (e) { - log.error('externalProxy error:', e) - } - } - } - - // 解析host和port - const arr = util.parseHostnameAndPort(req.headers.host) - const hostname = arr[0] - const port = arr[1] || defaultPort - - delete headers['proxy-connection'] - let agent - if (!externalProxyUrl) { - // keepAlive - if (headers.connection !== 'close') { - const timeoutConfig = getTimeoutConfig(hostname, serverSetting) - // log.info(`get timeoutConfig '${hostname}':`, timeoutConfig) - agent = createAgent(protocol, timeoutConfig, serverSetting.verifySsl) - headers.connection = 'keep-alive' - } else { - agent = false - } - } else { - agent = util.getTunnelAgent(protocol === 'https:', externalProxyUrl) - } - - // 初始化options - const options = { - protocol, - method: req.method, - url: req.url, - hostname, - port, - path: urlObj.path, - headers: req.headers, - agent, - compatibleConfig, - } - - if (protocol === 'http:' && externalProxyUrl) { - // eslint-disable-next-line node/no-deprecated-api - const externalUrlObj = URL.parse(externalProxyUrl) - if (externalUrlObj.protocol === 'http:') { - options.hostname = externalUrlObj.hostname - options.port = externalUrlObj.port - options.path = `http://${externalUrlObj.host}${externalUrlObj.path}` - } - } - - // mark a socketId for Agent to bind socket for NTLM - if (req.socket.customSocketId) { - options.customSocketId = req.socket.customSocketId - } else if (headers.authorization) { - options.customSocketId = req.socket.customSocketId = socketId++ - } - - return options -} - -util.getTunnelAgent = (requestIsSSL, externalProxyUrl) => { - // eslint-disable-next-line node/no-deprecated-api - const urlObj = URL.parse(externalProxyUrl) - const protocol = urlObj.protocol || 'http:' - let port = urlObj.port - if (!port) { - port = protocol === 'http:' ? 80 : 443 - } - const hostname = urlObj.hostname || 'localhost' - - if (requestIsSSL) { - if (protocol === 'http:') { - if (!httpsOverHttpAgent) { - httpsOverHttpAgent = tunnelAgent.httpsOverHttp({ - proxy: { - host: hostname, - port, - }, - }) - } - return httpsOverHttpAgent - } else { - if (!httpsOverHttpsAgent) { - httpsOverHttpsAgent = tunnelAgent.httpsOverHttps({ - proxy: { - host: hostname, - port, - }, - }) - } - return httpsOverHttpsAgent - } - } else { - if (protocol === 'http:') { - // if (!httpOverHttpAgent) { - // httpOverHttpAgent = tunnelAgent.httpOverHttp({ - // proxy: { - // host: hostname, - // port: port - // } - // }) - // } - return false - } else { - if (!httpOverHttpsAgent) { - httpOverHttpsAgent = tunnelAgent.httpOverHttps({ - proxy: { - host: hostname, - port, - }, - }) - } - return httpOverHttpsAgent - } - } -} diff --git a/packages/mitmproxy/src/lib/proxy/compatible/compatible.js b/packages/mitmproxy/src/lib/proxy/compatible/compatible.js deleted file mode 100644 index fdbb96dc71..0000000000 --- a/packages/mitmproxy/src/lib/proxy/compatible/compatible.js +++ /dev/null @@ -1,149 +0,0 @@ -/** - * 自动兼容程序自适应生成配置 - * 此脚本会针对各种兼容性问题,为对应域名生成相应的兼容性配置,并将自适应配置写入到 `~/.dev-sidecar/automaticCompatibleConfig.json` 文件中。 - * 当然,也有可能会生成错误的配置,导致无法兼容,这时候可以通过 `config.server.compatible` 配置项,来覆盖这里生成的配置,达到主动适配的效果。 - * - * @author WangLiang - */ -const fs = require('node:fs') -const jsonApi = require('../../../json') -const log = require('../../../utils/util.log.server') -const matchUtil = require('../../../utils/util.match') -const configLoader = require('@docmirror/dev-sidecar/src/config/local-config-loader') - -const defaultConfig = { - // connect阶段所需的兼容性配置 - connect: { - // 参考配置 - // 'xxx.xxx.xxx.xxx:443': { - // ssl: false - // } - }, - // request阶段所需的兼容性配置 - request: { - // 参考配置 - // 'xxx.xxx.xxx.xxx:443': { - // rejectUnauthorized: false - // } - }, -} - -const config = _loadFromFile(defaultConfig) - -function _getConnectConfig (hostname, port) { - const connectConfig = config.connect[`${hostname}:${port}`] - log.debug(`getConnectConfig: ${hostname}:${port}, ${jsonApi.stringify2(connectConfig)}`) - return connectConfig -} -function _getRequestConfig (hostname, port) { - const requestConfig = config.request[`${hostname}:${port}`] - log.debug(`getRequestConfig: ${hostname}:${port}, ${jsonApi.stringify2(requestConfig)}`) - return requestConfig -} - -// region 本地配置文件所需函数 - -function _loadFromFile (defaultConfig) { - const configPath = configLoader.getAutomaticCompatibleConfigPath() - let config - if (!fs.existsSync(configPath)) { - config = defaultConfig - log.info(`本地未保存过 ${configPath} 文件,使用默认配置`) - } else { - const file = fs.readFileSync(configPath) - log.info('读取 automaticCompatibleConfig.json 成功:', configPath) - const fileStr = file.toString() - try { - config = jsonApi.parse(fileStr) - if (config.connect == null) { - config.connect = defaultConfig.connect - } - if (config.request == null) { - config.request = defaultConfig.request - } - } catch (e) { - log.error('解析 automaticCompatibleConfig.json 失败:', configPath, ', error:', e) - return defaultConfig - } - } - - return config -} - -function _saveConfigToFile () { - const filePath = configLoader.getAutomaticCompatibleConfigPath() - try { - fs.writeFileSync(filePath, jsonApi.stringify(config)) - log.info('保存 automaticCompatibleConfig.json 成功:', filePath) - } catch (e) { - log.error('保存 automaticCompatibleConfig.json 失败:', filePath, ', error:', e) - } -} - -// endregion - -module.exports = { - /** - * 获取 connect 阶段所需的兼容性配置 - * - * @param hostname 域名 - * @param port 端口 - * @param manualCompatibleConfig 手动兼容性配置 - * @returns connect阶段所需的兼容性配置 - */ - getConnectCompatibleConfig (hostname, port, manualCompatibleConfig = null) { - let connectCompatibleConfig = manualCompatibleConfig == null ? null : matchUtil.matchHostname(manualCompatibleConfig.connect, `${hostname}:${port}`, 'getConnectCompatibleConfig') - if (connectCompatibleConfig == null) { - connectCompatibleConfig = _getConnectConfig(hostname, port) - } - return connectCompatibleConfig - }, - - setConnectSsl (hostname, port, ssl, autoSave = true) { - const connectCompatibleConfig = this.getConnectCompatibleConfig(hostname, port) - if (connectCompatibleConfig) { - connectCompatibleConfig.ssl = ssl - } else { - config.connect[`${hostname}:${port}`] = { ssl } - } - - // 配置保存到文件 - if (autoSave) { - _saveConfigToFile() - } - - log.info(`【自动兼容程序】${hostname}:${port}: 设置 connect.ssl = ${ssl}`) - }, - - // -------------------------------------------------------------------------------------------------------------------------- - - /** - * 获取 request 阶段所需的兼容性配置 - * - * @param rOptions - * @param manualCompatibleConfig - */ - getRequestCompatibleConfig (rOptions, manualCompatibleConfig = null) { - let requestCompatibleConfig = manualCompatibleConfig == null ? null : matchUtil.matchHostname(manualCompatibleConfig.request, `${rOptions.hostname}:${rOptions.port}`, 'getRequestCompatibleConfig') - if (requestCompatibleConfig == null) { - requestCompatibleConfig = _getRequestConfig(rOptions.hostname, rOptions.port) - } - return requestCompatibleConfig - }, - - setRequestRejectUnauthorized (rOptions, rejectUnauthorized, autoSave = true) { - const requestCompatibleConfig = this.getRequestCompatibleConfig(rOptions) - if (requestCompatibleConfig) { - requestCompatibleConfig.rejectUnauthorized = rejectUnauthorized - } else { - config.request[`${rOptions.hostname}:${rOptions.port}`] = { rejectUnauthorized } - } - - // 配置保存到文件 - if (autoSave) { - _saveConfigToFile() - } - - log.info(`【自动兼容程序】${rOptions.hostname}:${rOptions.port}: 设置 request.rejectUnauthorized = ${rejectUnauthorized}`) - }, -} diff --git a/packages/mitmproxy/src/lib/proxy/index.js b/packages/mitmproxy/src/lib/proxy/index.js deleted file mode 100644 index b43332a780..0000000000 --- a/packages/mitmproxy/src/lib/proxy/index.js +++ /dev/null @@ -1,2 +0,0 @@ -// require('babel-polyfill') -module.exports = require('./mitmproxy') diff --git a/packages/mitmproxy/src/lib/proxy/middleware/InsertScriptMiddleware.js b/packages/mitmproxy/src/lib/proxy/middleware/InsertScriptMiddleware.js deleted file mode 100644 index 96a51a2e6c..0000000000 --- a/packages/mitmproxy/src/lib/proxy/middleware/InsertScriptMiddleware.js +++ /dev/null @@ -1,206 +0,0 @@ -const zlib = require('node:zlib') -const through = require('through2') -const log = require('../../../utils/util.log.server') - -const HTML_CONTENT_TYPE_RE = /text\/html|application\/xhtml\+xml/ -const CSP_SCRIPT_SRC_RE = /script-src ([^:]*);/i - -// 编解码器 -const codecMap = { - gzip: { - createCompressor: () => zlib.createGzip(), - createDecompressor: () => zlib.createGunzip(), - }, - deflate: { - createCompressor: () => zlib.createDeflate(), - createDecompressor: () => zlib.createInflate(), - }, - br: { - createCompressor: () => zlib.createBrotliCompress(), - createDecompressor: () => zlib.createBrotliDecompress(), - }, -} -const supportedEncodings = Object.keys(codecMap) -const supportedEncodingsStr = supportedEncodings.join(', ') - -const httpUtil = { - // 获取响应内容编码 - getContentEncoding (res) { - const encoding = res.headers['content-encoding'] - if (encoding) { - return encoding.toLowerCase() - } - return null - }, - // 获取编解码器 - getCodec (encoding) { - return codecMap[encoding] - }, - // 获取支持的编解码器名称字符串 - supportedEncodingsStr () { - return supportedEncodingsStr - }, - // 是否HTML代码 - isHtml (res) { - const contentType = res.headers['content-type'] - return (typeof contentType !== 'undefined') && HTML_CONTENT_TYPE_RE.test(contentType) - }, -} -const HEAD = Buffer.from('') -const HEAD_UP = Buffer.from('') -const BODY = Buffer.from('') -const BODY_UP = Buffer.from('') - -function chunkByteReplace (_this, chunk, enc, callback, append) { - if (append) { - if (append.head) { - const ret = injectScriptIntoHtml([HEAD, HEAD_UP], chunk, append.head) - if (ret != null) { - chunk = ret - } - } - if (append.body) { - const ret = injectScriptIntoHtml([BODY, BODY_UP], chunk, append.body) - if (ret != null) { - chunk = ret - } - } - } - _this.push(chunk) - callback() -} - -function injectScriptIntoHtml (tags, chunk, script) { - for (const tag of tags) { - const index = chunk.indexOf(tag) - if (index < 0) { - continue - } - const scriptBuf = Buffer.from(script) - const chunkNew = Buffer.alloc(chunk.length + scriptBuf.length) - chunk.copy(chunkNew, 0, 0, index) - scriptBuf.copy(chunkNew, index, 0) - chunk.copy(chunkNew, index + scriptBuf.length, index) - return chunkNew - } - return null -} - -function handleResponseHeaders (res, proxyRes) { - Object.keys(proxyRes.headers).forEach((key) => { - if (proxyRes.headers[key] !== undefined) { - // let newkey = key.replace(/^[a-z]|-[a-z]/g, (match) => { - // return match.toUpperCase() - // }) - const newkey = key - if (key === 'content-length') { - // do nothing - return - } - if (key === 'content-security-policy') { - // content-security-policy - let policy = proxyRes.headers[key] - const matched = policy.match(CSP_SCRIPT_SRC_RE) - if (matched) { - if (!matched[1].includes('self')) { - policy = policy.replace('script-src', 'script-src \'self\' ') - } - } - res.setHeader(newkey, policy) - return - } - - res.setHeader(newkey, proxyRes.headers[key]) - } - }) - - res.writeHead(proxyRes.statusCode) -} - -const contextPath = '/____ds_script____/' -const monkey = require('../../monkey') - -module.exports = { - requestIntercept (context, req, res, ssl, next) { - const { rOptions, log, setting } = context - if (rOptions.path.indexOf(contextPath) !== 0) { - return - } - const urlPath = rOptions.path - let filename = urlPath.replace(contextPath, '') - - // 重命名过,向下兼容 - if (filename === 'global') { - filename = 'tampermonkey' - } - - const script = monkey.get(setting.script.defaultDir)[filename] - // log.info(`urlPath: ${urlPath}, fileName: ${filename}, script: ${script}`) - - log.info('ds_script, filename:', filename, ', `script != null` =', script != null) - if (script == null) { - res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' }) - res.end(`DevSidecar: script '${filename}' not found`) - return true - } - const now = new Date() - res.writeHead(200, { - 'DS-Middleware': 'ds_script', - 'Content-Type': 'application/javascript; charset=utf-8', - 'Cache-Control': 'public, max-age=86401, immutable', // 缓存1天 - 'Last-Modified': now.toUTCString(), - 'Expires': new Date(now.getTime() + 86400000).toUTCString(), // 缓存1天 - 'Date': now.toUTCString(), - }) - res.write(script.script) - res.end() - return true - }, - responseInterceptor (req, res, proxyReq, proxyRes, ssl, next, append) { - if (append == null || (!append.head && !append.body)) { - next() - return - } - - const isHtml = httpUtil.isHtml(proxyRes) - const contentLengthIsZero = (() => { - return proxyRes.headers['content-length'] === '0' - })() - if (!isHtml || contentLengthIsZero) { - next() - return - } - - // 先处理头信息 - handleResponseHeaders(res, proxyRes) - - // 获取响应内容编码 - const encoding = httpUtil.getContentEncoding(proxyRes) - if (encoding) { - // 获取编解码器 - const codec = httpUtil.getCodec(encoding) - if (codec) { - proxyRes - .pipe(codec.createDecompressor()) // 解码 - .pipe(through(function (chunk, enc, callback) { - // 插入head和body - chunkByteReplace(this, chunk, enc, callback, append) - })) - .pipe(codec.createCompressor()) // 编码 - .pipe(res) - } else { - log.error(`InsertScriptMiddleware.responseInterceptor(): 暂不支持编码方式 ${encoding}, 目前支持:`, httpUtil.supportedEncodingsStr()) - } - } else { - proxyRes - .pipe(through(function (chunk, enc, callback) { - chunkByteReplace(this, chunk, enc, callback, append) - })) - .pipe(res) - } - - next() - }, - httpUtil, - handleResponseHeaders, -} diff --git a/packages/mitmproxy/src/lib/proxy/middleware/overwall.js b/packages/mitmproxy/src/lib/proxy/middleware/overwall.js deleted file mode 100644 index 19540f9487..0000000000 --- a/packages/mitmproxy/src/lib/proxy/middleware/overwall.js +++ /dev/null @@ -1,225 +0,0 @@ -const { Buffer } = require('node:buffer') -const fs = require('node:fs') -const path = require('node:path') -const URL = require('node:url') -const request = require('request') -const log = require('../../../utils/util.log.server') -const matchUtil = require('../../../utils/util.match') -const pac = require('./source/pac') -const dateUtil = require('@docmirror/dev-sidecar/src/utils/util.date') - -let pacClient = null - -function matched (hostname, overWallTargetMap) { - // 匹配配置文件 - const ret1 = matchUtil.matchHostname(overWallTargetMap, hostname, 'matched overwall') - if (ret1) { - return 'in config' - } else if (ret1 === false || ret1 === 'false') { - log.debug(`域名 ${hostname} 的overwall配置为 false,跳过增强功能,即使它在 pac.txt 里`) - return null - } - - // 匹配 pac.txt - if (pacClient == null) { - return null - } - const ret = pacClient.FindProxyForURL(`https://${hostname}`, hostname) - if (ret && ret.indexOf('PROXY ') === 0) { - log.info(`matchHostname: matched overwall: '${hostname}' -> '${ret}' in pac.txt`) - return 'in pac.txt' - } else { - log.debug(`matchHostname: matched overwall: Not-Matched '${hostname}' -> '${ret}' in pac.txt`) - return null - } -} - -function getUserBasePath () { - const userHome = process.env.USERPROFILE || process.env.HOME || '/' - return path.resolve(userHome, './.dev-sidecar') -} - -// 下载的 pac.txt 文件保存路径 -function getTmpPacFilePath () { - return path.join(getUserBasePath(), '/pac.txt') -} - -function loadPacLastModifiedTime (pacTxt) { - const matched = pacTxt.match(/(?<=! Last Modified: )[^\r\n]+/g) - if (matched && matched.length > 0) { - try { - return new Date(matched[0]) - } catch { - return null - } - } -} - -// 保存 pac 内容到 `~/pac.txt` 文件中 -function savePacFile (pacTxt) { - const pacFilePath = getTmpPacFilePath() - try { - fs.writeFileSync(pacFilePath, pacTxt) - log.info('保存 pac.txt 文件成功:', pacFilePath) - } catch (e) { - log.error('保存 pac.txt 文件失败:', pacFilePath, ', error:', e) - return - } - - // 尝试解析和修改 pac.txt 文件时间 - const lastModifiedTime = loadPacLastModifiedTime(pacTxt) - if (lastModifiedTime) { - fs.stat(pacFilePath, (err, _stats) => { - if (err) { - log.error('修改 pac.txt 文件时间失败:', err) - return - } - - // 修改文件的访问时间和修改时间为当前时间 - fs.utimes(pacFilePath, lastModifiedTime, lastModifiedTime, (utimesErr) => { - if (utimesErr) { - log.error('修改 pac.txt 文件时间失败:', utimesErr) - } else { - log.info(`'${pacFilePath}' 文件的修改时间已更新为其最近更新时间 '${dateUtil.format(lastModifiedTime, false)}'`) - } - }) - }) - } -} - -// 异步下载 pac.txt ,避免影响代理服务的启动速度 -async function downloadPacAsync (pacConfig) { - const remotePacFileUrl = pacConfig.pacFileUpdateUrl - log.info('开始下载远程 pac.txt 文件:', remotePacFileUrl) - request(remotePacFileUrl, (error, response, body) => { - if (error) { - log.error(`下载远程 pac.txt 文件失败: ${remotePacFileUrl}, error:`, error, ', response:', response, ', body:', body) - return - } - if (response && response.statusCode === 200) { - if (body == null || body.length < 100) { - log.warn('下载远程 pac.txt 文件成功,但内容为空或内容太短,判断为无效的 pax.txt 文件:', remotePacFileUrl, ', body:', body) - return - } else { - log.info('下载远程 pac.txt 文件成功:', remotePacFileUrl) - } - - // 尝试解析Base64(注:https://gitlab.com/gfwlist/gfwlist/raw/master/gfwlist.txt 下载下来的是Base64格式) - let pacTxt = body - if (!pacTxt.includes('!---------------------EOF')) { - try { - pacTxt = Buffer.from(pacTxt, 'base64').toString('utf8') - // log.debug('解析 base64 后的 pax:', pacTxt) - } catch { - log.error(`远程 pac.txt 文件内容即不是base64格式,也不是要求的格式,url: ${remotePacFileUrl},body: ${body}`) - return - } - } - - // 保存到本地 - savePacFile(pacTxt) - } else { - log.error(`下载远程 pac.txt 文件失败: ${remotePacFileUrl}, response:`, response, ', body:', body) - } - }) -} - -function createOverwallMiddleware (overWallConfig) { - if (!overWallConfig || overWallConfig.enabled !== true) { - return null - } - if (overWallConfig.pac && overWallConfig.pac.enabled) { - // 初始化pac - pacClient = pac.createPacClient(overWallConfig.pac.pacFileAbsolutePath) - } - - let server = overWallConfig.server - let keys = Object.keys(server) - if (keys.length === 0) { - server = overWallConfig.serverDefault - keys = Object.keys(server) - } - if (keys.length === 0) { - return null - } - const overWallTargetMap = matchUtil.domainMapRegexply(overWallConfig.targets) - return { - sslConnectInterceptor: (req, _cltSocket, _head) => { - const hostname = req.url.split(':')[0] - return matched(hostname, overWallTargetMap) - }, - requestIntercept (context, req, res, _ssl, _next) { - const { rOptions, log, RequestCounter } = context - if (rOptions.protocol === 'http:') { - return - } - const hostname = rOptions.hostname - const matchedResult = matched(hostname, overWallTargetMap) - if (matchedResult == null || matchedResult === false || matchedResult === 'false') { - return - } - const cacheKey = '__over_wall_proxy__' - let proxyServer = keys[0] - if (RequestCounter && keys.length > 1) { - const count = RequestCounter.getOrCreate(cacheKey, keys) - if (count.value == null) { - count.doRank() - } - if (count.value == null) { - log.error('`count.value` is null, the count:', count) - } else { - count.doCount(count.value) - proxyServer = count.value - context.requestCount = { - key: cacheKey, - value: count.value, - count, - } - } - } - - const domain = proxyServer - const port = server[domain].port - const path = server[domain].path - const password = server[domain].password - const proxyTarget = `${domain}/${path}/${hostname}${req.url}` - - // const backup = interceptOpt.backup - const proxy = proxyTarget.indexOf('http:') === 0 || proxyTarget.indexOf('https:') === 0 ? proxyTarget : (`${rOptions.protocol}//${proxyTarget}`) - // eslint-disable-next-line node/no-deprecated-api - const urlObj = URL.parse(proxy) - - // 备份原始请求参数,不包含 agent 和 headers(agent 是共享单例,headers 在代理转发时会被改写) - const { agent: _agent, headers: _headers, ...original } = rOptions - rOptions.original = original - - rOptions.protocol = urlObj.protocol - rOptions.hostname = urlObj.hostname - rOptions.host = urlObj.host - rOptions.headers.host = urlObj.host - if (password) { - rOptions.headers.dspassword = password - } - rOptions.path = urlObj.path - if (urlObj.port) { - rOptions.port = Number.parseInt(urlObj.port) - } else { - rOptions.port = port || (rOptions.protocol === 'https:' ? 443 : 80) - } - log.info('OverWall:', rOptions.hostname, '➜', proxyTarget) - if (context.requestCount) { - log.debug('OverWall choice:', JSON.stringify(context.requestCount)) - } - - res.setHeader('DS-Overwall', matchedResult) - - return true - }, - } -} - -module.exports = { - getTmpPacFilePath, - downloadPacAsync, - createOverwallMiddleware, -} diff --git a/packages/mitmproxy/src/lib/proxy/middleware/source/pac.js b/packages/mitmproxy/src/lib/proxy/middleware/source/pac.js deleted file mode 100644 index 22d80fb22a..0000000000 --- a/packages/mitmproxy/src/lib/proxy/middleware/source/pac.js +++ /dev/null @@ -1,679 +0,0 @@ -const fs = require('node:fs') -const path = require('node:path') -const log = require('../../../../utils/util.log.server') - -function createPacClient (pacFilePath) { - const __PROXY__ = 'PROXY 127.0.0.1:1080;' - - function readFile (location) { - try { - log.info('pac root dir:', path.resolve('./')) - log.info('pac location:', location) - const filePath = path.resolve(location) - log.info('read pac path:', filePath) - return fs.readFileSync(location).toString() - } catch (e) { - log.error('读取pac失败:', e) - return '' - } - } - - const getRules = function (pacFilePath) { - let text = readFile(pacFilePath) - if (!text.includes('!---------------------EOF')) { - text = Buffer.from(text, 'base64').toString() - } - const rules = [] - const arr = text.split('\n') - for (const line of arr) { - const row = line.trim() - if (row === '' || row.indexOf('!') === 0 || row.indexOf('[') === 0) { - continue - } - rules.push(row) - } - return rules - } - const __RULES__ = getRules(pacFilePath) - - /* eslint-disable */ - // Was generated by gfwlist2pac in precise mode - // https://github.com/clowwindy/gfwlist2pac - - // 2019-10-06: More 'javascript' way to interaction with main program - // 2019-02-08: Updated to support shadowsocks-windows user rules. - - const proxy = __PROXY__ - const rules = [] - - // convert to abp grammar - for (let i = 0; i < __RULES__.length; i++) { - let s = __RULES__[i] - if (s.substring(0, 2) === "||") s += "^" - rules.push(s) - } - - /* - * This file is part of Adblock Plus , - * Copyright (C) 2006-2014 Eyeo GmbH - * - * Adblock Plus is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3 as - * published by the Free Software Foundation. - * - * Adblock Plus is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Adblock Plus. If not, see . - */ - - function createDict () { - const result = {} - result.__proto__ = null - return result - } - - function getOwnPropertyDescriptor (obj, key) { - if (obj.hasOwnProperty(key)) { - return obj[key] - } - return null - } - - function extend (subClass, superClass, definition) { - if (Object.__proto__) { - definition.__proto__ = superClass.prototype - subClass.prototype = definition - } else { - const tmpClass = function () {} - tmpClass.prototype = superClass.prototype - subClass.prototype = new tmpClass() - subClass.prototype.constructor = superClass - for (const key in definition) { - if (definition.hasOwnProperty(key)) { - subClass.prototype[key] = definition[key] - } - } - } - } - - function Filter (text) { - this.text = text - this.subscriptions = [] - } - - Filter.prototype = { - text: null, - subscriptions: null, - toString: function () { - return this.text - } - } - Filter.knownFilters = createDict() - Filter.elemhideRegExp = /^([^\/\*\|\@"!]*?)#(\@)?(?:([\w\-]+|\*)((?:\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\))*)|#([^{}]+))$/ - Filter.regexpRegExp = /^(@@)?\/.*\/(?:\$~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)?$/ - Filter.optionsRegExp = /\$(~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)$/ - Filter.fromText = function (text) { - if (text in Filter.knownFilters) { - return Filter.knownFilters[text] - } - let ret - if (text.charAt(0) === "!") { - ret = new CommentFilter(text) - } else { - ret = RegExpFilter.fromText(text) - } - Filter.knownFilters[ret.text] = ret - return ret - } - - function InvalidFilter (text, reason) { - Filter.call(this, text) - this.reason = reason - } - - extend(InvalidFilter, Filter, { - reason: null - }) - - function CommentFilter (text) { - Filter.call(this, text) - } - - extend(CommentFilter, Filter, {}) - - function ActiveFilter (text, domains) { - Filter.call(this, text) - this.domainSource = domains - } - - extend(ActiveFilter, Filter, { - domainSource: null, - domainSeparator: null, - ignoreTrailingDot: true, - domainSourceIsUpperCase: false, - getDomains: function () { - const prop = getOwnPropertyDescriptor(this, "domains") - if (prop) { - return prop - } - let domains = null - if (this.domainSource) { - let source = this.domainSource - if (!this.domainSourceIsUpperCase) { - source = source.toUpperCase() - } - const list = source.split(this.domainSeparator) - if (list.length === 1 && (list[0]).charAt(0) !== "~") { - domains = createDict() - domains[""] = false - if (this.ignoreTrailingDot) { - list[0] = list[0].replace(/\.+$/, "") - } - domains[list[0]] = true - } else { - let hasIncludes = false - for (let i = 0; i < list.length; i++) { - let domain = list[i] - if (this.ignoreTrailingDot) { - domain = domain.replace(/\.+$/, "") - } - if (domain === "") { - continue - } - let include - if (domain.charAt(0) === "~") { - include = false - domain = domain.substr(1) - } else { - include = true - hasIncludes = true - } - if (!domains) { - domains = createDict() - } - domains[domain] = include - } - domains[""] = !hasIncludes - } - this.domainSource = null - } - return this.domains - }, - siteKeys: null, - isActiveOnDomain: function (docDomain, siteKey) { - if (this.getSiteKeys() && (!siteKey || this.getSiteKeys().indexOf(siteKey.toUpperCase()) < 0)) { - return false - } - if (!this.getDomains()) { - return true - } - if (!docDomain) { - return this.getDomains()[""] - } - if (this.ignoreTrailingDot) { - docDomain = docDomain.replace(/\.+$/, "") - } - docDomain = docDomain.toUpperCase() - while (true) { - if (docDomain in this.getDomains()) { - return this.domains[docDomain] - } - const nextDot = docDomain.indexOf(".") - if (nextDot < 0) { - break - } - docDomain = docDomain.substr(nextDot + 1) - } - return this.domains[""] - }/*, - isActiveOnlyOnDomain: function (docDomain) { - if (!docDomain || !this.getDomains() || this.getDomains()[""]) { - return false - } - if (this.ignoreTrailingDot) { - docDomain = docDomain.replace(/\.+$/, "") - } - docDomain = docDomain.toUpperCase() - for (const domain in this.getDomains()) { - if (this.domains[domain] && domain != docDomain && (domain.length <= docDomain.length || domain.indexOf("." + docDomain) != domain.length - docDomain.length - 1)) { - return false - } - } - return true - }*/ - }) - - function RegExpFilter (text, regexpSource, contentType, matchCase, domains, thirdParty, siteKeys) { - ActiveFilter.call(this, text, domains, siteKeys) - if (contentType != null) { - this.contentType = contentType - } - if (matchCase) { - this.matchCase = matchCase - } - if (thirdParty != null) { - this.thirdParty = thirdParty - } - if (siteKeys != null) { - this.siteKeySource = siteKeys - } - if (regexpSource.length >= 2 && regexpSource.charAt(0) === "/" && regexpSource.charAt(regexpSource.length - 1) === "/") { - this.regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2), this.matchCase ? "" : "i") - } else { - this.regexpSource = regexpSource - } - } - - extend(RegExpFilter, ActiveFilter, { - domainSourceIsUpperCase: true, - length: 1, - domainSeparator: "|", - regexpSource: null, - getRegexp: function () { - const prop = getOwnPropertyDescriptor(this, "regexp") - if (prop) { - return prop - } - const source = this.regexpSource.replace(/\*+/g, "*").replace(/\^\|$/, "^").replace(/\W/g, "\\$&").replace(/\\\*/g, ".*").replace(/\\\^/g, "(?:[\\x00-\\x24\\x26-\\x2C\\x2F\\x3A-\\x40\\x5B-\\x5E\\x60\\x7B-\\x7F]|$)").replace(/^\\\|\\\|/, "^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?").replace(/^\\\|/, "^").replace(/\\\|$/, "$").replace(/^(\.\*)/, "").replace(/(\.\*)$/, "") - const regexp = new RegExp(source, this.matchCase ? "" : "i") - this.regexp = regexp - return regexp - }, - contentType: 2147483647, - matchCase: false, - thirdParty: null, - siteKeySource: null, - getSiteKeys: function () { - const prop = getOwnPropertyDescriptor(this, "siteKeys") - if (prop) { - return prop - } - let siteKeys = null - if (this.siteKeySource) { - siteKeys = this.siteKeySource.split("|") - this.siteKeySource = null - } - this.siteKeys = siteKeys - return this.siteKeys - }, - matches: function (location, contentType, docDomain, thirdParty, siteKey) { - return !!(this.getRegexp().test(location) && this.isActiveOnDomain(docDomain, siteKey)) - } - }) - RegExpFilter.prototype["0"] = "#this" - RegExpFilter.fromText = function (text) { - let blocking = true - const origText = text - if (text.indexOf("@@") === 0) { - blocking = false - text = text.substr(2) - } - let contentType = null - let matchCase = null - let domains = null - let siteKeys = null - let thirdParty = null - let collapse = null - let options - const match = text.indexOf("$") >= 0 ? Filter.optionsRegExp.exec(text) : null - if (match) { - options = match[1].toUpperCase().split(",") - text = match.input.substr(0, match.index) - for (let _loopIndex6 = 0; _loopIndex6 < options.length; ++_loopIndex6) { - let option = options[_loopIndex6] - let value = null - const separatorIndex = option.indexOf("=") - if (separatorIndex >= 0) { - value = option.substr(separatorIndex + 1) - option = option.substr(0, separatorIndex) - } - option = option.replace(/-/, "_") - if (option in RegExpFilter.typeMap) { - if (contentType == null) { - contentType = 0 - } - contentType |= RegExpFilter.typeMap[option] - } else if (option.charAt(0) === "~" && option.substr(1) in RegExpFilter.typeMap) { - if (contentType == null) { - contentType = RegExpFilter.prototype.contentType - } - contentType &= ~RegExpFilter.typeMap[option.substr(1)] - } else if (option === "MATCH_CASE") { - matchCase = true - } else if (option === "~MATCH_CASE") { - matchCase = false - } else if (option === "DOMAIN" && typeof value != "undefined") { - domains = value - } else if (option === "THIRD_PARTY") { - thirdParty = true - } else if (option === "~THIRD_PARTY") { - thirdParty = false - } else if (option === "COLLAPSE") { - collapse = true - } else if (option === "~COLLAPSE") { - collapse = false - } else if (option === "SITEKEY" && typeof value != "undefined") { - siteKeys = value - } else { - return new InvalidFilter(origText, "Unknown option " + option.toLowerCase()) - } - } - } - if (!blocking && (contentType == null || contentType & RegExpFilter.typeMap.DOCUMENT) && (!options || options.indexOf("DOCUMENT") < 0) && !/^\|?[\w\-]+:/.test(text)) { - if (contentType == null) { - contentType = RegExpFilter.prototype.contentType - } - contentType &= ~RegExpFilter.typeMap.DOCUMENT - } - try { - if (blocking) { - return new BlockingFilter(origText, text, contentType, matchCase, domains, thirdParty, siteKeys, collapse) - } else { - return new WhitelistFilter(origText, text, contentType, matchCase, domains, thirdParty, siteKeys) - } - } catch (e) { - return new InvalidFilter(origText, e) - } - } - RegExpFilter.typeMap = { - OTHER: 1, - SCRIPT: 2, - IMAGE: 4, - STYLESHEET: 8, - OBJECT: 16, - SUBDOCUMENT: 32, - DOCUMENT: 64, - XBL: 1, - PING: 1, - XMLHTTPREQUEST: 2048, - OBJECT_SUBREQUEST: 4096, - DTD: 1, - MEDIA: 16384, - FONT: 32768, - BACKGROUND: 4, - POPUP: 268435456, - ELEMHIDE: 1073741824 - } - RegExpFilter.prototype.contentType &= ~(RegExpFilter.typeMap.ELEMHIDE | RegExpFilter.typeMap.POPUP) - - function BlockingFilter (text, regexpSource, contentType, matchCase, domains, thirdParty, siteKeys, collapse) { - RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, siteKeys) - this.collapse = collapse - } - - extend(BlockingFilter, RegExpFilter, { - collapse: null - }) - - function WhitelistFilter (text, regexpSource, contentType, matchCase, domains, thirdParty, siteKeys) { - RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, siteKeys) - } - - extend(WhitelistFilter, RegExpFilter, {}) - - function Matcher () { - this.clear() - } - - Matcher.prototype = { - filterByKeyword: null, - keywordByFilter: null, - clear: function () { - this.filterByKeyword = createDict() - this.keywordByFilter = createDict() - }, - add: function (filter) { - if (filter.text in this.keywordByFilter) { - return - } - const keyword = this.findKeyword(filter) - const oldEntry = this.filterByKeyword[keyword] - if (typeof oldEntry == "undefined") { - this.filterByKeyword[keyword] = filter - } else if (oldEntry.length === 1) { - this.filterByKeyword[keyword] = [oldEntry, filter] - } else { - oldEntry.push(filter) - } - this.keywordByFilter[filter.text] = keyword - }, - remove: function (filter) { - if (!(filter.text in this.keywordByFilter)) { - return - } - const keyword = this.keywordByFilter[filter.text] - const list = this.filterByKeyword[keyword] - if (list.length <= 1) { - delete this.filterByKeyword[keyword] - } else { - const index = list.indexOf(filter) - if (index >= 0) { - list.splice(index, 1) - if (list.length === 1) { - this.filterByKeyword[keyword] = list[0] - } - } - } - delete this.keywordByFilter[filter.text] - }, - findKeyword: function (filter) { - let result = "" - let text = filter.text - if (Filter.regexpRegExp.test(text)) { - return result - } - const match = Filter.optionsRegExp.exec(text) - if (match) { - text = match.input.substr(0, match.index) - } - if (text.substr(0, 2) === "@@") { - text = text.substr(2) - } - const candidates = text.toLowerCase().match(/[^a-z0-9%*][a-z0-9%]{3,}(?=[^a-z0-9%*])/g) - if (!candidates) { - return result - } - const hash = this.filterByKeyword - let resultCount = 16777215 - let resultLength = 0 - for (let i = 0, l = candidates.length; i < l; i++) { - const candidate = candidates[i].substr(1) - const count = candidate in hash ? hash[candidate].length : 0 - if (count < resultCount || count === resultCount && candidate.length > resultLength) { - result = candidate - resultCount = count - resultLength = candidate.length - } - } - return result - }, - hasFilter: function (filter) { - return filter.text in this.keywordByFilter - }, - getKeywordForFilter: function (filter) { - if (filter.text in this.keywordByFilter) { - return this.keywordByFilter[filter.text] - } else { - return null - } - }, - _checkEntryMatch: function (keyword, location, contentType, docDomain, thirdParty, siteKey) { - const list = this.filterByKeyword[keyword] - for (let i = 0; i < list.length; i++) { - let filter = list[i] - if (filter === "#this") { - filter = list - } - if (filter.matches(location, contentType, docDomain, thirdParty, siteKey)) { - return filter - } - } - return null - }/*, - matchesAny: function (location, contentType, docDomain, thirdParty, siteKey) { - let candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g) - if (candidates === null) { - candidates = [] - } - candidates.push("") - for (let i = 0, l = candidates.length; i < l; i++) { - const substr = candidates[i] - if (substr in this.filterByKeyword) { - const result = this._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, siteKey) - if (result) { - return result - } - } - } - return null - }*/ - } - - function CombinedMatcher () { - this.blacklist = new Matcher() - this.whitelist = new Matcher() - this.resultCache = createDict() - } - - CombinedMatcher.maxCacheEntries = 1000 - CombinedMatcher.prototype = { - blacklist: null, - whitelist: null, - resultCache: null, - cacheEntries: 0, - clear: function () { - this.blacklist.clear() - this.whitelist.clear() - this.resultCache = createDict() - this.cacheEntries = 0 - }, - add: function (filter) { - if (filter instanceof WhitelistFilter) { - this.whitelist.add(filter) - } else { - this.blacklist.add(filter) - } - if (this.cacheEntries > 0) { - this.resultCache = createDict() - this.cacheEntries = 0 - } - }, - remove: function (filter) { - if (filter instanceof WhitelistFilter) { - this.whitelist.remove(filter) - } else { - this.blacklist.remove(filter) - } - if (this.cacheEntries > 0) { - this.resultCache = createDict() - this.cacheEntries = 0 - } - }, - findKeyword: function (filter) { - if (filter instanceof WhitelistFilter) { - return this.whitelist.findKeyword(filter) - } else { - return this.blacklist.findKeyword(filter) - } - }, - hasFilter: function (filter) { - if (filter instanceof WhitelistFilter) { - return this.whitelist.hasFilter(filter) - } else { - return this.blacklist.hasFilter(filter) - } - }, - getKeywordForFilter: function (filter) { - if (filter instanceof WhitelistFilter) { - return this.whitelist.getKeywordForFilter(filter) - } else { - return this.blacklist.getKeywordForFilter(filter) - } - }, - /*isSlowFilter: function (filter) { - const matcher = filter instanceof WhitelistFilter ? this.whitelist : this.blacklist - if (matcher.hasFilter(filter)) { - return !matcher.getKeywordForFilter(filter) - } else { - return !matcher.findKeyword(filter) - } - },*/ - matchesAnyInternal: function (location, contentType, docDomain, thirdParty, siteKey) { - let candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g) - if (candidates === null) { - candidates = [] - } - candidates.push("") - let blacklistHit = null - for (let i = 0, l = candidates.length; i < l; i++) { - const substr = candidates[i] - if (substr in this.whitelist.filterByKeyword) { - const result = this.whitelist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, siteKey) - if (result) { - return result - } - } - if (substr in this.blacklist.filterByKeyword && blacklistHit === null) { - blacklistHit = this.blacklist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, siteKey) - } - } - return blacklistHit - }, - matchesAny: function (location, docDomain) { - const key = location + " " + docDomain + " " - if (key in this.resultCache) { - return this.resultCache[key] - } - const result = this.matchesAnyInternal(location, 0, docDomain, null, null) - if (this.cacheEntries >= CombinedMatcher.maxCacheEntries) { - this.resultCache = createDict() - this.cacheEntries = 0 - } - this.resultCache[key] = result - this.cacheEntries++ - return result - } - } - - const userrulesMatcher = new CombinedMatcher() - const defaultMatcher = new CombinedMatcher() - - const direct = 'DIRECT;' - - for (let i = 0; i < rules.length; i++) { - defaultMatcher.add(Filter.fromText(rules[i])) - } - - function FindProxyForURL (url, host) { - let matchedResult = userrulesMatcher.matchesAny(url, host) - if (matchedResult instanceof BlockingFilter) { - return proxy - } else if (matchedResult instanceof WhitelistFilter) { - return direct - } - - // Hack for Geosite, it provides a whitelist... - matchedResult = defaultMatcher.matchesAny(url, host) - if (matchedResult instanceof BlockingFilter) { - return proxy - } else if (matchedResult instanceof WhitelistFilter) { - return direct - } - - return direct - } - - - return { - FindProxyForURL, - proxyUrl: __PROXY__ - } -} - -module.exports = { - createPacClient -} diff --git a/packages/mitmproxy/src/lib/proxy/mitmproxy/createConnectHandler.js b/packages/mitmproxy/src/lib/proxy/mitmproxy/createConnectHandler.js deleted file mode 100644 index 6008eecd88..0000000000 --- a/packages/mitmproxy/src/lib/proxy/mitmproxy/createConnectHandler.js +++ /dev/null @@ -1,213 +0,0 @@ -const net = require('node:net') -const URL = require('node:url') -const jsonApi = require('../../../json') -const log = require('../../../utils/util.log.server') -const DnsUtil = require('../../dns') -const dnsLookup = require('./dnsLookup') - -const localIP = '127.0.0.1' - -function isSslConnect (sslConnectInterceptors, req, cltSocket, head) { - for (const intercept of sslConnectInterceptors) { - const ret = intercept(req, cltSocket, head) - log.debug('当前拦截器返回结果:', ret, `, url: ${req.url}, intercept:`, intercept) - if (ret == null) { - continue - } - return !(ret === false || ret === 'false') - } - return false -} - -// create connectHandler function -module.exports = function createConnectHandler (sslConnectInterceptor, middlewares, fakeServerCenter, dnsConfig, compatibleConfig) { - // return - const sslConnectInterceptors = [] - sslConnectInterceptors.push(sslConnectInterceptor) - for (const middleware of middlewares) { - if (middleware.sslConnectInterceptor) { - sslConnectInterceptors.push(middleware.sslConnectInterceptor) - } - } - - return function connectHandler (req, cltSocket, head, ssl) { - const url = `${ssl ? 'https' : 'http'}://${req.url}` - // eslint-disable-next-line node/no-deprecated-api - let { hostname, port } = URL.parse(url) - port = Number.parseInt(port) - - if (isSslConnect(sslConnectInterceptors, req, cltSocket, head)) { - // 需要拦截,代替目标服务器,让客户端连接DS在本地启动的代理服务 - fakeServerCenter.getServerPromise(hostname, port, ssl, compatibleConfig).then((serverObj) => { - log.info(`----- fakeServer connect: ${localIP}:${serverObj.port} ➜ ${req.url} -----`) - connect(req, cltSocket, head, localIP, serverObj.port, null, false, hostname) - }, (e) => { - log.error(`----- fakeServer getServerPromise error: ${hostname}:${port}, error:`, e) - }).catch((e) => { - log.error(`----- fakeServer getServerPromise error: ${hostname}:${port}, error:`, e) - }) - } else { - log.info(`不拦截请求,直连目标服务器: ${hostname}:${port}, headers:`, jsonApi.stringify2(req.headers)) - connect(req, cltSocket, head, hostname, port, dnsConfig, true) - } - } -} - -function connect (req, cltSocket, head, hostname, port, dnsConfig = null, isDirect = false, target = null) { - // tunneling https - // log.info('connect:', hostname, port) - const start = Date.now() - const isDnsIntercept = {} - let hostport = `${hostname}:${port}` - - // 用于记录日志 - const connectInfo = isDirect ? hostport : `fakeServer: ${hostport}, target: ${target}` - - try { - // 客户端的连接事件监听 - cltSocket.on('timeout', () => { - log.error(`cltSocket timeout: ${connectInfo}`) - }) - cltSocket.on('error', (e) => { - log.error(`cltSocket error: ${connectInfo}, errorMsg: ${e.message}`) - }) - // 开发过程中,如有需要可以将此参数临时改为true,打印所有事件的日志 - const printDebugLog = process.env.NODE_ENV === 'development' && false - if (printDebugLog) { - cltSocket.on('close', (hadError) => { - log.debug('【cltSocket close】', hadError) - }) - cltSocket.on('connect', () => { - log.debug('【cltSocket connect】') - }) - cltSocket.on('connectionAttempt', (ip, port, family) => { - log.debug(`【cltSocket connectionAttempt】${ip}:${port}: ${connectInfo}, family:`, family) - }) - cltSocket.on('connectionAttemptFailed', (ip, port, family) => { - log.debug(`【cltSocket connectionAttemptFailed】${ip}:${port}: ${connectInfo}, family:`, family) - }) - cltSocket.on('connectionAttemptTimeout', (ip, port, family) => { - log.debug(`【cltSocket connectionAttemptTimeout】${ip}:${port}: ${connectInfo}, family:`, family) - }) - cltSocket.on('data', (_data) => { - log.debug(`【cltSocket data】${connectInfo}`) - }) - cltSocket.on('drain', () => { - log.debug(`【cltSocket drain】${connectInfo}`) - }) - cltSocket.on('end', () => { - log.debug(`【cltSocket end】${connectInfo}`) - }) - // cltSocket.on('lookup', (err, address, family, host) => { - // }) - cltSocket.on('ready', () => { - log.debug(`【cltSocket ready】${connectInfo}`) - }) - } - - // --------------------------------------------------------------------------------------------------- - - const options = { - port, - host: hostname, - connectTimeout: 10000, - } - if (dnsConfig && dnsConfig.dnsMap) { - const dnsAndFamily = DnsUtil.getDNSAndFamily(dnsConfig, hostname) - if (dnsAndFamily) { - options.lookup = dnsLookup.createLookupFunc(null, dnsAndFamily, 'connect', hostport, port, isDnsIntercept) - if (dnsAndFamily.family === 6) { - options.family = 6 - hostport += '(IPv6)' - } - } - } - // 代理连接事件监听 - const proxySocket = net.connect(options, () => { - if (!isDirect) { - log.info(`Proxy connect start: ${hostport}`) - } else { - log.debug('Direct connect start:', hostport) - } - - cltSocket.write('HTTP/1.1 200 Connection Established\r\n' - + 'Proxy-agent: dev-sidecar\r\n' - + '\r\n') - proxySocket.write(head) - proxySocket.pipe(cltSocket) - - cltSocket.pipe(proxySocket) - }) - proxySocket.on('timeout', () => { - const cost = Date.now() - start - const errorMsg = `${isDirect ? '直连' : '代理连接'}超时: ${hostport}, cost: ${cost} ms` - log.error(errorMsg) - - cltSocket.write('HTTP/1.1 408 Proxy connect timeout\r\n' - + 'Proxy-agent: dev-sidecar\r\n' - + '\r\n') - cltSocket.end() - cltSocket.destroy() - - if (isDnsIntercept && isDnsIntercept.dns && isDnsIntercept.ip !== isDnsIntercept.hostname) { - const { dns, ip, hostname } = isDnsIntercept - dns.count(hostname, ip, true) - log.error(`记录ip失败次数,用于优选ip! hostname: ${hostname}, ip: ${ip}, reason: ${errorMsg}, dns: ${dns.dnsName}`) - } - }) - proxySocket.on('error', (e) => { - // 连接失败,可能被GFW拦截,或者服务端拥挤 - const cost = Date.now() - start - const errorMsg = `${isDirect ? '直连' : '代理连接'}失败: ${hostport}, cost: ${cost} ms, errorMsg: ${e.message}` - log.error(`${errorMsg}\r\n`, e) - - cltSocket.write(`HTTP/1.1 400 Proxy connect error: ${e.message}\r\n` - + 'Proxy-agent: dev-sidecar\r\n' - + '\r\n') - cltSocket.end() - cltSocket.destroy() - - if (isDnsIntercept && isDnsIntercept.dns && isDnsIntercept.ip !== isDnsIntercept.hostname) { - const { dns, ip, hostname } = isDnsIntercept - dns.count(hostname, ip, true) - log.error(`记录ip失败次数,用于优选ip! hostname: ${hostname}, ip: ${ip}, reason: ${errorMsg}, dns: ${dns.dnsName}`) - } - }) - - if (printDebugLog) { - proxySocket.on('close', (hadError) => { - log.debug('【proxySocket close】', hadError) - }) - proxySocket.on('connect', () => { - log.debug('【proxySocket connect】') - }) - proxySocket.on('connectionAttempt', (ip, port, family) => { - log.debug(`【proxySocket connectionAttempt】${ip}:${port}, family:`, family) - }) - proxySocket.on('connectionAttemptFailed', (ip, port, family) => { - log.debug(`【proxySocket connectionAttemptFailed】${ip}:${port}, family:`, family) - }) - proxySocket.on('connectionAttemptTimeout', (ip, port, family) => { - log.debug(`【proxySocket connectionAttemptTimeout】${ip}:${port}, family:`, family) - }) - proxySocket.on('data', (_data) => { - log.debug('【proxySocket data】') - }) - proxySocket.on('drain', () => { - log.debug('【proxySocket drain】') - }) - proxySocket.on('end', () => { - log.debug('【proxySocket end】') - }) - // proxySocket.on('lookup', (err, address, family, host) => { - // }) - proxySocket.on('ready', () => { - log.debug('【proxySocket ready】') - }) - } - - return proxySocket - } catch (e) { - log.error(`${isDirect ? '直连' : '代理连接'}错误: ${hostport}, error:`, e) - } -} diff --git a/packages/mitmproxy/src/lib/proxy/mitmproxy/createFakeServerCenter.js b/packages/mitmproxy/src/lib/proxy/mitmproxy/createFakeServerCenter.js deleted file mode 100644 index 898f772ac6..0000000000 --- a/packages/mitmproxy/src/lib/proxy/mitmproxy/createFakeServerCenter.js +++ /dev/null @@ -1,34 +0,0 @@ -const fs = require('node:fs') -const forge = require('node-forge') -const log = require('../../../utils/util.log.server') -const FakeServersCenter = require('../tls/FakeServersCenter') - -module.exports = function createFakeServerCenter ({ - maxLength, - caCertPath, - caKeyPath, - requestHandler, - upgradeHandler, -}) { - let caCert - let caKey - try { - fs.accessSync(caCertPath, fs.F_OK) - fs.accessSync(caKeyPath, fs.F_OK) - const caCertPem = fs.readFileSync(caCertPath) - const caKeyPem = fs.readFileSync(caKeyPath) - caCert = forge.pki.certificateFromPem(caCertPem) - caKey = forge.pki.privateKeyFromPem(caKeyPem) - } catch (e) { - log.error('Can not find `CA certificate` or `CA key`:', e) - process.exit(1) - } - - return new FakeServersCenter({ - caCert, - caKey, - maxLength, - requestHandler, - upgradeHandler, - }) -} diff --git a/packages/mitmproxy/src/lib/proxy/mitmproxy/createRequestHandler.js b/packages/mitmproxy/src/lib/proxy/mitmproxy/createRequestHandler.js deleted file mode 100644 index 2c9af5f599..0000000000 --- a/packages/mitmproxy/src/lib/proxy/mitmproxy/createRequestHandler.js +++ /dev/null @@ -1,387 +0,0 @@ -const http = require('node:http') -const https = require('node:https') -const jsonApi = require('../../../json') -const log = require('../../../utils/util.log.server') -const RequestCounter = require('../../choice/RequestCounter') -const commonUtil = require('../common/util') -// const upgradeHeader = /(^|,)\s*upgrade\s*($|,)/i -const DnsUtil = require('../../dns') -const compatible = require('../compatible/compatible') -const InsertScriptMiddleware = require('../middleware/InsertScriptMiddleware') -const dnsLookup = require('./dnsLookup') - -const MAX_SLOW_TIME = 8000 // 超过此时间 则认为太慢了 -const WWW_AUTH_HEADER_RE = /^www-authenticate$/i - -// create requestHandler function -module.exports = function createRequestHandler (createIntercepts, middlewares, externalProxy, dnsConfig, setting, compatibleConfig) { - // return - return function requestHandler (req, res, ssl) { - let proxyReq - - const rOptions = commonUtil.getOptionsFromRequest(req, ssl, externalProxy, setting, compatibleConfig) - let url = `${rOptions.method} ➜ ${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${rOptions.path}` - - if (rOptions.headers.connection === 'close') { - req.socket.setKeepAlive(false) - } else if (rOptions.customSocketId != null) { // for NTLM - req.socket.setKeepAlive(true, 60 * 60 * 1000) - } else { - req.socket.setKeepAlive(true, 30000) - } - const context = { - rOptions, - log, - RequestCounter, - setting, - } - let interceptors = createIntercepts(context) - if (interceptors == null) { - interceptors = [] - } - const reqIncpts = interceptors.filter((item) => { - return item.requestIntercept != null - }) - const resIncpts = interceptors.filter((item) => { - return item.responseIntercept != null - }) - - const requestInterceptorPromise = () => { - return new Promise((resolve, reject) => { - const next = () => { - resolve() - } - try { - if (setting.script.enabled) { - reqIncpts.unshift(InsertScriptMiddleware) - } - for (const middleware of middlewares) { - reqIncpts.push(middleware) - } - if (reqIncpts && reqIncpts.length > 0) { - for (const reqIncpt of reqIncpts) { - if (!reqIncpt.requestIntercept) { - continue - } - const goNext = reqIncpt.requestIntercept(context, req, res, ssl, next) - if (goNext) { - if (goNext !== 'no-next') { - next() - } - return - } - } - next() - } else { - next() - } - } catch (e) { - reject(e) - } - }) - } - - function countSlow (isDnsIntercept, reason) { - if (isDnsIntercept && isDnsIntercept.dns && isDnsIntercept.ip !== isDnsIntercept.hostname) { - const { dns, ip, hostname } = isDnsIntercept - dns.count(hostname, ip, true) - log.error(`记录ip失败次数,用于优选ip! hostname: ${hostname}, ip: ${ip}, reason: ${reason}, dns: ${dns.dnsName}`) - } - const counter = context.requestCount - if (counter != null) { - counter.count.doCount(counter.value, true) - log.error(`记录Proxy请求失败次数,用于切换备选域名! hostname: ${counter.value}, reason: ${reason}, counter.count:`, counter.count) - } - } - - const proxyRequestPromise = async () => { - rOptions.host = rOptions.hostname || rOptions.host || 'localhost' - return new Promise((resolve, reject) => { - // use the binded socket for NTLM - if (rOptions.agent && rOptions.customSocketId != null && rOptions.agent.getName) { - const socketName = rOptions.agent.getName(rOptions) - const bindingSocket = rOptions.agent.sockets[socketName] - if (bindingSocket && bindingSocket.length > 0) { - bindingSocket[0].once('free', onFree) - return - } - } - onFree() - - function onFree () { - url = `${rOptions.method} ➜ ${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${rOptions.path}` - const start = Date.now() - log.info('发起代理请求:', url, (rOptions.servername ? `, sni: ${rOptions.servername}` : ''), ', headers:', jsonApi.stringify2(rOptions.headers)) - - const isDnsIntercept = {} - if (dnsConfig && dnsConfig.dnsMap) { - let dnsAndFamily = DnsUtil.getDNSAndFamily(dnsConfig, rOptions.hostname) - if (!dnsAndFamily && rOptions.servername) { - const dns = dnsConfig.dnsMap.ForSNI - if (dns) { - dnsAndFamily = { dns } - log.info(`域名 ${rOptions.hostname} 在dns中未配置,但使用了 sni: ${rOptions.servername}, 必须使用dns,现默认使用 '${dnsAndFamily.dnsName}' DNS.`) - } else { - log.warn(`域名 ${rOptions.hostname} 在dns中未配置,但使用了 sni: ${rOptions.servername},然而DNS服务管理中,并未指定SNI默认使用的DNS。`) - } - } - if (dnsAndFamily) { - rOptions.lookup = dnsLookup.createLookupFunc(res, dnsAndFamily, 'request url', url, rOptions.port, isDnsIntercept) - if (dnsAndFamily.family === 6) { - rOptions.family = 6 - } - log.debug(`域名 ${rOptions.hostname} DNS: ${dnsAndFamily.dns.dnsName}, family: ${rOptions.family || 4}`) - res.setHeader('DS-DNS', dnsAndFamily.dns.dnsName) - } else { - log.info(`域名 ${rOptions.hostname} 在DNS中未配置`) - } - } else { - log.info(`域名 ${rOptions.hostname} DNS配置不存在`) - } - - // rOptions.sigalgs = 'RSA-PSS+SHA256:RSA-PSS+SHA512:ECDSA+SHA256' - // rOptions.agent.options.sigalgs = rOptions.sigalgs - // rOptions.ciphers = 'TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA256:ECDHE-RSA-AES256-SHA256:HIGH' - // rOptions.agent.options.ciphers = rOptions.ciphers - // log.debug('rOptions:', rOptions.hostname + rOptions.path, '\r\n', rOptions) - // log.debug('agent:', rOptions.agent) - // log.debug('agent.options:', rOptions.agent.options) - res.setHeader('DS-Proxy-Request', `${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${req.url}`) - - // 自动兼容程序:2 - if (rOptions.agent) { - const compatibleConfig = compatible.getRequestCompatibleConfig(rOptions, rOptions.compatibleConfig) - if (compatibleConfig && compatibleConfig.rejectUnauthorized != null && rOptions.agent.options.rejectUnauthorized !== compatibleConfig.rejectUnauthorized) { - if (compatibleConfig.rejectUnauthorized === false && rOptions.agent.unVerifySslAgent) { - log.info(`【自动兼容程序】${rOptions.hostname}:${rOptions.port}: 设置 'rOptions.agent.options.rejectUnauthorized = ${compatibleConfig.rejectUnauthorized}'`) - rOptions.agent = rOptions.agent.unVerifySslAgent - res.setHeader('DS-Compatible', 'unVerifySsl') - } - } - } - - res.setHeader('DS-Proxy-Request-Family', rOptions.family || 4) - proxyReq = (rOptions.protocol === 'https:' ? https : http).request(rOptions, (proxyRes) => { - const cost = Date.now() - start - if (rOptions.protocol === 'https:') { - log.info(`代理请求返回: 【${proxyRes.statusCode}】${url}, cost: ${cost} ms`) - } else { - log.info(`请求返回: 【${proxyRes.statusCode}】${url}, cost: ${cost} ms`) - } - // log.info('request:', proxyReq, proxyReq.socket) - - if (cost > MAX_SLOW_TIME) { - countSlow(isDnsIntercept, `代理请求成功但太慢, cost: ${cost} ms > ${MAX_SLOW_TIME} ms`) - } - - resolve(proxyRes) - }) - - // 代理请求的事件监听 - proxyReq.on('timeout', () => { - const cost = Date.now() - start - const errorMsg = `代理请求超时: ${url}, cost: ${cost} ms` - log.error(errorMsg, ', rOptions:', jsonApi.stringify2(rOptions)) - countSlow(isDnsIntercept, `代理请求超时, cost: ${cost} ms`) - proxyReq.end() - proxyReq.destroy() - const error = new Error(errorMsg) - error.status = 408 - reject(error) - }) - proxyReq.on('error', (e) => { - const cost = Date.now() - start - log.error(`代理请求错误: ${url}, cost: ${cost} ms, error:`, e, ', rOptions:', jsonApi.stringify2(rOptions)) - countSlow(isDnsIntercept, `代理请求错误: ${e.message}`) - reject(e) - - // 自动兼容程序:2 - if (e.code === 'DEPTH_ZERO_SELF_SIGNED_CERT') { - compatible.setRequestRejectUnauthorized(rOptions, false) - } - }) - proxyReq.on('aborted', () => { - const cost = Date.now() - start - const errorMsg = `代理请求被取消: ${url}, cost: ${cost} ms` - log.error(errorMsg, ', rOptions:', jsonApi.stringify2(rOptions)) - - if (cost > MAX_SLOW_TIME) { - countSlow(isDnsIntercept, `代理请求被取消,且请求太慢, cost: ${cost} ms > ${MAX_SLOW_TIME} ms`) - } - - if (res.writableEnded) { - return - } - reject(new Error(errorMsg)) - }) - - // 原始请求的事件监听 - req.on('aborted', () => { - const cost = Date.now() - start - const errorMsg = `请求被取消: ${url}, cost: ${cost} ms` - log.error(errorMsg, ', rOptions:', jsonApi.stringify2(rOptions)) - proxyReq.destroy() - if (res.writableEnded) { - return - } - reject(new Error(errorMsg)) - }) - req.on('error', (e) => { - const cost = Date.now() - start - log.error(`请求错误: ${url}, cost: ${cost} ms, error:`, e, ', rOptions:', jsonApi.stringify2(rOptions)) - reject(e) - }) - req.on('timeout', () => { - const cost = Date.now() - start - const errorMsg = `请求超时: ${url}, cost: ${cost} ms` - log.error(errorMsg, ', rOptions:', jsonApi.stringify2(rOptions)) - reject(new Error(errorMsg)) - }) - req.pipe(proxyReq) - } - }) - } - - // workflow control - (async () => { - await requestInterceptorPromise() - - if (res.writableEnded) { - // log.info('res is writableEnded, return false') - return false - } - - const proxyRes = await proxyRequestPromise() - - // proxyRes.on('data', (chunk) => { - // // log.info('BODY: ') - // }) - proxyRes.on('error', (error) => { - countSlow(null, `error: ${error.message}`) - log.error(`proxy res error: ${url}, error:`, error) - }) - - const responseInterceptorPromise = new Promise((resolve, reject) => { - const next = () => { - resolve() - } - for (const middleware of middlewares) { - if (middleware.responseInterceptor) { - middleware.responseInterceptor(req, res, proxyReq, proxyRes, ssl, next) - } - } - if (!setting.script.enabled) { - next() - return - } - try { - if (resIncpts && resIncpts.length > 0) { - let head = '' - let body = '' - for (const resIncpt of resIncpts) { - const append = resIncpt.responseIntercept(context, req, res, proxyReq, proxyRes, ssl, next) - // 判断是否已经关闭 - if (res.writableEnded) { - next() - return - } - if (append) { - if (append.head) { - head += append.head - } - if (append.body) { - body += append.body - } - } else if (append === false) { - break // 返回false表示终止拦截器,跳出循环 - } - } - InsertScriptMiddleware.responseInterceptor(req, res, proxyReq, proxyRes, ssl, next, { - head, - body, - }) - } else { - next() - } - } catch (e) { - reject(e) - } - }) - - await responseInterceptorPromise - - if (!res.headersSent) { // prevent duplicate set headers - Object.keys(proxyRes.headers).forEach((key) => { - if (proxyRes.headers[key] !== undefined) { - // https://github.com/nodejitsu/node-http-proxy/issues/362 - if (WWW_AUTH_HEADER_RE.test(key)) { - if (proxyRes.headers[key]) { - proxyRes.headers[key] = proxyRes.headers[key] && proxyRes.headers[key].split(',') - } - key = 'www-authenticate' - } - res.setHeader(key, proxyRes.headers[key]) - } - }) - - if (proxyRes.statusCode >= 400) { - countSlow(null, `Status return: ${proxyRes.statusCode}`) - } - res.writeHead(proxyRes.statusCode) - proxyRes.pipe(res) - } - })().catch((e) => { - if (!res.writableEnded) { - try { - const status = e.status || 500 - - const headers = { 'Content-Type': 'text/html;charset=UTF8' } - - // headers.Access-Control-Allow-*:避免跨域问题 - if (rOptions.headers.origin) { - headers['Access-Control-Allow-Credentials'] = 'true' - headers['Access-Control-Allow-Origin'] = rOptions.headers.origin - } - - res.writeHead(status, headers) - res.write(` -

DevSidecar Error:

-

目标网站请求错误:【${e.code}】 ${e.message}

-

目标地址:${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${rOptions.path}

`, - ) - } catch { - // do nothing - } - - try { - res.end() - } catch { - // do nothing - } - - // region 忽略部分已经打印过ERROR日志的错误 - if (e.message) { - const ignoreErrors = [ - '代理请求错误: ', - '代理请求超时: ', - '代理请求被取消: ', - ] - for (const ignoreError of ignoreErrors) { - if (e.message.startsWith(ignoreError)) { - return - } - } - } - // endregion - - log.error(`Request error: ${url}, error:`, e) - } - }) - } -} diff --git a/packages/mitmproxy/src/lib/proxy/mitmproxy/createUpgradeHandler.js b/packages/mitmproxy/src/lib/proxy/mitmproxy/createUpgradeHandler.js deleted file mode 100644 index 5b7d16c33f..0000000000 --- a/packages/mitmproxy/src/lib/proxy/mitmproxy/createUpgradeHandler.js +++ /dev/null @@ -1,63 +0,0 @@ -const http = require('node:http') -const https = require('node:https') -const log = require('../../../utils/util.log.server') -const util = require('../common/util') - -// copy from node-http-proxy. ^_^ - -// create connectHandler function -module.exports = function createUpgradeHandler (serverSetting) { - // return - return function upgradeHandler (req, cltSocket, head, ssl) { - const clientOptions = util.getOptionsFromRequest(req, ssl, null, serverSetting) - const proxyReq = (ssl ? https : http).request(clientOptions) - proxyReq.on('error', (e) => { - log.error('upgradeHandler error:', e) - }) - proxyReq.on('response', (res) => { - // if upgrade event isn't going to happen, close the socket - if (!res.upgrade) { - cltSocket.end() - } - }) - - proxyReq.on('upgrade', (proxyRes, proxySocket, proxyHead) => { - proxySocket.on('error', (e) => { - log.error('upgrade error:', e) - }) - - cltSocket.on('error', (e) => { - log.error('upgrade socket error:', e) - proxySocket.end() - }) - - proxySocket.setTimeout(0) - proxySocket.setNoDelay(true) - - proxySocket.setKeepAlive(true, 0) - - if (proxyHead && proxyHead.length) { - proxySocket.unshift(proxyHead) - } - - cltSocket.write( - `${Object.keys(proxyRes.headers).reduce((head, key) => { - const value = proxyRes.headers[key] - - if (!Array.isArray(value)) { - head.push(`${key}: ${value}`) - return head - } - - for (let i = 0; i < value.length; i++) { - head.push(`${key}: ${value[i]}`) - } - return head - }, ['HTTP/1.1 101 Switching Protocols']).join('\r\n')}\r\n\r\n`, - ) - - proxySocket.pipe(cltSocket).pipe(proxySocket) - }) - proxyReq.end() - } -} diff --git a/packages/mitmproxy/src/lib/proxy/mitmproxy/dnsLookup.js b/packages/mitmproxy/src/lib/proxy/mitmproxy/dnsLookup.js deleted file mode 100644 index f25df8c595..0000000000 --- a/packages/mitmproxy/src/lib/proxy/mitmproxy/dnsLookup.js +++ /dev/null @@ -1,100 +0,0 @@ -const defaultDns = require('node:dns') -const net = require('node:net') -const log = require('../../../utils/util.log.server') -const speedTest = require('../../speed') - -function isValidIpAddress (ip) { - return typeof ip === 'string' && net.isIP(ip) !== 0 -} - -function getAddressFamily (ip) { - return net.isIP(ip) === 6 ? 6 : 4 -} - -function respondLookup (callback, ip, family, all) { - if (all) { - callback(null, [{ address: ip, family }]) - return - } - - callback(null, ip, family) -} - -function createIpChecker (tester) { - if (!tester || tester.backupList == null || tester.backupList.length === 0) { - return null - } - - return (ip) => { - for (let i = 0; i < tester.backupList.length; i++) { - const item = tester.backupList[i] - if (item.host === ip) { - if (item.time > 0) { - return true // IP测速成功 - } - if (item.status === 'failed') { - return false // IP测速失败 - } - break - } - } - - return true // IP测速未知 - } -} - -module.exports = { - createLookupFunc (res, dnsAndFamily, action, target, port, isDnsIntercept) { - target = target ? (`, target: ${target}`) : '' - - const dns = dnsAndFamily.dns - const family = Number.parseInt(dnsAndFamily.family) === 6 ? 6 : 4 - - return (hostname, options, callback) => { - const all = options && options.all === true - const tester = speedTest.getSpeedTester(hostname, port) - if (tester) { - const aliveIpObj = tester.pickFastAliveIpObj() - if (aliveIpObj && isValidIpAddress(aliveIpObj.host)) { - const addressFamily = getAddressFamily(aliveIpObj.host) - log.info(`----- ${action}: ${hostname}, use alive ip from dns '${aliveIpObj.dns}': ${aliveIpObj.host}${target} -----`) - if (res) { - res.setHeader('DS-DNS-Lookup', `IpTester: ${aliveIpObj.host} ${aliveIpObj.dns === '预设IP' ? 'PreSet' : aliveIpObj.dns}`) - } - respondLookup(callback, aliveIpObj.host, addressFamily, all) - return - } else { - log.info(`----- ${action}: ${hostname}, no valid alive ip${target}, tester: { "ready": ${tester.ready}, "backupList": ${JSON.stringify(tester.backupList)} }`) - } - } - - const ipChecker = createIpChecker(tester) - - dns.lookup(hostname, { ipChecker, family }).then((ip) => { - if (ip !== hostname && isValidIpAddress(ip)) { - const addressFamily = getAddressFamily(ip) - if (isDnsIntercept) { - isDnsIntercept.dns = dns - isDnsIntercept.hostname = hostname - isDnsIntercept.ip = ip - } - log.info(`----- ${action}: ${hostname}, use ip from dns '${dns.dnsName}': ${ip}(family: ${addressFamily})${target} -----`) - if (res) { - res.setHeader('DS-DNS-Lookup', `DNS: ${ip}(IPv${addressFamily}) ${dns.dnsName === '预设IP' ? 'PreSet' : dns.dnsName}`) - } - respondLookup(callback, ip, addressFamily, all) - } else { - // 使用默认dns - if (ip != null && ip !== hostname && !isValidIpAddress(ip)) { - log.warn(`----- ${action}: ${hostname}, dns returned invalid ip '${ip}'${target}, fallback to default DNS`) - } - log.info(`----- ${action}: ${hostname}, use default DNS: ${hostname}${target}, options:`, options, ', dns:', dns) - defaultDns.lookup(hostname, options, callback) - } - }).catch((err) => { - log.error(`----- ${action}: ${hostname}, dns lookup error${target}, options:`, options, `, error:`, err) - defaultDns.lookup(hostname, options, callback) - }) - } - }, -} diff --git a/packages/mitmproxy/src/lib/proxy/mitmproxy/index.js b/packages/mitmproxy/src/lib/proxy/mitmproxy/index.js deleted file mode 100644 index fa292a99a2..0000000000 --- a/packages/mitmproxy/src/lib/proxy/mitmproxy/index.js +++ /dev/null @@ -1,161 +0,0 @@ -const http = require('node:http') -const log = require('../../../utils/util.log.server') -const speedTest = require('../../speed/index.js') -const config = require('../common/config') -const tlsUtils = require('../tls/tlsUtils') -const createConnectHandler = require('./createConnectHandler') -const createFakeServerCenter = require('./createFakeServerCenter') -const createRequestHandler = require('./createRequestHandler') -const createUpgradeHandler = require('./createUpgradeHandler') - -module.exports = { - createProxy ({ - host = config.defaultHost, - port = config.defaultPort, - maxLength = config.defaultMaxLength, - caCertPath, - caKeyPath, - sslConnectInterceptor, - createIntercepts, - middlewares = [], - externalProxy, - dnsConfig, - setting, - compatibleConfig, - }, callback) { - // Don't reject unauthorized - // process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' - log.info(`CA Cert read in: ${caCertPath}`) - log.info(`CA private key read in: ${caKeyPath}`) - if (!caCertPath) { - caCertPath = config.getDefaultCACertPath() - } - if (!caKeyPath) { - caKeyPath = config.getDefaultCAKeyPath() - } - const rs = this.createCA({ caCertPath, caKeyPath }) - if (rs.create) { - log.info(`CA Cert saved in: ${caCertPath}`) - log.info(`CA private key saved in: ${caKeyPath}`) - } - - port = ~~port - const speedTestConfig = dnsConfig.speedTest - const dnsMap = dnsConfig.dnsMap - if (speedTestConfig) { - const dnsProviders = speedTestConfig.dnsProviders - const map = {} - for (const dnsProvider of dnsProviders) { - if (dnsMap[dnsProvider]) { - map[dnsProvider] = dnsMap[dnsProvider] - } - } - speedTest.initSpeedTest({ ...speedTestConfig, dnsMap: map }) - } - - const requestHandler = createRequestHandler( - createIntercepts, - middlewares, - externalProxy, - dnsConfig, - setting, - compatibleConfig, - ) - - const upgradeHandler = createUpgradeHandler(setting) - - const fakeServersCenter = createFakeServerCenter({ - maxLength, - caCertPath, - caKeyPath, - requestHandler, - upgradeHandler, - }) - - const connectHandler = createConnectHandler( - sslConnectInterceptor, - middlewares, - fakeServersCenter, - dnsConfig, - compatibleConfig, - ) - - // 创建监听方法,用于监听 http 和 https 两个端口 - const printDebugLog = process.env.NODE_ENV === 'development' && false // 开发过程中,如有需要可以将此参数临时改为true,打印所有事件的日志 - const serverListen = (server, ssl, port, host) => { - server.listen(port, host, () => { - log.info(`dev-sidecar启动 ${ssl ? 'https' : 'http'} 端口: ${host}:${port}`) - server.on('request', (req, res) => { - if (printDebugLog) { - log.debug(`【server request, ssl: ${ssl}】\r\n----- req -----\r\n`, req, '\r\n----- res -----\r\n', res) - } - requestHandler(req, res, ssl) - }) - // tunneling for https - server.on('connect', (req, cltSocket, head) => { - if (printDebugLog) { - log.debug(`【server connect, ssl: ${ssl}】\r\n----- req -----\r\n`, req, '\r\n----- cltSocket -----\r\n', cltSocket, '\r\n----- head -----\r\n', head) - } - connectHandler(req, cltSocket, head, ssl) - }) - // TODO: handler WebSocket - server.on('upgrade', (req, cltSocket, head) => { - if (printDebugLog) { - log.debug(`【server upgrade, ssl: ${ssl}】\r\n----- req -----\r\n`, req) - } else { - log.info(`【server upgrade, ssl: ${ssl}】`, req.url) - } - upgradeHandler(req, cltSocket, head, ssl) - }) - server.on('error', (err) => { - log.error(`【server error, ssl: ${ssl}】\r\n----- error -----\r\n`, err) - }) - server.on('clientError', (err, cltSocket) => { - // log.error(`【server clientError, ssl: ${ssl}】\r\n----- error -----\r\n`, err, '\r\n----- cltSocket -----\r\n', cltSocket) - log.error(`【server clientError, ssl: ${ssl}】socket.localPort = ${cltSocket.localPort}\r\n`, err) - cltSocket.end('HTTP/1.1 400 Bad Request\r\n\r\n') - }) - - // 其他事件:仅记录debug日志 - if (printDebugLog) { - server.on('close', () => { - log.debug(`【server close, ssl: ${ssl}】no arguments...`) - }) - server.on('connection', (cltSocket) => { - log.debug(`【server connection, ssl: ${ssl}】\r\n----- cltSocket -----\r\n`, cltSocket) - }) - server.on('listening', () => { - log.debug(`【server listening, ssl: ${ssl}】no arguments...`) - }) - server.on('checkContinue', (req, res) => { - log.debug(`【server checkContinue, ssl: ${ssl}】\r\n----- req -----\r\n`, req, '\r\n----- res -----\r\n', res) - }) - server.on('checkExpectation', (req, res) => { - log.debug(`【server checkExpectation, ssl: ${ssl}】\r\n----- req -----\r\n`, req, '\r\n----- res -----\r\n', res) - }) - server.on('dropRequest', (req, cltSocket) => { - log.debug(`【server checkExpectation, ssl: ${ssl}】\r\n----- req -----\r\n`, req, '\r\n----- cltSocket -----\r\n', cltSocket) - }) - } - - if (callback) { - callback(server, port, host, ssl) - } - }) - } - - const httpsServer = new http.Server() - const httpServer = new http.Server() - - // `http端口` 比 `https端口` 要小1 - const httpsPort = port - const httpPort = port - 1 - serverListen(httpsServer, true, httpsPort, host) - serverListen(httpServer, false, httpPort, host) - - return [httpsServer, httpServer] - }, - createCA (caPaths) { - return tlsUtils.initCA(caPaths) - }, -} diff --git a/packages/mitmproxy/src/lib/proxy/tls/CertAndKeyContainer.js b/packages/mitmproxy/src/lib/proxy/tls/CertAndKeyContainer.js deleted file mode 100644 index 38bc5f1299..0000000000 --- a/packages/mitmproxy/src/lib/proxy/tls/CertAndKeyContainer.js +++ /dev/null @@ -1,51 +0,0 @@ -const tlsUtils = require('./tlsUtils') -const { LRUCache } = require('lru-cache') -const log = require('../../../utils/util.log.server') - -const DEFAULT_MAX_LENGTH = 256 - -module.exports = class CertAndKeyContainer { - constructor ({ - maxLength = DEFAULT_MAX_LENGTH, - caCert, - caKey, - }) { - // 缓存键:dnsName - this.cache = new LRUCache({ - maxSize: maxLength > 0 ? maxLength : DEFAULT_MAX_LENGTH, - sizeCalculation: () => { - return 1 - }, - dispose: (_evictCertPromiseObj, evictKey) => { - log.info(`旧证书缓存被移除:${evictKey}`) - }, - }) - this.caCert = caCert - this.caKey = caKey - } - - addCertPromise (certPromiseObj) { - // 添加缓存 - this.cache.set(certPromiseObj.dnsName, certPromiseObj) - } - - getCertPromise (hostname, port, dnsName, mappingHostNames) { - // 获取缓存 - const cached = this.cache.get(dnsName) - if (cached) { - log.debug(`Load fakeCertPromise from cache, hostname: ${hostname}:${port}, certPromiseObj: {"mappingHostNames":${JSON.stringify(cached.mappingHostNames)}}`) - return cached.promise - } - - log.info(`【CreateFakeCertificate】dnsName: ${dnsName}, hostname: ${hostname}:${port}`) - const promise = tlsUtils.createFakeCertificateByDomain(this.caKey, this.caCert, dnsName, mappingHostNames) - - this.addCertPromise({ - dnsName, - mappingHostNames, - promise, - }) - - return promise - } -} diff --git a/packages/mitmproxy/src/lib/proxy/tls/FakeServersCenter.js b/packages/mitmproxy/src/lib/proxy/tls/FakeServersCenter.js deleted file mode 100644 index b2978f5880..0000000000 --- a/packages/mitmproxy/src/lib/proxy/tls/FakeServersCenter.js +++ /dev/null @@ -1,247 +0,0 @@ -const http = require('node:http') -const https = require('node:https') -const tls = require('node:tls') -const forge = require('node-forge') -const { LRUCache } = require('lru-cache') -const CertAndKeyContainer = require('./CertAndKeyContainer') -const log = require('../../../utils/util.log.server') -const compatible = require('../compatible/compatible') - -const pki = forge.pki - -// IPv4地址检测正则,提前编译,避免在 getDnsName 中重复创建。 -// 不使用 /g 标志:此处只做存在性检测(.test()),无需记录 lastIndex 状态。 -const IPv4_RE = /\b(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\b){3}/ - -// 获取DNS名称 -function getDnsName (hostname) { - if (!hostname.includes('.')) { - return hostname // 可能是IPv6地址,直接返回 - } - - // 判断是否为IP - if (IPv4_RE.test(hostname)) { - return hostname // 为IP,直接返回 - } - - // 判断是否是一级域名 - if (hostname.indexOf('.') === hostname.lastIndexOf('.')) { - return `*.${hostname}` - } - - // 获取域名 - return `*${hostname.substring(hostname.indexOf('.'))}` -} - -const DEFAULT_MAX_LENGTH = 256 - -module.exports = class FakeServersCenter { - constructor ({ - maxLength = DEFAULT_MAX_LENGTH, - requestHandler, - upgradeHandler, - caCert, - caKey, - }) { - // 缓存键格式:`${dnsName}:${port}:${ssl}` - this.cache = new LRUCache({ - maxSize: maxLength > 0 ? maxLength : DEFAULT_MAX_LENGTH, - sizeCalculation: () => { - return 1 - }, - dispose: (evictServerPromiseObj, evictDnsName) => { - try { - evictServerPromiseObj.serverObj.server.close() - log.info(`旧fake服务缓存被移除,停止服务成功,${evictDnsName}`) - } catch (e) { - log.error(`旧fake服务缓存被移除,但停止服务失败,${evictDnsName} ->`, evictServerPromiseObj, `, error:`, e) - } - }, - }) - this.requestHandler = requestHandler - this.upgradeHandler = upgradeHandler - this.certAndKeyContainer = new CertAndKeyContainer({ - maxLength: maxLength > 0 ? maxLength : DEFAULT_MAX_LENGTH, - caCert, - caKey, - }) - } - - addServerPromise (serverPromiseObj) { - // 添加缓存 - this.cache.set(serverPromiseObj.cacheKey, serverPromiseObj) - } - - getServerPromise (hostname, port, ssl, manualCompatibleConfig) { - if (port === 443 || port === 80) { - ssl = port === 443 - } else if (ssl) { - // 自动兼容程序:1 - const compatibleConfig = compatible.getConnectCompatibleConfig(hostname, port, manualCompatibleConfig) - if (compatibleConfig && compatibleConfig.ssl != null) { - ssl = compatibleConfig.ssl - } - } - - const dnsName = getDnsName(hostname) - const cacheKey = `${dnsName}:${port}:${ssl}` - - const cachedServerObj = this.cache.get(cacheKey) - if (cachedServerObj) { - log.debug(`Load fakeServerPromise from cache, hostname: ${hostname}:${port}, ssl: ${ssl}, serverPromiseObj: {"ssl":${cachedServerObj.ssl},"port":${cachedServerObj.port},"mappingHostNames":${JSON.stringify(cachedServerObj.mappingHostNames)}}`) - return cachedServerObj.promise - } - - log.info(`getServerPromise, hostname: ${hostname}:${port}, ssl: ${ssl}, protocol: ${ssl ? 'https' : 'http'}`) - - const mappingHostNames = [dnsName] - if (dnsName.startsWith('*.')) { - mappingHostNames.push(dnsName.replace('*.', '')) - } - - const serverPromiseObj = { - cacheKey, - port, - ssl, - mappingHostNames, - } - - const promise = new Promise((resolve, reject) => { - (async () => { - let fakeServer - let cert - let key - - log.info(`【CreateFakeServer】hostname: ${hostname}:${port}, ssl: ${ssl}, protocol: ${ssl ? 'https' : 'http'}`) - - if (ssl) { - const certObj = await this.certAndKeyContainer.getCertPromise(hostname, port, dnsName, mappingHostNames) - cert = certObj.cert - key = certObj.key - const certPem = pki.certificateToPem(cert) - const keyPem = pki.privateKeyToPem(key) - const secureContext = tls.createSecureContext({ key: keyPem, cert: certPem }) - fakeServer = new https.Server({ - key: keyPem, - cert: certPem, - SNICallback: (hostname, done) => { - log.info(`fakeServer SNICallback: ${hostname}:${port}`) - done(null, secureContext) - }, - }) - } else { - fakeServer = new http.Server() - } - const serverObj = { - cert, - key, - server: fakeServer, - port: 0, // if port === 0 ,should listen server's `listening` event. - } - serverPromiseObj.serverObj = serverObj - - let isListening = false - - const printDebugLog = process.env.NODE_ENV === 'development' && false // 开发过程中,如有需要可以将此参数临时改为true,打印所有事件的日志 - fakeServer.listen(0, () => { - const address = fakeServer.address() - serverObj.port = address.port - }) - fakeServer.on('request', (req, res) => { - if (printDebugLog) { - log.debug(`【fakeServer request - ${hostname}:${port}】\r\n----- req -----\r\n`, req, '\r\n----- res -----\r\n', res) - } - this.requestHandler(req, res, ssl) - }) - fakeServer.on('listening', () => { - isListening = true - if (printDebugLog) { - log.debug(`【fakeServer listening - ${hostname}:${port}】no arguments...`) - } - resolve(serverObj) - }) - fakeServer.on('upgrade', (req, socket, head) => { - if (printDebugLog) { - log.debug(`【fakeServer upgrade - ${hostname}:${port}】\r\n----- req -----\r\n`, req, '\r\n----- socket -----\r\n', socket, '\r\n----- head -----\r\n', head) - } else { - log.info(`【fakeServer upgrade - ${hostname}:${port}】`, req.url) - } - this.upgradeHandler(req, socket, head, ssl) - }) - - // 三个 error 事件 - fakeServer.on('error', (e) => { - log.error(`【fakeServer error - ${hostname}:${port}】\r\n----- error -----\r\n`, e) - if (!isListening) { - reject(e) - } - }) - fakeServer.on('clientError', (err, _socket) => { - // log.error(`【fakeServer clientError - ${hostname}:${port}】\r\n----- error -----\r\n`, err, '\r\n----- socket -----\r\n', socket) - log.error(`【fakeServer clientError - ${hostname}:${port}】\r\n`, err) - - // 自动兼容程序:1 - if (port !== 443 && port !== 80) { - if (ssl === true && err.code && err.code.startsWith('ERR_SSL_')) { - compatible.setConnectSsl(hostname, port, false) - log.error(`自动兼容程序:SSL异常,现设置为禁用ssl: ${hostname}:${port}, ssl = false`) - } else if (ssl === false && err.code === 'HPE_INVALID_METHOD') { - compatible.setConnectSsl(hostname, port, true) - log.error(`自动兼容程序:${err.code},现设置为启用ssl: ${hostname}:${port}, ssl = true`) - } - } - }) - if (ssl) { - fakeServer.on('tlsClientError', (err, _tlsSocket) => { - if (err.code === 'ECONNRESET' || err.code === 'ETIMEDOUT') { - return // 在tlsClientError事件中,以上异常不记录日志 - } - // log.error(`【fakeServer tlsClientError - ${hostname}:${port}】\r\n----- error -----\r\n`, err, '\r\n----- tlsSocket -----\r\n', tlsSocket) - log.error(`【fakeServer tlsClientError - ${hostname}:${port}】\r\n`, err) - }) - } - - // 其他监听事件,只打印debug日志 - if (printDebugLog) { - if (ssl) { - fakeServer.on('keylog', (line, tlsSocket) => { - log.debug(`【fakeServer keylog - ${hostname}:${port}】\r\n----- line -----\r\n`, line, '\r\n----- tlsSocket -----\r\n', tlsSocket) - }) - // fakeServer.on('newSession', (sessionId, sessionData, callback) => { - // log.debug(`【fakeServer newSession - ${hostname}:${port}】\r\n----- sessionId -----\r\n`, sessionId, '\r\n----- sessionData -----\r\n', sessionData, '\r\n----- callback -----\r\n', callback) - // }) - // fakeServer.on('OCSPRequest', (certificate, issuer, callback) => { - // log.debug(`【fakeServer OCSPRequest - ${hostname}:${port}】\r\n----- certificate -----\r\n`, certificate, '\r\n----- issuer -----\r\n', issuer, '\r\n----- callback -----\r\n', callback) - // }) - // fakeServer.on('resumeSession', (sessionId, callback) => { - // log.debug(`【fakeServer resumeSession - ${hostname}:${port}】\r\n----- sessionId -----\r\n`, sessionId, '\r\n----- callback -----\r\n', callback) - // }) - fakeServer.on('secureConnection', (tlsSocket) => { - log.debug(`【fakeServer secureConnection - ${hostname}:${port}】\r\n----- tlsSocket -----\r\n`, tlsSocket) - }) - } - fakeServer.on('close', () => { - log.debug(`【fakeServer close - ${hostname}:${port}】no arguments...`) - }) - fakeServer.on('connection', (socket) => { - log.debug(`【fakeServer connection - ${hostname}:${port}】\r\n----- socket -----\r\n`, socket) - }) - fakeServer.on('checkContinue', (req, res) => { - log.debug(`【fakeServer checkContinue - ${hostname}:${port}】\r\n----- req -----\r\n`, req, '\r\n----- res -----\r\n', res) - }) - fakeServer.on('checkExpectation', (req, res) => { - log.debug(`【fakeServer checkExpectation - ${hostname}:${port}】\r\n----- req -----\r\n`, req, '\r\n----- res -----\r\n', res) - }) - fakeServer.on('connect', (req, socket, head) => { - log.debug(`【fakeServer resumeSession - ${hostname}:${port}】\r\n----- req -----\r\n`, req, '\r\n----- socket -----\r\n', socket, '\r\n----- head -----\r\n', head) - }) - } - })().catch(reject) - }) - - serverPromiseObj.promise = promise - this.addServerPromise(serverPromiseObj) - - return promise - } -} diff --git a/packages/mitmproxy/src/lib/proxy/tls/sniUtil.js b/packages/mitmproxy/src/lib/proxy/tls/sniUtil.js deleted file mode 100644 index c44657e83b..0000000000 --- a/packages/mitmproxy/src/lib/proxy/tls/sniUtil.js +++ /dev/null @@ -1,185 +0,0 @@ -module.exports = function extractSNI (data) { - /* - From https://tools.ietf.org/html/rfc5246: - enum { - hello_request(0), client_hello(1), server_hello(2), - certificate(11), server_key_exchange (12), - certificate_request(13), server_hello_done(14), - certificate_verify(15), client_key_exchange(16), - finished(20) - (255) - } HandshakeType; - struct { - HandshakeType msg_type; - uint24 length; - select (HandshakeType) { - case hello_request: HelloRequest; - case client_hello: ClientHello; - case server_hello: ServerHello; - case certificate: Certificate; - case server_key_exchange: ServerKeyExchange; - case certificate_request: CertificateRequest; - case server_hello_done: ServerHelloDone; - case certificate_verify: CertificateVerify; - case client_key_exchange: ClientKeyExchange; - case finished: Finished; - } body; - } Handshake; - struct { - uint8 major; - uint8 minor; - } ProtocolVersion; - struct { - uint32 gmt_unix_time; - opaque random_bytes[28]; - } Random; - opaque SessionID<0..32>; - uint8 CipherSuite[2]; - enum { null(0), (255) } CompressionMethod; - struct { - ProtocolVersion client_version; - Random random; - SessionID session_id; - CipherSuite cipher_suites<2..2^16-2>; - CompressionMethod compression_methods<1..2^8-1>; - select (extensions_present) { - case false: - struct {}; - case true: - Extension extensions<0..2^16-1>; - }; - } ClientHello; - */ - - let end = data.length - - // skip the record header - let pos = 5 - - // skip HandshakeType (you should already have verified this) - pos += 1 - - // skip handshake length - pos += 3 - - // skip protocol version (you should already have verified this) - pos += 2 - - // skip Random - pos += 32 - - // skip SessionID - if (pos > end - 1) { - return null - } - const sessionIdLength = data[pos] - pos += 1 + sessionIdLength - - // skip CipherSuite - if (pos > end - 2) { - return null - } - const cipherSuiteLength = data[pos] << 8 | data[pos + 1] - pos += 2 + cipherSuiteLength - - // skip CompressionMethod - if (pos > end - 1) { - return null - } - const compressionMethodLength = data[pos] - pos += 1 + compressionMethodLength - - // verify extensions exist - if (pos > end - 2) { - return null - } - const extensionsLength = data[pos] << 8 | data[pos + 1] - pos += 2 - - // verify the extensions fit - const extensionsEnd = pos + extensionsLength - if (extensionsEnd > end) { - return null - } - end = extensionsEnd - - /* - From https://tools.ietf.org/html/rfc5246 - and http://tools.ietf.org/html/rfc6066: - struct { - ExtensionType extension_type; - opaque extension_data<0..2^16-1>; - } Extension; - enum { - signature_algorithms(13), (65535) - } ExtensionType; - enum { - server_name(0), max_fragment_length(1), - client_certificate_url(2), trusted_ca_keys(3), - truncated_hmac(4), status_request(5), (65535) - } ExtensionType; - struct { - NameType name_type; - select (name_type) { - case host_name: HostName; - } name; - } ServerName; - enum { - host_name(0), (255) - } NameType; - opaque HostName<1..2^16-1>; - struct { - ServerName server_name_list<1..2^16-1> - } ServerNameList; - */ - - while (pos <= end - 4) { - const extensionType = data[pos] << 8 | data[pos + 1] - const extensionSize = data[pos + 2] << 8 | data[pos + 3] - pos += 4 - if (extensionType === 0) { // ExtensionType was server_name(0) - // read ServerNameList length - if (pos > end - 2) { - return null - } - const nameListLength = data[pos] << 8 | data[pos + 1] - pos += 2 - - // verify we have enough bytes and loop over SeverNameList - let n = pos - pos += nameListLength - if (pos > end) { - return null - } - while (n < pos - 3) { - const nameType = data[n] - const nameLength = data[n + 1] << 8 | data[n + 2] - n += 3 - - // check if NameType is host_name(0) - if (nameType === 0) { - // verify we have enough bytes - if (n > end - nameLength) { - return null - } - - // decode as ascii and return - - const sniName = data.toString('ascii', n, n + nameLength) - return { - sniName, - start: n, - end: n + nameLength, - length: nameLength, - } - } else { - n += nameLength - } - } - } else { // ExtensionType was something we are not interested in - pos += extensionSize - } - } - - return null -} diff --git a/packages/mitmproxy/src/lib/proxy/tls/tlsUtils.js b/packages/mitmproxy/src/lib/proxy/tls/tlsUtils.js deleted file mode 100644 index cae8359bf7..0000000000 --- a/packages/mitmproxy/src/lib/proxy/tls/tlsUtils.js +++ /dev/null @@ -1,299 +0,0 @@ -const fs = require('node:fs') -const path = require('node:path') -const crypto = require('node:crypto') -const { promisify } = require('node:util') -const _ = require('lodash') -const forge = require('node-forge') -const log = require('../../../utils/util.log.server') -const config = require('../common/config') -// const colors = require('colors') - -const utils = exports -const pki = forge.pki - -const _generateKeyPair = promisify(crypto.generateKeyPair) - -/** - * 使用 Node.js 原生 crypto 模块异步生成 RSA 密钥对(在 libuv 线程池中运行,不阻塞事件循环), - * 并将结果转换为 node-forge 格式。 - */ -async function generateForgeRsaKeyPair () { - const { privateKey } = await _generateKeyPair('rsa', { modulusLength: 2048 }) - const privateKeyDer = privateKey.export({ type: 'pkcs1', format: 'der' }) - const forgePrivateKey = pki.privateKeyFromAsn1(forge.asn1.fromDer(forge.util.createBuffer(privateKeyDer))) - const forgePublicKey = pki.rsa.setPublicKey(forgePrivateKey.n, forgePrivateKey.e) - return { privateKey: forgePrivateKey, publicKey: forgePublicKey } -} - -// const os = require('os') -// let username = 'dev-sidecar' -// try { -// const user = os.userInfo() -// username = user.username -// } catch (e) { -// log.info('get userinfo error', e) -// } - -utils.createCA = function (CN) { - const keys = pki.rsa.generateKeyPair(2048) - const cert = pki.createCertificate() - cert.publicKey = keys.publicKey - cert.serialNumber = `${Date.now()}` - cert.validity.notBefore = new Date(Date.now() - (60 * 60 * 1000)) - cert.validity.notAfter = new Date() - cert.validity.notAfter.setFullYear(cert.validity.notAfter.getFullYear() + 20) - const attrs = [{ - name: 'commonName', - value: CN, - }, { - name: 'countryName', - value: 'CN', - }, { - shortName: 'ST', - value: 'GuangDong', - }, { - name: 'localityName', - value: 'ShenZhen', - }, { - name: 'organizationName', - value: 'dev-sidecar', - }, { - shortName: 'OU', - value: 'https://github.com/docmirror/dev-sidecar', - }] - cert.setSubject(attrs) - cert.setIssuer(attrs) - cert.setExtensions([{ - name: 'basicConstraints', - critical: true, - cA: true, - }, { - name: 'keyUsage', - critical: true, - keyCertSign: true, - }, { - name: 'subjectKeyIdentifier', - }]) - - // self-sign certificate - cert.sign(keys.privateKey, forge.md.sha256.create()) - - return { - key: keys.privateKey, - cert, - } -} - -utils.covertNodeCertToForgeCert = function (originCertificate) { - const obj = forge.asn1.fromDer(originCertificate.raw.toString('binary')) - return forge.pki.certificateFromAsn1(obj) -} - -utils.createFakeCertificateByDomain = async function (caKey, caCert, domain, mappingHostNames) { - // 作用域名 - const altNames = [] - mappingHostNames.forEach((mappingHostName) => { - altNames.push({ - type: 2, // 1=电子邮箱、2=DNS名称 - value: mappingHostName, - }) - }) - - const keys = await generateForgeRsaKeyPair() - const cert = pki.createCertificate() - cert.publicKey = keys.publicKey - - cert.serialNumber = `${Date.now()}` - cert.validity.notBefore = new Date() - cert.validity.notBefore.setFullYear(cert.validity.notBefore.getFullYear() - 1) - cert.validity.notAfter = new Date() - cert.validity.notAfter.setFullYear(cert.validity.notAfter.getFullYear() + 1) - const attrs = [{ - name: 'commonName', - value: domain, - }, { - name: 'countryName', - value: 'CN', - }, { - shortName: 'ST', - value: 'GuangDong', - }, { - name: 'localityName', - value: 'ShenZhen', - }, { - name: 'organizationName', - value: 'dev-sidecar', - }, { - shortName: 'OU', - value: 'https://github.com/docmirror/dev-sidecar', - }] - - cert.setIssuer(caCert.subject.attributes) - cert.setSubject(attrs) - - cert.setExtensions([{ - name: 'basicConstraints', - critical: true, - cA: false, - }, - // { - // name: 'keyUsage', - // critical: true, - // digitalSignature: true, - // contentCommitment: true, - // keyEncipherment: true, - // dataEncipherment: true, - // keyAgreement: true, - // keyCertSign: true, - // cRLSign: true, - // encipherOnly: true, - // decipherOnly: true - // }, - { - name: 'subjectAltName', - altNames, - }, { - name: 'subjectKeyIdentifier', - }, { - name: 'extKeyUsage', - serverAuth: true, - clientAuth: true, - codeSigning: true, - emailProtection: true, - timeStamping: true, - }, { - name: 'authorityKeyIdentifier', - }]) - cert.sign(caKey, forge.md.sha256.create()) - - return { - key: keys.privateKey, - cert, - } -} - -utils.createFakeCertificateByCA = async function (caKey, caCert, originCertificate) { - const certificate = utils.covertNodeCertToForgeCert(originCertificate) - - const keys = await generateForgeRsaKeyPair() - const cert = pki.createCertificate() - cert.publicKey = keys.publicKey - - cert.serialNumber = certificate.serialNumber - cert.validity.notBefore = new Date() - cert.validity.notBefore.setFullYear(cert.validity.notBefore.getFullYear() - 1) - cert.validity.notAfter = new Date() - cert.validity.notAfter.setFullYear(cert.validity.notAfter.getFullYear() + 1) - - cert.setSubject(certificate.subject.attributes) - cert.setIssuer(caCert.subject.attributes) - - certificate.subjectaltname && (cert.subjectaltname = certificate.subjectaltname) - - const subjectAltName = _.find(certificate.extensions, { name: 'subjectAltName' }) - cert.setExtensions([{ - name: 'basicConstraints', - critical: true, - cA: false, - }, { - name: 'keyUsage', - critical: true, - digitalSignature: true, - contentCommitment: true, - keyEncipherment: true, - dataEncipherment: true, - keyAgreement: true, - keyCertSign: true, - cRLSign: true, - encipherOnly: true, - decipherOnly: true, - }, { - name: 'subjectAltName', - altNames: subjectAltName.altNames, - }, { - name: 'subjectKeyIdentifier', - }, { - name: 'extKeyUsage', - serverAuth: true, - clientAuth: true, - codeSigning: true, - emailProtection: true, - timeStamping: true, - }, { - name: 'authorityKeyIdentifier', - }]) - cert.sign(caKey, forge.md.sha256.create()) - - return { - key: keys.privateKey, - cert, - } -} - -utils.isBrowserRequest = function (userAgent) { - return /Mozilla/i.test(userAgent) -} - -// -// /^[^.]+\.a\.com$/.test('c.a.com') -// -const mappingHostNameRegexpCache = {} -utils.isMappingHostName = function (DNSName, hostname) { - if (DNSName === hostname) { - return true - } - - let regexp = mappingHostNameRegexpCache[DNSName] - if (!regexp) { - const regStr = `^${DNSName.replace(/\./g, '\\.').replace(/\*/g, '[^.]+')}$` - regexp = mappingHostNameRegexpCache[DNSName] = new RegExp(regStr) - } - return regexp.test(hostname) -} - -utils.getMappingHostNamesFromCert = function (cert) { - let mappingHostNames = [] - mappingHostNames.push(cert.subject.getField('CN') ? cert.subject.getField('CN').value : '') - const altNames = cert.getExtension('subjectAltName') ? cert.getExtension('subjectAltName').altNames : [] - mappingHostNames = mappingHostNames.concat(_.map(altNames, 'value')) - return mappingHostNames -} - -// sync -utils.initCA = function ({ caCertPath, caKeyPath }) { - try { - fs.accessSync(caCertPath, fs.F_OK) - fs.accessSync(caKeyPath, fs.F_OK) - - // has exist - return { - caCertPath, - caKeyPath, - create: false, - } - } catch (e0) { - log.info('证书文件不存在,重新生成:', e0) - - try { - const caObj = utils.createCA(config.caName) - - const caCert = caObj.cert - const cakey = caObj.key - - const certPem = pki.certificateToPem(caCert) - const keyPem = pki.privateKeyToPem(cakey) - fs.mkdirSync(path.dirname(caCertPath), { recursive: true }) - fs.writeFileSync(caCertPath, certPem) - fs.writeFileSync(caKeyPath, keyPem) - log.info('生成证书文件成功,共2个文件:', caCertPath, caKeyPath) - } catch (e) { - log.error('生成证书文件失败:', caCertPath, caKeyPath, ', error:', e) - throw e - } - } - return { - caCertPath, - caKeyPath, - create: true, - } -} diff --git a/packages/mitmproxy/src/lib/speed/SpeedTester.js b/packages/mitmproxy/src/lib/speed/SpeedTester.js deleted file mode 100644 index 329e78c5c9..0000000000 --- a/packages/mitmproxy/src/lib/speed/SpeedTester.js +++ /dev/null @@ -1,307 +0,0 @@ -// const { exec } = require('node:child_process') -const net = require('node:net') -const _ = require('lodash') -const log = require('../../utils/util.log.server') -const config = require('./config.js') -const matchUtil = require('../../utils/util.match.js') -const { configFromFiles } = require('@docmirror/dev-sidecar/src/config/index.js') - -const familyMapping = matchUtil.domainMapRegexply(configFromFiles.server.dns.familyMapping) - -// const isWindows = process.platform === 'win32' - -const DISABLE_TIMEOUT = 60 * 60 * 1000 - -class SpeedTester { - constructor ({ hostname, port }) { - this.dnsMap = config.getConfig().dnsMap - - this.hostname = hostname - this.port = port || 443 - - this.ready = false - this.alive = [] - this.backupList = [] - - this.testCount = 0 - this.lastReadTime = Date.now() - this.keepCheckIntervalId = false - - this.tryTestCount = 0 - this.isTesting = false - this.isTestingBackups = false - - this.test() // 异步:初始化完成后先测速一次 - } - - pickFastAliveIpObj () { - this.touch() - - if (this.alive.length === 0) { - if (this.backupList.length > 0 && this.tryTestCount % 10 > 0) { - this.testBackups() // 异步 - } else if (this.tryTestCount % 10 === 0) { - this.test() // 异步 - } - this.tryTestCount++ - - return null - } - return this.alive[0] - } - - touch () { - this.lastReadTime = Date.now() - if (!this.keepCheckIntervalId) { - this.startChecker() - } - } - - startChecker () { - if (this.keepCheckIntervalId) { - clearInterval(this.keepCheckIntervalId) - } - this.keepCheckIntervalId = setInterval(() => { - if (Date.now() - DISABLE_TIMEOUT > this.lastReadTime) { - // 超过很长时间没有访问,取消测试 - clearInterval(this.keepCheckIntervalId) - this.keepCheckIntervalId = false - return - } - if (this.alive.length > 0) { - this.testBackups() // 异步 - } else { - this.test() // 异步 - } - }, config.getConfig().interval) - } - - async getIpListFromDns (dnsMap) { - const ips = {} - const promiseList = [] - for (const dnsKey in dnsMap) { - const dns = dnsMap[dnsKey] - const one = this.getFromOneDns(dns).then((ipList) => { - if (ipList && ipList.length > 0) { - for (const ip of ipList) { - ips[ip] = { dns: ipList.isPreSet === true ? '预设IP' : dnsKey } - } - } - }) - promiseList.push(one) - } - await Promise.all(promiseList) - - const items = [] - for (const ip in ips) { - items.push({ host: ip, dns: ips[ip].dns }) - } - return items - } - - async getFromOneDns (dns) { - const family = Number.parseInt(matchUtil.matchHostname(familyMapping, this.hostname, 'get family')) === 6 ? 6 : 4 - return await dns._lookupWithPreSetIpList(this.hostname, { family }) - } - - async test () { - if (this.isTesting) { - log.debug(`[speed] test skipped (already running): ${this.hostname}`) - return - } - this.isTesting = true - this.testCount++ - log.debug(`[speed] test start: ${this.hostname}, testCount: ${this.testCount}`) - - try { - const newList = await this.getIpListFromDns(this.dnsMap) - const newBackupList = [...newList, ...this.backupList] - this.backupList = _.unionBy(newBackupList, 'host') - await this.testBackups() - log.info(`[speed] test end: ${this.hostname} ➜ ip-list:`, this.backupList, `, testCount: ${this.testCount}`) - if (config.notify) { - config.notify({ key: 'test' }) - } - } catch (e) { - log.error(`[speed] test failed: ${this.hostname}, testCount: ${this.testCount}, error:`, e) - } finally { - this.isTesting = false - } - } - - async testBackups () { - if (this.isTestingBackups) { - log.debug(`[speed] testBackups skipped (already running): ${this.hostname}`) - return - } - this.isTestingBackups = true - - try { - if (this.backupList.length > 0) { - const aliveList = [] - - const testAll = [] - for (const item of this.backupList) { - testAll.push(this._doTest(item, aliveList)) - } - await Promise.all(testAll) - - // 全部测速完成后,根据耗时进行排序 - aliveList.sort((a, b) => a.time - b.time) - this.backupList.sort((a, b) => { - if (a.time === b.time) { - return 0 - } - if (a.time == null) { - return 1 - } - if (b.time == null) { - return -1 - } - return a.time - b.time - }) - - this.alive = aliveList - } - - this.ready = true - } finally { - this.isTestingBackups = false - } - } - - async _doTest (item, aliveList) { - try { - const ret = await this.testOne(item) - item.title = `${ret.by}测速成功:${ret.target}` - log.info(`[speed] test success: ${this.hostname} ➜ ${item.host}:${this.port} from DNS '${item.dns}'`) - _.merge(item, ret) - aliveList.push({ ...ret, ...item }) - } catch (e) { - if (item.time == null) { - item.title = e.message - item.status = 'failed' - } - if (!e.message.includes('timeout')) { - log.warn(`[speed] test error: ${this.hostname} ➜ ${item.host}:${this.port} from DNS '${item.dns}', errorMsg: ${e.message}`) - } - } - } - - testByTCP (item) { - return new Promise((resolve, reject) => { - const { host, dns } = item - const startTime = Date.now() - - let isOver = false - const timeout = 5000 - let timeoutId = null - - const client = net.createConnection({ host, port: this.port, family: host.includes(':') ? 6 : 4 }, () => { - isOver = true - clearTimeout(timeoutId) - - const connectionTime = Date.now() - resolve({ status: 'success', by: 'TCP', target: `${host}:${this.port}`, time: connectionTime - startTime }) - client.end() - }) - client.on('error', (e) => { - isOver = true - clearTimeout(timeoutId) - - log.warn('[speed] test by TCP error: ', this.hostname, `➜ ${host}:${this.port} from DNS '${dns}', cost: ${Date.now() - startTime} ms, errorMsg:`, e.message) - reject(e) - client.destroy() - }) - - timeoutId = setTimeout(() => { - if (!isOver) { - isOver = true - log.warn('[speed] test by TCP timeout:', this.hostname, `➜ ${host}:${this.port} from DNS '${dns}', cost: ${Date.now() - startTime} ms`) - reject(new Error('timeout')) - client.destroy() - } - }, timeout) - }) - } - - // 暂不使用 - // testByPing (item) { - // return new Promise((resolve, reject) => { - // const { host, dns } = item - // const startTime = Date.now() - // - // // 设置超时程序 - // let isOver = false - // const timeout = 5000 - // const timeoutId = setTimeout(() => { - // if (!isOver) { - // log.warn('[speed] test by PING timeout:', this.hostname, `➜ ${host} from DNS '${dns}', cost: ${Date.now() - startTime} ms`) - // reject(new Error('timeout')) - // } - // }, timeout) - // - // // 协议选择(如强制ping6) - // const usePing6 = !isWindows && host.includes(':') // Windows无ping6命令 - // const cmd = usePing6 - // ? `ping6 -c 2 ${host}` - // : isWindows - // ? `ping -n 2 ${host}` - // : `ping -c 2 ${host}` - // - // log.debug('[speed] test by PING start:', this.hostname, `➜ ${host} from DNS '${dns}'`) - // exec(cmd, (error, stdout, _stderr) => { - // isOver = true - // clearTimeout(timeoutId) - // - // if (error) { - // log.warn('[speed] test by PING error:', this.hostname, `➜ ${host} from DNS '${dns}', cost: ${Date.now() - startTime} ms, error: 目标不可达或超时`) - // reject(new Error('目标不可达或超时')) - // return - // } - // - // // 提取延迟数据(正则匹配) - // const regex = /[=<](\d+(?:\.\d*)?)ms/gi // 适配Linux/Windows - // const times = [] - // let match - // // eslint-disable-next-line no-cond-assign - // while ((match = regex.exec(stdout)) !== null) { - // times.push(Number.parseFloat(match[1])) - // } - // - // if (times.length === 0) { - // log.warn('[speed] test by PING error:', this.hostname, `➜ ${host} from DNS '${dns}', cost: ${Date.now() - startTime} ms, error: 无法解析延迟`) - // reject(new Error('无法解析延迟')) - // } else { - // // 计算平均延迟 - // const avg = times.reduce((a, b) => a + b, 0) / times.length - // resolve({ status: 'success', by: 'PING', target: host, time: Math.round(avg) }) - // } - // }) - // }) - // } - - testOne (item) { - return new Promise((resolve, reject) => { - const thenFun = (ret) => { - resolve(ret) - } - - // 先用TCP测速 - this.testByTCP(item) - .then(thenFun) - .catch((e) => { - // // TCP测速失败,再用 PING 测速 - // this.testByPing(item) - // .then(thenFun) - // .catch((e2) => { - // reject(new Error(`TCP测速失败:${e.message};PING测速失败:${e2.message};`)) - // }) - - reject(new Error(`TCP测速失败:${item.host}:${this.port} ${e.message}`)) - }) - }) - } -} - -module.exports = SpeedTester diff --git a/packages/mitmproxy/src/lib/speed/config.js b/packages/mitmproxy/src/lib/speed/config.js deleted file mode 100644 index dd7a0a229d..0000000000 --- a/packages/mitmproxy/src/lib/speed/config.js +++ /dev/null @@ -1,9 +0,0 @@ -const config = { - dnsMap: {}, -} -module.exports = { - getConfig () { - return config - }, - notify: null, -} diff --git a/packages/mitmproxy/src/lib/speed/index.js b/packages/mitmproxy/src/lib/speed/index.js deleted file mode 100644 index e67071f2cc..0000000000 --- a/packages/mitmproxy/src/lib/speed/index.js +++ /dev/null @@ -1,94 +0,0 @@ -const _ = require('lodash') -const log = require('../../utils/util.log.server') -const config = require('./config') -const SpeedTester = require('./SpeedTester.js') - -const SpeedTestPool = { -} - -function addSpeedTest (hostname, port) { - if (!port) { - const idx = hostname.indexOf(':') - if (idx > 0 && idx === hostname.lastIndexOf(':')) { - const arr = hostname.split(':') - hostname = arr[0] - port = Number.parseInt(arr[1]) || 443 - } else { - port = 443 - } - } - - // 443端口不拼接在key上 - const key = port === 443 ? hostname : `${hostname}:${port}` - - if (SpeedTestPool[key] == null) { - return SpeedTestPool[key] = new SpeedTester({ hostname, port }) - } - - return SpeedTestPool[key] -} - -function initSpeedTest (runtimeConfig) { - const { enabled, hostnameList } = runtimeConfig - const conf = config.getConfig() - _.merge(conf, runtimeConfig) - if (!enabled) { - return - } - _.forEach(hostnameList, (hostname) => { - addSpeedTest(hostname) - }) - log.info('[speed] enabled,SpeedTestPool:', SpeedTestPool) -} - -function getAllSpeedTester () { - const allSpeed = {} - - if (config.getConfig().enabled) { - _.forEach(SpeedTestPool, (item, key) => { - allSpeed[key] = { - hostname: item.hostname, - port: item.port, - alive: item.alive, - backupList: item.backupList, - } - }) - } - - return allSpeed -} - -function getSpeedTester (hostname, port) { - if (!config.getConfig().enabled) { - return null - } - return addSpeedTest(hostname, port) -} - -// function registerNotify (notify) { -// config.notify = notify -// } - -function reSpeedTest () { - _.forEach(SpeedTestPool, (item, _key) => { - item.test() // 异步 - }) -} - -// action调用 -function action (event) { - if (event.key === 'reTest') { - reSpeedTest() - } else if (event.key === 'getList') { - process.send({ type: 'speed', event: { key: 'getList', value: getAllSpeedTester() } }) - } -} -module.exports = { - SpeedTester, - initSpeedTest, - getSpeedTester, - // getAllSpeedTester, - // registerNotify, - reSpeedTest, - action, -} diff --git a/packages/mitmproxy/src/options.js b/packages/mitmproxy/src/options.js deleted file mode 100644 index 8e6057b21d..0000000000 --- a/packages/mitmproxy/src/options.js +++ /dev/null @@ -1,283 +0,0 @@ -const fs = require('node:fs') -const path = require('node:path') -const lodash = require('lodash') -const { LRUCache } = require('lru-cache') -const dnsUtil = require('./lib/dns') -const interceptorImpls = require('./lib/interceptor') -const scriptInterceptor = require('./lib/interceptor/impl/res/script') -const { getTmpPacFilePath, downloadPacAsync, createOverwallMiddleware } = require('./lib/proxy/middleware/overwall') -const log = require('./utils/util.log.server') -const matchUtil = require('./utils/util.match') - -// 每个域名的路径级拦截器缓存的最大条数。 -// 对于使用 .* 路径模式的域名(如 api.github.com),每个唯一 URL(含不同 query string)都会生成独立的缓存条目。 -// 设置上限,超出后清空最久未使用的缓存,防止长期运行时因 API 分页/唯一 token 等导致内存无界增长。 -const PATH_CACHE_MAX_SIZE = 512 - -// 处理拦截配置 -function buildIntercepts (intercepts) { - // 自动生成script拦截器所需的辅助配置,降低使用`script拦截器`配置绝对地址和相对地址时的门槛 - scriptInterceptor.handleScriptInterceptConfig(intercepts) - - return intercepts -} - -// 从拦截器配置中,获取exclusions字段,返回数组类型 -function getExclusionArray (exclusions) { - let ret = null - if (Array.isArray(exclusions)) { - if (exclusions.length > 0) { - ret = exclusions - } - } else if (lodash.isObject(exclusions)) { - ret = [] - for (const exclusion in exclusions) { - ret.push(exclusion) - } - if (ret.length === 0) { - return null - } - } - return ret -} - -function handleDnsMapping (dnsMapping, familyMapping) { - // 循环读取所有key value - for (const hostname in dnsMapping) { - const value = dnsMapping[hostname] - if (value == null) { - delete dnsMapping[hostname] - continue - } - - if (typeof value === 'string') { - dnsMapping[hostname] = { - dnsName: value, - family: Number.parseInt(familyMapping[hostname]) === 6 ? 6 : 4, - } - } else if (value.dnsName == null) { - log.warn(`域名 ${hostname} 的DNS配置有误,未配置dnsName,配置值:`, value) - delete dnsMapping[hostname] - } - } - - return dnsMapping -} - -module.exports = (serverConfig) => { - const intercepts = matchUtil.domainMapRegexply(buildIntercepts(serverConfig.intercepts)) - const whiteList = matchUtil.domainMapRegexply(serverConfig.whiteList) - const timeoutMapping = matchUtil.domainMapRegexply(serverConfig.setting.timeoutMapping) - - const dnsMapping = handleDnsMapping(serverConfig.dns.mapping, serverConfig.dns.familyMapping || {}) - const setting = serverConfig.setting - - if (!setting.script.dirAbsolutePath) { - setting.script.dirAbsolutePath = path.join(setting.rootDir, setting.script.defaultDir) - } - if (setting.verifySsl !== false) { - setting.verifySsl = true - } - setting.timeoutMapping = timeoutMapping - - const overWallConfig = serverConfig.plugin.overwall - if (overWallConfig.pac && overWallConfig.pac.enabled) { - const pacConfig = overWallConfig.pac - - // 自动更新 pac.txt - if (!pacConfig.pacFileAbsolutePath && pacConfig.autoUpdate) { - // 异步下载远程 pac.txt 文件,并保存到本地;下载成功后,需要重启代理服务才会生效 - downloadPacAsync(pacConfig) - } - - // 优先使用本地已下载的 pac.txt 文件 - if (!pacConfig.pacFileAbsolutePath && fs.existsSync(getTmpPacFilePath())) { - pacConfig.pacFileAbsolutePath = getTmpPacFilePath() - log.info('读取已下载的 pac.txt 文件:', pacConfig.pacFileAbsolutePath) - } - - if (!pacConfig.pacFileAbsolutePath) { - log.info('setting.rootDir:', setting.rootDir) - pacConfig.pacFileAbsolutePath = path.join(setting.rootDir, pacConfig.pacFilePath) - log.info('读取内置的 pac.txt 文件:', pacConfig.pacFileAbsolutePath) - if (pacConfig.autoUpdate) { - log.warn('远程 pac.txt 文件下载失败或还在下载中,现使用内置 pac.txt 文件:', pacConfig.pacFileAbsolutePath) - } - } - } - - // 插件列表 - const middlewares = [] - - // 梯子插件:如果启用了,则添加到插件列表中 - const overwallMiddleware = createOverwallMiddleware(overWallConfig) - if (overwallMiddleware) { - middlewares.push(overwallMiddleware) - } - - const preSetIpList = matchUtil.domainMapRegexply(serverConfig.preSetIpList) - - const options = { - host: serverConfig.host, - port: serverConfig.port, - maxLength: serverConfig.fakeServerMaxLength, - dnsConfig: { - preSetIpList, - dnsMap: dnsUtil.initDNS(serverConfig.dns.providers, preSetIpList), - mapping: matchUtil.domainMapRegexply(dnsMapping), - speedTest: serverConfig.dns.speedTest, - }, - setting, - compatibleConfig: { - connect: serverConfig.compatible ? matchUtil.domainMapRegexply(serverConfig.compatible.connect) : {}, - request: serverConfig.compatible ? matchUtil.domainMapRegexply(serverConfig.compatible.request) : {}, - }, - middlewares, - sslConnectInterceptor: (req, cltSocket, head) => { - const hostname = req.url.split(':')[0] - - // 配置了白名单的域名,将跳过代理 - const inWhiteList = !!matchUtil.matchHostname(whiteList, hostname, 'in whiteList') - if (inWhiteList) { - log.info(`为白名单域名,不拦截: ${hostname}`) - return false // 不拦截 - } - - // 配置了拦截的域名,将会被代理 - const matched = matchUtil.matchHostname(intercepts, hostname, 'matched intercepts') - if ((!!matched) === true) { - log.debug(`拦截器拦截:${req.url}, matched:`, matched) - return matched // 拦截 - } - - return null // 不在白名单中,也未配置在拦截功能中,跳过当前拦截器,由下一个拦截器判断 - }, - createIntercepts: (context) => { - const rOptions = context.rOptions - const interceptOpts = matchUtil.matchHostnameAll(intercepts, rOptions.hostname, 'get interceptOpts') - if (!interceptOpts) { // 该域名没有配置拦截器,直接过 - return - } - - // 获取缓存:同一 hostname+path 的拦截器列表是固定的,不必每次重新构建 - // 注:缓存 key 使用完整路径(含 query string),以保证正则捕获组(matched)的正确性 - // 注:采用 LRU 淘汰策略,上限为 PATH_CACHE_MAX_SIZE 条;利用 Map 按插入顺序迭代的特性,命中时删除后重新插入以更新位置 - if (!interceptOpts._pathCache) { - const cache = new LRUCache({ - maxSize: PATH_CACHE_MAX_SIZE, - sizeCalculation: () => { - return 1 - }, - }) - Object.defineProperty(interceptOpts, '_pathCache', { value: cache, enumerable: false, configurable: true }) - } else { - const cached = interceptOpts._pathCache.get(rOptions.path) - if (cached) { - return cached - } - } - - const matchIntercepts = [] - const matchInterceptsOpts = {} - for (const regexp in interceptOpts) { // 遍历拦截配置 - // 跳过hostname匹配结果,它不是路径正则 - if (regexp === 'matched') { - continue - } - // 判断是否匹配拦截器 - const matched = matchUtil.isMatched(rOptions.path, regexp) - if (matched == null) { // 拦截器匹配失败 - continue - } - - // 获取拦截器 - const interceptOpt = interceptOpts[regexp] - interceptOpt.key = regexp - - // 添加exclusions字段,用于排除某些路径 - // @since 1.8.5 - if (interceptOpt.exclusions) { - let isExcluded = false - try { - const exclusions = getExclusionArray(interceptOpt.exclusions) - if (exclusions) { - for (const exclusion of exclusions) { - if (matchUtil.isMatched(rOptions.path, exclusion)) { - log.debug(`拦截器配置排除了path:${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${rOptions.path}, exclusion: '${exclusion}', interceptOpt:`, interceptOpt) - isExcluded = true - } - } - } - } catch (e) { - log.error(`判断拦截器是否排除当前path时出现异常, path: ${rOptions.path}, interceptOpt:`, interceptOpt, ', error:', e) - } - if (isExcluded) { - continue - } - } - - log.debug(`拦截器匹配path成功:${rOptions.protocol}//${rOptions.hostname}:${rOptions.port}${rOptions.path}, regexp: ${regexp}, interceptOpt:`, interceptOpt) - - // log.info(`interceptor matched, regexp: '${regexp}' =>`, JSON.stringify(interceptOpt), ', url:', url) - for (const impl of interceptorImpls) { - // 根据拦截配置挑选合适的拦截器来处理 - if (impl.is && impl.is(interceptOpt)) { - let action = 'add' - - // 如果存在同名拦截器,则order值越大,优先级越高 - const matchedInterceptOpt = matchInterceptsOpts[impl.name] - if (matchedInterceptOpt) { - if (matchedInterceptOpt.order >= (interceptOpt.order || 0)) { - log.warn(`duplicate interceptor: ${impl.name}, hostname: ${rOptions.hostname}`) - continue - } - action = 'replace' - } - - const interceptor = { name: impl.name, priority: impl.priority } - if (impl.requestIntercept) { - // req拦截器 - interceptor.requestIntercept = (context, req, res, ssl, next) => { - return impl.requestIntercept(context, interceptOpt, req, res, ssl, next, matched, interceptOpts.matched) - } - } else if (impl.responseIntercept) { - // res拦截器 - interceptor.responseIntercept = (context, req, res, proxyReq, proxyRes, ssl, next) => { - return impl.responseIntercept(context, interceptOpt, req, res, proxyReq, proxyRes, ssl, next, matched, interceptOpts.matched) - } - } - - // log.info(`${action} interceptor: ${impl.name}, hostname: ${rOptions.hostname}, regexp: ${regexp}`) - if (action === 'add') { - matchIntercepts.push(interceptor) - } else { - matchIntercepts[matchedInterceptOpt.index] = interceptor - } - matchInterceptsOpts[impl.name] = { - order: interceptOpt.order || 0, - index: action === 'replace' ? matchedInterceptOpt.index : matchIntercepts.length - 1, - } - } - } - } - - matchIntercepts.sort((a, b) => { - return a.priority - b.priority - }) - // for (const interceptor of matchIntercepts) { - // log.info('interceptor:', interceptor.name, 'priority:', interceptor.priority) - // } - - // 设置缓存 - interceptOpts._pathCache.set(rOptions.path, matchIntercepts) - - return matchIntercepts - }, - } - - if (setting.rootCaFile) { - options.caCertPath = setting.rootCaFile.certPath - options.caKeyPath = setting.rootCaFile.keyPath - } - return options -} diff --git a/packages/mitmproxy/src/utils/util.js b/packages/mitmproxy/src/utils/util.js deleted file mode 100644 index 0d44b01294..0000000000 --- a/packages/mitmproxy/src/utils/util.js +++ /dev/null @@ -1,11 +0,0 @@ -// const os = require('os') -const log = require('./util.log.server') - -const util = { - getNodeVersion () { - const version = process.version - log.info(version) - }, -} -util.getNodeVersion() -module.exports = util diff --git a/packages/mitmproxy/src/utils/util.log.server.js b/packages/mitmproxy/src/utils/util.log.server.js deleted file mode 100644 index 5714ee9f6c..0000000000 --- a/packages/mitmproxy/src/utils/util.log.server.js +++ /dev/null @@ -1,5 +0,0 @@ -const loggerFactory = require('@docmirror/dev-sidecar/src/utils/util.logger') - -const logger = loggerFactory.getLogger('server') - -module.exports = logger diff --git a/packages/mitmproxy/src/utils/util.match.js b/packages/mitmproxy/src/utils/util.match.js deleted file mode 100644 index 24e29c7992..0000000000 --- a/packages/mitmproxy/src/utils/util.match.js +++ /dev/null @@ -1,219 +0,0 @@ -const lodash = require('lodash') -const log = require('./util.log.server') -const mergeApi = require('@docmirror/dev-sidecar/src/merge') - -const { LRUCache } = require('lru-cache') - -const urlRegexpCache = new LRUCache({ - maxSize: 512, - sizeCalculation: () => { - return 1 - }, -}) - -function isMatched (url, regexp) { - if (regexp === '.*' || regexp === '*' || regexp === 'true' || regexp === true) { - return [url] - } - - try { - let compiled = urlRegexpCache.get(regexp) - if (!compiled) { - let urlRegexp = regexp - if (regexp[0] === '*' || regexp[0] === '?' || regexp[0] === '+') { - urlRegexp = `.${regexp}` - } - compiled = new RegExp(urlRegexp) - urlRegexpCache.set(regexp, compiled) - } - - return url.match(compiled) - } catch { - log.error('匹配串有问题:', regexp) - return null - } -} - -function domainRegexply (target) { - if (target === '.*' || target === '*' || target === 'true' || target === true) { - return '^.*$' - } - return `^${target.replace(/\./g, '\\.').replace(/\*/g, '.*')}$` -} - -function domainMapRegexply (hostMap) { - if (hostMap == null) { - return { origin: {} } - } - const regexpMap = {} - const origin = {} // 用于快速匹配,见matchHostname、matchHostnameAll方法 - lodash.each(hostMap, (value, domain) => { - try { - // 将域名匹配串格式如 `.xxx.com` 转换为 `*.xxx.com` - if (domain[0] === '.') { - if (hostMap[`*${domain}`] != null) { - return // 如果已经有匹配串 `*.xxx.com`,则忽略 `.xxx.com` - } - domain = `*${domain}` - } - - if (domain.includes('*') || domain[0] === '^') { - const regDomain = domain[0] !== '^' ? domainRegexply(domain) : domain - regexpMap[regDomain] = value - - if (domain.indexOf('*') === 0 && domain.lastIndexOf('*') === 0) { - origin[domain] = value - } - } else { - origin[domain] = value - } - } catch (e) { - log.error('匹配串有问题:', domain, e) - } - }) - regexpMap.origin = origin - return regexpMap -} - -function matchHostname (hostMap, hostname, action) { - // log.error('matchHostname:', action, hostMap) - - if (hostMap == null) { - log.warn(`matchHostname: ${action}: '${hostname}' Not-Matched, hostMap is null`) - return null - } - if (hostMap.origin == null) { - log.warn(`matchHostname: ${action}: '${hostname}' Not-Matched, hostMap.origin is null`) - return null - } - - // 域名快速匹配:直接匹配(优先级最高) - let value = hostMap.origin[hostname] - if (value != null) { - log.info(`matchHostname: ${action}: '${hostname}' -> { "${hostname}": ${JSON.stringify(value)} }`) - return value // 快速匹配成功 - } - // 域名快速匹配:三种前缀通配符匹配 - value = hostMap.origin[`*.${hostname}`] - if (value != null) { - log.info(`matchHostname: ${action}: '${hostname}' -> { "*.${hostname}": ${JSON.stringify(value)} }`) - return value // 快速匹配成功 - } - value = hostMap.origin[`*${hostname}`] - if (value != null) { - log.info(`matchHostname: ${action}: '${hostname}' -> { "*${hostname}": ${JSON.stringify(value)} }`) - return value // 快速匹配成功 - } - - // 通配符匹配 或 正则表达式匹配 - for (const regexp in hostMap) { - if (regexp === 'origin') { - continue - } - - // 正则表达式匹配 - if (hostname.match(regexp)) { - value = hostMap[regexp] - log.info(`matchHostname: ${action}: '${hostname}' -> { "${regexp}": ${JSON.stringify(value)} }`) - return value - } - } - - log.debug(`matchHostname: ${action}: '${hostname}' Not-Matched`) -} - -function merge (oldObj, newObj) { - return lodash.mergeWith(oldObj, newObj, (objValue, srcValue) => { - if (lodash.isArray(objValue)) { - return srcValue - } - }) -} - -function matchHostnameAll (hostMap, hostname, action) { - // log.debug('matchHostname-all:', action, hostMap) - - if (hostMap == null) { - log.warn(`matchHostname-all: ${action}: '${hostname}', hostMap is null`) - return null - } - if (hostMap.origin == null) { - log.warn(`matchHostname-all: ${action}: '${hostname}', hostMap.origin is null`) - return null - } - - let values = {} - let value - - // 通配符匹配 或 正则表达式匹配(优先级:1,最低) - for (const regexp in hostMap) { - if (regexp === 'origin') { - continue - } - - // if (target.indexOf('*') < 0 && target[0] !== '^') { - // continue // 不是通配符匹配串,也不是正则表达式,跳过 - // } - - // 正则表达式匹配 - const matched = hostname.match(regexp) - if (matched) { - value = hostMap[regexp] - log.debug(`matchHostname-one: ${action}: '${hostname}' -> { "${regexp}": ${JSON.stringify(value)} }`) - values = merge(values, value) - - // 设置matched - if (matched.length > 1) { - if (values.matched) { - // 合并array - matched.shift() - values.matched = [...values.matched, ...matched] // 拼接上多个matched - - // 合并groups - if (matched.groups) { - values.matched.groups = merge(values.matched.groups, matched.groups) - } else { - values.matched.groups = matched.groups - } - } else { - values.matched = matched - } - } - } - } - - // 域名快速匹配:直接匹配 或者 两种前缀通配符匹配 - // 优先级:2 - value = hostMap.origin[`*${hostname}`] - if (value) { - log.debug(`matchHostname-one: ${action}: '${hostname}' -> { "*${hostname}": ${JSON.stringify(value)} }`) - values = merge(values, value) - } - // 优先级:3 - value = hostMap.origin[`*.${hostname}`] - if (value) { - log.debug(`matchHostname-one: ${action}: '${hostname}' -> { "*.${hostname}": ${JSON.stringify(value)} }`) - values = merge(values, value) - } - // 优先级:4,最高(注:优先级高的配置,可以覆盖优先级低的配置,甚至有空配置时,可以移除已有配置) - value = hostMap.origin[hostname] - if (value) { - log.debug(`matchHostname-one: ${action}: '${hostname}' -> { "${hostname}": ${JSON.stringify(value)} }`) - values = merge(values, value) - } - - if (!lodash.isEmpty(values)) { - mergeApi.deleteNullItems(values) - log.info(`matchHostname-all: ${action}: '${hostname}':`, JSON.stringify(values)) - return values - } else { - log.debug(`matchHostname-all: ${action}: '${hostname}' Not-Matched`) - } -} - -module.exports = { - isMatched, - domainMapRegexply, - matchHostname, - matchHostnameAll, -} diff --git a/packages/mitmproxy/src/utils/util.process.js b/packages/mitmproxy/src/utils/util.process.js deleted file mode 100644 index a6776c3015..0000000000 --- a/packages/mitmproxy/src/utils/util.process.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - fireError (e) { - if (process.send) { - process.send({ type: 'error', event: e, message: e.message }) - } - }, - fireStatus (status) { - if (process.send) { - process.send({ type: 'status', event: status }) - } - }, -} diff --git a/packages/mitmproxy/test/baiduOcrTest.js b/packages/mitmproxy/test/baiduOcrTest.js deleted file mode 100644 index fa2e2537fa..0000000000 --- a/packages/mitmproxy/test/baiduOcrTest.js +++ /dev/null @@ -1,25 +0,0 @@ -const AipOcrClient = require('baidu-aip-sdk').ocr - -// 设置APPID/AK/SK -const APP_ID = '101474620' -const API_KEY = 'fqCvIHGisGwpsglzV2wdxZJ5' -const SECRET_KEY = 'RhTOXUA4V6CrGuCTJJvUQ7z6Nl4m0Lij' - -// 新建一个对象,建议只保存一个对象调用服务接口 -const client = new AipOcrClient(APP_ID, API_KEY, SECRET_KEY) - -// 图片:6525 -const imageBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAeCAYAAAC7Q5mxAAAac0lEQVRoQ0VaCXScV3m9/+yrZtOMdsmbZMm2LNnybqdpnMQJjpsQMEsbEgItnFNoaFLasJ7Tc6A0kHIgoQRogabQkp4QSGJiCHZCbMdObMeOFVu7ZFm7RhpJs+9r7/eUgIPQNvr//33vfvfe777R+iZ7K+A/fUV9grb6id+X1WebzYZ4PA6TyQBNr0MymYRm0MNmt6NQzMFqMaJULiOdKgA6EzSdGZUSYDLoUM7lYDPqkYiHEaj2IplJIZHJwOasQrpYgdVqQyGZhs/jxfLysrqfwWiGw+HA/Pw86urqkMryHlYrorGE+r3FbkM6nYbT6US2kIdmN2JhYQEN7mrkeS0vr+mssmNobBTeRj9i2TRMbhvKugpOnTqF1EoYsaUVtARqUCzlkdHlMbO8gCp/ADAb4fLXYNu2bXDqbSilsrAVjfDbq2AqVBBeWYHbXYU4rxnPJOAN+KH1T6wWUIc/FZD3gobVAubzeeh0OhikIHxNiR9miwUVFjwWj6DEh5Ai6wxW6DQT/5BFrPD1OqCUzUIr5qHXlZHLZaDTa3BXV6NQriC4EuXfllHj9iIWiaKqqgp6vR6pTJrXMeD48eOqqJrBqO5//8cfgNPhQiafUxvq8XgwNTuDgr6Mnu4eBKemkI/FYTNbeP8SCwYYHWYspxOoWPWIJKJ468IFOPl7s6ZHldGEuYU5lAwVVMw6ZDVgmX9PpCCd5CYbzPjAnXej1uEFUjlYuCa+BI98/mE898Kv8PXHH8MDDz4IbfDGagEFeoI+KZ769t0C5ogi2e1iuYB0LguT2ayKKLseDM4B/HlDQwP8NY2qgKWiFFuKyEXwbysssMNmQrlc5FUryBOtOX5YbdxVoi20SPTU1mFpaUkV8dlnn0U4HMFnH3pIbR5fiiw34u8+9xC+850nFBoFgfX19bj/Ew/i0JHDOHToEPKJBOo81Sjm8rxPGQZ2zEoygunlRbgCHlx4+yIs3Pjp6+P46/s/LshQG9M7cBWTwVlk+XwFTYORCLZZ7UhFEigmsqir8mLHli50rFmPDO8bJWiKrICn1o9ILAZtaPxPBfxj8aSI2ioCBWnSrul8GvlCASarBaHlJfQPDGB5aRHsZrS1taGjfSvKJR3YVUQB4U/k8f9gY4snk1HVViV+n2QL601mXotoLpbRUF/Hdp3F8WPHia4M7jlyD+qbGtUGeYhO+VfgfY1mE1HM+xMh8i+VysBC5MvC06QVN7+udnkwPXFDtX6ukEOOC40XM8iUc7g6eA2TNyawcf16dLZvgtdRpfrJyU2b5zri3KQx/m3f0BDMZivcdheSyxHUuqpx867d0PFZvT43SqyHxWHB5atXsGVrF7SR9wrIy73Hf6sQXC1gmX+gcWeypZwqnvDfMPllYGgQBSJSENi+cSO2b9sNgg3ZTAlV5IwcecLM1xoNGubmp9DS0oRkOsmFp+En4tKZgkLEk09+lxRgwYc++GFUB3zIkHeEa6PRqFqINE6pVFKvFVqWjhAUrqxEEKitIWIs/HoFFp0BZGlEwyvwer2IJmOwCl/lkhgYG8Kbl85j7dq1uPvwXbwmEJycRnMjnymZgpW8usL2Les0IteMocERTBCpdpMF29q3sNhObN3UgemZSZI029/nwvMvvYi9+/ZDGxvrrVTY3Nq7HLjawETeuwXUGwyqdct6kj5vFE0mcK2/D5Mz0zBSIIpEzZrmFuzbeYC11NhCFTisTqIiDrvdingigppaH8KxMEKhRWzlrk3w4Z9++n8UNXzuc5/BSnSFaOX/WCjhN/loamoi8krkdROeeOIJPPLIIzh27CUcPXoUkUgEa1rWYm5ujm0URWvrRmTTGRTIn9VeHxJs5xx3U2c1Y3B8GIOjI8gUMujq6sTj3/oWfvrjn8DJTfjG1/4Ff//Qw3C7KHD8+yzbWmqRIw2UifY4uXlNXQOqybczMzNs+TJOnT2D7bt7sH5jK7uTdRtnAQVr74mIQh0vIgWUTjawdTIsoMFqVGgcnRhXD5RIJZWwlKjEtdV+3LT7ZiKA7VXQsYAOomKJRO/iBSgYi7Ooa6yj6hXwn//xYyLTjAce+KRC2XIkhN6rb+PBB0jIRPoAqcFMnrVzgYl4Ci6XC6+++iru/9jHEJxfhNNmV6KVzeZVa9uIDilkE3lYxEiQmqfQmB02JLMZnCfyliJhfp1EoKaGPM0W5GvkOk0NzWx7H4x60gOvVSbhCmX5fQEEZ+fw5HefwFe/+AUUyUuBQIAFTpFLL2FDeytcbOfZ2dnVAr6LuffApwooRCyf8+QtXhp2J+1MOoUrfVcxM0/xYJvJa1hCuGlLbt57C2yUfl3JoDhwcTEIT7WHViNN22LBUz/8PlwsaFdnF6YmpmHWWTA2fh3eGhf0RLIIw6b2DvT07EBoYRG1tbWYnZ6mPcqqIgqBi1iVcqU/OgOxO1LIR//xUTz22GO0GG4sceOqqfSpfBaDw8PoH+zj5pu5eLoAioYIk9PtVGgX1C8HV3DvPffSZtWQtSooF0vIEY3uKo+iMaG1KG2YFL1s4O9YDyvXk2AtRNy08ZErqzaGaJIbyC4UyiVaCo1kT49HHIYTMRaBPBGP4vjvX1aEvnv/Plx++y0UicBCJov7PnAf9EU9vDYvC7Ck/FKabfOTn7FdPHYcvP0glrm4wb4BWI1U0hjFxGigjWCrpGLc4VqloGJP9u/dxwe2IpVIQk9UhsNhlAplIteoWlXQIKrd1NTCDqiQSozsBoPqFKPFrLpDfOup189wIxdRz8IvrSxTXIhA3lPadHpuls9dIAD0bFEf7rjtDuRFmHgPp92B8FJYcbN4TZeHlERRKoAtTp5cXFnAjYkJTE1OQpu+0VchrpVCyu4IhFdvUmbLcYuItCK3wev34sRrryJEktbRcLZRON68+CaMJv6eZvfu2/4CVljUf8dfPI4wec3msuPofR+CwW7AufPnMDXFG3LBJp0RtZ5axV96m8YHK1B88khRTX0+H9aSU+tr68ltrQjOzCp7U8oWVSENOj2ef/55ZV0splVLY6eiSvEaW5oRJ0db6RqSqTiGqKjyN4loDO87cpe6TrFC1eZrZ1jAkbFxxbNZCtvGtRuwecNGWPVGRUEVAkn4X5xBibVIk34q+pJS7N5rvUoQa7zV0K6PXqno+MIyfZtwiphZgWuJNxIOKZEhzRSPqflpnDr3upL9fTffhByLffbCOU4OGpLxBO6+9QheOXYC+gyRSyP8wIP3K7dudlvx+9MnEFoJqXs0VNdix9btcOhsih7+cOE1blBZtYMgsMgWqqdKd27eTAtkhcNsR4bWx04DLC1b5gbkiHj5eoIo8Pv9ynzPBOfh81crkXN7PcruFPMF5Ficjo3tmKKF8XFyiHHhbp+odIJrmsWlty/znvSodA9Hj9yNx7/2DfzVhz6K3Tt20lhHYKtyUs05GS2H8PbAFYQpYPThtGG0SZkcfeDQpYrYBgM/dCyeXtqYKBTjLAs0sSVKhPzw+AhOv3EW7R0daKeki3144fiLSGQT8JADzQUjPnLkKPJhLs5ix8DwANq2tGMlG8OFqxeRzKXIK1U49Oe3QsuWcPbEGez/s5tg8dtw/vJFXLlyBR6XWxVQOGjvzl1Y27JGbUYjCzpPJCZiSaX4otLyfXd3N0UoTI6KwSDtViQALCbMkNyrqPCcYdR45+eoKJuRJG/VNjZgMbyMBX6YKDTHTv4WNTV+2PhqA2lif/cueGwu5S39dbWI8m+uz03hxuwkFih40sIFKnyaP/c63dAmpvorWaqWxqIJt1U4XqWJPBEI8X2ixTFyyjH6nrrmRphtVhy4+c84o2Zw7Le/gcFpQmg+iL2bd2HHxm6UE0UKr56vrcdUcAbDc+O4PHiF01Aah+96H9bXNyNG4vZZaEp57cGZUXR0bcbp06cxzJar9voVEtc2NmP3rl2IRzmK5Yt46cVjuP++B8g2RLiYLj6njh5TFpSjR3Ww9cOkhBQN/Pj4OKz0c34a62p60snxG/jKo1/GM888o4y3gwpqdTmJ/tfRNzXEwWARzaQULzf+g7ffRXiV8d//9TN88tOfwlvvvIOZpXlEOEjEORbK+vVGHR0CeZuTjzY1N1SRFily94SIRUhEoTQ+nJkFFLIO88XnyXdOrxtjN8ZRRVV0ENpRtmi6klXIqbNW49Deg6i2ehFfiXG3E7D5qnDq8jnEikkEObB7PG7csucAvGYnEgtR1UquFj/GZyYwOzWtFj43M0+P1wIrx8HfPP8Cfvb0z5GMxGjSS1gOLdG/2RTFBGidhMdE3Mx2M1ZSKc7XnJBGhhSP54i8TRva0NXWAZ/ThYGr/Uql5zg6JqnQgZZGzCdCGFgcJ2CoqMtRbG1pw4GuXfjmP38dn//8P3HNl3jdODKkGJ2dhp1i2rSmUQ0FIyMjWAkuro5yqmjcGeECeTjxYWlyxQrbQzjmmV8+q4ZkUeNHv/RFzAeD6neTRNj00iwVsoidrd2wlUzoad+GTDytKOAb3/kWdh26CZf6LqOlba2CfYCz5eGbb0clxiSFrn4hE4WvIUD3P4ix4RHOzU6M8rOOluJLj34BkaUIEvR3NSzYbQdvxaXzF1ULixrbnXbFrR4a9TjDiuFJetSRUQWE0PwC1tTU4+zJP+DJx7+NRDiubJDweo5cHGK4cPbaBcxXIrRrBbh0VlQbHdjT3g1dvoKrV95h1+RhclVhdHYKnsZaNG9Yh9aNG8jXabz+2ilUaLa1a4MXKk4iioMsYiRW4TwZlW5M3VC8lCAXGGhnLNyBPXv2qN2VWfPhf3gEB++8DQvJZYXYGtqXeygkWrqEhZkgkeGAnfJ/vv8KHzZMC7SsFlbF8WhNoBGd69qVmie0PEpGcjjJ/tyZc1haDKGluZnjoAON9U1oqm9QRlcmkiKFKxmJo4bRU3iZI5vPQ/QkeB29QtULv32J7cwggfcRpNZXB7Bn+w5GZjnUM74S42urcqkCRhJxnKCAJa15hht5GOgvO4nAXDiJBDvIzNEwSbVOUYicdCBdO3ugI78KijW6ktMsYJLjpDY92V9JUwElvRC78uRT30d1bYAcl6I9cKhxS2KljvY2bOMYJvLutjuVsX3z8gVMhRdUu1eZHejeuBlbWrdwkQlM0wSX6SULvObVob5VL0lDaybafWz5Fo5IJvJJkruf4oNGaTcmr08ofhPUyziW4cPnaTPEzmxgO5ro0eJ8aOG24PQcvvmvX6eY6fDUj76HqZk5ZcyTbGXZZBGfw4cP00um4KEpNrKoWc7RMnPlCZZJerirYwOIFiksTXWKx1vXrEMxnVdUkSfC5TkYcGLLli0KvcrSsUutVPiXf/c7hikrjLOuna+cfPUVzC7Mw+334b5PfFwtbHRiTLWpoFB29CAVU3hH44JijJscVLWxyeu4NNqvXL5MCBtobLdt6qZRJlqoaMJxDF0wfH0U1yeuq5vX0UqsX9MCFzcmIV5qfQue/80xZGiaZWNiHO8kMDBSBBxuD1GQYVFocC02tDQ1I8CEpopxk4mFiJDzKnox3y61yVIUNXaSP2XBDgqIjSCQf1YKhFifHLlekDg1NYOl6DKq6wMYGB1C56bN2Lt7DybIw6Ojo6QSO+Y5zvV0b0OtjIBch9TBqCe6+ey9rEtoiXnlzNRAZSEUQvO6FoUSGdc0ttZj3/4mdu7epcy1GNAD+/aqRUo6Mjo4BF+VG8tszUVmbpL2Zsl7oFpaOaJVyIk+qmlnVzfs5BDxZdlCVplaSWi8/JlwnPDRqbfeJI8tK+WVSUNQJhQSpvkVq8QnVoY+R3sjo9Z6bpJ8SChqYUs5adaHRgbR2NiIa9cYWbGIDhprcQox5nUydojZlulDJpaUiA05PE7KEKOcoEhIYdqI8q6uLnz1y19Be3s77ASIWJ+enh612RJgWOlF5fnEY84wwB0YGmELTw9WxIjKPFrhOGcmMa/QDswszKrUJU4OFFGpZ1vLsO4lh8jOyA3ylQLCjIscLgfHOKKdSqmXTDCdJfzrVDT+8isnsefAfpWu5IhUA1diYGsb2Ro2hxWLJPOf/98v0BCox+6dO1ChURbDKwb+yrWr9J9jsLCgYqmijOPrfDXYt2snXBahEY565D9blQN5orZAhJ88cUIVPBhcwO133oHuzq1qNBXhmeUML6mKbKSgXMZWCQ7mmSwdPnyEDmAamzd3Mrw4qZ4jwUjswL6bOB2xExhsSPokAa8cV8iMfubcWRZwdqgi8LfQiEpokKYndNJuvH7+LN39HEXFoqaTPJUnz5FNkpACUSmI0TjGUW85M9OIs3ANPE/ooDhIC1eYTMtYluV04yU1iNCkM0lYOCoViTzhGD19Z5Ajnwz+HRvaEeI00Uj/l2AnyBwus/fE3Ayu9fUp/rGTQ4UT2tetQ/emrQqpYp6/98On8NBn/lb5Shnbnv3Vc4zNupkCzSuHIDGcgECmp2Qq8ceJy8hnqfAs58D+/eRnBwPcKt5bEiAnfv3LX6tZ2OfzK6MtFFKh+KQJDjt/LvTw6plT0Hp7z1bWt27AT5/+KT78lx9VhJ7mgmR2Fc8kqiwtLNWXVEQcvvqeM6mV7fPciZfUaGMoalhb34guJtMSRKapfGKJNL5OBvIsi2YSdaS6ctJmIUpq5p4OBbFpayfGhoaVwn36bz7F5OYHyuK4qt0IRcM4c/Y0i7EIL38fXlyCn5nfnbfcqvioQoWmLCrREY6TzQ4tLeC1M6cVwqRwwtESlUnrZbk2aWMBQg3Rt30jU2WmzRqjpxgRJ/wpQ8Q8/ahEctVUcjMpbf36Vm4qz1boSeX3UtDXz52hkZ7oU0aaZyZKwQINdWrkEc7yMRaSqUQdJFmZC/J14hnlZE64IEvM/uKl51RcZCOtNzMA6GrbAicvztl79SyFtkJGQuEZdi5nU96LBZX0WNTQSLsjXGhmMaQgwjMyhwe5eTqbUan4cngJb/f28vf0q0R+DVFx5PY72FZJRKJJ1XZyBCCzPB8QfibbIhRyZjM5PaWeO8/CCYoNcqLI4kmi08AIq7VuHQauDbDVu7hO9icp5nv//iQT9h60tm3gwRkDZFJJWxuDBgbEUSJcwGDmcw6ODUObHOmtJMmBdZz7ZCbuZ1Qv8Y+Vvm9uIajicRmqvZxCRJXlxjJQS+YWSobx4qmXVdxfpv9bW9eIvT17UO1Y5Qx1MkAEqsMo7r5YFJlzq7gAKXKMXqxI+6SOJ8l5kr2JD5RQIMPRz+Ik93FeFa594YXnFYpE/RnL4Y5bD0Ijbeg0CVB54EWBC3ANwm+yQLEgMfKrIFO4Voq7wo0QhNbUBJiW81iWCZClZMY6jpciLEU+gwiNxGzSPRL4Cqp/8KMfocrtUmtQkRlfI4daeW60dr3vrYogJUa+EdGQAyLZRSF8I/9AbpQlnMQ8SjtLa8nhknBa0azhdzSjy4zti8kCmgN1TFp6UO+tUamJHBToyDOStKjpgEGpxFM7t3UrJGqkhQLnyitX3+EM7FFhZjt3eoKxl9FsYKpsQYScZeSp3vnzb6rfC3LFwuzZ0YNUNEXfxkMs8pdNTuvoXYUXE9yYkydP4uhHjqoi+BjsStvKeCl5o/wTUbEaLNDluCkMgGVzZGCQ14lgCX/3DfQrVd9EH1jPEOLll1/GR0hzIboWoZsgZ2htYWqoImORlcQoyiSLlN1yyM6ToGXxKpHhf8KPchMXRUZ2KKPjkH/+D0yCckw9+LqKgcO7i0LBZJAPV0XFrm9oQi1P3iTYlCQly0OcSIj+iwmJKOjbQ/3oY3KjsdXFe0nCIqpXkHySyKuwyJM8zBnkqJdhqCHtK35TpgxiBR5HgMKRUgGwWA05OZOWraet6X3nCtZRcESUBDmyJhFMdUhFr9tQ04DIwrLK/8bGxuCRmIsFl8N7qYFYH0GdXMvmsCt/2L19myq+FDzFMFkb7r9YEVg7eEHJz9489wZuu+Uggjx0lt2UF+oJ2bJWUhmatPEST8HC0QgtTAIJYw56cqDG+VFSDAuTGF2ZYsGZ1s9FdtBGCDH/7zO/wF3vO6wQJIZZWtnII89XLp5BhMeeEsrKOYWclG3fvp2zNLeMhzgSZLxBQRNkZFmYLa3tRN9OZPhOBY/DjXsPfwDPPvOsEgtZdB2RMsFzGwFDZ2enOoKVGVy4Ww65xHPKKCrTyuwURzvjKnAu8NBdqEQKJi0qVLWtZ7sqtpl1EDBJLSSxkp+l+CwG6oI2OHypIoLwMA+uv/34v6ngUqIiI3dU+EOKKzsqbeRgqy9QmXqvXsU8+bFk0SGukwvRXJZpgPm2Do+8DUIzq6hcDqj95EUd214QKNNBmqQsSW6YLt5sM+PiyDucNhI8BaMqkyZ8bh86OjYq4REEzPMkT45QpfUcbK3O1k3Y3NaKpdlFdXZrM9r4fOwAboCdgiSJTvPaNTwhzKvZXpRY0CZvH5HYTgonFLVIznvjjTeYapvVoZQ8o1DZvffeq0TSzq9lQ2RjZDNlipIESn4ndJSXEJYUpk0ujVUybKsshUSmC0lw7RzEey+9pY4IpVUFsuL1xB9KG4tCytzsDnhhcFMcyFc6+j5TmWemHJkMLKZE5TqxMOTCENumlamwCIS89SLC4vl5DrEYXcRSIcr3sQzwCJGxERfcXNek+EXyRmk7+SwBr4hCU109330Q4OGVHqU0D9tF2fl+HFmkCJSInpz9jvOAPJsmomm3VERHUXDx9G6ezy2cfpFrk/BCihkKLaCaPvX973+/AovM/2K2ZbKRAsokluNmqNM+bqqgT9As3RljnKed6T9TcTFRtss7DhgB+TgGFbibHu7mQ5/5rEKlnJkUGGHH+eYgMdoUP5Vey/tKNKumTuzkQEkGcbO0sKS7PPewso1NbEs55AlH46oIMo7JJgWIwmA4iLyjjP6xQSYgESxwoJcUpMzdpTVTeaQcEtVwFhWhqGMKY6ICp+jFPKQBOVVzEZk1bMnr168rtEmyJFxYU8PDe45wsgmyaEHOjfFJbCB6Rak93MBaTldWWqUIaUkKK60r+afQgAwKi2x/8ZxSOFFjNYpys9R9JGThad3/A6cC8EsBkFJyAAAAAElFTkSuQmCC' - -const options = {} -options.detect_direction = 'false' -options.paragraph = 'false' -options.probability = 'false' - -// 调用通用文字识别(高精度版)(异步) -client.accurateBasic(imageBase64, options).then((result) => { - console.log(JSON.stringify(result)) -}).catch((err) => { - // 如果发生网络错误 - console.log(err) -}) diff --git a/packages/mitmproxy/test/dnsLookupTest.mjs b/packages/mitmproxy/test/dnsLookupTest.mjs deleted file mode 100644 index 7a225f9dc5..0000000000 --- a/packages/mitmproxy/test/dnsLookupTest.mjs +++ /dev/null @@ -1,79 +0,0 @@ -import assert from 'node:assert/strict' -import { createRequire } from 'node:module' - -const require = createRequire(import.meta.url) - -const BaseDNS = require('../src/lib/dns/base.js') - -class MockDNS extends BaseDNS { - constructor () { - super('mock-dns', 4, 'mock-dns', 'UDP', 10, null) - } - - async _dnsQueryPromise () { - return { - answers: [ - { type: 'A', data: undefined }, - { type: 'A', data: 'not-an-ip' }, - ], - } - } -} - -async function main () { - const mockDns = new MockDNS() - const lookupResult = await mockDns.lookup('api.github.com', { family: 4 }) - assert.strictEqual(lookupResult, 'api.github.com') - - const speedModulePath = require.resolve('../src/lib/speed/index.js') - const dnsLookupModulePath = require.resolve('../src/lib/proxy/mitmproxy/dnsLookup.js') - - const originalSpeedModule = require.cache[speedModulePath] - - try { - let dnsLookupCalls = 0 - - require.cache[speedModulePath] = { - exports: { - getSpeedTester: () => null, - }, - } - - const dnsLookup = require(dnsLookupModulePath) - const lookup = dnsLookup.createLookupFunc(null, { - dns: { - dnsName: 'mock-dns', - lookup: async () => { - dnsLookupCalls++ - return '::1' - }, - }, - family: 4, - }, 'connect', 'api.github.com:443', 443, {}) - - const resolved = await new Promise((resolve, reject) => { - lookup('api.github.com', { all: true }, (err, addresses) => { - if (err) { - reject(err) - return - } - resolve({ addresses }) - }) - }) - - assert.strictEqual(dnsLookupCalls, 1) - assert.deepStrictEqual(resolved.addresses, [{ address: '::1', family: 6 }]) - } finally { - if (originalSpeedModule) { - require.cache[speedModulePath] = originalSpeedModule - } else { - delete require.cache[speedModulePath] - } - delete require.cache[dnsLookupModulePath] - } -} - -main().catch((error) => { - console.error(error) - process.exit(1) -}) diff --git a/packages/mitmproxy/test/dnsSpeedTest.js b/packages/mitmproxy/test/dnsSpeedTest.js deleted file mode 100644 index 80d8c78cfa..0000000000 --- a/packages/mitmproxy/test/dnsSpeedTest.js +++ /dev/null @@ -1,33 +0,0 @@ -const dns = require('../src/lib/dns/index.js') -const SpeedTest = require('../src/lib/speed/index.js') -const SpeedTester = require('../src/lib/speed/SpeedTester.js') - -const dnsMap = dns.initDNS({ - cloudflare: { - type: 'https', - server: 'https://1.1.1.1/dns-query', - cacheSize: 1000, - }, - // py233: { //污染 - // type: 'https', - // server: ' https://i.233py.com/dns-query', - // cacheSize: 1000 - // } - // google: { //不可用 - // type: 'https', - // server: 'https://8.8.8.8/dns-query', - // cacheSize: 1000 - // }, - // dnsSB: { //不可用 - // type: 'https', - // server: 'https://doh.dns.sb/dns-query', - // cacheSize: 1000 - // } -}) - -SpeedTest.initSpeedTest({ hostnameList: {}, dnsMap }) - -const tester = new SpeedTester({ hostname: 'github.com' }) -tester.test().then(() => { - console.log('github.com tester.alive = ', tester.alive) -}) diff --git a/packages/mitmproxy/test/dnsTest-abroad-doh-sni.mjs b/packages/mitmproxy/test/dnsTest-abroad-doh-sni.mjs deleted file mode 100644 index 6b029aba27..0000000000 --- a/packages/mitmproxy/test/dnsTest-abroad-doh-sni.mjs +++ /dev/null @@ -1,94 +0,0 @@ -import DNSOverHTTPS from "../src/lib/dns/https.js"; - -// 境外DNS的DoH配置sni测试 -const servers = [ - 'https://dns.quad9.net/dns-query', - 'https://max.rethinkdns.com/dns-query', - 'https://sky.rethinkdns.com/dns-query', - 'https://doh.opendns.com/dns-query', - 'https://1.1.1.1/dns-query', - 'https://dns.cloudflare.com/dns-query', - 'https://cloudflare-dns.com/dns-query', - 'https://dns.google/dns-query', - 'https://dns.bebasid.com/unfiltered', - 'https://0ms.dev/dns-query', - 'https://dns.decloudus.com/dns-query', - 'https://wikimedia-dns.org/dns-query', - 'https://doh.applied-privacy.net/query', - 'https://private.canadianshield.cira.ca/dns-query', - // 'https://dns.controld.com/comss', // 可直连,无需SNI - 'https://kaitain.restena.lu/dns-query', - 'https://doh.libredns.gr/dns-query', - 'https://doh.libredns.gr/ads', - 'https://dns.switch.ch/dns-query', - 'https://doh.nl.ahadns.net/dns-query', - 'https://doh.la.ahadns.net/dns-query', - 'https://dns.dnswarden.com/uncensored', - 'https://doh.ffmuc.net/dns-query', - 'https://dns.oszx.co/dns-query', - 'https://doh.tiarap.org/dns-query', - 'https://jp.tiarap.org/dns-query', - 'https://dns.adguard.com/dns-query', - 'https://rubyfish.cn/dns-query', - 'https://i.233py.com/dns-query', -] - -const hostnames = [ - 'github.com', - 'mvnrepository.com', -] - -const hostname1 = 'github.com' -const sni = 'baidu.com' -// const sni = '' - -console.log(`\n--------------- 测试DoH的SNI功能:共 ${servers.length} 个服务,${hostnames.length} 个域名,SNI: ${sni || '无'} ---------------\n`) - -let n = 0 -let success = 0 -let error = 0 -const arr = [] - -function count (isSuccess, hostname, idx, dns, result, cost) { - if (isSuccess) { - success++ - const ipList = [] - for (const answer of result.answers) { - ipList[ipList.length] = answer.data; - } - arr[idx] = `${dns.dnsServer} : ${hostname} -> [ ${ipList.join(', ')} ] , cost: ${cost} ms`; - } else { - error++ - } - - n++ - - if (n === servers.length * hostnames.length) { - console.info(`\n\n=============================================================================\n全部测完:总计:${servers.length * hostnames.length}, 成功:${success},失败:${error}`); - for (const item of arr) { - if (item) { - console.info(item); - } - } - console.info('=============================================================================\n\n') - } -} - -let x = 0; -for (let i = 0; i < servers.length; i++) { - for (const hostname of hostnames) { - const dns = new DNSOverHTTPS(`dns-${i}-${hostname}`, null, null, servers[i], sni) - const start = Date.now() - const idx = x; - dns._doDnsQuery(hostname) - .then((result) => { - console.info(`===> ${dns.dnsServer}: ${hostname} ->`, result.answers, '\n\n') - count(true, hostname, idx, dns, result, Date.now() - start) - }) - .catch((e) => { - console.error(`===> ${dns.dnsServer}: ${hostname} 失败:`, e, '\n\n') - count(false, hostname) - }) - x++; - } -} diff --git a/packages/mitmproxy/test/dnsTest-abroad-dot-sni.mjs b/packages/mitmproxy/test/dnsTest-abroad-dot-sni.mjs deleted file mode 100644 index c6cfddb9bd..0000000000 --- a/packages/mitmproxy/test/dnsTest-abroad-dot-sni.mjs +++ /dev/null @@ -1,107 +0,0 @@ -import DNSOverTLS from "../src/lib/dns/tls.js"; - -// 境外DNS的DoT配置sni测试 -const servers = [ - // 'dot.360.cn', - - '1.1.1.1', // 可直连,无需SNI(有时候可以,有时候不行) - 'one.one.one.one', - 'cloudflare-dns.com', - 'security.cloudflare-dns.com', - 'family.cloudflare-dns.com', - '1dot1dot1dot1.cloudflare-dns.com', - - 'dot.sb', - '185.222.222.222', - '45.11.45.11', - - 'dns.adguard.com', - 'dns.adguard-dns.com', - 'dns-family.adguard.com', - 'family.adguard-dns.com', - 'dns-unfiltered.adguard.com', - 'unfiltered.adguard-dns.com', - 'dns.bebasid.com', - 'unfiltered.dns.bebasid.com', - 'antivirus.bebasid.com', - 'internetsehat.bebasid.com', - 'family-adblock.bebasid.com', - 'oisd.dns.bebasid.com', - 'hagezi.dns.bebasid.com', - 'dns.cfiec.net', - 'dns.opendns.com', - 'familyshield.opendns.com', - 'sandbox.opendns.com', - 'family-filter-dns.cleanbrowsing.org', - 'adult-filter-dns.cleanbrowsing.org', - 'security-filter-dns.cleanbrowsing.org', - 'p0.freedns.controld.com', - 'p1.freedns.controld.com', - 'p2.freedns.controld.com', - 'p3.freedns.controld.com', - 'dns.decloudus.com', - 'getdnsapi.net', - 'dnsovertls.sinodun.com', - 'dnsovertls1.sinodun.com', - 'dns.de.futuredns.eu.org', - 'dns.us.futuredns.eu.org', - 'unicast.censurfridns.dk', -] - -const hostnames = [ - 'github.com', - 'mvnrepository.com', -] -const sni = 'baidu.com' -// const sni = '' - -console.log(`\n--------------- 测试DoT的SNI功能:共 ${servers.length} 个服务,${hostnames.length} 个域名,SNI: ${sni || '无'} ---------------\n`) - -let n = 0 -let success = 0 -let error = 0 -const arr = [] - -function count (isSuccess, hostname, idx, dns, result, cost) { - if (isSuccess) { - success++ - const ipList = [] - for (const answer of result.answers) { - ipList[ipList.length] = answer.data; - } - arr[idx] = `${dns.dnsServer} : ${hostname} -> [ ${ipList.join(', ')} ] , cost: ${cost} ms`; - } else { - error++ - } - - n++ - - if (n === servers.length * hostnames.length) { - console.info(`\n\n=============================================================================\n全部测完:总计:${servers.length * hostnames.length}, 成功:${success},失败:${error}`); - for (const item of arr) { - if (item) { - console.info(item); - } - } - console.info('=============================================================================\n\n') - } -} - -let x = 0; -for (let i = 0; i < servers.length; i++) { - for (const hostname of hostnames) { - const dns = new DNSOverTLS(`dns-${i}-${hostname}`, null, null, servers[i], null, sni) - const start = Date.now() - const idx = x; - dns._doDnsQuery(hostname) - .then((result) => { - console.info(`===> ${dns.dnsServer}: ${hostname} ->`, result.answers, '\n\n') - count(true, hostname, idx, dns, result, Date.now() - start) - }) - .catch((e) => { - console.error(`===> ${dns.dnsServer}: ${hostname} 失败:`, e, '\n\n') - count(false, hostname) - }) - x++; - } -} diff --git a/packages/mitmproxy/test/dnsTest-abroad.mjs b/packages/mitmproxy/test/dnsTest-abroad.mjs deleted file mode 100644 index 7e8a70e23d..0000000000 --- a/packages/mitmproxy/test/dnsTest-abroad.mjs +++ /dev/null @@ -1,149 +0,0 @@ -import assert from 'node:assert' -import dns from '../src/lib/dns/index.js' -import matchUtil from '../src/utils/util.match.js' - -const presetIp = '100.100.100.100' -const preSetIpList = matchUtil.domainMapRegexply({ - 'xxx.com': [ - presetIp - ] -}) - -// 境外DNS测试 -const dnsProviders = dns.initDNS({ - // udp - cloudflareUdp: { - server: 'udp://1.1.1.1', - }, - quad9Udp: { - server: 'udp://9.9.9.9', - }, - - // tcp - cloudflareTcp: { - server: 'tcp://1.1.1.1', - }, - quad9Tcp: { - server: 'tcp://9.9.9.9', - }, - - // https - cloudflare: { - server: 'https://1.1.1.1/dns-query', - }, - quad9: { - server: 'https://9.9.9.9/dns-query', - forSNI: true, - }, - rubyfish: { - server: 'https://rubyfish.cn/dns-query', - }, - py233: { - server: ' https://i.233py.com/dns-query', - }, - - // tls - cloudflareTLS: { - type: 'tls', - server: '1.1.1.1', - servername: 'cloudflare-dns.com', - }, - quad9TLS: { - server: 'tls://9.9.9.9', - servername: 'dns.quad9.net', - }, -}, preSetIpList) - - -const hasPresetHostname = 'xxx.com' -const noPresetHostname = 'yyy.com' - -const hostname1 = 'github.com' -const hostname2 = 'api.github.com' -const hostname3 = 'hk.docmirror.cn' -const hostname4 = 'github.docmirror.cn' -const hostname5 = 'gh.docmirror.top' -const hostname6 = 'gh2.docmirror.top' - -let ip - - -console.log('\n--------------- test ForSNI ---------------\n') -console.log(`===> test ForSNI: ${dnsProviders.ForSNI.dnsName}`, '\n\n') -assert.strictEqual(dnsProviders.ForSNI, dnsProviders.quad9) - - -console.log('\n--------------- test PreSet ---------------\n') -ip = await dnsProviders.PreSet.lookup(hasPresetHostname) -console.log(`===> test PreSet: ${hasPresetHostname} ->`, ip, '\n\n') -console.log('\n\n') -assert.strictEqual(ip, presetIp) // 预设过IP,等于预设的IP - -ip = await dnsProviders.PreSet.lookup(noPresetHostname) -console.log(`===> test PreSet: ${noPresetHostname} ->`, ip, '\n\n') -console.log('\n\n') -assert.strictEqual(ip, noPresetHostname) // 未预设IP,等于域名自己 - - -console.log('\n--------------- test udp ---------------\n') -ip = await dnsProviders.cloudflareUdp.lookup(hasPresetHostname) -assert.strictEqual(ip, presetIp) // test preset -console.log('\n\n') - -assert.strictEqual(dnsProviders.cloudflareUdp.dnsType, 'UDP') -ip = await dnsProviders.cloudflareUdp.lookup(hostname1) -console.log(`===> test cloudflare: ${hostname1} ->`, ip, '\n\n') - -assert.strictEqual(dnsProviders.quad9Udp.dnsType, 'UDP') -ip = await dnsProviders.quad9Udp.lookup(hostname1) -console.log(`===> test quad9: ${hostname1} ->`, ip, '\n\n') - - -console.log('\n--------------- test tcp ---------------\n') -ip = await dnsProviders.cloudflareTcp.lookup(hasPresetHostname) -assert.strictEqual(ip, presetIp) // test preset -console.log('\n\n') - -assert.strictEqual(dnsProviders.cloudflareTcp.dnsType, 'TCP') -ip = await dnsProviders.cloudflareTcp.lookup(hostname1) -console.log(`===> test cloudflare: ${hostname1} ->`, ip, '\n\n') - -assert.strictEqual(dnsProviders.quad9Tcp.dnsType, 'TCP') -ip = await dnsProviders.quad9Tcp.lookup(hostname1) -console.log(`===> test quad9: ${hostname1} ->`, ip, '\n\n') - - -console.log('\n--------------- test https ---------------\n') -ip = await dnsProviders.cloudflare.lookup(hasPresetHostname) -assert.strictEqual(ip, presetIp) // test preset -console.log('\n\n') - -assert.strictEqual(dnsProviders.cloudflare.dnsType, 'HTTPS') -ip = await dnsProviders.cloudflare.lookup(hostname1) -console.log(`===> test cloudflare: ${hostname1} ->`, ip, '\n\n') - -assert.strictEqual(dnsProviders.quad9.dnsType, 'HTTPS') -ip = await dnsProviders.quad9.lookup(hostname1) -console.log(`===> test quad9: ${hostname1} ->`, ip, '\n\n') - -assert.strictEqual(dnsProviders.rubyfish.dnsType, 'HTTPS') -ip = await dnsProviders.rubyfish.lookup(hostname1) -console.log(`===> test rubyfish: ${hostname1} ->`, ip, '\n\n') - -assert.strictEqual(dnsProviders.py233.dnsType, 'HTTPS') -ip = await dnsProviders.py233.lookup(hostname1) -console.log(`===> test py233: ${hostname1} ->`, ip, '\n\n') - - -console.log('\n--------------- test TLS ---------------\n') -ip = await dnsProviders.cloudflareTLS.lookup(hasPresetHostname) -assert.strictEqual(ip, presetIp) // test preset -console.log('\n\n') - -assert.strictEqual(dnsProviders.cloudflareTLS.dnsType, 'TLS') -ip = await dnsProviders.cloudflareTLS.lookup(hostname1) -console.log(`===> test cloudflareTLS: ${hostname1} ->`, ip, '\n\n') - -assert.strictEqual(dnsProviders.quad9TLS.dnsType, 'TLS') -ip = await dnsProviders.quad9TLS.lookup(hostname1) -console.log(`===> test quad9TLS: ${hostname1} ->`, ip, '\n\n') diff --git a/packages/mitmproxy/test/dnsTest.mjs b/packages/mitmproxy/test/dnsTest.mjs deleted file mode 100644 index 65df397866..0000000000 --- a/packages/mitmproxy/test/dnsTest.mjs +++ /dev/null @@ -1,182 +0,0 @@ -import assert from 'node:assert' -import dns from '../src/lib/dns/index.js' -import matchUtil from '../src/utils/util.match.js' - -const presetIp = '100.100.100.100' -const preSetIpList = matchUtil.domainMapRegexply({ - 'xxx.com': [ - presetIp - ] -}) - -// 常用DNS测试 -const dnsProviders = dns.initDNS({ - // https - aliyun: { - type: 'https', - server: 'https://dns.alidns.com/dns-query', - cacheSize: 1000, - }, - aliyun2: { - type: 'https', - server: 'dns.alidns.com', // 会自动补上 `https://` 和 `/dns-query` - cacheSize: 1000, - }, - safe360: { - server: 'https://doh.360.cn/dns-query', - cacheSize: 1000, - forSNI: true, - }, - - // tls - aliyunTLS: { - server: 'tls://223.5.5.5:853', - cacheSize: 1000, - }, - aliyunTLS2: { - server: 'tls://223.6.6.6', - cacheSize: 1000, - }, - safe360TLS: { - server: 'tls://dot.360.cn', - cacheSize: 1000, - }, - - // tcp - googleTCP: { - type: 'tcp', - server: '8.8.8.8', - port: 53, - cacheSize: 1000, - }, - aliyunTCP: { - server: 'tcp://223.5.5.5', - cacheSize: 1000, - }, - - // udp - googleUDP: { - // type: 'udp', // 默认是udp可以不用标 - server: '8.8.8.8', - cacheSize: 1000, - }, - aliyunUDP: { - server: 'udp://223.5.5.5', - cacheSize: 1000, - }, -}, preSetIpList) - - -const hasPresetHostname = 'xxx.com' -const noPresetHostname = 'yyy.com' - -const hostname1 = 'github.com' -const hostname2 = 'api.github.com' -const hostname3 = 'hk.docmirror.cn' -const hostname4 = 'github.docmirror.cn' -const hostname5 = 'gh.docmirror.top' -const hostname6 = 'gh2.docmirror.top' - -let ip - - -console.log('\n--------------- test ForSNI ---------------\n') -console.log(`===> test ForSNI: ${dnsProviders.ForSNI.dnsName}`, '\n\n') -assert.strictEqual(dnsProviders.ForSNI, dnsProviders.safe360) - -const dnsProviders2 = dns.initDNS({ - aliyun: { - server: 'udp://223.5.5.5', - }, -}, {}) -console.log(`===> test ForSNI2: ${dnsProviders2.ForSNI.dnsName}`, '\n\n') -assert.strictEqual(dnsProviders2.ForSNI, dnsProviders2.PreSet) // 未配置forSNI的DNS时,默认使用PreSet作为ForSNI - - -console.log('\n--------------- test PreSet ---------------\n') -ip = await dnsProviders.PreSet.lookup(hasPresetHostname) -console.log(`===> test PreSet: ${hasPresetHostname} ->`, ip, '\n\n') -console.log('\n\n') -assert.strictEqual(ip, presetIp) // 预设过IP,等于预设的IP - -ip = await dnsProviders.PreSet.lookup(noPresetHostname) -console.log(`===> test PreSet: ${noPresetHostname} ->`, ip, '\n\n') -console.log('\n\n') -assert.strictEqual(ip, noPresetHostname) // 未预设IP,等于域名自己 - - -console.log('\n--------------- test https ---------------\n') -ip = await dnsProviders.aliyun.lookup(hasPresetHostname) -assert.strictEqual(ip, presetIp) // test preset -console.log('\n\n') - -assert.strictEqual(dnsProviders.aliyun.dnsType, 'HTTPS') -ip = await dnsProviders.aliyun.lookup(hostname1) -console.log(`===> test aliyun: ${hostname1} ->`, ip, '\n\n') - -assert.strictEqual(dnsProviders.aliyun2.dnsType, 'HTTPS') -ip = await dnsProviders.aliyun2.lookup(hostname1) -console.log(`===> test aliyun2: ${hostname1} ->`, ip, '\n\n') - -assert.strictEqual(dnsProviders.safe360.dnsType, 'HTTPS') -ip = await dnsProviders.safe360.lookup(hostname1) -console.log(`===> test safe360: ${hostname1} ->`, ip, '\n\n') - - -console.log('\n--------------- test TLS ---------------\n') -ip = await dnsProviders.aliyunTLS.lookup(hasPresetHostname) -assert.strictEqual(ip, presetIp) // test preset -console.log('\n\n') - -assert.strictEqual(dnsProviders.aliyunTLS.dnsType, 'TLS') -ip = await dnsProviders.aliyunTLS.lookup(hostname1) -console.log(`===> test aliyunTLS: ${hostname1} ->`, ip, '\n\n') - -assert.strictEqual(dnsProviders.aliyunTLS2.dnsType, 'TLS') -ip = await dnsProviders.aliyunTLS2.lookup(hostname1) -console.log(`===> test aliyunTLS2: ${hostname1} ->`, ip, '\n\n') - -assert.strictEqual(dnsProviders.safe360TLS.dnsType, 'TLS') -ip = await dnsProviders.safe360TLS.lookup(hostname1) -console.log(`===> test safe360TLS: ${hostname1} ->`, ip, '\n\n') - - -console.log('\n--------------- test TCP ---------------\n') -ip = await dnsProviders.googleTCP.lookup(hasPresetHostname) -assert.strictEqual(ip, presetIp) // test preset -console.log('\n\n') - -assert.strictEqual(dnsProviders.googleTCP.dnsType, 'TCP') -ip = await dnsProviders.googleTCP.lookup(hostname1) -console.log(`===> test googleTCP: ${hostname1} ->`, ip, '\n\n') - -assert.strictEqual(dnsProviders.aliyunTCP.dnsType, 'TCP') -ip = await dnsProviders.aliyunTCP.lookup(hostname1) -console.log(`===> test aliyunTCP: ${hostname1} ->`, ip, '\n\n') - - -console.log('\n--------------- test UDP ---------------\n') -ip = await dnsProviders.googleUDP.lookup(hasPresetHostname) -assert.strictEqual(ip, presetIp) // test preset -console.log('\n\n') - -assert.strictEqual(dnsProviders.googleUDP.dnsType, 'UDP') -ip = await dnsProviders.googleUDP.lookup(hostname1) -console.log(`===> test googleUDP: ${hostname1} ->`, ip, '\n\n') - -assert.strictEqual(dnsProviders.aliyunUDP.dnsType, 'UDP') -ip = await dnsProviders.aliyunUDP.lookup(hostname1) -console.log(`===> test aliyunUDP: ${hostname1} ->`, ip, '\n\n') - -dnsProviders.aliyunUDP.lookup(hostname1).then(ip0 => { - console.log(`===> test aliyunUDP: ${hostname1} ->`, ip0, '\n\n') -}) -dnsProviders.aliyunUDP.lookup(hostname2).then(ip0 => { - console.log(`===> test aliyunUDP: ${hostname2} ->`, ip0, '\n\n') -}) -dnsProviders.aliyunUDP.lookup('baidu.com').then(ip0 => { - console.log('===> test aliyunUDP: baidu.com ->', ip0, '\n\n') -}) -dnsProviders.aliyunUDP.lookup('gitee.com').then(ip0 => { - console.log('===> test aliyunUDP: gitee.com ->', ip0, '\n\n') -}) diff --git a/packages/mitmproxy/test/ipv6-test.mjs b/packages/mitmproxy/test/ipv6-test.mjs deleted file mode 100644 index 9e07016ae8..0000000000 --- a/packages/mitmproxy/test/ipv6-test.mjs +++ /dev/null @@ -1,89 +0,0 @@ -import assert from 'node:assert' -import { isIPv6 } from '../src/lib/dns/util.ip.js' - -assert.strictEqual(isIPv6, isIPv6) -assert.strictEqual(isIPv6('2001:0db8:0000:0000:0000:0000:1428:57ab'), true); // true -assert.strictEqual(isIPv6('[2001:0db8:0000:0000:0000:0000:1428:57ab]'), true); // true -assert.strictEqual(isIPv6('[2001:0db8:0000:0000:0000:0000:1428:57ab]:443'), true); // true -assert.strictEqual(isIPv6('http://[2001:0db8:0000:0000:0000:0000:1428:57ab]:443'), true); // true -assert.strictEqual(isIPv6('2001:db8:0:0:0:0:1428:57ab'), true); // true -assert.strictEqual(isIPv6('http://[2001:db8:0:0:0:0:1428:57ab]:443'), true); // true -assert.strictEqual(isIPv6('2001:db8::1428:57ab'), true); // true -assert.strictEqual(isIPv6('http://[2001:db8::1428:57ab]:443'), true); // true -assert.strictEqual(isIPv6('fe80::1'), true); // true -assert.strictEqual(isIPv6('http://[fe80::1]:443'), true); // true -assert.strictEqual(isIPv6('::1'), true); // true -assert.strictEqual(isIPv6('http://[::1]:443'), true); // true -assert.strictEqual(isIPv6('2001:4860:4860::8888'), true); // true -assert.strictEqual(isIPv6('http://[2001:4860:4860::8888]:443'), true); // true -assert.strictEqual(isIPv6('http://example.com'), false); // false - -import defaultDns from 'node:dns' -import dns from '../src/lib/dns/index.js' - -const dnsProviders = dns.initDNS({ - // DoH - DoH1: { - server: 'https://dns.alidns.com/dns-query', - }, - DoH2: { - server: 'https://dns.google/dns-query', - }, - // DoT - DoT1: { - server: 'tls://dns.alidns.com', - }, - DoT2: { - server: 'tls://[2620:fe::fe]', - }, - // tcp - TCP1: { - server: 'tcp://223.5.5.5', - }, - TCP2: { - server: "tcp://[2606:4700:4700::1111]", - }, - // udp - UDP1: { - server: 'udp://223.5.5.5', - }, - UDP2: { - server: 'udp://[2001:4860:4860::8888]', - sni: 'g.cn', - }, -}, null) - -const hostname = 'rr4---sn-npoe7nek.gvt1.com' -// const hostname = 'rr5---sn-4g5e6nzl.googlevideo.com' -// const hostname = 'ipv6.google.com' -// const hostname = 'www.youtube.com' - -const family = 6 - -async function test(dns) { - const ip = await dns.lookup(hostname, { family }) - console.log(`\n\n【${dns.dnsName} - ${dns.dnsServer}(IPv${dns.dnsFamily})】 ${hostname} -> ${ip}(IPv${family})`, '\n\n') -} - -await test(dnsProviders.DoH1) -await test(dnsProviders.DoH2) -await test(dnsProviders.DoT1) -await test(dnsProviders.DoT2) -await test(dnsProviders.TCP1) -await test(dnsProviders.TCP2) -await test(dnsProviders.UDP1) -await test(dnsProviders.UDP2) - -// eslint-disable-next-line node/handle-callback-err -defaultDns.lookup(hostname, { family }, (...args) => { - console.log(`\n\n【test Default DNS(IPv${family})】 ${hostname} -> ${args[1]}`, '\n\n', args) -}) -if (family === 6) { - defaultDns.resolve6(hostname, (...args) => { - console.log(`\n\n【test Default DNS(IPv${family})】 ${hostname} -> ${args[1]}`, '\n\n', args) - }) -} else { - defaultDns.resolve4(hostname, (...args) => { - console.log(`\n\n【test Default DNS(IPv${family})】 ${hostname} -> ${args[1]}`, '\n\n', args) - }) -} diff --git a/packages/mitmproxy/test/lodashTest.js b/packages/mitmproxy/test/lodashTest.js deleted file mode 100644 index f3a7a4f397..0000000000 --- a/packages/mitmproxy/test/lodashTest.js +++ /dev/null @@ -1,37 +0,0 @@ -const assert = require('node:assert') -const lodash = require('lodash') - -// test lodash.isEqual -const arr1 = [1, 2, 3] -const arr2 = [1, 2, 3] -const arr3 = [3, 2, 1] -assert.strictEqual(lodash.isEqual(arr1, arr2), true) -assert.strictEqual(lodash.isEqual(arr1.sort(), arr3.sort()), true) - -// test lodash.isEmpty - -function isEmpty (obj) { - return obj == null || (lodash.isObject(obj) && lodash.isEmpty(obj)) -} - -// true -assert.strictEqual(isEmpty(null), true) -assert.strictEqual(isEmpty({}), true) -assert.strictEqual(isEmpty([]), true) -// false -assert.strictEqual(isEmpty(true), false) -assert.strictEqual(isEmpty(false), false) -assert.strictEqual(isEmpty(1), false) -assert.strictEqual(isEmpty(0), false) -assert.strictEqual(isEmpty(-1), false) -assert.strictEqual(isEmpty(''), false) -assert.strictEqual(isEmpty('1'), false) - -// test lodash.unionBy -const list = [ - { host: 1, port: 1, dns: 2 }, - { host: 1, port: 1, dns: 3 }, - { host: 1, port: 2, dns: 3 }, - { host: 1, port: 2, dns: 3 }, -] -console.info(lodash.unionBy(list, 'host', 'port')) diff --git a/packages/mitmproxy/test/matchTest.js b/packages/mitmproxy/test/matchTest.js deleted file mode 100644 index c2e5a69e60..0000000000 --- a/packages/mitmproxy/test/matchTest.js +++ /dev/null @@ -1,30 +0,0 @@ -const assert = require('node:assert') - -const name = '/docmirror/dev-sidecar/raw/master/doc/index.png' -// https://raw.fastgit.org/docmirror/dev-sidecar/master/doc/index.png -const ret = name.replace(/^(.+)\/raw\/(.+)$/, 'raw.fastgit.org$1/$2') -console.log(ret) -assert.strictEqual(ret, 'raw.fastgit.org/docmirror/dev-sidecar/master/doc/index.png') - -const reg = /^\/[^/]+\/[^/]+$/ -console.log('/greper/d2-crud-plus/blob/master/.eslintignore'.match(reg)) -assert.strictEqual('/greper/d2-crud-plus/blob/master/.eslintignore'.match(reg), null) - -const chunk = Buffer.from('') -const script = '' -const index = chunk.indexOf('') -const scriptBuf = Buffer.from(script) -const chunkNew = Buffer.alloc(chunk.length + scriptBuf.length) -chunk.copy(chunkNew, 0, 0, index) -scriptBuf.copy(chunkNew, index, 0) -chunk.copy(chunkNew, index + scriptBuf.length, index) -console.log(chunkNew.toString()) -assert.strictEqual(chunkNew.toString(), '') - -const reg2 = /aaaa/i -console.log(reg2.test('aaaa')) // true -assert.strictEqual(reg2.test('aaaa'), true) - -const reg3 = '/aaaa/i' -console.log(new RegExp(reg3).test('aaaa')) // false -assert.strictEqual(new RegExp(reg3).test('aaaa'), false) diff --git a/packages/mitmproxy/test/matchUtilTest.js b/packages/mitmproxy/test/matchUtilTest.js deleted file mode 100644 index 7103998edd..0000000000 --- a/packages/mitmproxy/test/matchUtilTest.js +++ /dev/null @@ -1,83 +0,0 @@ -const assert = require('node:assert') -const matchUtil = require('../src/utils/util.match') - -const hostMap = matchUtil.domainMapRegexply({ - 'aaa.com': true, - '*bbb.com': true, - '*.ccc.com': true, - '^.{1,3}ddd.com$': true, - '*.cn': true, - '.github.com': true, - - '*.eee.com': true, - '.eee.com': false, // 此配置将被忽略,因为有 '*.eee.com' 了,优先级更高 -}) - -console.log(hostMap) -assert.strictEqual(hostMap['^.*bbb\\.com$'], true) -assert.strictEqual(hostMap['^.*\\.ccc\\.com$'], true) -assert.strictEqual(hostMap['^.{1,3}ddd.com$'], true) -assert.strictEqual(hostMap['^.*\\.cn$'], true) -assert.strictEqual(hostMap['^.*\\.github\\.com$'], true) -assert.strictEqual(hostMap['^.*\\.github\\.com$'], true) -assert.strictEqual(hostMap['^.*\\.eee\\.com$'], true) - -const origin = hostMap.origin -assert.strictEqual(origin['aaa.com'], true) -assert.strictEqual(origin['*bbb.com'], true) -assert.strictEqual(origin['*.ccc.com'], true) -assert.strictEqual(origin['*.cn'], true) -assert.strictEqual(origin['*.github.com'], true) -assert.strictEqual(origin['.eee.com'], undefined) - -const value11 = matchUtil.matchHostname(hostMap, 'aaa.com', 'test1.1') -const value12 = matchUtil.matchHostname(hostMap, 'aaaa.com', 'test1.2') -const value13 = matchUtil.matchHostname(hostMap, 'aaaa.comx', 'test1.3') -console.log('test1: aaa.com') -assert.strictEqual(value11, true) -assert.strictEqual(value12, undefined) -assert.strictEqual(value13, undefined) - -const value21 = matchUtil.matchHostname(hostMap, 'bbb.com', 'test2.1') -const value22 = matchUtil.matchHostname(hostMap, 'xbbb.com', 'test2.2') -const value23 = matchUtil.matchHostname(hostMap, 'bbb.comx', 'test2.3') -const value24 = matchUtil.matchHostname(hostMap, 'x.bbb.com', 'test2.4') -console.log('test2: *bbb.com') -assert.strictEqual(value21, true) -assert.strictEqual(value22, true) -assert.strictEqual(value23, undefined) -assert.strictEqual(value24, true) - -const value31 = matchUtil.matchHostname(hostMap, 'ccc.com', 'test3.1') -const value32 = matchUtil.matchHostname(hostMap, 'x.ccc.com', 'test3.2') -const value33 = matchUtil.matchHostname(hostMap, 'xccc.com', 'test3.3') -console.log('test3: *.ccc.com') -assert.strictEqual(value31, true) -assert.strictEqual(value32, true) -assert.strictEqual(value33, undefined) - -const value41 = matchUtil.matchHostname(hostMap, 'ddd.com', 'test4.1') -const value42 = matchUtil.matchHostname(hostMap, 'x.ddd.com', 'test4.2') -const value43 = matchUtil.matchHostname(hostMap, 'xddd.com', 'test4.3') -console.log('test4: ^.{1,3}ddd.com$') -assert.strictEqual(value41, undefined) -assert.strictEqual(value42, true) -assert.strictEqual(value43, true) - -const value51 = matchUtil.matchHostname(hostMap, 'zzz.cn', 'test5.1') -const value52 = matchUtil.matchHostname(hostMap, 'x.zzz.cn', 'test5.2') -const value53 = matchUtil.matchHostname(hostMap, 'zzz.cnet.com', 'test5.3') -console.log('test5: *.cn') -assert.strictEqual(value51, true) -assert.strictEqual(value52, true) -assert.strictEqual(value53, undefined) - -const value61 = matchUtil.matchHostname(hostMap, 'github.com', 'test6.1') -const value62 = matchUtil.matchHostname(hostMap, 'api.github.com', 'test6.2') -const value63 = matchUtil.matchHostname(hostMap, 'aa.bb.github.com', 'test6.3') -const value64 = matchUtil.matchHostname(hostMap, 'aaagithub.com', 'test6.4') -console.log('test6: .github.com') -assert.strictEqual(value61, true) -assert.strictEqual(value62, true) -assert.strictEqual(value63, true) -assert.strictEqual(value64, undefined) diff --git a/packages/mitmproxy/test/monkeyTest.js b/packages/mitmproxy/test/monkeyTest.js deleted file mode 100644 index 72a39ad505..0000000000 --- a/packages/mitmproxy/test/monkeyTest.js +++ /dev/null @@ -1,14 +0,0 @@ -const assert = require('node:assert') -const monkey = require('../src/lib/monkey') - -let scripts -try { - scripts = monkey.load('../gui/extra/scripts/') // 相对于 mitmproxy 目录的相对路径,而不是当前 test 目录的。 -} catch { - scripts = monkey.load('../../gui/extra/scripts/') // 相对于 当前 test 目录的相对路径 -} - -// console.log(scripts) -assert.strictEqual(scripts.github != null, true) -assert.strictEqual(scripts.google != null, true) -assert.strictEqual(scripts.tampermonkey != null, true) diff --git a/packages/mitmproxy/test/pacTest.js b/packages/mitmproxy/test/pacTest.js deleted file mode 100644 index 136cff545f..0000000000 --- a/packages/mitmproxy/test/pacTest.js +++ /dev/null @@ -1,12 +0,0 @@ -const assert = require('node:assert') -const pac = require('../src/lib/proxy/middleware/source/pac') - -const pacClient = pac.createPacClient('../gui/extra/pac/pac.txt') // 相对于 mitmproxy 目录的相对路径,而不是当前 test 目录的。 - -const string = pacClient.FindProxyForURL('https://www.facebook.com', 'www.facebook.com') -console.log(`facebook: ${string}`) -// assert.strictEqual(string, pacClient.proxyUrl) // TODO: 测试不通过,暂时注释掉,后面再debug找原因 - -const string2 = pacClient.FindProxyForURL('https://http2.golang.org', 'http2.golang.org') -console.log(`golang: ${string2}`) -// assert.strictEqual(string2, 'DIRECT;') // TODO: 测试不通过,暂时注释掉,后面再debug找原因 diff --git a/packages/mitmproxy/test/proxyTest.js b/packages/mitmproxy/test/proxyTest.js deleted file mode 100644 index 9f3fdbb875..0000000000 --- a/packages/mitmproxy/test/proxyTest.js +++ /dev/null @@ -1,22 +0,0 @@ -// const http = require('node:http') -// -// const options = { -// headers: { -// 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', -// }, -// lookup (hostname, options, callback) { -// const ip = '106.52.191.148' -// console.log('lookup') -// callback(null, ip, 4) -// }, -// } -// -// const request = http.get('http://test.target/', options, (response) => { -// response.on('data', (data) => { -// process.stdout.write(data) -// }) -// }) -// -// request.on('error', (error) => { -// console.log(error) -// }) diff --git a/packages/mitmproxy/test/responseReplaceTest.js b/packages/mitmproxy/test/responseReplaceTest.js deleted file mode 100644 index 1b5152fadf..0000000000 --- a/packages/mitmproxy/test/responseReplaceTest.js +++ /dev/null @@ -1,48 +0,0 @@ -const assert = require('node:assert') -const responseReplace = require('../src/lib/interceptor/impl/res/responseReplace') - -const headers = {} -const res = { - setHeader: (key, value) => { - headers[key] = value - }, -} - -const proxyRes = { - rawHeaders: [ - 'Content-Type', 'application/json; charset=utf-8', - 'Content-Length', '2', - 'ETag', 'W/"2"', - 'Date', 'Thu, 01 Jan 1970 00:00:00 GMT', - 'Connection', 'keep-alive', - ], -} - -const newHeaders = { - 'Content-Type': 'application/json; charset=utf-8', - 'Content-Length': '3', - 'xxx': 1, - 'Date': '[remove]', - 'yyy': '[remove]', -} - -const result = responseReplace.replaceResponseHeaders(newHeaders, res, proxyRes) -console.log(proxyRes.rawHeaders) -console.log(headers) -console.log(result) - -assert.deepStrictEqual(proxyRes.rawHeaders, [ - 'Content-Type', 'application/json; charset=utf-8', - 'Content-Length', '3', - 'ETag', 'W/"2"', - 'Date', '', - 'Connection', 'keep-alive' -]) -assert.deepStrictEqual(headers, { - xxx: 1, -}) -assert.deepStrictEqual(result, { - 'content-length': '2', - 'date': 'Thu, 01 Jan 1970 00:00:00 GMT', - 'xxx': null, -}) diff --git a/packages/mitmproxy/test/sha256Test.js b/packages/mitmproxy/test/sha256Test.js deleted file mode 100644 index 739d44ac1f..0000000000 --- a/packages/mitmproxy/test/sha256Test.js +++ /dev/null @@ -1,10 +0,0 @@ -// 需要时,在 package.json 中添加以下依赖: -// "devDependencies": { -// "crypto-js": "^4.2.0" -// } - -// const CryptoJs = require('crypto-js') -// -// const ret = CryptoJs.SHA256('111111111111') -// console.log(ret.toString(CryptoJs.enc.Base64)) -// console.log(1 / 2) diff --git a/packages/mitmproxy/test/utilTest.js b/packages/mitmproxy/test/utilTest.js deleted file mode 100644 index 6c890b93c7..0000000000 --- a/packages/mitmproxy/test/utilTest.js +++ /dev/null @@ -1,50 +0,0 @@ -const assert = require('node:assert') -const util = require('../src/lib/proxy/common/util') - -let arr - -arr = util.parseHostnameAndPort('www.baidu.com') -console.log('arr1:', arr) -assert.strictEqual(arr.length === 1, true) // true -assert.strictEqual(arr[0] === 'www.baidu.com', true) // true - -arr = util.parseHostnameAndPort('www.baidu.com', 80) -console.log('arr2:', arr) -assert.strictEqual(arr.length === 2, true) // true -assert.strictEqual(arr[0] === 'www.baidu.com', true) // true -assert.strictEqual(arr[1] === 80, true) // true - -arr = util.parseHostnameAndPort('www.baidu.com:8080') -console.log('arr3:', arr) -assert.strictEqual(arr.length === 2, true) // true -assert.strictEqual(arr[0] === 'www.baidu.com', true) // true -assert.strictEqual(arr[1] === 8080, true) // true - -arr = util.parseHostnameAndPort('www.baidu.com:8080', 8080) -console.log('arr4:', arr) -assert.strictEqual(arr.length === 2, true) // true -assert.strictEqual(arr[0] === 'www.baidu.com', true) // true -assert.strictEqual(arr[1] === 8080, true) // true - -arr = util.parseHostnameAndPort('[2001:abcd::1]') -console.log('arr5:', arr) -assert.strictEqual(arr.length === 1, true) // true -assert.strictEqual(arr[0] === '[2001:abcd::1]', true) // ture - -arr = util.parseHostnameAndPort('[2001:abcd::1]', 80) -console.log('arr6:', arr) -assert.strictEqual(arr.length === 2, true) // true -assert.strictEqual(arr[0] === '[2001:abcd::1]', true) // ture -assert.strictEqual(arr[1] === 80, true) // ture - -arr = util.parseHostnameAndPort('[2001:abcd::1]:8080') -console.log('arr7:', arr) -assert.strictEqual(arr.length === 2, true) // true -assert.strictEqual(arr[0] === '[2001:abcd::1]', true) // true -assert.strictEqual(arr[1] === 8080, true) // ture - -arr = util.parseHostnameAndPort('[2001:abcd::1]:8080', 8080) -console.log('arr8:', arr) -assert.strictEqual(arr.length === 2, true) // true -assert.strictEqual(arr[0] === '[2001:abcd::1]', true) // true -assert.strictEqual(arr[1] === 8080, true) // ture diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 996411db7e..d86c3b47b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,15471 +7,1462 @@ settings: importers: .: - devDependencies: - '@antfu/eslint-config': - specifier: ^3.16.0 - version: 3.16.0(@typescript-eslint/utils@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.33)(eslint-import-resolver-node@0.3.9)(eslint-plugin-format@0.1.3(eslint@10.2.1(jiti@2.6.1)))(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) - eslint: - specifier: ^10.2.1 - version: 10.2.1(jiti@2.6.1) - eslint-plugin-format: - specifier: ^0.1.3 - version: 0.1.3(eslint@10.2.1(jiti@2.6.1)) - - packages/cli: - dependencies: - '@docmirror/dev-sidecar': - specifier: workspace:* - version: link:../core - '@docmirror/mitmproxy': - specifier: workspace:* - version: link:../mitmproxy - - packages/core: - dependencies: - '@starknt/sysproxy': - specifier: ^0.0.3 - version: 0.0.3 - '@vscode/sudo-prompt': - specifier: ^9.3.2 - version: 9.3.2 - fix-path: - specifier: ^3.0.0 - version: 3.0.0 - iconv-lite: - specifier: ^0.6.3 - version: 0.6.3 - lodash: - specifier: ^4.18.1 - version: 4.18.1 - log4js: - specifier: ^6.9.1 - version: 6.9.1 - node-powershell: - specifier: ^4.0.0 - version: 4.0.0 - request: - specifier: ^2.88.2 - version: 2.88.2 - spawn-sync: - specifier: ^2.0.0 - version: 2.0.0 - winreg: - specifier: ^1.2.5 - version: 1.2.5 - devDependencies: - chai: - specifier: ^4.5.0 - version: 4.5.0 - mocha: - specifier: ^8.4.0 - version: 8.4.0 - - packages/gui: dependencies: - '@docmirror/dev-sidecar': - specifier: workspace:* - version: link:../core - '@docmirror/mitmproxy': - specifier: workspace:* - version: link:../mitmproxy - '@starknt/shutdown-handler-napi': - specifier: ^0.0.3 - version: 0.0.3 - '@starknt/sysproxy': - specifier: ^0.0.3 - version: 0.0.3 - '@vscode/sudo-prompt': - specifier: ^9.3.2 - version: 9.3.2 - adm-zip: - specifier: ^0.5.17 - version: 0.5.17 - ant-design-vue: - specifier: ^4.2.6 - version: 4.2.6(vue@3.5.33(typescript@5.9.3)) - archiver: - specifier: ^7.0.1 - version: 7.0.1 - core-js: - specifier: ^3.49.0 - version: 3.49.0 - electron-baidu-tongji: - specifier: ^1.0.5 - version: 1.0.5 - electron-updater: - specifier: ^6.8.3 - version: 6.8.3 - json5: - specifier: ^2.2.3 - version: 2.2.3 - lodash: - specifier: ^4.18.1 - version: 4.18.1 - minimist: - specifier: ^1.2.8 - version: 1.2.8 - request-progress: - specifier: ^3.0.0 - version: 3.0.0 - sass: - specifier: ^1.99.0 - version: 1.99.0 - sass-loader: - specifier: ^16.0.7 - version: 16.0.7(sass@1.99.0)(webpack@5.106.2) - tiny-emitter: - specifier: ^2.1.0 - version: 2.1.0 + '@tailwindcss/vite': + specifier: ^4.3.0 + version: 4.3.0(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0)) + '@tauri-apps/api': + specifier: ^2 + version: 2.11.0 + '@tauri-apps/plugin-opener': + specifier: ^2 + version: 2.5.4 + tailwindcss: + specifier: ^4.3.0 + version: 4.3.0 vue: - specifier: ^3.5.33 - version: 3.5.33(typescript@5.9.3) - vue-router: - specifier: ^4.6.4 - version: 4.6.4(vue@3.5.33(typescript@5.9.3)) - vue3-json-editor: - specifier: ^1.1.5 - version: 1.1.5(typescript@5.9.3) + specifier: ^3.5.13 + version: 3.5.35(typescript@5.6.2) devDependencies: - '@babel/core': - specifier: ^7.29.0 - version: 7.29.0 - '@babel/plugin-syntax-jsx': - specifier: ^7.28.6 - version: 7.28.6(@babel/core@7.29.0) - '@vue/babel-helper-vue-jsx-merge-props': - specifier: ^1.4.0 - version: 1.4.0 - '@vue/babel-preset-jsx': - specifier: ^1.4.0 - version: 1.4.0(@babel/core@7.29.0)(vue@3.5.33(typescript@5.9.3)) - '@vue/cli-plugin-babel': - specifier: ^5.0.9 - version: 5.0.9(@vue/cli-service@5.0.9(@vue/compiler-sfc@3.5.33)(ejs@3.1.10)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.18.1)(sass-loader@16.0.7(sass@1.99.0)(webpack@5.106.2))(underscore@1.13.8)(vue-template-compiler@2.7.16)(vue@3.5.33(typescript@5.9.3))(webpack-sources@3.4.0))(core-js@3.49.0)(encoding@0.1.13)(vue@3.5.33(typescript@5.9.3)) - '@vue/cli-service': - specifier: ^5.0.9 - version: 5.0.9(@vue/compiler-sfc@3.5.33)(ejs@3.1.10)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.18.1)(sass-loader@16.0.7(sass@1.99.0)(webpack@5.106.2))(underscore@1.13.8)(vue-template-compiler@2.7.16)(vue@3.5.33(typescript@5.9.3))(webpack-sources@3.4.0) - concurrently: - specifier: ^8.2.2 - version: 8.2.2 - cross-env: - specifier: ^7.0.3 - version: 7.0.3 - electron: - specifier: ^41.3.0 - version: 41.3.0 - electron-builder: - specifier: ^26.8.1 - version: 26.8.1(electron-builder-squirrel-windows@25.1.8) - electron-icon-builder: - specifier: ^2.0.1 - version: 2.0.1 - json5-loader: - specifier: ^4.0.1 - version: 4.0.1(webpack@5.106.2) - path-browserify: - specifier: ^1.0.1 - version: 1.0.1 - wait-on: - specifier: ^7.2.0 - version: 7.2.0 - - packages/mitmproxy: - dependencies: - '@docmirror/dev-sidecar': - specifier: workspace:* - version: link:../core - agentkeepalive: - specifier: ^4.6.0 - version: 4.6.0 - axios: - specifier: ^1.15.0 - version: 1.15.0 - baidu-aip-sdk: - specifier: ^4.16.16 - version: 4.16.16 - dns-over-http: - specifier: ^0.2.0 - version: 0.2.0 - is-browser: - specifier: ^2.1.0 - version: 2.1.0 - json5: - specifier: ^2.2.3 - version: 2.2.3 - lodash: - specifier: ^4.18.1 - version: 4.18.1 - lru-cache: - specifier: ~11.2.7 - version: 11.2.7 - node-forge: - specifier: ^1.4.0 - version: 1.4.0 - stream-throttle: - specifier: ^0.1.3 - version: 0.1.3 - through2: - specifier: ^4.0.2 - version: 4.0.2 - tunnel-agent: - specifier: ^0.6.0 - version: 0.6.0 + '@tauri-apps/cli': + specifier: ^2 + version: 2.11.2 + '@vitejs/plugin-vue': + specifier: ^5.2.1 + version: 5.2.1(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0))(vue@3.5.35(typescript@5.6.2)) + typescript: + specifier: ~5.6.2 + version: 5.6.2 + vite: + specifier: ^6.0.3 + version: 6.4.3(jiti@2.7.0)(lightningcss@1.32.0) + vue-tsc: + specifier: ^2.1.10 + version: 2.1.10(typescript@5.6.2) packages: - 7zip-bin@5.2.0: - resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} - '@achrinza/node-ipc@9.2.10': - resolution: {integrity: sha512-rCkw57K82y1XA9KwBmuMrupFQr9VOS4Rn77vW2UD2j0+HjlP/npSON9COkUIfocd95B4wv5EpfWMr6lGD4lN3A==} - engines: {node: 8 || 9 || 10 || 11 || 12 || 13 || 14 || 15 || 16 || 17 || 18 || 19 || 20 || 21 || 22 || 23 || 24 || 25} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} - '@ant-design/colors@6.0.0': - resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true - '@ant-design/icons-svg@4.4.2': - resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} - '@ant-design/icons-vue@7.0.1': - resolution: {integrity: sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==} - peerDependencies: - vue: '>=3.0.3' + '@esbuild/aix-ppc64@0.25.0': + resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] - '@antfu/eslint-config@3.16.0': - resolution: {integrity: sha512-g6RAXUMeow9vexoOMYwCpByY2xSDpAD78q+rvQLvVpY6MFcxFD/zmdrZGYa/yt7LizK86m17kIYKOGLJ3L8P0w==} - hasBin: true - peerDependencies: - '@eslint-react/eslint-plugin': ^1.19.0 - '@prettier/plugin-xml': ^3.4.1 - '@unocss/eslint-plugin': '>=0.50.0' - astro-eslint-parser: ^1.0.2 - eslint: ^9.10.0 - eslint-plugin-astro: ^1.2.0 - eslint-plugin-format: '>=0.1.0' - eslint-plugin-react-hooks: ^5.0.0 - eslint-plugin-react-refresh: ^0.4.4 - eslint-plugin-solid: ^0.14.3 - eslint-plugin-svelte: '>=2.35.1' - prettier-plugin-astro: ^0.14.0 - prettier-plugin-slidev: ^1.0.5 - svelte-eslint-parser: '>=0.37.0' - peerDependenciesMeta: - '@eslint-react/eslint-plugin': - optional: true - '@prettier/plugin-xml': - optional: true - '@unocss/eslint-plugin': - optional: true - astro-eslint-parser: - optional: true - eslint-plugin-astro: - optional: true - eslint-plugin-format: - optional: true - eslint-plugin-react-hooks: - optional: true - eslint-plugin-react-refresh: - optional: true - eslint-plugin-solid: - optional: true - eslint-plugin-svelte: - optional: true - prettier-plugin-astro: - optional: true - prettier-plugin-slidev: - optional: true - svelte-eslint-parser: - optional: true + '@esbuild/android-arm64@0.25.0': + resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] - '@antfu/install-pkg@1.1.0': - resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + '@esbuild/android-arm@0.25.0': + resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] - '@antfu/utils@0.7.10': - resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + '@esbuild/android-x64@0.25.0': + resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} - engines: {node: '>=6.9.0'} + '@esbuild/darwin-arm64@0.25.0': + resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] - '@babel/compat-data@7.29.0': - resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} - engines: {node: '>=6.9.0'} + '@esbuild/darwin-x64@0.25.0': + resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} - engines: {node: '>=6.9.0'} + '@esbuild/freebsd-arm64@0.25.0': + resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] - '@babel/generator@7.29.1': - resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} - engines: {node: '>=6.9.0'} + '@esbuild/freebsd-x64@0.25.0': + resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} - engines: {node: '>=6.9.0'} + '@esbuild/linux-arm64@0.25.0': + resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} - engines: {node: '>=6.9.0'} + '@esbuild/linux-arm@0.25.0': + resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] - '@babel/helper-create-class-features-plugin@7.28.6': - resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/linux-ia32@0.25.0': + resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] - '@babel/helper-create-regexp-features-plugin@7.28.5': - resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/linux-loong64@0.25.0': + resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] - '@babel/helper-define-polyfill-provider@0.6.8': - resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@esbuild/linux-mips64el@0.25.0': + resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} + '@esbuild/linux-ppc64@0.25.0': + resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] - '@babel/helper-member-expression-to-functions@7.28.5': - resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} - engines: {node: '>=6.9.0'} + '@esbuild/linux-riscv64@0.25.0': + resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} - engines: {node: '>=6.9.0'} + '@esbuild/linux-s390x@0.25.0': + resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/linux-x64@0.25.0': + resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} - engines: {node: '>=6.9.0'} + '@esbuild/netbsd-arm64@0.25.0': + resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] - '@babel/helper-plugin-utils@7.28.6': - resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} - engines: {node: '>=6.9.0'} + '@esbuild/netbsd-x64@0.25.0': + resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] - '@babel/helper-remap-async-to-generator@7.27.1': - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/openbsd-arm64@0.25.0': + resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] - '@babel/helper-replace-supers@7.28.6': - resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/openbsd-x64@0.25.0': + resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} - engines: {node: '>=6.9.0'} + '@esbuild/sunos-x64@0.25.0': + resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} + '@esbuild/win32-arm64@0.25.0': + resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} - engines: {node: '>=6.9.0'} + '@esbuild/win32-ia32@0.25.0': + resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} + '@esbuild/win32-x64@0.25.0': + resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] - '@babel/helper-wrap-function@7.28.6': - resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} - engines: {node: '>=6.9.0'} + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} - '@babel/helpers@7.29.2': - resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} - engines: {node: '>=6.9.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': - resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 + '@rollup/rollup-android-arm-eabi@4.61.1': + resolution: {integrity: sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==} + cpu: [arm] + os: [android] - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6': - resolution: {integrity: sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@rollup/rollup-android-arm64@4.61.1': + resolution: {integrity: sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==} + cpu: [arm64] + os: [android] - '@babel/plugin-proposal-class-properties@7.18.6': - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-darwin-arm64@4.61.1': + resolution: {integrity: sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==} + cpu: [arm64] + os: [darwin] - '@babel/plugin-proposal-decorators@7.29.0': - resolution: {integrity: sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-darwin-x64@4.61.1': + resolution: {integrity: sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==} + cpu: [x64] + os: [darwin] - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-freebsd-arm64@4.61.1': + resolution: {integrity: sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==} + cpu: [arm64] + os: [freebsd] - '@babel/plugin-syntax-decorators@7.28.6': - resolution: {integrity: sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-freebsd-x64@4.61.1': + resolution: {integrity: sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==} + cpu: [x64] + os: [freebsd] - '@babel/plugin-syntax-dynamic-import@7.8.3': - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-linux-arm-gnueabihf@4.61.1': + resolution: {integrity: sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==} + cpu: [arm] + os: [linux] + libc: [glibc] - '@babel/plugin-syntax-import-assertions@7.28.6': - resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-linux-arm-musleabihf@4.61.1': + resolution: {integrity: sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==} + cpu: [arm] + os: [linux] + libc: [musl] - '@babel/plugin-syntax-import-attributes@7.28.6': - resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-linux-arm64-gnu@4.61.1': + resolution: {integrity: sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==} + cpu: [arm64] + os: [linux] + libc: [glibc] - '@babel/plugin-syntax-jsx@7.28.6': - resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-linux-arm64-musl@4.61.1': + resolution: {integrity: sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==} + cpu: [arm64] + os: [linux] + libc: [musl] - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@rollup/rollup-linux-loong64-gnu@4.61.1': + resolution: {integrity: sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==} + cpu: [loong64] + os: [linux] + libc: [glibc] - '@babel/plugin-transform-arrow-functions@7.27.1': - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-linux-loong64-musl@4.61.1': + resolution: {integrity: sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==} + cpu: [loong64] + os: [linux] + libc: [musl] - '@babel/plugin-transform-async-generator-functions@7.29.0': - resolution: {integrity: sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-linux-ppc64-gnu@4.61.1': + resolution: {integrity: sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==} + cpu: [ppc64] + os: [linux] + libc: [glibc] - '@babel/plugin-transform-async-to-generator@7.28.6': - resolution: {integrity: sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-linux-ppc64-musl@4.61.1': + resolution: {integrity: sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==} + cpu: [ppc64] + os: [linux] + libc: [musl] - '@babel/plugin-transform-block-scoped-functions@7.27.1': - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-linux-riscv64-gnu@4.61.1': + resolution: {integrity: sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==} + cpu: [riscv64] + os: [linux] + libc: [glibc] - '@babel/plugin-transform-block-scoping@7.28.6': - resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-linux-riscv64-musl@4.61.1': + resolution: {integrity: sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==} + cpu: [riscv64] + os: [linux] + libc: [musl] - '@babel/plugin-transform-class-properties@7.28.6': - resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-linux-s390x-gnu@4.61.1': + resolution: {integrity: sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==} + cpu: [s390x] + os: [linux] + libc: [glibc] - '@babel/plugin-transform-class-static-block@7.28.6': - resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 + '@rollup/rollup-linux-x64-gnu@4.61.1': + resolution: {integrity: sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==} + cpu: [x64] + os: [linux] + libc: [glibc] - '@babel/plugin-transform-classes@7.28.6': - resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-linux-x64-musl@4.61.1': + resolution: {integrity: sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==} + cpu: [x64] + os: [linux] + libc: [musl] - '@babel/plugin-transform-computed-properties@7.28.6': - resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-openbsd-x64@4.61.1': + resolution: {integrity: sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==} + cpu: [x64] + os: [openbsd] - '@babel/plugin-transform-destructuring@7.28.5': - resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-openharmony-arm64@4.61.1': + resolution: {integrity: sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==} + cpu: [arm64] + os: [openharmony] - '@babel/plugin-transform-dotall-regex@7.28.6': - resolution: {integrity: sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-win32-arm64-msvc@4.61.1': + resolution: {integrity: sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==} + cpu: [arm64] + os: [win32] - '@babel/plugin-transform-duplicate-keys@7.27.1': - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-win32-ia32-msvc@4.61.1': + resolution: {integrity: sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==} + cpu: [ia32] + os: [win32] - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0': - resolution: {integrity: sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@rollup/rollup-win32-x64-gnu@4.61.1': + resolution: {integrity: sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==} + cpu: [x64] + os: [win32] - '@babel/plugin-transform-dynamic-import@7.27.1': - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@rollup/rollup-win32-x64-msvc@4.61.1': + resolution: {integrity: sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==} + cpu: [x64] + os: [win32] - '@babel/plugin-transform-explicit-resource-management@7.28.6': - resolution: {integrity: sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} - '@babel/plugin-transform-exponentiation-operator@7.28.6': - resolution: {integrity: sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] - '@babel/plugin-transform-export-namespace-from@7.27.1': - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-for-of@7.27.1': - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-function-name@7.27.1': - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-json-strings@7.28.6': - resolution: {integrity: sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-literals@7.27.1': - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-logical-assignment-operators@7.28.6': - resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-member-expression-literals@7.27.1': - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-amd@7.27.1': - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-commonjs@7.28.6': - resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-systemjs@7.29.0': - resolution: {integrity: sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-umd@7.27.1': - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-named-capturing-groups-regex@7.29.0': - resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-new-target@7.27.1': - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-nullish-coalescing-operator@7.28.6': - resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-numeric-separator@7.28.6': - resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-rest-spread@7.28.6': - resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-super@7.27.1': - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-catch-binding@7.28.6': - resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-chaining@7.28.6': - resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-parameters@7.27.7': - resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-methods@7.28.6': - resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-property-in-object@7.28.6': - resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-property-literals@7.27.1': - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regenerator@7.29.0': - resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regexp-modifiers@7.28.6': - resolution: {integrity: sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-reserved-words@7.27.1': - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-runtime@7.29.0': - resolution: {integrity: sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-shorthand-properties@7.27.1': - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-spread@7.28.6': - resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-sticky-regex@7.27.1': - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-template-literals@7.27.1': - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typeof-symbol@7.27.1': - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-escapes@7.27.1': - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-property-regex@7.28.6': - resolution: {integrity: sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-regex@7.27.1': - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-sets-regex@7.28.6': - resolution: {integrity: sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/preset-env@7.29.2': - resolution: {integrity: sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} - engines: {node: '>=6.9.0'} - - '@clack/core@0.4.1': - resolution: {integrity: sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==} - - '@clack/prompts@0.9.1': - resolution: {integrity: sha512-JIpyaboYZeWYlyP0H+OoPPxd6nqueG/CmN6ixBiNFsIDHREevjIf0n0Ohh5gr5C8pEDknzgvz+pIJ8dMhzWIeg==} - - '@ctrl/tinycolor@3.6.1': - resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} - engines: {node: '>=10'} - - '@develar/schema-utils@2.6.5': - resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} - engines: {node: '>= 8.9.0'} - - '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - - '@dprint/formatter@0.3.0': - resolution: {integrity: sha512-N9fxCxbaBOrDkteSOzaCqwWjso5iAe+WJPsHC021JfHNj2ThInPNEF13ORDKta3llq5D1TlclODCvOvipH7bWQ==} - - '@dprint/markdown@0.17.8': - resolution: {integrity: sha512-ukHFOg+RpG284aPdIg7iPrCYmMs3Dqy43S1ejybnwlJoFiW02b+6Bbr5cfZKFRYNP3dKGM86BqHEnMzBOyLvvA==} - - '@dprint/toml@0.6.4': - resolution: {integrity: sha512-bZXIUjxr0LIuHWshZr/5mtUkOrnh0NKVZEF6ACojW5z7zkJu7s9sV2mMXm8XQDqN4cJzdHYUYzUyEGdfciaLJA==} - - '@electron/asar@3.4.1': - resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} - engines: {node: '>=10.12.0'} - hasBin: true - - '@electron/fuses@1.8.0': - resolution: {integrity: sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==} - hasBin: true - - '@electron/get@2.0.3': - resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} - engines: {node: '>=12'} - - '@electron/get@3.1.0': - resolution: {integrity: sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==} - engines: {node: '>=14'} - - '@electron/notarize@2.5.0': - resolution: {integrity: sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==} - engines: {node: '>= 10.0.0'} - - '@electron/osx-sign@1.3.1': - resolution: {integrity: sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==} - engines: {node: '>=12.0.0'} - hasBin: true - - '@electron/osx-sign@1.3.3': - resolution: {integrity: sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==} - engines: {node: '>=12.0.0'} - hasBin: true - - '@electron/rebuild@3.6.1': - resolution: {integrity: sha512-f6596ZHpEq/YskUd8emYvOUne89ij8mQgjYFA5ru25QwbrRO+t1SImofdDv7kKOuWCmVOuU5tvfkbgGxIl3E/w==} - engines: {node: '>=12.13.0'} - hasBin: true - - '@electron/rebuild@4.0.4': - resolution: {integrity: sha512-Rzc39XPdk/+/wBG8MfwAHohXflep0ITUfulb6Rgz3R0NeSB1noE+E9/M/cb8ftCAiyDD9PPhLuuWgE1GaInbKg==} - engines: {node: '>=22.12.0'} - hasBin: true - - '@electron/universal@2.0.1': - resolution: {integrity: sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==} - engines: {node: '>=16.4'} - - '@electron/universal@2.0.3': - resolution: {integrity: sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==} - engines: {node: '>=16.4'} - - '@emnapi/core@1.9.2': - resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} - - '@emnapi/runtime@1.9.2': - resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} - - '@emnapi/wasi-threads@1.2.1': - resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - - '@emotion/hash@0.9.2': - resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} - - '@emotion/unitless@0.8.1': - resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} - - '@es-joy/jsdoccomment@0.50.2': - resolution: {integrity: sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==} - engines: {node: '>=18'} - - '@eslint-community/eslint-plugin-eslint-comments@4.7.1': - resolution: {integrity: sha512-Ql2nJFwA8wUGpILYGOQaT1glPsmvEwE0d+a+l7AALLzQvInqdbXJdx7aSu0DpUX9dB1wMVBMhm99/++S3MdEtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/compat@1.4.1': - resolution: {integrity: sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.40 || 9 - peerDependenciesMeta: - eslint: - optional: true - - '@eslint/config-array@0.23.5': - resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/config-helpers@0.5.5': - resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/core@0.14.0': - resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.15.2': - resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@1.2.1': - resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/markdown@6.6.0': - resolution: {integrity: sha512-IsWPy2jU3gaQDlioDC4sT4I4kG1hX1OMWs/q2sWwJrPoMASHW/Z4SDw+6Aql6EsHejGbagYuJbFq9Zvx+Y1b1Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/object-schema@3.0.5': - resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/plugin-kit@0.3.5': - resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/plugin-kit@0.7.1': - resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@gar/promisify@1.1.3': - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - - '@hapi/hoek@9.3.0': - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - - '@hapi/topo@5.1.0': - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} - - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} - engines: {node: '>=18.18.0'} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@isaacs/fs-minipass@4.0.1': - resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} - engines: {node: '>=18.0.0'} - - '@jimp/bmp@0.16.13': - resolution: {integrity: sha512-9edAxu7N2FX7vzkdl5Jo1BbACfycUtBQX+XBMcHA2bk62P8R0otgkHg798frgAk/WxQIzwxqOH6wMiCwrlAzdQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/core@0.16.13': - resolution: {integrity: sha512-qXpA1tzTnlkTku9yqtuRtS/wVntvE6f3m3GNxdTdtmc+O+Wcg9Xo2ABPMh7Nc0AHbMKzwvwgB2JnjZmlmJEObg==} - - '@jimp/custom@0.16.13': - resolution: {integrity: sha512-LTATglVUPGkPf15zX1wTMlZ0+AU7cGEGF6ekVF1crA8eHUWsGjrYTB+Ht4E3HTrCok8weQG+K01rJndCp/l4XA==} - - '@jimp/gif@0.16.13': - resolution: {integrity: sha512-yFAMZGv3o+YcjXilMWWwS/bv1iSqykFahFMSO169uVMtfQVfa90kt4/kDwrXNR6Q9i6VHpFiGZMlF2UnHClBvg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/jpeg@0.16.13': - resolution: {integrity: sha512-BJHlDxzTlCqP2ThqP8J0eDrbBfod7npWCbJAcfkKqdQuFk0zBPaZ6KKaQKyKxmWJ87Z6ohANZoMKEbtvrwz1AA==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-blit@0.16.13': - resolution: {integrity: sha512-8Z1k96ZFxlhK2bgrY1JNWNwvaBeI/bciLM0yDOni2+aZwfIIiC7Y6PeWHTAvjHNjphz+XCt01WQmOYWCn0ML6g==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-blur@0.16.13': - resolution: {integrity: sha512-PvLrfa8vkej3qinlebyhLpksJgCF5aiysDMSVhOZqwH5nQLLtDE9WYbnsofGw4r0VVpyw3H/ANCIzYTyCtP9Cg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-circle@0.16.13': - resolution: {integrity: sha512-RNave7EFgZrb5V5EpdvJGAEHMnDAJuwv05hKscNfIYxf0kR3KhViBTDy+MoTnMlIvaKFULfwIgaZWzyhuINMzA==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-color@0.16.13': - resolution: {integrity: sha512-xW+9BtEvoIkkH/Wde9ql4nAFbYLkVINhpgAE7VcBUsuuB34WUbcBl/taOuUYQrPEFQJ4jfXiAJZ2H/rvKjCVnQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-contain@0.16.13': - resolution: {integrity: sha512-QayTXw4tXMwU6q6acNTQrTTFTXpNRBe+MgTGMDU0lk+23PjlFCO/9sacflelG8lsp7vNHhAxFeHptDMAksEYzg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-blit': '>=0.3.5' - '@jimp/plugin-resize': '>=0.3.5' - '@jimp/plugin-scale': '>=0.3.5' - - '@jimp/plugin-cover@0.16.13': - resolution: {integrity: sha512-BSsP71GTNaqWRcvkbWuIVH+zK7b3TSNebbhDkFK0fVaUTzHuKMS/mgY4hDZIEVt7Rf5FjadAYtsujHN9w0iSYA==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-crop': '>=0.3.5' - '@jimp/plugin-resize': '>=0.3.5' - '@jimp/plugin-scale': '>=0.3.5' - - '@jimp/plugin-crop@0.16.13': - resolution: {integrity: sha512-WEl2tPVYwzYL8OKme6Go2xqiWgKsgxlMwyHabdAU4tXaRwOCnOI7v4021gCcBb9zn/oWwguHuKHmK30Fw2Z/PA==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-displace@0.16.13': - resolution: {integrity: sha512-qt9WKq8vWrcjySa9DyQ0x/RBMHQeiVjdVSY1SJsMjssPUf0pS74qorcuAkGi89biN3YoGUgPkpqECnAWnYwgGA==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-dither@0.16.13': - resolution: {integrity: sha512-5/N3yJggbWQTlGZHQYJPmQXEwR52qaXjEzkp1yRBbtdaekXE3BG/suo0fqeoV/csf8ooI78sJzYmIrxNoWVtgQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-fisheye@0.16.13': - resolution: {integrity: sha512-2rZmTdFbT/cF9lEZIkXCYO0TsT114Q27AX5IAo0Sju6jVQbvIk1dFUTnwLDadTo8wkJlFzGqMQ24Cs8cHWOliA==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-flip@0.16.13': - resolution: {integrity: sha512-EmcgAA74FTc5u7Z+hUO/sRjWwfPPLuOQP5O64x5g4j0T12Bd29IgsYZxoutZo/rb3579+JNa/3wsSEmyVv1EpA==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-rotate': '>=0.3.5' - - '@jimp/plugin-gaussian@0.16.13': - resolution: {integrity: sha512-A1XKfGQD0iDdIiKqFYi8nZMv4dDVYdxbrmgR7y/CzUHhSYdcmoljLIIsZZM3Iks/Wa353W3vtvkWLuDbQbch1w==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-invert@0.16.13': - resolution: {integrity: sha512-xFMrIn7czEZbdbMzZWuaZFnlLGJDVJ82y5vlsKsXRTG2kcxRsMPXvZRWHV57nSs1YFsNqXSbrC8B98n0E32njQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-mask@0.16.13': - resolution: {integrity: sha512-wLRYKVBXql2GAYgt6FkTnCfE+q5NomM7Dlh0oIPGAoMBWDyTx0eYutRK6PlUrRK2yMHuroAJCglICTbxqGzowQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-normalize@0.16.13': - resolution: {integrity: sha512-3tfad0n9soRna4IfW9NzQdQ2Z3ijkmo21DREHbE6CGcMIxOSvfRdSvf1qQPApxjTSo8LTU4MCi/fidx/NZ0GqQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-print@0.16.13': - resolution: {integrity: sha512-0m6i3p01PGRkGAK9r53hDYrkyMq+tlhLOIbsSTmZyh6HLshUKlTB7eXskF5OpVd5ZUHoltlNc6R+ggvKIzxRFw==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-blit': '>=0.3.5' - - '@jimp/plugin-resize@0.16.13': - resolution: {integrity: sha512-qoqtN8LDknm3fJm9nuPygJv30O3vGhSBD2TxrsCnhtOsxKAqVPJtFVdGd/qVuZ8nqQANQmTlfqTiK9mVWQ7MiQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-rotate@0.16.13': - resolution: {integrity: sha512-Ev+Jjmj1nHYw897z9C3R9dYsPv7S2/nxdgfFb/h8hOwK0Ovd1k/+yYS46A0uj/JCKK0pQk8wOslYBkPwdnLorw==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-blit': '>=0.3.5' - '@jimp/plugin-crop': '>=0.3.5' - '@jimp/plugin-resize': '>=0.3.5' - - '@jimp/plugin-scale@0.16.13': - resolution: {integrity: sha512-05POQaEJVucjTiSGMoH68ZiELc7QqpIpuQlZ2JBbhCV+WCbPFUBcGSmE7w4Jd0E2GvCho/NoMODLwgcVGQA97A==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-resize': '>=0.3.5' - - '@jimp/plugin-shadow@0.16.13': - resolution: {integrity: sha512-nmu5VSZ9hsB1JchTKhnnCY+paRBnwzSyK5fhkhtQHHoFD5ArBQ/5wU8y6tCr7k/GQhhGq1OrixsECeMjPoc8Zw==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-blur': '>=0.3.5' - '@jimp/plugin-resize': '>=0.3.5' - - '@jimp/plugin-threshold@0.16.13': - resolution: {integrity: sha512-+3zArBH0OE3Rhjm4HyAokMsZlIq5gpQec33CncyoSwxtRBM2WAhUVmCUKuBo+Lr/2/4ISoY4BWpHKhMLDix6cA==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-color': '>=0.8.0' - '@jimp/plugin-resize': '>=0.8.0' - - '@jimp/plugins@0.16.13': - resolution: {integrity: sha512-CJLdqODEhEVs4MgWCxpWL5l95sCBlkuSLz65cxEm56X5akIsn4LOlwnKoSEZioYcZUBvHhCheH67AyPTudfnQQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/png@0.16.13': - resolution: {integrity: sha512-8cGqINvbWJf1G0Her9zbq9I80roEX0A+U45xFby3tDWfzn+Zz8XKDF1Nv9VUwVx0N3zpcG1RPs9hfheG4Cq2kg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/tiff@0.16.13': - resolution: {integrity: sha512-oJY8d9u95SwW00VPHuCNxPap6Q1+E/xM5QThb9Hu+P6EGuu6lIeLaNBMmFZyblwFbwrH+WBOZlvIzDhi4Dm/6Q==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/types@0.16.13': - resolution: {integrity: sha512-mC0yVNUobFDjoYLg4hoUwzMKgNlxynzwt3cDXzumGvRJ7Kb8qQGOWJQjQFo5OxmGExqzPphkirdbBF88RVLBCg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/utils@0.16.13': - resolution: {integrity: sha512-VyCpkZzFTHXtKgVO35iKN0sYR10psGpV6SkcSeV4oF7eSYlR8Bl6aQLCzVeFjvESF7mxTmIiI3/XrMobVrtxDA==} - - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.11': - resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - - '@leichtgewicht/ip-codec@2.0.5': - resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - - '@malept/cross-spawn-promise@2.0.0': - resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==} - engines: {node: '>= 12.13.0'} - - '@malept/flatpak-bundler@0.4.0': - resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} - engines: {node: '>= 10.0.0'} - - '@napi-rs/wasm-runtime@0.2.12': - resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - - '@node-ipc/js-queue@2.0.3': - resolution: {integrity: sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==} - engines: {node: '>=1.0.0'} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@npmcli/fs@2.1.2': - resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - '@npmcli/move-file@2.0.1': - resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This functionality has been moved to @npmcli/fs - - '@package-json/types@0.0.12': - resolution: {integrity: sha512-uu43FGU34B5VM9mCNjXCwLaGHYjXdNincqKLaraaCW+7S2+SmiBg1Nv8bPnmschrIfZmfKNY9f3fC376MRrObw==} - - '@parcel/watcher-android-arm64@2.5.6': - resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [android] - - '@parcel/watcher-darwin-arm64@2.5.6': - resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [darwin] - - '@parcel/watcher-darwin-x64@2.5.6': - resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [darwin] - - '@parcel/watcher-freebsd-x64@2.5.6': - resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [freebsd] - - '@parcel/watcher-linux-arm-glibc@2.5.6': - resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - libc: [glibc] - - '@parcel/watcher-linux-arm-musl@2.5.6': - resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - libc: [musl] - - '@parcel/watcher-linux-arm64-glibc@2.5.6': - resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@parcel/watcher-linux-arm64-musl@2.5.6': - resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@parcel/watcher-linux-x64-glibc@2.5.6': - resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@parcel/watcher-linux-x64-musl@2.5.6': - resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - libc: [musl] - - '@parcel/watcher-win32-arm64@2.5.6': - resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [win32] - - '@parcel/watcher-win32-ia32@2.5.6': - resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - - '@parcel/watcher-win32-x64@2.5.6': - resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [win32] - - '@parcel/watcher@2.5.6': - resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} - engines: {node: '>= 10.0.0'} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@pkgr/core@0.1.2': - resolution: {integrity: sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@pkgr/core@0.2.9': - resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@polka/url@1.0.0-next.29': - resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - - '@sideway/address@4.1.5': - resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} - - '@sideway/formula@3.0.1': - resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} - - '@sideway/pinpoint@2.0.0': - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - - '@simonwep/pickr@1.8.2': - resolution: {integrity: sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==} - - '@sindresorhus/is@4.6.0': - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - - '@soda/friendly-errors-webpack-plugin@1.8.1': - resolution: {integrity: sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==} - engines: {node: '>=8.0.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - - '@soda/get-current-script@1.0.2': - resolution: {integrity: sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==} - - '@starknt/shutdown-handler-napi-darwin-arm64@0.0.3': - resolution: {integrity: sha512-OHiUW6oFxdvk8/dDzbLQklopwMak+qMkjbBS0Ja990J0rozgl2viwnkZQQlsX6ptmGiloveqTUcIe95c6ZNkeQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@starknt/shutdown-handler-napi-linux-arm64-gnu@0.0.3': - resolution: {integrity: sha512-g0WOV52y34HzIUnSl9pCY4ahlaAfyLpyscHtKGl11y9TED/0JvB0QFfp5QeAzMhHMtOjZVf89UXr+mJ5MpQJvA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@starknt/shutdown-handler-napi-linux-x64-gnu@0.0.3': - resolution: {integrity: sha512-FouZPbEINGuYBNY4p/pAzLbH2PenL3XGxUIu788cjwiHNv8hTxTcIm8cjVpqpGOQUcXxJjedOHpeqLUROfehNw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@starknt/shutdown-handler-napi-win32-arm64-msvc@0.0.3': - resolution: {integrity: sha512-FaZrau5jTmD1FgEokL3QKVKbyO4hdloRf6eMJVJVrfnNbq/Go69Lv431pH0G/QrVd3OpCJmyKvWjc6LUm4zFLw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@starknt/shutdown-handler-napi-win32-ia32-msvc@0.0.3': - resolution: {integrity: sha512-QqzUKjXsUT5BM8o9CQzl7sYspARGsabZLaQlPVXi4b1w2xSjCI1NsNsTkjuLBacWZNGnA/OZoseMF1DZ+kERpA==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@starknt/shutdown-handler-napi-win32-x64-msvc@0.0.3': - resolution: {integrity: sha512-8OIiUGg75Apsqx2o40ng124UiSioauoYGuyMpIhRlt9V3KKjeS9TJAVUzbsaPnWN7kTmn7UDzFViDacY1Q94fQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@starknt/shutdown-handler-napi@0.0.3': - resolution: {integrity: sha512-Zx2zXJeM2rCUgdbHcMFfvpvwswIuXMU1qWhqGUD1+b7Fgqoz/MM57XjjZJqqktpAfrN876haJBxxaDWIqIMIsw==} - engines: {node: '>= 10'} - - '@starknt/sysproxy-darwin-x64@0.0.3': - resolution: {integrity: sha512-gXN1hqmyPY3/Y5iCAoN36rxszW0On9AJjmo+4REuct/boUh+yc8A+JjjcpNkcvGPWQED8TVQ6WjCNj36nXAHZA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@starknt/sysproxy-linux-x64-gnu@0.0.3': - resolution: {integrity: sha512-HEWO00qfaakgHRkr6pg2bvJwk7aKPcxndTFEijX61qym+WIzepbUOQSQ1HGcYKsxmqJ3dDXT+cTLWshWdnQ5JA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@starknt/sysproxy-win32-x64-msvc@0.0.3': - resolution: {integrity: sha512-Lw6zsaZhxQWYsOss4Kgi0rt3Cj+jUn7DqNAVunCD+w3or/FUrGfrGkO+6UyqlVl5l4LaOi4cV3dtdJY91IbWug==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@starknt/sysproxy@0.0.3': - resolution: {integrity: sha512-tFPqJEo7JWlDI07OGBn/q6+nhxVw/dvNkvb/wLJO6YFN6itWt9mThJE3SXXeogK3HCo5eBk0OnE0n9tZdoKcHQ==} - engines: {node: '>= 10'} - - '@stylistic/eslint-plugin@2.13.0': - resolution: {integrity: sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.40.0' - - '@szmarczak/http-timer@4.0.6': - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} - - '@tokenizer/token@0.3.0': - resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} - - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} - - '@types/body-parser@1.19.6': - resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} - - '@types/bonjour@3.5.13': - resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} - - '@types/cacheable-request@6.0.3': - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - - '@types/connect-history-api-fallback@1.5.4': - resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/debug@4.1.13': - resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} - - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - - '@types/esrecurse@4.3.1': - resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - - '@types/express-serve-static-core@4.19.8': - resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==} - - '@types/express-serve-static-core@5.1.1': - resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==} - - '@types/express@4.17.25': - resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} - - '@types/fs-extra@9.0.13': - resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} - - '@types/html-minifier-terser@6.1.0': - resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} - - '@types/http-cache-semantics@4.2.0': - resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} - - '@types/http-errors@2.0.5': - resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - - '@types/http-proxy@1.17.17': - resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/keyv@3.1.4': - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - - '@types/node-forge@1.3.14': - resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} - - '@types/node@16.9.1': - resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==} - - '@types/node@24.12.2': - resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} - - '@types/node@25.6.0': - resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} - - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - - '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - - '@types/plist@3.0.5': - resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} - - '@types/qs@6.15.0': - resolution: {integrity: sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/responselike@1.0.3': - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - - '@types/retry@0.12.0': - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - - '@types/send@0.17.6': - resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} - - '@types/send@1.2.1': - resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} - - '@types/serve-index@1.9.4': - resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} - - '@types/serve-static@1.15.10': - resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} - - '@types/sockjs@0.3.36': - resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} - - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - - '@types/verror@1.10.11': - resolution: {integrity: sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - - '@typescript-eslint/eslint-plugin@8.58.1': - resolution: {integrity: sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.58.1 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/parser@8.58.1': - resolution: {integrity: sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/project-service@8.58.1': - resolution: {integrity: sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/scope-manager@8.58.1': - resolution: {integrity: sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.58.1': - resolution: {integrity: sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/type-utils@8.58.1': - resolution: {integrity: sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/types@8.58.1': - resolution: {integrity: sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.58.1': - resolution: {integrity: sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/utils@8.58.1': - resolution: {integrity: sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/visitor-keys@8.58.1': - resolution: {integrity: sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - '@unrs/resolver-binding-android-arm-eabi@1.11.1': - resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} - cpu: [arm] - os: [android] - - '@unrs/resolver-binding-android-arm64@1.11.1': - resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} - cpu: [arm64] - os: [android] - - '@unrs/resolver-binding-darwin-arm64@1.11.1': - resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} - cpu: [arm64] - os: [darwin] - - '@unrs/resolver-binding-darwin-x64@1.11.1': - resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} - cpu: [x64] - os: [darwin] - - '@unrs/resolver-binding-freebsd-x64@1.11.1': - resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} - cpu: [x64] - os: [freebsd] - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': - resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': - resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': - resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': - resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': - resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} - cpu: [riscv64] - os: [linux] - libc: [musl] - - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': - resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': - resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@unrs/resolver-binding-linux-x64-musl@1.11.1': - resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} - cpu: [x64] - os: [linux] - libc: [musl] - - '@unrs/resolver-binding-wasm32-wasi@1.11.1': - resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} - cpu: [arm64] - os: [win32] - - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} - cpu: [ia32] - os: [win32] - - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} - cpu: [x64] - os: [win32] - - '@vitest/eslint-plugin@1.6.15': - resolution: {integrity: sha512-dTMjrdngmcB+DxomlKQ+SUubCTvd0m2hQQFpv5sx+GRodmeoxr2PVbphk57SVp250vpxphk9Ccwyv6fQ6+2gkA==} - engines: {node: '>=18'} - peerDependencies: - '@typescript-eslint/eslint-plugin': '*' - eslint: '>=8.57.0' - typescript: '>=5.0.0' - vitest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - typescript: - optional: true - vitest: - optional: true - - '@vscode/sudo-prompt@9.3.2': - resolution: {integrity: sha512-gcXoCN00METUNFeQOFJ+C9xUI0DKB+0EGMVg7wbVYRHBw2Eq3fKisDZOkRdOz3kqXRKOENMfShPOmypw1/8nOw==} - - '@vue/babel-helper-vue-jsx-merge-props@1.4.0': - resolution: {integrity: sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==} - - '@vue/babel-helper-vue-transform-on@1.5.0': - resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} - - '@vue/babel-plugin-jsx@1.5.0': - resolution: {integrity: sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - peerDependenciesMeta: - '@babel/core': - optional: true - - '@vue/babel-plugin-resolve-type@1.5.0': - resolution: {integrity: sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@vue/babel-plugin-transform-vue-jsx@1.4.0': - resolution: {integrity: sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@vue/babel-preset-app@5.0.9': - resolution: {integrity: sha512-0rKOF4s/AhaRMJLybxOCgXfwtYhO3pwDSL/q/W8wRs1LzmHAc77FyTXWlun6VyKiSKwSdtH7CvOiWqq+DfofdA==} - peerDependencies: - '@babel/core': '*' - core-js: ^3 - vue: ^2 || ^3.2.13 - peerDependenciesMeta: - core-js: - optional: true - vue: - optional: true - - '@vue/babel-preset-jsx@1.4.0': - resolution: {integrity: sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - vue: '*' - peerDependenciesMeta: - vue: - optional: true - - '@vue/babel-sugar-composition-api-inject-h@1.4.0': - resolution: {integrity: sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@vue/babel-sugar-composition-api-render-instance@1.4.0': - resolution: {integrity: sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@vue/babel-sugar-functional-vue@1.4.0': - resolution: {integrity: sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@vue/babel-sugar-inject-h@1.4.0': - resolution: {integrity: sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@vue/babel-sugar-v-model@1.4.0': - resolution: {integrity: sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@vue/babel-sugar-v-on@1.4.0': - resolution: {integrity: sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@vue/cli-overlay@5.0.9': - resolution: {integrity: sha512-aBdZWrYKxLuFz1FDsk/muFD7GycrsW73Gi11yRc7R2W7Bm8mDRc9HKAI790gdg4NV+chkDFmfkegjg5iMDEpAA==} - - '@vue/cli-plugin-babel@5.0.9': - resolution: {integrity: sha512-oDZt1Kfe4KGNtig3/3zFo2pIeDJij2uS0M6S+tAqQno4Zpla2D8Hk/AR5PrstUd/HmhHZYJoGyF78MOfj3SbWg==} - peerDependencies: - '@vue/cli-service': ^3.0.0 || ^4.0.0 || ^5.0.0-0 - - '@vue/cli-plugin-router@5.0.9': - resolution: {integrity: sha512-kopbO/8kIl5CAffwgptXEwV509i+M0FfwW4sSkgQ2RzpxOYBjQZvp+096mjZfFcWKSmryNP/ri/Mnu78vmhlhw==} - peerDependencies: - '@vue/cli-service': ^3.0.0 || ^4.0.0 || ^5.0.0-0 - - '@vue/cli-plugin-vuex@5.0.9': - resolution: {integrity: sha512-AQhgGNFVd4Pu2crvS0a+hRckgrJv07gzOASdbLd3I72wkT43dd01MLRp8IBRRsu92t3MXenW86AZUCbQBz3//A==} - peerDependencies: - '@vue/cli-service': ^3.0.0 || ^4.0.0 || ^5.0.0-0 - - '@vue/cli-service@5.0.9': - resolution: {integrity: sha512-yTX7GVyM19tEbd+y5/gA6MkVKA6K61nVYHYAivD61Hx6odVFmQsaC3/R3cWAHM1P5oVKCevBbumPljbT+tFG2w==} - engines: {node: ^12.0.0 || >= 14.0.0} - hasBin: true - peerDependencies: - cache-loader: '*' - less-loader: '*' - pug-plain-loader: '*' - raw-loader: '*' - sass-loader: '*' - stylus-loader: '*' - vue-template-compiler: ^2.0.0 - webpack-sources: '*' - peerDependenciesMeta: - cache-loader: - optional: true - less-loader: - optional: true - pug-plain-loader: - optional: true - raw-loader: - optional: true - sass-loader: - optional: true - stylus-loader: - optional: true - vue-template-compiler: - optional: true - webpack-sources: - optional: true - - '@vue/cli-shared-utils@5.0.9': - resolution: {integrity: sha512-lf4KykiG8j9KwvNVi7fKtASmHuLsxCcCsflVU2b2CHMRuR4weOIV3zuuCrjWKjk0APn/MHJhgCjJGzHMbTtd5w==} - - '@vue/compiler-core@3.5.33': - resolution: {integrity: sha512-3PZLQwFw4Za3TC8t0FvTy3wI16Kt+pmwcgNZca4Pj9iWL2E72a/gZlpBtAJvEdDMdCxdG/qq0C7PN0bsJuv0Rw==} - - '@vue/compiler-dom@3.5.33': - resolution: {integrity: sha512-PXq0yrfCLzzL07rbXO4awtXY1Z06LG2eu6Adg3RJFa/j3Cii217XxxLXG22N330gw7GmALCY0Z8RgXEviwgpjA==} - - '@vue/compiler-sfc@3.5.33': - resolution: {integrity: sha512-UTUvRO9cY+rROrx/pvN9P5Z7FgA6QGfokUCfhQE4EnmUj3rVnK+CHI0LsEO1pg+I7//iRYMUfcNcCPe7tg0CoA==} - - '@vue/compiler-ssr@3.5.33': - resolution: {integrity: sha512-IErjYdnj1qIupG5xxiVIYiiRvDhGWV4zuh/RCrwfYpuL+HWQzeU6lCk/nF9r7olWMnjKxCAkOctT2qFWFkzb1A==} - - '@vue/component-compiler-utils@3.3.0': - resolution: {integrity: sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==} - - '@vue/devtools-api@6.6.4': - resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} - - '@vue/reactivity@3.5.33': - resolution: {integrity: sha512-p8UfIqyIhb0rYGlSgSBV+lPhF2iUSBcRy7enhTmPqKWadHy9kcOFYF1AejYBP9P+avnd3OBbD49DU4pLWX/94A==} - - '@vue/runtime-core@3.5.33': - resolution: {integrity: sha512-UpFF45RI9//a7rvq7RdOQblb4tup7hHG9QsmIrxkFQLzQ7R8/iNQ5LE15NhLZ1/WcHMU2b47u6P33CPUelHyIQ==} - - '@vue/runtime-dom@3.5.33': - resolution: {integrity: sha512-IOxMsAOwquhfITgmOgaPYl7/j8gKUxUFoflRc+u4LxyD3+783xne8vNta1PONVCvCV9A0w7hkyEepINDqfO0tw==} - - '@vue/server-renderer@3.5.33': - resolution: {integrity: sha512-0xylq/8/h44lVG0pZFknv1XIdEgymq2E9n59uTWJBG+dIgiT0TMCSsxrN7nO16Z0MU0MPjFcguBbZV8Itk52Hw==} - peerDependencies: - vue: 3.5.33 - - '@vue/shared@3.5.33': - resolution: {integrity: sha512-5vR2QIlmaLG77Ygd4pMP6+SGQ5yox9VhtnbDWTy9DzMzdmeLxZ1QqxrywEZ9sa1AVubfIJyaCG3ytyWU81ufcQ==} - - '@vue/web-component-wrapper@1.3.0': - resolution: {integrity: sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==} - - '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - - '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - - '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - - '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - - '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - - '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - - '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - - '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - - '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - - '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - - '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - - '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - - '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - - '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - - '@xmldom/xmldom@0.8.13': - resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==} - engines: {node: '>=10.0.0'} - - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - - abbrev@4.0.0: - resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==} - engines: {node: ^20.17.0 || >=22.9.0} - - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - - accept@3.1.3: - resolution: {integrity: sha512-OgOEAidVEOKPup+Gv2+2wdH2AgVKI9LxsJ4hicdJ6cY0faUuZdZoi56kkXWlHp9qicN1nWQLmW5ZRGk+SBS5xg==} - deprecated: This module has moved and is now available at @hapi/accept. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues. - - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - - acorn-import-phases@1.0.4: - resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} - engines: {node: '>=10.13.0'} - peerDependencies: - acorn: ^8.14.0 - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn-walk@8.3.5: - resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} - engines: {node: '>=0.4.0'} - - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} - engines: {node: '>=0.4.0'} - hasBin: true - - address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} - - adm-zip@0.5.17: - resolution: {integrity: sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==} - engines: {node: '>=12.0'} - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - - ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} - - ajv@6.15.0: - resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - - ajv@8.18.0: - resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-escapes@3.2.0: - resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} - engines: {node: '>=4'} - - ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} - hasBin: true - - ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - - ansi-regex@3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - - ant-design-vue@4.2.6: - resolution: {integrity: sha512-t7eX13Yj3i9+i5g9lqFyYneoIb3OzTvQjq9Tts1i+eiOd3Eva/6GagxBSXM1fOCjqemIu0FYVE1ByZ/38epR3Q==} - engines: {node: '>=12.22.0'} - peerDependencies: - vue: '>=3.2.0' - - any-base@1.1.0: - resolution: {integrity: sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==} - - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - app-builder-bin@5.0.0-alpha.10: - resolution: {integrity: sha512-Ev4jj3D7Bo+O0GPD2NMvJl+PGiBAfS7pUGawntBNpCbxtpncfUixqFj9z9Jme7V7s3LBGqsWZZP54fxBX3JKJw==} - - app-builder-bin@5.0.0-alpha.12: - resolution: {integrity: sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==} - - app-builder-lib@25.1.8: - resolution: {integrity: sha512-pCqe7dfsQFBABC1jeKZXQWhGcCPF3rPCXDdfqVKjIeWBcXzyC1iOWZdfFhGl+S9MyE/k//DFmC6FzuGAUudNDg==} - engines: {node: '>=14.0.0'} - peerDependencies: - dmg-builder: 25.1.8 - electron-builder-squirrel-windows: 25.1.8 - - app-builder-lib@26.8.1: - resolution: {integrity: sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==} - engines: {node: '>=14.0.0'} - peerDependencies: - dmg-builder: 26.8.1 - electron-builder-squirrel-windows: 26.8.1 - - aproba@2.1.0: - resolution: {integrity: sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==} - - arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - - archiver-utils@2.1.0: - resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} - engines: {node: '>= 6'} - - archiver-utils@3.0.4: - resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} - engines: {node: '>= 10'} - - archiver-utils@5.0.2: - resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} - engines: {node: '>= 14'} - - archiver@5.3.2: - resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} - engines: {node: '>= 10'} - - archiver@7.0.1: - resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} - engines: {node: '>= 14'} - - are-docs-informative@0.0.2: - resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} - engines: {node: '>=14'} - - are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - args@5.0.3: - resolution: {integrity: sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA==} - engines: {node: '>= 6.0.0'} - - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - - array-tree-filter@2.1.0: - resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - - assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - - async-exit-hook@2.0.1: - resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} - engines: {node: '>=0.12.0'} - - async-validator@4.2.5: - resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} - - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - - autoprefixer@10.5.0: - resolution: {integrity: sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - - aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - - aws4@1.13.2: - resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - - axios@1.15.0: - resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==} - - b4a@1.8.0: - resolution: {integrity: sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==} - peerDependencies: - react-native-b4a: '*' - peerDependenciesMeta: - react-native-b4a: - optional: true - - babel-loader@8.4.1: - resolution: {integrity: sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==} - engines: {node: '>= 8.9'} - peerDependencies: - '@babel/core': ^7.0.0 - webpack: '>=2' - - babel-plugin-dynamic-import-node@2.3.3: - resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} - - babel-plugin-polyfill-corejs2@0.4.17: - resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-corejs3@0.13.0: - resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-corejs3@0.14.2: - resolution: {integrity: sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-regenerator@0.6.8: - resolution: {integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - baidu-aip-sdk@4.16.16: - resolution: {integrity: sha512-dXjeQrd/eJIXDzBXNKArZZyFxf2boUI+XKEqb7yLUwnNiHJT3xDmHz30Oobe1LxOFFsvdH5pm72+pzi6MbXgmw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - balanced-match@4.0.4: - resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} - engines: {node: 18 || 20 || >=22} - - bare-events@2.8.2: - resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} - peerDependencies: - bare-abort-controller: '*' - peerDependenciesMeta: - bare-abort-controller: - optional: true - - bare-fs@4.7.1: - resolution: {integrity: sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw==} - engines: {bare: '>=1.16.0'} - peerDependencies: - bare-buffer: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - - bare-os@3.9.0: - resolution: {integrity: sha512-JTjuZyNIDpw+GytMO4a6TK1VXdVKKJr6DRxEHasyuYyShV2deuiHJK/ahGZlebc+SG0/wJCB9XK8gprBGDFi/Q==} - engines: {bare: '>=1.14.0'} - - bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - - bare-stream@2.13.1: - resolution: {integrity: sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==} - peerDependencies: - bare-abort-controller: '*' - bare-buffer: '*' - bare-events: '*' - peerDependenciesMeta: - bare-abort-controller: - optional: true - bare-buffer: - optional: true - bare-events: - optional: true - - bare-url@2.4.2: - resolution: {integrity: sha512-/9a2j4ac6ckpmAHvod/ob7x439OAHst/drc2Clnq+reRYd/ovddwcF4LfoxHyNk5AuGBnPg+HqFjmE/Zpq6v0A==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - baseline-browser-mapping@2.10.21: - resolution: {integrity: sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==} - engines: {node: '>=6.0.0'} - hasBin: true - - batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - - big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - bluebird-lst@1.0.9: - resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} - - bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - - bmp-js@0.1.0: - resolution: {integrity: sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==} - - body-parser@1.20.4: - resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - bonjour-service@1.3.0: - resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} - - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - - boolean@3.2.0: - resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - boom@7.3.0: - resolution: {integrity: sha512-Swpoyi2t5+GhOEGw8rEsKvTxFLIDiiKoUc2gsoV6Lyr43LHBIzch3k2MvYUs8RTROrIkVJ3Al0TkaOGjnb+B6A==} - deprecated: This module has moved and is now available at @hapi/boom. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues. - - brace-expansion@1.1.14: - resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} - - brace-expansion@2.1.0: - resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} - - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} - engines: {node: 18 || 20 || >=22} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.0: - resolution: {integrity: sha512-7Rfk377tpSM9TWBEeHs0FlDZGoAIei2V/4MdZJoFMBFAK6BqLpxAIUepGRHGdPFgGsLb02PXovC4qddyHvQqTg==} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - browserslist@4.28.2: - resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - - buffer-crc32@1.0.0: - resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} - engines: {node: '>=8.0.0'} - - buffer-equal@0.0.1: - resolution: {integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==} - engines: {node: '>=0.4.0'} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - builder-util-runtime@9.2.10: - resolution: {integrity: sha512-6p/gfG1RJSQeIbz8TK5aPNkoztgY1q5TgmGFMAXcY8itsGW6Y2ld1ALsZ5UJn8rog7hKF3zHx5iQbNQ8uLcRlw==} - engines: {node: '>=12.0.0'} - - builder-util-runtime@9.5.1: - resolution: {integrity: sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==} - engines: {node: '>=12.0.0'} - - builder-util@25.1.7: - resolution: {integrity: sha512-7jPjzBwEGRbwNcep0gGNpLXG9P94VA3CPAZQCzxkFXiV2GMQKlziMbY//rXPI7WKfhsvGgFXjTcXdBEwgXw9ww==} - - builder-util@26.8.1: - resolution: {integrity: sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==} - - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - - cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bind@1.0.9: - resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - - camelcase@3.0.0: - resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} - engines: {node: '>=0.10.0'} - - camelcase@5.0.0: - resolution: {integrity: sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==} - engines: {node: '>=6'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - caniuse-api@3.0.0: - resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - - caniuse-lite@1.0.30001790: - resolution: {integrity: sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==} - - case-sensitive-paths-webpack-plugin@2.4.0: - resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} - engines: {node: '>=4'} - - caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - - centra@2.7.0: - resolution: {integrity: sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.1: - resolution: {integrity: sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==} - engines: {node: '>= 8.10.0'} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - - chownr@3.0.0: - resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} - engines: {node: '>=18'} - - chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} - - chromium-pickle-js@0.2.0: - resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} - - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - - ci-info@4.3.1: - resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} - engines: {node: '>=8'} - - ci-info@4.4.0: - resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} - engines: {node: '>=8'} - - clean-css@5.3.3: - resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} - engines: {node: '>= 10.0'} - - clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - - cli-cursor@2.1.0: - resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} - engines: {node: '>=4'} - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - - cli-highlight@2.1.11: - resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} - hasBin: true - - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - - cli-truncate@2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} - - clipboardy@2.3.0: - resolution: {integrity: sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==} - engines: {node: '>=8'} - - cliui@3.2.0: - resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - - clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - - code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - - colord@2.9.3: - resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} - - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - commander@2.11.0: - resolution: {integrity: sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - commander@5.1.0: - resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} - engines: {node: '>= 6'} - - commander@6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} - engines: {node: '>= 6'} - - commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - - comment-parser@1.4.1: - resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} - engines: {node: '>= 12.0.0'} - - comment-parser@1.4.6: - resolution: {integrity: sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg==} - engines: {node: '>= 12.0.0'} - - commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - - compare-version@0.1.2: - resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} - engines: {node: '>=0.10.0'} - - component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - - compress-commons@4.1.2: - resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} - engines: {node: '>= 10'} - - compress-commons@6.0.2: - resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} - engines: {node: '>= 14'} - - compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - - compression@1.8.1: - resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} - engines: {node: '>= 0.8.0'} - - compute-scroll-into-view@1.0.20: - resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} - - concurrently@8.2.2: - resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} - engines: {node: ^14.13.0 || >=16.0.0} - hasBin: true - - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - - confbox@0.2.4: - resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} - - config-file-ts@0.2.8-rc1: - resolution: {integrity: sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==} - - connect-history-api-fallback@2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} - - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - - consolidate@0.15.1: - resolution: {integrity: sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==} - engines: {node: '>= 0.10.0'} - deprecated: Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog - peerDependencies: - arc-templates: ^0.5.3 - atpl: '>=0.7.6' - babel-core: ^6.26.3 - bracket-template: ^1.1.5 - coffee-script: ^1.12.7 - dot: ^1.1.3 - dust: ^0.3.0 - dustjs-helpers: ^1.7.4 - dustjs-linkedin: ^2.7.5 - eco: ^1.1.0-rc-3 - ect: ^0.5.9 - ejs: ^3.1.5 - haml-coffee: ^1.14.1 - hamlet: ^0.3.3 - hamljs: ^0.6.2 - handlebars: ^4.7.6 - hogan.js: ^3.0.2 - htmling: ^0.0.8 - jade: ^1.11.0 - jazz: ^0.0.18 - jqtpl: ~1.1.0 - just: ^0.1.8 - liquid-node: ^3.0.1 - liquor: ^0.0.5 - lodash: ^4.17.20 - marko: ^3.14.4 - mote: ^0.2.0 - mustache: ^3.0.0 - nunjucks: ^3.2.2 - plates: ~0.4.11 - pug: ^3.0.0 - qejs: ^3.0.5 - ractive: ^1.3.12 - razor-tmpl: ^1.3.1 - react: ^16.13.1 - react-dom: ^16.13.1 - slm: ^2.0.0 - squirrelly: ^5.1.0 - swig: ^1.4.2 - swig-templates: ^2.0.3 - teacup: ^2.0.0 - templayed: '>=0.2.3' - then-jade: '*' - then-pug: '*' - tinyliquid: ^0.2.34 - toffee: ^0.3.6 - twig: ^1.15.2 - twing: ^5.0.2 - underscore: ^1.11.0 - vash: ^0.13.0 - velocityjs: ^2.0.1 - walrus: ^0.10.1 - whiskers: ^0.4.0 - peerDependenciesMeta: - arc-templates: - optional: true - atpl: - optional: true - babel-core: - optional: true - bracket-template: - optional: true - coffee-script: - optional: true - dot: - optional: true - dust: - optional: true - dustjs-helpers: - optional: true - dustjs-linkedin: - optional: true - eco: - optional: true - ect: - optional: true - ejs: - optional: true - haml-coffee: - optional: true - hamlet: - optional: true - hamljs: - optional: true - handlebars: - optional: true - hogan.js: - optional: true - htmling: - optional: true - jade: - optional: true - jazz: - optional: true - jqtpl: - optional: true - just: - optional: true - liquid-node: - optional: true - liquor: - optional: true - lodash: - optional: true - marko: - optional: true - mote: - optional: true - mustache: - optional: true - nunjucks: - optional: true - plates: - optional: true - pug: - optional: true - qejs: - optional: true - ractive: - optional: true - razor-tmpl: - optional: true - react: - optional: true - react-dom: - optional: true - slm: - optional: true - squirrelly: - optional: true - swig: - optional: true - swig-templates: - optional: true - teacup: - optional: true - templayed: - optional: true - then-jade: - optional: true - then-pug: - optional: true - tinyliquid: - optional: true - toffee: - optional: true - twig: - optional: true - twing: - optional: true - underscore: - optional: true - vash: - optional: true - velocityjs: - optional: true - walrus: - optional: true - whiskers: - optional: true - - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - cookie-signature@1.0.7: - resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - cookiejar@2.1.4: - resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} - - copy-webpack-plugin@9.1.0: - resolution: {integrity: sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.1.0 - - core-js-compat@3.49.0: - resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} - - core-js@3.49.0: - resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} - - core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - cors@2.8.6: - resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} - engines: {node: '>= 0.10'} - - cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} - - crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - - crc32-stream@4.0.3: - resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} - engines: {node: '>= 10'} - - crc32-stream@6.0.0: - resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} - engines: {node: '>= 14'} - - crc@3.8.0: - resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} - - cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true - - cross-spawn@4.0.2: - resolution: {integrity: sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==} - - cross-spawn@6.0.6: - resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} - engines: {node: '>=4.8'} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - css-declaration-sorter@6.4.1: - resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} - engines: {node: ^10 || ^12 || >=14} - peerDependencies: - postcss: ^8.0.9 - - css-loader@6.11.0: - resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} - engines: {node: '>= 12.13.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.0.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true - - css-minimizer-webpack-plugin@3.4.1: - resolution: {integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==} - engines: {node: '>= 12.13.0'} - peerDependencies: - '@parcel/css': '*' - clean-css: '*' - csso: '*' - esbuild: '*' - webpack: ^5.0.0 - peerDependenciesMeta: - '@parcel/css': - optional: true - clean-css: - optional: true - csso: - optional: true - esbuild: - optional: true - - css-select@4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} - - css-tree@1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} - - css-what@6.2.2: - resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} - engines: {node: '>= 6'} - - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - - cssnano-preset-default@5.2.14: - resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - cssnano-utils@3.1.0: - resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - cssnano@5.1.15: - resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - csso@4.2.0: - resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} - engines: {node: '>=8.0.0'} - - csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - - dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} - - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - - date-format@4.0.14: - resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} - engines: {node: '>=4.0'} - - dayjs@1.11.20: - resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} - - de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - - debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@3.1.0: - resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.1: - resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - decode-named-character-reference@1.3.0: - resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} - - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - deepmerge@1.5.2: - resolution: {integrity: sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==} - engines: {node: '>=0.10.0'} - - default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} - - default-shell@1.0.1: - resolution: {integrity: sha512-/Os8tTMPSriNHCsVj3VLjMZblIl1sIg8EXz3qg7C5K+y9calfTA/qzlfPvCQ+LEgLWmtZ9wCnzE1w+S6TPPFyQ==} - engines: {node: '>=4'} - - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - - defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - del@6.1.1: - resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} - engines: {node: '>=10'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - - depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - - detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - - diff-sequences@27.5.1: - resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - - diff@3.3.1: - resolution: {integrity: sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - dir-compare@4.2.0: - resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - dmg-builder@26.8.1: - resolution: {integrity: sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg==} - - dmg-license@1.0.11: - resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} - engines: {node: '>=8'} - os: [darwin] - hasBin: true - - dns-over-http@0.2.0: - resolution: {integrity: sha512-K+SyN2L3ljxJ2MFtOv/vRS+3/YEMLvOuH7MrmO5ejaubi4w02/DLqzoK1kBGKlQrT9ND57pbapeDf+ue8AElEA==} - - dns-packet@4.2.0: - resolution: {integrity: sha512-bn1AKpfkFbm0MIioOMHZ5qJzl2uypdBwI4nYNsqvhjsegBhcKJUlCrMPWLx6JEezRjxZmxhtIz/FkBEur2l8Cw==} - engines: {node: '>=4'} - - dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} - engines: {node: '>=6'} - - dns-socket@3.0.0: - resolution: {integrity: sha512-M0WkByoJ/mTm+HtwBQLsRJPe5uGIC/lYVOp+s6ZzhbZ5iq4GxjFyxYPQhB85dgCLvVb43aJQXHDC9aUgyKGc/Q==} - engines: {node: '>=4'} - - dom-align@1.12.4: - resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} - - dom-converter@0.2.0: - resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} - - dom-scroll-into-view@2.0.1: - resolution: {integrity: sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==} - - dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - - dom-walk@0.1.2: - resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} - - domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - - dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - - dotenv-expand@11.0.7: - resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} - engines: {node: '>=12'} - - dotenv-expand@5.1.0: - resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} - - dotenv@10.0.0: - resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} - engines: {node: '>=10'} - - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} - engines: {node: '>=12'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - easy-stack@1.0.1: - resolution: {integrity: sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==} - engines: {node: '>=6.0.0'} - - ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true - - electron-baidu-tongji@1.0.5: - resolution: {integrity: sha512-HGBNnJHvDYAIlGlo3ql+3y+XRXldLvG6jSE+ZNLRBHbL2KHySLgI/xDbrCITlRtlqw8pX4xEcTjUube16kWP3g==} - - electron-builder-squirrel-windows@25.1.8: - resolution: {integrity: sha512-2ntkJ+9+0GFP6nAISiMabKt6eqBB0kX1QqHNWFWAXgi0VULKGisM46luRFpIBiU3u/TDmhZMM8tzvo2Abn3ayg==} - - electron-builder@26.8.1: - resolution: {integrity: sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw==} - engines: {node: '>=14.0.0'} - hasBin: true - - electron-icon-builder@2.0.1: - resolution: {integrity: sha512-rg9BxW2kJi3TXsMFFNXWXrwQEd5dzXmeD+w7Pj3k3z7aYRePLxE89qU4lvL/rK1X/NTY5KDn3+Dbgm1TU2dGXQ==} - engines: {node: '>= 10.0.0'} - hasBin: true - - electron-publish@25.1.7: - resolution: {integrity: sha512-+jbTkR9m39eDBMP4gfbqglDd6UvBC7RLh5Y0MhFSsc6UkGHj9Vj9TWobxevHYMMqmoujL11ZLjfPpMX+Pt6YEg==} - - electron-publish@26.8.1: - resolution: {integrity: sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==} - - electron-to-chromium@1.5.344: - resolution: {integrity: sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==} - - electron-updater@6.8.3: - resolution: {integrity: sha512-Z6sgw3jgbikWKXei1ENdqFOxBP0WlXg3TtKfz0rgw2vIZFJUyI4pD7ZN7jrkm7EoMK+tcm/qTnPUdqfZukBlBQ==} - - electron@41.3.0: - resolution: {integrity: sha512-2Q5aeocmFdeheZGDUTrAvSR3t+n0c3d104AJWWEnt7syJU0tE4VdibMYaPtQ47QuXSoUf0/xSsfUUvu/uSXIfg==} - engines: {node: '>= 12.20.55'} - hasBin: true - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - - enhanced-resolve@5.20.1: - resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} - engines: {node: '>=10.13.0'} - - enhanced-resolve@5.21.0: - resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==} - engines: {node: '>=10.13.0'} - - entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - - entities@7.0.1: - resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} - engines: {node: '>=0.12'} - - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - - err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - - error-ex@1.3.4: - resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - - error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-module-lexer@2.0.0: - resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - - eslint-compat-utils@0.5.1: - resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' - - eslint-compat-utils@0.6.5: - resolution: {integrity: sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' - - eslint-config-flat-gitignore@1.0.1: - resolution: {integrity: sha512-wjBmJ8TAb67G2or/gBp/H62uCIkDCjpCmlGPSG41/7QagUjMgh+iegVB3gY8eNYhTAmecjKtclT4wGAjHz5yWA==} - peerDependencies: - eslint: ^9.5.0 - - eslint-flat-config-utils@1.1.0: - resolution: {integrity: sha512-W49wz7yQJGRfg4QSV3nwdO/fYcWetiSKhLV5YykfQMcqnIATNpoS7EPdINhLB9P3fmdjNmFtOgZjiKnCndWAnw==} - - eslint-formatting-reporter@0.0.0: - resolution: {integrity: sha512-k9RdyTqxqN/wNYVaTk/ds5B5rA8lgoAmvceYN7bcZMBwU7TuXx5ntewJv81eF3pIL/CiJE+pJZm36llG8yhyyw==} - peerDependencies: - eslint: '>=8.40.0' - - eslint-import-context@0.1.9: - resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - peerDependencies: - unrs-resolver: ^1.0.0 - peerDependenciesMeta: - unrs-resolver: - optional: true - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-json-compat-utils@0.2.3: - resolution: {integrity: sha512-RbBmDFyu7FqnjE8F0ZxPNzx5UaptdeS9Uu50r7A+D7s/+FCX+ybiyViYEgFUaFIFqSWJgZRTpL5d8Kanxxl2lQ==} - engines: {node: '>=12'} - peerDependencies: - '@eslint/json': '*' - eslint: '*' - jsonc-eslint-parser: ^2.4.0 || ^3.0.0 - peerDependenciesMeta: - '@eslint/json': - optional: true - - eslint-merge-processors@1.0.0: - resolution: {integrity: sha512-4GybyHmhXtT7/W8RAouQzNM0791sYasJCTYHIAYjuiJvbNFY0jMKkoESREhX+mjX37dxiN6v4EqhZ1nc0tJF7A==} - peerDependencies: - eslint: '*' - - eslint-parser-plain@0.1.1: - resolution: {integrity: sha512-KRgd6wuxH4U8kczqPp+Oyk4irThIhHWxgFgLDtpgjUGVIS3wGrJntvZW/p6hHq1T4FOwnOtCNkvAI4Kr+mQ/Hw==} - - eslint-plugin-antfu@2.7.0: - resolution: {integrity: sha512-gZM3jq3ouqaoHmUNszb1Zo2Ux7RckSvkGksjLWz9ipBYGSv1EwwBETN6AdiUXn+RpVHXTbEMPAPlXJazcA6+iA==} - peerDependencies: - eslint: '*' - - eslint-plugin-command@2.1.0: - resolution: {integrity: sha512-S3gvDSCRHLdRG7NYaevLvGA0g/txOju7NEB2di7SE80NtbCwsvpi/fft045YuTZpOzqCRUfuye39raldmpXXYQ==} - peerDependencies: - eslint: '*' - - eslint-plugin-es-x@7.8.0: - resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8' - - eslint-plugin-format@0.1.3: - resolution: {integrity: sha512-vTmshuv1iMfmcM1HADnyhae5MBBGlJZBZyZ+ybtXCEzRe3nRhUvLX+6rAvsEfcdK6a2pqpLs/F530dXKvfQqYQ==} - peerDependencies: - eslint: ^8.40.0 || ^9.0.0 - - eslint-plugin-import-x@4.16.2: - resolution: {integrity: sha512-rM9K8UBHcWKpzQzStn1YRN2T5NvdeIfSVoKu/lKF41znQXHAUcBbYXe5wd6GNjZjTrP7viQ49n1D83x/2gYgIw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/utils': ^8.56.0 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - eslint-import-resolver-node: '*' - peerDependenciesMeta: - '@typescript-eslint/utils': - optional: true - eslint-import-resolver-node: - optional: true - - eslint-plugin-jsdoc@50.8.0: - resolution: {integrity: sha512-UyGb5755LMFWPrZTEqqvTJ3urLz1iqj+bYOHFNag+sw3NvaMWP9K2z+uIn37XfNALmQLQyrBlJ5mkiVPL7ADEg==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - - eslint-plugin-jsonc@2.21.1: - resolution: {integrity: sha512-dbNR5iEnQeORwsK2WZzr3QaMtFCY3kKJVMRHPzUpKzMhmVy2zIpVgFDpX8MNoIdoqz6KCpCfOJavhfiSbZbN+w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' - - eslint-plugin-n@17.24.0: - resolution: {integrity: sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.23.0' - - eslint-plugin-no-only-tests@3.3.0: - resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==} - engines: {node: '>=5.0.0'} - - eslint-plugin-perfectionist@4.15.1: - resolution: {integrity: sha512-MHF0cBoOG0XyBf7G0EAFCuJJu4I18wy0zAoT1OHfx2o6EOx1EFTIzr2HGeuZa1kDcusoX0xJ9V7oZmaeFd773Q==} - engines: {node: ^18.0.0 || >=20.0.0} - peerDependencies: - eslint: '>=8.45.0' - - eslint-plugin-regexp@2.10.0: - resolution: {integrity: sha512-ovzQT8ESVn5oOe5a7gIDPD5v9bCSjIFJu57sVPDqgPRXicQzOnYfFN21WoQBQF18vrhT5o7UMKFwJQVVjyJ0ng==} - engines: {node: ^18 || >=20} - peerDependencies: - eslint: '>=8.44.0' - - eslint-plugin-toml@0.12.0: - resolution: {integrity: sha512-+/wVObA9DVhwZB1nG83D2OAQRrcQZXy+drqUnFJKymqnmbnbfg/UPmEMCKrJNcEboUGxUjYrJlgy+/Y930mURQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' - - eslint-plugin-unicorn@56.0.1: - resolution: {integrity: sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==} - engines: {node: '>=18.18'} - peerDependencies: - eslint: '>=8.56.0' - - eslint-plugin-unused-imports@4.4.1: - resolution: {integrity: sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 - eslint: ^10.0.0 || ^9.0.0 || ^8.0.0 - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - - eslint-plugin-vue@9.33.0: - resolution: {integrity: sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - - eslint-plugin-yml@1.19.1: - resolution: {integrity: sha512-bYkOxyEiXh9WxUhVYPELdSHxGG5pOjCSeJOVkfdIyj6tuiHDxrES2WAW1dBxn3iaZQey57XflwLtCYRcNPOiOg==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' - - eslint-processor-vue-blocks@1.0.0: - resolution: {integrity: sha512-q+Wn9bCml65NwYtuINVCE5dUqZa/uVoY4jfc8qEDwWbcGqdRyfJJmAONNZsreA4Q9EJqjYGjk8Hk1QuwAktgkw==} - peerDependencies: - '@vue/compiler-sfc': ^3.3.0 - eslint: ^8.50.0 || ^9.0.0 - - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-scope@9.1.2: - resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint-visitor-keys@5.0.1: - resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - eslint@10.2.1: - resolution: {integrity: sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - - espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - espree@11.2.0: - resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esquery@1.7.0: - resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - event-pubsub@4.3.0: - resolution: {integrity: sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==} - engines: {node: '>=4.0.0'} - - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - events-universal@1.0.1: - resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - execa@0.5.1: - resolution: {integrity: sha512-R66dW/hW3I8yV77Wg4xn6zMguRPUgt59VLm5e85NrOF05ZdPn7YOfPBSw0E9epJDvuzwVWEG+HmEaQ4muYuWKQ==} - engines: {node: '>=4'} - - execa@1.0.0: - resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} - engines: {node: '>=6'} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - exif-parser@0.1.12: - resolution: {integrity: sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==} - - exponential-backoff@3.1.3: - resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} - - express@4.22.1: - resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} - engines: {node: '>= 0.10.0'} - - exsolve@1.0.8: - resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} - - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - extract-zip@1.7.0: - resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} - hasBin: true - - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - - extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - - extsprintf@1.4.1: - resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} - engines: {'0': node >=0.6.0} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - - fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - - fault@2.0.1: - resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} - - faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} - - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - figures@2.0.0: - resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} - engines: {node: '>=4'} - - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - - file-type@16.5.4: - resolution: {integrity: sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==} - engines: {node: '>=10'} - - file-url@2.0.2: - resolution: {integrity: sha512-x3989K8a1jM6vulMigE8VngH7C5nci0Ks5d9kVjUXmNF28gmiZUNujk5HjwaS8dAzN2QmUfX56riJKgN00dNRw==} - engines: {node: '>=4'} - - filelist@1.0.6: - resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - finalhandler@1.3.2: - resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} - engines: {node: '>= 0.8'} - - find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - - find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - fix-path@3.0.0: - resolution: {integrity: sha512-opGAl4+ip5jUikHR2C8Jo7czZ80pz8EK/0gMlAZu7xgDmBqIynlX8SMYg9KowYjAU6HT0nxsSJEWru0u+n+N2Q==} - engines: {node: '>=10'} - - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - - follow-redirects@1.16.0: - resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - - forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - - form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} - - form-data@3.0.4: - resolution: {integrity: sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==} - engines: {node: '>= 6'} - - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} - engines: {node: '>= 6'} - - format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - - formidable@1.2.6: - resolution: {integrity: sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==} - deprecated: 'Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau' - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fraction.js@5.3.4: - resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - - fs-extra@1.0.0: - resolution: {integrity: sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ==} - - fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - - fs-extra@11.3.4: - resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==} - engines: {node: '>=14.14'} - - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - - fs-monkey@1.1.0: - resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-caller-file@1.0.3: - resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - get-stream@2.3.1: - resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} - engines: {node: '>=0.10.0'} - - get-stream@4.1.0: - resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} - engines: {node: '>=6'} - - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-tsconfig@4.13.7: - resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} - - getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - - gifwrap@0.9.4: - resolution: {integrity: sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==} - - github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true - - glob@7.1.2: - resolution: {integrity: sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - - global-agent@3.0.0: - resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} - engines: {node: '>=10.0'} - - global@4.4.0: - resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globals@15.15.0: - resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} - engines: {node: '>=18'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - growl@1.10.3: - resolution: {integrity: sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==} - engines: {node: '>=4.x'} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - gzip-size@6.0.0: - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} - engines: {node: '>=10'} - - handle-thing@2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - - handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true - - har-schema@2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} - - har-validator@5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} - deprecated: this library is no longer supported - - has-flag@2.0.0: - resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} - engines: {node: '>=0.10.0'} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - - hash-sum@1.0.2: - resolution: {integrity: sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==} - - hash-sum@2.0.0: - resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} - - hasha@2.2.0: - resolution: {integrity: sha512-jZ38TU/EBiGKrmyTNNZgnvCZHNowiRI4+w/I9noMlekHTZH3KyGgvJLmhSgykeAQ9j2SYPDosM0Bg3wHfzibAQ==} - engines: {node: '>=0.10.0'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hasown@2.0.3: - resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} - engines: {node: '>= 0.4'} - - he@1.1.1: - resolution: {integrity: sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==} - hasBin: true - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - highlight.js@10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - - hoek@6.1.3: - resolution: {integrity: sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==} - deprecated: This module has moved and is now available at @hapi/hoek. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues. - - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - - hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - - hpack.js@2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} - - html-entities@2.6.0: - resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} - - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - - html-minifier-terser@6.1.0: - resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} - engines: {node: '>=12'} - hasBin: true - - html-tags@2.0.0: - resolution: {integrity: sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==} - engines: {node: '>=4'} - - html-webpack-plugin@5.6.7: - resolution: {integrity: sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==} - engines: {node: '>=10.13.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.20.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true - - htmlparser2@6.1.0: - resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} - - http-cache-semantics@4.2.0: - resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - - http-deceiver@1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - - http-errors@1.8.1: - resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} - engines: {node: '>= 0.6'} - - http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} - - http-parser-js@0.5.10: - resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} - - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - http-proxy-middleware@2.0.9: - resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/express': ^4.17.13 - peerDependenciesMeta: - '@types/express': - optional: true - - http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - - http-signature@1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} - - http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - icon-gen@2.1.0: - resolution: {integrity: sha512-rqIVvq9MJ8X7wnJW0NO8Eau/+5RWV7AH6L5vEt/U5Ajv5WefdDNDxGwJhGokyHuyBWeX7JqRMQ03tG0gAco4Eg==} - engines: {node: '>= 10'} - hasBin: true - - iconv-corefoundation@1.1.7: - resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} - engines: {node: ^8.11.2 || >=10} - os: [darwin] - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - icss-utils@5.1.0: - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} - - image-q@4.0.0: - resolution: {integrity: sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==} - - immutable@5.1.5: - resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} - - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - invert-kv@1.0.0: - resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} - engines: {node: '>=0.10.0'} - - ip-address@10.1.0: - resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} - engines: {node: '>= 12'} - - ip@1.1.9: - resolution: {integrity: sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - ipaddr.js@2.3.0: - resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} - engines: {node: '>= 10'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-browser@2.1.0: - resolution: {integrity: sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==} - - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - - is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true - - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-file-esm@1.0.0: - resolution: {integrity: sha512-rZlaNKb4Mr8WlRu2A9XdeoKgnO5aA53XdPHgCKVyCrQ/rWi89RET1+bq37Ru46obaQXeiX4vmFIm1vks41hoSA==} - - is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-function@1.0.2: - resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - - is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-path-cwd@2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - - is-plain-object@3.0.1: - resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} - engines: {node: '>=0.10.0'} - - is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - - isbinaryfile@4.0.10: - resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} - engines: {node: '>= 8.0.0'} - - isbinaryfile@5.0.7: - resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} - engines: {node: '>= 18.0.0'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isexe@3.1.5: - resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} - engines: {node: '>=18'} - - isexe@4.0.0: - resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} - engines: {node: '>=20'} - - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - - isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jake@10.9.4: - resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} - engines: {node: '>=10'} - hasBin: true - - javascript-stringify@2.1.0: - resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} - - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - - jimp@0.16.13: - resolution: {integrity: sha512-Bxz8q7V4rnCky9A0ktTNGA9SkNFVWRHodddI/DaAWZJzF7sVUlFYKQ60y9JGqrKpi48ECA/TnfMzzc5C70VByA==} - - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} - hasBin: true - - joi@17.13.3: - resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} - - jpeg-js@0.4.4: - resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} - - js-message@1.0.7: - resolution: {integrity: sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==} - engines: {node: '>=0.6.0'} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@4.0.0: - resolution: {integrity: sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==} - hasBin: true - - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} - hasBin: true - - jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - - jsdoc-type-pratt-parser@4.1.0: - resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} - engines: {node: '>=12.0.0'} - - jsdoc-type-pratt-parser@4.8.0: - resolution: {integrity: sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==} - engines: {node: '>=12.0.0'} - - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5-loader@4.0.1: - resolution: {integrity: sha512-c9viNZlZTz0MTIcf/4qvek5Dz1/PU3DNCB4PwUhlEZIV3qb1bSD6vQQymlV17/Wm6ncra1aCvmIPsuRj+KfEEg==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsonc-eslint-parser@2.4.2: - resolution: {integrity: sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - jsonfile@2.4.0: - resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} - - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - - jsonfile@6.2.1: - resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} - - jsprim@1.4.2: - resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} - engines: {node: '>=0.6.0'} - - kew@0.7.0: - resolution: {integrity: sha512-IG6nm0+QtAMdXt9KvbgbGdvY50RSrw+U4sGZg+KlrSKPJEwVE5JVoI3d7RWfSMdBQneRheeAOj3lIjX5VL/9RQ==} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - klaw@1.3.1: - resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} - - klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} - - launch-editor-middleware@2.13.2: - resolution: {integrity: sha512-kI7VqA9g6mhoeQ6YdNgd+gKLaeuWHAUR8oDM8vFtt924wG8HbI2XO0n/hSX2ML4hcJbTgUihuPHfpnPjIKMdJg==} - - launch-editor@2.13.2: - resolution: {integrity: sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg==} - - lazy-val@1.0.5: - resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} - - lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} - - lcid@1.0.0: - resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} - engines: {node: '>=0.10.0'} - - leven@2.1.0: - resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} - engines: {node: '>=0.10.0'} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - - limiter@1.1.5: - resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - load-bmfont@1.4.2: - resolution: {integrity: sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog==} - - load-json-file@1.1.0: - resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} - engines: {node: '>=0.10.0'} - - loader-runner@4.3.1: - resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} - engines: {node: '>=6.11.5'} - - loader-utils@1.4.2: - resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} - engines: {node: '>=4.0.0'} - - loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} - - local-pkg@1.1.2: - resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} - engines: {node: '>=14'} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash-es@4.18.1: - resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} - - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - - lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - - lodash.defaultsdeep@4.6.1: - resolution: {integrity: sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==} - - lodash.difference@4.5.0: - resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} - - lodash.escaperegexp@4.1.2: - resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} - - lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - - lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - - lodash.mapvalues@4.6.0: - resolution: {integrity: sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==} - - lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - - lodash.union@4.6.0: - resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} - - lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - - lodash@4.18.1: - resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} - - log-symbols@4.0.0: - resolution: {integrity: sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - log-update@2.3.0: - resolution: {integrity: sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==} - engines: {node: '>=4'} - - log4js@6.9.1: - resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} - engines: {node: '>=8.0'} - - longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - - lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@11.2.7: - resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} - engines: {node: 20 || >=22} - - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - - make-fetch-happen@10.2.1: - resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - markdown-table@3.0.4: - resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - - matcher@3.0.0: - resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} - engines: {node: '>=10'} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - mdast-util-find-and-replace@3.0.2: - resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} - - mdast-util-from-markdown@2.0.3: - resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} - - mdast-util-frontmatter@2.0.1: - resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} - - mdast-util-gfm-autolink-literal@2.0.1: - resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} - - mdast-util-gfm-footnote@2.1.0: - resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} - - mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} - - mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} - - mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - - mdast-util-gfm@3.1.0: - resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} - - mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - - mdast-util-to-markdown@2.1.2: - resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} - - mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - - mdn-data@2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - - memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} - - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - - merge-source-map@1.1.0: - resolution: {integrity: sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - - micromark-core-commonmark@2.0.3: - resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} - - micromark-extension-frontmatter@2.0.0: - resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} - - micromark-extension-gfm-autolink-literal@2.1.0: - resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} - - micromark-extension-gfm-footnote@2.1.0: - resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} - - micromark-extension-gfm-strikethrough@2.1.0: - resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} - - micromark-extension-gfm-table@2.1.1: - resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} - - micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - - micromark-extension-gfm-task-list-item@2.1.0: - resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} - - micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - - micromark-factory-destination@2.0.1: - resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - - micromark-factory-label@2.0.1: - resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - - micromark-factory-space@2.0.1: - resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} - - micromark-factory-title@2.0.1: - resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - - micromark-factory-whitespace@2.0.1: - resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - - micromark-util-chunked@2.0.1: - resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - - micromark-util-classify-character@2.0.1: - resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - - micromark-util-combine-extensions@2.0.1: - resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - - micromark-util-decode-numeric-character-reference@2.0.2: - resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - - micromark-util-decode-string@2.0.1: - resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} - - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - - micromark-util-html-tag-name@2.0.1: - resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - - micromark-util-normalize-identifier@2.0.1: - resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - - micromark-util-resolve-all@2.0.1: - resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - - micromark-util-subtokenize@2.1.0: - resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} - - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - - micromark-util-types@2.0.2: - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - - micromark@4.0.2: - resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - - mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - - mimic-fn@1.2.0: - resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} - engines: {node: '>=4'} - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - - min-document@2.19.2: - resolution: {integrity: sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==} - - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - - mini-css-extract-plugin@2.10.2: - resolution: {integrity: sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 - - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - - minimatch@10.2.5: - resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} - engines: {node: 18 || 20 || >=22} - - minimatch@3.0.4: - resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} - - minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - - minimatch@5.1.9: - resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} - engines: {node: '>=10'} - - minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@0.0.8: - resolution: {integrity: sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} - - minipass-fetch@2.1.2: - resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - minipass-flush@1.0.7: - resolution: {integrity: sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==} - engines: {node: '>= 8'} - - minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - - minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - - minipass@7.1.3: - resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} - engines: {node: '>=16 || 14 >=14.17'} - - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - - minizlib@3.1.0: - resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} - engines: {node: '>= 18'} - - mkdirp@0.5.1: - resolution: {integrity: sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==} - deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) - hasBin: true - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - - mlly@1.8.2: - resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} - - mocha@4.1.0: - resolution: {integrity: sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==} - engines: {node: '>= 4.0.0'} - hasBin: true - - mocha@8.4.0: - resolution: {integrity: sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==} - engines: {node: '>= 10.12.0'} - hasBin: true - - module-alias@2.3.4: - resolution: {integrity: sha512-bOclZt8hkpuGgSSoG07PKmvzTizROilUTvLNyrMqvlC9snhs7y7GzjNWAVbISIOlhCP1T14rH1PDAV9iNyBq/w==} - - mri@1.1.4: - resolution: {integrity: sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==} - engines: {node: '>=4'} - - mrmime@2.0.1: - resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} - engines: {node: '>=10'} - - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - multicast-dns@7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} - hasBin: true - - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - - nanoid@3.1.20: - resolution: {integrity: sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - nanopop@2.4.2: - resolution: {integrity: sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==} - - napi-postinstall@0.3.4: - resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - hasBin: true - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - natural-orderby@5.0.0: - resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} - engines: {node: '>=18'} - - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} - - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - - no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - - node-abi@3.89.0: - resolution: {integrity: sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==} - engines: {node: '>=10'} - - node-abi@4.28.0: - resolution: {integrity: sha512-Qfp5XZL1cJDOabOT8H5gnqMTmM4NjvYzHp4I/Kt/Sl76OVkOBBHRFlPspGV0hYvMoqQsypFjT/Yp7Km0beXW9g==} - engines: {node: '>=22.12.0'} - - node-addon-api@1.7.2: - resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} - - node-addon-api@7.1.1: - resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - - node-api-version@0.2.1: - resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-forge@1.4.0: - resolution: {integrity: sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==} - engines: {node: '>= 6.13.0'} - - node-gyp@12.3.0: - resolution: {integrity: sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg==} - engines: {node: ^20.17.0 || >=22.9.0} - hasBin: true - - node-gyp@9.4.1: - resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} - engines: {node: ^12.13 || ^14.13 || >=16} - hasBin: true - - node-powershell@4.0.0: - resolution: {integrity: sha512-WCZMLgwkjW9G/DZsZwyCEAXhMMzShLRUlnYS+EETRqRLSdUMbuO4xiQxIOeAutwQgvj75NvC58CorHFlx0olIA==} - - node-releases@2.0.38: - resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} - - nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true - - nopt@9.0.0: - resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} - engines: {node: ^20.17.0 || >=22.9.0} - hasBin: true - - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - - npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - - number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} - - oauth-sign@0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - - omggif@1.0.10: - resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - on-headers@1.1.0: - resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@2.0.1: - resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} - engines: {node: '>=4'} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - - opener@1.5.2: - resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} - hasBin: true - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - - os-locale@1.4.0: - resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} - engines: {node: '>=0.10.0'} - - p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - - p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - - p-retry@4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - package-manager-detector@1.6.0: - resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} - - pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - - param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-bmfont-ascii@1.0.6: - resolution: {integrity: sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==} - - parse-bmfont-binary@1.0.6: - resolution: {integrity: sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==} - - parse-bmfont-xml@1.1.6: - resolution: {integrity: sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==} - - parse-gitignore@2.0.0: - resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} - engines: {node: '>=14'} - - parse-headers@2.0.6: - resolution: {integrity: sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==} - - parse-imports-exports@0.2.4: - resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} - - parse-json@2.2.0: - resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} - engines: {node: '>=0.10.0'} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - parse-statements@1.0.11: - resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} - - parse5-htmlparser2-tree-adapter@6.0.1: - resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} - - parse5@5.1.1: - resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} - - parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - - pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - - path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-to-regexp@0.1.13: - resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==} - - path-type@1.1.0: - resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} - engines: {node: '>=0.10.0'} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - pe-library@0.4.1: - resolution: {integrity: sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==} - engines: {node: '>=12', npm: '>=6'} - - peek-readable@4.1.0: - resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} - engines: {node: '>=8'} - - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - - performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - - phantomjs-prebuilt@2.1.16: - resolution: {integrity: sha512-PIiRzBhW85xco2fuj41FmsyuYHKjKuXWmhjy3A/Y+CMpN/63TV+s9uzfVhsUwFe0G77xWtHBG8xmXf5BqEUEuQ==} - deprecated: this package is now deprecated - hasBin: true - - phin@2.9.3: - resolution: {integrity: sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - phin@3.7.1: - resolution: {integrity: sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==} - engines: {node: '>= 8'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - picocolors@0.2.1: - resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} - engines: {node: '>=8.6'} - - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} - engines: {node: '>=12'} - - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - - pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - - pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - - pixelmatch@4.0.2: - resolution: {integrity: sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==} - hasBin: true - - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - - pkg-types@2.3.0: - resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} - - plist@3.1.0: - resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} - engines: {node: '>=10.4.0'} - - pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - - pn@1.1.0: - resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} - - pngjs@3.4.0: - resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} - engines: {node: '>=4.0.0'} - - pngjs@6.0.0: - resolution: {integrity: sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==} - engines: {node: '>=12.13.0'} - - portfinder@1.0.38: - resolution: {integrity: sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==} - engines: {node: '>= 10.12'} - - postcss-calc@8.2.4: - resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} - peerDependencies: - postcss: ^8.2.2 - - postcss-colormin@5.3.1: - resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-convert-values@5.1.3: - resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-discard-comments@5.1.2: - resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-discard-duplicates@5.1.0: - resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-discard-empty@5.1.1: - resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-discard-overridden@5.1.0: - resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-loader@6.2.1: - resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} - engines: {node: '>= 12.13.0'} - peerDependencies: - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 - - postcss-merge-longhand@5.1.7: - resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-merge-rules@5.1.4: - resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-minify-font-values@5.1.0: - resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-minify-gradients@5.1.1: - resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-minify-params@5.1.4: - resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-minify-selectors@5.2.1: - resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-modules-extract-imports@3.1.0: - resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-local-by-default@4.2.0: - resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-scope@3.2.1: - resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-values@4.0.0: - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-normalize-charset@5.1.0: - resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-display-values@5.1.0: - resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-positions@5.1.1: - resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-repeat-style@5.1.1: - resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-string@5.1.0: - resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-timing-functions@5.1.0: - resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-unicode@5.1.1: - resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-url@5.1.0: - resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-whitespace@5.1.1: - resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-ordered-values@5.1.3: - resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-reduce-initial@5.1.2: - resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-reduce-transforms@5.1.0: - resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} - engines: {node: '>=4'} - - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} - engines: {node: '>=4'} - - postcss-svgo@5.1.0: - resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-unique-selectors@5.1.1: - resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - - postcss@7.0.39: - resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} - engines: {node: '>=6.0.0'} - - postcss@8.5.10: - resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} - engines: {node: ^10 || ^12 || >=14} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-linter-helpers@1.0.1: - resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} - engines: {node: '>=6.0.0'} - - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - prettier@3.8.2: - resolution: {integrity: sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q==} - engines: {node: '>=14'} - hasBin: true - - pretty-error@4.0.0: - resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} - - proc-log@6.1.0: - resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==} - engines: {node: ^20.17.0 || >=22.9.0} - - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - - progress-webpack-plugin@1.0.16: - resolution: {integrity: sha512-sdiHuuKOzELcBANHfrupYo+r99iPRyOnw15qX+rNlVUqXGfjXdH4IgxriKwG1kNJwVswKQHMdj1hYZMcb9jFaA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - - progress@1.1.8: - resolution: {integrity: sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==} - engines: {node: '>=0.4.0'} - - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - - promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - - promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - - proper-lockfile@4.1.2: - resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - proxy-from-env@2.1.0: - resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} - engines: {node: '>=10'} - - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - - psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - - pump@3.0.4: - resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - qs@6.14.2: - resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} - engines: {node: '>=0.6'} - - qs@6.15.1: - resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} - engines: {node: '>=0.6'} - - qs@6.5.5: - resolution: {integrity: sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==} - engines: {node: '>=0.6'} - - quansync@0.2.11: - resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - - random-int@1.0.0: - resolution: {integrity: sha512-mFCC/eAtuTW3BOYEoKPDwa5iUC3NxClZ0uqJz7wL1e2yHlCP9b5Mt8hsplBGSpeGLV0kymTyTdf14Hp2/HiW8Q==} - engines: {node: '>=0.10.0'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@2.5.3: - resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} - engines: {node: '>= 0.8'} - - read-binary-file-arch@1.0.6: - resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} - hasBin: true - - read-pkg-up@1.0.1: - resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} - engines: {node: '>=0.10.0'} - - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - - read-pkg@1.1.0: - resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} - engines: {node: '>=0.10.0'} - - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readable-stream@4.7.0: - resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - readable-web-to-node-stream@3.0.4: - resolution: {integrity: sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==} - engines: {node: '>=8'} - - readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} - - readdirp@3.5.0: - resolution: {integrity: sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==} - engines: {node: '>=8.10.0'} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - - refa@0.12.1: - resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - regenerate-unicode-properties@10.2.2: - resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} - engines: {node: '>=4'} - - regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - - regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - - regexp-ast-analysis@0.7.1: - resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - - regexpu-core@6.4.0: - resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} - engines: {node: '>=4'} - - regjsgen@0.8.0: - resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - - regjsparser@0.10.0: - resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} - hasBin: true - - regjsparser@0.13.1: - resolution: {integrity: sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==} - hasBin: true - - relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} - - renderkid@3.0.0: - resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} - - request-progress@2.0.1: - resolution: {integrity: sha512-dxdraeZVUNEn9AvLrxkgB2k6buTlym71dJk1fk4v8j3Ou3RKNm07BcgbHdj2lLgYGfqX71F+awb1MR+tWPFJzA==} - - request-progress@3.0.0: - resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} - - request@2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - require-main-filename@1.0.1: - resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} - - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - - resedit@1.7.2: - resolution: {integrity: sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==} - engines: {node: '>=12', npm: '>=6'} - - resize-observer-polyfill@1.5.1: - resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - - resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - resolve@1.22.12: - resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} - engines: {node: '>= 0.4'} - hasBin: true - - responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - - restore-cursor@2.0.0: - resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} - engines: {node: '>=4'} - - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - - retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - roarr@2.15.4: - resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} - engines: {node: '>=8.0'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - sanitize-filename@1.6.4: - resolution: {integrity: sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==} - - sass-loader@16.0.7: - resolution: {integrity: sha512-w6q+fRHourZ+e+xA1kcsF27iGM6jdB8teexYCfdUw0sYgcDNeZESnDNT9sUmmPm3ooziwUJXGwZJSTF3kOdBfA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - '@rspack/core': 0.x || ^1.0.0 || ^2.0.0-0 - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - sass: ^1.3.0 - sass-embedded: '*' - webpack: ^5.0.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - node-sass: - optional: true - sass: - optional: true - sass-embedded: - optional: true - webpack: - optional: true - - sass@1.99.0: - resolution: {integrity: sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==} - engines: {node: '>=14.0.0'} - hasBin: true - - sax@1.6.0: - resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} - engines: {node: '>=11.0.0'} - - schema-utils@2.7.1: - resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} - engines: {node: '>= 8.9.0'} - - schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - - schema-utils@4.3.3: - resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} - engines: {node: '>= 10.13.0'} - - scroll-into-view-if-needed@2.2.31: - resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} - - scslre@0.3.0: - resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} - engines: {node: ^14.0.0 || >=16.0.0} - - select-hose@2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - - selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} - - semver-compare@1.0.0: - resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} - - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} - engines: {node: '>=10'} - hasBin: true - - send@0.19.2: - resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} - engines: {node: '>= 0.8.0'} - - serialize-error@7.0.1: - resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} - engines: {node: '>=10'} - - serialize-javascript@5.0.1: - resolution: {integrity: sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==} - - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - - serve-index@1.9.2: - resolution: {integrity: sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==} - engines: {node: '>= 0.8.0'} - - serve-static@1.16.3: - resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} - engines: {node: '>= 0.8.0'} - - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - - shallow-equal@1.2.1: - resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==} - - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shell-env@0.3.0: - resolution: {integrity: sha512-VrC6OSm5riGAFWvlYExA80Rrlfi4STsztNXjyet9Jf20hbiVeeKvJIesb92gJk7zlmpQjB0wOZpy8ClzVdPVWQ==} - engines: {node: '>=4'} - - shell-path@2.1.0: - resolution: {integrity: sha512-w+mbrnpA+r5jSFS4MgFfxZJ1Wx8qMKkR4gvQ+wgaZEoZCMMYZ6Yl/dcNjW/zLMfmx5a9IVIFwGAtUJcnDMmFrg==} - engines: {node: '>=4'} - - shell-quote@1.8.3: - resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} - engines: {node: '>= 0.4'} - - shortid@2.2.17: - resolution: {integrity: sha512-GpbM3gLF1UUXZvQw6MCyulHkWbRseNO4cyBEZresZRorwl1+SLu1ZdqgVtuwqz8mB6RpwPkm541mYSqrKyJSaA==} - - should-equal@2.0.0: - resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} - - should-format@3.0.3: - resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} - - should-type-adaptors@1.1.0: - resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} - - should-type@1.4.0: - resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} - - should-util@1.0.1: - resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} - - should@13.2.3: - resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} - - side-channel-list@1.0.1: - resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - simple-update-notifier@2.0.0: - resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} - engines: {node: '>=10'} - - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slice-ansi@3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} - - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - - sockjs@0.3.24: - resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} - - socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} - - socks@2.8.7: - resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - spawn-command@0.0.2: - resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} - - spawn-sync@2.0.0: - resolution: {integrity: sha512-AGXIhH/XZVinFewojYTsG8uapHX2e7MjtFbmibvK9qqG4qGd9b6jelU1sTkCA0RVGHvN9exJYTBVbF1Ls2f69g==} - - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-expression-parse@4.0.0: - resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - - spdx-license-ids@3.0.23: - resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} - - spdy-transport@3.0.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} - - spdy@4.0.2: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} - - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - - sshpk@1.18.0: - resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} - engines: {node: '>=0.10.0'} - hasBin: true - - ssri@8.0.1: - resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} - engines: {node: '>= 8'} - - ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - stable-hash-x@0.2.0: - resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} - engines: {node: '>=12.0.0'} - - stable@0.1.8: - resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} - deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' - - stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - - stat-mode@1.0.0: - resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} - engines: {node: '>= 6'} - - statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} - - stream-throttle@0.1.3: - resolution: {integrity: sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==} - engines: {node: '>= 0.10.0'} - hasBin: true - - streamroller@3.1.5: - resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} - engines: {node: '>=8.0'} - - streamx@2.25.0: - resolution: {integrity: sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==} - - string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} - - string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - - strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - - strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} - - strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - strtok3@6.3.0: - resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} - engines: {node: '>=10'} - - stylehacks@5.1.1: - resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - stylis@4.4.0: - resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==} - - sumchecker@3.0.1: - resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} - engines: {node: '>= 8.0'} - - superagent@6.1.0: - resolution: {integrity: sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==} - engines: {node: '>= 7.0.0'} - deprecated: Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net - - supports-color@4.4.0: - resolution: {integrity: sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==} - engines: {node: '>=4'} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - svg-tags@1.0.0: - resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} - - svg2png@4.1.1: - resolution: {integrity: sha512-9tOp9Ugjlunuf1ugqkhiYboTmTaTI7p48dz5ZjNA5NQJ5xS1NLTZZ1tF8vkJOIBb/ZwxGJsKZvRWqVpo4q9z9Q==} - hasBin: true - - svgo@2.8.2: - resolution: {integrity: sha512-TyzE4NVGLUFy+H/Uy4N6c3G0HEeprsVfge6Lmq+0FdQQ/zqoVYB62IsBZORsiL+o96s6ff/V6/3UQo/C0cgCAA==} - engines: {node: '>=10.13.0'} - hasBin: true - - synckit@0.11.12: - resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} - engines: {node: ^14.18.0 || >=16.0.0} - - synckit@0.9.3: - resolution: {integrity: sha512-JJoOEKTfL1urb1mDoEblhD9NhEbWmq9jHEMEnxoC4ujUaZ4itA8vKgwkFAyNClgxplLi9tsUKX+EduK0p/l7sg==} - engines: {node: ^14.18.0 || >=16.0.0} - - tapable@2.3.3: - resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} - engines: {node: '>=6'} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - tar-stream@3.2.0: - resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} - - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - - tar@7.5.13: - resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==} - engines: {node: '>=18'} - - teex@1.0.1: - resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} - - temp-file@3.4.0: - resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} - - terser-webpack-plugin@5.5.0: - resolution: {integrity: sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - - terser@5.46.2: - resolution: {integrity: sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==} - engines: {node: '>=10'} - hasBin: true - - text-decoder@1.2.7: - resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} - - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - - thread-loader@3.0.4: - resolution: {integrity: sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.27.0 || ^5.0.0 - - throttle-debounce@5.0.2: - resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} - engines: {node: '>=12.22'} - - throttleit@1.0.1: - resolution: {integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==} - - through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - - thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - - timm@1.7.1: - resolution: {integrity: sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==} - - tiny-async-pool@1.3.0: - resolution: {integrity: sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==} - - tiny-emitter@2.1.0: - resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} - - tiny-typed-emitter@2.1.0: - resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==} - - tinycolor2@1.6.0: - resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - - tinyexec@1.1.1: - resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} - engines: {node: '>=18'} - - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} - engines: {node: '>=12.0.0'} - - tmp-promise@3.0.3: - resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} - - tmp@0.2.5: - resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} - engines: {node: '>=14.14'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - token-types@4.2.1: - resolution: {integrity: sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==} - engines: {node: '>=10'} - - toml-eslint-parser@0.10.1: - resolution: {integrity: sha512-9mjy3frhioGIVGcwamlVlUyJ9x+WHw/TXiz9R4YOlmsIuBN43r9Dp8HZ35SF9EKjHrn3BUZj04CF+YqZ2oJ+7w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} - - tough-cookie@2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - - truncate-utf8-bytes@1.0.2: - resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - - ts-api-utils@2.5.0: - resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - - ts-declaration-location@1.0.7: - resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} - peerDependencies: - typescript: '>=4.0.0' - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - - typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - ufo@1.6.3: - resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} - - uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} - hasBin: true - - underscore@1.13.8: - resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==} - - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - - undici-types@7.19.2: - resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} - - undici@6.25.0: - resolution: {integrity: sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==} - engines: {node: '>=18.17'} - - unicode-canonical-property-names-ecmascript@2.0.1: - resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} - engines: {node: '>=4'} - - unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - - unicode-match-property-value-ecmascript@2.2.1: - resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} - engines: {node: '>=4'} - - unicode-property-aliases-ecmascript@2.2.0: - resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} - engines: {node: '>=4'} - - unique-filename@2.0.1: - resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - unique-slug@3.0.0: - resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - unist-util-is@6.0.1: - resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-parents@6.0.2: - resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} - - unist-util-visit@5.1.0: - resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} - - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - unrs-resolver@1.11.1: - resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} - - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - utf8-byte-length@1.0.5: - resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} - - utif@2.0.1: - resolution: {integrity: sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - utila@0.4.0: - resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} - - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - - uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} - - verror@1.10.1: - resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} - engines: {node: '>=0.6.0'} - - vue-eslint-parser@9.4.3: - resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' - - vue-hot-reload-api@2.3.4: - resolution: {integrity: sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==} - - vue-loader@15.11.1: - resolution: {integrity: sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==} - peerDependencies: - '@vue/compiler-sfc': ^3.0.8 - cache-loader: '*' - css-loader: '*' - prettier: '*' - vue-template-compiler: '*' - webpack: ^3.0.0 || ^4.1.0 || ^5.0.0-0 - peerDependenciesMeta: - '@vue/compiler-sfc': - optional: true - cache-loader: - optional: true - prettier: - optional: true - vue-template-compiler: - optional: true - - vue-loader@17.4.2: - resolution: {integrity: sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w==} - peerDependencies: - '@vue/compiler-sfc': '*' - vue: '*' - webpack: ^4.1.0 || ^5.0.0-0 - peerDependenciesMeta: - '@vue/compiler-sfc': - optional: true - vue: - optional: true - - vue-router@4.6.4: - resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==} - peerDependencies: - vue: ^3.5.0 - - vue-style-loader@4.1.3: - resolution: {integrity: sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==} - - vue-template-compiler@2.7.16: - resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} - - vue-template-es2015-compiler@1.9.1: - resolution: {integrity: sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==} - - vue-types@3.0.2: - resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==} - engines: {node: '>=10.15.0'} - peerDependencies: - vue: ^3.0.0 - - vue3-json-editor@1.1.5: - resolution: {integrity: sha512-p+hbl5SdMifA9brPt9TsG2HYB7Xy7xy98b61zcIusVpwhGtS5a0IwWPKM7BXcj9poIdc/bPs4AFchQOHIBq++w==} - - vue@3.5.33: - resolution: {integrity: sha512-1AgChhx5w3ALgT4oK3acm2Es/7jyZhWSVUfs3rOBlGQC0rjEDkS7G4lWlJJGGNQD+BV3reCwbQrOe1mPNwKHBQ==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - wait-on@7.2.0: - resolution: {integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==} - engines: {node: '>=12.0.0'} - hasBin: true - - warning@4.0.3: - resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} - - watchpack@2.5.1: - resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} - engines: {node: '>=10.13.0'} - - wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} - - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - webpack-bundle-analyzer@4.10.2: - resolution: {integrity: sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==} - engines: {node: '>= 10.13.0'} - hasBin: true - - webpack-chain@6.5.1: - resolution: {integrity: sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==} - engines: {node: '>=8'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - webpack-dev-middleware@5.3.4: - resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - - webpack-dev-server@4.15.2: - resolution: {integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==} - engines: {node: '>= 12.13.0'} - hasBin: true - peerDependencies: - webpack: ^4.37.0 || ^5.0.0 - webpack-cli: '*' - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true - - webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} - engines: {node: '>=10.0.0'} - - webpack-sources@3.4.0: - resolution: {integrity: sha512-gHwIe1cgBvvfLeu1Yz/dcFpmHfKDVxxyqI+kzqmuxZED81z2ChxpyqPaWcNqigPywhaEke7AjSGga+kxY55gjQ==} - engines: {node: '>=10.13.0'} - - webpack-virtual-modules@0.4.6: - resolution: {integrity: sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==} - - webpack@5.106.2: - resolution: {integrity: sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - - websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} - - websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - - whatwg-fetch@3.6.20: - resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-module@1.0.0: - resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} - - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - which@5.0.0: - resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} - engines: {node: ^18.17.0 || >=20.5.0} - hasBin: true - - which@6.0.1: - resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} - engines: {node: ^20.17.0 || >=22.9.0} - hasBin: true - - wide-align@1.1.3: - resolution: {integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==} - - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - - wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} - - winreg@1.2.5: - resolution: {integrity: sha512-uf7tHf+tw0B1y+x+mKTLHkykBgK2KMs3g+KlzmyMbLvICSHQyB/xOFjTT8qZ3oeTFyU7Bbj4FzXitGG6jvKhYw==} - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - - workerpool@6.1.0: - resolution: {integrity: sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==} - - wrap-ansi@2.1.0: - resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} - engines: {node: '>=0.10.0'} - - wrap-ansi@3.0.1: - resolution: {integrity: sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==} - engines: {node: '>=4'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.20.0: - resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - xhr@2.6.0: - resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} - - xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - - xml-parse-from-string@1.0.1: - resolution: {integrity: sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==} - - xml2js@0.5.0: - resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} - engines: {node: '>=4.0.0'} - - xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - - xmlbuilder@15.1.1: - resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} - engines: {node: '>=8.0'} - - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - - y18n@3.2.2: - resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yallist@5.0.0: - resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} - engines: {node: '>=18'} - - yaml-eslint-parser@1.3.2: - resolution: {integrity: sha512-odxVsHAkZYYglR30aPYRY4nUGJnoJ2y1ww2HDvZALo0BDETv9kWbi16J52eHs+PWRNmF4ub6nZqfVOeesOvntg==} - engines: {node: ^14.17.0 || >=16.0.0} - - yaml@1.10.3: - resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} - engines: {node: '>= 6'} - - yaml@2.8.3: - resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} - engines: {node: '>= 14.6'} - hasBin: true - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs-parser@4.2.1: - resolution: {integrity: sha512-+QQWqC2xeL0N5/TE+TY6OGEqyNRM+g2/r712PDNYgiCdXYCApXf1vzfmDSLBxfGRwV+moTq/V8FnMI24JCm2Yg==} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yargs@6.6.0: - resolution: {integrity: sha512-6/QWTdisjnu5UHUzQGst+UOEuEVwIzFVGBjq3jMTFNs5WJQsH/X6nMURSaScIdF5txylr1Ao9bvbWiKi2yXbwA==} - - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - zip-stream@4.1.1: - resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} - engines: {node: '>= 10'} - - zip-stream@6.0.1: - resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} - engines: {node: '>= 14'} - - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - -snapshots: - - 7zip-bin@5.2.0: {} - - '@achrinza/node-ipc@9.2.10': - dependencies: - '@node-ipc/js-queue': 2.0.3 - event-pubsub: 4.3.0 - js-message: 1.0.7 - - '@ant-design/colors@6.0.0': - dependencies: - '@ctrl/tinycolor': 3.6.1 - - '@ant-design/icons-svg@4.4.2': {} - - '@ant-design/icons-vue@7.0.1(vue@3.5.33(typescript@5.9.3))': - dependencies: - '@ant-design/colors': 6.0.0 - '@ant-design/icons-svg': 4.4.2 - vue: 3.5.33(typescript@5.9.3) - - '@antfu/eslint-config@3.16.0(@typescript-eslint/utils@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.33)(eslint-import-resolver-node@0.3.9)(eslint-plugin-format@0.1.3(eslint@10.2.1(jiti@2.6.1)))(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@antfu/install-pkg': 1.1.0 - '@clack/prompts': 0.9.1 - '@eslint-community/eslint-plugin-eslint-comments': 4.7.1(eslint@10.2.1(jiti@2.6.1)) - '@eslint/markdown': 6.6.0 - '@stylistic/eslint-plugin': 2.13.0(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/eslint-plugin': 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) - '@vitest/eslint-plugin': 1.6.15(@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.2.1(jiti@2.6.1) - eslint-config-flat-gitignore: 1.0.1(eslint@10.2.1(jiti@2.6.1)) - eslint-flat-config-utils: 1.1.0 - eslint-merge-processors: 1.0.0(eslint@10.2.1(jiti@2.6.1)) - eslint-plugin-antfu: 2.7.0(eslint@10.2.1(jiti@2.6.1)) - eslint-plugin-command: 2.1.0(eslint@10.2.1(jiti@2.6.1)) - eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.2.1(jiti@2.6.1)) - eslint-plugin-jsdoc: 50.8.0(eslint@10.2.1(jiti@2.6.1)) - eslint-plugin-jsonc: 2.21.1(eslint@10.2.1(jiti@2.6.1)) - eslint-plugin-n: 17.24.0(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-no-only-tests: 3.3.0 - eslint-plugin-perfectionist: 4.15.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-regexp: 2.10.0(eslint@10.2.1(jiti@2.6.1)) - eslint-plugin-toml: 0.12.0(eslint@10.2.1(jiti@2.6.1)) - eslint-plugin-unicorn: 56.0.1(eslint@10.2.1(jiti@2.6.1)) - eslint-plugin-unused-imports: 4.4.1(@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.1(jiti@2.6.1)) - eslint-plugin-vue: 9.33.0(eslint@10.2.1(jiti@2.6.1)) - eslint-plugin-yml: 1.19.1(eslint@10.2.1(jiti@2.6.1)) - eslint-processor-vue-blocks: 1.0.0(@vue/compiler-sfc@3.5.33)(eslint@10.2.1(jiti@2.6.1)) - globals: 15.15.0 - jsonc-eslint-parser: 2.4.2 - local-pkg: 1.1.2 - parse-gitignore: 2.0.0 - picocolors: 1.1.1 - toml-eslint-parser: 0.10.1 - vue-eslint-parser: 9.4.3(eslint@10.2.1(jiti@2.6.1)) - yaml-eslint-parser: 1.3.2 - yargs: 17.7.2 - optionalDependencies: - eslint-plugin-format: 0.1.3(eslint@10.2.1(jiti@2.6.1)) - transitivePeerDependencies: - - '@eslint/json' - - '@typescript-eslint/utils' - - '@vue/compiler-sfc' - - eslint-import-resolver-node - - supports-color - - typescript - - vitest - - '@antfu/install-pkg@1.1.0': - dependencies: - package-manager-detector: 1.6.0 - tinyexec: 1.1.1 - - '@antfu/utils@0.7.10': {} - - '@babel/code-frame@7.29.0': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.29.0': {} - - '@babel/core@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.2 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.29.1': - dependencies: - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - '@babel/helper-annotate-as-pure@7.27.3': - dependencies: - '@babel/types': 7.29.0 - - '@babel/helper-compilation-targets@7.28.6': - dependencies: - '@babel/compat-data': 7.29.0 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.2 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.29.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - regexpu-core: 6.4.0 - semver: 6.3.1 - - '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - debug: 4.4.3 - lodash.debounce: 4.0.8 - resolve: 1.22.12 - transitivePeerDependencies: - - supports-color - - '@babel/helper-globals@7.28.0': {} - - '@babel/helper-member-expression-to-functions@7.28.5': - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.28.6': - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-optimise-call-expression@7.27.1': - dependencies: - '@babel/types': 7.29.0 - - '@babel/helper-plugin-utils@7.28.6': {} - - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.28.6 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-string-parser@7.27.1': {} - - '@babel/helper-validator-identifier@7.28.5': {} - - '@babel/helper-validator-option@7.27.1': {} - - '@babel/helper-wrap-function@7.28.6': - dependencies: - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helpers@7.29.2': - dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - - '@babel/parser@7.29.2': - dependencies: - '@babel/types': 7.29.0 - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-decorators': 7.28.6(@babel/core@7.29.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - - '@babel/plugin-syntax-decorators@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-classes@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/template': 7.28.6 - - '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-runtime@7.29.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.0) - babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-spread@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/preset-env@7.29.2(@babel/core@7.29.0)': - dependencies: - '@babel/compat-data': 7.29.0 - '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.29.0) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0) - '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.0) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) - '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-modules-systemjs': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) - '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.29.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.0) - babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) - babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.0) - babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) - core-js-compat: 3.49.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/types': 7.29.0 - esutils: 2.0.3 - - '@babel/runtime@7.29.2': {} - - '@babel/template@7.28.6': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 - - '@babel/traverse@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.2 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.29.0': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - - '@clack/core@0.4.1': - dependencies: - picocolors: 1.1.1 - sisteransi: 1.0.5 - - '@clack/prompts@0.9.1': - dependencies: - '@clack/core': 0.4.1 - picocolors: 1.1.1 - sisteransi: 1.0.5 - - '@ctrl/tinycolor@3.6.1': {} - - '@develar/schema-utils@2.6.5': - dependencies: - ajv: 6.15.0 - ajv-keywords: 3.5.2(ajv@6.15.0) - - '@discoveryjs/json-ext@0.5.7': {} - - '@dprint/formatter@0.3.0': {} - - '@dprint/markdown@0.17.8': {} - - '@dprint/toml@0.6.4': {} - - '@electron/asar@3.4.1': - dependencies: - commander: 5.1.0 - glob: 7.2.3 - minimatch: 3.1.5 - - '@electron/fuses@1.8.0': - dependencies: - chalk: 4.1.2 - fs-extra: 9.1.0 - minimist: 1.2.8 - - '@electron/get@2.0.3': - dependencies: - debug: 4.4.3 - env-paths: 2.2.1 - fs-extra: 8.1.0 - got: 11.8.6 - progress: 2.0.3 - semver: 6.3.1 - sumchecker: 3.0.1 - optionalDependencies: - global-agent: 3.0.0 - transitivePeerDependencies: - - supports-color - - '@electron/get@3.1.0': - dependencies: - debug: 4.4.3 - env-paths: 2.2.1 - fs-extra: 8.1.0 - got: 11.8.6 - progress: 2.0.3 - semver: 6.3.1 - sumchecker: 3.0.1 - optionalDependencies: - global-agent: 3.0.0 - transitivePeerDependencies: - - supports-color - - '@electron/notarize@2.5.0': - dependencies: - debug: 4.4.3 - fs-extra: 9.1.0 - promise-retry: 2.0.1 - transitivePeerDependencies: - - supports-color - - '@electron/osx-sign@1.3.1': - dependencies: - compare-version: 0.1.2 - debug: 4.4.3 - fs-extra: 10.1.0 - isbinaryfile: 4.0.10 - minimist: 1.2.8 - plist: 3.1.0 - transitivePeerDependencies: - - supports-color - - '@electron/osx-sign@1.3.3': - dependencies: - compare-version: 0.1.2 - debug: 4.4.3 - fs-extra: 10.1.0 - isbinaryfile: 4.0.10 - minimist: 1.2.8 - plist: 3.1.0 - transitivePeerDependencies: - - supports-color - - '@electron/rebuild@3.6.1': - dependencies: - '@malept/cross-spawn-promise': 2.0.0 - chalk: 4.1.2 - debug: 4.4.3 - detect-libc: 2.1.2 - fs-extra: 10.1.0 - got: 11.8.6 - node-abi: 3.89.0 - node-api-version: 0.2.1 - node-gyp: 9.4.1 - ora: 5.4.1 - read-binary-file-arch: 1.0.6 - semver: 7.7.4 - tar: 6.2.1 - yargs: 17.7.2 - transitivePeerDependencies: - - bluebird - - supports-color - - '@electron/rebuild@4.0.4': - dependencies: - '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.3 - node-abi: 4.28.0 - node-api-version: 0.2.1 - node-gyp: 12.3.0 - read-binary-file-arch: 1.0.6 - transitivePeerDependencies: - - supports-color - - '@electron/universal@2.0.1': - dependencies: - '@electron/asar': 3.4.1 - '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.3 - dir-compare: 4.2.0 - fs-extra: 11.3.4 - minimatch: 9.0.9 - plist: 3.1.0 - transitivePeerDependencies: - - supports-color - - '@electron/universal@2.0.3': - dependencies: - '@electron/asar': 3.4.1 - '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.3 - dir-compare: 4.2.0 - fs-extra: 11.3.4 - minimatch: 9.0.9 - plist: 3.1.0 - transitivePeerDependencies: - - supports-color - - '@emnapi/core@1.9.2': - dependencies: - '@emnapi/wasi-threads': 1.2.1 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.9.2': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.2.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@emotion/hash@0.9.2': {} - - '@emotion/unitless@0.8.1': {} - - '@es-joy/jsdoccomment@0.50.2': - dependencies: - '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.58.1 - comment-parser: 1.4.1 - esquery: 1.7.0 - jsdoc-type-pratt-parser: 4.1.0 - - '@eslint-community/eslint-plugin-eslint-comments@4.7.1(eslint@10.2.1(jiti@2.6.1))': - dependencies: - escape-string-regexp: 4.0.0 - eslint: 10.2.1(jiti@2.6.1) - ignore: 7.0.5 - - '@eslint-community/eslint-utils@4.9.1(eslint@10.2.1(jiti@2.6.1))': - dependencies: - eslint: 10.2.1(jiti@2.6.1) - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.2': {} - - '@eslint/compat@1.4.1(eslint@10.2.1(jiti@2.6.1))': - dependencies: - '@eslint/core': 0.17.0 - optionalDependencies: - eslint: 10.2.1(jiti@2.6.1) - - '@eslint/config-array@0.23.5': - dependencies: - '@eslint/object-schema': 3.0.5 - debug: 4.4.3 - minimatch: 10.2.5 - transitivePeerDependencies: - - supports-color - - '@eslint/config-helpers@0.5.5': - dependencies: - '@eslint/core': 1.2.1 - - '@eslint/core@0.14.0': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/core@0.15.2': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/core@0.17.0': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/core@1.2.1': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/markdown@6.6.0': - dependencies: - '@eslint/core': 0.14.0 - '@eslint/plugin-kit': 0.3.5 - github-slugger: 2.0.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-frontmatter: 2.0.1 - mdast-util-gfm: 3.1.0 - micromark-extension-frontmatter: 2.0.0 - micromark-extension-gfm: 3.0.0 - transitivePeerDependencies: - - supports-color - - '@eslint/object-schema@3.0.5': {} - - '@eslint/plugin-kit@0.3.5': - dependencies: - '@eslint/core': 0.15.2 - levn: 0.4.1 - - '@eslint/plugin-kit@0.7.1': - dependencies: - '@eslint/core': 1.2.1 - levn: 0.4.1 - - '@gar/promisify@1.1.3': {} - - '@hapi/hoek@9.3.0': {} - - '@hapi/topo@5.1.0': - dependencies: - '@hapi/hoek': 9.3.0 - - '@humanfs/core@0.19.1': {} - - '@humanfs/node@0.16.7': - dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.4.3 - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/retry@0.4.3': {} - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.2.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@isaacs/fs-minipass@4.0.1': - dependencies: - minipass: 7.1.3 - - '@jimp/bmp@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/utils': 0.16.13 - bmp-js: 0.1.0 - - '@jimp/core@0.16.13': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/utils': 0.16.13 - any-base: 1.1.0 - buffer: 5.7.1 - exif-parser: 0.1.12 - file-type: 16.5.4 - load-bmfont: 1.4.2 - mkdirp: 0.5.6 - phin: 2.9.3 - pixelmatch: 4.0.2 - tinycolor2: 1.6.0 - transitivePeerDependencies: - - debug - - '@jimp/custom@0.16.13': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/core': 0.16.13 - transitivePeerDependencies: - - debug - - '@jimp/gif@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/utils': 0.16.13 - gifwrap: 0.9.4 - omggif: 1.0.10 - - '@jimp/jpeg@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/utils': 0.16.13 - jpeg-js: 0.4.4 - - '@jimp/plugin-blit@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/utils': 0.16.13 - - '@jimp/plugin-blur@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/utils': 0.16.13 - - '@jimp/plugin-circle@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/utils': 0.16.13 - - '@jimp/plugin-color@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/utils': 0.16.13 - tinycolor2: 1.6.0 - - '@jimp/plugin-contain@0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-blit@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-scale@0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13)))': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/plugin-blit': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-resize': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-scale': 0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13)) - '@jimp/utils': 0.16.13 - - '@jimp/plugin-cover@0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-crop@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-scale@0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13)))': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/plugin-crop': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-resize': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-scale': 0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13)) - '@jimp/utils': 0.16.13 - - '@jimp/plugin-crop@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/utils': 0.16.13 - - '@jimp/plugin-displace@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/utils': 0.16.13 - - '@jimp/plugin-dither@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/utils': 0.16.13 - - '@jimp/plugin-fisheye@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/utils': 0.16.13 - - '@jimp/plugin-flip@0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-rotate@0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-blit@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-crop@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13)))': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/plugin-rotate': 0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-blit@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-crop@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13)) - '@jimp/utils': 0.16.13 - - '@jimp/plugin-gaussian@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/utils': 0.16.13 - - '@jimp/plugin-invert@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/utils': 0.16.13 - - '@jimp/plugin-mask@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/utils': 0.16.13 - - '@jimp/plugin-normalize@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/utils': 0.16.13 - - '@jimp/plugin-print@0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-blit@0.16.13(@jimp/custom@0.16.13))': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/plugin-blit': 0.16.13(@jimp/custom@0.16.13) - '@jimp/utils': 0.16.13 - load-bmfont: 1.4.2 - transitivePeerDependencies: - - debug - - '@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/utils': 0.16.13 - - '@jimp/plugin-rotate@0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-blit@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-crop@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13))': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/plugin-blit': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-crop': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-resize': 0.16.13(@jimp/custom@0.16.13) - '@jimp/utils': 0.16.13 - - '@jimp/plugin-scale@0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13))': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/plugin-resize': 0.16.13(@jimp/custom@0.16.13) - '@jimp/utils': 0.16.13 - - '@jimp/plugin-shadow@0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-blur@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13))': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/plugin-blur': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-resize': 0.16.13(@jimp/custom@0.16.13) - '@jimp/utils': 0.16.13 - - '@jimp/plugin-threshold@0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-color@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13))': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/plugin-color': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-resize': 0.16.13(@jimp/custom@0.16.13) - '@jimp/utils': 0.16.13 - - '@jimp/plugins@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/plugin-blit': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-blur': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-circle': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-color': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-contain': 0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-blit@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-scale@0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13))) - '@jimp/plugin-cover': 0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-crop@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-scale@0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13))) - '@jimp/plugin-crop': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-displace': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-dither': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-fisheye': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-flip': 0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-rotate@0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-blit@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-crop@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13))) - '@jimp/plugin-gaussian': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-invert': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-mask': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-normalize': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-print': 0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-blit@0.16.13(@jimp/custom@0.16.13)) - '@jimp/plugin-resize': 0.16.13(@jimp/custom@0.16.13) - '@jimp/plugin-rotate': 0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-blit@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-crop@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13)) - '@jimp/plugin-scale': 0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13)) - '@jimp/plugin-shadow': 0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-blur@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13)) - '@jimp/plugin-threshold': 0.16.13(@jimp/custom@0.16.13)(@jimp/plugin-color@0.16.13(@jimp/custom@0.16.13))(@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13)) - timm: 1.7.1 - transitivePeerDependencies: - - debug - - '@jimp/png@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/utils': 0.16.13 - pngjs: 3.4.0 - - '@jimp/tiff@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - utif: 2.0.1 - - '@jimp/types@0.16.13(@jimp/custom@0.16.13)': - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/bmp': 0.16.13(@jimp/custom@0.16.13) - '@jimp/custom': 0.16.13 - '@jimp/gif': 0.16.13(@jimp/custom@0.16.13) - '@jimp/jpeg': 0.16.13(@jimp/custom@0.16.13) - '@jimp/png': 0.16.13(@jimp/custom@0.16.13) - '@jimp/tiff': 0.16.13(@jimp/custom@0.16.13) - timm: 1.7.1 - - '@jimp/utils@0.16.13': - dependencies: - '@babel/runtime': 7.29.2 - regenerator-runtime: 0.13.11 - - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/source-map@0.3.11': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@leichtgewicht/ip-codec@2.0.5': {} - - '@malept/cross-spawn-promise@2.0.0': - dependencies: - cross-spawn: 7.0.6 - - '@malept/flatpak-bundler@0.4.0': - dependencies: - debug: 4.4.3 - fs-extra: 9.1.0 - lodash: 4.18.1 - tmp-promise: 3.0.3 - transitivePeerDependencies: - - supports-color - - '@napi-rs/wasm-runtime@0.2.12': - dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 - '@tybys/wasm-util': 0.10.1 - optional: true - - '@node-ipc/js-queue@2.0.3': - dependencies: - easy-stack: 1.0.1 - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 - - '@npmcli/fs@2.1.2': - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.7.4 - - '@npmcli/move-file@2.0.1': - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - - '@package-json/types@0.0.12': {} - - '@parcel/watcher-android-arm64@2.5.6': - optional: true - - '@parcel/watcher-darwin-arm64@2.5.6': - optional: true - - '@parcel/watcher-darwin-x64@2.5.6': - optional: true - - '@parcel/watcher-freebsd-x64@2.5.6': - optional: true - - '@parcel/watcher-linux-arm-glibc@2.5.6': - optional: true - - '@parcel/watcher-linux-arm-musl@2.5.6': - optional: true - - '@parcel/watcher-linux-arm64-glibc@2.5.6': - optional: true - - '@parcel/watcher-linux-arm64-musl@2.5.6': - optional: true - - '@parcel/watcher-linux-x64-glibc@2.5.6': - optional: true - - '@parcel/watcher-linux-x64-musl@2.5.6': - optional: true - - '@parcel/watcher-win32-arm64@2.5.6': - optional: true - - '@parcel/watcher-win32-ia32@2.5.6': - optional: true - - '@parcel/watcher-win32-x64@2.5.6': - optional: true - - '@parcel/watcher@2.5.6': - dependencies: - detect-libc: 2.1.2 - is-glob: 4.0.3 - node-addon-api: 7.1.1 - picomatch: 4.0.4 - optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.6 - '@parcel/watcher-darwin-arm64': 2.5.6 - '@parcel/watcher-darwin-x64': 2.5.6 - '@parcel/watcher-freebsd-x64': 2.5.6 - '@parcel/watcher-linux-arm-glibc': 2.5.6 - '@parcel/watcher-linux-arm-musl': 2.5.6 - '@parcel/watcher-linux-arm64-glibc': 2.5.6 - '@parcel/watcher-linux-arm64-musl': 2.5.6 - '@parcel/watcher-linux-x64-glibc': 2.5.6 - '@parcel/watcher-linux-x64-musl': 2.5.6 - '@parcel/watcher-win32-arm64': 2.5.6 - '@parcel/watcher-win32-ia32': 2.5.6 - '@parcel/watcher-win32-x64': 2.5.6 - optional: true - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@pkgr/core@0.1.2': {} - - '@pkgr/core@0.2.9': {} - - '@polka/url@1.0.0-next.29': {} - - '@sideway/address@4.1.5': - dependencies: - '@hapi/hoek': 9.3.0 - - '@sideway/formula@3.0.1': {} - - '@sideway/pinpoint@2.0.0': {} - - '@simonwep/pickr@1.8.2': - dependencies: - core-js: 3.49.0 - nanopop: 2.4.2 - - '@sindresorhus/is@4.6.0': {} - - '@soda/friendly-errors-webpack-plugin@1.8.1(webpack@5.106.2)': - dependencies: - chalk: 3.0.0 - error-stack-parser: 2.1.4 - string-width: 4.2.3 - strip-ansi: 6.0.1 - webpack: 5.106.2 - - '@soda/get-current-script@1.0.2': {} - - '@starknt/shutdown-handler-napi-darwin-arm64@0.0.3': - optional: true - - '@starknt/shutdown-handler-napi-linux-arm64-gnu@0.0.3': - optional: true - - '@starknt/shutdown-handler-napi-linux-x64-gnu@0.0.3': - optional: true - - '@starknt/shutdown-handler-napi-win32-arm64-msvc@0.0.3': - optional: true - - '@starknt/shutdown-handler-napi-win32-ia32-msvc@0.0.3': - optional: true - - '@starknt/shutdown-handler-napi-win32-x64-msvc@0.0.3': - optional: true - - '@starknt/shutdown-handler-napi@0.0.3': - optionalDependencies: - '@starknt/shutdown-handler-napi-darwin-arm64': 0.0.3 - '@starknt/shutdown-handler-napi-linux-arm64-gnu': 0.0.3 - '@starknt/shutdown-handler-napi-linux-x64-gnu': 0.0.3 - '@starknt/shutdown-handler-napi-win32-arm64-msvc': 0.0.3 - '@starknt/shutdown-handler-napi-win32-ia32-msvc': 0.0.3 - '@starknt/shutdown-handler-napi-win32-x64-msvc': 0.0.3 - - '@starknt/sysproxy-darwin-x64@0.0.3': - optional: true - - '@starknt/sysproxy-linux-x64-gnu@0.0.3': - optional: true - - '@starknt/sysproxy-win32-x64-msvc@0.0.3': - optional: true - - '@starknt/sysproxy@0.0.3': - optionalDependencies: - '@starknt/sysproxy-darwin-x64': 0.0.3 - '@starknt/sysproxy-linux-x64-gnu': 0.0.3 - '@starknt/sysproxy-win32-x64-msvc': 0.0.3 - - '@stylistic/eslint-plugin@2.13.0(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/utils': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.2.1(jiti@2.6.1) - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - estraverse: 5.3.0 - picomatch: 4.0.4 - transitivePeerDependencies: - - supports-color - - typescript - - '@szmarczak/http-timer@4.0.6': - dependencies: - defer-to-connect: 2.0.1 - - '@tokenizer/token@0.3.0': {} - - '@tootallnate/once@2.0.0': {} - - '@tybys/wasm-util@0.10.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@types/body-parser@1.19.6': - dependencies: - '@types/connect': 3.4.38 - '@types/node': 25.6.0 - - '@types/bonjour@3.5.13': - dependencies: - '@types/node': 25.6.0 - - '@types/cacheable-request@6.0.3': - dependencies: - '@types/http-cache-semantics': 4.2.0 - '@types/keyv': 3.1.4 - '@types/node': 24.12.2 - '@types/responselike': 1.0.3 - - '@types/connect-history-api-fallback@1.5.4': - dependencies: - '@types/express-serve-static-core': 5.1.1 - '@types/node': 25.6.0 - - '@types/connect@3.4.38': - dependencies: - '@types/node': 25.6.0 - - '@types/debug@4.1.13': - dependencies: - '@types/ms': 2.1.0 - - '@types/eslint-scope@3.7.7': - dependencies: - '@types/eslint': 9.6.1 - '@types/estree': 1.0.8 - - '@types/eslint@9.6.1': - dependencies: - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - - '@types/esrecurse@4.3.1': {} - - '@types/estree@1.0.8': {} - - '@types/express-serve-static-core@4.19.8': - dependencies: - '@types/node': 25.6.0 - '@types/qs': 6.15.0 - '@types/range-parser': 1.2.7 - '@types/send': 1.2.1 - - '@types/express-serve-static-core@5.1.1': - dependencies: - '@types/node': 25.6.0 - '@types/qs': 6.15.0 - '@types/range-parser': 1.2.7 - '@types/send': 1.2.1 - - '@types/express@4.17.25': - dependencies: - '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.8 - '@types/qs': 6.15.0 - '@types/serve-static': 1.15.10 - - '@types/fs-extra@9.0.13': - dependencies: - '@types/node': 25.6.0 - - '@types/html-minifier-terser@6.1.0': {} - - '@types/http-cache-semantics@4.2.0': {} - - '@types/http-errors@2.0.5': {} - - '@types/http-proxy@1.17.17': - dependencies: - '@types/node': 25.6.0 - - '@types/json-schema@7.0.15': {} - - '@types/keyv@3.1.4': - dependencies: - '@types/node': 24.12.2 - - '@types/mdast@4.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/mime@1.3.5': {} - - '@types/minimist@1.2.5': {} - - '@types/ms@2.1.0': {} - - '@types/node-forge@1.3.14': - dependencies: - '@types/node': 25.6.0 - - '@types/node@16.9.1': {} - - '@types/node@24.12.2': - dependencies: - undici-types: 7.16.0 - - '@types/node@25.6.0': - dependencies: - undici-types: 7.19.2 - - '@types/normalize-package-data@2.4.4': {} - - '@types/parse-json@4.0.2': {} - - '@types/plist@3.0.5': - dependencies: - '@types/node': 25.6.0 - xmlbuilder: 15.1.1 - optional: true - - '@types/qs@6.15.0': {} - - '@types/range-parser@1.2.7': {} - - '@types/responselike@1.0.3': - dependencies: - '@types/node': 24.12.2 - - '@types/retry@0.12.0': {} - - '@types/send@0.17.6': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 25.6.0 - - '@types/send@1.2.1': - dependencies: - '@types/node': 25.6.0 - - '@types/serve-index@1.9.4': - dependencies: - '@types/express': 4.17.25 - - '@types/serve-static@1.15.10': - dependencies: - '@types/http-errors': 2.0.5 - '@types/node': 25.6.0 - '@types/send': 0.17.6 - - '@types/sockjs@0.3.36': - dependencies: - '@types/node': 25.6.0 - - '@types/unist@3.0.3': {} - - '@types/verror@1.10.11': - optional: true - - '@types/ws@8.18.1': - dependencies: - '@types/node': 25.6.0 - - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 24.12.2 - optional: true - - '@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.58.1 - '@typescript-eslint/type-utils': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.58.1 - eslint: 10.2.1(jiti@2.6.1) - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.58.1 - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.58.1 - debug: 4.4.3 - eslint: 10.2.1(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.58.1(typescript@5.9.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@5.9.3) - '@typescript-eslint/types': 8.58.1 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.58.1': - dependencies: - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/visitor-keys': 8.58.1 - - '@typescript-eslint/tsconfig-utils@8.58.1(typescript@5.9.3)': - dependencies: - typescript: 5.9.3 - - '@typescript-eslint/type-utils@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) - debug: 4.4.3 - eslint: 10.2.1(jiti@2.6.1) - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@8.58.1': {} - - '@typescript-eslint/typescript-estree@8.58.1(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.58.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@5.9.3) - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/visitor-keys': 8.58.1 - debug: 4.4.3 - minimatch: 10.2.5 - semver: 7.7.4 - tinyglobby: 0.2.16 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.58.1 - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3) - eslint: 10.2.1(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.58.1': - dependencies: - '@typescript-eslint/types': 8.58.1 - eslint-visitor-keys: 5.0.1 - - '@ungap/promise-all-settled@1.1.2': {} - - '@unrs/resolver-binding-android-arm-eabi@1.11.1': - optional: true - - '@unrs/resolver-binding-android-arm64@1.11.1': - optional: true - - '@unrs/resolver-binding-darwin-arm64@1.11.1': - optional: true - - '@unrs/resolver-binding-darwin-x64@1.11.1': - optional: true - - '@unrs/resolver-binding-freebsd-x64@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-x64-musl@1.11.1': - optional: true - - '@unrs/resolver-binding-wasm32-wasi@1.11.1': - dependencies: - '@napi-rs/wasm-runtime': 0.2.12 - optional: true - - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - optional: true - - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - optional: true - - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - optional: true - - '@vitest/eslint-plugin@1.6.15(@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.58.1 - '@typescript-eslint/utils': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.2.1(jiti@2.6.1) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@vscode/sudo-prompt@9.3.2': {} - - '@vue/babel-helper-vue-jsx-merge-props@1.4.0': {} - - '@vue/babel-helper-vue-transform-on@1.5.0': {} - - '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.29.0)': - dependencies: - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@vue/babel-helper-vue-transform-on': 1.5.0 - '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.29.0) - '@vue/shared': 3.5.33 - optionalDependencies: - '@babel/core': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.29.0)': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/parser': 7.29.2 - '@vue/compiler-sfc': 3.5.33 - transitivePeerDependencies: - - supports-color - - '@vue/babel-plugin-transform-vue-jsx@1.4.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@vue/babel-helper-vue-jsx-merge-props': 1.4.0 - html-tags: 2.0.0 - lodash.kebabcase: 4.1.1 - svg-tags: 1.0.0 - transitivePeerDependencies: - - supports-color - - '@vue/babel-preset-app@5.0.9(@babel/core@7.29.0)(core-js@3.49.0)(vue@3.5.33(typescript@5.9.3))': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-imports': 7.28.6 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.29.0) - '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.0) - '@babel/preset-env': 7.29.2(@babel/core@7.29.0) - '@babel/runtime': 7.29.2 - '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.29.0) - '@vue/babel-preset-jsx': 1.4.0(@babel/core@7.29.0)(vue@3.5.33(typescript@5.9.3)) - babel-plugin-dynamic-import-node: 2.3.3 - core-js-compat: 3.49.0 - semver: 7.7.4 - optionalDependencies: - core-js: 3.49.0 - vue: 3.5.33(typescript@5.9.3) - transitivePeerDependencies: - - supports-color - - '@vue/babel-preset-jsx@1.4.0(@babel/core@7.29.0)(vue@3.5.33(typescript@5.9.3))': - dependencies: - '@babel/core': 7.29.0 - '@vue/babel-helper-vue-jsx-merge-props': 1.4.0 - '@vue/babel-plugin-transform-vue-jsx': 1.4.0(@babel/core@7.29.0) - '@vue/babel-sugar-composition-api-inject-h': 1.4.0(@babel/core@7.29.0) - '@vue/babel-sugar-composition-api-render-instance': 1.4.0(@babel/core@7.29.0) - '@vue/babel-sugar-functional-vue': 1.4.0(@babel/core@7.29.0) - '@vue/babel-sugar-inject-h': 1.4.0(@babel/core@7.29.0) - '@vue/babel-sugar-v-model': 1.4.0(@babel/core@7.29.0) - '@vue/babel-sugar-v-on': 1.4.0(@babel/core@7.29.0) - optionalDependencies: - vue: 3.5.33(typescript@5.9.3) - transitivePeerDependencies: - - supports-color - - '@vue/babel-sugar-composition-api-inject-h@1.4.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - - '@vue/babel-sugar-composition-api-render-instance@1.4.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - - '@vue/babel-sugar-functional-vue@1.4.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - - '@vue/babel-sugar-inject-h@1.4.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - - '@vue/babel-sugar-v-model@1.4.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@vue/babel-helper-vue-jsx-merge-props': 1.4.0 - '@vue/babel-plugin-transform-vue-jsx': 1.4.0(@babel/core@7.29.0) - camelcase: 5.3.1 - html-tags: 2.0.0 - svg-tags: 1.0.0 - transitivePeerDependencies: - - supports-color - - '@vue/babel-sugar-v-on@1.4.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@vue/babel-plugin-transform-vue-jsx': 1.4.0(@babel/core@7.29.0) - camelcase: 5.3.1 - transitivePeerDependencies: - - supports-color - - '@vue/cli-overlay@5.0.9': {} - - '@vue/cli-plugin-babel@5.0.9(@vue/cli-service@5.0.9(@vue/compiler-sfc@3.5.33)(ejs@3.1.10)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.18.1)(sass-loader@16.0.7(sass@1.99.0)(webpack@5.106.2))(underscore@1.13.8)(vue-template-compiler@2.7.16)(vue@3.5.33(typescript@5.9.3))(webpack-sources@3.4.0))(core-js@3.49.0)(encoding@0.1.13)(vue@3.5.33(typescript@5.9.3))': - dependencies: - '@babel/core': 7.29.0 - '@vue/babel-preset-app': 5.0.9(@babel/core@7.29.0)(core-js@3.49.0)(vue@3.5.33(typescript@5.9.3)) - '@vue/cli-service': 5.0.9(@vue/compiler-sfc@3.5.33)(ejs@3.1.10)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.18.1)(sass-loader@16.0.7(sass@1.99.0)(webpack@5.106.2))(underscore@1.13.8)(vue-template-compiler@2.7.16)(vue@3.5.33(typescript@5.9.3))(webpack-sources@3.4.0) - '@vue/cli-shared-utils': 5.0.9(encoding@0.1.13) - babel-loader: 8.4.1(@babel/core@7.29.0)(webpack@5.106.2) - thread-loader: 3.0.4(webpack@5.106.2) - webpack: 5.106.2 - transitivePeerDependencies: - - '@swc/core' - - core-js - - encoding - - esbuild - - supports-color - - uglify-js - - vue - - webpack-cli - - '@vue/cli-plugin-router@5.0.9(@vue/cli-service@5.0.9(@vue/compiler-sfc@3.5.33)(ejs@3.1.10)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.18.1)(sass-loader@16.0.7(sass@1.99.0)(webpack@5.106.2))(underscore@1.13.8)(vue-template-compiler@2.7.16)(vue@3.5.33(typescript@5.9.3))(webpack-sources@3.4.0))(encoding@0.1.13)': - dependencies: - '@vue/cli-service': 5.0.9(@vue/compiler-sfc@3.5.33)(ejs@3.1.10)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.18.1)(sass-loader@16.0.7(sass@1.99.0)(webpack@5.106.2))(underscore@1.13.8)(vue-template-compiler@2.7.16)(vue@3.5.33(typescript@5.9.3))(webpack-sources@3.4.0) - '@vue/cli-shared-utils': 5.0.9(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - '@vue/cli-plugin-vuex@5.0.9(@vue/cli-service@5.0.9(@vue/compiler-sfc@3.5.33)(ejs@3.1.10)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.18.1)(sass-loader@16.0.7(sass@1.99.0)(webpack@5.106.2))(underscore@1.13.8)(vue-template-compiler@2.7.16)(vue@3.5.33(typescript@5.9.3))(webpack-sources@3.4.0))': - dependencies: - '@vue/cli-service': 5.0.9(@vue/compiler-sfc@3.5.33)(ejs@3.1.10)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.18.1)(sass-loader@16.0.7(sass@1.99.0)(webpack@5.106.2))(underscore@1.13.8)(vue-template-compiler@2.7.16)(vue@3.5.33(typescript@5.9.3))(webpack-sources@3.4.0) - - '@vue/cli-service@5.0.9(@vue/compiler-sfc@3.5.33)(ejs@3.1.10)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.18.1)(sass-loader@16.0.7(sass@1.99.0)(webpack@5.106.2))(underscore@1.13.8)(vue-template-compiler@2.7.16)(vue@3.5.33(typescript@5.9.3))(webpack-sources@3.4.0)': - dependencies: - '@babel/helper-compilation-targets': 7.28.6 - '@soda/friendly-errors-webpack-plugin': 1.8.1(webpack@5.106.2) - '@soda/get-current-script': 1.0.2 - '@types/minimist': 1.2.5 - '@vue/cli-overlay': 5.0.9 - '@vue/cli-plugin-router': 5.0.9(@vue/cli-service@5.0.9(@vue/compiler-sfc@3.5.33)(ejs@3.1.10)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.18.1)(sass-loader@16.0.7(sass@1.99.0)(webpack@5.106.2))(underscore@1.13.8)(vue-template-compiler@2.7.16)(vue@3.5.33(typescript@5.9.3))(webpack-sources@3.4.0))(encoding@0.1.13) - '@vue/cli-plugin-vuex': 5.0.9(@vue/cli-service@5.0.9(@vue/compiler-sfc@3.5.33)(ejs@3.1.10)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.18.1)(sass-loader@16.0.7(sass@1.99.0)(webpack@5.106.2))(underscore@1.13.8)(vue-template-compiler@2.7.16)(vue@3.5.33(typescript@5.9.3))(webpack-sources@3.4.0)) - '@vue/cli-shared-utils': 5.0.9(encoding@0.1.13) - '@vue/component-compiler-utils': 3.3.0(ejs@3.1.10)(handlebars@4.7.8)(lodash@4.18.1)(underscore@1.13.8) - '@vue/vue-loader-v15': vue-loader@15.11.1(@vue/compiler-sfc@3.5.33)(css-loader@6.11.0(webpack@5.106.2))(ejs@3.1.10)(handlebars@4.7.8)(lodash@4.18.1)(underscore@1.13.8)(vue-template-compiler@2.7.16)(webpack@5.106.2) - '@vue/web-component-wrapper': 1.3.0 - acorn: 8.16.0 - acorn-walk: 8.3.5 - address: 1.2.2 - autoprefixer: 10.5.0(postcss@8.5.10) - browserslist: 4.28.2 - case-sensitive-paths-webpack-plugin: 2.4.0 - cli-highlight: 2.1.11 - clipboardy: 2.3.0 - cliui: 7.0.4 - copy-webpack-plugin: 9.1.0(webpack@5.106.2) - css-loader: 6.11.0(webpack@5.106.2) - css-minimizer-webpack-plugin: 3.4.1(webpack@5.106.2) - cssnano: 5.1.15(postcss@8.5.10) - debug: 4.4.3 - default-gateway: 6.0.3 - dotenv: 10.0.0 - dotenv-expand: 5.1.0 - fs-extra: 9.1.0 - globby: 11.1.0 - hash-sum: 2.0.0 - html-webpack-plugin: 5.6.7(webpack@5.106.2) - is-file-esm: 1.0.0 - launch-editor-middleware: 2.13.2 - lodash.defaultsdeep: 4.6.1 - lodash.mapvalues: 4.6.0 - mini-css-extract-plugin: 2.10.2(webpack@5.106.2) - minimist: 1.2.8 - module-alias: 2.3.4 - portfinder: 1.0.38 - postcss: 8.5.10 - postcss-loader: 6.2.1(postcss@8.5.10)(webpack@5.106.2) - progress-webpack-plugin: 1.0.16(webpack@5.106.2) - ssri: 8.0.1 - terser-webpack-plugin: 5.5.0(webpack@5.106.2) - thread-loader: 3.0.4(webpack@5.106.2) - vue-loader: 17.4.2(@vue/compiler-sfc@3.5.33)(vue@3.5.33(typescript@5.9.3))(webpack@5.106.2) - vue-style-loader: 4.1.3 - webpack: 5.106.2 - webpack-bundle-analyzer: 4.10.2 - webpack-chain: 6.5.1 - webpack-dev-server: 4.15.2(debug@4.4.3)(webpack@5.106.2) - webpack-merge: 5.10.0 - webpack-virtual-modules: 0.4.6 - whatwg-fetch: 3.6.20 - optionalDependencies: - sass-loader: 16.0.7(sass@1.99.0)(webpack@5.106.2) - vue-template-compiler: 2.7.16 - webpack-sources: 3.4.0 - transitivePeerDependencies: - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@vue/compiler-sfc' - - arc-templates - - atpl - - babel-core - - bracket-template - - bufferutil - - clean-css - - coffee-script - - csso - - dot - - dust - - dustjs-helpers - - dustjs-linkedin - - eco - - ect - - ejs - - encoding - - esbuild - - haml-coffee - - hamlet - - hamljs - - handlebars - - hogan.js - - htmling - - jade - - jazz - - jqtpl - - just - - liquid-node - - liquor - - lodash - - marko - - mote - - mustache - - nunjucks - - plates - - prettier - - pug - - qejs - - ractive - - razor-tmpl - - react - - react-dom - - slm - - squirrelly - - supports-color - - swig - - swig-templates - - teacup - - templayed - - then-jade - - then-pug - - tinyliquid - - toffee - - twig - - twing - - uglify-js - - underscore - - utf-8-validate - - vash - - velocityjs - - vue - - walrus - - webpack-cli - - whiskers - - '@vue/cli-shared-utils@5.0.9(encoding@0.1.13)': - dependencies: - '@achrinza/node-ipc': 9.2.10 - chalk: 4.1.2 - execa: 1.0.0 - joi: 17.13.3 - launch-editor: 2.13.2 - lru-cache: 6.0.0 - node-fetch: 2.7.0(encoding@0.1.13) - open: 8.4.2 - ora: 5.4.1 - read-pkg: 5.2.0 - semver: 7.7.4 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - encoding - - '@vue/compiler-core@3.5.33': - dependencies: - '@babel/parser': 7.29.2 - '@vue/shared': 3.5.33 - entities: 7.0.1 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - - '@vue/compiler-dom@3.5.33': - dependencies: - '@vue/compiler-core': 3.5.33 - '@vue/shared': 3.5.33 - - '@vue/compiler-sfc@3.5.33': - dependencies: - '@babel/parser': 7.29.2 - '@vue/compiler-core': 3.5.33 - '@vue/compiler-dom': 3.5.33 - '@vue/compiler-ssr': 3.5.33 - '@vue/shared': 3.5.33 - estree-walker: 2.0.2 - magic-string: 0.30.21 - postcss: 8.5.10 - source-map-js: 1.2.1 - - '@vue/compiler-ssr@3.5.33': - dependencies: - '@vue/compiler-dom': 3.5.33 - '@vue/shared': 3.5.33 - - '@vue/component-compiler-utils@3.3.0(ejs@3.1.10)(handlebars@4.7.8)(lodash@4.18.1)(underscore@1.13.8)': - dependencies: - consolidate: 0.15.1(ejs@3.1.10)(handlebars@4.7.8)(lodash@4.18.1)(underscore@1.13.8) - hash-sum: 1.0.2 - lru-cache: 4.1.5 - merge-source-map: 1.1.0 - postcss: 7.0.39 - postcss-selector-parser: 6.1.2 - source-map: 0.6.1 - vue-template-es2015-compiler: 1.9.1 - optionalDependencies: - prettier: 2.8.8 - transitivePeerDependencies: - - arc-templates - - atpl - - babel-core - - bracket-template - - coffee-script - - dot - - dust - - dustjs-helpers - - dustjs-linkedin - - eco - - ect - - ejs - - haml-coffee - - hamlet - - hamljs - - handlebars - - hogan.js - - htmling - - jade - - jazz - - jqtpl - - just - - liquid-node - - liquor - - lodash - - marko - - mote - - mustache - - nunjucks - - plates - - pug - - qejs - - ractive - - razor-tmpl - - react - - react-dom - - slm - - squirrelly - - swig - - swig-templates - - teacup - - templayed - - then-jade - - then-pug - - tinyliquid - - toffee - - twig - - twing - - underscore - - vash - - velocityjs - - walrus - - whiskers - - '@vue/devtools-api@6.6.4': {} - - '@vue/reactivity@3.5.33': - dependencies: - '@vue/shared': 3.5.33 - - '@vue/runtime-core@3.5.33': - dependencies: - '@vue/reactivity': 3.5.33 - '@vue/shared': 3.5.33 - - '@vue/runtime-dom@3.5.33': - dependencies: - '@vue/reactivity': 3.5.33 - '@vue/runtime-core': 3.5.33 - '@vue/shared': 3.5.33 - csstype: 3.2.3 - - '@vue/server-renderer@3.5.33(vue@3.5.33(typescript@5.9.3))': - dependencies: - '@vue/compiler-ssr': 3.5.33 - '@vue/shared': 3.5.33 - vue: 3.5.33(typescript@5.9.3) - - '@vue/shared@3.5.33': {} - - '@vue/web-component-wrapper@1.3.0': {} - - '@webassemblyjs/ast@1.14.1': - dependencies: - '@webassemblyjs/helper-numbers': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - - '@webassemblyjs/helper-api-error@1.13.2': {} - - '@webassemblyjs/helper-buffer@1.14.1': {} - - '@webassemblyjs/helper-numbers@1.13.2': - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.13.2 - '@webassemblyjs/helper-api-error': 1.13.2 - '@xtuc/long': 4.2.2 - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - - '@webassemblyjs/helper-wasm-section@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/wasm-gen': 1.14.1 - - '@webassemblyjs/ieee754@1.13.2': - dependencies: - '@xtuc/ieee754': 1.2.0 - - '@webassemblyjs/leb128@1.13.2': - dependencies: - '@xtuc/long': 4.2.2 - - '@webassemblyjs/utf8@1.13.2': {} - - '@webassemblyjs/wasm-edit@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/helper-wasm-section': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-opt': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wast-printer': 1.14.1 - - '@webassemblyjs/wasm-gen@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wasm-opt@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - - '@webassemblyjs/wasm-parser@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-api-error': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wast-printer@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@xtuc/long': 4.2.2 - - '@xmldom/xmldom@0.8.13': {} - - '@xtuc/ieee754@1.2.0': {} - - '@xtuc/long@4.2.2': {} - - abbrev@1.1.1: {} - - abbrev@4.0.0: {} - - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - - accept@3.1.3: - dependencies: - boom: 7.3.0 - hoek: 6.1.3 - - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - acorn-import-phases@1.0.4(acorn@8.16.0): - dependencies: - acorn: 8.16.0 - - acorn-jsx@5.3.2(acorn@8.16.0): - dependencies: - acorn: 8.16.0 - - acorn-walk@8.3.5: - dependencies: - acorn: 8.16.0 - - acorn@8.16.0: {} - - address@1.2.2: {} - - adm-zip@0.5.17: {} - - agent-base@6.0.2: - dependencies: - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - agent-base@7.1.4: {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - - ajv-formats@2.1.1(ajv@8.18.0): - optionalDependencies: - ajv: 8.18.0 - - ajv-keywords@3.5.2(ajv@6.15.0): - dependencies: - ajv: 6.15.0 - - ajv-keywords@5.1.0(ajv@8.18.0): - dependencies: - ajv: 8.18.0 - fast-deep-equal: 3.1.3 - - ajv@6.14.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ajv@6.15.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ajv@8.18.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - ansi-colors@4.1.1: {} - - ansi-escapes@3.2.0: {} - - ansi-html-community@0.0.8: {} - - ansi-regex@2.1.1: {} - - ansi-regex@3.0.1: {} - - ansi-regex@5.0.1: {} - - ansi-regex@6.2.2: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.3: {} - - ant-design-vue@4.2.6(vue@3.5.33(typescript@5.9.3)): - dependencies: - '@ant-design/colors': 6.0.0 - '@ant-design/icons-vue': 7.0.1(vue@3.5.33(typescript@5.9.3)) - '@babel/runtime': 7.29.2 - '@ctrl/tinycolor': 3.6.1 - '@emotion/hash': 0.9.2 - '@emotion/unitless': 0.8.1 - '@simonwep/pickr': 1.8.2 - array-tree-filter: 2.1.0 - async-validator: 4.2.5 - csstype: 3.2.3 - dayjs: 1.11.20 - dom-align: 1.12.4 - dom-scroll-into-view: 2.0.1 - lodash: 4.18.1 - lodash-es: 4.18.1 - resize-observer-polyfill: 1.5.1 - scroll-into-view-if-needed: 2.2.31 - shallow-equal: 1.2.1 - stylis: 4.4.0 - throttle-debounce: 5.0.2 - vue: 3.5.33(typescript@5.9.3) - vue-types: 3.0.2(vue@3.5.33(typescript@5.9.3)) - warning: 4.0.3 - - any-base@1.1.0: {} - - any-promise@1.3.0: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.2 - - app-builder-bin@5.0.0-alpha.10: {} - - app-builder-bin@5.0.0-alpha.12: {} - - app-builder-lib@25.1.8(dmg-builder@26.8.1)(electron-builder-squirrel-windows@25.1.8): - dependencies: - '@develar/schema-utils': 2.6.5 - '@electron/notarize': 2.5.0 - '@electron/osx-sign': 1.3.1 - '@electron/rebuild': 3.6.1 - '@electron/universal': 2.0.1 - '@malept/flatpak-bundler': 0.4.0 - '@types/fs-extra': 9.0.13 - async-exit-hook: 2.0.1 - bluebird-lst: 1.0.9 - builder-util: 25.1.7 - builder-util-runtime: 9.2.10 - chromium-pickle-js: 0.2.0 - config-file-ts: 0.2.8-rc1 - debug: 4.4.3 - dmg-builder: 26.8.1(electron-builder-squirrel-windows@25.1.8) - dotenv: 16.6.1 - dotenv-expand: 11.0.7 - ejs: 3.1.10 - electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.8.1) - electron-publish: 25.1.7 - form-data: 4.0.5 - fs-extra: 10.1.0 - hosted-git-info: 4.1.0 - is-ci: 3.0.1 - isbinaryfile: 5.0.7 - js-yaml: 4.1.1 - json5: 2.2.3 - lazy-val: 1.0.5 - minimatch: 10.2.5 - resedit: 1.7.2 - sanitize-filename: 1.6.4 - semver: 7.7.4 - tar: 6.2.1 - temp-file: 3.4.0 - transitivePeerDependencies: - - bluebird - - supports-color - - app-builder-lib@26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@25.1.8): - dependencies: - '@develar/schema-utils': 2.6.5 - '@electron/asar': 3.4.1 - '@electron/fuses': 1.8.0 - '@electron/get': 3.1.0 - '@electron/notarize': 2.5.0 - '@electron/osx-sign': 1.3.3 - '@electron/rebuild': 4.0.4 - '@electron/universal': 2.0.3 - '@malept/flatpak-bundler': 0.4.0 - '@types/fs-extra': 9.0.13 - async-exit-hook: 2.0.1 - builder-util: 26.8.1 - builder-util-runtime: 9.5.1 - chromium-pickle-js: 0.2.0 - ci-info: 4.3.1 - debug: 4.4.3 - dmg-builder: 26.8.1(electron-builder-squirrel-windows@25.1.8) - dotenv: 16.6.1 - dotenv-expand: 11.0.7 - ejs: 3.1.10 - electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.8.1) - electron-publish: 26.8.1 - fs-extra: 10.1.0 - hosted-git-info: 4.1.0 - isbinaryfile: 5.0.7 - jiti: 2.6.1 - js-yaml: 4.1.1 - json5: 2.2.3 - lazy-val: 1.0.5 - minimatch: 10.2.5 - plist: 3.1.0 - proper-lockfile: 4.1.2 - resedit: 1.7.2 - semver: 7.7.4 - tar: 7.5.13 - temp-file: 3.4.0 - tiny-async-pool: 1.3.0 - which: 5.0.0 - transitivePeerDependencies: - - supports-color - - aproba@2.1.0: {} - - arch@2.2.0: {} - - archiver-utils@2.1.0: - dependencies: - glob: 7.2.3 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 - normalize-path: 3.0.0 - readable-stream: 2.3.8 - - archiver-utils@3.0.4: - dependencies: - glob: 7.2.3 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 - normalize-path: 3.0.0 - readable-stream: 3.6.2 - - archiver-utils@5.0.2: - dependencies: - glob: 10.5.0 - graceful-fs: 4.2.11 - is-stream: 2.0.1 - lazystream: 1.0.1 - lodash: 4.18.1 - normalize-path: 3.0.0 - readable-stream: 4.7.0 - - archiver@5.3.2: - dependencies: - archiver-utils: 2.1.0 - async: 3.2.6 - buffer-crc32: 0.2.13 - readable-stream: 3.6.2 - readdir-glob: 1.1.3 - tar-stream: 2.2.0 - zip-stream: 4.1.1 - - archiver@7.0.1: - dependencies: - archiver-utils: 5.0.2 - async: 3.2.6 - buffer-crc32: 1.0.0 - readable-stream: 4.7.0 - readdir-glob: 1.1.3 - tar-stream: 3.2.0 - zip-stream: 6.0.1 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - are-docs-informative@0.0.2: {} - - are-we-there-yet@3.0.1: - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - - argparse@2.0.1: {} - - args@5.0.3: - dependencies: - camelcase: 5.0.0 - chalk: 2.4.2 - leven: 2.1.0 - mri: 1.1.4 - - array-flatten@1.1.1: {} - - array-tree-filter@2.1.0: {} - - array-union@2.1.0: {} - - asn1@0.2.6: - dependencies: - safer-buffer: 2.1.2 - - assert-plus@1.0.0: {} - - assertion-error@1.1.0: {} - - astral-regex@2.0.0: - optional: true - - async-exit-hook@2.0.1: {} - - async-validator@4.2.5: {} - - async@3.2.6: {} - - asynckit@0.4.0: {} - - at-least-node@1.0.0: {} - - autoprefixer@10.5.0(postcss@8.5.10): - dependencies: - browserslist: 4.28.2 - caniuse-lite: 1.0.30001790 - fraction.js: 5.3.4 - picocolors: 1.1.1 - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - - aws-sign2@0.7.0: {} - - aws4@1.13.2: {} - - axios@1.15.0: - dependencies: - follow-redirects: 1.16.0(debug@4.4.3) - form-data: 4.0.5 - proxy-from-env: 2.1.0 - transitivePeerDependencies: - - debug - - b4a@1.8.0: {} - - babel-loader@8.4.1(@babel/core@7.29.0)(webpack@5.106.2): - dependencies: - '@babel/core': 7.29.0 - find-cache-dir: 3.3.2 - loader-utils: 2.0.4 - make-dir: 3.1.0 - schema-utils: 2.7.1 - webpack: 5.106.2 - - babel-plugin-dynamic-import-node@2.3.3: - dependencies: - object.assign: 4.1.7 - - babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.0): - dependencies: - '@babel/compat-data': 7.29.0 - '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.0): - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) - core-js-compat: 3.49.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.0): - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) - core-js-compat: 3.49.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.0): - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) - transitivePeerDependencies: - - supports-color - - baidu-aip-sdk@4.16.16: - dependencies: - debug: 2.6.9 - iconv-lite: 0.4.24 - request: 2.88.2 - underscore: 1.13.8 - optionalDependencies: - mocha: 4.1.0 - should: 13.2.3 - transitivePeerDependencies: - - supports-color - - balanced-match@1.0.2: {} - - balanced-match@4.0.4: {} - - bare-events@2.8.2: {} - - bare-fs@4.7.1: - dependencies: - bare-events: 2.8.2 - bare-path: 3.0.0 - bare-stream: 2.13.1(bare-events@2.8.2) - bare-url: 2.4.2 - fast-fifo: 1.3.2 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - - bare-os@3.9.0: {} - - bare-path@3.0.0: - dependencies: - bare-os: 3.9.0 - - bare-stream@2.13.1(bare-events@2.8.2): - dependencies: - streamx: 2.25.0 - teex: 1.0.1 - optionalDependencies: - bare-events: 2.8.2 - transitivePeerDependencies: - - react-native-b4a - - bare-url@2.4.2: - dependencies: - bare-path: 3.0.0 - - base64-js@1.5.1: {} - - baseline-browser-mapping@2.10.21: {} - - batch@0.6.1: {} - - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 - - big.js@5.2.2: {} - - binary-extensions@2.3.0: {} - - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - bluebird-lst@1.0.9: - dependencies: - bluebird: 3.7.2 - - bluebird@3.7.2: {} - - bmp-js@0.1.0: {} - - body-parser@1.20.4: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.14.2 - raw-body: 2.5.3 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - bonjour-service@1.3.0: - dependencies: - fast-deep-equal: 3.1.3 - multicast-dns: 7.2.5 - - boolbase@1.0.0: {} - - boolean@3.2.0: - optional: true - - boom@7.3.0: - dependencies: - hoek: 6.1.3 - - brace-expansion@1.1.14: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.1.0: - dependencies: - balanced-match: 1.0.2 - - brace-expansion@5.0.5: - dependencies: - balanced-match: 4.0.4 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.0: - optional: true - - browser-stdout@1.3.1: {} - - browserslist@4.28.2: - dependencies: - baseline-browser-mapping: 2.10.21 - caniuse-lite: 1.0.30001790 - electron-to-chromium: 1.5.344 - node-releases: 2.0.38 - update-browserslist-db: 1.2.3(browserslist@4.28.2) - - buffer-crc32@0.2.13: {} - - buffer-crc32@1.0.0: {} - - buffer-equal@0.0.1: {} - - buffer-from@1.1.2: {} - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - builder-util-runtime@9.2.10: - dependencies: - debug: 4.4.3 - sax: 1.6.0 - transitivePeerDependencies: - - supports-color - - builder-util-runtime@9.5.1: - dependencies: - debug: 4.4.3 - sax: 1.6.0 - transitivePeerDependencies: - - supports-color - - builder-util@25.1.7: - dependencies: - 7zip-bin: 5.2.0 - '@types/debug': 4.1.13 - app-builder-bin: 5.0.0-alpha.10 - bluebird-lst: 1.0.9 - builder-util-runtime: 9.2.10 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3 - fs-extra: 10.1.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - is-ci: 3.0.1 - js-yaml: 4.1.1 - source-map-support: 0.5.21 - stat-mode: 1.0.0 - temp-file: 3.4.0 - transitivePeerDependencies: - - supports-color - - builder-util@26.8.1: - dependencies: - 7zip-bin: 5.2.0 - '@types/debug': 4.1.13 - app-builder-bin: 5.0.0-alpha.12 - builder-util-runtime: 9.5.1 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3 - fs-extra: 10.1.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - js-yaml: 4.1.1 - sanitize-filename: 1.6.4 - source-map-support: 0.5.21 - stat-mode: 1.0.0 - temp-file: 3.4.0 - tiny-async-pool: 1.3.0 - transitivePeerDependencies: - - supports-color - - builtin-modules@3.3.0: {} - - bytes@3.1.2: {} - - cacache@16.1.3: - dependencies: - '@npmcli/fs': 2.1.2 - '@npmcli/move-file': 2.0.1 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 8.1.0 - infer-owner: 1.0.4 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.7 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 9.0.1 - tar: 6.2.1 - unique-filename: 2.0.1 - transitivePeerDependencies: - - bluebird - - cacheable-lookup@5.0.4: {} - - cacheable-request@7.0.4: - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.2.0 - keyv: 4.5.4 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bind@1.0.9: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - callsites@3.1.0: {} - - camel-case@4.1.2: - dependencies: - pascal-case: 3.1.2 - tslib: 2.8.1 - - camelcase@3.0.0: {} - - camelcase@5.0.0: {} - - camelcase@5.3.1: {} - - camelcase@6.3.0: {} - - caniuse-api@3.0.0: - dependencies: - browserslist: 4.28.2 - caniuse-lite: 1.0.30001790 - lodash.memoize: 4.1.2 - lodash.uniq: 4.5.0 - - caniuse-lite@1.0.30001790: {} - - case-sensitive-paths-webpack-plugin@2.4.0: {} - - caseless@0.12.0: {} - - ccount@2.0.1: {} - - centra@2.7.0: - dependencies: - follow-redirects: 1.16.0(debug@4.4.3) - transitivePeerDependencies: - - debug - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@3.0.0: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - character-entities@2.0.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.1: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.5.0 - optionalDependencies: - fsevents: 2.3.3 - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - - chownr@2.0.0: {} - - chownr@3.0.0: {} - - chrome-trace-event@1.0.4: {} - - chromium-pickle-js@0.2.0: {} - - ci-info@3.9.0: {} - - ci-info@4.3.1: {} - - ci-info@4.4.0: {} - - clean-css@5.3.3: - dependencies: - source-map: 0.6.1 - - clean-regexp@1.0.0: - dependencies: - escape-string-regexp: 1.0.5 - - clean-stack@2.2.0: {} - - cli-cursor@2.1.0: - dependencies: - restore-cursor: 2.0.0 - - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - - cli-highlight@2.1.11: - dependencies: - chalk: 4.1.2 - highlight.js: 10.7.3 - mz: 2.7.0 - parse5: 5.1.1 - parse5-htmlparser2-tree-adapter: 6.0.1 - yargs: 16.2.0 - - cli-spinners@2.9.2: {} - - cli-truncate@2.1.0: - dependencies: - slice-ansi: 3.0.0 - string-width: 4.2.3 - optional: true - - clipboardy@2.3.0: - dependencies: - arch: 2.2.0 - execa: 1.0.0 - is-wsl: 2.2.0 - - cliui@3.2.0: - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - wrap-ansi: 2.1.0 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - clone-deep@4.0.1: - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - - clone-response@1.0.3: - dependencies: - mimic-response: 1.0.1 - - clone@1.0.4: {} - - code-point-at@1.1.0: {} - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - color-support@1.1.3: {} - - colord@2.9.3: {} - - colorette@2.0.20: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - commander@2.11.0: - optional: true - - commander@2.20.3: {} - - commander@5.1.0: {} - - commander@6.2.1: {} - - commander@7.2.0: {} - - commander@8.3.0: {} - - comment-parser@1.4.1: {} - - comment-parser@1.4.6: {} - - commondir@1.0.1: {} - - compare-version@0.1.2: {} - - component-emitter@1.3.1: {} - - compress-commons@4.1.2: - dependencies: - buffer-crc32: 0.2.13 - crc32-stream: 4.0.3 - normalize-path: 3.0.0 - readable-stream: 3.6.2 - - compress-commons@6.0.2: - dependencies: - crc-32: 1.2.2 - crc32-stream: 6.0.0 - is-stream: 2.0.1 - normalize-path: 3.0.0 - readable-stream: 4.7.0 - - compressible@2.0.18: - dependencies: - mime-db: 1.54.0 - - compression@1.8.1: - dependencies: - bytes: 3.1.2 - compressible: 2.0.18 - debug: 2.6.9 - negotiator: 0.6.4 - on-headers: 1.1.0 - safe-buffer: 5.2.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - compute-scroll-into-view@1.0.20: {} - - concat-map@0.0.1: {} - - concat-stream@1.6.2: - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - - concurrently@8.2.2: - dependencies: - chalk: 4.1.2 - date-fns: 2.30.0 - lodash: 4.18.1 - rxjs: 7.8.2 - shell-quote: 1.8.3 - spawn-command: 0.0.2 - supports-color: 8.1.1 - tree-kill: 1.2.2 - yargs: 17.7.2 - - confbox@0.1.8: {} - - confbox@0.2.4: {} - - config-file-ts@0.2.8-rc1: - dependencies: - glob: 10.5.0 - typescript: 5.9.3 - - connect-history-api-fallback@2.0.0: {} - - console-control-strings@1.1.0: {} - - consolidate@0.15.1(ejs@3.1.10)(handlebars@4.7.8)(lodash@4.18.1)(underscore@1.13.8): - dependencies: - bluebird: 3.7.2 - optionalDependencies: - ejs: 3.1.10 - handlebars: 4.7.8 - lodash: 4.18.1 - underscore: 1.13.8 - - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - - convert-source-map@2.0.0: {} - - cookie-signature@1.0.7: {} - - cookie@0.7.2: {} - - cookiejar@2.1.4: {} - - copy-webpack-plugin@9.1.0(webpack@5.106.2): - dependencies: - fast-glob: 3.3.3 - glob-parent: 6.0.2 - globby: 11.1.0 - normalize-path: 3.0.0 - schema-utils: 3.3.0 - serialize-javascript: 6.0.2 - webpack: 5.106.2 - - core-js-compat@3.49.0: - dependencies: - browserslist: 4.28.2 - - core-js@3.49.0: {} - - core-util-is@1.0.2: {} - - core-util-is@1.0.3: {} - - cors@2.8.6: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - - cosmiconfig@7.1.0: - dependencies: - '@types/parse-json': 4.0.2 - import-fresh: 3.3.1 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.3 - - crc-32@1.2.2: {} - - crc32-stream@4.0.3: - dependencies: - crc-32: 1.2.2 - readable-stream: 3.6.2 - - crc32-stream@6.0.0: - dependencies: - crc-32: 1.2.2 - readable-stream: 4.7.0 - - crc@3.8.0: - dependencies: - buffer: 5.7.1 - optional: true - - cross-env@7.0.3: - dependencies: - cross-spawn: 7.0.6 - - cross-spawn@4.0.2: - dependencies: - lru-cache: 4.1.5 - which: 1.3.1 - - cross-spawn@6.0.6: - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - css-declaration-sorter@6.4.1(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - - css-loader@6.11.0(webpack@5.106.2): - dependencies: - icss-utils: 5.1.0(postcss@8.5.10) - postcss: 8.5.10 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.10) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.10) - postcss-modules-scope: 3.2.1(postcss@8.5.10) - postcss-modules-values: 4.0.0(postcss@8.5.10) - postcss-value-parser: 4.2.0 - semver: 7.7.4 - optionalDependencies: - webpack: 5.106.2 - - css-minimizer-webpack-plugin@3.4.1(webpack@5.106.2): - dependencies: - cssnano: 5.1.15(postcss@8.5.10) - jest-worker: 27.5.1 - postcss: 8.5.10 - schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - source-map: 0.6.1 - webpack: 5.106.2 - - css-select@4.3.0: - dependencies: - boolbase: 1.0.0 - css-what: 6.2.2 - domhandler: 4.3.1 - domutils: 2.8.0 - nth-check: 2.1.1 - - css-tree@1.1.3: - dependencies: - mdn-data: 2.0.14 - source-map: 0.6.1 - - css-what@6.2.2: {} - - cssesc@3.0.0: {} - - cssnano-preset-default@5.2.14(postcss@8.5.10): - dependencies: - css-declaration-sorter: 6.4.1(postcss@8.5.10) - cssnano-utils: 3.1.0(postcss@8.5.10) - postcss: 8.5.10 - postcss-calc: 8.2.4(postcss@8.5.10) - postcss-colormin: 5.3.1(postcss@8.5.10) - postcss-convert-values: 5.1.3(postcss@8.5.10) - postcss-discard-comments: 5.1.2(postcss@8.5.10) - postcss-discard-duplicates: 5.1.0(postcss@8.5.10) - postcss-discard-empty: 5.1.1(postcss@8.5.10) - postcss-discard-overridden: 5.1.0(postcss@8.5.10) - postcss-merge-longhand: 5.1.7(postcss@8.5.10) - postcss-merge-rules: 5.1.4(postcss@8.5.10) - postcss-minify-font-values: 5.1.0(postcss@8.5.10) - postcss-minify-gradients: 5.1.1(postcss@8.5.10) - postcss-minify-params: 5.1.4(postcss@8.5.10) - postcss-minify-selectors: 5.2.1(postcss@8.5.10) - postcss-normalize-charset: 5.1.0(postcss@8.5.10) - postcss-normalize-display-values: 5.1.0(postcss@8.5.10) - postcss-normalize-positions: 5.1.1(postcss@8.5.10) - postcss-normalize-repeat-style: 5.1.1(postcss@8.5.10) - postcss-normalize-string: 5.1.0(postcss@8.5.10) - postcss-normalize-timing-functions: 5.1.0(postcss@8.5.10) - postcss-normalize-unicode: 5.1.1(postcss@8.5.10) - postcss-normalize-url: 5.1.0(postcss@8.5.10) - postcss-normalize-whitespace: 5.1.1(postcss@8.5.10) - postcss-ordered-values: 5.1.3(postcss@8.5.10) - postcss-reduce-initial: 5.1.2(postcss@8.5.10) - postcss-reduce-transforms: 5.1.0(postcss@8.5.10) - postcss-svgo: 5.1.0(postcss@8.5.10) - postcss-unique-selectors: 5.1.1(postcss@8.5.10) - - cssnano-utils@3.1.0(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - - cssnano@5.1.15(postcss@8.5.10): - dependencies: - cssnano-preset-default: 5.2.14(postcss@8.5.10) - lilconfig: 2.1.0 - postcss: 8.5.10 - yaml: 1.10.3 - - csso@4.2.0: - dependencies: - css-tree: 1.1.3 - - csstype@3.2.3: {} - - dashdash@1.14.1: - dependencies: - assert-plus: 1.0.0 - - date-fns@2.30.0: - dependencies: - '@babel/runtime': 7.29.2 - - date-format@4.0.14: {} - - dayjs@1.11.20: {} - - de-indent@1.0.2: - optional: true - - debounce@1.2.1: {} - - debug@2.6.9: - dependencies: - ms: 2.0.0 - - debug@3.1.0(supports-color@4.4.0): - dependencies: - ms: 2.0.0 - optionalDependencies: - supports-color: 4.4.0 - optional: true - - debug@3.2.7: - dependencies: - ms: 2.1.3 - - debug@4.3.1(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - debug@4.4.3: - dependencies: - ms: 2.1.3 - - decamelize@1.2.0: {} - - decamelize@4.0.0: {} - - decode-named-character-reference@1.3.0: - dependencies: - character-entities: 2.0.2 - - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - deep-is@0.1.4: {} - - deepmerge@1.5.2: {} - - default-gateway@6.0.3: - dependencies: - execa: 5.1.1 - - default-shell@1.0.1: {} - - defaults@1.0.4: - dependencies: - clone: 1.0.4 - - defer-to-connect@2.0.1: {} - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - - define-lazy-prop@2.0.0: {} - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - del@6.1.1: - dependencies: - globby: 11.1.0 - graceful-fs: 4.2.11 - is-glob: 4.0.3 - is-path-cwd: 2.2.0 - is-path-inside: 3.0.3 - p-map: 4.0.0 - rimraf: 3.0.2 - slash: 3.0.0 - - delayed-stream@1.0.0: {} - - delegates@1.0.0: {} - - depd@1.1.2: {} - - depd@2.0.0: {} - - dequal@2.0.3: {} - - destroy@1.2.0: {} - - detect-libc@2.1.2: {} - - detect-node@2.1.0: {} - - devlop@1.1.0: - dependencies: - dequal: 2.0.3 - - diff-sequences@27.5.1: {} - - diff@3.3.1: - optional: true - - diff@5.0.0: {} - - dir-compare@4.2.0: - dependencies: - minimatch: 3.1.5 - p-limit: 3.1.0 - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - dmg-builder@26.8.1(electron-builder-squirrel-windows@25.1.8): - dependencies: - app-builder-lib: 26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@25.1.8) - builder-util: 26.8.1 - fs-extra: 10.1.0 - iconv-lite: 0.6.3 - js-yaml: 4.1.1 - optionalDependencies: - dmg-license: 1.0.11 - transitivePeerDependencies: - - electron-builder-squirrel-windows - - supports-color - - dmg-license@1.0.11: - dependencies: - '@types/plist': 3.0.5 - '@types/verror': 1.10.11 - ajv: 6.15.0 - crc: 3.8.0 - iconv-corefoundation: 1.1.7 - plist: 3.1.0 - smart-buffer: 4.2.0 - verror: 1.10.1 - optional: true - - dns-over-http@0.2.0: - dependencies: - accept: 3.1.3 - cors: 2.8.6 - debug: 3.2.7 - dns-packet: 4.2.0 - dns-socket: 3.0.0 - extend: 3.0.2 - lru-cache: 4.1.5 - qs: 6.15.1 - random-int: 1.0.0 - transitivePeerDependencies: - - supports-color - - dns-packet@4.2.0: - dependencies: - ip: 1.1.9 - safe-buffer: 5.2.1 - - dns-packet@5.6.1: - dependencies: - '@leichtgewicht/ip-codec': 2.0.5 - - dns-socket@3.0.0: - dependencies: - dns-packet: 4.2.0 - - dom-align@1.12.4: {} - - dom-converter@0.2.0: - dependencies: - utila: 0.4.0 - - dom-scroll-into-view@2.0.1: {} - - dom-serializer@1.4.1: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - - dom-walk@0.1.2: {} - - domelementtype@2.3.0: {} - - domhandler@4.3.1: - dependencies: - domelementtype: 2.3.0 - - domutils@2.8.0: - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - - dot-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.8.1 - - dotenv-expand@11.0.7: - dependencies: - dotenv: 16.6.1 - - dotenv-expand@5.1.0: {} - - dotenv@10.0.0: {} - - dotenv@16.6.1: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - duplexer@0.1.2: {} - - eastasianwidth@0.2.0: {} - - easy-stack@1.0.1: {} - - ecc-jsbn@0.1.2: - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - - ee-first@1.1.1: {} - - ejs@3.1.10: - dependencies: - jake: 10.9.4 - - electron-baidu-tongji@1.0.5: - dependencies: - superagent: 6.1.0 - transitivePeerDependencies: - - supports-color - - electron-builder-squirrel-windows@25.1.8(dmg-builder@26.8.1): - dependencies: - app-builder-lib: 25.1.8(dmg-builder@26.8.1)(electron-builder-squirrel-windows@25.1.8) - archiver: 5.3.2 - builder-util: 25.1.7 - fs-extra: 10.1.0 - transitivePeerDependencies: - - bluebird - - dmg-builder - - supports-color - - electron-builder@26.8.1(electron-builder-squirrel-windows@25.1.8): - dependencies: - app-builder-lib: 26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@25.1.8) - builder-util: 26.8.1 - builder-util-runtime: 9.5.1 - chalk: 4.1.2 - ci-info: 4.4.0 - dmg-builder: 26.8.1(electron-builder-squirrel-windows@25.1.8) - fs-extra: 10.1.0 - lazy-val: 1.0.5 - simple-update-notifier: 2.0.0 - yargs: 17.7.2 - transitivePeerDependencies: - - electron-builder-squirrel-windows - - supports-color - - electron-icon-builder@2.0.1: - dependencies: - args: 5.0.3 - icon-gen: 2.1.0 - jimp: 0.16.13 - transitivePeerDependencies: - - debug - - supports-color - - electron-publish@25.1.7: - dependencies: - '@types/fs-extra': 9.0.13 - builder-util: 25.1.7 - builder-util-runtime: 9.2.10 - chalk: 4.1.2 - fs-extra: 10.1.0 - lazy-val: 1.0.5 - mime: 2.6.0 - transitivePeerDependencies: - - supports-color - - electron-publish@26.8.1: - dependencies: - '@types/fs-extra': 9.0.13 - builder-util: 26.8.1 - builder-util-runtime: 9.5.1 - chalk: 4.1.2 - form-data: 4.0.5 - fs-extra: 10.1.0 - lazy-val: 1.0.5 - mime: 2.6.0 - transitivePeerDependencies: - - supports-color - - electron-to-chromium@1.5.344: {} - - electron-updater@6.8.3: - dependencies: - builder-util-runtime: 9.5.1 - fs-extra: 10.1.0 - js-yaml: 4.1.1 - lazy-val: 1.0.5 - lodash.escaperegexp: 4.1.2 - lodash.isequal: 4.5.0 - semver: 7.7.4 - tiny-typed-emitter: 2.1.0 - transitivePeerDependencies: - - supports-color - - electron@41.3.0: - dependencies: - '@electron/get': 2.0.3 - '@types/node': 24.12.2 - extract-zip: 2.0.1 - transitivePeerDependencies: - - supports-color - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - emojis-list@3.0.0: {} - - encodeurl@2.0.0: {} - - encoding@0.1.13: - dependencies: - iconv-lite: 0.6.3 - optional: true - - end-of-stream@1.4.5: - dependencies: - once: 1.4.0 - - enhanced-resolve@5.20.1: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.3 - - enhanced-resolve@5.21.0: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.3 - - entities@2.2.0: {} - - entities@7.0.1: {} - - env-paths@2.2.1: {} - - err-code@2.0.3: {} - - error-ex@1.3.4: - dependencies: - is-arrayish: 0.2.1 - - error-stack-parser@2.1.4: - dependencies: - stackframe: 1.3.4 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-module-lexer@2.0.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es6-error@4.1.1: - optional: true - - es6-promise@4.2.8: {} - - escalade@3.2.0: {} - - escape-html@1.0.3: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@4.0.0: {} - - escape-string-regexp@5.0.0: {} - - eslint-compat-utils@0.5.1(eslint@10.2.1(jiti@2.6.1)): - dependencies: - eslint: 10.2.1(jiti@2.6.1) - semver: 7.7.4 - - eslint-compat-utils@0.6.5(eslint@10.2.1(jiti@2.6.1)): - dependencies: - eslint: 10.2.1(jiti@2.6.1) - semver: 7.7.4 - - eslint-config-flat-gitignore@1.0.1(eslint@10.2.1(jiti@2.6.1)): - dependencies: - '@eslint/compat': 1.4.1(eslint@10.2.1(jiti@2.6.1)) - eslint: 10.2.1(jiti@2.6.1) - - eslint-flat-config-utils@1.1.0: - dependencies: - pathe: 2.0.3 - - eslint-formatting-reporter@0.0.0(eslint@10.2.1(jiti@2.6.1)): - dependencies: - eslint: 10.2.1(jiti@2.6.1) - prettier-linter-helpers: 1.0.1 - - eslint-import-context@0.1.9(unrs-resolver@1.11.1): - dependencies: - get-tsconfig: 4.13.7 - stable-hash-x: 0.2.0 - optionalDependencies: - unrs-resolver: 1.11.1 - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7 - is-core-module: 2.16.1 - resolve: 1.22.12 - transitivePeerDependencies: - - supports-color - optional: true - - eslint-json-compat-utils@0.2.3(eslint@10.2.1(jiti@2.6.1))(jsonc-eslint-parser@2.4.2): - dependencies: - eslint: 10.2.1(jiti@2.6.1) - esquery: 1.7.0 - jsonc-eslint-parser: 2.4.2 - - eslint-merge-processors@1.0.0(eslint@10.2.1(jiti@2.6.1)): - dependencies: - eslint: 10.2.1(jiti@2.6.1) - - eslint-parser-plain@0.1.1: {} - - eslint-plugin-antfu@2.7.0(eslint@10.2.1(jiti@2.6.1)): - dependencies: - '@antfu/utils': 0.7.10 - eslint: 10.2.1(jiti@2.6.1) - - eslint-plugin-command@2.1.0(eslint@10.2.1(jiti@2.6.1)): - dependencies: - '@es-joy/jsdoccomment': 0.50.2 - eslint: 10.2.1(jiti@2.6.1) - - eslint-plugin-es-x@7.8.0(eslint@10.2.1(jiti@2.6.1)): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.2 - eslint: 10.2.1(jiti@2.6.1) - eslint-compat-utils: 0.5.1(eslint@10.2.1(jiti@2.6.1)) - - eslint-plugin-format@0.1.3(eslint@10.2.1(jiti@2.6.1)): - dependencies: - '@dprint/formatter': 0.3.0 - '@dprint/markdown': 0.17.8 - '@dprint/toml': 0.6.4 - eslint: 10.2.1(jiti@2.6.1) - eslint-formatting-reporter: 0.0.0(eslint@10.2.1(jiti@2.6.1)) - eslint-parser-plain: 0.1.1 - prettier: 3.8.2 - synckit: 0.9.3 - - eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.2.1(jiti@2.6.1)): - dependencies: - '@package-json/types': 0.0.12 - '@typescript-eslint/types': 8.58.1 - comment-parser: 1.4.6 - debug: 4.4.3 - eslint: 10.2.1(jiti@2.6.1) - eslint-import-context: 0.1.9(unrs-resolver@1.11.1) - is-glob: 4.0.3 - minimatch: 10.2.5 - semver: 7.7.4 - stable-hash-x: 0.2.0 - unrs-resolver: 1.11.1 - optionalDependencies: - '@typescript-eslint/utils': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-plugin-jsdoc@50.8.0(eslint@10.2.1(jiti@2.6.1)): - dependencies: - '@es-joy/jsdoccomment': 0.50.2 - are-docs-informative: 0.0.2 - comment-parser: 1.4.1 - debug: 4.4.3 - escape-string-regexp: 4.0.0 - eslint: 10.2.1(jiti@2.6.1) - espree: 10.4.0 - esquery: 1.7.0 - parse-imports-exports: 0.2.4 - semver: 7.7.4 - spdx-expression-parse: 4.0.0 - transitivePeerDependencies: - - supports-color - - eslint-plugin-jsonc@2.21.1(eslint@10.2.1(jiti@2.6.1)): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.6.1)) - diff-sequences: 27.5.1 - eslint: 10.2.1(jiti@2.6.1) - eslint-compat-utils: 0.6.5(eslint@10.2.1(jiti@2.6.1)) - eslint-json-compat-utils: 0.2.3(eslint@10.2.1(jiti@2.6.1))(jsonc-eslint-parser@2.4.2) - espree: 10.4.0 - graphemer: 1.4.0 - jsonc-eslint-parser: 2.4.2 - natural-compare: 1.4.0 - synckit: 0.11.12 - transitivePeerDependencies: - - '@eslint/json' - - eslint-plugin-n@17.24.0(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.6.1)) - enhanced-resolve: 5.20.1 - eslint: 10.2.1(jiti@2.6.1) - eslint-plugin-es-x: 7.8.0(eslint@10.2.1(jiti@2.6.1)) - get-tsconfig: 4.13.7 - globals: 15.15.0 - globrex: 0.1.2 - ignore: 5.3.2 - semver: 7.7.4 - ts-declaration-location: 1.0.7(typescript@5.9.3) - transitivePeerDependencies: - - typescript - - eslint-plugin-no-only-tests@3.3.0: {} - - eslint-plugin-perfectionist@4.15.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/utils': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.2.1(jiti@2.6.1) - natural-orderby: 5.0.0 - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-regexp@2.10.0(eslint@10.2.1(jiti@2.6.1)): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.2 - comment-parser: 1.4.6 - eslint: 10.2.1(jiti@2.6.1) - jsdoc-type-pratt-parser: 4.8.0 - refa: 0.12.1 - regexp-ast-analysis: 0.7.1 - scslre: 0.3.0 - - eslint-plugin-toml@0.12.0(eslint@10.2.1(jiti@2.6.1)): - dependencies: - debug: 4.4.3 - eslint: 10.2.1(jiti@2.6.1) - eslint-compat-utils: 0.6.5(eslint@10.2.1(jiti@2.6.1)) - lodash: 4.18.1 - toml-eslint-parser: 0.10.1 - transitivePeerDependencies: - - supports-color - - eslint-plugin-unicorn@56.0.1(eslint@10.2.1(jiti@2.6.1)): - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.6.1)) - ci-info: 4.4.0 - clean-regexp: 1.0.0 - core-js-compat: 3.49.0 - eslint: 10.2.1(jiti@2.6.1) - esquery: 1.7.0 - globals: 15.15.0 - indent-string: 4.0.0 - is-builtin-module: 3.2.1 - jsesc: 3.1.0 - pluralize: 8.0.0 - read-pkg-up: 7.0.1 - regexp-tree: 0.1.27 - regjsparser: 0.10.0 - semver: 7.7.4 - strip-indent: 3.0.0 - - eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.1(jiti@2.6.1)): - dependencies: - eslint: 10.2.1(jiti@2.6.1) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3))(eslint@10.2.1(jiti@2.6.1))(typescript@5.9.3) - - eslint-plugin-vue@9.33.0(eslint@10.2.1(jiti@2.6.1)): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.6.1)) - eslint: 10.2.1(jiti@2.6.1) - globals: 13.24.0 - natural-compare: 1.4.0 - nth-check: 2.1.1 - postcss-selector-parser: 6.1.2 - semver: 7.7.4 - vue-eslint-parser: 9.4.3(eslint@10.2.1(jiti@2.6.1)) - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - supports-color - - eslint-plugin-yml@1.19.1(eslint@10.2.1(jiti@2.6.1)): - dependencies: - debug: 4.4.3 - diff-sequences: 27.5.1 - escape-string-regexp: 4.0.0 - eslint: 10.2.1(jiti@2.6.1) - eslint-compat-utils: 0.6.5(eslint@10.2.1(jiti@2.6.1)) - natural-compare: 1.4.0 - yaml-eslint-parser: 1.3.2 - transitivePeerDependencies: - - supports-color - - eslint-processor-vue-blocks@1.0.0(@vue/compiler-sfc@3.5.33)(eslint@10.2.1(jiti@2.6.1)): - dependencies: - '@vue/compiler-sfc': 3.5.33 - eslint: 10.2.1(jiti@2.6.1) - - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-scope@9.1.2: - dependencies: - '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.8 - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@4.2.1: {} - - eslint-visitor-keys@5.0.1: {} - - eslint@10.2.1(jiti@2.6.1): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.5.5 - '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.1 - '@humanfs/node': 0.16.7 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.14.0 - cross-spawn: 7.0.6 - debug: 4.4.3 - escape-string-regexp: 4.0.0 - eslint-scope: 9.1.2 - eslint-visitor-keys: 5.0.1 - espree: 11.2.0 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.5 - natural-compare: 1.4.0 - optionator: 0.9.4 - optionalDependencies: - jiti: 2.6.1 - transitivePeerDependencies: - - supports-color - - espree@10.4.0: - dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 4.2.1 - - espree@11.2.0: - dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 5.0.1 - - espree@9.6.1: - dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 3.4.3 - - esquery@1.7.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@4.3.0: {} - - estraverse@5.3.0: {} - - estree-walker@2.0.2: {} - - esutils@2.0.3: {} - - etag@1.8.1: {} - - event-pubsub@4.3.0: {} - - event-target-shim@5.0.1: {} - - eventemitter3@4.0.7: {} - - events-universal@1.0.1: - dependencies: - bare-events: 2.8.2 - transitivePeerDependencies: - - bare-abort-controller - - events@3.3.0: {} - - execa@0.5.1: - dependencies: - cross-spawn: 4.0.2 - get-stream: 2.3.1 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - - execa@1.0.0: - dependencies: - cross-spawn: 6.0.6 - get-stream: 4.1.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - - execa@5.1.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - exif-parser@0.1.12: {} - - exponential-backoff@3.1.3: {} - - express@4.22.1: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.4 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.0.7 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.2 - fresh: 0.5.2 - http-errors: 2.0.1 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.13 - proxy-addr: 2.0.7 - qs: 6.14.2 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.2 - serve-static: 1.16.3 - setprototypeof: 1.2.0 - statuses: 2.0.2 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - exsolve@1.0.8: {} - - extend@3.0.2: {} - - extract-zip@1.7.0: - dependencies: - concat-stream: 1.6.2 - debug: 2.6.9 - mkdirp: 0.5.6 - yauzl: 2.10.0 - transitivePeerDependencies: - - supports-color - - extract-zip@2.0.1: - dependencies: - debug: 4.4.3 - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - - extsprintf@1.3.0: {} - - extsprintf@1.4.1: {} - - fast-deep-equal@3.1.3: {} - - fast-diff@1.3.0: {} - - fast-fifo@1.3.2: {} - - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fast-safe-stringify@2.1.1: {} - - fast-uri@3.1.0: {} - - fastq@1.20.1: - dependencies: - reusify: 1.1.0 - - fault@2.0.1: - dependencies: - format: 0.2.2 - - faye-websocket@0.11.4: - dependencies: - websocket-driver: 0.7.4 - - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - - fdir@6.5.0(picomatch@4.0.4): - optionalDependencies: - picomatch: 4.0.4 - - figures@2.0.0: - dependencies: - escape-string-regexp: 1.0.5 - - file-entry-cache@8.0.0: - dependencies: - flat-cache: 4.0.1 - - file-type@16.5.4: - dependencies: - readable-web-to-node-stream: 3.0.4 - strtok3: 6.3.0 - token-types: 4.2.1 - - file-url@2.0.2: {} - - filelist@1.0.6: - dependencies: - minimatch: 5.1.9 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - finalhandler@1.3.2: - dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - find-cache-dir@3.3.2: - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - - find-up@1.1.2: - dependencies: - path-exists: 2.1.0 - pinkie-promise: 2.0.1 - - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - fix-path@3.0.0: - dependencies: - shell-path: 2.1.0 - - flat-cache@4.0.1: - dependencies: - flatted: 3.4.2 - keyv: 4.5.4 - - flat@5.0.2: {} - - flatted@3.4.2: {} - - follow-redirects@1.16.0(debug@4.4.3): - optionalDependencies: - debug: 4.4.3 - - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - forever-agent@0.6.1: {} - - form-data@2.3.3: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - form-data@3.0.4: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.3 - mime-types: 2.1.35 - - form-data@4.0.5: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - - format@0.2.2: {} - - formidable@1.2.6: {} - - forwarded@0.2.0: {} - - fraction.js@5.3.4: {} - - fresh@0.5.2: {} - - fs-constants@1.0.0: {} - - fs-extra@1.0.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 2.4.0 - klaw: 1.3.1 - - fs-extra@10.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.1 - universalify: 2.0.1 - - fs-extra@11.3.4: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.1 - universalify: 2.0.1 - - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-extra@9.1.0: - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.2.1 - universalify: 2.0.1 - - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - - fs-monkey@1.1.0: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - gauge@4.0.4: - dependencies: - aproba: 2.1.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - - gensync@1.0.0-beta.2: {} - - get-caller-file@1.0.3: {} - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - get-stream@2.3.1: - dependencies: - object-assign: 4.1.1 - pinkie-promise: 2.0.1 - - get-stream@4.1.0: - dependencies: - pump: 3.0.4 - - get-stream@5.2.0: - dependencies: - pump: 3.0.4 - - get-stream@6.0.1: {} - - get-tsconfig@4.13.7: - dependencies: - resolve-pkg-maps: 1.0.0 - - getpass@0.1.7: - dependencies: - assert-plus: 1.0.0 - - gifwrap@0.9.4: - dependencies: - image-q: 4.0.0 - omggif: 1.0.10 - - github-slugger@2.0.0: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob-to-regexp@0.4.1: {} - - glob@10.5.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.9 - minipass: 7.1.3 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - glob@7.1.2: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.5 - once: 1.4.0 - path-is-absolute: 1.0.1 - optional: true - - glob@7.1.6: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.5 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.5 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.9 - once: 1.4.0 - - global-agent@3.0.0: - dependencies: - boolean: 3.2.0 - es6-error: 4.1.1 - matcher: 3.0.0 - roarr: 2.15.4 - semver: 7.7.4 - serialize-error: 7.0.1 - optional: true - - global@4.4.0: - dependencies: - min-document: 2.19.2 - process: 0.11.10 - - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - - globals@15.15.0: {} - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - optional: true - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - - globrex@0.1.2: {} - - gopd@1.2.0: {} - - got@11.8.6: - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.3 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - - graceful-fs@4.2.11: {} - - graphemer@1.4.0: {} - - growl@1.10.3: - optional: true - - growl@1.10.5: {} - - gzip-size@6.0.0: - dependencies: - duplexer: 0.1.2 - - handle-thing@2.0.1: {} - - handlebars@4.7.8: - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.19.3 - optional: true - - har-schema@2.0.0: {} - - har-validator@5.1.5: - dependencies: - ajv: 6.15.0 - har-schema: 2.0.0 - - has-flag@2.0.0: - optional: true - - has-flag@3.0.0: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - has-unicode@2.0.1: {} - - hash-sum@1.0.2: {} - - hash-sum@2.0.0: {} - - hasha@2.2.0: - dependencies: - is-stream: 1.1.0 - pinkie-promise: 2.0.1 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - hasown@2.0.3: - dependencies: - function-bind: 1.1.2 - - he@1.1.1: - optional: true - - he@1.2.0: {} - - highlight.js@10.7.3: {} - - hoek@6.1.3: {} - - hosted-git-info@2.8.9: {} - - hosted-git-info@4.1.0: - dependencies: - lru-cache: 6.0.0 - - hpack.js@2.1.6: - dependencies: - inherits: 2.0.4 - obuf: 1.1.2 - readable-stream: 2.3.8 - wbuf: 1.7.3 - - html-entities@2.6.0: {} - - html-escaper@2.0.2: {} - - html-minifier-terser@6.1.0: - dependencies: - camel-case: 4.1.2 - clean-css: 5.3.3 - commander: 8.3.0 - he: 1.2.0 - param-case: 3.0.4 - relateurl: 0.2.7 - terser: 5.46.2 - - html-tags@2.0.0: {} - - html-webpack-plugin@5.6.7(webpack@5.106.2): - dependencies: - '@types/html-minifier-terser': 6.1.0 - html-minifier-terser: 6.1.0 - lodash: 4.18.1 - pretty-error: 4.0.0 - tapable: 2.3.3 - optionalDependencies: - webpack: 5.106.2 - - htmlparser2@6.1.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 - entities: 2.2.0 - - http-cache-semantics@4.2.0: {} - - http-deceiver@1.2.7: {} - - http-errors@1.8.1: - dependencies: - depd: 1.1.2 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 1.5.0 - toidentifier: 1.0.1 - - http-errors@2.0.1: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.2 - toidentifier: 1.0.1 - - http-parser-js@0.5.10: {} - - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - http-proxy-middleware@2.0.9(@types/express@4.17.25)(debug@4.4.3): - dependencies: - '@types/http-proxy': 1.17.17 - http-proxy: 1.18.1(debug@4.4.3) - is-glob: 4.0.3 - is-plain-obj: 3.0.0 - micromatch: 4.0.8 - optionalDependencies: - '@types/express': 4.17.25 - transitivePeerDependencies: - - debug - - http-proxy@1.18.1(debug@4.4.3): - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.16.0(debug@4.4.3) - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - - http-signature@1.2.0: - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.2 - sshpk: 1.18.0 - - http2-wrapper@1.0.3: - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - human-signals@2.1.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - icon-gen@2.1.0: - dependencies: - commander: 6.2.1 - del: 6.1.1 - mkdirp: 1.0.4 - pngjs: 6.0.0 - svg2png: 4.1.1 - uuid: 8.3.2 - transitivePeerDependencies: - - supports-color - - iconv-corefoundation@1.1.7: - dependencies: - cli-truncate: 2.1.0 - node-addon-api: 1.7.2 - optional: true - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - - icss-utils@5.1.0(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - - ieee754@1.2.1: {} - - ignore@5.3.2: {} - - ignore@7.0.5: {} - - image-q@4.0.0: - dependencies: - '@types/node': 16.9.1 - - immutable@5.1.5: {} - - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} - - indent-string@4.0.0: {} - - infer-owner@1.0.4: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - invert-kv@1.0.0: {} - - ip-address@10.1.0: {} - - ip@1.1.9: {} - - ipaddr.js@1.9.1: {} - - ipaddr.js@2.3.0: {} - - is-arrayish@0.2.1: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-browser@2.1.0: {} - - is-builtin-module@3.2.1: - dependencies: - builtin-modules: 3.3.0 - - is-ci@3.0.1: - dependencies: - ci-info: 3.9.0 - - is-core-module@2.16.1: - dependencies: - hasown: 2.0.3 - - is-docker@2.2.1: {} - - is-extglob@2.1.1: {} - - is-file-esm@1.0.0: - dependencies: - read-pkg-up: 7.0.1 - - is-fullwidth-code-point@1.0.0: - dependencies: - number-is-nan: 1.0.1 - - is-fullwidth-code-point@2.0.0: {} - - is-fullwidth-code-point@3.0.0: {} - - is-function@1.0.2: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-interactive@1.0.0: {} - - is-lambda@1.0.1: {} - - is-number@7.0.0: {} - - is-path-cwd@2.2.0: {} - - is-path-inside@3.0.3: {} - - is-plain-obj@2.1.0: {} - - is-plain-obj@3.0.0: {} - - is-plain-object@2.0.4: - dependencies: - isobject: 3.0.1 - - is-plain-object@3.0.1: {} - - is-stream@1.1.0: {} - - is-stream@2.0.1: {} - - is-typedarray@1.0.0: {} - - is-unicode-supported@0.1.0: {} - - is-utf8@0.2.1: {} - - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - - isarray@1.0.0: {} - - isbinaryfile@4.0.10: {} - - isbinaryfile@5.0.7: {} - - isexe@2.0.0: {} - - isexe@3.1.5: {} - - isexe@4.0.0: {} - - isobject@3.0.1: {} - - isstream@0.1.2: {} - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jake@10.9.4: - dependencies: - async: 3.2.6 - filelist: 1.0.6 - picocolors: 1.1.1 - - javascript-stringify@2.1.0: {} - - jest-worker@27.5.1: - dependencies: - '@types/node': 25.6.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - jimp@0.16.13: - dependencies: - '@babel/runtime': 7.29.2 - '@jimp/custom': 0.16.13 - '@jimp/plugins': 0.16.13(@jimp/custom@0.16.13) - '@jimp/types': 0.16.13(@jimp/custom@0.16.13) - regenerator-runtime: 0.13.11 - transitivePeerDependencies: - - debug - - jiti@2.6.1: {} - - joi@17.13.3: - dependencies: - '@hapi/hoek': 9.3.0 - '@hapi/topo': 5.1.0 - '@sideway/address': 4.1.5 - '@sideway/formula': 3.0.1 - '@sideway/pinpoint': 2.0.0 - - jpeg-js@0.4.4: {} - - js-message@1.0.7: {} - - js-tokens@4.0.0: {} - - js-yaml@4.0.0: - dependencies: - argparse: 2.0.1 - - js-yaml@4.1.1: - dependencies: - argparse: 2.0.1 - - jsbn@0.1.1: {} - - jsdoc-type-pratt-parser@4.1.0: {} - - jsdoc-type-pratt-parser@4.8.0: {} - - jsesc@0.5.0: {} - - jsesc@3.1.0: {} - - json-buffer@3.0.1: {} - - json-parse-better-errors@1.0.2: {} - - json-parse-even-better-errors@2.3.1: {} - - json-schema-traverse@0.4.1: {} - - json-schema-traverse@1.0.0: {} - - json-schema@0.4.0: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json-stringify-safe@5.0.1: {} - - json5-loader@4.0.1(webpack@5.106.2): - dependencies: - json5: 2.2.3 - loader-utils: 2.0.4 - schema-utils: 3.3.0 - webpack: 5.106.2 - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - - json5@2.2.3: {} - - jsonc-eslint-parser@2.4.2: - dependencies: - acorn: 8.16.0 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - semver: 7.7.4 - - jsonfile@2.4.0: - optionalDependencies: - graceful-fs: 4.2.11 - - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 - - jsonfile@6.2.1: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - - jsprim@1.4.2: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - - kew@0.7.0: {} - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - kind-of@6.0.3: {} - - klaw@1.3.1: - optionalDependencies: - graceful-fs: 4.2.11 - - klona@2.0.6: {} - - launch-editor-middleware@2.13.2: - dependencies: - launch-editor: 2.13.2 - - launch-editor@2.13.2: - dependencies: - picocolors: 1.1.1 - shell-quote: 1.8.3 - - lazy-val@1.0.5: {} - - lazystream@1.0.1: - dependencies: - readable-stream: 2.3.8 - - lcid@1.0.0: - dependencies: - invert-kv: 1.0.0 - - leven@2.1.0: {} - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - lilconfig@2.1.0: {} - - limiter@1.1.5: {} - - lines-and-columns@1.2.4: {} - - load-bmfont@1.4.2: - dependencies: - buffer-equal: 0.0.1 - mime: 1.6.0 - parse-bmfont-ascii: 1.0.6 - parse-bmfont-binary: 1.0.6 - parse-bmfont-xml: 1.1.6 - phin: 3.7.1 - xhr: 2.6.0 - xtend: 4.0.2 - transitivePeerDependencies: - - debug - - load-json-file@1.1.0: - dependencies: - graceful-fs: 4.2.11 - parse-json: 2.2.0 - pify: 2.3.0 - pinkie-promise: 2.0.1 - strip-bom: 2.0.0 - - loader-runner@4.3.1: {} - - loader-utils@1.4.2: - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 1.0.2 - - loader-utils@2.0.4: - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.3 - - local-pkg@1.1.2: - dependencies: - mlly: 1.8.2 - pkg-types: 2.3.0 - quansync: 0.2.11 - - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash-es@4.18.1: {} - - lodash.debounce@4.0.8: {} - - lodash.defaults@4.2.0: {} - - lodash.defaultsdeep@4.6.1: {} - - lodash.difference@4.5.0: {} - - lodash.escaperegexp@4.1.2: {} - - lodash.flatten@4.4.0: {} - - lodash.isequal@4.5.0: {} - - lodash.isplainobject@4.0.6: {} - - lodash.kebabcase@4.1.1: {} - - lodash.mapvalues@4.6.0: {} - - lodash.memoize@4.1.2: {} - - lodash.union@4.6.0: {} - - lodash.uniq@4.5.0: {} - - lodash@4.18.1: {} - - log-symbols@4.0.0: - dependencies: - chalk: 4.1.2 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - log-update@2.3.0: - dependencies: - ansi-escapes: 3.2.0 - cli-cursor: 2.1.0 - wrap-ansi: 3.0.1 - - log4js@6.9.1: - dependencies: - date-format: 4.0.14 - debug: 4.4.3 - flatted: 3.4.2 - rfdc: 1.4.1 - streamroller: 3.1.5 - transitivePeerDependencies: - - supports-color - - longest-streak@3.1.0: {} - - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - lower-case@2.0.2: - dependencies: - tslib: 2.8.1 - - lowercase-keys@2.0.0: {} - - lru-cache@10.4.3: {} - - lru-cache@11.2.7: {} - - lru-cache@4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - - lru-cache@7.18.3: {} - - magic-string@0.30.21: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - - make-dir@3.1.0: - dependencies: - semver: 6.3.1 - - make-fetch-happen@10.2.1: - dependencies: - agentkeepalive: 4.6.0 - cacache: 16.1.3 - http-cache-semantics: 4.2.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 2.1.2 - minipass-flush: 1.0.7 - minipass-pipeline: 1.2.4 - negotiator: 0.6.4 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 9.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - - markdown-table@3.0.4: {} - - matcher@3.0.0: - dependencies: - escape-string-regexp: 4.0.0 - optional: true - - math-intrinsics@1.1.0: {} - - mdast-util-find-and-replace@3.0.2: - dependencies: - '@types/mdast': 4.0.4 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.1 - unist-util-visit-parents: 6.0.2 - - mdast-util-from-markdown@2.0.3: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - decode-named-character-reference: 1.3.0 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.2 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-decode-string: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - - mdast-util-frontmatter@2.0.1: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - escape-string-regexp: 5.0.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - micromark-extension-frontmatter: 2.0.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-autolink-literal@2.0.1: - dependencies: - '@types/mdast': 4.0.4 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.2 - micromark-util-character: 2.1.1 - - mdast-util-gfm-footnote@2.1.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - micromark-util-normalize-identifier: 2.0.1 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-strikethrough@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-table@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-task-list-item@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm@3.1.0: - dependencies: - mdast-util-from-markdown: 2.0.3 - mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.1.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-phrasing@4.1.0: - dependencies: - '@types/mdast': 4.0.4 - unist-util-is: 6.0.1 - - mdast-util-to-markdown@2.1.2: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.1.0 - mdast-util-to-string: 4.0.0 - micromark-util-classify-character: 2.0.1 - micromark-util-decode-string: 2.0.1 - unist-util-visit: 5.1.0 - zwitch: 2.0.4 - - mdast-util-to-string@4.0.0: - dependencies: - '@types/mdast': 4.0.4 - - mdn-data@2.0.14: {} - - media-typer@0.3.0: {} - - memfs@3.5.3: - dependencies: - fs-monkey: 1.1.0 - - merge-descriptors@1.0.3: {} - - merge-source-map@1.1.0: - dependencies: - source-map: 0.6.1 - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - methods@1.1.2: {} - - micromark-core-commonmark@2.0.3: - dependencies: - decode-named-character-reference: 1.3.0 - devlop: 1.1.0 - micromark-factory-destination: 2.0.1 - micromark-factory-label: 2.0.1 - micromark-factory-space: 2.0.1 - micromark-factory-title: 2.0.1 - micromark-factory-whitespace: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-html-tag-name: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-frontmatter@2.0.0: - dependencies: - fault: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-autolink-literal@2.1.0: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-footnote@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-strikethrough@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-table@2.1.1: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-tagfilter@2.0.0: - dependencies: - micromark-util-types: 2.0.2 - - micromark-extension-gfm-task-list-item@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm@3.0.0: - dependencies: - micromark-extension-gfm-autolink-literal: 2.1.0 - micromark-extension-gfm-footnote: 2.1.0 - micromark-extension-gfm-strikethrough: 2.1.0 - micromark-extension-gfm-table: 2.1.1 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.1.0 - micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-destination@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-label@2.0.1: - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-space@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-types: 2.0.2 - - micromark-factory-title@2.0.1: - dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-whitespace@2.0.1: - dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-character@2.1.1: - dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-chunked@2.0.1: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-classify-character@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-combine-extensions@2.0.1: - dependencies: - micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-decode-numeric-character-reference@2.0.2: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-decode-string@2.0.1: - dependencies: - decode-named-character-reference: 1.3.0 - micromark-util-character: 2.1.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-symbol: 2.0.1 - - micromark-util-encode@2.0.1: {} - - micromark-util-html-tag-name@2.0.1: {} - - micromark-util-normalize-identifier@2.0.1: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-resolve-all@2.0.1: - dependencies: - micromark-util-types: 2.0.2 - - micromark-util-sanitize-uri@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 - - micromark-util-subtokenize@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-symbol@2.0.1: {} - - micromark-util-types@2.0.2: {} - - micromark@4.0.2: - dependencies: - '@types/debug': 4.1.13 - debug: 4.4.3 - decode-named-character-reference: 1.3.0 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-combine-extensions: 2.0.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-encode: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - transitivePeerDependencies: - - supports-color - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.2 - - mime-db@1.52.0: {} - - mime-db@1.54.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime@1.6.0: {} - - mime@2.6.0: {} - - mimic-fn@1.2.0: {} - - mimic-fn@2.1.0: {} - - mimic-response@1.0.1: {} - - mimic-response@3.1.0: {} - - min-document@2.19.2: - dependencies: - dom-walk: 0.1.2 - - min-indent@1.0.1: {} - - mini-css-extract-plugin@2.10.2(webpack@5.106.2): - dependencies: - schema-utils: 4.3.3 - tapable: 2.3.3 - webpack: 5.106.2 - - minimalistic-assert@1.0.1: {} - - minimatch@10.2.5: - dependencies: - brace-expansion: 5.0.5 - - minimatch@3.0.4: - dependencies: - brace-expansion: 1.1.14 - - minimatch@3.1.5: - dependencies: - brace-expansion: 1.1.14 - - minimatch@5.1.9: - dependencies: - brace-expansion: 2.1.0 - - minimatch@9.0.9: - dependencies: - brace-expansion: 2.1.0 - - minimist@0.0.8: - optional: true - - minimist@1.2.8: {} - - minipass-collect@1.0.2: - dependencies: - minipass: 3.3.6 - - minipass-fetch@2.1.2: - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - - minipass-flush@1.0.7: - dependencies: - minipass: 3.3.6 - - minipass-pipeline@1.2.4: - dependencies: - minipass: 3.3.6 - - minipass-sized@1.0.3: - dependencies: - minipass: 3.3.6 - - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} - - minipass@7.1.3: {} - - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - minizlib@3.1.0: - dependencies: - minipass: 7.1.3 - - mkdirp@0.5.1: - dependencies: - minimist: 0.0.8 - optional: true - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mkdirp@1.0.4: {} - - mlly@1.8.2: - dependencies: - acorn: 8.16.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.6.3 - - mocha@4.1.0: - dependencies: - browser-stdout: 1.3.0 - commander: 2.11.0 - debug: 3.1.0(supports-color@4.4.0) - diff: 3.3.1 - escape-string-regexp: 1.0.5 - glob: 7.1.2 - growl: 1.10.3 - he: 1.1.1 - mkdirp: 0.5.1 - supports-color: 4.4.0 - optional: true - - mocha@8.4.0: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.1 - debug: 4.3.1(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.1.6 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.0.0 - log-symbols: 4.0.0 - minimatch: 3.0.4 - ms: 2.1.3 - nanoid: 3.1.20 - serialize-javascript: 5.0.1 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - wide-align: 1.1.3 - workerpool: 6.1.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - module-alias@2.3.4: {} - - mri@1.1.4: {} - - mrmime@2.0.1: {} - - ms@2.0.0: {} - - ms@2.1.2: {} - - ms@2.1.3: {} - - multicast-dns@7.2.5: - dependencies: - dns-packet: 5.6.1 - thunky: 1.1.0 - - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - - nanoid@3.1.20: {} - - nanoid@3.3.11: {} - - nanopop@2.4.2: {} - - napi-postinstall@0.3.4: {} - - natural-compare@1.4.0: {} - - natural-orderby@5.0.0: {} - - negotiator@0.6.3: {} - - negotiator@0.6.4: {} - - neo-async@2.6.2: {} - - nice-try@1.0.5: {} - - no-case@3.0.4: - dependencies: - lower-case: 2.0.2 - tslib: 2.8.1 - - node-abi@3.89.0: - dependencies: - semver: 7.7.4 - - node-abi@4.28.0: - dependencies: - semver: 7.7.4 - - node-addon-api@1.7.2: - optional: true - - node-addon-api@7.1.1: - optional: true - - node-api-version@0.2.1: - dependencies: - semver: 7.7.4 - - node-fetch@2.7.0(encoding@0.1.13): - dependencies: - whatwg-url: 5.0.0 - optionalDependencies: - encoding: 0.1.13 - - node-forge@1.4.0: {} - - node-gyp@12.3.0: - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.3 - graceful-fs: 4.2.11 - nopt: 9.0.0 - proc-log: 6.1.0 - semver: 7.7.4 - tar: 7.5.13 - tinyglobby: 0.2.16 - undici: 6.25.0 - which: 6.0.1 - - node-gyp@9.4.1: - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.3 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 10.2.1 - nopt: 6.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.7.4 - tar: 6.2.1 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - - supports-color - - node-powershell@4.0.0: - dependencies: - chalk: 2.4.2 - shortid: 2.2.17 - - node-releases@2.0.38: {} - - nopt@6.0.0: - dependencies: - abbrev: 1.1.1 - - nopt@9.0.0: - dependencies: - abbrev: 4.0.0 - - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.12 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - - normalize-path@3.0.0: {} - - normalize-url@6.1.0: {} - - npm-run-path@2.0.2: - dependencies: - path-key: 2.0.1 - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - npmlog@6.0.2: - dependencies: - are-we-there-yet: 3.0.1 - console-control-strings: 1.1.0 - gauge: 4.0.4 - set-blocking: 2.0.0 - - nth-check@2.1.1: - dependencies: - boolbase: 1.0.0 - - number-is-nan@1.0.1: {} - - oauth-sign@0.9.0: {} - - object-assign@4.1.1: {} - - object-inspect@1.13.4: {} - - object-keys@1.1.1: {} - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - obuf@1.1.2: {} - - omggif@1.0.10: {} - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - on-headers@1.1.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@2.0.1: - dependencies: - mimic-fn: 1.2.0 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - - opener@1.5.2: {} - - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - ora@5.4.1: - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - - os-locale@1.4.0: - dependencies: - lcid: 1.0.0 - - p-cancelable@2.1.1: {} - - p-finally@1.0.0: {} - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 - - p-retry@4.6.2: - dependencies: - '@types/retry': 0.12.0 - retry: 0.13.1 - - p-try@2.2.0: {} - - package-json-from-dist@1.0.1: {} - - package-manager-detector@1.6.0: {} - - pako@1.0.11: {} - - param-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.8.1 - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-bmfont-ascii@1.0.6: {} - - parse-bmfont-binary@1.0.6: {} - - parse-bmfont-xml@1.1.6: - dependencies: - xml-parse-from-string: 1.0.1 - xml2js: 0.5.0 - - parse-gitignore@2.0.0: {} - - parse-headers@2.0.6: {} - - parse-imports-exports@0.2.4: - dependencies: - parse-statements: 1.0.11 - - parse-json@2.2.0: - dependencies: - error-ex: 1.3.4 - - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.29.0 - error-ex: 1.3.4 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - parse-statements@1.0.11: {} - - parse5-htmlparser2-tree-adapter@6.0.1: - dependencies: - parse5: 6.0.1 - - parse5@5.1.1: {} - - parse5@6.0.1: {} - - parseurl@1.3.3: {} - - pascal-case@3.1.2: - dependencies: - no-case: 3.0.4 - tslib: 2.8.1 - - path-browserify@1.0.1: {} - - path-exists@2.1.0: - dependencies: - pinkie-promise: 2.0.1 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@2.0.1: {} - - path-key@3.1.1: {} - - path-parse@1.0.7: {} - - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.3 - - path-to-regexp@0.1.13: {} - - path-type@1.1.0: - dependencies: - graceful-fs: 4.2.11 - pify: 2.3.0 - pinkie-promise: 2.0.1 - - path-type@4.0.0: {} - - pathe@2.0.3: {} - - pathval@1.1.1: {} - - pe-library@0.4.1: {} - - peek-readable@4.1.0: {} - - pend@1.2.0: {} - - performance-now@2.1.0: {} - - phantomjs-prebuilt@2.1.16: - dependencies: - es6-promise: 4.2.8 - extract-zip: 1.7.0 - fs-extra: 1.0.0 - hasha: 2.2.0 - kew: 0.7.0 - progress: 1.1.8 - request: 2.88.2 - request-progress: 2.0.1 - which: 1.3.1 - transitivePeerDependencies: - - supports-color - - phin@2.9.3: {} - - phin@3.7.1: - dependencies: - centra: 2.7.0 - transitivePeerDependencies: - - debug - - picocolors@0.2.1: {} - - picocolors@1.1.1: {} - - picomatch@2.3.2: {} - - picomatch@4.0.4: {} - - pify@2.3.0: {} - - pinkie-promise@2.0.1: - dependencies: - pinkie: 2.0.4 - - pinkie@2.0.4: {} - - pixelmatch@4.0.2: - dependencies: - pngjs: 3.4.0 - - pkg-dir@4.2.0: - dependencies: - find-up: 4.1.0 - - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.8.2 - pathe: 2.0.3 - - pkg-types@2.3.0: - dependencies: - confbox: 0.2.4 - exsolve: 1.0.8 - pathe: 2.0.3 - - plist@3.1.0: - dependencies: - '@xmldom/xmldom': 0.8.13 - base64-js: 1.5.1 - xmlbuilder: 15.1.1 - - pluralize@8.0.0: {} - - pn@1.1.0: {} - - pngjs@3.4.0: {} - - pngjs@6.0.0: {} - - portfinder@1.0.38: - dependencies: - async: 3.2.6 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - postcss-calc@8.2.4(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - postcss-selector-parser: 6.1.2 - postcss-value-parser: 4.2.0 - - postcss-colormin@5.3.1(postcss@8.5.10): - dependencies: - browserslist: 4.28.2 - caniuse-api: 3.0.0 - colord: 2.9.3 - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - - postcss-convert-values@5.1.3(postcss@8.5.10): - dependencies: - browserslist: 4.28.2 - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - - postcss-discard-comments@5.1.2(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - - postcss-discard-duplicates@5.1.0(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - - postcss-discard-empty@5.1.1(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - - postcss-discard-overridden@5.1.0(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - - postcss-loader@6.2.1(postcss@8.5.10)(webpack@5.106.2): - dependencies: - cosmiconfig: 7.1.0 - klona: 2.0.6 - postcss: 8.5.10 - semver: 7.7.4 - webpack: 5.106.2 - - postcss-merge-longhand@5.1.7(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - stylehacks: 5.1.1(postcss@8.5.10) - - postcss-merge-rules@5.1.4(postcss@8.5.10): - dependencies: - browserslist: 4.28.2 - caniuse-api: 3.0.0 - cssnano-utils: 3.1.0(postcss@8.5.10) - postcss: 8.5.10 - postcss-selector-parser: 6.1.2 - - postcss-minify-font-values@5.1.0(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - - postcss-minify-gradients@5.1.1(postcss@8.5.10): - dependencies: - colord: 2.9.3 - cssnano-utils: 3.1.0(postcss@8.5.10) - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - - postcss-minify-params@5.1.4(postcss@8.5.10): - dependencies: - browserslist: 4.28.2 - cssnano-utils: 3.1.0(postcss@8.5.10) - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - - postcss-minify-selectors@5.2.1(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - postcss-selector-parser: 6.1.2 - - postcss-modules-extract-imports@3.1.0(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - - postcss-modules-local-by-default@4.2.0(postcss@8.5.10): - dependencies: - icss-utils: 5.1.0(postcss@8.5.10) - postcss: 8.5.10 - postcss-selector-parser: 7.1.1 - postcss-value-parser: 4.2.0 - - postcss-modules-scope@3.2.1(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - postcss-selector-parser: 7.1.1 - - postcss-modules-values@4.0.0(postcss@8.5.10): - dependencies: - icss-utils: 5.1.0(postcss@8.5.10) - postcss: 8.5.10 - - postcss-normalize-charset@5.1.0(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - - postcss-normalize-display-values@5.1.0(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - - postcss-normalize-positions@5.1.1(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - - postcss-normalize-repeat-style@5.1.1(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - - postcss-normalize-string@5.1.0(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - - postcss-normalize-timing-functions@5.1.0(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - - postcss-normalize-unicode@5.1.1(postcss@8.5.10): - dependencies: - browserslist: 4.28.2 - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - - postcss-normalize-url@5.1.0(postcss@8.5.10): - dependencies: - normalize-url: 6.1.0 - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - - postcss-normalize-whitespace@5.1.1(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - - postcss-ordered-values@5.1.3(postcss@8.5.10): - dependencies: - cssnano-utils: 3.1.0(postcss@8.5.10) - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - - postcss-reduce-initial@5.1.2(postcss@8.5.10): - dependencies: - browserslist: 4.28.2 - caniuse-api: 3.0.0 - postcss: 8.5.10 - - postcss-reduce-transforms@5.1.0(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - - postcss-selector-parser@6.1.2: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-selector-parser@7.1.1: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-svgo@5.1.0(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - svgo: 2.8.2 - - postcss-unique-selectors@5.1.1(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - postcss-selector-parser: 6.1.2 - - postcss-value-parser@4.2.0: {} - - postcss@7.0.39: - dependencies: - picocolors: 0.2.1 - source-map: 0.6.1 - - postcss@8.5.10: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - prelude-ls@1.2.1: {} - - prettier-linter-helpers@1.0.1: - dependencies: - fast-diff: 1.3.0 - - prettier@2.8.8: - optional: true - - prettier@3.8.2: {} - - pretty-error@4.0.0: - dependencies: - lodash: 4.18.1 - renderkid: 3.0.0 - - proc-log@6.1.0: {} - - process-nextick-args@2.0.1: {} - - process@0.11.10: {} - - progress-webpack-plugin@1.0.16(webpack@5.106.2): - dependencies: - chalk: 2.4.2 - figures: 2.0.0 - log-update: 2.3.0 - webpack: 5.106.2 - - progress@1.1.8: {} - - progress@2.0.3: {} - - promise-inflight@1.0.1: {} - - promise-retry@2.0.1: - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - - proper-lockfile@4.1.2: - dependencies: - graceful-fs: 4.2.11 - retry: 0.12.0 - signal-exit: 3.0.7 - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - proxy-from-env@2.1.0: {} - - pseudomap@1.0.2: {} - - psl@1.15.0: - dependencies: - punycode: 2.3.1 - - pump@3.0.4: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - - punycode@2.3.1: {} - - qs@6.14.2: - dependencies: - side-channel: 1.1.0 - - qs@6.15.1: - dependencies: - side-channel: 1.1.0 - - qs@6.5.5: {} - - quansync@0.2.11: {} - - queue-microtask@1.2.3: {} - - quick-lru@5.1.1: {} - - random-int@1.0.0: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - range-parser@1.2.1: {} - - raw-body@2.5.3: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - read-binary-file-arch@1.0.6: - dependencies: - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - read-pkg-up@1.0.1: - dependencies: - find-up: 1.1.2 - read-pkg: 1.1.0 - - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - - read-pkg@1.1.0: - dependencies: - load-json-file: 1.1.0 - normalize-package-data: 2.5.0 - path-type: 1.1.0 - - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readable-stream@4.7.0: - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - - readable-web-to-node-stream@3.0.4: - dependencies: - readable-stream: 4.7.0 - - readdir-glob@1.1.3: - dependencies: - minimatch: 5.1.9 - - readdirp@3.5.0: - dependencies: - picomatch: 2.3.2 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.2 - - readdirp@4.1.2: {} - - refa@0.12.1: - dependencies: - '@eslint-community/regexpp': 4.12.2 - - regenerate-unicode-properties@10.2.2: - dependencies: - regenerate: 1.4.2 - - regenerate@1.4.2: {} - - regenerator-runtime@0.13.11: {} - - regexp-ast-analysis@0.7.1: - dependencies: - '@eslint-community/regexpp': 4.12.2 - refa: 0.12.1 - - regexp-tree@0.1.27: {} - - regexpu-core@6.4.0: - dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.2 - regjsgen: 0.8.0 - regjsparser: 0.13.1 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.1 - - regjsgen@0.8.0: {} - - regjsparser@0.10.0: - dependencies: - jsesc: 0.5.0 - - regjsparser@0.13.1: - dependencies: - jsesc: 3.1.0 - - relateurl@0.2.7: {} - - renderkid@3.0.0: - dependencies: - css-select: 4.3.0 - dom-converter: 0.2.0 - htmlparser2: 6.1.0 - lodash: 4.18.1 - strip-ansi: 6.0.1 - - request-progress@2.0.1: - dependencies: - throttleit: 1.0.1 - - request-progress@3.0.0: - dependencies: - throttleit: 1.0.1 - - request@2.88.2: - dependencies: - aws-sign2: 0.7.0 - aws4: 1.13.2 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.5 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.5 - safe-buffer: 5.2.1 - tough-cookie: 2.5.0 - tunnel-agent: 0.6.0 - uuid: 3.4.0 - - require-directory@2.1.1: {} - - require-from-string@2.0.2: {} - - require-main-filename@1.0.1: {} - - requires-port@1.0.0: {} - - resedit@1.7.2: - dependencies: - pe-library: 0.4.1 - - resize-observer-polyfill@1.5.1: {} - - resolve-alpn@1.2.1: {} - - resolve-from@4.0.0: {} - - resolve-pkg-maps@1.0.0: {} - - resolve@1.22.12: - dependencies: - es-errors: 1.3.0 - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - responselike@2.0.1: - dependencies: - lowercase-keys: 2.0.0 - - restore-cursor@2.0.0: - dependencies: - onetime: 2.0.1 - signal-exit: 3.0.7 - - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - retry@0.12.0: {} - - retry@0.13.1: {} - - reusify@1.1.0: {} - - rfdc@1.4.1: {} + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] - rimraf@3.0.2: - dependencies: - glob: 7.2.3 + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] - roarr@2.15.4: - dependencies: - boolean: 3.2.0 - detect-node: 2.1.0 - globalthis: 1.0.4 - json-stringify-safe: 5.0.1 - semver-compare: 1.0.0 - sprintf-js: 1.1.3 - optional: true + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] - rxjs@7.8.2: - dependencies: - tslib: 2.8.1 + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] - safe-buffer@5.1.2: {} + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] - safe-buffer@5.2.1: {} + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] - safer-buffer@2.1.2: {} + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] - sanitize-filename@1.6.4: - dependencies: - truncate-utf8-bytes: 1.0.2 + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] - sass-loader@16.0.7(sass@1.99.0)(webpack@5.106.2): - dependencies: - neo-async: 2.6.2 - optionalDependencies: - sass: 1.99.0 - webpack: 5.106.2 + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] - sass@1.99.0: - dependencies: - chokidar: 4.0.3 - immutable: 5.1.5 - source-map-js: 1.2.1 - optionalDependencies: - '@parcel/watcher': 2.5.6 + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + engines: {node: '>= 20'} - sax@1.6.0: {} + '@tailwindcss/vite@4.3.0': + resolution: {integrity: sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 || ^8 - schema-utils@2.7.1: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.15.0 - ajv-keywords: 3.5.2(ajv@6.15.0) + '@tauri-apps/api@2.11.0': + resolution: {integrity: sha512-7CinYODhky9lmO23xHnUFv0Xt43fbtWMyxZcLcRBlFkcgXKuEirBvHpmtJ89YMhyeGcq20Wuc47Fa4XjyniywA==} - schema-utils@3.3.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.15.0 - ajv-keywords: 3.5.2(ajv@6.15.0) + '@tauri-apps/cli-darwin-arm64@2.11.2': + resolution: {integrity: sha512-+4UZzLt+eOAEQCwgd+TqKgyUJMrvx+BgdXLLaqJYmPqzP+nE6YZr/hY6CWLYGQb8jFn99jEkmC6uA3tNvamA1w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] - schema-utils@4.3.3: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 8.18.0 - ajv-formats: 2.1.1(ajv@8.18.0) - ajv-keywords: 5.1.0(ajv@8.18.0) + '@tauri-apps/cli-darwin-x64@2.11.2': + resolution: {integrity: sha512-VjYYtZUPqDMLutSfJEyxFE3Bz+DPi7c8wC3imckgvciLDZLq4qwKJxBicg0BXGhXjJsl8vKWgWRFNMPELQ+Xyg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] - scroll-into-view-if-needed@2.2.31: - dependencies: - compute-scroll-into-view: 1.0.20 + '@tauri-apps/cli-linux-arm-gnueabihf@2.11.2': + resolution: {integrity: sha512-yMemD6f4i95AQriS8EazyOFzbE34yjnP16i3IOzpHGQvBoy2DjypFMFBq0NtPuITURv/cOGguRtHR5d79/9CSA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] - scslre@0.3.0: - dependencies: - '@eslint-community/regexpp': 4.12.2 - refa: 0.12.1 - regexp-ast-analysis: 0.7.1 + '@tauri-apps/cli-linux-arm64-gnu@2.11.2': + resolution: {integrity: sha512-cgI91D2wL8GSgoWwZXDqt+DwnuZCP2/bz03QAE4TrhgAKIsrB4hX26W/H1EONPUUNkqrsgeCD0wU6pcNjV/5kw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] - select-hose@2.0.0: {} + '@tauri-apps/cli-linux-arm64-musl@2.11.2': + resolution: {integrity: sha512-X1rm0BERqAAggtYTESSgXrS3sz4Sb/OiPiz54UqISlXW+GkR3vNIGnsy/lejNmoXGVqri3Q53BCfQiclOIyRPw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] - selfsigned@2.4.1: - dependencies: - '@types/node-forge': 1.3.14 - node-forge: 1.4.0 + '@tauri-apps/cli-linux-riscv64-gnu@2.11.2': + resolution: {integrity: sha512-usbMLJbT3KtkOrBMDVeGYNM35aTHXx38SJSzTMSqqjeUIOQ+iVPjb2yAGNAE+KqmBbAx4FOFIyMeKXx2M/JKGQ==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + libc: [glibc] - semver-compare@1.0.0: - optional: true + '@tauri-apps/cli-linux-x64-gnu@2.11.2': + resolution: {integrity: sha512-Ru4gwJKPG0ctVGchRGpRup4Y4lW2SSfFnrbQcyHhCliKy4g8Qz97TrUgCur4CbWyAgKxvGh3SjrkA0LDYzDGiw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] - semver@5.7.2: {} + '@tauri-apps/cli-linux-x64-musl@2.11.2': + resolution: {integrity: sha512-eUm7T6clN1MMmNSRQ9gaWsQdyehQx2Gmn5hht/QUlqZQI/qcP2OJK5dnaxqwFzCr2HdsEo9ydxaqcS1oJzMvUw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] - semver@6.3.1: {} + '@tauri-apps/cli-win32-arm64-msvc@2.11.2': + resolution: {integrity: sha512-HeeZW80jU+gVTOEX4X/hC6NVSAdDVXajwP5fxIZ/3z9WvUC7qrudX2GMTilYq6Dg0e0sk0XgsAJD1hZ5wPBXUA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] - semver@7.7.4: {} + '@tauri-apps/cli-win32-ia32-msvc@2.11.2': + resolution: {integrity: sha512-YhjQNZcXfbkCLyazSv1nPnJ9iRFE1wm6kc51FDbU10/Dk09io+6PAGMLjkxnX2GdM0qMnDmTjstY8mTDVvtKeA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] - send@0.19.2: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.1 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - serialize-error@7.0.1: - dependencies: - type-fest: 0.13.1 - optional: true + '@tauri-apps/cli-win32-x64-msvc@2.11.2': + resolution: {integrity: sha512-d2JchlFIpZevZVReyqhQOekJmb1UH3rhZ5VX6sH3ty9ETE0TKQavpihvoScUXfKKpW6HZC0MrFGRU0ZtD+w3gA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] - serialize-javascript@5.0.1: - dependencies: - randombytes: 2.1.0 + '@tauri-apps/cli@2.11.2': + resolution: {integrity: sha512-bk3HemqvGRoy+5D/dVMUQHKMYLglD0jVnMm/0iGMH6ufZ+p8r14m6BpIixwij3PBvZdvORUp1YifTD8QxVZ1Nw==} + engines: {node: '>= 10'} + hasBin: true - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 + '@tauri-apps/plugin-opener@2.5.4': + resolution: {integrity: sha512-1HnPkb+AmgO29HBazm4uPLKB+r7zzcTBW1d0fyYp1uP+jwtpoiNDGKMMzz58SFp49nOIrxdE3aUJtT57lfO9CQ==} - serve-index@1.9.2: - dependencies: - accepts: 1.3.8 - batch: 0.6.1 - debug: 2.6.9 - escape-html: 1.0.3 - http-errors: 1.8.1 - mime-types: 2.1.35 - parseurl: 1.3.3 - transitivePeerDependencies: - - supports-color - - serve-static@1.16.3: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.2 - transitivePeerDependencies: - - supports-color + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - set-blocking@2.0.0: {} + '@vitejs/plugin-vue@5.2.1': + resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} - setprototypeof@1.2.0: {} + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} - shallow-clone@3.0.1: - dependencies: - kind-of: 6.0.3 + '@volar/typescript@2.4.28': + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} - shallow-equal@1.2.1: {} + '@vue/compiler-core@3.5.35': + resolution: {integrity: sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==} - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 + '@vue/compiler-dom@3.5.35': + resolution: {integrity: sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==} - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 + '@vue/compiler-sfc@3.5.35': + resolution: {integrity: sha512-G5VPMcXTSywXBgtFOZOnHKBxKSrwXUcvY1iaF5/hRcy7t0J6CH/d8ha9F4nzi00Fax1eLV0QHM7v4mQu68jydw==} - shebang-regex@1.0.0: {} + '@vue/compiler-ssr@3.5.35': + resolution: {integrity: sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==} - shebang-regex@3.0.0: {} + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} - shell-env@0.3.0: - dependencies: - default-shell: 1.0.1 - execa: 0.5.1 - strip-ansi: 3.0.1 + '@vue/language-core@2.1.10': + resolution: {integrity: sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - shell-path@2.1.0: - dependencies: - shell-env: 0.3.0 + '@vue/reactivity@3.5.35': + resolution: {integrity: sha512-tVc+SsHConvh/Lz64qq1pP3rYArBmK42xonovEcxY74SQtvctZodG/zhq54P5dr38cVuw25d27cPNRdlMidpGQ==} - shell-quote@1.8.3: {} + '@vue/runtime-core@3.5.35': + resolution: {integrity: sha512-A/xFNX9loIcWDygeQuNCfKuh0CoYBzxhqEMNah5TSFg9Z53DrFYEN2qi5CU9necjM1OWYegYREUTHmXTmhfXtg==} - shortid@2.2.17: - dependencies: - nanoid: 3.3.11 + '@vue/runtime-dom@3.5.35': + resolution: {integrity: sha512-odrJ1C391dbGnyDRh8U+rnP7J2amIEzfmRk5vXy7xi3aZhEXofTvpi0T4HJb6jlNqQZTNPR5MPHSB3RHNkIORA==} - should-equal@2.0.0: - dependencies: - should-type: 1.4.0 - optional: true + '@vue/server-renderer@3.5.35': + resolution: {integrity: sha512-NkebSOYdB97wi8OQcO3HqzZSlymJi/aWsN/7h74OSVhRTm6qGs3Jp3e0rCXynmWwSlKeRrnlIug+ilYoHBmQDA==} + peerDependencies: + vue: 3.5.35 - should-format@3.0.3: - dependencies: - should-type: 1.4.0 - should-type-adaptors: 1.1.0 - optional: true + '@vue/shared@3.5.35': + resolution: {integrity: sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==} - should-type-adaptors@1.1.0: - dependencies: - should-type: 1.4.0 - should-util: 1.0.1 - optional: true + alien-signals@0.2.0: + resolution: {integrity: sha512-StlonZhBBrsPPwrDjiPAiVTf/rolxffLxVPT60Qv/t88BZ81BvUVzHgGqEFvJ1ii8HXtm1+zU2Icr59tfWEcag==} - should-type@1.4.0: - optional: true + balanced-match@1.0.0: + resolution: {integrity: sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg==} - should-util@1.0.1: - optional: true + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} - should@13.2.3: - dependencies: - should-equal: 2.0.0 - should-format: 3.0.3 - should-type: 1.4.0 - should-type-adaptors: 1.1.0 - should-util: 1.0.1 - optional: true + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - side-channel-list@1.0.1: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 + enhanced-resolve@5.22.2: + resolution: {integrity: sha512-0rxICaFZ7NQho/sHely2bvOPRP0Eu2B0NZ9zM54YvRvWMn7jfz3DmnOZDR9LlXDdDcqntAVc6Hfy4gr/tdH/Ag==} + engines: {node: '>=10.13.0'} - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.1 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} - signal-exit@3.0.7: {} + esbuild@0.25.0: + resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} + engines: {node: '>=18'} + hasBin: true - signal-exit@4.1.0: {} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - simple-update-notifier@2.0.0: - dependencies: - semver: 7.7.4 + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true - sirv@2.0.4: - dependencies: - '@polka/url': 1.0.0-next.29 - mrmime: 2.0.1 - totalist: 3.0.1 + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] - sisteransi@1.0.5: {} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - slash@3.0.0: {} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true - slice-ansi@3.0.0: - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - optional: true + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true - smart-buffer@4.2.0: {} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] - sockjs@0.3.24: - dependencies: - faye-websocket: 0.11.4 - uuid: 8.3.2 - websocket-driver: 0.7.4 + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] - socks-proxy-agent@7.0.0: - dependencies: - agent-base: 6.0.2 - debug: 4.4.3 - socks: 2.8.7 - transitivePeerDependencies: - - supports-color + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] - socks@2.8.7: - dependencies: - ip-address: 10.1.0 - smart-buffer: 4.2.0 + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] - source-map-js@1.2.1: {} + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] - source-map@0.6.1: {} + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] - spawn-command@0.0.2: {} + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] - spawn-sync@2.0.0: {} + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.23 + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] - spdx-exceptions@2.5.0: {} + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.23 + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} - spdx-expression-parse@4.0.0: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.23 + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - spdx-license-ids@3.0.23: {} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} - spdy-transport@3.0.0: - dependencies: - debug: 4.4.3 - detect-node: 2.1.0 - hpack.js: 2.1.6 - obuf: 1.1.2 - readable-stream: 3.6.2 - wbuf: 1.7.3 - transitivePeerDependencies: - - supports-color - - spdy@4.0.2: - dependencies: - debug: 4.4.3 - handle-thing: 2.0.1 - http-deceiver: 1.2.7 - select-hose: 2.0.0 - spdy-transport: 3.0.0 - transitivePeerDependencies: - - supports-color - - sprintf-js@1.1.3: - optional: true + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - sshpk@1.18.0: - dependencies: - asn1: 0.2.6 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - - ssri@8.0.1: - dependencies: - minipass: 3.3.6 + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true - ssri@9.0.1: - dependencies: - minipass: 3.3.6 + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - stable-hash-x@0.2.0: {} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - stable@0.1.8: {} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} - stackframe@1.3.4: {} + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} - stat-mode@1.0.0: {} + rollup@4.61.1: + resolution: {integrity: sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true - statuses@1.5.0: {} + semver@7.8.2: + resolution: {integrity: sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==} + engines: {node: '>=10'} + hasBin: true - statuses@2.0.2: {} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} - stream-throttle@0.1.3: - dependencies: - commander: 2.20.3 - limiter: 1.1.5 + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} - streamroller@3.1.5: - dependencies: - date-format: 4.0.14 - debug: 4.4.3 - fs-extra: 8.1.0 - transitivePeerDependencies: - - supports-color + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} - streamx@2.25.0: - dependencies: - events-universal: 1.0.1 - fast-fifo: 1.3.2 - text-decoder: 1.2.7 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - - string-width@1.0.2: - dependencies: - code-point-at: 1.1.0 - is-fullwidth-code-point: 1.0.0 - strip-ansi: 3.0.1 + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} - string-width@2.1.1: - dependencies: - is-fullwidth-code-point: 2.0.0 - strip-ansi: 4.0.0 + typescript@5.6.2: + resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} + engines: {node: '>=14.17'} + hasBin: true - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 + vite@6.4.3: + resolution: {integrity: sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@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.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.2.0 + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 + vue-tsc@2.1.10: + resolution: {integrity: sha512-RBNSfaaRHcN5uqVqJSZh++Gy/YUzryuv9u1aFWhsammDJXNtUiJMNoJ747lZcQ68wUQFx6E73y4FY3D8E7FGMA==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 + vue@3.5.35: + resolution: {integrity: sha512-cx89fnr+0kVGHiNFG6y6s0bdjypJRFNZn6x3WPstNdQR1bi1mbB7h4v5IBGTsPJU3nK1+0Iqj3Zf+hZWMieR4Q==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - strip-ansi@3.0.1: - dependencies: - ansi-regex: 2.1.1 +snapshots: - strip-ansi@4.0.0: - dependencies: - ansi-regex: 3.0.1 + '@babel/helper-string-parser@7.29.7': {} - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 + '@babel/helper-validator-identifier@7.29.7': {} - strip-ansi@7.2.0: + '@babel/parser@7.29.7': dependencies: - ansi-regex: 6.2.2 + '@babel/types': 7.29.7 - strip-bom@2.0.0: + '@babel/types@7.29.7': dependencies: - is-utf8: 0.2.1 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 - strip-eof@1.0.0: {} + '@esbuild/aix-ppc64@0.25.0': + optional: true - strip-final-newline@2.0.0: {} + '@esbuild/android-arm64@0.25.0': + optional: true - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 + '@esbuild/android-arm@0.25.0': + optional: true - strip-json-comments@3.1.1: {} + '@esbuild/android-x64@0.25.0': + optional: true - strtok3@6.3.0: - dependencies: - '@tokenizer/token': 0.3.0 - peek-readable: 4.1.0 + '@esbuild/darwin-arm64@0.25.0': + optional: true - stylehacks@5.1.1(postcss@8.5.10): - dependencies: - browserslist: 4.28.2 - postcss: 8.5.10 - postcss-selector-parser: 6.1.2 + '@esbuild/darwin-x64@0.25.0': + optional: true - stylis@4.4.0: {} + '@esbuild/freebsd-arm64@0.25.0': + optional: true - sumchecker@3.0.1: - dependencies: - debug: 4.4.3 - transitivePeerDependencies: - - supports-color + '@esbuild/freebsd-x64@0.25.0': + optional: true - superagent@6.1.0: - dependencies: - component-emitter: 1.3.1 - cookiejar: 2.1.4 - debug: 4.4.3 - fast-safe-stringify: 2.1.1 - form-data: 3.0.4 - formidable: 1.2.6 - methods: 1.1.2 - mime: 2.6.0 - qs: 6.15.1 - readable-stream: 3.6.2 - semver: 7.7.4 - transitivePeerDependencies: - - supports-color - - supports-color@4.4.0: - dependencies: - has-flag: 2.0.0 + '@esbuild/linux-arm64@0.25.0': optional: true - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 + '@esbuild/linux-arm@0.25.0': + optional: true - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 + '@esbuild/linux-ia32@0.25.0': + optional: true - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 + '@esbuild/linux-loong64@0.25.0': + optional: true - supports-preserve-symlinks-flag@1.0.0: {} + '@esbuild/linux-mips64el@0.25.0': + optional: true - svg-tags@1.0.0: {} + '@esbuild/linux-ppc64@0.25.0': + optional: true - svg2png@4.1.1: - dependencies: - file-url: 2.0.2 - phantomjs-prebuilt: 2.1.16 - pn: 1.1.0 - yargs: 6.6.0 - transitivePeerDependencies: - - supports-color - - svgo@2.8.2: - dependencies: - commander: 7.2.0 - css-select: 4.3.0 - css-tree: 1.1.3 - csso: 4.2.0 - picocolors: 1.1.1 - sax: 1.6.0 - stable: 0.1.8 + '@esbuild/linux-riscv64@0.25.0': + optional: true - synckit@0.11.12: - dependencies: - '@pkgr/core': 0.2.9 + '@esbuild/linux-s390x@0.25.0': + optional: true - synckit@0.9.3: - dependencies: - '@pkgr/core': 0.1.2 - tslib: 2.8.1 + '@esbuild/linux-x64@0.25.0': + optional: true - tapable@2.3.3: {} + '@esbuild/netbsd-arm64@0.25.0': + optional: true - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.5 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 + '@esbuild/netbsd-x64@0.25.0': + optional: true - tar-stream@3.2.0: - dependencies: - b4a: 1.8.0 - bare-fs: 4.7.1 - fast-fifo: 1.3.2 - streamx: 2.25.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - - tar@7.5.13: - dependencies: - '@isaacs/fs-minipass': 4.0.1 - chownr: 3.0.0 - minipass: 7.1.3 - minizlib: 3.1.0 - yallist: 5.0.0 + '@esbuild/openbsd-arm64@0.25.0': + optional: true - teex@1.0.1: - dependencies: - streamx: 2.25.0 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a + '@esbuild/openbsd-x64@0.25.0': + optional: true - temp-file@3.4.0: - dependencies: - async-exit-hook: 2.0.1 - fs-extra: 10.1.0 + '@esbuild/sunos-x64@0.25.0': + optional: true - terser-webpack-plugin@5.5.0(webpack@5.106.2): - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - jest-worker: 27.5.1 - schema-utils: 4.3.3 - terser: 5.46.2 - webpack: 5.106.2 + '@esbuild/win32-arm64@0.25.0': + optional: true - terser@5.46.2: - dependencies: - '@jridgewell/source-map': 0.3.11 - acorn: 8.16.0 - commander: 2.20.3 - source-map-support: 0.5.21 + '@esbuild/win32-ia32@0.25.0': + optional: true - text-decoder@1.2.7: - dependencies: - b4a: 1.8.0 - transitivePeerDependencies: - - react-native-b4a + '@esbuild/win32-x64@0.25.0': + optional: true - thenify-all@1.6.0: + '@jridgewell/gen-mapping@0.3.5': dependencies: - thenify: 3.3.1 + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - thenify@3.3.1: + '@jridgewell/remapping@2.3.5': dependencies: - any-promise: 1.3.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.31 - thread-loader@3.0.4(webpack@5.106.2): - dependencies: - json-parse-better-errors: 1.0.2 - loader-runner: 4.3.1 - loader-utils: 2.0.4 - neo-async: 2.6.2 - schema-utils: 3.3.0 - webpack: 5.106.2 + '@jridgewell/resolve-uri@3.1.2': {} - throttle-debounce@5.0.2: {} + '@jridgewell/set-array@1.2.1': {} - throttleit@1.0.1: {} + '@jridgewell/sourcemap-codec@1.5.5': {} - through2@4.0.2: + '@jridgewell/trace-mapping@0.3.31': dependencies: - readable-stream: 3.6.2 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - thunky@1.1.0: {} + '@rollup/rollup-android-arm-eabi@4.61.1': + optional: true - timm@1.7.1: {} + '@rollup/rollup-android-arm64@4.61.1': + optional: true - tiny-async-pool@1.3.0: - dependencies: - semver: 5.7.2 + '@rollup/rollup-darwin-arm64@4.61.1': + optional: true - tiny-emitter@2.1.0: {} + '@rollup/rollup-darwin-x64@4.61.1': + optional: true - tiny-typed-emitter@2.1.0: {} + '@rollup/rollup-freebsd-arm64@4.61.1': + optional: true - tinycolor2@1.6.0: {} + '@rollup/rollup-freebsd-x64@4.61.1': + optional: true - tinyexec@1.1.1: {} + '@rollup/rollup-linux-arm-gnueabihf@4.61.1': + optional: true - tinyglobby@0.2.16: - dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + '@rollup/rollup-linux-arm-musleabihf@4.61.1': + optional: true - tmp-promise@3.0.3: - dependencies: - tmp: 0.2.5 + '@rollup/rollup-linux-arm64-gnu@4.61.1': + optional: true - tmp@0.2.5: {} + '@rollup/rollup-linux-arm64-musl@4.61.1': + optional: true - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 + '@rollup/rollup-linux-loong64-gnu@4.61.1': + optional: true - toidentifier@1.0.1: {} + '@rollup/rollup-linux-loong64-musl@4.61.1': + optional: true - token-types@4.2.1: - dependencies: - '@tokenizer/token': 0.3.0 - ieee754: 1.2.1 + '@rollup/rollup-linux-ppc64-gnu@4.61.1': + optional: true - toml-eslint-parser@0.10.1: - dependencies: - eslint-visitor-keys: 3.4.3 + '@rollup/rollup-linux-ppc64-musl@4.61.1': + optional: true - totalist@3.0.1: {} + '@rollup/rollup-linux-riscv64-gnu@4.61.1': + optional: true - tough-cookie@2.5.0: - dependencies: - psl: 1.15.0 - punycode: 2.3.1 + '@rollup/rollup-linux-riscv64-musl@4.61.1': + optional: true - tr46@0.0.3: {} + '@rollup/rollup-linux-s390x-gnu@4.61.1': + optional: true - tree-kill@1.2.2: {} + '@rollup/rollup-linux-x64-gnu@4.61.1': + optional: true - truncate-utf8-bytes@1.0.2: - dependencies: - utf8-byte-length: 1.0.5 + '@rollup/rollup-linux-x64-musl@4.61.1': + optional: true - ts-api-utils@2.5.0(typescript@5.9.3): - dependencies: - typescript: 5.9.3 + '@rollup/rollup-openbsd-x64@4.61.1': + optional: true - ts-declaration-location@1.0.7(typescript@5.9.3): - dependencies: - picomatch: 4.0.4 - typescript: 5.9.3 + '@rollup/rollup-openharmony-arm64@4.61.1': + optional: true - tslib@2.8.1: {} + '@rollup/rollup-win32-arm64-msvc@4.61.1': + optional: true - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 + '@rollup/rollup-win32-ia32-msvc@4.61.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.61.1': + optional: true - tweetnacl@0.14.5: {} + '@rollup/rollup-win32-x64-msvc@4.61.1': + optional: true - type-check@0.4.0: + '@tailwindcss/node@4.3.0': dependencies: - prelude-ls: 1.2.1 - - type-detect@4.1.0: {} + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.22.2 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.0 - type-fest@0.13.1: + '@tailwindcss/oxide-android-arm64@4.3.0': optional: true - type-fest@0.20.2: {} - - type-fest@0.6.0: {} + '@tailwindcss/oxide-darwin-arm64@4.3.0': + optional: true - type-fest@0.8.1: {} + '@tailwindcss/oxide-darwin-x64@4.3.0': + optional: true - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 + '@tailwindcss/oxide-freebsd-x64@4.3.0': + optional: true - typedarray@0.0.6: {} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + optional: true - typescript@5.9.3: {} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + optional: true - ufo@1.6.3: {} + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + optional: true - uglify-js@3.19.3: + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': optional: true - underscore@1.13.8: {} + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + optional: true - undici-types@7.16.0: {} + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + optional: true - undici-types@7.19.2: {} + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + optional: true - undici@6.25.0: {} + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + optional: true - unicode-canonical-property-names-ecmascript@2.0.1: {} + '@tailwindcss/oxide@4.3.0': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 - unicode-match-property-ecmascript@2.0.0: + '@tailwindcss/vite@4.3.0(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0))': dependencies: - unicode-canonical-property-names-ecmascript: 2.0.1 - unicode-property-aliases-ecmascript: 2.2.0 + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + tailwindcss: 4.3.0 + vite: 6.4.3(jiti@2.7.0)(lightningcss@1.32.0) - unicode-match-property-value-ecmascript@2.2.1: {} + '@tauri-apps/api@2.11.0': {} - unicode-property-aliases-ecmascript@2.2.0: {} + '@tauri-apps/cli-darwin-arm64@2.11.2': + optional: true - unique-filename@2.0.1: - dependencies: - unique-slug: 3.0.0 + '@tauri-apps/cli-darwin-x64@2.11.2': + optional: true - unique-slug@3.0.0: - dependencies: - imurmurhash: 0.1.4 + '@tauri-apps/cli-linux-arm-gnueabihf@2.11.2': + optional: true - unist-util-is@6.0.1: - dependencies: - '@types/unist': 3.0.3 + '@tauri-apps/cli-linux-arm64-gnu@2.11.2': + optional: true - unist-util-stringify-position@4.0.0: - dependencies: - '@types/unist': 3.0.3 + '@tauri-apps/cli-linux-arm64-musl@2.11.2': + optional: true - unist-util-visit-parents@6.0.2: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.1 + '@tauri-apps/cli-linux-riscv64-gnu@2.11.2': + optional: true - unist-util-visit@5.1.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.1 - unist-util-visit-parents: 6.0.2 + '@tauri-apps/cli-linux-x64-gnu@2.11.2': + optional: true - universalify@0.1.2: {} + '@tauri-apps/cli-linux-x64-musl@2.11.2': + optional: true - universalify@2.0.1: {} + '@tauri-apps/cli-win32-arm64-msvc@2.11.2': + optional: true - unpipe@1.0.0: {} + '@tauri-apps/cli-win32-ia32-msvc@2.11.2': + optional: true - unrs-resolver@1.11.1: - dependencies: - napi-postinstall: 0.3.4 + '@tauri-apps/cli-win32-x64-msvc@2.11.2': + optional: true + + '@tauri-apps/cli@2.11.2': optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.11.1 - '@unrs/resolver-binding-android-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-x64': 1.11.1 - '@unrs/resolver-binding-freebsd-x64': 1.11.1 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 - '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-musl': 1.11.1 - '@unrs/resolver-binding-wasm32-wasi': 1.11.1 - '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 - '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 - '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - - update-browserslist-db@1.2.3(browserslist@4.28.2): - dependencies: - browserslist: 4.28.2 - escalade: 3.2.0 - picocolors: 1.1.1 + '@tauri-apps/cli-darwin-arm64': 2.11.2 + '@tauri-apps/cli-darwin-x64': 2.11.2 + '@tauri-apps/cli-linux-arm-gnueabihf': 2.11.2 + '@tauri-apps/cli-linux-arm64-gnu': 2.11.2 + '@tauri-apps/cli-linux-arm64-musl': 2.11.2 + '@tauri-apps/cli-linux-riscv64-gnu': 2.11.2 + '@tauri-apps/cli-linux-x64-gnu': 2.11.2 + '@tauri-apps/cli-linux-x64-musl': 2.11.2 + '@tauri-apps/cli-win32-arm64-msvc': 2.11.2 + '@tauri-apps/cli-win32-ia32-msvc': 2.11.2 + '@tauri-apps/cli-win32-x64-msvc': 2.11.2 - uri-js@4.4.1: + '@tauri-apps/plugin-opener@2.5.4': dependencies: - punycode: 2.3.1 + '@tauri-apps/api': 2.11.0 - utf8-byte-length@1.0.5: {} + '@types/estree@1.0.9': {} - utif@2.0.1: + '@vitejs/plugin-vue@5.2.1(vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0))(vue@3.5.35(typescript@5.6.2))': dependencies: - pako: 1.0.11 + vite: 6.4.3(jiti@2.7.0)(lightningcss@1.32.0) + vue: 3.5.35(typescript@5.6.2) - util-deprecate@1.0.2: {} - - utila@0.4.0: {} - - utils-merge@1.0.1: {} - - uuid@3.4.0: {} - - uuid@8.3.2: {} - - validate-npm-package-license@3.0.4: + '@volar/language-core@2.4.28': dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 + '@volar/source-map': 2.4.28 - vary@1.1.2: {} + '@volar/source-map@2.4.28': {} - verror@1.10.0: + '@volar/typescript@2.4.28': dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.4.1 + '@volar/language-core': 2.4.28 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 - verror@1.10.1: + '@vue/compiler-core@3.5.35': dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.4.1 - optional: true + '@babel/parser': 7.29.7 + '@vue/shared': 3.5.35 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 - vue-eslint-parser@9.4.3(eslint@10.2.1(jiti@2.6.1)): - dependencies: - debug: 4.4.3 - eslint: 10.2.1(jiti@2.6.1) - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.7.0 - lodash: 4.18.1 - semver: 7.7.4 - transitivePeerDependencies: - - supports-color - - vue-hot-reload-api@2.3.4: {} - - vue-loader@15.11.1(@vue/compiler-sfc@3.5.33)(css-loader@6.11.0(webpack@5.106.2))(ejs@3.1.10)(handlebars@4.7.8)(lodash@4.18.1)(underscore@1.13.8)(vue-template-compiler@2.7.16)(webpack@5.106.2): - dependencies: - '@vue/component-compiler-utils': 3.3.0(ejs@3.1.10)(handlebars@4.7.8)(lodash@4.18.1)(underscore@1.13.8) - css-loader: 6.11.0(webpack@5.106.2) - hash-sum: 1.0.2 - loader-utils: 1.4.2 - vue-hot-reload-api: 2.3.4 - vue-style-loader: 4.1.3 - webpack: 5.106.2 - optionalDependencies: - '@vue/compiler-sfc': 3.5.33 - vue-template-compiler: 2.7.16 - transitivePeerDependencies: - - arc-templates - - atpl - - babel-core - - bracket-template - - coffee-script - - dot - - dust - - dustjs-helpers - - dustjs-linkedin - - eco - - ect - - ejs - - haml-coffee - - hamlet - - hamljs - - handlebars - - hogan.js - - htmling - - jade - - jazz - - jqtpl - - just - - liquid-node - - liquor - - lodash - - marko - - mote - - mustache - - nunjucks - - plates - - pug - - qejs - - ractive - - razor-tmpl - - react - - react-dom - - slm - - squirrelly - - swig - - swig-templates - - teacup - - templayed - - then-jade - - then-pug - - tinyliquid - - toffee - - twig - - twing - - underscore - - vash - - velocityjs - - walrus - - whiskers - - vue-loader@17.4.2(@vue/compiler-sfc@3.5.33)(vue@3.5.33(typescript@5.9.3))(webpack@5.106.2): + '@vue/compiler-dom@3.5.35': dependencies: - chalk: 4.1.2 - hash-sum: 2.0.0 - watchpack: 2.5.1 - webpack: 5.106.2 - optionalDependencies: - '@vue/compiler-sfc': 3.5.33 - vue: 3.5.33(typescript@5.9.3) + '@vue/compiler-core': 3.5.35 + '@vue/shared': 3.5.35 - vue-router@4.6.4(vue@3.5.33(typescript@5.9.3)): + '@vue/compiler-sfc@3.5.35': dependencies: - '@vue/devtools-api': 6.6.4 - vue: 3.5.33(typescript@5.9.3) + '@babel/parser': 7.29.7 + '@vue/compiler-core': 3.5.35 + '@vue/compiler-dom': 3.5.35 + '@vue/compiler-ssr': 3.5.35 + '@vue/shared': 3.5.35 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.15 + source-map-js: 1.2.1 - vue-style-loader@4.1.3: + '@vue/compiler-ssr@3.5.35': dependencies: - hash-sum: 1.0.2 - loader-utils: 1.4.2 + '@vue/compiler-dom': 3.5.35 + '@vue/shared': 3.5.35 - vue-template-compiler@2.7.16: + '@vue/compiler-vue2@2.7.16': dependencies: de-indent: 1.0.2 he: 1.2.0 - optional: true - - vue-template-es2015-compiler@1.9.1: {} - - vue-types@3.0.2(vue@3.5.33(typescript@5.9.3)): - dependencies: - is-plain-object: 3.0.1 - vue: 3.5.33(typescript@5.9.3) - vue3-json-editor@1.1.5(typescript@5.9.3): + '@vue/language-core@2.1.10(typescript@5.6.2)': dependencies: - core-js: 3.49.0 - vue: 3.5.33(typescript@5.9.3) - transitivePeerDependencies: - - typescript - - vue@3.5.33(typescript@5.9.3): - dependencies: - '@vue/compiler-dom': 3.5.33 - '@vue/compiler-sfc': 3.5.33 - '@vue/runtime-dom': 3.5.33 - '@vue/server-renderer': 3.5.33(vue@3.5.33(typescript@5.9.3)) - '@vue/shared': 3.5.33 + '@volar/language-core': 2.4.28 + '@vue/compiler-dom': 3.5.35 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.35 + alien-signals: 0.2.0 + minimatch: 9.0.9 + muggle-string: 0.4.1 + path-browserify: 1.0.1 optionalDependencies: - typescript: 5.9.3 + typescript: 5.6.2 - wait-on@7.2.0: - dependencies: - axios: 1.15.0 - joi: 17.13.3 - lodash: 4.18.1 - minimist: 1.2.8 - rxjs: 7.8.2 - transitivePeerDependencies: - - debug - - warning@4.0.3: + '@vue/reactivity@3.5.35': dependencies: - loose-envify: 1.4.0 + '@vue/shared': 3.5.35 - watchpack@2.5.1: + '@vue/runtime-core@3.5.35': dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 + '@vue/reactivity': 3.5.35 + '@vue/shared': 3.5.35 - wbuf@1.7.3: + '@vue/runtime-dom@3.5.35': dependencies: - minimalistic-assert: 1.0.1 + '@vue/reactivity': 3.5.35 + '@vue/runtime-core': 3.5.35 + '@vue/shared': 3.5.35 + csstype: 3.2.3 - wcwidth@1.0.1: + '@vue/server-renderer@3.5.35(vue@3.5.35(typescript@5.6.2))': dependencies: - defaults: 1.0.4 + '@vue/compiler-ssr': 3.5.35 + '@vue/shared': 3.5.35 + vue: 3.5.35(typescript@5.6.2) - webidl-conversions@3.0.1: {} + '@vue/shared@3.5.35': {} - webpack-bundle-analyzer@4.10.2: - dependencies: - '@discoveryjs/json-ext': 0.5.7 - acorn: 8.16.0 - acorn-walk: 8.3.5 - commander: 7.2.0 - debounce: 1.2.1 - escape-string-regexp: 4.0.0 - gzip-size: 6.0.0 - html-escaper: 2.0.2 - opener: 1.5.2 - picocolors: 1.1.1 - sirv: 2.0.4 - ws: 7.5.10 - transitivePeerDependencies: - - bufferutil - - utf-8-validate + alien-signals@0.2.0: {} - webpack-chain@6.5.1: - dependencies: - deepmerge: 1.5.2 - javascript-stringify: 2.1.0 + balanced-match@1.0.0: {} - webpack-dev-middleware@5.3.4(webpack@5.106.2): - dependencies: - colorette: 2.0.20 - memfs: 3.5.3 - mime-types: 2.1.35 - range-parser: 1.2.1 - schema-utils: 4.3.3 - webpack: 5.106.2 - - webpack-dev-server@4.15.2(debug@4.4.3)(webpack@5.106.2): - dependencies: - '@types/bonjour': 3.5.13 - '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.25 - '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.10 - '@types/sockjs': 0.3.36 - '@types/ws': 8.18.1 - ansi-html-community: 0.0.8 - bonjour-service: 1.3.0 - chokidar: 3.6.0 - colorette: 2.0.20 - compression: 1.8.1 - connect-history-api-fallback: 2.0.0 - default-gateway: 6.0.3 - express: 4.22.1 - graceful-fs: 4.2.11 - html-entities: 2.6.0 - http-proxy-middleware: 2.0.9(@types/express@4.17.25)(debug@4.4.3) - ipaddr.js: 2.3.0 - launch-editor: 2.13.2 - open: 8.4.2 - p-retry: 4.6.2 - rimraf: 3.0.2 - schema-utils: 4.3.3 - selfsigned: 2.4.1 - serve-index: 1.9.2 - sockjs: 0.3.24 - spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.106.2) - ws: 8.20.0 - optionalDependencies: - webpack: 5.106.2 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - - webpack-merge@5.10.0: + brace-expansion@2.1.1: dependencies: - clone-deep: 4.0.1 - flat: 5.0.2 - wildcard: 2.0.1 + balanced-match: 1.0.0 + + csstype@3.2.3: {} - webpack-sources@3.4.0: {} + de-indent@1.0.2: {} - webpack-virtual-modules@0.4.6: {} + detect-libc@2.1.2: {} - webpack@5.106.2: + enhanced-resolve@5.22.2: dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.16.0 - acorn-import-phases: 1.0.4(acorn@8.16.0) - browserslist: 4.28.2 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.21.0 - es-module-lexer: 2.0.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - loader-runner: 4.3.1 - mime-db: 1.54.0 - neo-async: 2.6.2 - schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.5.0(webpack@5.106.2) - watchpack: 2.5.1 - webpack-sources: 3.4.0 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - websocket-driver@0.7.4: - dependencies: - http-parser-js: 0.5.10 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - - websocket-extensions@0.1.4: {} - - whatwg-fetch@3.6.20: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - which-module@1.0.0: {} + entities@7.0.1: {} - which@1.3.1: - dependencies: - isexe: 2.0.0 + esbuild@0.25.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.0 + '@esbuild/android-arm': 0.25.0 + '@esbuild/android-arm64': 0.25.0 + '@esbuild/android-x64': 0.25.0 + '@esbuild/darwin-arm64': 0.25.0 + '@esbuild/darwin-x64': 0.25.0 + '@esbuild/freebsd-arm64': 0.25.0 + '@esbuild/freebsd-x64': 0.25.0 + '@esbuild/linux-arm': 0.25.0 + '@esbuild/linux-arm64': 0.25.0 + '@esbuild/linux-ia32': 0.25.0 + '@esbuild/linux-loong64': 0.25.0 + '@esbuild/linux-mips64el': 0.25.0 + '@esbuild/linux-ppc64': 0.25.0 + '@esbuild/linux-riscv64': 0.25.0 + '@esbuild/linux-s390x': 0.25.0 + '@esbuild/linux-x64': 0.25.0 + '@esbuild/netbsd-arm64': 0.25.0 + '@esbuild/netbsd-x64': 0.25.0 + '@esbuild/openbsd-arm64': 0.25.0 + '@esbuild/openbsd-x64': 0.25.0 + '@esbuild/sunos-x64': 0.25.0 + '@esbuild/win32-arm64': 0.25.0 + '@esbuild/win32-ia32': 0.25.0 + '@esbuild/win32-x64': 0.25.0 - which@2.0.2: - dependencies: - isexe: 2.0.0 + estree-walker@2.0.2: {} - which@5.0.0: - dependencies: - isexe: 3.1.5 + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 - which@6.0.1: - dependencies: - isexe: 4.0.0 + fsevents@2.3.3: + optional: true - wide-align@1.1.3: - dependencies: - string-width: 2.1.1 + graceful-fs@4.2.11: {} - wide-align@1.1.5: - dependencies: - string-width: 4.2.3 + he@1.2.0: {} - wildcard@2.0.1: {} + jiti@2.7.0: {} - winreg@1.2.5: {} + lightningcss-android-arm64@1.32.0: + optional: true - word-wrap@1.2.5: {} + lightningcss-darwin-arm64@1.32.0: + optional: true - wordwrap@1.0.0: + lightningcss-darwin-x64@1.32.0: optional: true - workerpool@6.1.0: {} + lightningcss-freebsd-x64@1.32.0: + optional: true - wrap-ansi@2.1.0: - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true - wrap-ansi@3.0.1: - dependencies: - string-width: 2.1.1 - strip-ansi: 4.0.0 + lightningcss-linux-arm64-gnu@1.32.0: + optional: true - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 + lightningcss-linux-arm64-musl@1.32.0: + optional: true - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.2.0 + lightningcss-linux-x64-gnu@1.32.0: + optional: true - wrappy@1.0.2: {} + lightningcss-linux-x64-musl@1.32.0: + optional: true - ws@7.5.10: {} + lightningcss-win32-arm64-msvc@1.32.0: + optional: true - ws@8.20.0: {} + lightningcss-win32-x64-msvc@1.32.0: + optional: true - xhr@2.6.0: + lightningcss@1.32.0: dependencies: - global: 4.4.0 - is-function: 1.0.2 - parse-headers: 2.0.6 - xtend: 4.0.2 - - xml-name-validator@4.0.0: {} - - xml-parse-from-string@1.0.1: {} + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 - xml2js@0.5.0: + magic-string@0.30.21: dependencies: - sax: 1.6.0 - xmlbuilder: 11.0.1 - - xmlbuilder@11.0.1: {} - - xmlbuilder@15.1.1: {} - - xtend@4.0.2: {} + '@jridgewell/sourcemap-codec': 1.5.5 - y18n@3.2.2: {} + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.1 - y18n@5.0.8: {} + muggle-string@0.4.1: {} - yallist@2.1.2: {} + nanoid@3.3.12: {} - yallist@3.1.1: {} + path-browserify@1.0.1: {} - yallist@4.0.0: {} + picocolors@1.1.1: {} - yallist@5.0.0: {} + picomatch@4.0.4: {} - yaml-eslint-parser@1.3.2: + postcss@8.5.15: dependencies: - eslint-visitor-keys: 3.4.3 - yaml: 2.8.3 + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 - yaml@1.10.3: {} + rollup@4.61.1: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.61.1 + '@rollup/rollup-android-arm64': 4.61.1 + '@rollup/rollup-darwin-arm64': 4.61.1 + '@rollup/rollup-darwin-x64': 4.61.1 + '@rollup/rollup-freebsd-arm64': 4.61.1 + '@rollup/rollup-freebsd-x64': 4.61.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.61.1 + '@rollup/rollup-linux-arm-musleabihf': 4.61.1 + '@rollup/rollup-linux-arm64-gnu': 4.61.1 + '@rollup/rollup-linux-arm64-musl': 4.61.1 + '@rollup/rollup-linux-loong64-gnu': 4.61.1 + '@rollup/rollup-linux-loong64-musl': 4.61.1 + '@rollup/rollup-linux-ppc64-gnu': 4.61.1 + '@rollup/rollup-linux-ppc64-musl': 4.61.1 + '@rollup/rollup-linux-riscv64-gnu': 4.61.1 + '@rollup/rollup-linux-riscv64-musl': 4.61.1 + '@rollup/rollup-linux-s390x-gnu': 4.61.1 + '@rollup/rollup-linux-x64-gnu': 4.61.1 + '@rollup/rollup-linux-x64-musl': 4.61.1 + '@rollup/rollup-openbsd-x64': 4.61.1 + '@rollup/rollup-openharmony-arm64': 4.61.1 + '@rollup/rollup-win32-arm64-msvc': 4.61.1 + '@rollup/rollup-win32-ia32-msvc': 4.61.1 + '@rollup/rollup-win32-x64-gnu': 4.61.1 + '@rollup/rollup-win32-x64-msvc': 4.61.1 + fsevents: 2.3.3 - yaml@2.8.3: {} + semver@7.8.2: {} - yargs-parser@20.2.4: {} + source-map-js@1.2.1: {} - yargs-parser@20.2.9: {} + tailwindcss@4.3.0: {} - yargs-parser@21.1.1: {} + tapable@2.3.3: {} - yargs-parser@4.2.1: + tinyglobby@0.2.17: dependencies: - camelcase: 3.0.0 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 + typescript@5.6.2: {} - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - - yargs@17.7.2: + vite@6.4.3(jiti@2.7.0)(lightningcss@1.32.0): dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - yargs@6.6.0: - dependencies: - camelcase: 3.0.0 - cliui: 3.2.0 - decamelize: 1.2.0 - get-caller-file: 1.0.3 - os-locale: 1.4.0 - read-pkg-up: 1.0.1 - require-directory: 2.1.1 - require-main-filename: 1.0.1 - set-blocking: 2.0.0 - string-width: 1.0.2 - which-module: 1.0.0 - y18n: 3.2.2 - yargs-parser: 4.2.1 - - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 + esbuild: 0.25.0 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.15 + rollup: 4.61.1 + tinyglobby: 0.2.17 + optionalDependencies: + fsevents: 2.3.3 + jiti: 2.7.0 + lightningcss: 1.32.0 - yocto-queue@0.1.0: {} + vscode-uri@3.1.0: {} - zip-stream@4.1.1: + vue-tsc@2.1.10(typescript@5.6.2): dependencies: - archiver-utils: 3.0.4 - compress-commons: 4.1.2 - readable-stream: 3.6.2 + '@volar/typescript': 2.4.28 + '@vue/language-core': 2.1.10(typescript@5.6.2) + semver: 7.8.2 + typescript: 5.6.2 - zip-stream@6.0.1: + vue@3.5.35(typescript@5.6.2): dependencies: - archiver-utils: 5.0.2 - compress-commons: 6.0.2 - readable-stream: 4.7.0 - - zwitch@2.0.4: {} + '@vue/compiler-dom': 3.5.35 + '@vue/compiler-sfc': 3.5.35 + '@vue/runtime-dom': 3.5.35 + '@vue/server-renderer': 3.5.35(vue@3.5.35(typescript@5.6.2)) + '@vue/shared': 3.5.35 + optionalDependencies: + typescript: 5.6.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 07e62abb8c..5ed0b5af0d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,2 @@ -packages: - # all packages in subdirectories of packages/ and components/ - - packages/* - # exclude packages that are inside test directories - - '!**/test/**' +allowBuilds: + esbuild: true diff --git a/public/tauri.svg b/public/tauri.svg new file mode 100644 index 0000000000..31b62c9280 --- /dev/null +++ b/public/tauri.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000000..e7b8dfb1b2 --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index bf9129687d..0000000000 --- a/pyproject.toml +++ /dev/null @@ -1,3 +0,0 @@ -[build-system] -build-backend = "setuptools.build_meta" -requires = ["setuptools", "wheel"] diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore new file mode 100644 index 0000000000..b21bd681d9 --- /dev/null +++ b/src-tauri/.gitignore @@ -0,0 +1,7 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Generated by Tauri +# will have schema files for capabilities auto-completion +/gen/schemas diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock new file mode 100644 index 0000000000..5ded95af0e --- /dev/null +++ b/src-tauri/Cargo.lock @@ -0,0 +1,5082 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "brotli" +version = "8.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8119e4516436f5708bbc474a9d395bf12f1b5395e93a92a56e647ac3388c8610" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5962523e1b92ce1b5e793d9169b9943eece10d39f62550bc04bb605d75b94924" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.13.0", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.2.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link 0.2.1", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.13.0", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.13.0", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ctor" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "352d39c2f7bef1d6ad73db6f5160efcaed66d94ef8c6c573a8410c00bf909a98" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dbus" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b942602992bb7acfd1f51c49811c58a610ef9181b6e66f3e519d79b540a3bf73" +dependencies = [ + "libc", + "libdbus-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", +] + +[[package]] +name = "dev-sidecar" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-opener", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dom_query" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +dependencies = [ + "bit-set", + "cssparser", + "foldhash 0.2.0", + "html5ever", + "precomputed-hash", + "selectors", + "tendril", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dtor" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1057d6c64987086ff8ed0fd3fbf377a6b7d205cc7715868cd401705f715cbe4" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "embed-resource" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31a88c8d26de40ed18fe748c547845aa39de1db3afd958f8cb91579f3644bcb" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.2+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.13.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever", +] + +[[package]] +name = "http" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be7462df143984c4598a256ef469b251d7d7f9e271135073e78fc535414f3d0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png 0.17.16", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "js-sys" +version = "0.3.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.13.0", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libdbus-sys" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" +dependencies = [ + "pkg-config", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" +dependencies = [ + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" + +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + +[[package]] +name = "memchr" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47a2e3dff89cd322c66647942668faee0a2b1f88ea6cbb4d374b4a8d7e92528c" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.18", + "windows-sys 0.61.2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.0", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.13.0", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.13.0", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.0", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.13.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.13.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.13.0", + "block2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.13.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.13.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.13.0", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.13.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "open" +version = "5.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fbaa89d2ddc8473c78a3adf69eea8cffa28c483b8e02a971ef31527cd0fc92c" +dependencies = [ + "dunce", + "is-wsl", + "libc", + "pathdiff", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plist" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "092791278e026273c1b65bbdcfbba3a300f2994c896bd01ab01da613c29c46f1" +dependencies = [ + "base64 0.22.1", + "indexmap 2.14.0", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.0", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.12+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.39.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.0", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "reqwest" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.13.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.117", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.13.0", + "cssparser", + "derive_more", + "log", + "new_debug_unreachable", + "phf", + "phf_codegen", + "precomputed-hash", + "rustc-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_with" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" +dependencies = [ + "base64 0.22.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1c93047acf68669466a34690ac58cca7010bd1b201e1ec86f1fd0a75d3dd4a9" +dependencies = [ + "bitflags 2.13.0", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dbus", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "once_cell", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "437404997acf375d85f1177afa7e11bb971f274ed6a7b83a2a3e339015f4cc28" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.18", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa1f9055fc23919a54e4e125052bed16ed04aef0487086e758fe01a67b451c7" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a0319528a025a38c4078e7dae2c446f4e63620ddb0659a643ede1cb38f90e9" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png 0.17.16", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.117", + "tauri-utils", + "thiserror 2.0.18", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae6cb4e3896c21d2f6da5b31251d2faea0153bba56ed0e970f918115dbee4924" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e126abc9e84e35cdfd01596140a73a1850cdb0df0a23acf0185776c30b469a6e" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "walkdir", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17e1bea14edce6b793a04e2417e3fd924b9bc4faae83cdee7d714156cceeed29" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation", + "open", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "url", + "windows", + "zbus", +] + +[[package]] +name = "tauri-runtime" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48222d7116c8807eaa6fe2f372e023fae125084e61e6eca6d70b7961cdf129ef" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b83849ee63ecb27a8e8d0fe51915ca215076914aca43f96db1179f0f415f6cd9" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "092379df9a707631978e6c56b1bc2401d387f01e2d4a3c123360d167bbb9aa95" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dom_query", + "dunce", + "glob", + "http", + "infer", + "json-patch", + "log", + "memchr", + "phf", + "plist", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.18", + "toml 1.1.2+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc65d45c68858bfe420dd29e834b5d15dbecf8a07a8a16cf4d532c7b1f69d4b6" +dependencies = [ + "dunce", + "embed-resource", + "toml 1.1.2+spec-1.1.0", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4790fc369d5a530f4b544b094e31388b9b3a37c0f4652ade4505945f5660d24" +dependencies = [ + "new_debug_unreachable", + "utf-8", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.3", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.14.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.3", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow 1.0.3", +] + +[[package]] +name = "toml_writer" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.0", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15edbb0d80583e85ee8df283410038e17314df5cba30da2087a54a85216c0773" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.18", + "windows-sys 0.61.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d258b83ceec21034727ecee8c382cfa6c3e133699b0742c64571814fb420c9f7" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.3+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +dependencies = [ + "wit-bindgen 0.57.1", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.122" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.122" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.122" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.122" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.14.0", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.13.0", + "hashbrown 0.15.5", + "indexmap 2.14.0", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cff6eef815df1834fd250e3a2ff436044d82a9f1bc1980ca1dbdf07effc538" +dependencies = [ + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.18", + "windows", + "windows-core 0.61.2", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.14.0", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.13.0", + "indexmap 2.14.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.14.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "wry" +version = "0.55.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http", + "javascriptcore-rs", + "jni", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee682d202a77e4a9f3b2c2bdf48a7b28af5c08c34ddf66f98c93e5e39464285" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 1.0.3", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adf1bd45a81a103745b1757754762a26e8cd01e4532e4d6c8ec431624b80d1d6" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52d" +dependencies = [ + "serde", + "winnow 1.0.3", + "zvariant", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zvariant" +version = "5.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a192a0bde63360d77a7523c833d4b4ce6070a927e2c53246e4c540b1a3e27be0" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 1.0.3", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bc6cde9c01c511074be97f7ccb6c19d0da89e3f8662e812e999dcfd4638737" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8535915cfa75547e559d8c68e8139909a4aeee076831e4ef7fc59d8172c4d6" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.117", + "winnow 1.0.3", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml new file mode 100644 index 0000000000..3c11882aad --- /dev/null +++ b/src-tauri/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "dev-sidecar" +version = "0.1.0" +description = "A Tauri App" +authors = ["you"] +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +# The `_lib` suffix may seem redundant but it is necessary +# to make the lib name unique and wouldn't conflict with the bin name. +# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519 +name = "dev_sidecar_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = [] } +tauri-plugin-opener = "2" +serde = { version = "1", features = ["derive"] } +serde_json = "1" + diff --git a/src-tauri/build.rs b/src-tauri/build.rs new file mode 100644 index 0000000000..d860e1e6a7 --- /dev/null +++ b/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json new file mode 100644 index 0000000000..4cdbf49a76 --- /dev/null +++ b/src-tauri/capabilities/default.json @@ -0,0 +1,10 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Capability for the main window", + "windows": ["main"], + "permissions": [ + "core:default", + "opener:default" + ] +} diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png new file mode 100644 index 0000000000..ec444e38c0 Binary files /dev/null and b/src-tauri/icons/128x128.png differ diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000000..4b295a8408 Binary files /dev/null and b/src-tauri/icons/128x128@2x.png differ diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png new file mode 100644 index 0000000000..dc2a55b2cb Binary files /dev/null and b/src-tauri/icons/32x32.png differ diff --git a/src-tauri/icons/64x64.png b/src-tauri/icons/64x64.png new file mode 100644 index 0000000000..12f35294dd Binary files /dev/null and b/src-tauri/icons/64x64.png differ diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000000..e2e0352255 Binary files /dev/null and b/src-tauri/icons/Square107x107Logo.png differ diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 0000000000..e2569d6b51 Binary files /dev/null and b/src-tauri/icons/Square142x142Logo.png differ diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 0000000000..15eeea0150 Binary files /dev/null and b/src-tauri/icons/Square150x150Logo.png differ diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000000..c6518d8bbc Binary files /dev/null and b/src-tauri/icons/Square284x284Logo.png differ diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000000..80c711f1d5 Binary files /dev/null and b/src-tauri/icons/Square30x30Logo.png differ diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000000..d55e402a86 Binary files /dev/null and b/src-tauri/icons/Square310x310Logo.png differ diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 0000000000..9ad140e986 Binary files /dev/null and b/src-tauri/icons/Square44x44Logo.png differ diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000000..d50b5ea035 Binary files /dev/null and b/src-tauri/icons/Square71x71Logo.png differ diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 0000000000..4568d3bb83 Binary files /dev/null and b/src-tauri/icons/Square89x89Logo.png differ diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000000..9b83dbaf3b Binary files /dev/null and b/src-tauri/icons/StoreLogo.png differ diff --git a/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml b/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000000..2ffbf24b68 --- /dev/null +++ b/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000..7863202910 Binary files /dev/null and b/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png differ diff --git a/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..99821b40d3 Binary files /dev/null and b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000..e470436ff9 Binary files /dev/null and b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png differ diff --git a/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000..ba8d682ad7 Binary files /dev/null and b/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png differ diff --git a/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..ec86922966 Binary files /dev/null and b/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000..36d4f8d345 Binary files /dev/null and b/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png differ diff --git a/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000..dfcb8b00b6 Binary files /dev/null and b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png differ diff --git a/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..2e850955fd Binary files /dev/null and b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000..3bffb9d74f Binary files /dev/null and b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000..6d9476454b Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..6d591dd21c Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000..dcd47b8459 Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000..d4198e5cc5 Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..fb34a0b147 Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000..494fec824c Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/src-tauri/icons/android/values/ic_launcher_background.xml b/src-tauri/icons/android/values/ic_launcher_background.xml new file mode 100644 index 0000000000..ea9c223a6c --- /dev/null +++ b/src-tauri/icons/android/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #fff + \ No newline at end of file diff --git a/packages/gui/extra/favicon.ico b/src-tauri/icons/ico.ico similarity index 100% rename from packages/gui/extra/favicon.ico rename to src-tauri/icons/ico.ico diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns new file mode 100644 index 0000000000..3be8605f1a Binary files /dev/null and b/src-tauri/icons/icon.icns differ diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico new file mode 100644 index 0000000000..7122bf31e3 Binary files /dev/null and b/src-tauri/icons/icon.ico differ diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png new file mode 100644 index 0000000000..a5a0de7cd7 Binary files /dev/null and b/src-tauri/icons/icon.png differ diff --git a/src-tauri/icons/ios/AppIcon-20x20@1x.png b/src-tauri/icons/ios/AppIcon-20x20@1x.png new file mode 100644 index 0000000000..d9e933dab5 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-20x20@1x.png differ diff --git a/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/src-tauri/icons/ios/AppIcon-20x20@2x-1.png new file mode 100644 index 0000000000..58f3b70af0 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-20x20@2x-1.png differ diff --git a/src-tauri/icons/ios/AppIcon-20x20@2x.png b/src-tauri/icons/ios/AppIcon-20x20@2x.png new file mode 100644 index 0000000000..58f3b70af0 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-20x20@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-20x20@3x.png b/src-tauri/icons/ios/AppIcon-20x20@3x.png new file mode 100644 index 0000000000..2631ed8583 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-20x20@3x.png differ diff --git a/src-tauri/icons/ios/AppIcon-29x29@1x.png b/src-tauri/icons/ios/AppIcon-29x29@1x.png new file mode 100644 index 0000000000..9f1a93d407 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-29x29@1x.png differ diff --git a/src-tauri/icons/ios/AppIcon-29x29@2x-1.png b/src-tauri/icons/ios/AppIcon-29x29@2x-1.png new file mode 100644 index 0000000000..5b5bdba010 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-29x29@2x-1.png differ diff --git a/src-tauri/icons/ios/AppIcon-29x29@2x.png b/src-tauri/icons/ios/AppIcon-29x29@2x.png new file mode 100644 index 0000000000..5b5bdba010 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-29x29@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-29x29@3x.png b/src-tauri/icons/ios/AppIcon-29x29@3x.png new file mode 100644 index 0000000000..abae21c733 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-29x29@3x.png differ diff --git a/src-tauri/icons/ios/AppIcon-40x40@1x.png b/src-tauri/icons/ios/AppIcon-40x40@1x.png new file mode 100644 index 0000000000..58f3b70af0 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-40x40@1x.png differ diff --git a/src-tauri/icons/ios/AppIcon-40x40@2x-1.png b/src-tauri/icons/ios/AppIcon-40x40@2x-1.png new file mode 100644 index 0000000000..d0c7d30d87 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-40x40@2x-1.png differ diff --git a/src-tauri/icons/ios/AppIcon-40x40@2x.png b/src-tauri/icons/ios/AppIcon-40x40@2x.png new file mode 100644 index 0000000000..d0c7d30d87 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-40x40@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-40x40@3x.png b/src-tauri/icons/ios/AppIcon-40x40@3x.png new file mode 100644 index 0000000000..784e3948bf Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-40x40@3x.png differ diff --git a/src-tauri/icons/ios/AppIcon-512@2x.png b/src-tauri/icons/ios/AppIcon-512@2x.png new file mode 100644 index 0000000000..3e441ff0d5 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-512@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-60x60@2x.png b/src-tauri/icons/ios/AppIcon-60x60@2x.png new file mode 100644 index 0000000000..784e3948bf Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-60x60@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-60x60@3x.png b/src-tauri/icons/ios/AppIcon-60x60@3x.png new file mode 100644 index 0000000000..44d9cd8cd1 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-60x60@3x.png differ diff --git a/src-tauri/icons/ios/AppIcon-76x76@1x.png b/src-tauri/icons/ios/AppIcon-76x76@1x.png new file mode 100644 index 0000000000..46f8d496de Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-76x76@1x.png differ diff --git a/src-tauri/icons/ios/AppIcon-76x76@2x.png b/src-tauri/icons/ios/AppIcon-76x76@2x.png new file mode 100644 index 0000000000..4108865abb Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-76x76@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png new file mode 100644 index 0000000000..5a75a0b233 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png differ diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs new file mode 100644 index 0000000000..4a277ef350 --- /dev/null +++ b/src-tauri/src/lib.rs @@ -0,0 +1,14 @@ +// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ +#[tauri::command] +fn greet(name: &str) -> String { + format!("Hello, {}! You've been greeted from Rust!", name) +} + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + tauri::Builder::default() + .plugin(tauri_plugin_opener::init()) + .invoke_handler(tauri::generate_handler![greet]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs new file mode 100644 index 0000000000..4cacc7209b --- /dev/null +++ b/src-tauri/src/main.rs @@ -0,0 +1,6 @@ +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +fn main() { + dev_sidecar_lib::run() +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json new file mode 100644 index 0000000000..77602b1ab9 --- /dev/null +++ b/src-tauri/tauri.conf.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "dev-sidecar", + "version": "0.1.0", + "identifier": "com.docmirror.dev-sidecar", + "build": { + "beforeDevCommand": "pnpm dev", + "devUrl": "http://localhost:1420", + "beforeBuildCommand": "pnpm build", + "frontendDist": "../dist" + }, + "app": { + "windows": [ + { + "title": "dev-sidecar", + "width": 800, + "height": 600 + } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ] + } +} diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000000..b209212129 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,160 @@ + + + + + + \ No newline at end of file diff --git a/src/assets/icon.png b/src/assets/icon.png new file mode 100644 index 0000000000..a9ee6d62dc Binary files /dev/null and b/src/assets/icon.png differ diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000000..de275e7aa9 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,5 @@ +import { createApp } from "vue"; +import App from "./App.vue"; +import "./style.css"; + +createApp(App).mount("#app"); diff --git a/src/style.css b/src/style.css new file mode 100644 index 0000000000..f1d8c73cdc --- /dev/null +++ b/src/style.css @@ -0,0 +1 @@ +@import "tailwindcss"; diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000000..fc812394b5 --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,7 @@ +/// + +declare module "*.vue" { + import type { DefineComponent } from "vue"; + const component: DefineComponent<{}, {}, any>; + export default component; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000..088d6a2e91 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"], + }, + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }], +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000000..42872c59f5 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000000..812e61cd56 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,32 @@ +import { defineConfig } from "vite"; +import vue from "@vitejs/plugin-vue"; + +// @ts-expect-error process is a nodejs global +const host = process.env.TAURI_DEV_HOST; + +// https://vite.dev/config/ +export default defineConfig(async () => ({ + plugins: [vue()], + + // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` + // + // 1. prevent Vite from obscuring rust errors + clearScreen: false, + // 2. tauri expects a fixed port, fail if that port is not available + server: { + port: 1420, + strictPort: true, + host: host || false, + hmr: host + ? { + protocol: "ws", + host, + port: 1421, + } + : undefined, + watch: { + // 3. tell Vite to ignore watching `src-tauri` + ignored: ["**/src-tauri/**"], + }, + }, +}));