diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 00000000..beb596d4 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,5 @@ +[target.aarch64-unknown-linux-gnu] +linker = "aarch64-linux-gnu-gcc" + +[target.armv7-unknown-linux-gnueabihf] +linker = "arm-linux-gnueabihf-gcc" diff --git a/.github/build-for-linux/Dockerfile b/.github/build-for-linux/Dockerfile deleted file mode 100644 index 729644b3..00000000 --- a/.github/build-for-linux/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM rust:bookworm -COPY entrypoint.sh /entrypoint.sh -RUN chmod a+x /entrypoint.sh -ENTRYPOINT ["/entrypoint.sh"] diff --git a/.github/build-for-linux/action.yml b/.github/build-for-linux/action.yml deleted file mode 100644 index 17c171a0..00000000 --- a/.github/build-for-linux/action.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: "Build for Linux" -branding: - icon: user-check - color: gray-dark -inputs: - target: - required: true - description: "Rust Target" - -runs: - using: "docker" - image: "Dockerfile" - args: - - ${{ inputs.target }} diff --git a/.github/build-for-linux/build.sh b/.github/build-for-linux/build.sh deleted file mode 100644 index fbc18cc1..00000000 --- a/.github/build-for-linux/build.sh +++ /dev/null @@ -1,5 +0,0 @@ -pnpm install -pnpm check $INPUT_TARGET -sed -i "s/#openssl/openssl={version=\"0.10\",features=[\"vendored\"]}/g" src-tauri/Cargo.toml - -pnpm build --target $INPUT_TARGET diff --git a/.github/build-for-linux/entrypoint.sh b/.github/build-for-linux/entrypoint.sh deleted file mode 100644 index f02b7d8d..00000000 --- a/.github/build-for-linux/entrypoint.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -wget https://nodejs.org/dist/v20.10.0/node-v20.10.0-linux-x64.tar.xz -tar -Jxvf ./node-v20.10.0-linux-x64.tar.xz -export PATH=$(pwd)/node-v20.10.0-linux-x64/bin:$PATH -npm install pnpm -g - -rustup target add "$INPUT_TARGET" -echo "rustc version: $(rustc --version)" - -if [ "$INPUT_TARGET" = "x86_64-unknown-linux-gnu" ]; then - apt-get update - apt-get install -y libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.1-dev libsoup-3.0-dev libjavascriptcoregtk-4.1-dev - export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig -fi - -bash .github/build-for-linux/build.sh diff --git a/.github/workflows/alpha.yml b/.github/workflows/alpha.yml index 66f47c32..1c313007 100644 --- a/.github/workflows/alpha.yml +++ b/.github/workflows/alpha.yml @@ -22,14 +22,14 @@ jobs: include: - os: windows-latest target: x86_64-pc-windows-msvc - - os: windows-latest - target: i686-pc-windows-msvc - os: windows-latest target: aarch64-pc-windows-msvc - os: macos-latest target: aarch64-apple-darwin - os: macos-latest target: x86_64-apple-darwin + - os: ubuntu-22.04 + target: x86_64-unknown-linux-gnu runs-on: ${{ matrix.os }} steps: @@ -37,7 +37,7 @@ jobs: uses: actions/checkout@v4 - name: Install Rust Stable - uses: dtolnay/rust-toolchain@1.77.0 + uses: dtolnay/rust-toolchain@stable - name: Add Rust Target run: rustup target add ${{ matrix.target }} @@ -49,6 +49,12 @@ jobs: cache-all-crates: true cache-on-failure: true + - name: Install dependencies (ubuntu only) + if: matrix.os == 'ubuntu-22.04' + run: | + sudo apt-get update + sudo apt-get install -y libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf + - name: Install Node uses: actions/setup-node@v4 with: @@ -92,26 +98,107 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - alpha-for-linux: + alpha-for-linux-arm: strategy: fail-fast: false matrix: include: - - os: ubuntu-latest - target: x86_64-unknown-linux-gnu + - os: ubuntu-22.04 + target: aarch64-unknown-linux-gnu + arch: arm64 + - os: ubuntu-22.04 + target: armv7-unknown-linux-gnueabihf + arch: armhf runs-on: ${{ matrix.os }} steps: - name: Checkout Repository uses: actions/checkout@v4 + - name: Install Rust Stable + uses: dtolnay/rust-toolchain@stable + + - name: Add Rust Target + run: rustup target add ${{ matrix.target }} + + - name: Rust Cache + uses: Swatinem/rust-cache@v2 + with: + workspaces: src-tauri + cache-all-crates: true + + - name: Install Node + uses: actions/setup-node@v4 + with: + node-version: "20" + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + run_install: false + + - name: Pnpm install and check + run: | + pnpm i + pnpm check ${{ matrix.target }} + + - name: "Setup for linux" + run: |- + sudo ls -lR /etc/apt/ + + cat > /tmp/sources.list << EOF + deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy main multiverse universe restricted + deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy-security main multiverse universe restricted + deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy-updates main multiverse universe restricted + deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy-backports main multiverse universe restricted + + deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy main multiverse universe restricted + deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security main multiverse universe restricted + deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates main multiverse universe restricted + deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-backports main multiverse universe restricted + EOF + + sudo mv /etc/apt/sources.list /etc/apt/sources.list.default + sudo mv /tmp/sources.list /etc/apt/sources.list + + sudo dpkg --add-architecture ${{ matrix.arch }} + sudo apt update + + sudo apt install -y \ + libwebkit2gtk-4.1-dev:${{ matrix.arch }} \ + libayatana-appindicator3-dev:${{ matrix.arch }} \ + libssl-dev:${{ matrix.arch }} \ + patchelf:${{ matrix.arch }} \ + librsvg2-dev:${{ matrix.arch }} + + - name: "Install aarch64 tools" + if: matrix.target == 'aarch64-unknown-linux-gnu' + run: | + sudo apt install -y \ + gcc-aarch64-linux-gnu \ + g++-aarch64-linux-gnu + + - name: "Install armv7 tools" + if: matrix.target == 'armv7-unknown-linux-gnueabihf' + run: | + sudo apt install -y \ + gcc-arm-linux-gnueabihf \ + g++-arm-linux-gnueabihf + - name: Build for Linux - uses: ./.github/build-for-linux + run: | + export PKG_CONFIG_ALLOW_CROSS=1 + if [ "${{ matrix.target }}" == "aarch64-unknown-linux-gnu" ]; then + export PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig/:$PKG_CONFIG_PATH + export PKG_CONFIG_SYSROOT_DIR=/usr/aarch64-linux-gnu/ + elif [ "${{ matrix.target }}" == "armv7-unknown-linux-gnueabihf" ]; then + export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig/:$PKG_CONFIG_PATH + export PKG_CONFIG_SYSROOT_DIR=/usr/arm-linux-gnueabihf/ + fi + pnpm build --target ${{ matrix.target }} env: NODE_OPTIONS: "--max_old_space_size=4096" TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} - with: - target: ${{ matrix.target }} - name: Get Version run: | @@ -140,9 +227,6 @@ jobs: - os: windows-latest target: x86_64-pc-windows-msvc arch: x64 - - os: windows-latest - target: i686-pc-windows-msvc - arch: x86 - os: windows-latest target: aarch64-pc-windows-msvc arch: arm64 @@ -219,7 +303,7 @@ jobs: update_tag: name: Update tag runs-on: ubuntu-latest - needs: [alpha, alpha-for-linux, alpha-for-fixed-webview2] + needs: [alpha, alpha-for-linux-arm, alpha-for-fixed-webview2] steps: - name: Checkout repository uses: actions/checkout@v4 @@ -240,30 +324,30 @@ jobs: cat > release.txt << 'EOF' ## 我应该下载哪个版本? - ### MacOS (提示文件损坏或开发者无法验证请查看下面FAQ) + ### MacOS - MacOS intel芯片: x64.dmg - MacOS apple M芯片: aarch64.dmg ### Linux - Linux 64位: amd64.deb/amd64.rpm + - Linux arm64 architecture: arm64.deb/aarch64.rpm + - Linux armv7架构: armhf.deb/armhfp.rpm ### Windows (Win7 用户请查看下面FAQ中的解决方案) #### 正常版本(推荐) - 64位: x64-setup.exe - - 32位: x86-setup.exe - arm64架构: arm64-setup.exe - #### 便携版(不推荐使用,无法自动更新) - - 64位: x64_portable.zip - - 32位: x86_portable.zip - - arm64架构: arm64_portable.zip - #### 内置Webview2版(体积较大,仅在企业版系统或Win7无法安装webview2时使用) + #### 便携版问题很多不再提供 + #### 内置Webview2版(体积较大,仅在企业版系统或无法安装webview2时使用) - 64位: x64_fixed_webview2-setup.exe - - 32位: x86_fixed_webview2-setup.exe - arm64架构: arm64_fixed_webview2-setup.exe ### FAQ - - [FAQ](https://clash-verge-rev.github.io/faq/windows.html) + - [常见问题](https://clash-verge-rev.github.io/faq/windows.html) + + ### 稳定机场VPN推荐 + - [狗狗加速](https://verge.dginv.click/#/register?code=oaxsAGo6) Created at ${{ env.BUILDTIME }}. EOF diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index b0ffada7..c1013f5b 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -33,7 +33,7 @@ jobs: uses: actions/checkout@v4 - name: Install Rust Stable - uses: dtolnay/rust-toolchain@1.77.0 + uses: dtolnay/rust-toolchain@stable - name: Add Rust Target run: rustup target add ${{ matrix.target }} @@ -65,6 +65,14 @@ jobs: env: NODE_OPTIONS: "--max_old_space_size=4096" GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} + APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} with: tauriScript: pnpm args: --target ${{ matrix.target }} -b ${{ matrix.bundle }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0cb5fb38..b3eb79df 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,14 +15,14 @@ jobs: include: - os: windows-latest target: x86_64-pc-windows-msvc - - os: windows-latest - target: i686-pc-windows-msvc - os: windows-latest target: aarch64-pc-windows-msvc - os: macos-latest target: aarch64-apple-darwin - os: macos-latest target: x86_64-apple-darwin + - os: ubuntu-22.04 + target: x86_64-unknown-linux-gnu runs-on: ${{ matrix.os }} steps: @@ -30,7 +30,7 @@ jobs: uses: actions/checkout@v4 - name: Install Rust Stable - uses: dtolnay/rust-toolchain@1.77.0 + uses: dtolnay/rust-toolchain@stable - name: Add Rust Target run: rustup target add ${{ matrix.target }} @@ -41,10 +41,16 @@ jobs: workspaces: src-tauri cache-all-crates: true + - name: Install dependencies (ubuntu only) + if: matrix.os == 'ubuntu-22.04' + run: | + sudo apt-get update + sudo apt-get install -y libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf + - name: Install Node uses: actions/setup-node@v4 with: - node-version: "20" + node-version: "22" - uses: pnpm/action-setup@v4 name: Install pnpm @@ -61,8 +67,8 @@ jobs: env: NODE_OPTIONS: "--max_old_space_size=4096" GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} @@ -82,38 +88,114 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - release-for-linux: + release-for-linux-arm: strategy: fail-fast: false matrix: include: - - os: ubuntu-latest - target: x86_64-unknown-linux-gnu - - os: ubuntu-latest - target: i686-unknown-linux-gnu - - os: ubuntu-latest + - os: ubuntu-22.04 target: aarch64-unknown-linux-gnu - - os: ubuntu-latest + arch: arm64 + - os: ubuntu-22.04 target: armv7-unknown-linux-gnueabihf + arch: armhf runs-on: ${{ matrix.os }} steps: - name: Checkout Repository uses: actions/checkout@v4 + - name: Install Rust Stable + uses: dtolnay/rust-toolchain@stable + + - name: Add Rust Target + run: rustup target add ${{ matrix.target }} + + - name: Rust Cache + uses: Swatinem/rust-cache@v2 + with: + workspaces: src-tauri + cache-all-crates: true + + - name: Install Node + uses: actions/setup-node@v4 + with: + node-version: "22" + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + run_install: false + + - name: Pnpm install and check + run: | + pnpm i + pnpm check ${{ matrix.target }} + + - name: "Setup for linux" + run: |- + sudo ls -lR /etc/apt/ + + cat > /tmp/sources.list << EOF + deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy main multiverse universe restricted + deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy-security main multiverse universe restricted + deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy-updates main multiverse universe restricted + deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu jammy-backports main multiverse universe restricted + + deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy main multiverse universe restricted + deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security main multiverse universe restricted + deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates main multiverse universe restricted + deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-backports main multiverse universe restricted + EOF + + sudo mv /etc/apt/sources.list /etc/apt/sources.list.default + sudo mv /tmp/sources.list /etc/apt/sources.list + + sudo dpkg --add-architecture ${{ matrix.arch }} + sudo apt update + + sudo apt install -y \ + libwebkit2gtk-4.1-dev:${{ matrix.arch }} \ + libayatana-appindicator3-dev:${{ matrix.arch }} \ + libssl-dev:${{ matrix.arch }} \ + patchelf:${{ matrix.arch }} \ + librsvg2-dev:${{ matrix.arch }} + + - name: "Install aarch64 tools" + if: matrix.target == 'aarch64-unknown-linux-gnu' + run: | + sudo apt install -y \ + gcc-aarch64-linux-gnu \ + g++-aarch64-linux-gnu + + - name: "Install armv7 tools" + if: matrix.target == 'armv7-unknown-linux-gnueabihf' + run: | + sudo apt install -y \ + gcc-arm-linux-gnueabihf \ + g++-arm-linux-gnueabihf + - name: Build for Linux - uses: ./.github/build-for-linux + run: | + export PKG_CONFIG_ALLOW_CROSS=1 + if [ "${{ matrix.target }}" == "aarch64-unknown-linux-gnu" ]; then + export PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig/:$PKG_CONFIG_PATH + export PKG_CONFIG_SYSROOT_DIR=/usr/aarch64-linux-gnu/ + elif [ "${{ matrix.target }}" == "armv7-unknown-linux-gnueabihf" ]; then + export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig/:$PKG_CONFIG_PATH + export PKG_CONFIG_SYSROOT_DIR=/usr/arm-linux-gnueabihf/ + fi + pnpm build --target ${{ matrix.target }} env: NODE_OPTIONS: "--max_old_space_size=4096" - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} - with: - target: ${{ matrix.target }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} - name: Get Version run: | sudo apt-get update sudo apt-get install jq echo "VERSION=$(cat package.json | jq '.version' | tr -d '"')" >> $GITHUB_ENV + echo "BUILDTIME=$(TZ=Asia/Shanghai date)" >> $GITHUB_ENV - name: Upload Release uses: softprops/action-gh-release@v2 @@ -156,7 +238,7 @@ jobs: - name: Install Node uses: actions/setup-node@v4 with: - node-version: "20" + node-version: "22" - uses: pnpm/action-setup@v4 name: Install pnpm @@ -181,8 +263,8 @@ jobs: env: NODE_OPTIONS: "--max_old_space_size=4096" GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} with: tauriScript: pnpm args: --target ${{ matrix.target }} @@ -209,7 +291,7 @@ jobs: release-update: runs-on: ubuntu-latest - needs: [release, release-for-linux] + needs: [release, release-for-linux-arm] steps: - name: Checkout repository uses: actions/checkout@v4 @@ -217,7 +299,7 @@ jobs: - name: Install Node uses: actions/setup-node@v4 with: - node-version: "20" + node-version: "22" - uses: pnpm/action-setup@v4 name: Install pnpm @@ -242,7 +324,7 @@ jobs: - name: Install Node uses: actions/setup-node@v4 with: - node-version: "20" + node-version: "22" - uses: pnpm/action-setup@v4 name: Install pnpm diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9848f6b0..f719f314 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,15 +17,28 @@ If you're a Windows user, you may need to perform some additional steps: - Make sure to add Rust and Node.js to your system's PATH. This is usually done during the installation process, but you can verify and manually add them if necessary. - The gnu `patch` tool should be installed -### Install Node.js Packages - -After installing Rust and Node.js, install the necessary Node.js packages: +When you setup `Rust` environment, Only use toolchain with `Windows MSVC` , to change settings follow command: ```shell -pnpm i +rustup target add x86_64-pc-windows-msvc +rustup set default-host x86_64-pc-windows-msvc ``` -### Download the Clash Binary +### Install Node.js Package + +After installing Rust and Node.js, install the necessary Node.js and Node Package Manager: + +```shell +npm install pnpm -g +``` + +### Install Dependencies + +```shell +pnpm install +``` + +### Download the Clash Mihomo Core Binary You have two options for downloading the clash binary: @@ -49,12 +62,14 @@ pnpm dev:diff ### Build the Project -If you want to build the project, use: +To build this project: ```shell -pnpm build +pnpm run build ``` +The `Artifacts` will display in the `log` in the Terminal. + ## Contributing Your Changes Once you have made your changes: diff --git a/README.md b/README.md index caf11bc5..0a3a9083 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Supports Windows (x64/x86), Linux (x64/arm64) and macOS 10.15+ (intel/apple). --- -### TG Group: [@clash_verge_rev](https://t.me/clash_verge_rev) +### TG 频道: [@clash_verge_rev](https://t.me/clash_verge_re) ## Promotion diff --git a/UPDATELOG.md b/UPDATELOG.md index 69806df8..ac845328 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -1,9 +1,67 @@ ## v2.0.0 +### Notice + +- 历时3个月的紧密开发与严格测试稳定版2.0.0终于发布了:巨量改进与性能、稳定性提升,目前Clash Verge Rev已经有了比肩cfw的健壮性;而且更强大易用! +- 由于更改了服务安装逻辑,Mac/Linux 首次安装需要输入 2 遍系统密码卸载和安装服务,以后可以丝滑使用 tun(虚拟网卡)模式 +- 因 Tauri 2.0 底层 bug,关闭窗口暂时修改为最小化功能 + ### Breaking changes - 重大框架升级:使用 Tauri 2.0(巨量改进与性能提升) -- 敬请测试,出现 bug 到 issues 中提出 +- 强烈建议完全删除 1.x 老版本再安装此版本 +- 出现 bug 到 issues 中提出;以后不再接受1.x版本的bug反馈。 + +### Features + +- Meta(mihomo)内核升级 1.18.10 +- Win 下的系统代理替换为 Shadowsocks/CFW/v2rayN 等成熟的 sysproxy.exe 方案,解决拨号/VPN 环境下无法设置系统代理的问题 +- 服务模式改进为启动软件时自动安装,TUN 模式可自由开启不再限制于服务模式 +- Mac 下可用 URL Scheme 导入订阅 +- 可使用 Ctrl(cmd)+Q 快捷键退出程序 +- 成功导入订阅的提示消息 +- 能自动选中新导入的订阅 +- 日志加入颜色区分 +- 改进多处文本表述 +- 加入图标 svg 格式检测 +- 增加更多 app 调试日志 +- 添加 MacOS 下白色桌面的 tray 黑色配色(但会代理系统代理、tun 模式图标失效的问题) +- 增加 Webdav 备份功能 +- 添加统一延迟的设置开关 +- 添加 Windows 下自动检测并下载 vc runtime 的功能 +- 支持显示 mux 和 mptcp 的节点标识 +- 延迟测试连接更换 https 的 cp.cloudflare.com/generate_204 以防止机场劫持(关闭统一延迟的情况下延迟测试结果会有所增加)。 +- 重构日志记录逻辑,可以收集和筛选所有日志类型了(之前无法记录debug的日志类型) + +### Performance + +- 优化及重构内核启动管理逻辑 +- 优化 TUN 启动逻辑 +- 重构和优化 app_handle +- 重构系统代理绕过逻辑 +- 移除无用的 PID 创建逻辑 +- 优化系统 DNS 设置逻辑 +- 后端实现窗口控制 +- 重构 MacOS 下的 DNS 设置逻辑 + +### Bugs Fixes + +- 修复已有多个订阅导入新订阅会跳选订阅的问题 +- 修复多个 Linux 下的 bug, Tun 模式在 Linux 下目前工作正常 +- 修复 Linux wayland 下任务栏图标缺失的问题 +- 修复 Linux KDE 桌面环境无法启动的问题 +- 移除多余退出变量和钩子 +- 修复 MacOS 下 tray 菜单重启 app 失效的问题 +- 修复某些特定配置文件载入失败的问题 +- 修复 MacOS 下 tun 模式 fakeip 不生效的问题 +- 修复 Linux 下 关闭 tun 模式文件报错的问题 +- 修复快捷键设置的相关 bug +- 修复 Win 下点左键菜单闪现的问题(Mac 下的操作逻辑相反,默认情况下不管点左/右键均会打开菜单,闪现不属于 bug) + +### Known issues + +- Windows 下窗口大小无法记忆(等待上游修复) +- Webdav 备份因为安全性和兼容性问题,暂不支持同步 Webdav 服务器地址和登录信息;跨平台配置同步 --- diff --git a/package.json b/package.json index e46a234a..bd910091 100644 --- a/package.json +++ b/package.json @@ -3,95 +3,96 @@ "version": "2.0.0", "license": "GPL-3.0-only", "scripts": { - "dev": "tauri dev", - "dev:diff": "tauri dev -f verge-dev", - "build": "tauri build", + "dev": "cross-env RUST_BACKTRACE=1 tauri dev", + "dev:diff": "cross-env RUST_BACKTRACE=1 tauri dev -f verge-dev", + "build": "cross-env NODE_OPTIONS='--max-old-space-size=4096' tauri build", "tauri": "tauri", "web:dev": "vite", - "web:build": "tsc && vite build", + "web:build": "tsc --noEmit && vite build", "web:serve": "vite preview", "check": "node scripts/check.mjs", "updater": "node scripts/updater.mjs", "updater-fixed-webview2": "node scripts/updater-fixed-webview2.mjs", "portable": "node scripts/portable.mjs", "portable-fixed-webview2": "node scripts/portable-fixed-webview2.mjs", - "prepare": "husky install" + "prepare": "husky" }, "dependencies": { "@dnd-kit/core": "^6.1.0", "@dnd-kit/sortable": "^8.0.0", "@dnd-kit/utilities": "^3.2.2", - "@emotion/react": "^11.11.4", - "@emotion/styled": "^11.11.5", + "@emotion/react": "^11.13.3", + "@emotion/styled": "^11.13.0", "@juggle/resize-observer": "^3.4.0", - "@mui/icons-material": "^5.16.0", + "@mui/icons-material": "^6.1.6", "@mui/lab": "5.0.0-alpha.149", - "@mui/material": "^5.16.0", - "@mui/x-data-grid": "^7.9.0", - "@tauri-apps/api": "2.0.0-rc.4", - "@tauri-apps/plugin-clipboard-manager": "2.0.0-rc.0", - "@tauri-apps/plugin-dialog": "^2.0.0-rc", - "@tauri-apps/plugin-fs": "^2.0.0-rc", - "@tauri-apps/plugin-global-shortcut": "^2.0.0-rc", - "@tauri-apps/plugin-notification": "^2.0.0-rc", - "@tauri-apps/plugin-process": "^2.0.0-rc", - "@tauri-apps/plugin-shell": "^2.0.0-rc", - "@tauri-apps/plugin-updater": "^2.0.0-rc", + "@mui/material": "^6.1.6", + "@mui/x-data-grid": "^7.22.2", + "@tauri-apps/api": "2.1.1", + "@tauri-apps/plugin-clipboard-manager": "2.0.0", + "@tauri-apps/plugin-dialog": "^2.0.1", + "@tauri-apps/plugin-fs": "^2.0.2", + "@tauri-apps/plugin-global-shortcut": "^2.0.0", + "@tauri-apps/plugin-notification": "^2.0.0", + "@tauri-apps/plugin-process": "^2.0.0", + "@tauri-apps/plugin-shell": "^2.0.1", + "@tauri-apps/plugin-updater": "^2.0.0", "@types/json-schema": "^7.0.15", - "ahooks": "^3.8.0", - "axios": "^1.7.2", - "dayjs": "1.11.5", - "foxact": "^0.2.35", - "i18next": "^23.11.5", + "ahooks": "^3.8.1", + "axios": "^1.7.7", + "cli-color": "^2.0.4", + "dayjs": "1.11.13", + "foxact": "^0.2.41", + "glob": "^11.0.0", + "i18next": "^23.16.5", "js-base64": "^3.7.7", "js-yaml": "^4.1.0", "lodash-es": "^4.17.21", - "meta-json-schema": "1.18.6", - "monaco-editor": "^0.49.0", - "monaco-yaml": "^5.2.0", - "nanoid": "^5.0.7", - "peggy": "^4.0.3", + "monaco-editor": "^0.52.0", + "monaco-yaml": "^5.2.3", + "nanoid": "^5.0.8", + "peggy": "^4.1.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-error-boundary": "^3.1.4", - "react-hook-form": "^7.52.1", - "react-i18next": "^13.5.0", + "react-error-boundary": "^4.1.2", + "react-hook-form": "^7.53.2", + "react-i18next": "^15.1.1", "react-markdown": "^9.0.1", - "react-monaco-editor": "^0.55.0", - "react-router-dom": "^6.24.1", + "react-monaco-editor": "^0.56.2", + "react-router-dom": "^6.28.0", "react-transition-group": "^4.4.5", - "react-virtuoso": "^4.7.11", + "react-virtuoso": "^4.12.0", "sockette": "^2.0.6", "swr": "^2.2.5", - "tar": "^6.2.1", - "types-pac": "^1.0.2" + "tar": "^7.4.3", + "types-pac": "^1.0.3", + "zustand": "^5.0.1" }, "devDependencies": { - "@actions/github": "^5.1.1", - "@tauri-apps/cli": "2.0.0-rc.8", - "@types/fs-extra": "^9.0.13", + "@actions/github": "^6.0.0", + "@tauri-apps/cli": "2.1.0", "@types/js-cookie": "^3.0.6", "@types/js-yaml": "^4.0.9", "@types/lodash-es": "^4.17.12", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", - "@types/react-transition-group": "^4.4.10", - "@vitejs/plugin-legacy": "^5.4.1", - "@vitejs/plugin-react": "^4.3.1", - "adm-zip": "^0.5.14", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@types/react-transition-group": "^4.4.11", + "@vitejs/plugin-legacy": "^5.4.3", + "@vitejs/plugin-react": "^4.3.3", + "adm-zip": "^0.5.16", "cross-env": "^7.0.3", - "fs-extra": "^11.2.0", - "https-proxy-agent": "^5.0.1", - "husky": "^7.0.4", + "https-proxy-agent": "^7.0.5", + "husky": "^9.1.7", + "meta-json-schema": "^1.18.10", "node-fetch": "^3.3.2", - "prettier": "^2.8.8", - "pretty-quick": "^3.3.1", - "sass": "^1.77.6", - "terser": "^5.31.1", - "typescript": "^5.5.3", - "vite": "^5.3.3", + "prettier": "^3.3.3", + "pretty-quick": "^4.0.0", + "sass": "^1.81.0", + "terser": "^5.36.0", + "typescript": "^5.6.3", + "vite": "^5.4.11", "vite-plugin-monaco-editor": "^1.1.0", - "vite-plugin-svgr": "^4.2.0" + "vite-plugin-svgr": "^4.3.0" }, "prettier": { "tabWidth": 2, @@ -99,5 +100,6 @@ "singleQuote": false, "endOfLine": "lf" }, - "packageManager": "pnpm@9.1.4" + "type": "module", + "packageManager": "pnpm@9.13.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 637363e2..9c265a76 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,71 +17,77 @@ importers: specifier: ^3.2.2 version: 3.2.2(react@18.3.1) "@emotion/react": - specifier: ^11.11.4 - version: 11.11.4(@types/react@18.3.3)(react@18.3.1) + specifier: ^11.13.3 + version: 11.13.3(@types/react@18.3.12)(react@18.3.1) "@emotion/styled": - specifier: ^11.11.5 - version: 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + specifier: ^11.13.0 + version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) "@juggle/resize-observer": specifier: ^3.4.0 version: 3.4.0 "@mui/icons-material": - specifier: ^5.16.0 - version: 5.16.0(@mui/material@5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + specifier: ^6.1.6 + version: 6.1.6(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) "@mui/lab": specifier: 5.0.0-alpha.149 - version: 5.0.0-alpha.149(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.0.0-alpha.149(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@mui/material": - specifier: ^5.16.0 - version: 5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^6.1.6 + version: 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@mui/x-data-grid": - specifier: ^7.9.0 - version: 7.9.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^7.22.2 + version: 7.22.2(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@tauri-apps/api": - specifier: 2.0.0-rc.4 - version: 2.0.0-rc.4 + specifier: 2.1.1 + version: 2.1.1 "@tauri-apps/plugin-clipboard-manager": - specifier: 2.0.0-rc.0 - version: 2.0.0-rc.0 + specifier: 2.0.0 + version: 2.0.0 "@tauri-apps/plugin-dialog": - specifier: ^2.0.0-rc - version: 2.0.0-rc.0 + specifier: ^2.0.1 + version: 2.0.1 "@tauri-apps/plugin-fs": - specifier: ^2.0.0-rc - version: 2.0.0-rc.1 + specifier: ^2.0.2 + version: 2.0.2 "@tauri-apps/plugin-global-shortcut": - specifier: ^2.0.0-rc - version: 2.0.0-rc.0 + specifier: ^2.0.0 + version: 2.0.0 "@tauri-apps/plugin-notification": - specifier: ^2.0.0-rc - version: 2.0.0-rc.0 + specifier: ^2.0.0 + version: 2.0.0 "@tauri-apps/plugin-process": - specifier: ^2.0.0-rc - version: 2.0.0-rc.0 + specifier: ^2.0.0 + version: 2.0.0 "@tauri-apps/plugin-shell": - specifier: ^2.0.0-rc - version: 2.0.0-rc.0 + specifier: ^2.0.1 + version: 2.0.1 "@tauri-apps/plugin-updater": - specifier: ^2.0.0-rc - version: 2.0.0-rc.0 + specifier: ^2.0.0 + version: 2.0.0 "@types/json-schema": specifier: ^7.0.15 version: 7.0.15 ahooks: - specifier: ^3.8.0 - version: 3.8.0(react@18.3.1) + specifier: ^3.8.1 + version: 3.8.1(react@18.3.1) axios: - specifier: ^1.7.2 - version: 1.7.2 + specifier: ^1.7.7 + version: 1.7.7 + cli-color: + specifier: ^2.0.4 + version: 2.0.4 dayjs: - specifier: 1.11.5 - version: 1.11.5 + specifier: 1.11.13 + version: 1.11.13 foxact: - specifier: ^0.2.35 - version: 0.2.35(react@18.3.1) + specifier: ^0.2.41 + version: 0.2.41(react@18.3.1) + glob: + specifier: ^11.0.0 + version: 11.0.0 i18next: - specifier: ^23.11.5 - version: 23.11.5 + specifier: ^23.16.5 + version: 23.16.5 js-base64: specifier: ^3.7.7 version: 3.7.7 @@ -91,21 +97,18 @@ importers: lodash-es: specifier: ^4.17.21 version: 4.17.21 - meta-json-schema: - specifier: 1.18.6 - version: 1.18.6 monaco-editor: - specifier: ^0.49.0 - version: 0.49.0 + specifier: ^0.52.0 + version: 0.52.0 monaco-yaml: - specifier: ^5.2.0 - version: 5.2.0(monaco-editor@0.49.0) + specifier: ^5.2.3 + version: 5.2.3(monaco-editor@0.52.0) nanoid: - specifier: ^5.0.7 - version: 5.0.7 + specifier: ^5.0.8 + version: 5.0.8 peggy: - specifier: ^4.0.3 - version: 4.0.3 + specifier: ^4.1.1 + version: 4.1.1 react: specifier: ^18.3.1 version: 18.3.1 @@ -113,29 +116,29 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) react-error-boundary: - specifier: ^3.1.4 - version: 3.1.4(react@18.3.1) + specifier: ^4.1.2 + version: 4.1.2(react@18.3.1) react-hook-form: - specifier: ^7.52.1 - version: 7.52.1(react@18.3.1) + specifier: ^7.53.2 + version: 7.53.2(react@18.3.1) react-i18next: - specifier: ^13.5.0 - version: 13.5.0(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^15.1.1 + version: 15.1.1(i18next@23.16.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-markdown: specifier: ^9.0.1 - version: 9.0.1(@types/react@18.3.3)(react@18.3.1) + version: 9.0.1(@types/react@18.3.12)(react@18.3.1) react-monaco-editor: - specifier: ^0.55.0 - version: 0.55.0(@types/react@18.3.3)(monaco-editor@0.49.0)(react@18.3.1) + specifier: ^0.56.2 + version: 0.56.2(@types/react@18.3.12)(monaco-editor@0.52.0)(react@18.3.1) react-router-dom: - specifier: ^6.24.1 - version: 6.24.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^6.28.0 + version: 6.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-transition-group: specifier: ^4.4.5 version: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-virtuoso: - specifier: ^4.7.11 - version: 4.7.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^4.12.0 + version: 4.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) sockette: specifier: ^2.0.6 version: 2.0.6 @@ -143,21 +146,21 @@ importers: specifier: ^2.2.5 version: 2.2.5(react@18.3.1) tar: - specifier: ^6.2.1 - version: 6.2.1 + specifier: ^7.4.3 + version: 7.4.3 types-pac: - specifier: ^1.0.2 - version: 1.0.2 + specifier: ^1.0.3 + version: 1.0.3 + zustand: + specifier: ^5.0.1 + version: 5.0.1(@types/react@18.3.12)(react@18.3.1)(use-sync-external-store@1.2.2(react@18.3.1)) devDependencies: "@actions/github": - specifier: ^5.1.1 - version: 5.1.1 + specifier: ^6.0.0 + version: 6.0.0 "@tauri-apps/cli": - specifier: 2.0.0-rc.8 - version: 2.0.0-rc.8 - "@types/fs-extra": - specifier: ^9.0.13 - version: 9.0.13 + specifier: 2.1.0 + version: 2.1.0 "@types/js-cookie": specifier: ^3.0.6 version: 3.0.6 @@ -168,74 +171,74 @@ importers: specifier: ^4.17.12 version: 4.17.12 "@types/react": - specifier: ^18.3.3 - version: 18.3.3 + specifier: ^18.3.12 + version: 18.3.12 "@types/react-dom": - specifier: ^18.3.0 - version: 18.3.0 + specifier: ^18.3.1 + version: 18.3.1 "@types/react-transition-group": - specifier: ^4.4.10 - version: 4.4.10 + specifier: ^4.4.11 + version: 4.4.11 "@vitejs/plugin-legacy": - specifier: ^5.4.1 - version: 5.4.1(terser@5.31.1)(vite@5.3.3(@types/node@20.14.10)(sass@1.77.6)(terser@5.31.1)) + specifier: ^5.4.3 + version: 5.4.3(terser@5.36.0)(vite@5.4.11(@types/node@20.14.10)(sass@1.81.0)(terser@5.36.0)) "@vitejs/plugin-react": - specifier: ^4.3.1 - version: 4.3.1(vite@5.3.3(@types/node@20.14.10)(sass@1.77.6)(terser@5.31.1)) + specifier: ^4.3.3 + version: 4.3.3(vite@5.4.11(@types/node@20.14.10)(sass@1.81.0)(terser@5.36.0)) adm-zip: - specifier: ^0.5.14 - version: 0.5.14 + specifier: ^0.5.16 + version: 0.5.16 cross-env: specifier: ^7.0.3 version: 7.0.3 - fs-extra: - specifier: ^11.2.0 - version: 11.2.0 https-proxy-agent: - specifier: ^5.0.1 - version: 5.0.1 + specifier: ^7.0.5 + version: 7.0.5 husky: - specifier: ^7.0.4 - version: 7.0.4 + specifier: ^9.1.7 + version: 9.1.7 + meta-json-schema: + specifier: ^1.18.10 + version: 1.18.10 node-fetch: specifier: ^3.3.2 version: 3.3.2 prettier: - specifier: ^2.8.8 - version: 2.8.8 + specifier: ^3.3.3 + version: 3.3.3 pretty-quick: - specifier: ^3.3.1 - version: 3.3.1(prettier@2.8.8) + specifier: ^4.0.0 + version: 4.0.0(prettier@3.3.3) sass: - specifier: ^1.77.6 - version: 1.77.6 + specifier: ^1.81.0 + version: 1.81.0 terser: - specifier: ^5.31.1 - version: 5.31.1 + specifier: ^5.36.0 + version: 5.36.0 typescript: - specifier: ^5.5.3 - version: 5.5.3 + specifier: ^5.6.3 + version: 5.6.3 vite: - specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.10)(sass@1.77.6)(terser@5.31.1) + specifier: ^5.4.11 + version: 5.4.11(@types/node@20.14.10)(sass@1.81.0)(terser@5.36.0) vite-plugin-monaco-editor: specifier: ^1.1.0 - version: 1.1.0(monaco-editor@0.49.0) + version: 1.1.0(monaco-editor@0.52.0) vite-plugin-svgr: - specifier: ^4.2.0 - version: 4.2.0(rollup@4.18.0)(typescript@5.5.3)(vite@5.3.3(@types/node@20.14.10)(sass@1.77.6)(terser@5.31.1)) + specifier: ^4.3.0 + version: 4.3.0(rollup@4.25.0)(typescript@5.6.3)(vite@5.4.11(@types/node@20.14.10)(sass@1.81.0)(terser@5.36.0)) packages: - "@actions/github@5.1.1": + "@actions/github@6.0.0": resolution: { - integrity: sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g==, + integrity: sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g==, } - "@actions/http-client@2.2.1": + "@actions/http-client@2.2.3": resolution: { - integrity: sha512-KhC/cZsq7f8I4LfZSJKgCvEwfkE8o1538VoBeoGzokVLLnbFDEAdFD3UhoMklxo2un9NJVBdANOresx7vTHlHw==, + integrity: sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==, } "@ampproject/remapping@2.3.0": @@ -245,259 +248,233 @@ packages: } engines: { node: ">=6.0.0" } - "@babel/code-frame@7.24.7": + "@babel/code-frame@7.26.2": resolution: { - integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==, + integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==, } engines: { node: ">=6.9.0" } - "@babel/compat-data@7.24.7": + "@babel/compat-data@7.26.2": resolution: { - integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==, + integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==, } engines: { node: ">=6.9.0" } - "@babel/core@7.24.7": + "@babel/core@7.26.0": resolution: { - integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==, + integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==, } engines: { node: ">=6.9.0" } - "@babel/generator@7.24.7": + "@babel/generator@7.26.2": resolution: { - integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==, + integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==, } engines: { node: ">=6.9.0" } - "@babel/helper-annotate-as-pure@7.24.7": + "@babel/helper-annotate-as-pure@7.25.9": resolution: { - integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==, + integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==, } engines: { node: ">=6.9.0" } - "@babel/helper-builder-binary-assignment-operator-visitor@7.24.7": + "@babel/helper-builder-binary-assignment-operator-visitor@7.25.9": resolution: { - integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==, + integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==, } engines: { node: ">=6.9.0" } - "@babel/helper-compilation-targets@7.24.7": + "@babel/helper-compilation-targets@7.25.9": resolution: { - integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==, + integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==, } engines: { node: ">=6.9.0" } - "@babel/helper-create-class-features-plugin@7.24.7": + "@babel/helper-create-class-features-plugin@7.25.9": resolution: { - integrity: sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==, + integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0 - "@babel/helper-create-regexp-features-plugin@7.24.7": + "@babel/helper-create-regexp-features-plugin@7.25.9": resolution: { - integrity: sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==, + integrity: sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0 - "@babel/helper-define-polyfill-provider@0.6.2": + "@babel/helper-define-polyfill-provider@0.6.3": resolution: { - integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==, + integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==, } peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - "@babel/helper-environment-visitor@7.24.7": + "@babel/helper-member-expression-to-functions@7.25.9": resolution: { - integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==, + integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==, } engines: { node: ">=6.9.0" } - "@babel/helper-function-name@7.24.7": + "@babel/helper-module-imports@7.25.9": resolution: { - integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==, + integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==, } engines: { node: ">=6.9.0" } - "@babel/helper-hoist-variables@7.24.7": + "@babel/helper-module-transforms@7.26.0": resolution: { - integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-member-expression-to-functions@7.24.7": - resolution: - { - integrity: sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-module-imports@7.24.7": - resolution: - { - integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-module-transforms@7.24.7": - resolution: - { - integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==, + integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0 - "@babel/helper-optimise-call-expression@7.24.7": + "@babel/helper-optimise-call-expression@7.25.9": resolution: { - integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==, + integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==, } engines: { node: ">=6.9.0" } - "@babel/helper-plugin-utils@7.24.7": + "@babel/helper-plugin-utils@7.25.9": resolution: { - integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==, + integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==, } engines: { node: ">=6.9.0" } - "@babel/helper-remap-async-to-generator@7.24.7": + "@babel/helper-remap-async-to-generator@7.25.9": resolution: { - integrity: sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==, + integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0 - "@babel/helper-replace-supers@7.24.7": + "@babel/helper-replace-supers@7.25.9": resolution: { - integrity: sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==, + integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0 - "@babel/helper-simple-access@7.24.7": + "@babel/helper-simple-access@7.25.9": resolution: { - integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==, + integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==, } engines: { node: ">=6.9.0" } - "@babel/helper-skip-transparent-expression-wrappers@7.24.7": + "@babel/helper-skip-transparent-expression-wrappers@7.25.9": resolution: { - integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==, + integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==, } engines: { node: ">=6.9.0" } - "@babel/helper-split-export-declaration@7.24.7": + "@babel/helper-string-parser@7.25.9": resolution: { - integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==, + integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==, } engines: { node: ">=6.9.0" } - "@babel/helper-string-parser@7.24.7": + "@babel/helper-validator-identifier@7.25.9": resolution: { - integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==, + integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==, } engines: { node: ">=6.9.0" } - "@babel/helper-validator-identifier@7.24.7": + "@babel/helper-validator-option@7.25.9": resolution: { - integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==, + integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==, } engines: { node: ">=6.9.0" } - "@babel/helper-validator-option@7.24.7": + "@babel/helper-wrap-function@7.25.9": resolution: { - integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==, + integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==, } engines: { node: ">=6.9.0" } - "@babel/helper-wrap-function@7.24.7": + "@babel/helpers@7.26.0": resolution: { - integrity: sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==, + integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==, } engines: { node: ">=6.9.0" } - "@babel/helpers@7.24.7": + "@babel/parser@7.26.2": resolution: { - integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==, - } - engines: { node: ">=6.9.0" } - - "@babel/highlight@7.24.7": - resolution: - { - integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==, - } - engines: { node: ">=6.9.0" } - - "@babel/parser@7.24.7": - resolution: - { - integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==, + integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==, } engines: { node: ">=6.0.0" } hasBin: true - "@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.7": + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9": resolution: { - integrity: sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==, + integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0 - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.7": + "@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9": resolution: { - integrity: sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==, + integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0 - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7": + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9": resolution: { - integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==, + integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9": + resolution: + { + integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.13.0 - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.7": + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9": resolution: { - integrity: sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==, + integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==, } engines: { node: ">=6.9.0" } peerDependencies: @@ -512,142 +489,19 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-syntax-async-generators@7.8.4": + "@babel/plugin-syntax-import-assertions@7.26.0": resolution: { - integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-class-properties@7.12.13": - resolution: - { - integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-class-static-block@7.14.5": - resolution: - { - integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, + integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-syntax-dynamic-import@7.8.3": + "@babel/plugin-syntax-import-attributes@7.26.0": resolution: { - integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-export-namespace-from@7.8.3": - resolution: - { - integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-import-assertions@7.24.7": - resolution: - { - integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-import-attributes@7.24.7": - resolution: - { - integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-import-meta@7.10.4": - resolution: - { - integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-json-strings@7.8.3": - resolution: - { - integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-logical-assignment-operators@7.10.4": - resolution: - { - integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-nullish-coalescing-operator@7.8.3": - resolution: - { - integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-numeric-separator@7.10.4": - resolution: - { - integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-object-rest-spread@7.8.3": - resolution: - { - integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-optional-catch-binding@7.8.3": - resolution: - { - integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-optional-chaining@7.8.3": - resolution: - { - integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-private-property-in-object@7.14.5": - resolution: - { - integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-top-level-await@7.14.5": - resolution: - { - integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, + integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==, } engines: { node: ">=6.9.0" } peerDependencies: @@ -662,460 +516,478 @@ packages: peerDependencies: "@babel/core": ^7.0.0 - "@babel/plugin-transform-arrow-functions@7.24.7": + "@babel/plugin-transform-arrow-functions@7.25.9": resolution: { - integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==, + integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-async-generator-functions@7.24.7": + "@babel/plugin-transform-async-generator-functions@7.25.9": resolution: { - integrity: sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==, + integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-async-to-generator@7.24.7": + "@babel/plugin-transform-async-to-generator@7.25.9": resolution: { - integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==, + integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-block-scoped-functions@7.24.7": + "@babel/plugin-transform-block-scoped-functions@7.25.9": resolution: { - integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==, + integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-block-scoping@7.24.7": + "@babel/plugin-transform-block-scoping@7.25.9": resolution: { - integrity: sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==, + integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-class-properties@7.24.7": + "@babel/plugin-transform-class-properties@7.25.9": resolution: { - integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==, + integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-class-static-block@7.24.7": + "@babel/plugin-transform-class-static-block@7.26.0": resolution: { - integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==, + integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.12.0 - "@babel/plugin-transform-classes@7.24.7": + "@babel/plugin-transform-classes@7.25.9": resolution: { - integrity: sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==, + integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-computed-properties@7.24.7": + "@babel/plugin-transform-computed-properties@7.25.9": resolution: { - integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==, + integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-destructuring@7.24.7": + "@babel/plugin-transform-destructuring@7.25.9": resolution: { - integrity: sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==, + integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-dotall-regex@7.24.7": + "@babel/plugin-transform-dotall-regex@7.25.9": resolution: { - integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==, + integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-duplicate-keys@7.24.7": + "@babel/plugin-transform-duplicate-keys@7.25.9": resolution: { - integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==, + integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-dynamic-import@7.24.7": + "@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9": resolution: { - integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-exponentiation-operator@7.24.7": - resolution: - { - integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-export-namespace-from@7.24.7": - resolution: - { - integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-for-of@7.24.7": - resolution: - { - integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-function-name@7.24.7": - resolution: - { - integrity: sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-json-strings@7.24.7": - resolution: - { - integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-literals@7.24.7": - resolution: - { - integrity: sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-logical-assignment-operators@7.24.7": - resolution: - { - integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-member-expression-literals@7.24.7": - resolution: - { - integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-modules-amd@7.24.7": - resolution: - { - integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-modules-commonjs@7.24.7": - resolution: - { - integrity: sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-modules-systemjs@7.24.7": - resolution: - { - integrity: sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-modules-umd@7.24.7": - resolution: - { - integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-named-capturing-groups-regex@7.24.7": - resolution: - { - integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==, + integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0 - "@babel/plugin-transform-new-target@7.24.7": + "@babel/plugin-transform-dynamic-import@7.25.9": resolution: { - integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==, + integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-nullish-coalescing-operator@7.24.7": + "@babel/plugin-transform-exponentiation-operator@7.25.9": resolution: { - integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==, + integrity: sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-numeric-separator@7.24.7": + "@babel/plugin-transform-export-namespace-from@7.25.9": resolution: { - integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==, + integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-object-rest-spread@7.24.7": + "@babel/plugin-transform-for-of@7.25.9": resolution: { - integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==, + integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-object-super@7.24.7": + "@babel/plugin-transform-function-name@7.25.9": resolution: { - integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==, + integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-optional-catch-binding@7.24.7": + "@babel/plugin-transform-json-strings@7.25.9": resolution: { - integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==, + integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-optional-chaining@7.24.7": + "@babel/plugin-transform-literals@7.25.9": resolution: { - integrity: sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==, + integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-parameters@7.24.7": + "@babel/plugin-transform-logical-assignment-operators@7.25.9": resolution: { - integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==, + integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-private-methods@7.24.7": + "@babel/plugin-transform-member-expression-literals@7.25.9": resolution: { - integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==, + integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-private-property-in-object@7.24.7": + "@babel/plugin-transform-modules-amd@7.25.9": resolution: { - integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==, + integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-property-literals@7.24.7": + "@babel/plugin-transform-modules-commonjs@7.25.9": resolution: { - integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==, + integrity: sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-react-jsx-self@7.24.7": + "@babel/plugin-transform-modules-systemjs@7.25.9": resolution: { - integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==, + integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-react-jsx-source@7.24.7": + "@babel/plugin-transform-modules-umd@7.25.9": resolution: { - integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==, + integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-regenerator@7.24.7": + "@babel/plugin-transform-named-capturing-groups-regex@7.25.9": resolution: { - integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-reserved-words@7.24.7": - resolution: - { - integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-shorthand-properties@7.24.7": - resolution: - { - integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-spread@7.24.7": - resolution: - { - integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-sticky-regex@7.24.7": - resolution: - { - integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-template-literals@7.24.7": - resolution: - { - integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-typeof-symbol@7.24.7": - resolution: - { - integrity: sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-unicode-escapes@7.24.7": - resolution: - { - integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-unicode-property-regex@7.24.7": - resolution: - { - integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-unicode-regex@7.24.7": - resolution: - { - integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-unicode-sets-regex@7.24.7": - resolution: - { - integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==, + integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0 - "@babel/preset-env@7.24.7": + "@babel/plugin-transform-new-target@7.25.9": resolution: { - integrity: sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==, + integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-nullish-coalescing-operator@7.25.9": + resolution: + { + integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-numeric-separator@7.25.9": + resolution: + { + integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-object-rest-spread@7.25.9": + resolution: + { + integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-object-super@7.25.9": + resolution: + { + integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-optional-catch-binding@7.25.9": + resolution: + { + integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-optional-chaining@7.25.9": + resolution: + { + integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-parameters@7.25.9": + resolution: + { + integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-private-methods@7.25.9": + resolution: + { + integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-private-property-in-object@7.25.9": + resolution: + { + integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-property-literals@7.25.9": + resolution: + { + integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-react-jsx-self@7.25.9": + resolution: + { + integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-react-jsx-source@7.25.9": + resolution: + { + integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-regenerator@7.25.9": + resolution: + { + integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-regexp-modifiers@7.26.0": + resolution: + { + integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/plugin-transform-reserved-words@7.25.9": + resolution: + { + integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-shorthand-properties@7.25.9": + resolution: + { + integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-spread@7.25.9": + resolution: + { + integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-sticky-regex@7.25.9": + resolution: + { + integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-template-literals@7.25.9": + resolution: + { + integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-typeof-symbol@7.25.9": + resolution: + { + integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-unicode-escapes@7.25.9": + resolution: + { + integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-unicode-property-regex@7.25.9": + resolution: + { + integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-unicode-regex@7.25.9": + resolution: + { + integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-unicode-sets-regex@7.25.9": + resolution: + { + integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/preset-env@7.26.0": + resolution: + { + integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==, } engines: { node: ">=6.9.0" } peerDependencies: @@ -1129,37 +1001,31 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 - "@babel/regjsgen@0.8.0": + "@babel/runtime@7.26.0": resolution: { - integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==, - } - - "@babel/runtime@7.24.7": - resolution: - { - integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==, + integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==, } engines: { node: ">=6.9.0" } - "@babel/template@7.24.7": + "@babel/template@7.25.9": resolution: { - integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==, + integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==, } engines: { node: ">=6.9.0" } - "@babel/traverse@7.24.7": + "@babel/traverse@7.25.9": resolution: { - integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==, + integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==, } engines: { node: ">=6.9.0" } - "@babel/types@7.24.7": + "@babel/types@7.26.0": resolution: { - integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==, + integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==, } engines: { node: ">=6.9.0" } @@ -1197,40 +1063,40 @@ packages: peerDependencies: react: ">=16.8.0" - "@emotion/babel-plugin@11.11.0": + "@emotion/babel-plugin@11.12.0": resolution: { - integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==, + integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==, } - "@emotion/cache@11.11.0": + "@emotion/cache@11.13.1": resolution: { - integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==, + integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==, } - "@emotion/hash@0.9.1": + "@emotion/hash@0.9.2": resolution: { - integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==, + integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==, } - "@emotion/is-prop-valid@1.2.2": + "@emotion/is-prop-valid@1.3.1": resolution: { - integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==, + integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==, } - "@emotion/memoize@0.8.1": + "@emotion/memoize@0.9.0": resolution: { - integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==, + integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==, } - "@emotion/react@11.11.4": + "@emotion/react@11.13.3": resolution: { - integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==, + integrity: sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==, } peerDependencies: "@types/react": "*" @@ -1239,22 +1105,22 @@ packages: "@types/react": optional: true - "@emotion/serialize@1.1.4": + "@emotion/serialize@1.3.2": resolution: { - integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==, + integrity: sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==, } - "@emotion/sheet@1.2.2": + "@emotion/sheet@1.4.0": resolution: { - integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==, + integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==, } - "@emotion/styled@11.11.5": + "@emotion/styled@11.13.0": resolution: { - integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==, + integrity: sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==, } peerDependencies: "@emotion/react": ^11.0.0-rc.0 @@ -1264,30 +1130,30 @@ packages: "@types/react": optional: true - "@emotion/unitless@0.8.1": + "@emotion/unitless@0.10.0": resolution: { - integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==, + integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==, } - "@emotion/use-insertion-effect-with-fallbacks@1.0.1": + "@emotion/use-insertion-effect-with-fallbacks@1.1.0": resolution: { - integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==, + integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==, } peerDependencies: react: ">=16.8.0" - "@emotion/utils@1.2.1": + "@emotion/utils@1.4.1": resolution: { - integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==, + integrity: sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==, } - "@emotion/weak-memoize@0.3.1": + "@emotion/weak-memoize@0.4.0": resolution: { - integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==, + integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==, } "@esbuild/aix-ppc64@0.21.5": @@ -1504,33 +1370,47 @@ packages: } engines: { node: ">=14" } - "@floating-ui/core@1.6.4": + "@floating-ui/core@1.6.8": resolution: { - integrity: sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==, + integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==, } - "@floating-ui/dom@1.6.7": + "@floating-ui/dom@1.6.12": resolution: { - integrity: sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==, + integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==, } - "@floating-ui/react-dom@2.1.1": + "@floating-ui/react-dom@2.1.2": resolution: { - integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==, + integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==, } peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - "@floating-ui/utils@0.2.4": + "@floating-ui/utils@0.2.8": resolution: { - integrity: sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==, + integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==, } + "@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" } + "@jridgewell/gen-mapping@0.3.5": resolution: { @@ -1558,10 +1438,10 @@ packages: integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==, } - "@jridgewell/sourcemap-codec@1.4.15": + "@jridgewell/sourcemap-codec@1.5.0": resolution: { - integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, } "@jridgewell/trace-mapping@0.3.25": @@ -1590,36 +1470,22 @@ packages: "@types/react": optional: true - "@mui/base@5.0.0-beta.40": + "@mui/core-downloads-tracker@6.1.6": resolution: { - integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==, - } - engines: { node: ">=12.0.0" } - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - - "@mui/core-downloads-tracker@5.16.0": - resolution: - { - integrity: sha512-8SLffXYPRVpcZx5QzxNE8fytTqzp+IuU3deZbQWg/vSaTlDpR5YVrQ4qQtXTi5cRdhOufV5INylmwlKK+//nPw==, + integrity: sha512-nz1SlR9TdBYYPz4qKoNasMPRiGb4PaIHFkzLzhju0YVYS5QSuFF2+n7CsiHMIDcHv3piPu/xDWI53ruhOqvZwQ==, } - "@mui/icons-material@5.16.0": + "@mui/icons-material@6.1.6": resolution: { - integrity: sha512-6ISoOhkp9w5gD0PEW9JklrcbyARDkFWNTBdwXZ1Oy5IGlyu9B0zG0hnUIe4H17IaF1Vgj6C8VI+v4tkSdK0veg==, + integrity: sha512-5r9urIL2lxXb/sPN3LFfFYEibsXJUb986HhhIeu1gOcte460pwdSiEhBSxkAuyT8Dj7jvu9MjqSBmSumQELo8A==, } - engines: { node: ">=12.0.0" } + engines: { node: ">=14.0.0" } peerDependencies: - "@mui/material": ^5.0.0 - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + "@mui/material": ^6.1.6 + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: "@types/react": optional: true @@ -1645,30 +1511,33 @@ packages: "@types/react": optional: true - "@mui/material@5.16.0": + "@mui/material@6.1.6": resolution: { - integrity: sha512-DbR1NckTLpjt9Zut9EGQ70th86HfN0BYQgyYro6aXQrNfjzSwe3BJS1AyBQ5mJ7TdL6YVRqohfukxj9JlqZZUg==, + integrity: sha512-1yvejiQ/601l5AK3uIdUlAVElyCxoqKnl7QA+2oFB/2qYPWfRwDgavW/MoywS5Y2gZEslcJKhe0s2F3IthgFgw==, } - engines: { node: ">=12.0.0" } + engines: { node: ">=14.0.0" } peerDependencies: "@emotion/react": ^11.5.0 "@emotion/styled": ^11.3.0 - "@types/react": ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 + "@mui/material-pigment-css": ^6.1.6 + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: "@emotion/react": optional: true "@emotion/styled": optional: true + "@mui/material-pigment-css": + optional: true "@types/react": optional: true - "@mui/private-theming@5.16.0": + "@mui/private-theming@5.16.6": resolution: { - integrity: sha512-sYpubkO1MZOnxNyVOClrPNOTs0MfuRVVnAvCeMaOaXt6GimgQbnUcshYv2pSr6PFj+Mqzdff/FYOBceK8u5QgA==, + integrity: sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==, } engines: { node: ">=12.0.0" } peerDependencies: @@ -1678,10 +1547,23 @@ packages: "@types/react": optional: true - "@mui/styled-engine@5.15.14": + "@mui/private-theming@6.1.6": resolution: { - integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==, + integrity: sha512-ioAiFckaD/fJSnTrUMWgjl9HYBWt7ixCh7zZw7gDZ+Tae7NuprNV6QJK95EidDT7K0GetR2rU3kAeIR61Myttw==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + + "@mui/styled-engine@5.16.6": + resolution: + { + integrity: sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==, } engines: { node: ">=12.0.0" } peerDependencies: @@ -1694,10 +1576,26 @@ packages: "@emotion/styled": optional: true - "@mui/system@5.16.0": + "@mui/styled-engine@6.1.6": resolution: { - integrity: sha512-9YbkC2m3+pNumAvubYv+ijLtog6puJ0fJ6rYfzfLCM47pWrw3m+30nXNM8zMgDaKL6vpfWJcCXm+LPaWBpy7sw==, + integrity: sha512-I+yS1cSuSvHnZDBO7e7VHxTWpj+R7XlSZvTC4lS/OIbUNJOMMSd3UDP6V2sfwzAdmdDNBi7NGCRv2SZ6O9hGDA==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + "@emotion/react": ^11.4.1 + "@emotion/styled": ^11.3.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@emotion/react": + optional: true + "@emotion/styled": + optional: true + + "@mui/system@5.16.7": + resolution: + { + integrity: sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==, } engines: { node: ">=12.0.0" } peerDependencies: @@ -1713,21 +1611,40 @@ packages: "@types/react": optional: true - "@mui/types@7.2.14": + "@mui/system@6.1.6": resolution: { - integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==, + integrity: sha512-qOf1VUE9wK8syiB0BBCp82oNBAVPYdj4Trh+G1s+L+ImYiKlubWhhqlnvWt3xqMevR+D2h1CXzA1vhX2FvA+VQ==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + "@emotion/react": ^11.5.0 + "@emotion/styled": ^11.3.0 + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@emotion/react": + optional: true + "@emotion/styled": + optional: true + "@types/react": + optional: true + + "@mui/types@7.2.19": + resolution: + { + integrity: sha512-6XpZEM/Q3epK9RN8ENoXuygnqUQxE+siN/6rGRi2iwJPgBUR25mphYQ9ZI87plGh58YoZ5pp40bFvKYOCDJ3tA==, } peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: "@types/react": optional: true - "@mui/utils@5.16.0": + "@mui/utils@5.16.6": resolution: { - integrity: sha512-kLLi5J1xY+mwtUlMb8Ubdxf4qFAA1+U7WPBvjM/qQ4CIwLCohNb0sHo1oYPufjSIH/Z9+dhVxD7dJlfGjd1AVA==, + integrity: sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==, } engines: { node: ">=12.0.0" } peerDependencies: @@ -1737,21 +1654,42 @@ packages: "@types/react": optional: true - "@mui/x-data-grid@7.9.0": + "@mui/utils@6.1.6": resolution: { - integrity: sha512-RkrVD+tfcR/h3j2p2uqohxA00C5tCJIV5gb5+2ap8XdM0Y8XMF81bB8UADWenU5W83UTErWvtU7n4gCl7hJO9g==, + integrity: sha512-sBS6D9mJECtELASLM+18WUcXF6RH3zNxBRFeyCRg8wad6NbyNrdxLuwK+Ikvc38sTZwBzAz691HmSofLqHd9sQ==, } engines: { node: ">=14.0.0" } peerDependencies: - "@mui/material": ^5.15.14 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 + "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true - "@mui/x-internals@7.9.0": + "@mui/x-data-grid@7.22.2": resolution: { - integrity: sha512-RJRrM6moaDZ8S11gDt8OKVclKm2v9khpIyLkpenNze+tT4dQYoU3liW5P2t31hA4Na/T6JQKNosB4qmB2TYfZw==, + integrity: sha512-yfy2s5A6tbajQZiEdsba49T4FYb9F0WPrzbbG30dl1+sIiX4ZRX7ma44UIDGPZrsZv8xkkE+p8qeJxZ7OaMteA==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + "@emotion/react": ^11.9.0 + "@emotion/styled": ^11.8.1 + "@mui/material": ^5.15.14 || ^6.0.0 + "@mui/system": ^5.15.14 || ^6.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + "@emotion/react": + optional: true + "@emotion/styled": + optional: true + + "@mui/x-internals@7.21.0": + resolution: + { + integrity: sha512-94YNyZ0BhK5Z+Tkr90RKf47IVCW8R/1MvdUhh6MCQg6sZa74jsX+x+gEZ4kzuCqOsuyTyxikeQ8vVuCIQiP7UQ==, } engines: { node: ">=14.0.0" } peerDependencies: @@ -1772,94 +1710,245 @@ packages: react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 - "@octokit/auth-token@2.5.0": + "@octokit/auth-token@4.0.0": resolution: { - integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==, + integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==, + } + engines: { node: ">= 18" } + + "@octokit/core@5.2.0": + resolution: + { + integrity: sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==, + } + engines: { node: ">= 18" } + + "@octokit/endpoint@9.0.5": + resolution: + { + integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==, + } + engines: { node: ">= 18" } + + "@octokit/graphql@7.1.0": + resolution: + { + integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==, + } + engines: { node: ">= 18" } + + "@octokit/openapi-types@20.0.0": + resolution: + { + integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==, } - "@octokit/core@3.6.0": + "@octokit/openapi-types@22.2.0": resolution: { - integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==, + integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==, } - "@octokit/endpoint@6.0.12": + "@octokit/plugin-paginate-rest@9.2.1": resolution: { - integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==, - } - - "@octokit/graphql@4.8.0": - resolution: - { - integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==, - } - - "@octokit/openapi-types@12.11.0": - resolution: - { - integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==, - } - - "@octokit/plugin-paginate-rest@2.21.3": - resolution: - { - integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==, + integrity: sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==, } + engines: { node: ">= 18" } peerDependencies: - "@octokit/core": ">=2" + "@octokit/core": "5" - "@octokit/plugin-rest-endpoint-methods@5.16.2": + "@octokit/plugin-rest-endpoint-methods@10.4.1": resolution: { - integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==, + integrity: sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==, } + engines: { node: ">= 18" } peerDependencies: - "@octokit/core": ">=3" + "@octokit/core": "5" - "@octokit/request-error@2.1.0": + "@octokit/request-error@5.1.0": resolution: { - integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==, + integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==, + } + engines: { node: ">= 18" } + + "@octokit/request@8.4.0": + resolution: + { + integrity: sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==, + } + engines: { node: ">= 18" } + + "@octokit/types@12.6.0": + resolution: + { + integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==, } - "@octokit/request@5.6.3": + "@octokit/types@13.6.1": resolution: { - integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==, + integrity: sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g==, } - "@octokit/types@6.41.0": + "@parcel/watcher-android-arm64@2.5.0": resolution: { - integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==, + integrity: sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==, } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [android] - "@peggyjs/from-mem@1.3.0": + "@parcel/watcher-darwin-arm64@2.5.0": resolution: { - integrity: sha512-kzGoIRJjkg3KuGI4bopz9UvF3KguzfxalHRDEIdqEZUe45xezsQ6cx30e0RKuxPUexojQRBfu89Okn7f4/QXsw==, + integrity: sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [darwin] + + "@parcel/watcher-darwin-x64@2.5.0": + resolution: + { + integrity: sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [darwin] + + "@parcel/watcher-freebsd-x64@2.5.0": + resolution: + { + integrity: sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [freebsd] + + "@parcel/watcher-linux-arm-glibc@2.5.0": + resolution: + { + integrity: sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm] + os: [linux] + + "@parcel/watcher-linux-arm-musl@2.5.0": + resolution: + { + integrity: sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm] + os: [linux] + + "@parcel/watcher-linux-arm64-glibc@2.5.0": + resolution: + { + integrity: sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [linux] + + "@parcel/watcher-linux-arm64-musl@2.5.0": + resolution: + { + integrity: sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [linux] + + "@parcel/watcher-linux-x64-glibc@2.5.0": + resolution: + { + integrity: sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [linux] + + "@parcel/watcher-linux-x64-musl@2.5.0": + resolution: + { + integrity: sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [linux] + + "@parcel/watcher-win32-arm64@2.5.0": + resolution: + { + integrity: sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [win32] + + "@parcel/watcher-win32-ia32@2.5.0": + resolution: + { + integrity: sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==, + } + engines: { node: ">= 10.0.0" } + cpu: [ia32] + os: [win32] + + "@parcel/watcher-win32-x64@2.5.0": + resolution: + { + integrity: sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [win32] + + "@parcel/watcher@2.5.0": + resolution: + { + integrity: sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==, + } + engines: { node: ">= 10.0.0" } + + "@peggyjs/from-mem@1.3.4": + resolution: + { + integrity: sha512-6DqaCO73ihyM2AJ2Vl4QQGmmU3MoD4hFh0RFRzxPdLkSLfE0QMEyDfaojE/R3KbsL1UP4VQyJA2clwX4agSTBw==, } engines: { node: ">=18" } + "@pkgjs/parseargs@0.11.0": + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + } + engines: { node: ">=14" } + "@popperjs/core@2.11.8": resolution: { integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==, } - "@remix-run/router@1.17.1": + "@remix-run/router@1.21.0": resolution: { - integrity: sha512-mCOMec4BKd6BRGBZeSnGiIgwsbLGp3yhVqAD8H+PxiRNEHgDpZb8J1TnrSDlg97t0ySKMQJTHCWBCmBpSmkF6Q==, + integrity: sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==, } engines: { node: ">=14.0.0" } - "@rollup/pluginutils@5.1.0": + "@rollup/pluginutils@5.1.3": resolution: { - integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==, + integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==, } engines: { node: ">=14.0.0" } peerDependencies: @@ -1868,130 +1957,146 @@ packages: rollup: optional: true - "@rollup/rollup-android-arm-eabi@4.18.0": + "@rollup/rollup-android-arm-eabi@4.25.0": resolution: { - integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==, + integrity: sha512-CC/ZqFZwlAIbU1wUPisHyV/XRc5RydFrNLtgl3dGYskdwPZdt4HERtKm50a/+DtTlKeCq9IXFEWR+P6blwjqBA==, } cpu: [arm] os: [android] - "@rollup/rollup-android-arm64@4.18.0": + "@rollup/rollup-android-arm64@4.25.0": resolution: { - integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==, + integrity: sha512-/Y76tmLGUJqVBXXCfVS8Q8FJqYGhgH4wl4qTA24E9v/IJM0XvJCGQVSW1QZ4J+VURO9h8YCa28sTFacZXwK7Rg==, } cpu: [arm64] os: [android] - "@rollup/rollup-darwin-arm64@4.18.0": + "@rollup/rollup-darwin-arm64@4.25.0": resolution: { - integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==, + integrity: sha512-YVT6L3UrKTlC0FpCZd0MGA7NVdp7YNaEqkENbWQ7AOVOqd/7VzyHpgIpc1mIaxRAo1ZsJRH45fq8j4N63I/vvg==, } cpu: [arm64] os: [darwin] - "@rollup/rollup-darwin-x64@4.18.0": + "@rollup/rollup-darwin-x64@4.25.0": resolution: { - integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==, + integrity: sha512-ZRL+gexs3+ZmmWmGKEU43Bdn67kWnMeWXLFhcVv5Un8FQcx38yulHBA7XR2+KQdYIOtD0yZDWBCudmfj6lQJoA==, } cpu: [x64] os: [darwin] - "@rollup/rollup-linux-arm-gnueabihf@4.18.0": + "@rollup/rollup-freebsd-arm64@4.25.0": resolution: { - integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==, + integrity: sha512-xpEIXhiP27EAylEpreCozozsxWQ2TJbOLSivGfXhU4G1TBVEYtUPi2pOZBnvGXHyOdLAUUhPnJzH3ah5cqF01g==, + } + cpu: [arm64] + os: [freebsd] + + "@rollup/rollup-freebsd-x64@4.25.0": + resolution: + { + integrity: sha512-sC5FsmZGlJv5dOcURrsnIK7ngc3Kirnx3as2XU9uER+zjfyqIjdcMVgzy4cOawhsssqzoAX19qmxgJ8a14Qrqw==, + } + cpu: [x64] + os: [freebsd] + + "@rollup/rollup-linux-arm-gnueabihf@4.25.0": + resolution: + { + integrity: sha512-uD/dbLSs1BEPzg564TpRAQ/YvTnCds2XxyOndAO8nJhaQcqQGFgv/DAVko/ZHap3boCvxnzYMa3mTkV/B/3SWA==, } cpu: [arm] os: [linux] - "@rollup/rollup-linux-arm-musleabihf@4.18.0": + "@rollup/rollup-linux-arm-musleabihf@4.25.0": resolution: { - integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==, + integrity: sha512-ZVt/XkrDlQWegDWrwyC3l0OfAF7yeJUF4fq5RMS07YM72BlSfn2fQQ6lPyBNjt+YbczMguPiJoCfaQC2dnflpQ==, } cpu: [arm] os: [linux] - "@rollup/rollup-linux-arm64-gnu@4.18.0": + "@rollup/rollup-linux-arm64-gnu@4.25.0": resolution: { - integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==, + integrity: sha512-qboZ+T0gHAW2kkSDPHxu7quaFaaBlynODXpBVnPxUgvWYaE84xgCKAPEYE+fSMd3Zv5PyFZR+L0tCdYCMAtG0A==, } cpu: [arm64] os: [linux] - "@rollup/rollup-linux-arm64-musl@4.18.0": + "@rollup/rollup-linux-arm64-musl@4.25.0": resolution: { - integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==, + integrity: sha512-ndWTSEmAaKr88dBuogGH2NZaxe7u2rDoArsejNslugHZ+r44NfWiwjzizVS1nUOHo+n1Z6qV3X60rqE/HlISgw==, } cpu: [arm64] os: [linux] - "@rollup/rollup-linux-powerpc64le-gnu@4.18.0": + "@rollup/rollup-linux-powerpc64le-gnu@4.25.0": resolution: { - integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==, + integrity: sha512-BVSQvVa2v5hKwJSy6X7W1fjDex6yZnNKy3Kx1JGimccHft6HV0THTwNtC2zawtNXKUu+S5CjXslilYdKBAadzA==, } cpu: [ppc64] os: [linux] - "@rollup/rollup-linux-riscv64-gnu@4.18.0": + "@rollup/rollup-linux-riscv64-gnu@4.25.0": resolution: { - integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==, + integrity: sha512-G4hTREQrIdeV0PE2JruzI+vXdRnaK1pg64hemHq2v5fhv8C7WjVaeXc9P5i4Q5UC06d/L+zA0mszYIKl+wY8oA==, } cpu: [riscv64] os: [linux] - "@rollup/rollup-linux-s390x-gnu@4.18.0": + "@rollup/rollup-linux-s390x-gnu@4.25.0": resolution: { - integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==, + integrity: sha512-9T/w0kQ+upxdkFL9zPVB6zy9vWW1deA3g8IauJxojN4bnz5FwSsUAD034KpXIVX5j5p/rn6XqumBMxfRkcHapQ==, } cpu: [s390x] os: [linux] - "@rollup/rollup-linux-x64-gnu@4.18.0": + "@rollup/rollup-linux-x64-gnu@4.25.0": resolution: { - integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==, + integrity: sha512-ThcnU0EcMDn+J4B9LD++OgBYxZusuA7iemIIiz5yzEcFg04VZFzdFjuwPdlURmYPZw+fgVrFzj4CA64jSTG4Ig==, } cpu: [x64] os: [linux] - "@rollup/rollup-linux-x64-musl@4.18.0": + "@rollup/rollup-linux-x64-musl@4.25.0": resolution: { - integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==, + integrity: sha512-zx71aY2oQxGxAT1JShfhNG79PnjYhMC6voAjzpu/xmMjDnKNf6Nl/xv7YaB/9SIa9jDYf8RBPWEnjcdlhlv1rQ==, } cpu: [x64] os: [linux] - "@rollup/rollup-win32-arm64-msvc@4.18.0": + "@rollup/rollup-win32-arm64-msvc@4.25.0": resolution: { - integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==, + integrity: sha512-JT8tcjNocMs4CylWY/CxVLnv8e1lE7ff1fi6kbGocWwxDq9pj30IJ28Peb+Y8yiPNSF28oad42ApJB8oUkwGww==, } cpu: [arm64] os: [win32] - "@rollup/rollup-win32-ia32-msvc@4.18.0": + "@rollup/rollup-win32-ia32-msvc@4.25.0": resolution: { - integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==, + integrity: sha512-dRLjLsO3dNOfSN6tjyVlG+Msm4IiZnGkuZ7G5NmpzwF9oOc582FZG05+UdfTbz5Jd4buK/wMb6UeHFhG18+OEg==, } cpu: [ia32] os: [win32] - "@rollup/rollup-win32-x64-msvc@4.18.0": + "@rollup/rollup-win32-x64-msvc@4.25.0": resolution: { - integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==, + integrity: sha512-/RqrIFtLB926frMhZD0a5oDa4eFIbyNEwLLloMTEjmqfwZWXywwVVOVmwTsuyhC9HKkVEZcOOi+KV4U9wmOdlg==, } cpu: [x64] os: [win32] @@ -2100,156 +2205,156 @@ packages: peerDependencies: "@svgr/core": "*" - "@tauri-apps/api@2.0.0-rc.4": + "@tauri-apps/api@2.1.1": resolution: { - integrity: sha512-UNiIhhKG08j4ooss2oEEVexffmWkgkYlC2M3GcX3VPtNsqFgVNL8Mcw/4Y7rO9M9S+ffAMnLOF5ypzyuyb8tyg==, + integrity: sha512-fzUfFFKo4lknXGJq8qrCidkUcKcH2UHhfaaCNt4GzgzGaW2iS26uFOg4tS3H4P8D6ZEeUxtiD5z0nwFF0UN30A==, } - "@tauri-apps/cli-darwin-arm64@2.0.0-rc.8": + "@tauri-apps/cli-darwin-arm64@2.1.0": resolution: { - integrity: sha512-XDjFLfCz7gOsKg9qFyK7S9EbrdcLhWE2bSTvHDpnFdMc+DcjMR4O3HuCO7SrPmmFUf86OknYFiuMPEUoHf0Fiw==, + integrity: sha512-ESc6J6CE8hl1yKH2vJ+ALF+thq4Be+DM1mvmTyUCQObvezNCNhzfS6abIUd3ou4x5RGH51ouiANeT3wekU6dCw==, } engines: { node: ">= 10" } cpu: [arm64] os: [darwin] - "@tauri-apps/cli-darwin-x64@2.0.0-rc.8": + "@tauri-apps/cli-darwin-x64@2.1.0": resolution: { - integrity: sha512-vYuITao7qq45jzTXRFdAcB+rVBULmofksWsKzoi+cgI8R0kcfB3bts+FRBdV3j+fkbpBQKpriW6Y6gdOzbf6Ow==, + integrity: sha512-TasHS442DFs8cSH2eUQzuDBXUST4ECjCd0yyP+zZzvAruiB0Bg+c8A+I/EnqCvBQ2G2yvWLYG8q/LI7c87A5UA==, } engines: { node: ">= 10" } cpu: [x64] os: [darwin] - "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.8": + "@tauri-apps/cli-linux-arm-gnueabihf@2.1.0": resolution: { - integrity: sha512-iW1gJyRBvwxCeBEu+ain18v8FtFBhrsqepzuUyOy7hZJWUMPdKHJhbFVz6xp3RGZf5ycsLUr3ZhqMB3vKtv7iQ==, + integrity: sha512-aP7ZBGNL4ny07Cbb6kKpUOSrmhcIK2KhjviTzYlh+pPhAptxnC78xQGD3zKQkTi2WliJLPmBYbOHWWQa57lQ9w==, } engines: { node: ">= 10" } cpu: [arm] os: [linux] - "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.8": + "@tauri-apps/cli-linux-arm64-gnu@2.1.0": resolution: { - integrity: sha512-k1HQHpu59B8JteXALCSdCQBUVb+ytsg1u/QEWPzCm7mFhzr7jqdfBjQVAKt0T5rdQQTcNtK341oB7izuXmJE2A==, + integrity: sha512-ZTdgD5gLeMCzndMT2f358EkoYkZ5T+Qy6zPzU+l5vv5M7dHVN9ZmblNAYYXmoOuw7y+BY4X/rZvHV9pcGrcanQ==, } engines: { node: ">= 10" } cpu: [arm64] os: [linux] - "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.8": + "@tauri-apps/cli-linux-arm64-musl@2.1.0": resolution: { - integrity: sha512-tMotP7J/dMqCL8zPCwtMwjeO3SK1yxU9bUMZ3mwdAtf+3xr2d2hpmGo4KXk5r2jQee9+dIC3IBXexFhrVJGRHA==, + integrity: sha512-NzwqjUCilhnhJzusz3d/0i0F1GFrwCQbkwR6yAHUxItESbsGYkZRJk0yMEWkg3PzFnyK4cWTlQJMEU52TjhEzA==, } engines: { node: ">= 10" } cpu: [arm64] os: [linux] - "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.8": + "@tauri-apps/cli-linux-x64-gnu@2.1.0": resolution: { - integrity: sha512-AnLghADQgt4oyp4rQyjpKfGpdAqofd+SRO9kht5d4c0RSViqwHBjIxrCt9FDhBpBwwkC6T6NNuQqaofZSnOH6Q==, + integrity: sha512-TyiIpMEtZxNOQmuFyfJwaaYbg3movSthpBJLIdPlKxSAB2BW0VWLY3/ZfIxm/G2YGHyREkjJvimzYE0i37PnMA==, } engines: { node: ">= 10" } cpu: [x64] os: [linux] - "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.8": + "@tauri-apps/cli-linux-x64-musl@2.1.0": resolution: { - integrity: sha512-jv/uiXI2K41/XMA2vnKMcpdv1tKvez70HHvBoIwHhelmXV5V6Tpu5fTMEAXbA6WbJNfcFRi0kd55YRBOS0DZcw==, + integrity: sha512-/dQd0TlaxBdJACrR72DhynWftzHDaX32eBtS5WBrNJ+nnNb+znM3gON6nJ9tSE9jgDa6n1v2BkI/oIDtypfUXw==, } engines: { node: ">= 10" } cpu: [x64] os: [linux] - "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.8": + "@tauri-apps/cli-win32-arm64-msvc@2.1.0": resolution: { - integrity: sha512-wctgwSfuyJ0lXBzQSzGq5TAy2m9VZichZPPJ7GitYzdHbqIRLmvxM1abRen7HikP1lpjdmjl96/kWQOebEV0qw==, + integrity: sha512-NdQJO7SmdYqOcE+JPU7bwg7+odfZMWO6g8xF9SXYCMdUzvM2Gv/AQfikNXz5yS7ralRhNFuW32i5dcHlxh4pDg==, } engines: { node: ">= 10" } cpu: [arm64] os: [win32] - "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.8": + "@tauri-apps/cli-win32-ia32-msvc@2.1.0": resolution: { - integrity: sha512-BBjoAezNpHscGhBICHrt+X+IyJIh9jYnaEIGvbCIMcGB6sSDxvtttw4ef9+4jNh3JixotOR2mwIudTc1H9HffQ==, + integrity: sha512-f5h8gKT/cB8s1ticFRUpNmHqkmaLutT62oFDB7N//2YTXnxst7EpMIn1w+QimxTvTk2gcx6EcW6bEk/y2hZGzg==, } engines: { node: ">= 10" } cpu: [ia32] os: [win32] - "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.8": + "@tauri-apps/cli-win32-x64-msvc@2.1.0": resolution: { - integrity: sha512-1pgDw2woeyDMvXctmqc53LBxsaAYqiRNUVgwvzlmzJDbUHv4+Pj4B1OGKQh1YKlsmks8LK3mK9uSbk+k1OLZhw==, + integrity: sha512-P/+LrdSSb5Xbho1LRP4haBjFHdyPdjWvGgeopL96OVtrFpYnfC+RctB45z2V2XxqFk3HweDDxk266btjttfjGw==, } engines: { node: ">= 10" } cpu: [x64] os: [win32] - "@tauri-apps/cli@2.0.0-rc.8": + "@tauri-apps/cli@2.1.0": resolution: { - integrity: sha512-hB6Pa0IaJs/As3Hc5IOiiK4Ilh9jspEA+2uPURCRQg4BkzQWwQzNdGQ4gjAzFNFAWPzy/4uuIXdnd1a+jC4wLA==, + integrity: sha512-K2VhcKqBhAeS5pNOVdnR/xQRU6jwpgmkSL2ejHXcl0m+kaTggT0WRDQnFtPq6NljA7aE03cvwsbCAoFG7vtkJw==, } engines: { node: ">= 10" } hasBin: true - "@tauri-apps/plugin-clipboard-manager@2.0.0-rc.0": + "@tauri-apps/plugin-clipboard-manager@2.0.0": resolution: { - integrity: sha512-2fS3wbRQEtorkk3Np2msJUeKCXRqLQ9sSo2FzlFdUPYNzThsu43uWCF55McGLAfltNOvXQIcQLUBf05jbBL/5w==, + integrity: sha512-V1sXmbjnwfXt/r48RJMwfUmDMSaP/8/YbH4CLNxt+/sf1eHlIP8PRFdFDQwLN0cNQKu2rqQVbG/Wc/Ps6cDUhw==, } - "@tauri-apps/plugin-dialog@2.0.0-rc.0": + "@tauri-apps/plugin-dialog@2.0.1": resolution: { - integrity: sha512-DPOXYe8SQ6Radk/67EOdaomlxL7oF99JO/ZUaPp1IBEs3Wro7lhlz63CfdKIBfKIZTLJLzP1R7/EiPL/GTA3Bg==, + integrity: sha512-fnUrNr6EfvTqdls/ufusU7h6UbNFzLKvHk/zTuOiBq01R3dTODqwctZlzakdbfSp/7pNwTKvgKTAgl/NAP/Z0Q==, } - "@tauri-apps/plugin-fs@2.0.0-rc.1": + "@tauri-apps/plugin-fs@2.0.2": resolution: { - integrity: sha512-r6N5dqBNXy9YAK9XbiEqAq3ZKBIN+TWevE7ZFmSRdvdSB1urrLweYu4wxycY2kDaDPzSeeOIJhCmqdNrFT9OSA==, + integrity: sha512-4YZaX2j7ta81M5/DL8aN10kTnpUkEpkPo1FTYPT8Dd0ImHe3azM8i8MrtjrDGoyBYLPO3zFv7df/mSCYF8oA0Q==, } - "@tauri-apps/plugin-global-shortcut@2.0.0-rc.0": + "@tauri-apps/plugin-global-shortcut@2.0.0": resolution: { - integrity: sha512-rcefV4AG+vnbTtGc07hDn4Uj8u//NpuqHVg1CShACyiCS0q2sZrDVC3qPN3RGhzQyeIOPq4bY1kQRHODffKXZA==, + integrity: sha512-pnB4CUwFVjg4twtBSxoLJ4uLFTYxsvOdC1zIbG581pYzhYatOl6mjB+ijD5SSXgiS/jNoqMcfkOF9PWAisurew==, } - "@tauri-apps/plugin-notification@2.0.0-rc.0": + "@tauri-apps/plugin-notification@2.0.0": resolution: { - integrity: sha512-0qsT/kvxQ6Ky4g6eQ4SUiHXzM4szTVc6thjz9vnGPYaApLoZrCJ9GdG+vEqeB+cT2dvE+wmxUFETh3ZXYVw8UA==, + integrity: sha512-6qEDYJS7mgXZWLXA0EFL+DVCJh8sJlzSoyw6B50pxhLPVFjc5Vr5DVzl5W3mUHaYhod5wsC984eQnlCCGqxYDA==, } - "@tauri-apps/plugin-process@2.0.0-rc.0": + "@tauri-apps/plugin-process@2.0.0": resolution: { - integrity: sha512-Z12D/kmQzG1vCVf+jLXPhPDUA0pEjFrsg4p0uwO2sotVLM9287IuTM+aIz9cuAYOxFLKcsnDG7amSCL9IfA1gw==, + integrity: sha512-OYzi0GnkrF4NAnsHZU7U3tjSoP0PbeAlO7T1Z+vJoBUH9sFQ1NSLqWYWQyf8hcb3gVWe7P1JggjiskO+LST1ug==, } - "@tauri-apps/plugin-shell@2.0.0-rc.0": + "@tauri-apps/plugin-shell@2.0.1": resolution: { - integrity: sha512-bhUcQcrqZoK8H1DFXapr5r1Z75oh6Kd5Tltz97XpZFLREEqp+KhN2Fvyh8r/fKAyenYsTYUIsDsyGdjdueuF9g==, + integrity: sha512-akU1b77sw3qHiynrK0s930y8zKmcdrSD60htjH+mFZqv5WaakZA/XxHR3/sF1nNv9Mgmt/Shls37HwnOr00aSw==, } - "@tauri-apps/plugin-updater@2.0.0-rc.0": + "@tauri-apps/plugin-updater@2.0.0": resolution: { - integrity: sha512-EKajf/sBpFif0cwXhTo3BmNvTZ2t2DDLRyhA8FFKugZNoOeqU97bHhPT5DIqMUPRE1tyDk9o7sXm8dKf7oz+EA==, + integrity: sha512-N0cl71g7RPr7zK2Fe5aoIwzw14NcdLcz7XMGFWZVjprsqgDRWoxbnUkknyCQMZthjhGkppCd/wN2MIsUz+eAhQ==, } "@types/babel__core@7.20.5": @@ -2288,16 +2393,10 @@ packages: integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==, } - "@types/estree@1.0.5": + "@types/estree@1.0.6": resolution: { - integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, - } - - "@types/fs-extra@9.0.13": - resolution: - { - integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==, + integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==, } "@types/hast@3.0.4": @@ -2330,10 +2429,10 @@ packages: integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==, } - "@types/lodash@4.17.6": + "@types/lodash@4.17.13": resolution: { - integrity: sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA==, + integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==, } "@types/mdast@4.0.4": @@ -2360,40 +2459,40 @@ packages: integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==, } - "@types/prop-types@15.7.12": + "@types/prop-types@15.7.13": resolution: { - integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==, + integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==, } - "@types/react-dom@18.3.0": + "@types/react-dom@18.3.1": resolution: { - integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==, + integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==, } - "@types/react-transition-group@4.4.10": + "@types/react-transition-group@4.4.11": resolution: { - integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==, + integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==, } - "@types/react@18.3.3": + "@types/react@18.3.12": resolution: { - integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==, + integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==, } - "@types/unist@2.0.10": + "@types/unist@2.0.11": resolution: { - integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==, + integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==, } - "@types/unist@3.0.2": + "@types/unist@3.0.3": resolution: { - integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==, + integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==, } "@ungap/structured-clone@1.2.0": @@ -2402,69 +2501,83 @@ packages: integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, } - "@vitejs/plugin-legacy@5.4.1": + "@vitejs/plugin-legacy@5.4.3": resolution: { - integrity: sha512-kee0l7dVevCNs1l3u2PnihVunvQ0WTJL2UJ/siQGD3Iht546mR9NO16tCv32uCP6lcGO1QDLqlPqInJtV1FE7A==, + integrity: sha512-wsyXK9mascyplcqvww1gA1xYiy29iRHfyciw+a0t7qRNdzX6PdfSWmOoCi74epr87DujM+5J+rnnSv+4PazqVg==, } engines: { node: ^18.0.0 || >=20.0.0 } peerDependencies: terser: ^5.4.0 vite: ^5.0.0 - "@vitejs/plugin-react@4.3.1": + "@vitejs/plugin-react@4.3.3": resolution: { - integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==, + integrity: sha512-NooDe9GpHGqNns1i8XDERg0Vsg5SSYRhRxxyTGogUdkdNt47jal+fbuYi+Yfq6pzRCKXyoPcWisfxE6RIM3GKA==, } engines: { node: ^14.18.0 || >=16.0.0 } peerDependencies: vite: ^4.2.0 || ^5.0.0 - acorn@8.12.1: + acorn@8.14.0: resolution: { - integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==, + integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==, } engines: { node: ">=0.4.0" } hasBin: true - adm-zip@0.5.14: + adm-zip@0.5.16: resolution: { - integrity: sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg==, + integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==, } engines: { node: ">=12.0" } - agent-base@6.0.2: + agent-base@7.1.1: resolution: { - integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, + integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==, } - engines: { node: ">= 6.0.0" } + engines: { node: ">= 14" } - ahooks@3.8.0: + ahooks@3.8.1: resolution: { - integrity: sha512-M01m+mxLRNNeJ/PCT3Fom26UyreTj6oMqJBetUrJnK4VNI5j6eMA543Xxo53OBXn6XibA2FXKcCCgrT6YCTtKQ==, + integrity: sha512-JoP9+/RWO7MnI/uSKdvQ8WB10Y3oo1PjLv+4Sv4Vpm19Z86VUMdXh+RhWvMGxZZs06sq2p0xVtFk8Oh5ZObsoA==, } engines: { node: ">=8.0.0" } peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 - ansi-styles@3.2.1: + ansi-regex@5.0.1: resolution: { - integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, } - engines: { node: ">=4" } + engines: { node: ">=8" } - anymatch@3.1.3: + ansi-regex@6.1.0: resolution: { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==, } - engines: { node: ">= 8" } + engines: { node: ">=12" } + + ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + + ansi-styles@6.2.1: + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: ">=12" } argparse@2.0.1: resolution: @@ -2478,10 +2591,10 @@ packages: integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, } - axios@1.7.2: + axios@1.7.7: resolution: { - integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==, + integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==, } babel-plugin-macros@3.1.0: @@ -2491,26 +2604,26 @@ packages: } engines: { node: ">=10", npm: ">=6" } - babel-plugin-polyfill-corejs2@0.4.11: + babel-plugin-polyfill-corejs2@0.4.12: resolution: { - integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==, + integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==, } peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.10.4: + babel-plugin-polyfill-corejs3@0.10.6: resolution: { - integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==, + integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==, } peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.2: + babel-plugin-polyfill-regenerator@0.6.3: resolution: { - integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==, + integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==, } peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -2521,18 +2634,23 @@ packages: integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==, } + balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + before-after-hook@2.2.3: resolution: { integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==, } - binary-extensions@2.3.0: + brace-expansion@2.0.1: resolution: { - integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, } - engines: { node: ">=8" } braces@3.0.3: resolution: @@ -2551,10 +2669,10 @@ packages: peerDependencies: browserslist: "*" - browserslist@4.23.1: + browserslist@4.24.2: resolution: { - integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==, + integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==, } engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true @@ -2579,10 +2697,10 @@ packages: } engines: { node: ">=10" } - caniuse-lite@1.0.30001640: + caniuse-lite@1.0.30001680: resolution: { - integrity: sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==, + integrity: sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==, } ccount@2.0.1: @@ -2591,13 +2709,6 @@ packages: integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, } - chalk@2.4.2: - resolution: - { - integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, - } - engines: { node: ">=4" } - character-entities-html4@2.1.0: resolution: { @@ -2622,19 +2733,26 @@ packages: integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==, } - chokidar@3.6.0: + chokidar@4.0.1: resolution: { - integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, + integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==, } - engines: { node: ">= 8.10.0" } + engines: { node: ">= 14.16.0" } - chownr@2.0.0: + chownr@3.0.0: resolution: { - integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==, + integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==, } - engines: { node: ">=10" } + engines: { node: ">=18" } + + cli-color@2.0.4: + resolution: + { + integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==, + } + engines: { node: ">=0.10" } client-only@0.0.1: resolution: @@ -2649,16 +2767,17 @@ packages: } engines: { node: ">=6" } - color-convert@1.9.3: + color-convert@2.0.1: resolution: { - integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, } + engines: { node: ">=7.0.0" } - color-name@1.1.3: + color-name@1.1.4: resolution: { - integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, } combined-stream@1.0.8: @@ -2699,16 +2818,16 @@ packages: integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, } - core-js-compat@3.37.1: + core-js-compat@3.39.0: resolution: { - integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==, + integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==, } - core-js@3.37.1: + core-js@3.39.0: resolution: { - integrity: sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==, + integrity: sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==, } cosmiconfig@7.1.0: @@ -2738,10 +2857,10 @@ packages: engines: { node: ">=10.14", npm: ">=6", yarn: ">=1" } hasBin: true - cross-spawn@7.0.3: + cross-spawn@7.0.5: resolution: { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + integrity: sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==, } engines: { node: ">= 8" } @@ -2751,6 +2870,13 @@ packages: integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, } + d@1.0.2: + resolution: + { + integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==, + } + engines: { node: ">=0.12" } + data-uri-to-buffer@4.0.1: resolution: { @@ -2758,16 +2884,16 @@ packages: } engines: { node: ">= 12" } - dayjs@1.11.5: + dayjs@1.11.13: resolution: { - integrity: sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==, + integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==, } - debug@4.3.5: + debug@4.3.7: resolution: { - integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==, + integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==, } engines: { node: ">=6.0" } peerDependencies: @@ -2802,6 +2928,14 @@ packages: } engines: { node: ">=6" } + detect-libc@1.0.3: + resolution: + { + integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==, + } + engines: { node: ">=0.10" } + hasBin: true + devlop@1.1.0: resolution: { @@ -2820,16 +2954,28 @@ packages: integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==, } - electron-to-chromium@1.4.818: + eastasianwidth@0.2.0: resolution: { - integrity: sha512-eGvIk2V0dGImV9gWLq8fDfTTsCAeMDwZqEPMr+jMInxZdnp9Us8UpovYpRCf9NQ7VOFgrN2doNSgvISbsbNpxA==, + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, } - end-of-stream@1.4.4: + electron-to-chromium@1.5.56: resolution: { - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + integrity: sha512-7lXb9dAvimCFdvUMTyucD4mnIndt/xhRKFAlky0CyFogdnNmdPQNoHI23msF/2V4mpTxMzgMdjK4+YRlFlRQZw==, + } + + emoji-regex@8.0.0: + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } + + emoji-regex@9.2.2: + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, } entities@4.5.0: @@ -2845,6 +2991,32 @@ packages: integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, } + es5-ext@0.10.64: + resolution: + { + integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==, + } + engines: { node: ">=0.10" } + + es6-iterator@2.0.3: + resolution: + { + integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==, + } + + es6-symbol@3.1.4: + resolution: + { + integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==, + } + engines: { node: ">=0.12" } + + es6-weak-map@2.0.3: + resolution: + { + integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==, + } + esbuild@0.21.5: resolution: { @@ -2853,20 +3025,13 @@ packages: engines: { node: ">=12" } hasBin: true - escalade@3.1.2: + escalade@3.2.0: resolution: { - integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==, + integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, } engines: { node: ">=6" } - escape-string-regexp@1.0.5: - resolution: - { - integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, - } - engines: { node: ">=0.8.0" } - escape-string-regexp@4.0.0: resolution: { @@ -2874,6 +3039,13 @@ packages: } engines: { node: ">=10" } + esniff@2.0.1: + resolution: + { + integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==, + } + engines: { node: ">=0.10" } + estree-util-is-identifier-name@3.0.0: resolution: { @@ -2893,13 +3065,25 @@ packages: } engines: { node: ">=0.10.0" } - execa@4.1.0: + event-emitter@0.3.5: resolution: { - integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==, + integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, + } + + execa@5.1.1: + resolution: + { + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, } engines: { node: ">=10" } + ext@1.7.0: + resolution: + { + integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==, + } + extend@3.0.2: resolution: { @@ -2926,17 +3110,17 @@ packages: integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==, } - find-up@4.1.0: + find-up@5.0.0: resolution: { - integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, } - engines: { node: ">=8" } + engines: { node: ">=10" } - follow-redirects@1.15.6: + follow-redirects@1.15.9: resolution: { - integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==, + integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==, } engines: { node: ">=4.0" } peerDependencies: @@ -2945,10 +3129,17 @@ packages: debug: optional: true - form-data@4.0.0: + foreground-child@3.3.0: resolution: { - integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, + integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==, + } + engines: { node: ">=14" } + + form-data@4.0.1: + resolution: + { + integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==, } engines: { node: ">= 6" } @@ -2959,10 +3150,10 @@ packages: } engines: { node: ">=12.20.0" } - foxact@0.2.35: + foxact@0.2.41: resolution: { - integrity: sha512-5e2p34TcBETZTTMhmf4WuljS07lgtv3laimqJer9OGOqYgOpYHgKfR0Cie8Q2IxH1FFhVkm1l0+2W/XL8nBL7Q==, + integrity: sha512-NgKsYRU6Dx4dHjZSlgO8AKrwsGuvrcCOqiPPLy+x6Nd9vBmRPq+JZjKWC5OcAVnISR1Bjn+Yg69UEdHEooJXDQ==, } peerDependencies: react: "*" @@ -2970,20 +3161,6 @@ packages: react: optional: true - fs-extra@11.2.0: - resolution: - { - integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==, - } - engines: { node: ">=14.14" } - - fs-minipass@2.1.0: - resolution: - { - integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==, - } - engines: { node: ">= 8" } - fsevents@2.3.3: resolution: { @@ -3005,19 +3182,27 @@ packages: } engines: { node: ">=6.9.0" } - get-stream@5.2.0: + get-stream@6.0.1: resolution: { - integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, } - engines: { node: ">=8" } + engines: { node: ">=10" } - glob-parent@5.1.2: + glob@10.4.5: resolution: { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, } - engines: { node: ">= 6" } + hasBin: true + + glob@11.0.0: + resolution: + { + integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==, + } + engines: { node: 20 || >=22 } + hasBin: true globals@11.12.0: resolution: @@ -3026,19 +3211,6 @@ packages: } engines: { node: ">=4" } - graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - } - - has-flag@3.0.0: - resolution: - { - integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, - } - engines: { node: ">=4" } - hasown@2.0.2: resolution: { @@ -3046,10 +3218,10 @@ packages: } engines: { node: ">= 0.4" } - hast-util-to-jsx-runtime@2.3.0: + hast-util-to-jsx-runtime@2.3.2: resolution: { - integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==, + integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==, } hast-util-whitespace@3.0.0: @@ -3070,51 +3242,51 @@ packages: integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==, } - html-url-attributes@3.0.0: + html-url-attributes@3.0.1: resolution: { - integrity: sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==, + integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==, } - https-proxy-agent@5.0.1: + https-proxy-agent@7.0.5: resolution: { - integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, + integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==, } - engines: { node: ">= 6" } + engines: { node: ">= 14" } - human-signals@1.1.1: + human-signals@2.1.0: resolution: { - integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==, + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, } - engines: { node: ">=8.12.0" } + engines: { node: ">=10.17.0" } - husky@7.0.4: + husky@9.1.7: resolution: { - integrity: sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==, + integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==, } - engines: { node: ">=12" } + engines: { node: ">=18" } hasBin: true - i18next@23.11.5: + i18next@23.16.5: resolution: { - integrity: sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==, + integrity: sha512-KTlhE3EP9x6pPTAW7dy0WKIhoCpfOGhRQlO+jttQLgzVaoOjWwBWramu7Pp0i+8wDNduuzXfe3kkVbzrKyrbTA==, } - ignore@5.3.1: + ignore@5.3.2: resolution: { - integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==, + integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, } engines: { node: ">= 4" } - immutable@4.3.6: + immutable@5.0.2: resolution: { - integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==, + integrity: sha512-1NU7hWZDkV7hJ4PJ9dur9gTNQ4ePNPN4k9/0YhwjzykTi/+3Q5pF93YU5QoVj8BuOnhLgaY8gs0U2pj4kSYVcw==, } import-fresh@3.3.0: @@ -3124,10 +3296,10 @@ packages: } engines: { node: ">=6" } - inline-style-parser@0.2.3: + inline-style-parser@0.2.4: resolution: { - integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==, + integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==, } intersection-observer@0.12.2: @@ -3154,17 +3326,10 @@ packages: integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, } - is-binary-path@2.1.0: + is-core-module@2.15.1: resolution: { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: ">=8" } - - is-core-module@2.14.0: - resolution: - { - integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==, + integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==, } engines: { node: ">= 0.4" } @@ -3181,6 +3346,13 @@ packages: } engines: { node: ">=0.10.0" } + is-fullwidth-code-point@3.0.0: + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: ">=8" } + is-glob@4.0.3: resolution: { @@ -3208,12 +3380,11 @@ packages: } engines: { node: ">=12" } - is-plain-object@5.0.0: + is-promise@2.2.2: resolution: { - integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==, + integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, } - engines: { node: ">=0.10.0" } is-stream@2.0.1: resolution: @@ -3228,17 +3399,31 @@ packages: integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, } + jackspeak@3.4.3: + resolution: + { + integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, + } + + jackspeak@4.0.2: + resolution: + { + integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==, + } + engines: { node: 20 || >=22 } + js-base64@3.7.7: resolution: { integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==, } - js-cookie@2.2.1: + js-cookie@3.0.5: resolution: { - integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==, + integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==, } + engines: { node: ">=14" } js-tokens@4.0.0: resolution: @@ -3253,19 +3438,12 @@ packages: } hasBin: true - jsesc@0.5.0: + jsesc@3.0.2: resolution: { - integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==, + integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==, } - hasBin: true - - jsesc@2.5.2: - resolution: - { - integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, - } - engines: { node: ">=4" } + engines: { node: ">=6" } hasBin: true json-parse-even-better-errors@2.3.1: @@ -3288,24 +3466,18 @@ packages: integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==, } - jsonfile@6.1.0: - resolution: - { - integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, - } - lines-and-columns@1.2.4: resolution: { integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, } - locate-path@5.0.0: + locate-path@6.0.0: resolution: { - integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, } - engines: { node: ">=8" } + engines: { node: ">=10" } lodash-es@4.17.21: resolution: @@ -3344,41 +3516,53 @@ packages: integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==, } + lru-cache@10.4.3: + resolution: + { + integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, + } + + lru-cache@11.0.2: + resolution: + { + integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==, + } + engines: { node: 20 || >=22 } + lru-cache@5.1.1: resolution: { integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, } - lru-cache@6.0.0: + lru-queue@0.1.0: resolution: { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: ">=10" } - - magic-string@0.30.10: - resolution: - { - integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==, + integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==, } - mdast-util-from-markdown@2.0.1: + magic-string@0.30.12: resolution: { - integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==, + integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==, } - mdast-util-mdx-expression@2.0.0: + mdast-util-from-markdown@2.0.2: resolution: { - integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==, + integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==, } - mdast-util-mdx-jsx@3.1.2: + mdast-util-mdx-expression@2.0.1: resolution: { - integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==, + integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==, + } + + mdast-util-mdx-jsx@3.1.3: + resolution: + { + integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==, } mdast-util-mdxjs-esm@2.0.1: @@ -3399,10 +3583,10 @@ packages: integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==, } - mdast-util-to-markdown@2.1.0: + mdast-util-to-markdown@2.1.2: resolution: { - integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==, + integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==, } mdast-util-to-string@4.0.0: @@ -3411,6 +3595,13 @@ packages: integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==, } + memoizee@0.4.17: + resolution: + { + integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==, + } + engines: { node: ">=0.12" } + meow@13.2.0: resolution: { @@ -3424,10 +3615,10 @@ packages: integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, } - meta-json-schema@1.18.6: + meta-json-schema@1.18.10: resolution: { - integrity: sha512-HMDu+1lcVsgEsa4kPlyo2ZNgOEbaQJhOzU4ll4qJahwx5TIw8NkcbXgxnKEW6NieqL4AOWWtoNgw3EKeuHg4+A==, + integrity: sha512-bbjzCD1pXX/2jKNvFMPulvXujNj99iRFFf+eG82aNBgB/x42DHxZVqFOEiQ/L88tgQVS7o7CtfN0RIP7Rh04ZA==, } micromark-core-commonmark@2.0.1: @@ -3556,6 +3747,13 @@ packages: integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==, } + micromatch@4.0.8: + resolution: + { + integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, + } + engines: { node: ">=8.6" } + mime-db@1.52.0: resolution: { @@ -3577,51 +3775,58 @@ packages: } engines: { node: ">=6" } - minipass@3.3.6: + minimatch@10.0.1: resolution: { - integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==, + integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==, } - engines: { node: ">=8" } + engines: { node: 20 || >=22 } - minipass@5.0.0: + minimatch@9.0.5: resolution: { - integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==, + integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, } - engines: { node: ">=8" } + engines: { node: ">=16 || 14 >=14.17" } - minizlib@2.1.2: + minipass@7.1.2: resolution: { - integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==, + integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, } - engines: { node: ">= 8" } + engines: { node: ">=16 || 14 >=14.17" } - mkdirp@1.0.4: + minizlib@3.0.1: resolution: { - integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, + integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==, + } + engines: { node: ">= 18" } + + mkdirp@3.0.1: + resolution: + { + integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==, } engines: { node: ">=10" } hasBin: true - monaco-editor@0.49.0: + monaco-editor@0.52.0: resolution: { - integrity: sha512-2I8/T3X/hLxB2oPHgqcNYUVdA/ZEFShT7IAujifIPMfKkNbLOqY8XCoyHCXrsdjb36dW9MwoTwBCFpXKMwNwaQ==, + integrity: sha512-OeWhNpABLCeTqubfqLMXGsqf6OmPU6pHM85kF3dhy6kq5hnhuVS1p3VrEW/XhWHc71P2tHyS5JFySD8mgs1crw==, } - monaco-languageserver-types@0.3.4: + monaco-languageserver-types@0.4.0: resolution: { - integrity: sha512-d58sP5yNhjs8uG1ESXs0hFnuX2YfdMhiGeWhdgTUZyG9aaWgyI4dDwrK1khf1mPF2u9Sljv42sfYqPFZnqYMYg==, + integrity: sha512-QQ3BZiU5LYkJElGncSNb5AKoJ/LCs6YBMCJMAz9EA7v+JaOdn3kx2cXpPTcZfKA5AEsR0vc97sAw+5mdNhVBmw==, } - monaco-marker-data-provider@1.2.3: + monaco-marker-data-provider@1.2.4: resolution: { - integrity: sha512-BOiQs9UNEwVrF1rwYI32HUP8D7JTuHlJRlykx83e4+jfh1ceBWIBfB5ENDVSFUz651d95kxjKj36vV2JO3zr9w==, + integrity: sha512-4DsPgsAqpTyUDs3humXRBPUJoihTv+L6v9aupQWD80X2YXaCXUd11mWYeSCYHuPgdUmjFaNWCEOjQ6ewf/QA1Q==, } monaco-types@0.1.0: @@ -3638,10 +3843,10 @@ packages: peerDependencies: monaco-editor: ">=0.30.0" - monaco-yaml@5.2.0: + monaco-yaml@5.2.3: resolution: { - integrity: sha512-BK9qeabDtxNlKppGrbU4yd8WTcKbk9ODqQwWy8Pb27FHtHwCQ1lTssRuB9XM2+Z4HQf6uhj3P5vFi3nsRrerGw==, + integrity: sha512-GEplKC+YYmS0TOlJdv0FzbqkDN/IG2FSwEw+95myECVxTlhty2amwERYjzvorvJXmIagP1grd3Lleq7aQEJpPg==, } peerDependencies: monaco-editor: ">=0.36" @@ -3653,10 +3858,10 @@ packages: } engines: { node: ">=4" } - ms@2.1.2: + ms@2.1.3: resolution: { - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, } nanoid@3.3.7: @@ -3667,20 +3872,32 @@ packages: engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true - nanoid@5.0.7: + nanoid@5.0.8: resolution: { - integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==, + integrity: sha512-TcJPw+9RV9dibz1hHUzlLVy8N4X9TnwirAjrU08Juo6BNKggzVfP2ZJ/3ZUSq15Xl5i85i+Z89XBO90pB2PghQ==, } engines: { node: ^18 || >=20 } hasBin: true + next-tick@1.1.0: + resolution: + { + integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, + } + no-case@3.0.4: resolution: { integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==, } + node-addon-api@7.1.1: + resolution: + { + integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==, + } + node-domexception@1.0.0: resolution: { @@ -3688,18 +3905,6 @@ packages: } engines: { node: ">=10.5.0" } - 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-fetch@3.3.2: resolution: { @@ -3707,19 +3912,12 @@ packages: } engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - node-releases@2.0.14: + node-releases@2.0.18: resolution: { - integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, + integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==, } - normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: ">=0.10.0" } - npm-run-path@4.0.1: resolution: { @@ -3747,26 +3945,25 @@ packages: } engines: { node: ">=6" } - p-limit@2.3.0: + p-limit@3.1.0: resolution: { - integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, } - engines: { node: ">=6" } + engines: { node: ">=10" } - p-locate@4.1.0: + p-locate@5.0.0: resolution: { - integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, } - engines: { node: ">=8" } + engines: { node: ">=10" } - p-try@2.2.0: + package-json-from-dist@1.0.1: resolution: { - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, } - engines: { node: ">=6" } parent-module@1.0.1: resolution: @@ -3814,6 +4011,20 @@ packages: integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, } + path-scurry@1.11.1: + resolution: + { + integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, + } + engines: { node: ">=16 || 14 >=14.18" } + + path-scurry@2.0.0: + resolution: + { + integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==, + } + engines: { node: 20 || >=22 } + path-type@4.0.0: resolution: { @@ -3821,18 +4032,18 @@ packages: } engines: { node: ">=8" } - peggy@4.0.3: + peggy@4.1.1: resolution: { - integrity: sha512-v7/Pt6kGYsfXsCrfb52q7/yg5jaAwiVaUMAPLPvy4DJJU6Wwr72t6nDIqIDkGfzd1B4zeVuTnQT0RGeOhe/uSA==, + integrity: sha512-2emciJQKahHJpT7f1asizGSnJ8bq0TKgWMXnCrtAaSH1NIXaGifYxL5m5KMrCdlaqaQJz3SVexNkx+I+Vz66VA==, } engines: { node: ">=18" } hasBin: true - picocolors@1.0.1: + picocolors@1.1.1: resolution: { - integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==, + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, } picomatch@2.3.1: @@ -3849,10 +4060,17 @@ packages: } engines: { node: ">=10" } - postcss@8.4.39: + picomatch@4.0.2: resolution: { - integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==, + integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==, + } + engines: { node: ">=12" } + + postcss@8.4.49: + resolution: + { + integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==, } engines: { node: ^10 || ^12 || >=14 } @@ -3864,15 +4082,23 @@ packages: engines: { node: ">=10.13.0" } hasBin: true - pretty-quick@3.3.1: + prettier@3.3.3: resolution: { - integrity: sha512-3b36UXfYQ+IXXqex6mCca89jC8u0mYLqFAN5eTQKoXO6oCQYcIVYZEB/5AlBHI7JPYygReM2Vv6Vom/Gln7fBg==, + integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==, } - engines: { node: ">=10.13" } + engines: { node: ">=14" } + hasBin: true + + pretty-quick@4.0.0: + resolution: + { + integrity: sha512-M+2MmeufXb/M7Xw3Afh1gxcYpj+sK0AxEfnfF958ktFeAyi5MsKY5brymVURQLgPLV1QaF5P4pb2oFJ54H3yzQ==, + } + engines: { node: ">=14" } hasBin: true peerDependencies: - prettier: ^2.0.0 + prettier: ^3.0.0 prop-types@15.8.1: resolution: @@ -3892,12 +4118,6 @@ packages: integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, } - pump@3.0.0: - resolution: - { - integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, - } - react-dom@18.3.1: resolution: { @@ -3906,12 +4126,11 @@ packages: peerDependencies: react: ^18.3.1 - react-error-boundary@3.1.4: + react-error-boundary@4.1.2: resolution: { - integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==, + integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==, } - engines: { node: ">=10", npm: ">=6" } peerDependencies: react: ">=16.13.1" @@ -3921,19 +4140,19 @@ packages: integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==, } - react-hook-form@7.52.1: + react-hook-form@7.53.2: resolution: { - integrity: sha512-uNKIhaoICJ5KQALYZ4TOaOLElyM+xipord+Ha3crEFhTntdLvWZqVY49Wqd/0GiVCA/f9NjemLeiNPjG7Hpurg==, + integrity: sha512-YVel6fW5sOeedd1524pltpHX+jgU2u3DSDtXEaBORNdqiNrsX/nUI/iGXONegttg0mJVnfrIkiV0cmTU6Oo2xw==, } - engines: { node: ">=12.22.0" } + engines: { node: ">=18.0.0" } peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - react-i18next@13.5.0: + react-i18next@15.1.1: resolution: { - integrity: sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA==, + integrity: sha512-R/Vg9wIli2P3FfeI8o1eNJUJue5LWpFsQePCHdQDmX0Co3zkr6kdT8gAseb/yGeWbNz1Txc4bKDQuZYsC0kQfw==, } peerDependencies: i18next: ">= 23.2.3" @@ -3967,14 +4186,14 @@ packages: "@types/react": ">=18" react: ">=18" - react-monaco-editor@0.55.0: + react-monaco-editor@0.56.2: resolution: { - integrity: sha512-GdEP0Q3Rn1dczfKEEyY08Nes5plWwIYU4sWRBQO0+jsQWQsKMHKCC6+hPRwR7G/4aA3V/iU9jSmWPzVJYMVFSQ==, + integrity: sha512-Tp5U3QF9h92Cuf0eIhGd8Jyef8tPMlEJC2Dk1GeuR/hj6WoFn8AgjVX/2dv+3l5DvpMUpAECcFarc3eFKTBZ5w==, } peerDependencies: "@types/react": ">=16 <= 18" - monaco-editor: ^0.44.0 + monaco-editor: ^0.52.0 react: ">=16 <= 18" react-refresh@0.14.2: @@ -3984,20 +4203,20 @@ packages: } engines: { node: ">=0.10.0" } - react-router-dom@6.24.1: + react-router-dom@6.28.0: resolution: { - integrity: sha512-U19KtXqooqw967Vw0Qcn5cOvrX5Ejo9ORmOtJMzYWtCT4/WOfFLIZGGsVLxcd9UkBO0mSTZtXqhZBsWlHr7+Sg==, + integrity: sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg==, } engines: { node: ">=14.0.0" } peerDependencies: react: ">=16.8" react-dom: ">=16.8" - react-router@6.24.1: + react-router@6.28.0: resolution: { - integrity: sha512-PTXFXGK2pyXpHzVo3rR9H7ip4lSPZZc0bHG5CARmj65fTT6qG7sTngmb6lcYu1gf3y/8KxORoy9yn59pGpCnpg==, + integrity: sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg==, } engines: { node: ">=14.0.0" } peerDependencies: @@ -4012,10 +4231,10 @@ packages: react: ">=16.6.0" react-dom: ">=16.6.0" - react-virtuoso@4.7.11: + react-virtuoso@4.12.0: resolution: { - integrity: sha512-Kdn9qEtQI2ulEuBMzW2BTkDsfijB05QUd6lpZ1K36oyA3k65Cz4lG4EKrh2pCfUafX4C2uMSZOwzMOhbrMOTFA==, + integrity: sha512-oHrKlU7xHsrnBQ89ecZoMPAK0tHnI9s1hsFW3KKg5ZGeZ5SWvbGhg/QFJFY4XETAzoCUeu+Xaxn1OUb/PGtPlA==, } engines: { node: ">=10" } peerDependencies: @@ -4029,17 +4248,17 @@ packages: } engines: { node: ">=0.10.0" } - readdirp@3.6.0: + readdirp@4.0.2: resolution: { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==, } - engines: { node: ">=8.10.0" } + engines: { node: ">= 14.16.0" } - regenerate-unicode-properties@10.1.1: + regenerate-unicode-properties@10.2.0: resolution: { - integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==, + integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==, } engines: { node: ">=4" } @@ -4061,17 +4280,23 @@ packages: integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==, } - regexpu-core@5.3.2: + regexpu-core@6.1.1: resolution: { - integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==, + integrity: sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==, } engines: { node: ">=4" } - regjsparser@0.9.1: + regjsgen@0.8.0: resolution: { - integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==, + integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==, + } + + regjsparser@0.11.2: + resolution: + { + integrity: sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==, } hasBin: true @@ -4081,16 +4306,16 @@ packages: integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==, } - remark-rehype@11.1.0: + remark-rehype@11.1.1: resolution: { - integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==, + integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==, } - reselect@4.1.8: + reselect@5.1.1: resolution: { - integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==, + integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==, } resize-observer-polyfill@1.5.1: @@ -4113,18 +4338,25 @@ packages: } hasBin: true - rollup@4.18.0: + rimraf@5.0.10: resolution: { - integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==, + integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==, + } + hasBin: true + + rollup@4.25.0: + resolution: + { + integrity: sha512-uVbClXmR6wvx5R1M3Od4utyLUxrmOcEm3pAtMphn73Apq19PDtHpgZoEvqH2YnnaNUuvKmg2DgRd2Sqv+odyqg==, } engines: { node: ">=18.0.0", npm: ">=8.0.0" } hasBin: true - sass@1.77.6: + sass@1.81.0: resolution: { - integrity: sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==, + integrity: sha512-Q4fOxRfhmv3sqCLoGfvrC9pRV8btc0UtqL9mN6Yrv6Qi9ScL55CVH1vlPP863ISLEEMNLLuu9P+enCeGHlnzhA==, } engines: { node: ">=14.0.0" } hasBin: true @@ -4149,10 +4381,10 @@ packages: } hasBin: true - semver@7.6.0: + semver@7.6.3: resolution: { - integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==, + integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==, } engines: { node: ">=10" } hasBin: true @@ -4183,6 +4415,13 @@ packages: integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, } + signal-exit@4.1.0: + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: ">=14" } + snake-case@3.0.4: resolution: { @@ -4202,10 +4441,10 @@ packages: } engines: { node: ">= 10" } - source-map-js@1.2.0: + source-map-js@1.2.1: resolution: { - integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==, + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, } engines: { node: ">=0.10.0" } @@ -4235,12 +4474,40 @@ packages: integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==, } + 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" } + stringify-entities@4.0.4: resolution: { integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==, } + strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + + strip-ansi@7.1.0: + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: ">=12" } + strip-final-newline@2.0.0: resolution: { @@ -4248,10 +4515,10 @@ packages: } engines: { node: ">=6" } - style-to-object@1.0.6: + style-to-object@1.0.8: resolution: { - integrity: sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==, + integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==, } stylis@4.2.0: @@ -4260,13 +4527,6 @@ packages: integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==, } - supports-color@5.5.0: - resolution: - { - integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, - } - engines: { node: ">=4" } - supports-preserve-symlinks-flag@1.0.0: resolution: { @@ -4294,27 +4554,27 @@ packages: integrity: sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==, } - tar@6.2.1: + tar@7.4.3: resolution: { - integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==, + integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==, } - engines: { node: ">=10" } + engines: { node: ">=18" } - terser@5.31.1: + terser@5.36.0: resolution: { - integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==, + integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==, } engines: { node: ">=10" } hasBin: true - to-fast-properties@2.0.0: + timers-ext@0.1.8: resolution: { - integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, + integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==, } - engines: { node: ">=4" } + engines: { node: ">=0.12" } to-regex-range@5.0.1: resolution: @@ -4323,12 +4583,6 @@ packages: } engines: { node: ">=8.0" } - tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } - trim-lines@3.0.1: resolution: { @@ -4341,10 +4595,10 @@ packages: integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==, } - tslib@2.6.3: + tslib@2.8.1: resolution: { - integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==, + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, } tunnel@0.0.6: @@ -4354,16 +4608,22 @@ packages: } engines: { node: ">=0.6.11 <=0.7.0 || >=0.7.3" } - types-pac@1.0.2: + type@2.7.3: resolution: { - integrity: sha512-9zOLBtvgzEesEgpkJPrrh+uGTzSdNcYA+gk1jv3+14ytTsuxnunBko98OgbCCgUfcMzraEi4h+3zPrZaPoEsQg==, + integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==, } - typescript@5.5.3: + types-pac@1.0.3: resolution: { - integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==, + integrity: sha512-MF2UAZGvGMOM+vHi9Zj/LvQqdNN1m1xSB+PjAW9B/GvFqaB4GwR18YaIbGIGDRTW/J8iqFXQHLZd5eJVtho46w==, + } + + typescript@5.6.3: + resolution: + { + integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==, } engines: { node: ">=14.17" } hasBin: true @@ -4381,10 +4641,10 @@ packages: } engines: { node: ">=14.0" } - unicode-canonical-property-names-ecmascript@2.0.0: + unicode-canonical-property-names-ecmascript@2.0.1: resolution: { - integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==, + integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==, } engines: { node: ">=4" } @@ -4395,10 +4655,10 @@ packages: } engines: { node: ">=4" } - unicode-match-property-value-ecmascript@2.1.0: + unicode-match-property-value-ecmascript@2.2.0: resolution: { - integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==, + integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==, } engines: { node: ">=4" } @@ -4427,12 +4687,6 @@ packages: integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==, } - unist-util-remove-position@5.0.0: - resolution: - { - integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==, - } - unist-util-stringify-position@4.0.0: resolution: { @@ -4457,17 +4711,10 @@ packages: integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==, } - universalify@2.0.1: + update-browserslist-db@1.1.1: resolution: { - integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, - } - engines: { node: ">= 10.0.0" } - - update-browserslist-db@1.1.0: - resolution: - { - integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==, + integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==, } hasBin: true peerDependencies: @@ -4487,10 +4734,10 @@ packages: integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==, } - vfile@6.0.1: + vfile@6.0.3: resolution: { - integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==, + integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==, } vite-plugin-monaco-editor@1.1.0: @@ -4501,18 +4748,18 @@ packages: peerDependencies: monaco-editor: ">=0.33.0" - vite-plugin-svgr@4.2.0: + vite-plugin-svgr@4.3.0: resolution: { - integrity: sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA==, + integrity: sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w==, } peerDependencies: - vite: ^2.6.0 || 3 || 4 || 5 + vite: ">=2.6.0" - vite@5.3.3: + vite@5.4.11: resolution: { - integrity: sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==, + integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==, } engines: { node: ^18.0.0 || >=20.0.0 } hasBin: true @@ -4521,6 +4768,7 @@ packages: less: "*" lightningcss: ^1.21.0 sass: "*" + sass-embedded: "*" stylus: "*" sugarss: "*" terser: ^5.4.0 @@ -4533,6 +4781,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -4560,10 +4810,10 @@ packages: integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==, } - vscode-languageserver-textdocument@1.0.11: + vscode-languageserver-textdocument@1.0.12: resolution: { - integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==, + integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==, } vscode-languageserver-types@3.17.5: @@ -4585,18 +4835,6 @@ packages: } engines: { node: ">= 8" } - webidl-conversions@3.0.1: - resolution: - { - integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, - } - - whatwg-url@5.0.0: - resolution: - { - integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, - } - which@2.0.2: resolution: { @@ -4605,6 +4843,20 @@ packages: engines: { node: ">= 8" } hasBin: true + 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: { @@ -4617,11 +4869,12 @@ packages: integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, } - yallist@4.0.0: + yallist@5.0.0: resolution: { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==, } + engines: { node: ">=18" } yaml@1.10.2: resolution: @@ -4630,14 +4883,42 @@ packages: } engines: { node: ">= 6" } - yaml@2.4.5: + yaml@2.6.0: resolution: { - integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==, + integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==, } engines: { node: ">= 14" } hasBin: true + yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } + + zustand@5.0.1: + resolution: + { + integrity: sha512-pRET7Lao2z+n5R/HduXMio35TncTlSW68WsYBq2Lg1ASspsNGjpwLAsij3RpouyV6+kHMwwwzP0bZPD70/Jx/w==, + } + engines: { node: ">=12.20.0" } + peerDependencies: + "@types/react": ">=18.0.0" + immer: ">=9.0.6" + react: ">=18.0.0" + use-sync-external-store: ">=1.2.0" + peerDependenciesMeta: + "@types/react": + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + zwitch@2.0.4: resolution: { @@ -4645,16 +4926,14 @@ packages: } snapshots: - "@actions/github@5.1.1": + "@actions/github@6.0.0": dependencies: - "@actions/http-client": 2.2.1 - "@octokit/core": 3.6.0 - "@octokit/plugin-paginate-rest": 2.21.3(@octokit/core@3.6.0) - "@octokit/plugin-rest-endpoint-methods": 5.16.2(@octokit/core@3.6.0) - transitivePeerDependencies: - - encoding + "@actions/http-client": 2.2.3 + "@octokit/core": 5.2.0 + "@octokit/plugin-paginate-rest": 9.2.1(@octokit/core@5.2.0) + "@octokit/plugin-rest-endpoint-methods": 10.4.1(@octokit/core@5.2.0) - "@actions/http-client@2.2.1": + "@actions/http-client@2.2.3": dependencies: tunnel: 0.0.6 undici: 5.28.4 @@ -4664,788 +4943,677 @@ snapshots: "@jridgewell/gen-mapping": 0.3.5 "@jridgewell/trace-mapping": 0.3.25 - "@babel/code-frame@7.24.7": + "@babel/code-frame@7.26.2": dependencies: - "@babel/highlight": 7.24.7 - picocolors: 1.0.1 + "@babel/helper-validator-identifier": 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 - "@babel/compat-data@7.24.7": {} + "@babel/compat-data@7.26.2": {} - "@babel/core@7.24.7": + "@babel/core@7.26.0": dependencies: "@ampproject/remapping": 2.3.0 - "@babel/code-frame": 7.24.7 - "@babel/generator": 7.24.7 - "@babel/helper-compilation-targets": 7.24.7 - "@babel/helper-module-transforms": 7.24.7(@babel/core@7.24.7) - "@babel/helpers": 7.24.7 - "@babel/parser": 7.24.7 - "@babel/template": 7.24.7 - "@babel/traverse": 7.24.7 - "@babel/types": 7.24.7 + "@babel/code-frame": 7.26.2 + "@babel/generator": 7.26.2 + "@babel/helper-compilation-targets": 7.25.9 + "@babel/helper-module-transforms": 7.26.0(@babel/core@7.26.0) + "@babel/helpers": 7.26.0 + "@babel/parser": 7.26.2 + "@babel/template": 7.25.9 + "@babel/traverse": 7.25.9 + "@babel/types": 7.26.0 convert-source-map: 2.0.0 - debug: 4.3.5 + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - "@babel/generator@7.24.7": + "@babel/generator@7.26.2": dependencies: - "@babel/types": 7.24.7 + "@babel/parser": 7.26.2 + "@babel/types": 7.26.0 "@jridgewell/gen-mapping": 0.3.5 "@jridgewell/trace-mapping": 0.3.25 - jsesc: 2.5.2 + jsesc: 3.0.2 - "@babel/helper-annotate-as-pure@7.24.7": + "@babel/helper-annotate-as-pure@7.25.9": dependencies: - "@babel/types": 7.24.7 + "@babel/types": 7.26.0 - "@babel/helper-builder-binary-assignment-operator-visitor@7.24.7": + "@babel/helper-builder-binary-assignment-operator-visitor@7.25.9": dependencies: - "@babel/traverse": 7.24.7 - "@babel/types": 7.24.7 + "@babel/traverse": 7.25.9 + "@babel/types": 7.26.0 transitivePeerDependencies: - supports-color - "@babel/helper-compilation-targets@7.24.7": + "@babel/helper-compilation-targets@7.25.9": dependencies: - "@babel/compat-data": 7.24.7 - "@babel/helper-validator-option": 7.24.7 - browserslist: 4.23.1 + "@babel/compat-data": 7.26.2 + "@babel/helper-validator-option": 7.25.9 + browserslist: 4.24.2 lru-cache: 5.1.1 semver: 6.3.1 - "@babel/helper-create-class-features-plugin@7.24.7(@babel/core@7.24.7)": + "@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-annotate-as-pure": 7.24.7 - "@babel/helper-environment-visitor": 7.24.7 - "@babel/helper-function-name": 7.24.7 - "@babel/helper-member-expression-to-functions": 7.24.7 - "@babel/helper-optimise-call-expression": 7.24.7 - "@babel/helper-replace-supers": 7.24.7(@babel/core@7.24.7) - "@babel/helper-skip-transparent-expression-wrappers": 7.24.7 - "@babel/helper-split-export-declaration": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-annotate-as-pure": 7.25.9 + "@babel/helper-member-expression-to-functions": 7.25.9 + "@babel/helper-optimise-call-expression": 7.25.9 + "@babel/helper-replace-supers": 7.25.9(@babel/core@7.26.0) + "@babel/helper-skip-transparent-expression-wrappers": 7.25.9 + "@babel/traverse": 7.25.9 semver: 6.3.1 transitivePeerDependencies: - supports-color - "@babel/helper-create-regexp-features-plugin@7.24.7(@babel/core@7.24.7)": + "@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-annotate-as-pure": 7.24.7 - regexpu-core: 5.3.2 + "@babel/core": 7.26.0 + "@babel/helper-annotate-as-pure": 7.25.9 + regexpu-core: 6.1.1 semver: 6.3.1 - "@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.7)": + "@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-compilation-targets": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - debug: 4.3.5 + "@babel/core": 7.26.0 + "@babel/helper-compilation-targets": 7.25.9 + "@babel/helper-plugin-utils": 7.25.9 + debug: 4.3.7 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: - supports-color - "@babel/helper-environment-visitor@7.24.7": + "@babel/helper-member-expression-to-functions@7.25.9": dependencies: - "@babel/types": 7.24.7 - - "@babel/helper-function-name@7.24.7": - dependencies: - "@babel/template": 7.24.7 - "@babel/types": 7.24.7 - - "@babel/helper-hoist-variables@7.24.7": - dependencies: - "@babel/types": 7.24.7 - - "@babel/helper-member-expression-to-functions@7.24.7": - dependencies: - "@babel/traverse": 7.24.7 - "@babel/types": 7.24.7 + "@babel/traverse": 7.25.9 + "@babel/types": 7.26.0 transitivePeerDependencies: - supports-color - "@babel/helper-module-imports@7.24.7": + "@babel/helper-module-imports@7.25.9": dependencies: - "@babel/traverse": 7.24.7 - "@babel/types": 7.24.7 + "@babel/traverse": 7.25.9 + "@babel/types": 7.26.0 transitivePeerDependencies: - supports-color - "@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)": + "@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-environment-visitor": 7.24.7 - "@babel/helper-module-imports": 7.24.7 - "@babel/helper-simple-access": 7.24.7 - "@babel/helper-split-export-declaration": 7.24.7 - "@babel/helper-validator-identifier": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-module-imports": 7.25.9 + "@babel/helper-validator-identifier": 7.25.9 + "@babel/traverse": 7.25.9 transitivePeerDependencies: - supports-color - "@babel/helper-optimise-call-expression@7.24.7": + "@babel/helper-optimise-call-expression@7.25.9": dependencies: - "@babel/types": 7.24.7 + "@babel/types": 7.26.0 - "@babel/helper-plugin-utils@7.24.7": {} + "@babel/helper-plugin-utils@7.25.9": {} - "@babel/helper-remap-async-to-generator@7.24.7(@babel/core@7.24.7)": + "@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-annotate-as-pure": 7.24.7 - "@babel/helper-environment-visitor": 7.24.7 - "@babel/helper-wrap-function": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-annotate-as-pure": 7.25.9 + "@babel/helper-wrap-function": 7.25.9 + "@babel/traverse": 7.25.9 transitivePeerDependencies: - supports-color - "@babel/helper-replace-supers@7.24.7(@babel/core@7.24.7)": + "@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-environment-visitor": 7.24.7 - "@babel/helper-member-expression-to-functions": 7.24.7 - "@babel/helper-optimise-call-expression": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-member-expression-to-functions": 7.25.9 + "@babel/helper-optimise-call-expression": 7.25.9 + "@babel/traverse": 7.25.9 transitivePeerDependencies: - supports-color - "@babel/helper-simple-access@7.24.7": + "@babel/helper-simple-access@7.25.9": dependencies: - "@babel/traverse": 7.24.7 - "@babel/types": 7.24.7 + "@babel/traverse": 7.25.9 + "@babel/types": 7.26.0 transitivePeerDependencies: - supports-color - "@babel/helper-skip-transparent-expression-wrappers@7.24.7": + "@babel/helper-skip-transparent-expression-wrappers@7.25.9": dependencies: - "@babel/traverse": 7.24.7 - "@babel/types": 7.24.7 + "@babel/traverse": 7.25.9 + "@babel/types": 7.26.0 transitivePeerDependencies: - supports-color - "@babel/helper-split-export-declaration@7.24.7": + "@babel/helper-string-parser@7.25.9": {} + + "@babel/helper-validator-identifier@7.25.9": {} + + "@babel/helper-validator-option@7.25.9": {} + + "@babel/helper-wrap-function@7.25.9": dependencies: - "@babel/types": 7.24.7 - - "@babel/helper-string-parser@7.24.7": {} - - "@babel/helper-validator-identifier@7.24.7": {} - - "@babel/helper-validator-option@7.24.7": {} - - "@babel/helper-wrap-function@7.24.7": - dependencies: - "@babel/helper-function-name": 7.24.7 - "@babel/template": 7.24.7 - "@babel/traverse": 7.24.7 - "@babel/types": 7.24.7 + "@babel/template": 7.25.9 + "@babel/traverse": 7.25.9 + "@babel/types": 7.26.0 transitivePeerDependencies: - supports-color - "@babel/helpers@7.24.7": + "@babel/helpers@7.26.0": dependencies: - "@babel/template": 7.24.7 - "@babel/types": 7.24.7 + "@babel/template": 7.25.9 + "@babel/types": 7.26.0 - "@babel/highlight@7.24.7": + "@babel/parser@7.26.2": dependencies: - "@babel/helper-validator-identifier": 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 + "@babel/types": 7.26.0 - "@babel/parser@7.24.7": + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/types": 7.24.7 - - "@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.7(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-environment-visitor": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.7(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/helper-skip-transparent-expression-wrappers": 7.24.7 - "@babel/plugin-transform-optional-chaining": 7.24.7(@babel/core@7.24.7) + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + "@babel/traverse": 7.25.9 transitivePeerDependencies: - supports-color - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-environment-visitor": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.7)": + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7)": + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-create-regexp-features-plugin": 7.24.7(@babel/core@7.24.7) - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-transform-async-generator-functions@7.24.7(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-environment-visitor": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/helper-remap-async-to-generator": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.24.7) + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + "@babel/helper-skip-transparent-expression-wrappers": 7.25.9 + "@babel/plugin-transform-optional-chaining": 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: - supports-color - "@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-module-imports": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/helper-remap-async-to-generator": 7.24.7(@babel/core@7.24.7) + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + "@babel/traverse": 7.25.9 transitivePeerDependencies: - supports-color - "@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 - "@babel/plugin-transform-block-scoping@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-create-class-features-plugin": 7.24.7(@babel/core@7.24.7) - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-create-regexp-features-plugin": 7.25.9(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + "@babel/helper-remap-async-to-generator": 7.25.9(@babel/core@7.26.0) + "@babel/traverse": 7.25.9 transitivePeerDependencies: - supports-color - "@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-create-class-features-plugin": 7.24.7(@babel/core@7.24.7) - "@babel/helper-plugin-utils": 7.24.7 - "@babel/plugin-syntax-class-static-block": 7.14.5(@babel/core@7.24.7) + "@babel/core": 7.26.0 + "@babel/helper-module-imports": 7.25.9 + "@babel/helper-plugin-utils": 7.25.9 + "@babel/helper-remap-async-to-generator": 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: - supports-color - "@babel/plugin-transform-classes@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-annotate-as-pure": 7.24.7 - "@babel/helper-compilation-targets": 7.24.7 - "@babel/helper-environment-visitor": 7.24.7 - "@babel/helper-function-name": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/helper-replace-supers": 7.24.7(@babel/core@7.24.7) - "@babel/helper-split-export-declaration": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-create-class-features-plugin": 7.25.9(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 + transitivePeerDependencies: + - supports-color + + "@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-create-class-features-plugin": 7.25.9(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 + transitivePeerDependencies: + - supports-color + + "@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-annotate-as-pure": 7.25.9 + "@babel/helper-compilation-targets": 7.25.9 + "@babel/helper-plugin-utils": 7.25.9 + "@babel/helper-replace-supers": 7.25.9(@babel/core@7.26.0) + "@babel/traverse": 7.25.9 globals: 11.12.0 transitivePeerDependencies: - supports-color - "@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/template": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + "@babel/template": 7.25.9 - "@babel/plugin-transform-destructuring@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-create-regexp-features-plugin": 7.24.7(@babel/core@7.24.7) - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-create-regexp-features-plugin": 7.25.9(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/plugin-syntax-dynamic-import": 7.8.3(@babel/core@7.24.7) + "@babel/core": 7.26.0 + "@babel/helper-create-regexp-features-plugin": 7.25.9(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-builder-binary-assignment-operator-visitor": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-builder-binary-assignment-operator-visitor": 7.25.9 + "@babel/helper-plugin-utils": 7.25.9 transitivePeerDependencies: - supports-color - "@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/plugin-syntax-export-namespace-from": 7.8.3(@babel/core@7.24.7) + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-for-of@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/helper-skip-transparent-expression-wrappers": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + "@babel/helper-skip-transparent-expression-wrappers": 7.25.9 transitivePeerDependencies: - supports-color - "@babel/plugin-transform-function-name@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-compilation-targets": 7.24.7 - "@babel/helper-function-name": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.24.7) - - "@babel/plugin-transform-literals@7.24.7(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.24.7) - - "@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-module-transforms": 7.24.7(@babel/core@7.24.7) - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-compilation-targets": 7.25.9 + "@babel/helper-plugin-utils": 7.25.9 + "@babel/traverse": 7.25.9 transitivePeerDependencies: - supports-color - "@babel/plugin-transform-modules-commonjs@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-module-transforms": 7.24.7(@babel/core@7.24.7) - "@babel/helper-plugin-utils": 7.24.7 - "@babel/helper-simple-access": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-module-transforms": 7.26.0(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 transitivePeerDependencies: - supports-color - "@babel/plugin-transform-modules-systemjs@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-hoist-variables": 7.24.7 - "@babel/helper-module-transforms": 7.24.7(@babel/core@7.24.7) - "@babel/helper-plugin-utils": 7.24.7 - "@babel/helper-validator-identifier": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-module-transforms": 7.26.0(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 + "@babel/helper-simple-access": 7.25.9 transitivePeerDependencies: - supports-color - "@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-module-transforms": 7.24.7(@babel/core@7.24.7) - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-module-transforms": 7.26.0(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 + "@babel/helper-validator-identifier": 7.25.9 + "@babel/traverse": 7.25.9 transitivePeerDependencies: - supports-color - "@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-create-regexp-features-plugin": 7.24.7(@babel/core@7.24.7) - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-transform-new-target@7.24.7(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - - "@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.24.7) - - "@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.24.7) - - "@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-compilation-targets": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.24.7) - "@babel/plugin-transform-parameters": 7.24.7(@babel/core@7.24.7) - - "@babel/plugin-transform-object-super@7.24.7(@babel/core@7.24.7)": - dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/helper-replace-supers": 7.24.7(@babel/core@7.24.7) + "@babel/core": 7.26.0 + "@babel/helper-module-transforms": 7.26.0(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 transitivePeerDependencies: - supports-color - "@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.24.7) + "@babel/core": 7.26.0 + "@babel/helper-create-regexp-features-plugin": 7.25.9(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-optional-chaining@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/helper-skip-transparent-expression-wrappers": 7.24.7 - "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.24.7) + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-compilation-targets": 7.25.9 + "@babel/helper-plugin-utils": 7.25.9 + "@babel/plugin-transform-parameters": 7.25.9(@babel/core@7.26.0) + + "@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + "@babel/helper-replace-supers": 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: - supports-color - "@babel/plugin-transform-parameters@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-create-class-features-plugin": 7.24.7(@babel/core@7.24.7) - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + "@babel/helper-skip-transparent-expression-wrappers": 7.25.9 transitivePeerDependencies: - supports-color - "@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-annotate-as-pure": 7.24.7 - "@babel/helper-create-class-features-plugin": 7.24.7(@babel/core@7.24.7) - "@babel/helper-plugin-utils": 7.24.7 - "@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.24.7) + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-create-class-features-plugin": 7.25.9(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 transitivePeerDependencies: - supports-color - "@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-annotate-as-pure": 7.25.9 + "@babel/helper-create-class-features-plugin": 7.25.9(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 + transitivePeerDependencies: + - supports-color - "@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 regenerator-transform: 0.15.2 - "@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-create-regexp-features-plugin": 7.25.9(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-spread@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/helper-skip-transparent-expression-wrappers": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + "@babel/helper-skip-transparent-expression-wrappers": 7.25.9 transitivePeerDependencies: - supports-color - "@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-typeof-symbol@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-create-regexp-features-plugin": 7.24.7(@babel/core@7.24.7) - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-create-regexp-features-plugin": 7.25.9(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-create-regexp-features-plugin": 7.24.7(@babel/core@7.24.7) - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-create-regexp-features-plugin": 7.25.9(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 - "@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.24.7)": + "@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-create-regexp-features-plugin": 7.24.7(@babel/core@7.24.7) - "@babel/helper-plugin-utils": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-create-regexp-features-plugin": 7.25.9(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 - "@babel/preset-env@7.24.7(@babel/core@7.24.7)": + "@babel/preset-env@7.26.0(@babel/core@7.26.0)": dependencies: - "@babel/compat-data": 7.24.7 - "@babel/core": 7.24.7 - "@babel/helper-compilation-targets": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/helper-validator-option": 7.24.7 - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.7) - "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.24.7) - "@babel/plugin-syntax-class-properties": 7.12.13(@babel/core@7.24.7) - "@babel/plugin-syntax-class-static-block": 7.14.5(@babel/core@7.24.7) - "@babel/plugin-syntax-dynamic-import": 7.8.3(@babel/core@7.24.7) - "@babel/plugin-syntax-export-namespace-from": 7.8.3(@babel/core@7.24.7) - "@babel/plugin-syntax-import-assertions": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-syntax-import-attributes": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-syntax-import-meta": 7.10.4(@babel/core@7.24.7) - "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.24.7) - "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.24.7) - "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.24.7) - "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.24.7) - "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.24.7) - "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.24.7) - "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.24.7) - "@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.24.7) - "@babel/plugin-syntax-top-level-await": 7.14.5(@babel/core@7.24.7) - "@babel/plugin-syntax-unicode-sets-regex": 7.18.6(@babel/core@7.24.7) - "@babel/plugin-transform-arrow-functions": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-async-generator-functions": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-async-to-generator": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-block-scoped-functions": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-block-scoping": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-class-properties": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-class-static-block": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-classes": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-computed-properties": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-destructuring": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-dotall-regex": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-duplicate-keys": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-dynamic-import": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-exponentiation-operator": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-export-namespace-from": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-for-of": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-function-name": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-json-strings": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-literals": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-logical-assignment-operators": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-member-expression-literals": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-modules-amd": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-modules-commonjs": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-modules-systemjs": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-modules-umd": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-named-capturing-groups-regex": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-new-target": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-nullish-coalescing-operator": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-numeric-separator": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-object-rest-spread": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-object-super": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-optional-catch-binding": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-optional-chaining": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-parameters": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-private-methods": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-private-property-in-object": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-property-literals": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-regenerator": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-reserved-words": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-shorthand-properties": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-spread": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-sticky-regex": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-template-literals": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-typeof-symbol": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-unicode-escapes": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-unicode-property-regex": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-unicode-regex": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-unicode-sets-regex": 7.24.7(@babel/core@7.24.7) - "@babel/preset-modules": 0.1.6-no-external-plugins(@babel/core@7.24.7) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.7) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.7) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.7) - core-js-compat: 3.37.1 + "@babel/compat-data": 7.26.2 + "@babel/core": 7.26.0 + "@babel/helper-compilation-targets": 7.25.9 + "@babel/helper-plugin-utils": 7.25.9 + "@babel/helper-validator-option": 7.25.9 + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-bugfix-safari-class-field-initializer-scope": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0) + "@babel/plugin-syntax-import-assertions": 7.26.0(@babel/core@7.26.0) + "@babel/plugin-syntax-import-attributes": 7.26.0(@babel/core@7.26.0) + "@babel/plugin-syntax-unicode-sets-regex": 7.18.6(@babel/core@7.26.0) + "@babel/plugin-transform-arrow-functions": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-async-generator-functions": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-async-to-generator": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-block-scoped-functions": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-block-scoping": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-class-properties": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-class-static-block": 7.26.0(@babel/core@7.26.0) + "@babel/plugin-transform-classes": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-computed-properties": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-destructuring": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-dotall-regex": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-duplicate-keys": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-dynamic-import": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-exponentiation-operator": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-export-namespace-from": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-for-of": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-function-name": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-json-strings": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-literals": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-logical-assignment-operators": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-member-expression-literals": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-modules-amd": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-modules-commonjs": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-modules-systemjs": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-modules-umd": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-named-capturing-groups-regex": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-new-target": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-nullish-coalescing-operator": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-numeric-separator": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-object-rest-spread": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-object-super": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-optional-catch-binding": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-optional-chaining": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-parameters": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-private-methods": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-private-property-in-object": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-property-literals": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-regenerator": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-regexp-modifiers": 7.26.0(@babel/core@7.26.0) + "@babel/plugin-transform-reserved-words": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-shorthand-properties": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-spread": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-sticky-regex": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-template-literals": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-typeof-symbol": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-unicode-escapes": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-unicode-property-regex": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-unicode-regex": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-unicode-sets-regex": 7.25.9(@babel/core@7.26.0) + "@babel/preset-modules": 0.1.6-no-external-plugins(@babel/core@7.26.0) + babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) + core-js-compat: 3.39.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - "@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.7)": + "@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@babel/helper-plugin-utils": 7.24.7 - "@babel/types": 7.24.7 + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + "@babel/types": 7.26.0 esutils: 2.0.3 - "@babel/regjsgen@0.8.0": {} - - "@babel/runtime@7.24.7": + "@babel/runtime@7.26.0": dependencies: regenerator-runtime: 0.14.1 - "@babel/template@7.24.7": + "@babel/template@7.25.9": dependencies: - "@babel/code-frame": 7.24.7 - "@babel/parser": 7.24.7 - "@babel/types": 7.24.7 + "@babel/code-frame": 7.26.2 + "@babel/parser": 7.26.2 + "@babel/types": 7.26.0 - "@babel/traverse@7.24.7": + "@babel/traverse@7.25.9": dependencies: - "@babel/code-frame": 7.24.7 - "@babel/generator": 7.24.7 - "@babel/helper-environment-visitor": 7.24.7 - "@babel/helper-function-name": 7.24.7 - "@babel/helper-hoist-variables": 7.24.7 - "@babel/helper-split-export-declaration": 7.24.7 - "@babel/parser": 7.24.7 - "@babel/types": 7.24.7 - debug: 4.3.5 + "@babel/code-frame": 7.26.2 + "@babel/generator": 7.26.2 + "@babel/parser": 7.26.2 + "@babel/template": 7.25.9 + "@babel/types": 7.26.0 + debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: - supports-color - "@babel/types@7.24.7": + "@babel/types@7.26.0": dependencies: - "@babel/helper-string-parser": 7.24.7 - "@babel/helper-validator-identifier": 7.24.7 - to-fast-properties: 2.0.0 + "@babel/helper-string-parser": 7.25.9 + "@babel/helper-validator-identifier": 7.25.9 "@dnd-kit/accessibility@3.1.0(react@18.3.1)": dependencies: react: 18.3.1 - tslib: 2.6.3 + tslib: 2.8.1 "@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: @@ -5453,27 +5621,27 @@ snapshots: "@dnd-kit/utilities": 3.2.2(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - tslib: 2.6.3 + tslib: 2.8.1 "@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)": dependencies: "@dnd-kit/core": 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) "@dnd-kit/utilities": 3.2.2(react@18.3.1) react: 18.3.1 - tslib: 2.6.3 + tslib: 2.8.1 "@dnd-kit/utilities@3.2.2(react@18.3.1)": dependencies: react: 18.3.1 - tslib: 2.6.3 + tslib: 2.8.1 - "@emotion/babel-plugin@11.11.0": + "@emotion/babel-plugin@11.12.0": dependencies: - "@babel/helper-module-imports": 7.24.7 - "@babel/runtime": 7.24.7 - "@emotion/hash": 0.9.1 - "@emotion/memoize": 0.8.1 - "@emotion/serialize": 1.1.4 + "@babel/helper-module-imports": 7.25.9 + "@babel/runtime": 7.26.0 + "@emotion/hash": 0.9.2 + "@emotion/memoize": 0.9.0 + "@emotion/serialize": 1.3.2 babel-plugin-macros: 3.1.0 convert-source-map: 1.9.0 escape-string-regexp: 4.0.0 @@ -5483,72 +5651,72 @@ snapshots: transitivePeerDependencies: - supports-color - "@emotion/cache@11.11.0": + "@emotion/cache@11.13.1": dependencies: - "@emotion/memoize": 0.8.1 - "@emotion/sheet": 1.2.2 - "@emotion/utils": 1.2.1 - "@emotion/weak-memoize": 0.3.1 + "@emotion/memoize": 0.9.0 + "@emotion/sheet": 1.4.0 + "@emotion/utils": 1.4.1 + "@emotion/weak-memoize": 0.4.0 stylis: 4.2.0 - "@emotion/hash@0.9.1": {} + "@emotion/hash@0.9.2": {} - "@emotion/is-prop-valid@1.2.2": + "@emotion/is-prop-valid@1.3.1": dependencies: - "@emotion/memoize": 0.8.1 + "@emotion/memoize": 0.9.0 - "@emotion/memoize@0.8.1": {} + "@emotion/memoize@0.9.0": {} - "@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1)": + "@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1)": dependencies: - "@babel/runtime": 7.24.7 - "@emotion/babel-plugin": 11.11.0 - "@emotion/cache": 11.11.0 - "@emotion/serialize": 1.1.4 - "@emotion/use-insertion-effect-with-fallbacks": 1.0.1(react@18.3.1) - "@emotion/utils": 1.2.1 - "@emotion/weak-memoize": 0.3.1 + "@babel/runtime": 7.26.0 + "@emotion/babel-plugin": 11.12.0 + "@emotion/cache": 11.13.1 + "@emotion/serialize": 1.3.2 + "@emotion/use-insertion-effect-with-fallbacks": 1.1.0(react@18.3.1) + "@emotion/utils": 1.4.1 + "@emotion/weak-memoize": 0.4.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - "@types/react": 18.3.3 + "@types/react": 18.3.12 transitivePeerDependencies: - supports-color - "@emotion/serialize@1.1.4": + "@emotion/serialize@1.3.2": dependencies: - "@emotion/hash": 0.9.1 - "@emotion/memoize": 0.8.1 - "@emotion/unitless": 0.8.1 - "@emotion/utils": 1.2.1 + "@emotion/hash": 0.9.2 + "@emotion/memoize": 0.9.0 + "@emotion/unitless": 0.10.0 + "@emotion/utils": 1.4.1 csstype: 3.1.3 - "@emotion/sheet@1.2.2": {} + "@emotion/sheet@1.4.0": {} - "@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)": + "@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1)": dependencies: - "@babel/runtime": 7.24.7 - "@emotion/babel-plugin": 11.11.0 - "@emotion/is-prop-valid": 1.2.2 - "@emotion/react": 11.11.4(@types/react@18.3.3)(react@18.3.1) - "@emotion/serialize": 1.1.4 - "@emotion/use-insertion-effect-with-fallbacks": 1.0.1(react@18.3.1) - "@emotion/utils": 1.2.1 + "@babel/runtime": 7.26.0 + "@emotion/babel-plugin": 11.12.0 + "@emotion/is-prop-valid": 1.3.1 + "@emotion/react": 11.13.3(@types/react@18.3.12)(react@18.3.1) + "@emotion/serialize": 1.3.2 + "@emotion/use-insertion-effect-with-fallbacks": 1.1.0(react@18.3.1) + "@emotion/utils": 1.4.1 react: 18.3.1 optionalDependencies: - "@types/react": 18.3.3 + "@types/react": 18.3.12 transitivePeerDependencies: - supports-color - "@emotion/unitless@0.8.1": {} + "@emotion/unitless@0.10.0": {} - "@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.1)": + "@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.3.1)": dependencies: react: 18.3.1 - "@emotion/utils@1.2.1": {} + "@emotion/utils@1.4.1": {} - "@emotion/weak-memoize@0.3.1": {} + "@emotion/weak-memoize@0.4.0": {} "@esbuild/aix-ppc64@0.21.5": optional: true @@ -5621,27 +5789,40 @@ snapshots: "@fastify/busboy@2.1.1": {} - "@floating-ui/core@1.6.4": + "@floating-ui/core@1.6.8": dependencies: - "@floating-ui/utils": 0.2.4 + "@floating-ui/utils": 0.2.8 - "@floating-ui/dom@1.6.7": + "@floating-ui/dom@1.6.12": dependencies: - "@floating-ui/core": 1.6.4 - "@floating-ui/utils": 0.2.4 + "@floating-ui/core": 1.6.8 + "@floating-ui/utils": 0.2.8 - "@floating-ui/react-dom@2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: - "@floating-ui/dom": 1.6.7 + "@floating-ui/dom": 1.6.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - "@floating-ui/utils@0.2.4": {} + "@floating-ui/utils@0.2.8": {} + + "@isaacs/cliui@8.0.2": + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.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.2 "@jridgewell/gen-mapping@0.3.5": dependencies: "@jridgewell/set-array": 1.2.1 - "@jridgewell/sourcemap-codec": 1.4.15 + "@jridgewell/sourcemap-codec": 1.5.0 "@jridgewell/trace-mapping": 0.3.25 "@jridgewell/resolve-uri@3.1.2": {} @@ -5653,80 +5834,66 @@ snapshots: "@jridgewell/gen-mapping": 0.3.5 "@jridgewell/trace-mapping": 0.3.25 - "@jridgewell/sourcemap-codec@1.4.15": {} + "@jridgewell/sourcemap-codec@1.5.0": {} "@jridgewell/trace-mapping@0.3.25": dependencies: "@jridgewell/resolve-uri": 3.1.2 - "@jridgewell/sourcemap-codec": 1.4.15 + "@jridgewell/sourcemap-codec": 1.5.0 "@juggle/resize-observer@3.4.0": {} - "@mui/base@5.0.0-beta.20(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@mui/base@5.0.0-beta.20(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: - "@babel/runtime": 7.24.7 - "@floating-ui/react-dom": 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@mui/types": 7.2.14(@types/react@18.3.3) - "@mui/utils": 5.16.0(@types/react@18.3.3)(react@18.3.1) + "@babel/runtime": 7.26.0 + "@floating-ui/react-dom": 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@mui/types": 7.2.19(@types/react@18.3.12) + "@mui/utils": 5.16.6(@types/react@18.3.12)(react@18.3.1) "@popperjs/core": 2.11.8 clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - "@types/react": 18.3.3 + "@types/react": 18.3.12 - "@mui/base@5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@mui/core-downloads-tracker@6.1.6": {} + + "@mui/icons-material@6.1.6(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react@18.3.1)": dependencies: - "@babel/runtime": 7.24.7 - "@floating-ui/react-dom": 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@mui/types": 7.2.14(@types/react@18.3.3) - "@mui/utils": 5.16.0(@types/react@18.3.3)(react@18.3.1) + "@babel/runtime": 7.26.0 + "@mui/material": 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.12 + + "@mui/lab@5.0.0-alpha.149(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@babel/runtime": 7.26.0 + "@mui/base": 5.0.0-beta.20(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@mui/material": 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@mui/system": 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + "@mui/types": 7.2.19(@types/react@18.3.12) + "@mui/utils": 5.16.6(@types/react@18.3.12)(react@18.3.1) + "@mui/x-tree-view": 6.0.0-alpha.1(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@mui/base@5.0.0-beta.20(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@emotion/react": 11.13.3(@types/react@18.3.12)(react@18.3.1) + "@emotion/styled": 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + "@types/react": 18.3.12 + + "@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@babel/runtime": 7.26.0 + "@mui/core-downloads-tracker": 6.1.6 + "@mui/system": 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + "@mui/types": 7.2.19(@types/react@18.3.12) + "@mui/utils": 6.1.6(@types/react@18.3.12)(react@18.3.1) "@popperjs/core": 2.11.8 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - "@types/react": 18.3.3 - - "@mui/core-downloads-tracker@5.16.0": {} - - "@mui/icons-material@5.16.0(@mui/material@5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)": - dependencies: - "@babel/runtime": 7.24.7 - "@mui/material": 5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - optionalDependencies: - "@types/react": 18.3.3 - - "@mui/lab@5.0.0-alpha.149(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": - dependencies: - "@babel/runtime": 7.24.7 - "@mui/base": 5.0.0-beta.20(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@mui/material": 5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@mui/system": 5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - "@mui/types": 7.2.14(@types/react@18.3.3) - "@mui/utils": 5.16.0(@types/react@18.3.3)(react@18.3.1) - "@mui/x-tree-view": 6.0.0-alpha.1(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/base@5.0.0-beta.20(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/material@5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - clsx: 2.1.1 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - "@emotion/react": 11.11.4(@types/react@18.3.3)(react@18.3.1) - "@emotion/styled": 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - "@types/react": 18.3.3 - - "@mui/material@5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": - dependencies: - "@babel/runtime": 7.24.7 - "@mui/base": 5.0.0-beta.40(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@mui/core-downloads-tracker": 5.16.0 - "@mui/system": 5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - "@mui/types": 7.2.14(@types/react@18.3.3) - "@mui/utils": 5.16.0(@types/react@18.3.3)(react@18.3.1) - "@types/react-transition-group": 4.4.10 + "@types/react-transition-group": 4.4.11 clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 @@ -5735,95 +5902,148 @@ snapshots: react-is: 18.3.1 react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: - "@emotion/react": 11.11.4(@types/react@18.3.3)(react@18.3.1) - "@emotion/styled": 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - "@types/react": 18.3.3 + "@emotion/react": 11.13.3(@types/react@18.3.12)(react@18.3.1) + "@emotion/styled": 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + "@types/react": 18.3.12 - "@mui/private-theming@5.16.0(@types/react@18.3.3)(react@18.3.1)": + "@mui/private-theming@5.16.6(@types/react@18.3.12)(react@18.3.1)": dependencies: - "@babel/runtime": 7.24.7 - "@mui/utils": 5.16.0(@types/react@18.3.3)(react@18.3.1) + "@babel/runtime": 7.26.0 + "@mui/utils": 5.16.6(@types/react@18.3.12)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - "@types/react": 18.3.3 + "@types/react": 18.3.12 - "@mui/styled-engine@5.15.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)": + "@mui/private-theming@6.1.6(@types/react@18.3.12)(react@18.3.1)": dependencies: - "@babel/runtime": 7.24.7 - "@emotion/cache": 11.11.0 + "@babel/runtime": 7.26.0 + "@mui/utils": 6.1.6(@types/react@18.3.12)(react@18.3.1) + prop-types: 15.8.1 + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.12 + + "@mui/styled-engine@5.16.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1)": + dependencies: + "@babel/runtime": 7.26.0 + "@emotion/cache": 11.13.1 csstype: 3.1.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - "@emotion/react": 11.11.4(@types/react@18.3.3)(react@18.3.1) - "@emotion/styled": 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + "@emotion/react": 11.13.3(@types/react@18.3.12)(react@18.3.1) + "@emotion/styled": 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) - "@mui/system@5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)": + "@mui/styled-engine@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1)": dependencies: - "@babel/runtime": 7.24.7 - "@mui/private-theming": 5.16.0(@types/react@18.3.3)(react@18.3.1) - "@mui/styled-engine": 5.15.14(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1) - "@mui/types": 7.2.14(@types/react@18.3.3) - "@mui/utils": 5.16.0(@types/react@18.3.3)(react@18.3.1) + "@babel/runtime": 7.26.0 + "@emotion/cache": 11.13.1 + "@emotion/serialize": 1.3.2 + "@emotion/sheet": 1.4.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.1 + optionalDependencies: + "@emotion/react": 11.13.3(@types/react@18.3.12)(react@18.3.1) + "@emotion/styled": 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + + "@mui/system@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1)": + dependencies: + "@babel/runtime": 7.26.0 + "@mui/private-theming": 5.16.6(@types/react@18.3.12)(react@18.3.1) + "@mui/styled-engine": 5.16.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1) + "@mui/types": 7.2.19(@types/react@18.3.12) + "@mui/utils": 5.16.6(@types/react@18.3.12)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - "@emotion/react": 11.11.4(@types/react@18.3.3)(react@18.3.1) - "@emotion/styled": 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - "@types/react": 18.3.3 + "@emotion/react": 11.13.3(@types/react@18.3.12)(react@18.3.1) + "@emotion/styled": 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + "@types/react": 18.3.12 - "@mui/types@7.2.14(@types/react@18.3.3)": - optionalDependencies: - "@types/react": 18.3.3 - - "@mui/utils@5.16.0(@types/react@18.3.3)(react@18.3.1)": + "@mui/system@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1)": dependencies: - "@babel/runtime": 7.24.7 - "@types/prop-types": 15.7.12 + "@babel/runtime": 7.26.0 + "@mui/private-theming": 6.1.6(@types/react@18.3.12)(react@18.3.1) + "@mui/styled-engine": 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1) + "@mui/types": 7.2.19(@types/react@18.3.12) + "@mui/utils": 6.1.6(@types/react@18.3.12)(react@18.3.1) + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.1 + optionalDependencies: + "@emotion/react": 11.13.3(@types/react@18.3.12)(react@18.3.1) + "@emotion/styled": 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + "@types/react": 18.3.12 + + "@mui/types@7.2.19(@types/react@18.3.12)": + optionalDependencies: + "@types/react": 18.3.12 + + "@mui/utils@5.16.6(@types/react@18.3.12)(react@18.3.1)": + dependencies: + "@babel/runtime": 7.26.0 + "@mui/types": 7.2.19(@types/react@18.3.12) + "@types/prop-types": 15.7.13 + clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-is: 18.3.1 optionalDependencies: - "@types/react": 18.3.3 + "@types/react": 18.3.12 - "@mui/x-data-grid@7.9.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@mui/utils@6.1.6(@types/react@18.3.12)(react@18.3.1)": dependencies: - "@babel/runtime": 7.24.7 - "@mui/material": 5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@mui/system": 5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - "@mui/utils": 5.16.0(@types/react@18.3.3)(react@18.3.1) - "@mui/x-internals": 7.9.0(@types/react@18.3.3)(react@18.3.1) + "@babel/runtime": 7.26.0 + "@mui/types": 7.2.19(@types/react@18.3.12) + "@types/prop-types": 15.7.13 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-is: 18.3.1 + optionalDependencies: + "@types/react": 18.3.12 + + "@mui/x-data-grid@7.22.2(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@babel/runtime": 7.26.0 + "@mui/material": 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@mui/system": 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + "@mui/utils": 6.1.6(@types/react@18.3.12)(react@18.3.1) + "@mui/x-internals": 7.21.0(@types/react@18.3.12)(react@18.3.1) clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - reselect: 4.1.8 + reselect: 5.1.1 + optionalDependencies: + "@emotion/react": 11.13.3(@types/react@18.3.12)(react@18.3.1) + "@emotion/styled": 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) transitivePeerDependencies: - - "@emotion/react" - - "@emotion/styled" - "@types/react" - "@mui/x-internals@7.9.0(@types/react@18.3.3)(react@18.3.1)": + "@mui/x-internals@7.21.0(@types/react@18.3.12)(react@18.3.1)": dependencies: - "@babel/runtime": 7.24.7 - "@mui/utils": 5.16.0(@types/react@18.3.3)(react@18.3.1) + "@babel/runtime": 7.26.0 + "@mui/utils": 6.1.6(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 transitivePeerDependencies: - "@types/react" - "@mui/x-tree-view@6.0.0-alpha.1(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/base@5.0.0-beta.20(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/material@5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + "@mui/x-tree-view@6.0.0-alpha.1(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@mui/base@5.0.0-beta.20(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: - "@babel/runtime": 7.24.7 - "@emotion/react": 11.11.4(@types/react@18.3.3)(react@18.3.1) - "@emotion/styled": 11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - "@mui/base": 5.0.0-beta.20(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@mui/material": 5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - "@mui/system": 5.16.0(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - "@mui/utils": 5.16.0(@types/react@18.3.3)(react@18.3.1) - "@types/react-transition-group": 4.4.10 + "@babel/runtime": 7.26.0 + "@emotion/react": 11.13.3(@types/react@18.3.12)(react@18.3.1) + "@emotion/styled": 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + "@mui/base": 5.0.0-beta.20(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@mui/material": 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@mui/system": 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + "@mui/utils": 5.16.6(@types/react@18.3.12)(react@18.3.1) + "@types/react-transition-group": 4.4.11 clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 @@ -5832,184 +6052,248 @@ snapshots: transitivePeerDependencies: - "@types/react" - "@octokit/auth-token@2.5.0": - dependencies: - "@octokit/types": 6.41.0 + "@octokit/auth-token@4.0.0": {} - "@octokit/core@3.6.0": + "@octokit/core@5.2.0": dependencies: - "@octokit/auth-token": 2.5.0 - "@octokit/graphql": 4.8.0 - "@octokit/request": 5.6.3 - "@octokit/request-error": 2.1.0 - "@octokit/types": 6.41.0 + "@octokit/auth-token": 4.0.0 + "@octokit/graphql": 7.1.0 + "@octokit/request": 8.4.0 + "@octokit/request-error": 5.1.0 + "@octokit/types": 13.6.1 before-after-hook: 2.2.3 universal-user-agent: 6.0.1 - transitivePeerDependencies: - - encoding - "@octokit/endpoint@6.0.12": + "@octokit/endpoint@9.0.5": dependencies: - "@octokit/types": 6.41.0 - is-plain-object: 5.0.0 + "@octokit/types": 13.6.1 universal-user-agent: 6.0.1 - "@octokit/graphql@4.8.0": + "@octokit/graphql@7.1.0": dependencies: - "@octokit/request": 5.6.3 - "@octokit/types": 6.41.0 + "@octokit/request": 8.4.0 + "@octokit/types": 13.6.1 universal-user-agent: 6.0.1 - transitivePeerDependencies: - - encoding - "@octokit/openapi-types@12.11.0": {} + "@octokit/openapi-types@20.0.0": {} - "@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0)": + "@octokit/openapi-types@22.2.0": {} + + "@octokit/plugin-paginate-rest@9.2.1(@octokit/core@5.2.0)": dependencies: - "@octokit/core": 3.6.0 - "@octokit/types": 6.41.0 + "@octokit/core": 5.2.0 + "@octokit/types": 12.6.0 - "@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0)": + "@octokit/plugin-rest-endpoint-methods@10.4.1(@octokit/core@5.2.0)": dependencies: - "@octokit/core": 3.6.0 - "@octokit/types": 6.41.0 - deprecation: 2.3.1 + "@octokit/core": 5.2.0 + "@octokit/types": 12.6.0 - "@octokit/request-error@2.1.0": + "@octokit/request-error@5.1.0": dependencies: - "@octokit/types": 6.41.0 + "@octokit/types": 13.6.1 deprecation: 2.3.1 once: 1.4.0 - "@octokit/request@5.6.3": + "@octokit/request@8.4.0": dependencies: - "@octokit/endpoint": 6.0.12 - "@octokit/request-error": 2.1.0 - "@octokit/types": 6.41.0 - is-plain-object: 5.0.0 - node-fetch: 2.7.0 + "@octokit/endpoint": 9.0.5 + "@octokit/request-error": 5.1.0 + "@octokit/types": 13.6.1 universal-user-agent: 6.0.1 - transitivePeerDependencies: - - encoding - "@octokit/types@6.41.0": + "@octokit/types@12.6.0": dependencies: - "@octokit/openapi-types": 12.11.0 + "@octokit/openapi-types": 20.0.0 - "@peggyjs/from-mem@1.3.0": + "@octokit/types@13.6.1": dependencies: - semver: 7.6.0 + "@octokit/openapi-types": 22.2.0 + + "@parcel/watcher-android-arm64@2.5.0": + optional: true + + "@parcel/watcher-darwin-arm64@2.5.0": + optional: true + + "@parcel/watcher-darwin-x64@2.5.0": + optional: true + + "@parcel/watcher-freebsd-x64@2.5.0": + optional: true + + "@parcel/watcher-linux-arm-glibc@2.5.0": + optional: true + + "@parcel/watcher-linux-arm-musl@2.5.0": + optional: true + + "@parcel/watcher-linux-arm64-glibc@2.5.0": + optional: true + + "@parcel/watcher-linux-arm64-musl@2.5.0": + optional: true + + "@parcel/watcher-linux-x64-glibc@2.5.0": + optional: true + + "@parcel/watcher-linux-x64-musl@2.5.0": + optional: true + + "@parcel/watcher-win32-arm64@2.5.0": + optional: true + + "@parcel/watcher-win32-ia32@2.5.0": + optional: true + + "@parcel/watcher-win32-x64@2.5.0": + optional: true + + "@parcel/watcher@2.5.0": + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + "@parcel/watcher-android-arm64": 2.5.0 + "@parcel/watcher-darwin-arm64": 2.5.0 + "@parcel/watcher-darwin-x64": 2.5.0 + "@parcel/watcher-freebsd-x64": 2.5.0 + "@parcel/watcher-linux-arm-glibc": 2.5.0 + "@parcel/watcher-linux-arm-musl": 2.5.0 + "@parcel/watcher-linux-arm64-glibc": 2.5.0 + "@parcel/watcher-linux-arm64-musl": 2.5.0 + "@parcel/watcher-linux-x64-glibc": 2.5.0 + "@parcel/watcher-linux-x64-musl": 2.5.0 + "@parcel/watcher-win32-arm64": 2.5.0 + "@parcel/watcher-win32-ia32": 2.5.0 + "@parcel/watcher-win32-x64": 2.5.0 + optional: true + + "@peggyjs/from-mem@1.3.4": + dependencies: + semver: 7.6.3 + + "@pkgjs/parseargs@0.11.0": + optional: true "@popperjs/core@2.11.8": {} - "@remix-run/router@1.17.1": {} + "@remix-run/router@1.21.0": {} - "@rollup/pluginutils@5.1.0(rollup@4.18.0)": + "@rollup/pluginutils@5.1.3(rollup@4.25.0)": dependencies: - "@types/estree": 1.0.5 + "@types/estree": 1.0.6 estree-walker: 2.0.2 - picomatch: 2.3.1 + picomatch: 4.0.2 optionalDependencies: - rollup: 4.18.0 + rollup: 4.25.0 - "@rollup/rollup-android-arm-eabi@4.18.0": + "@rollup/rollup-android-arm-eabi@4.25.0": optional: true - "@rollup/rollup-android-arm64@4.18.0": + "@rollup/rollup-android-arm64@4.25.0": optional: true - "@rollup/rollup-darwin-arm64@4.18.0": + "@rollup/rollup-darwin-arm64@4.25.0": optional: true - "@rollup/rollup-darwin-x64@4.18.0": + "@rollup/rollup-darwin-x64@4.25.0": optional: true - "@rollup/rollup-linux-arm-gnueabihf@4.18.0": + "@rollup/rollup-freebsd-arm64@4.25.0": optional: true - "@rollup/rollup-linux-arm-musleabihf@4.18.0": + "@rollup/rollup-freebsd-x64@4.25.0": optional: true - "@rollup/rollup-linux-arm64-gnu@4.18.0": + "@rollup/rollup-linux-arm-gnueabihf@4.25.0": optional: true - "@rollup/rollup-linux-arm64-musl@4.18.0": + "@rollup/rollup-linux-arm-musleabihf@4.25.0": optional: true - "@rollup/rollup-linux-powerpc64le-gnu@4.18.0": + "@rollup/rollup-linux-arm64-gnu@4.25.0": optional: true - "@rollup/rollup-linux-riscv64-gnu@4.18.0": + "@rollup/rollup-linux-arm64-musl@4.25.0": optional: true - "@rollup/rollup-linux-s390x-gnu@4.18.0": + "@rollup/rollup-linux-powerpc64le-gnu@4.25.0": optional: true - "@rollup/rollup-linux-x64-gnu@4.18.0": + "@rollup/rollup-linux-riscv64-gnu@4.25.0": optional: true - "@rollup/rollup-linux-x64-musl@4.18.0": + "@rollup/rollup-linux-s390x-gnu@4.25.0": optional: true - "@rollup/rollup-win32-arm64-msvc@4.18.0": + "@rollup/rollup-linux-x64-gnu@4.25.0": optional: true - "@rollup/rollup-win32-ia32-msvc@4.18.0": + "@rollup/rollup-linux-x64-musl@4.25.0": optional: true - "@rollup/rollup-win32-x64-msvc@4.18.0": + "@rollup/rollup-win32-arm64-msvc@4.25.0": optional: true - "@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.24.7)": + "@rollup/rollup-win32-ia32-msvc@4.25.0": + optional: true + + "@rollup/rollup-win32-x64-msvc@4.25.0": + optional: true + + "@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 + "@babel/core": 7.26.0 - "@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.24.7)": + "@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 + "@babel/core": 7.26.0 - "@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.24.7)": + "@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 + "@babel/core": 7.26.0 - "@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.24.7)": + "@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 + "@babel/core": 7.26.0 - "@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.24.7)": + "@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 + "@babel/core": 7.26.0 - "@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.24.7)": + "@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 + "@babel/core": 7.26.0 - "@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.24.7)": + "@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 + "@babel/core": 7.26.0 - "@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.24.7)": + "@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 + "@babel/core": 7.26.0 - "@svgr/babel-preset@8.1.0(@babel/core@7.24.7)": + "@svgr/babel-preset@8.1.0(@babel/core@7.26.0)": dependencies: - "@babel/core": 7.24.7 - "@svgr/babel-plugin-add-jsx-attribute": 8.0.0(@babel/core@7.24.7) - "@svgr/babel-plugin-remove-jsx-attribute": 8.0.0(@babel/core@7.24.7) - "@svgr/babel-plugin-remove-jsx-empty-expression": 8.0.0(@babel/core@7.24.7) - "@svgr/babel-plugin-replace-jsx-attribute-value": 8.0.0(@babel/core@7.24.7) - "@svgr/babel-plugin-svg-dynamic-title": 8.0.0(@babel/core@7.24.7) - "@svgr/babel-plugin-svg-em-dimensions": 8.0.0(@babel/core@7.24.7) - "@svgr/babel-plugin-transform-react-native-svg": 8.1.0(@babel/core@7.24.7) - "@svgr/babel-plugin-transform-svg-component": 8.0.0(@babel/core@7.24.7) + "@babel/core": 7.26.0 + "@svgr/babel-plugin-add-jsx-attribute": 8.0.0(@babel/core@7.26.0) + "@svgr/babel-plugin-remove-jsx-attribute": 8.0.0(@babel/core@7.26.0) + "@svgr/babel-plugin-remove-jsx-empty-expression": 8.0.0(@babel/core@7.26.0) + "@svgr/babel-plugin-replace-jsx-attribute-value": 8.0.0(@babel/core@7.26.0) + "@svgr/babel-plugin-svg-dynamic-title": 8.0.0(@babel/core@7.26.0) + "@svgr/babel-plugin-svg-em-dimensions": 8.0.0(@babel/core@7.26.0) + "@svgr/babel-plugin-transform-react-native-svg": 8.1.0(@babel/core@7.26.0) + "@svgr/babel-plugin-transform-svg-component": 8.0.0(@babel/core@7.26.0) - "@svgr/core@8.1.0(typescript@5.5.3)": + "@svgr/core@8.1.0(typescript@5.6.3)": dependencies: - "@babel/core": 7.24.7 - "@svgr/babel-preset": 8.1.0(@babel/core@7.24.7) + "@babel/core": 7.26.0 + "@svgr/babel-preset": 8.1.0(@babel/core@7.26.0) camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.5.3) + cosmiconfig: 8.3.6(typescript@5.6.3) snake-case: 3.0.4 transitivePeerDependencies: - supports-color @@ -6017,116 +6301,116 @@ snapshots: "@svgr/hast-util-to-babel-ast@8.0.0": dependencies: - "@babel/types": 7.24.7 + "@babel/types": 7.26.0 entities: 4.5.0 - "@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.5.3))": + "@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.6.3))": dependencies: - "@babel/core": 7.24.7 - "@svgr/babel-preset": 8.1.0(@babel/core@7.24.7) - "@svgr/core": 8.1.0(typescript@5.5.3) + "@babel/core": 7.26.0 + "@svgr/babel-preset": 8.1.0(@babel/core@7.26.0) + "@svgr/core": 8.1.0(typescript@5.6.3) "@svgr/hast-util-to-babel-ast": 8.0.0 svg-parser: 2.0.4 transitivePeerDependencies: - supports-color - "@tauri-apps/api@2.0.0-rc.4": {} + "@tauri-apps/api@2.1.1": {} - "@tauri-apps/cli-darwin-arm64@2.0.0-rc.8": + "@tauri-apps/cli-darwin-arm64@2.1.0": optional: true - "@tauri-apps/cli-darwin-x64@2.0.0-rc.8": + "@tauri-apps/cli-darwin-x64@2.1.0": optional: true - "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.8": + "@tauri-apps/cli-linux-arm-gnueabihf@2.1.0": optional: true - "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.8": + "@tauri-apps/cli-linux-arm64-gnu@2.1.0": optional: true - "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.8": + "@tauri-apps/cli-linux-arm64-musl@2.1.0": optional: true - "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.8": + "@tauri-apps/cli-linux-x64-gnu@2.1.0": optional: true - "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.8": + "@tauri-apps/cli-linux-x64-musl@2.1.0": optional: true - "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.8": + "@tauri-apps/cli-win32-arm64-msvc@2.1.0": optional: true - "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.8": + "@tauri-apps/cli-win32-ia32-msvc@2.1.0": optional: true - "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.8": + "@tauri-apps/cli-win32-x64-msvc@2.1.0": optional: true - "@tauri-apps/cli@2.0.0-rc.8": + "@tauri-apps/cli@2.1.0": optionalDependencies: - "@tauri-apps/cli-darwin-arm64": 2.0.0-rc.8 - "@tauri-apps/cli-darwin-x64": 2.0.0-rc.8 - "@tauri-apps/cli-linux-arm-gnueabihf": 2.0.0-rc.8 - "@tauri-apps/cli-linux-arm64-gnu": 2.0.0-rc.8 - "@tauri-apps/cli-linux-arm64-musl": 2.0.0-rc.8 - "@tauri-apps/cli-linux-x64-gnu": 2.0.0-rc.8 - "@tauri-apps/cli-linux-x64-musl": 2.0.0-rc.8 - "@tauri-apps/cli-win32-arm64-msvc": 2.0.0-rc.8 - "@tauri-apps/cli-win32-ia32-msvc": 2.0.0-rc.8 - "@tauri-apps/cli-win32-x64-msvc": 2.0.0-rc.8 + "@tauri-apps/cli-darwin-arm64": 2.1.0 + "@tauri-apps/cli-darwin-x64": 2.1.0 + "@tauri-apps/cli-linux-arm-gnueabihf": 2.1.0 + "@tauri-apps/cli-linux-arm64-gnu": 2.1.0 + "@tauri-apps/cli-linux-arm64-musl": 2.1.0 + "@tauri-apps/cli-linux-x64-gnu": 2.1.0 + "@tauri-apps/cli-linux-x64-musl": 2.1.0 + "@tauri-apps/cli-win32-arm64-msvc": 2.1.0 + "@tauri-apps/cli-win32-ia32-msvc": 2.1.0 + "@tauri-apps/cli-win32-x64-msvc": 2.1.0 - "@tauri-apps/plugin-clipboard-manager@2.0.0-rc.0": + "@tauri-apps/plugin-clipboard-manager@2.0.0": dependencies: - "@tauri-apps/api": 2.0.0-rc.4 + "@tauri-apps/api": 2.1.1 - "@tauri-apps/plugin-dialog@2.0.0-rc.0": + "@tauri-apps/plugin-dialog@2.0.1": dependencies: - "@tauri-apps/api": 2.0.0-rc.4 + "@tauri-apps/api": 2.1.1 - "@tauri-apps/plugin-fs@2.0.0-rc.1": + "@tauri-apps/plugin-fs@2.0.2": dependencies: - "@tauri-apps/api": 2.0.0-rc.4 + "@tauri-apps/api": 2.1.1 - "@tauri-apps/plugin-global-shortcut@2.0.0-rc.0": + "@tauri-apps/plugin-global-shortcut@2.0.0": dependencies: - "@tauri-apps/api": 2.0.0-rc.4 + "@tauri-apps/api": 2.1.1 - "@tauri-apps/plugin-notification@2.0.0-rc.0": + "@tauri-apps/plugin-notification@2.0.0": dependencies: - "@tauri-apps/api": 2.0.0-rc.4 + "@tauri-apps/api": 2.1.1 - "@tauri-apps/plugin-process@2.0.0-rc.0": + "@tauri-apps/plugin-process@2.0.0": dependencies: - "@tauri-apps/api": 2.0.0-rc.4 + "@tauri-apps/api": 2.1.1 - "@tauri-apps/plugin-shell@2.0.0-rc.0": + "@tauri-apps/plugin-shell@2.0.1": dependencies: - "@tauri-apps/api": 2.0.0-rc.4 + "@tauri-apps/api": 2.1.1 - "@tauri-apps/plugin-updater@2.0.0-rc.0": + "@tauri-apps/plugin-updater@2.0.0": dependencies: - "@tauri-apps/api": 2.0.0-rc.4 + "@tauri-apps/api": 2.1.1 "@types/babel__core@7.20.5": dependencies: - "@babel/parser": 7.24.7 - "@babel/types": 7.24.7 + "@babel/parser": 7.26.2 + "@babel/types": 7.26.0 "@types/babel__generator": 7.6.8 "@types/babel__template": 7.4.4 "@types/babel__traverse": 7.20.6 "@types/babel__generator@7.6.8": dependencies: - "@babel/types": 7.24.7 + "@babel/types": 7.26.0 "@types/babel__template@7.4.4": dependencies: - "@babel/parser": 7.24.7 - "@babel/types": 7.24.7 + "@babel/parser": 7.26.2 + "@babel/types": 7.26.0 "@types/babel__traverse@7.20.6": dependencies: - "@babel/types": 7.24.7 + "@babel/types": 7.26.0 "@types/debug@4.1.12": dependencies: @@ -6134,17 +6418,13 @@ snapshots: "@types/estree-jsx@1.0.5": dependencies: - "@types/estree": 1.0.5 + "@types/estree": 1.0.6 - "@types/estree@1.0.5": {} - - "@types/fs-extra@9.0.13": - dependencies: - "@types/node": 20.14.10 + "@types/estree@1.0.6": {} "@types/hast@3.0.4": dependencies: - "@types/unist": 3.0.2 + "@types/unist": 3.0.3 "@types/js-cookie@3.0.6": {} @@ -6154,164 +6434,171 @@ snapshots: "@types/lodash-es@4.17.12": dependencies: - "@types/lodash": 4.17.6 + "@types/lodash": 4.17.13 - "@types/lodash@4.17.6": {} + "@types/lodash@4.17.13": {} "@types/mdast@4.0.4": dependencies: - "@types/unist": 3.0.2 + "@types/unist": 3.0.3 "@types/ms@0.7.34": {} "@types/node@20.14.10": dependencies: undici-types: 5.26.5 + optional: true "@types/parse-json@4.0.2": {} - "@types/prop-types@15.7.12": {} + "@types/prop-types@15.7.13": {} - "@types/react-dom@18.3.0": + "@types/react-dom@18.3.1": dependencies: - "@types/react": 18.3.3 + "@types/react": 18.3.12 - "@types/react-transition-group@4.4.10": + "@types/react-transition-group@4.4.11": dependencies: - "@types/react": 18.3.3 + "@types/react": 18.3.12 - "@types/react@18.3.3": + "@types/react@18.3.12": dependencies: - "@types/prop-types": 15.7.12 + "@types/prop-types": 15.7.13 csstype: 3.1.3 - "@types/unist@2.0.10": {} + "@types/unist@2.0.11": {} - "@types/unist@3.0.2": {} + "@types/unist@3.0.3": {} "@ungap/structured-clone@1.2.0": {} - "@vitejs/plugin-legacy@5.4.1(terser@5.31.1)(vite@5.3.3(@types/node@20.14.10)(sass@1.77.6)(terser@5.31.1))": + "@vitejs/plugin-legacy@5.4.3(terser@5.36.0)(vite@5.4.11(@types/node@20.14.10)(sass@1.81.0)(terser@5.36.0))": dependencies: - "@babel/core": 7.24.7 - "@babel/preset-env": 7.24.7(@babel/core@7.24.7) - browserslist: 4.23.1 - browserslist-to-esbuild: 2.1.1(browserslist@4.23.1) - core-js: 3.37.1 - magic-string: 0.30.10 + "@babel/core": 7.26.0 + "@babel/preset-env": 7.26.0(@babel/core@7.26.0) + browserslist: 4.24.2 + browserslist-to-esbuild: 2.1.1(browserslist@4.24.2) + core-js: 3.39.0 + magic-string: 0.30.12 regenerator-runtime: 0.14.1 systemjs: 6.15.1 - terser: 5.31.1 - vite: 5.3.3(@types/node@20.14.10)(sass@1.77.6)(terser@5.31.1) + terser: 5.36.0 + vite: 5.4.11(@types/node@20.14.10)(sass@1.81.0)(terser@5.36.0) transitivePeerDependencies: - supports-color - "@vitejs/plugin-react@4.3.1(vite@5.3.3(@types/node@20.14.10)(sass@1.77.6)(terser@5.31.1))": + "@vitejs/plugin-react@4.3.3(vite@5.4.11(@types/node@20.14.10)(sass@1.81.0)(terser@5.36.0))": dependencies: - "@babel/core": 7.24.7 - "@babel/plugin-transform-react-jsx-self": 7.24.7(@babel/core@7.24.7) - "@babel/plugin-transform-react-jsx-source": 7.24.7(@babel/core@7.24.7) + "@babel/core": 7.26.0 + "@babel/plugin-transform-react-jsx-self": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-react-jsx-source": 7.25.9(@babel/core@7.26.0) "@types/babel__core": 7.20.5 react-refresh: 0.14.2 - vite: 5.3.3(@types/node@20.14.10)(sass@1.77.6)(terser@5.31.1) + vite: 5.4.11(@types/node@20.14.10)(sass@1.81.0)(terser@5.36.0) transitivePeerDependencies: - supports-color - acorn@8.12.1: {} + acorn@8.14.0: {} - adm-zip@0.5.14: {} + adm-zip@0.5.16: {} - agent-base@6.0.2: + agent-base@7.1.1: dependencies: - debug: 4.3.5 + debug: 4.3.7 transitivePeerDependencies: - supports-color - ahooks@3.8.0(react@18.3.1): + ahooks@3.8.1(react@18.3.1): dependencies: - "@babel/runtime": 7.24.7 - dayjs: 1.11.5 + "@babel/runtime": 7.26.0 + dayjs: 1.11.13 intersection-observer: 0.12.2 - js-cookie: 2.2.1 + js-cookie: 3.0.5 lodash: 4.17.21 react: 18.3.1 react-fast-compare: 3.2.2 resize-observer-polyfill: 1.5.1 screenfull: 5.2.0 - tslib: 2.6.3 + tslib: 2.8.1 - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 + ansi-regex@5.0.1: {} - anymatch@3.1.3: + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} argparse@2.0.1: {} asynckit@0.4.0: {} - axios@1.7.2: + axios@1.7.7: dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 + follow-redirects: 1.15.9 + form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug babel-plugin-macros@3.1.0: dependencies: - "@babel/runtime": 7.24.7 + "@babel/runtime": 7.26.0 cosmiconfig: 7.1.0 resolve: 1.22.8 - babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.7): + babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): dependencies: - "@babel/compat-data": 7.24.7 - "@babel/core": 7.24.7 - "@babel/helper-define-polyfill-provider": 0.6.2(@babel/core@7.24.7) + "@babel/compat-data": 7.26.2 + "@babel/core": 7.26.0 + "@babel/helper-define-polyfill-provider": 0.6.3(@babel/core@7.26.0) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.7): + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): dependencies: - "@babel/core": 7.24.7 - "@babel/helper-define-polyfill-provider": 0.6.2(@babel/core@7.24.7) - core-js-compat: 3.37.1 + "@babel/core": 7.26.0 + "@babel/helper-define-polyfill-provider": 0.6.3(@babel/core@7.26.0) + core-js-compat: 3.39.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.7): + babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.0): dependencies: - "@babel/core": 7.24.7 - "@babel/helper-define-polyfill-provider": 0.6.2(@babel/core@7.24.7) + "@babel/core": 7.26.0 + "@babel/helper-define-polyfill-provider": 0.6.3(@babel/core@7.26.0) transitivePeerDependencies: - supports-color bail@2.0.2: {} + balanced-match@1.0.2: {} + before-after-hook@2.2.3: {} - binary-extensions@2.3.0: {} + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 braces@3.0.3: dependencies: fill-range: 7.1.1 + optional: true - browserslist-to-esbuild@2.1.1(browserslist@4.23.1): + browserslist-to-esbuild@2.1.1(browserslist@4.24.2): dependencies: - browserslist: 4.23.1 + browserslist: 4.24.2 meow: 13.2.0 - browserslist@4.23.1: + browserslist@4.24.2: dependencies: - caniuse-lite: 1.0.30001640 - electron-to-chromium: 1.4.818 - node-releases: 2.0.14 - update-browserslist-db: 1.1.0(browserslist@4.23.1) + caniuse-lite: 1.0.30001680 + electron-to-chromium: 1.5.56 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.24.2) buffer-from@1.1.2: {} @@ -6319,16 +6606,10 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001640: {} + caniuse-lite@1.0.30001680: {} ccount@2.0.1: {} - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - character-entities-html4@2.1.0: {} character-entities-legacy@3.0.0: {} @@ -6337,29 +6618,29 @@ snapshots: character-reference-invalid@2.0.1: {} - chokidar@3.6.0: + chokidar@4.0.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.6.0 - optionalDependencies: - fsevents: 2.3.3 + readdirp: 4.0.2 - chownr@2.0.0: {} + chownr@3.0.0: {} + + cli-color@2.0.4: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-iterator: 2.0.3 + memoizee: 0.4.17 + timers-ext: 0.1.8 client-only@0.0.1: {} clsx@2.1.1: {} - color-convert@1.9.3: + color-convert@2.0.1: dependencies: - color-name: 1.1.3 + color-name: 1.1.4 - color-name@1.1.3: {} + color-name@1.1.4: {} combined-stream@1.0.8: dependencies: @@ -6375,11 +6656,11 @@ snapshots: convert-source-map@2.0.0: {} - core-js-compat@3.37.1: + core-js-compat@3.39.0: dependencies: - browserslist: 4.23.1 + browserslist: 4.24.2 - core-js@3.37.1: {} + core-js@3.39.0: {} cosmiconfig@7.1.0: dependencies: @@ -6389,20 +6670,20 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - cosmiconfig@8.3.6(typescript@5.5.3): + cosmiconfig@8.3.6(typescript@5.6.3): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.3 cross-env@7.0.3: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.5 - cross-spawn@7.0.3: + cross-spawn@7.0.5: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -6410,13 +6691,18 @@ snapshots: csstype@3.1.3: {} + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + data-uri-to-buffer@4.0.1: {} - dayjs@1.11.5: {} + dayjs@1.11.13: {} - debug@4.3.5: + debug@4.3.7: dependencies: - ms: 2.1.2 + ms: 2.1.3 decode-named-character-reference@1.0.2: dependencies: @@ -6428,25 +6714,30 @@ snapshots: dequal@2.0.3: {} + detect-libc@1.0.3: + optional: true + devlop@1.1.0: dependencies: dequal: 2.0.3 dom-helpers@5.2.1: dependencies: - "@babel/runtime": 7.24.7 + "@babel/runtime": 7.26.0 csstype: 3.1.3 dot-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.8.1 - electron-to-chromium@1.4.818: {} + eastasianwidth@0.2.0: {} - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 + electron-to-chromium@1.5.56: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} entities@4.5.0: {} @@ -6454,6 +6745,31 @@ snapshots: dependencies: is-arrayish: 0.2.1 + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + + es6-weak-map@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esbuild@0.21.5: optionalDependencies: "@esbuild/aix-ppc64": 0.21.5 @@ -6480,23 +6796,33 @@ snapshots: "@esbuild/win32-ia32": 0.21.5 "@esbuild/win32-x64": 0.21.5 - escalade@3.1.2: {} - - escape-string-regexp@1.0.5: {} + escalade@3.2.0: {} escape-string-regexp@4.0.0: {} + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + estree-util-is-identifier-name@3.0.0: {} estree-walker@2.0.2: {} esutils@2.0.3: {} - execa@4.1.0: + event-emitter@0.3.5: dependencies: - cross-spawn: 7.0.3 - get-stream: 5.2.0 - human-signals: 1.1.1 + d: 1.0.2 + es5-ext: 0.10.64 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.5 + 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 @@ -6504,6 +6830,10 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + ext@1.7.0: + dependencies: + type: 2.7.3 + extend@3.0.2: {} fetch-blob@3.2.0: @@ -6514,17 +6844,23 @@ snapshots: fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 + optional: true find-root@1.1.0: {} - find-up@4.1.0: + find-up@5.0.0: dependencies: - locate-path: 5.0.0 + locate-path: 6.0.0 path-exists: 4.0.0 - follow-redirects@1.15.6: {} + follow-redirects@1.15.9: {} - form-data@4.0.0: + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.5 + signal-exit: 4.1.0 + + form-data@4.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -6534,23 +6870,13 @@ snapshots: dependencies: fetch-blob: 3.2.0 - foxact@0.2.35(react@18.3.1): + foxact@0.2.41(react@18.3.1): dependencies: client-only: 0.0.1 server-only: 0.0.1 optionalDependencies: react: 18.3.1 - fs-extra@11.2.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - fsevents@2.3.3: optional: true @@ -6558,39 +6884,47 @@ snapshots: gensync@1.0.0-beta.2: {} - get-stream@5.2.0: - dependencies: - pump: 3.0.0 + get-stream@6.0.1: {} - glob-parent@5.1.2: + glob@10.4.5: dependencies: - is-glob: 4.0.3 + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@11.0.0: + dependencies: + foreground-child: 3.3.0 + jackspeak: 4.0.2 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 globals@11.12.0: {} - graceful-fs@4.2.11: {} - - has-flag@3.0.0: {} - hasown@2.0.2: dependencies: function-bind: 1.1.2 - hast-util-to-jsx-runtime@2.3.0: + hast-util-to-jsx-runtime@2.3.2: dependencies: - "@types/estree": 1.0.5 + "@types/estree": 1.0.6 "@types/hast": 3.0.4 - "@types/unist": 3.0.2 + "@types/unist": 3.0.3 comma-separated-tokens: 2.0.3 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.1.3 mdast-util-mdxjs-esm: 2.0.1 property-information: 6.5.0 space-separated-tokens: 2.0.2 - style-to-object: 1.0.6 + style-to-object: 1.0.8 unist-util-position: 5.0.0 vfile-message: 4.0.2 transitivePeerDependencies: @@ -6608,33 +6942,33 @@ snapshots: dependencies: void-elements: 3.1.0 - html-url-attributes@3.0.0: {} + html-url-attributes@3.0.1: {} - https-proxy-agent@5.0.1: + https-proxy-agent@7.0.5: dependencies: - agent-base: 6.0.2 - debug: 4.3.5 + agent-base: 7.1.1 + debug: 4.3.7 transitivePeerDependencies: - supports-color - human-signals@1.1.1: {} + human-signals@2.1.0: {} - husky@7.0.4: {} + husky@9.1.7: {} - i18next@23.11.5: + i18next@23.16.5: dependencies: - "@babel/runtime": 7.24.7 + "@babel/runtime": 7.26.0 - ignore@5.3.1: {} + ignore@5.3.2: {} - immutable@4.3.6: {} + immutable@5.0.2: {} import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - inline-style-parser@0.2.3: {} + inline-style-parser@0.2.4: {} intersection-observer@0.12.2: {} @@ -6647,37 +6981,48 @@ snapshots: is-arrayish@0.2.1: {} - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-core-module@2.14.0: + is-core-module@2.15.1: dependencies: hasown: 2.0.2 is-decimal@2.0.1: {} - is-extglob@2.1.1: {} + is-extglob@2.1.1: + optional: true + + is-fullwidth-code-point@3.0.0: {} is-glob@4.0.3: dependencies: is-extglob: 2.1.1 + optional: true is-hexadecimal@2.0.1: {} - is-number@7.0.0: {} + is-number@7.0.0: + optional: true is-plain-obj@4.1.0: {} - is-plain-object@5.0.0: {} + is-promise@2.2.2: {} is-stream@2.0.1: {} isexe@2.0.0: {} + jackspeak@3.4.3: + dependencies: + "@isaacs/cliui": 8.0.2 + optionalDependencies: + "@pkgjs/parseargs": 0.11.0 + + jackspeak@4.0.2: + dependencies: + "@isaacs/cliui": 8.0.2 + js-base64@3.7.7: {} - js-cookie@2.2.1: {} + js-cookie@3.0.5: {} js-tokens@4.0.0: {} @@ -6685,9 +7030,7 @@ snapshots: dependencies: argparse: 2.0.1 - jsesc@0.5.0: {} - - jsesc@2.5.2: {} + jsesc@3.0.2: {} json-parse-even-better-errors@2.3.1: {} @@ -6695,17 +7038,11 @@ snapshots: jsonc-parser@3.3.1: {} - jsonfile@6.1.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - lines-and-columns@1.2.4: {} - locate-path@5.0.0: + locate-path@6.0.0: dependencies: - p-locate: 4.1.0 + p-locate: 5.0.0 lodash-es@4.17.21: {} @@ -6721,24 +7058,28 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 + + lru-cache@10.4.3: {} + + lru-cache@11.0.2: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lru-cache@6.0.0: + lru-queue@0.1.0: dependencies: - yallist: 4.0.0 + es5-ext: 0.10.64 - magic-string@0.30.10: + magic-string@0.30.12: dependencies: - "@jridgewell/sourcemap-codec": 1.4.15 + "@jridgewell/sourcemap-codec": 1.5.0 - mdast-util-from-markdown@2.0.1: + mdast-util-from-markdown@2.0.2: dependencies: "@types/mdast": 4.0.4 - "@types/unist": 3.0.2 + "@types/unist": 3.0.3 decode-named-character-reference: 1.0.2 devlop: 1.1.0 mdast-util-to-string: 4.0.0 @@ -6752,30 +7093,29 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-mdx-expression@2.0.0: + mdast-util-mdx-expression@2.0.1: dependencies: "@types/estree-jsx": 1.0.5 "@types/hast": 3.0.4 "@types/mdast": 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-mdx-jsx@3.1.2: + mdast-util-mdx-jsx@3.1.3: dependencies: "@types/estree-jsx": 1.0.5 "@types/hast": 3.0.4 "@types/mdast": 4.0.4 - "@types/unist": 3.0.2 + "@types/unist": 3.0.3 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 parse-entities: 4.0.1 stringify-entities: 4.0.4 - unist-util-remove-position: 5.0.0 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 transitivePeerDependencies: @@ -6787,8 +7127,8 @@ snapshots: "@types/hast": 3.0.4 "@types/mdast": 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -6807,15 +7147,16 @@ snapshots: trim-lines: 3.0.1 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 - vfile: 6.0.1 + vfile: 6.0.3 - mdast-util-to-markdown@2.1.0: + mdast-util-to-markdown@2.1.2: dependencies: "@types/mdast": 4.0.4 - "@types/unist": 3.0.2 + "@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.0 micromark-util-decode-string: 2.0.0 unist-util-visit: 5.0.0 zwitch: 2.0.4 @@ -6824,11 +7165,22 @@ snapshots: dependencies: "@types/mdast": 4.0.4 + memoizee@0.4.17: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-weak-map: 2.0.3 + event-emitter: 0.3.5 + is-promise: 2.2.2 + lru-queue: 0.1.0 + next-tick: 1.1.0 + timers-ext: 0.1.8 + meow@13.2.0: {} merge-stream@2.0.0: {} - meta-json-schema@1.18.6: {} + meta-json-schema@1.18.10: {} micromark-core-commonmark@2.0.1: dependencies: @@ -6944,7 +7296,7 @@ snapshots: micromark@4.0.0: dependencies: "@types/debug": 4.1.12 - debug: 4.3.5 + debug: 4.3.7 decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -6963,6 +7315,12 @@ snapshots: transitivePeerDependencies: - supports-color + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + optional: true + mime-db@1.52.0: {} mime-types@2.1.35: @@ -6971,81 +7329,83 @@ snapshots: mimic-fn@2.1.0: {} - minipass@3.3.6: + minimatch@10.0.1: dependencies: - yallist: 4.0.0 + brace-expansion: 2.0.1 - minipass@5.0.0: {} - - minizlib@2.1.2: + minimatch@9.0.5: dependencies: - minipass: 3.3.6 - yallist: 4.0.0 + brace-expansion: 2.0.1 - mkdirp@1.0.4: {} + minipass@7.1.2: {} - monaco-editor@0.49.0: {} + minizlib@3.0.1: + dependencies: + minipass: 7.1.2 + rimraf: 5.0.10 - monaco-languageserver-types@0.3.4: + mkdirp@3.0.1: {} + + monaco-editor@0.52.0: {} + + monaco-languageserver-types@0.4.0: dependencies: monaco-types: 0.1.0 vscode-languageserver-protocol: 3.17.5 vscode-uri: 3.0.8 - monaco-marker-data-provider@1.2.3: + monaco-marker-data-provider@1.2.4: dependencies: monaco-types: 0.1.0 monaco-types@0.1.0: {} - monaco-worker-manager@2.0.1(monaco-editor@0.49.0): + monaco-worker-manager@2.0.1(monaco-editor@0.52.0): dependencies: - monaco-editor: 0.49.0 + monaco-editor: 0.52.0 - monaco-yaml@5.2.0(monaco-editor@0.49.0): + monaco-yaml@5.2.3(monaco-editor@0.52.0): dependencies: - "@types/json-schema": 7.0.15 jsonc-parser: 3.3.1 - monaco-editor: 0.49.0 - monaco-languageserver-types: 0.3.4 - monaco-marker-data-provider: 1.2.3 + monaco-editor: 0.52.0 + monaco-languageserver-types: 0.4.0 + monaco-marker-data-provider: 1.2.4 monaco-types: 0.1.0 - monaco-worker-manager: 2.0.1(monaco-editor@0.49.0) + monaco-worker-manager: 2.0.1(monaco-editor@0.52.0) path-browserify: 1.0.1 prettier: 2.8.8 - vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-textdocument: 1.0.12 vscode-languageserver-types: 3.17.5 vscode-uri: 3.0.8 - yaml: 2.4.5 + yaml: 2.6.0 mri@1.2.0: {} - ms@2.1.2: {} + ms@2.1.3: {} nanoid@3.3.7: {} - nanoid@5.0.7: {} + nanoid@5.0.8: {} + + next-tick@1.1.0: {} no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.6.3 + tslib: 2.8.1 + + node-addon-api@7.1.1: + optional: true node-domexception@1.0.0: {} - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - node-fetch@3.3.2: dependencies: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-releases@2.0.14: {} - - normalize-path@3.0.0: {} + node-releases@2.0.18: {} npm-run-path@4.0.1: dependencies: @@ -7061,15 +7421,15 @@ snapshots: dependencies: mimic-fn: 2.1.0 - p-limit@2.3.0: + p-limit@3.1.0: dependencies: - p-try: 2.2.0 + yocto-queue: 0.1.0 - p-locate@4.1.0: + p-locate@5.0.0: dependencies: - p-limit: 2.3.0 + p-limit: 3.1.0 - p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} parent-module@1.0.1: dependencies: @@ -7077,7 +7437,7 @@ snapshots: parse-entities@4.0.1: dependencies: - "@types/unist": 2.0.10 + "@types/unist": 2.0.11 character-entities: 2.0.2 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 @@ -7088,7 +7448,7 @@ snapshots: parse-json@5.2.0: dependencies: - "@babel/code-frame": 7.24.7 + "@babel/code-frame": 7.26.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -7101,38 +7461,53 @@ snapshots: path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.2 + minipass: 7.1.2 + path-type@4.0.0: {} - peggy@4.0.3: + peggy@4.1.1: dependencies: - "@peggyjs/from-mem": 1.3.0 + "@peggyjs/from-mem": 1.3.4 commander: 12.1.0 source-map-generator: 0.8.0 - picocolors@1.0.1: {} + picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@2.3.1: + optional: true picomatch@3.0.1: {} - postcss@8.4.39: + picomatch@4.0.2: {} + + postcss@8.4.49: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.1 + source-map-js: 1.2.1 prettier@2.8.8: {} - pretty-quick@3.3.1(prettier@2.8.8): + prettier@3.3.3: {} + + pretty-quick@4.0.0(prettier@3.3.3): dependencies: - execa: 4.1.0 - find-up: 4.1.0 - ignore: 5.3.1 + execa: 5.1.1 + find-up: 5.0.0 + ignore: 5.3.2 mri: 1.2.0 - picocolors: 1.0.1 + picocolors: 1.1.1 picomatch: 3.0.1 - prettier: 2.8.8 - tslib: 2.6.3 + prettier: 3.3.3 + tslib: 2.8.1 prop-types@15.8.1: dependencies: @@ -7144,33 +7519,28 @@ snapshots: proxy-from-env@1.1.0: {} - pump@3.0.0: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 react: 18.3.1 scheduler: 0.23.2 - react-error-boundary@3.1.4(react@18.3.1): + react-error-boundary@4.1.2(react@18.3.1): dependencies: - "@babel/runtime": 7.24.7 + "@babel/runtime": 7.26.0 react: 18.3.1 react-fast-compare@3.2.2: {} - react-hook-form@7.52.1(react@18.3.1): + react-hook-form@7.53.2(react@18.3.1): dependencies: react: 18.3.1 - react-i18next@13.5.0(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-i18next@15.1.1(i18next@23.16.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - "@babel/runtime": 7.24.7 + "@babel/runtime": 7.26.0 html-parse-stringify: 3.0.1 - i18next: 23.11.5 + i18next: 23.16.5 react: 18.3.1 optionalDependencies: react-dom: 18.3.1(react@18.3.1) @@ -7179,54 +7549,54 @@ snapshots: react-is@18.3.1: {} - react-markdown@9.0.1(@types/react@18.3.3)(react@18.3.1): + react-markdown@9.0.1(@types/react@18.3.12)(react@18.3.1): dependencies: "@types/hast": 3.0.4 - "@types/react": 18.3.3 + "@types/react": 18.3.12 devlop: 1.1.0 - hast-util-to-jsx-runtime: 2.3.0 - html-url-attributes: 3.0.0 + hast-util-to-jsx-runtime: 2.3.2 + html-url-attributes: 3.0.1 mdast-util-to-hast: 13.2.0 react: 18.3.1 remark-parse: 11.0.0 - remark-rehype: 11.1.0 + remark-rehype: 11.1.1 unified: 11.0.5 unist-util-visit: 5.0.0 - vfile: 6.0.1 + vfile: 6.0.3 transitivePeerDependencies: - supports-color - react-monaco-editor@0.55.0(@types/react@18.3.3)(monaco-editor@0.49.0)(react@18.3.1): + react-monaco-editor@0.56.2(@types/react@18.3.12)(monaco-editor@0.52.0)(react@18.3.1): dependencies: - "@types/react": 18.3.3 - monaco-editor: 0.49.0 + "@types/react": 18.3.12 + monaco-editor: 0.52.0 prop-types: 15.8.1 react: 18.3.1 react-refresh@0.14.2: {} - react-router-dom@6.24.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router-dom@6.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - "@remix-run/router": 1.17.1 + "@remix-run/router": 1.21.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-router: 6.24.1(react@18.3.1) + react-router: 6.28.0(react@18.3.1) - react-router@6.24.1(react@18.3.1): + react-router@6.28.0(react@18.3.1): dependencies: - "@remix-run/router": 1.17.1 + "@remix-run/router": 1.21.0 react: 18.3.1 react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - "@babel/runtime": 7.24.7 + "@babel/runtime": 7.26.0 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-virtuoso@4.7.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-virtuoso@4.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -7235,11 +7605,9 @@ snapshots: dependencies: loose-envify: 1.4.0 - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 + readdirp@4.0.2: {} - regenerate-unicode-properties@10.1.1: + regenerate-unicode-properties@10.2.0: dependencies: regenerate: 1.4.2 @@ -7249,39 +7617,41 @@ snapshots: regenerator-transform@0.15.2: dependencies: - "@babel/runtime": 7.24.7 + "@babel/runtime": 7.26.0 - regexpu-core@5.3.2: + regexpu-core@6.1.1: dependencies: - "@babel/regjsgen": 0.8.0 regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.1 - regjsparser: 0.9.1 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.11.2 unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 + unicode-match-property-value-ecmascript: 2.2.0 - regjsparser@0.9.1: + regjsgen@0.8.0: {} + + regjsparser@0.11.2: dependencies: - jsesc: 0.5.0 + jsesc: 3.0.2 remark-parse@11.0.0: dependencies: "@types/mdast": 4.0.4 - mdast-util-from-markdown: 2.0.1 + mdast-util-from-markdown: 2.0.2 micromark-util-types: 2.0.0 unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-rehype@11.1.0: + remark-rehype@11.1.1: dependencies: "@types/hast": 3.0.4 "@types/mdast": 4.0.4 mdast-util-to-hast: 13.2.0 unified: 11.0.5 - vfile: 6.0.1 + vfile: 6.0.3 - reselect@4.1.8: {} + reselect@5.1.1: {} resize-observer-polyfill@1.5.1: {} @@ -7289,37 +7659,45 @@ snapshots: resolve@1.22.8: dependencies: - is-core-module: 2.14.0 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - rollup@4.18.0: + rimraf@5.0.10: dependencies: - "@types/estree": 1.0.5 + glob: 10.4.5 + + rollup@4.25.0: + dependencies: + "@types/estree": 1.0.6 optionalDependencies: - "@rollup/rollup-android-arm-eabi": 4.18.0 - "@rollup/rollup-android-arm64": 4.18.0 - "@rollup/rollup-darwin-arm64": 4.18.0 - "@rollup/rollup-darwin-x64": 4.18.0 - "@rollup/rollup-linux-arm-gnueabihf": 4.18.0 - "@rollup/rollup-linux-arm-musleabihf": 4.18.0 - "@rollup/rollup-linux-arm64-gnu": 4.18.0 - "@rollup/rollup-linux-arm64-musl": 4.18.0 - "@rollup/rollup-linux-powerpc64le-gnu": 4.18.0 - "@rollup/rollup-linux-riscv64-gnu": 4.18.0 - "@rollup/rollup-linux-s390x-gnu": 4.18.0 - "@rollup/rollup-linux-x64-gnu": 4.18.0 - "@rollup/rollup-linux-x64-musl": 4.18.0 - "@rollup/rollup-win32-arm64-msvc": 4.18.0 - "@rollup/rollup-win32-ia32-msvc": 4.18.0 - "@rollup/rollup-win32-x64-msvc": 4.18.0 + "@rollup/rollup-android-arm-eabi": 4.25.0 + "@rollup/rollup-android-arm64": 4.25.0 + "@rollup/rollup-darwin-arm64": 4.25.0 + "@rollup/rollup-darwin-x64": 4.25.0 + "@rollup/rollup-freebsd-arm64": 4.25.0 + "@rollup/rollup-freebsd-x64": 4.25.0 + "@rollup/rollup-linux-arm-gnueabihf": 4.25.0 + "@rollup/rollup-linux-arm-musleabihf": 4.25.0 + "@rollup/rollup-linux-arm64-gnu": 4.25.0 + "@rollup/rollup-linux-arm64-musl": 4.25.0 + "@rollup/rollup-linux-powerpc64le-gnu": 4.25.0 + "@rollup/rollup-linux-riscv64-gnu": 4.25.0 + "@rollup/rollup-linux-s390x-gnu": 4.25.0 + "@rollup/rollup-linux-x64-gnu": 4.25.0 + "@rollup/rollup-linux-x64-musl": 4.25.0 + "@rollup/rollup-win32-arm64-msvc": 4.25.0 + "@rollup/rollup-win32-ia32-msvc": 4.25.0 + "@rollup/rollup-win32-x64-msvc": 4.25.0 fsevents: 2.3.3 - sass@1.77.6: + sass@1.81.0: dependencies: - chokidar: 3.6.0 - immutable: 4.3.6 - source-map-js: 1.2.0 + chokidar: 4.0.1 + immutable: 5.0.2 + source-map-js: 1.2.1 + optionalDependencies: + "@parcel/watcher": 2.5.0 scheduler@0.23.2: dependencies: @@ -7329,9 +7707,7 @@ snapshots: semver@6.3.1: {} - semver@7.6.0: - dependencies: - lru-cache: 6.0.0 + semver@7.6.3: {} server-only@0.0.1: {} @@ -7343,16 +7719,18 @@ snapshots: signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + snake-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.8.1 sockette@2.0.6: {} source-map-generator@0.8.0: {} - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} source-map-support@0.5.21: dependencies: @@ -7365,23 +7743,39 @@ snapshots: space-separated-tokens@2.0.2: {} + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + strip-final-newline@2.0.0: {} - style-to-object@1.0.6: + style-to-object@1.0.8: dependencies: - inline-style-parser: 0.2.3 + inline-style-parser: 0.2.4 stylis@4.2.0: {} - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - supports-preserve-symlinks-flag@1.0.0: {} svg-parser@2.0.4: {} @@ -7394,106 +7788,104 @@ snapshots: systemjs@6.15.1: {} - tar@6.2.1: + tar@7.4.3: 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 + "@isaacs/fs-minipass": 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.1 + mkdirp: 3.0.1 + yallist: 5.0.0 - terser@5.31.1: + terser@5.36.0: dependencies: "@jridgewell/source-map": 0.3.6 - acorn: 8.12.1 + acorn: 8.14.0 commander: 2.20.3 source-map-support: 0.5.21 - to-fast-properties@2.0.0: {} + timers-ext@0.1.8: + dependencies: + es5-ext: 0.10.64 + next-tick: 1.1.0 to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - - tr46@0.0.3: {} + optional: true trim-lines@3.0.1: {} trough@2.2.0: {} - tslib@2.6.3: {} + tslib@2.8.1: {} tunnel@0.0.6: {} - types-pac@1.0.2: {} + type@2.7.3: {} - typescript@5.5.3: {} + types-pac@1.0.3: {} - undici-types@5.26.5: {} + typescript@5.6.3: {} + + undici-types@5.26.5: + optional: true undici@5.28.4: dependencies: "@fastify/busboy": 2.1.1 - unicode-canonical-property-names-ecmascript@2.0.0: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-canonical-property-names-ecmascript: 2.0.1 unicode-property-aliases-ecmascript: 2.1.0 - unicode-match-property-value-ecmascript@2.1.0: {} + unicode-match-property-value-ecmascript@2.2.0: {} unicode-property-aliases-ecmascript@2.1.0: {} unified@11.0.5: dependencies: - "@types/unist": 3.0.2 + "@types/unist": 3.0.3 bail: 2.0.2 devlop: 1.1.0 extend: 3.0.2 is-plain-obj: 4.1.0 trough: 2.2.0 - vfile: 6.0.1 + vfile: 6.0.3 unist-util-is@6.0.0: dependencies: - "@types/unist": 3.0.2 + "@types/unist": 3.0.3 unist-util-position@5.0.0: dependencies: - "@types/unist": 3.0.2 - - unist-util-remove-position@5.0.0: - dependencies: - "@types/unist": 3.0.2 - unist-util-visit: 5.0.0 + "@types/unist": 3.0.3 unist-util-stringify-position@4.0.0: dependencies: - "@types/unist": 3.0.2 + "@types/unist": 3.0.3 unist-util-visit-parents@6.0.1: dependencies: - "@types/unist": 3.0.2 + "@types/unist": 3.0.3 unist-util-is: 6.0.0 unist-util-visit@5.0.0: dependencies: - "@types/unist": 3.0.2 + "@types/unist": 3.0.3 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 universal-user-agent@6.0.1: {} - universalify@2.0.1: {} - - update-browserslist-db@1.1.0(browserslist@4.23.1): + update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: - browserslist: 4.23.1 - escalade: 3.1.2 - picocolors: 1.0.1 + browserslist: 4.24.2 + escalade: 3.2.0 + picocolors: 1.1.1 use-sync-external-store@1.2.2(react@18.3.1): dependencies: @@ -7501,40 +7893,39 @@ snapshots: vfile-message@4.0.2: dependencies: - "@types/unist": 3.0.2 + "@types/unist": 3.0.3 unist-util-stringify-position: 4.0.0 - vfile@6.0.1: + vfile@6.0.3: dependencies: - "@types/unist": 3.0.2 - unist-util-stringify-position: 4.0.0 + "@types/unist": 3.0.3 vfile-message: 4.0.2 - vite-plugin-monaco-editor@1.1.0(monaco-editor@0.49.0): + vite-plugin-monaco-editor@1.1.0(monaco-editor@0.52.0): dependencies: - monaco-editor: 0.49.0 + monaco-editor: 0.52.0 - vite-plugin-svgr@4.2.0(rollup@4.18.0)(typescript@5.5.3)(vite@5.3.3(@types/node@20.14.10)(sass@1.77.6)(terser@5.31.1)): + vite-plugin-svgr@4.3.0(rollup@4.25.0)(typescript@5.6.3)(vite@5.4.11(@types/node@20.14.10)(sass@1.81.0)(terser@5.36.0)): dependencies: - "@rollup/pluginutils": 5.1.0(rollup@4.18.0) - "@svgr/core": 8.1.0(typescript@5.5.3) - "@svgr/plugin-jsx": 8.1.0(@svgr/core@8.1.0(typescript@5.5.3)) - vite: 5.3.3(@types/node@20.14.10)(sass@1.77.6)(terser@5.31.1) + "@rollup/pluginutils": 5.1.3(rollup@4.25.0) + "@svgr/core": 8.1.0(typescript@5.6.3) + "@svgr/plugin-jsx": 8.1.0(@svgr/core@8.1.0(typescript@5.6.3)) + vite: 5.4.11(@types/node@20.14.10)(sass@1.81.0)(terser@5.36.0) transitivePeerDependencies: - rollup - supports-color - typescript - vite@5.3.3(@types/node@20.14.10)(sass@1.77.6)(terser@5.31.1): + vite@5.4.11(@types/node@20.14.10)(sass@1.81.0)(terser@5.36.0): dependencies: esbuild: 0.21.5 - postcss: 8.4.39 - rollup: 4.18.0 + postcss: 8.4.49 + rollup: 4.25.0 optionalDependencies: "@types/node": 20.14.10 fsevents: 2.3.3 - sass: 1.77.6 - terser: 5.31.1 + sass: 1.81.0 + terser: 5.36.0 void-elements@3.1.0: {} @@ -7545,7 +7936,7 @@ snapshots: vscode-jsonrpc: 8.2.0 vscode-languageserver-types: 3.17.5 - vscode-languageserver-textdocument@1.0.11: {} + vscode-languageserver-textdocument@1.0.12: {} vscode-languageserver-types@3.17.5: {} @@ -7553,25 +7944,38 @@ snapshots: web-streams-polyfill@3.3.3: {} - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - which@2.0.2: dependencies: isexe: 2.0.0 + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} yallist@3.1.1: {} - yallist@4.0.0: {} + yallist@5.0.0: {} yaml@1.10.2: {} - yaml@2.4.5: {} + yaml@2.6.0: {} + + yocto-queue@0.1.0: {} + + zustand@5.0.1(@types/react@18.3.12)(react@18.3.1)(use-sync-external-store@1.2.2(react@18.3.1)): + optionalDependencies: + "@types/react": 18.3.12 + react: 18.3.1 + use-sync-external-store: 1.2.2(react@18.3.1) zwitch@2.0.4: {} diff --git a/scripts/check.mjs b/scripts/check.mjs index 19e2ac64..56ec2492 100644 --- a/scripts/check.mjs +++ b/scripts/check.mjs @@ -1,11 +1,14 @@ -import fs from "fs-extra"; +import fs from "fs"; +import fsp from "fs/promises"; import zlib from "zlib"; -import tar from "tar"; +import { extract } from "tar"; import path from "path"; import AdmZip from "adm-zip"; import fetch from "node-fetch"; import proxyAgent from "https-proxy-agent"; import { execSync } from "child_process"; +import { log_info, log_debug, log_error, log_success } from "./utils.mjs"; +import { glob } from "glob"; const cwd = process.cwd(); const TEMP_DIR = path.join(cwd, "node_modules/.verge"); @@ -91,9 +94,9 @@ async function getLatestAlphaVersion() { }); let v = await response.text(); META_ALPHA_VERSION = v.trim(); // Trim to remove extra whitespaces - console.log(`Latest alpha version: ${META_ALPHA_VERSION}`); + log_info(`Latest alpha version: ${META_ALPHA_VERSION}`); } catch (error) { - console.error("Error fetching latest alpha version:", error.message); + log_error("Error fetching latest alpha version:", error.message); process.exit(1); } } @@ -138,9 +141,9 @@ async function getLatestReleaseVersion() { }); let v = await response.text(); META_VERSION = v.trim(); // Trim to remove extra whitespaces - console.log(`Latest release version: ${META_VERSION}`); + log_info(`Latest release version: ${META_VERSION}`); } catch (error) { - console.error("Error fetching latest release version:", error.message); + log_error("Error fetching latest release version:", error.message); process.exit(1); } } @@ -150,13 +153,13 @@ async function getLatestReleaseVersion() { */ if (!META_MAP[`${platform}-${arch}`]) { throw new Error( - `clash meta alpha unsupported platform "${platform}-${arch}"` + `clash meta alpha unsupported platform "${platform}-${arch}"`, ); } if (!META_ALPHA_MAP[`${platform}-${arch}`]) { throw new Error( - `clash meta alpha unsupported platform "${platform}-${arch}"` + `clash meta alpha unsupported platform "${platform}-${arch}"`, ); } @@ -205,44 +208,44 @@ async function resolveSidecar(binInfo) { const sidecarDir = path.join(cwd, "src-tauri", "sidecar"); const sidecarPath = path.join(sidecarDir, targetFile); - await fs.mkdirp(sidecarDir); - if (!FORCE && (await fs.pathExists(sidecarPath))) return; + await fsp.mkdir(sidecarDir, { recursive: true }); + if (!FORCE && fs.existsSync(sidecarPath)) return; const tempDir = path.join(TEMP_DIR, name); const tempZip = path.join(tempDir, zipFile); const tempExe = path.join(tempDir, exeFile); - await fs.mkdirp(tempDir); + await fsp.mkdir(tempDir, { recursive: true }); try { - if (!(await fs.pathExists(tempZip))) { + if (!fs.existsSync(tempZip)) { await downloadFile(downloadURL, tempZip); } if (zipFile.endsWith(".zip")) { const zip = new AdmZip(tempZip); zip.getEntries().forEach((entry) => { - console.log(`[DEBUG]: "${name}" entry name`, entry.entryName); + log_debug(`"${name}" entry name`, entry.entryName); }); zip.extractAllTo(tempDir, true); - await fs.rename(tempExe, sidecarPath); - console.log(`[INFO]: "${name}" unzip finished`); + await fsp.rename(tempExe, sidecarPath); + log_success(`unzip finished: "${name}"`); } else if (zipFile.endsWith(".tgz")) { // tgz - await fs.mkdirp(tempDir); - await tar.extract({ + await fsp.mkdir(tempDir, { recursive: true }); + await extract({ cwd: tempDir, file: tempZip, //strip: 1, // 可能需要根据实际的 .tgz 文件结构调整 }); - const files = await fs.readdir(tempDir); - console.log(`[DEBUG]: "${name}" files in tempDir:`, files); + const files = await fsp.readdir(tempDir); + log_debug(`"${name}" files in tempDir:`, files); const extractedFile = files.find((file) => file.startsWith("虚空终端-")); if (extractedFile) { const extractedFilePath = path.join(tempDir, extractedFile); - await fs.rename(extractedFilePath, sidecarPath); - console.log(`[INFO]: "${name}" file renamed to "${sidecarPath}"`); + await fsp.rename(extractedFilePath, sidecarPath); + log_success(`"${name}" file renamed to "${sidecarPath}"`); execSync(`chmod 755 ${sidecarPath}`); - console.log(`[INFO]: "${name}" chmod binary finished`); + log_success(`chmod binary finished: "${name}"`); } else { throw new Error(`Expected file not found in ${tempDir}`); } @@ -252,16 +255,15 @@ async function resolveSidecar(binInfo) { const writeStream = fs.createWriteStream(sidecarPath); await new Promise((resolve, reject) => { const onError = (error) => { - console.error(`[ERROR]: "${name}" gz failed:`, error.message); + log_error(`"${name}" gz failed:`, error.message); reject(error); }; readStream .pipe(zlib.createGunzip().on("error", onError)) .pipe(writeStream) .on("finish", () => { - console.log(`[INFO]: "${name}" gunzip finished`); execSync(`chmod 755 ${sidecarPath}`); - console.log(`[INFO]: "${name}" chmod binary finished`); + log_success(`chmod binary finished: "${name}"`); resolve(); }) .on("error", onError); @@ -269,35 +271,58 @@ async function resolveSidecar(binInfo) { } } catch (err) { // 需要删除文件 - await fs.remove(sidecarPath); + await fsp.rm(sidecarPath, { recursive: true, force: true }); throw err; } finally { // delete temp dir - await fs.remove(tempDir); + await fsp.rm(tempDir, { recursive: true, force: true }); } } +const resolveSetDnsScript = () => + resolveResource({ + file: "set_dns.sh", + localPath: path.join(cwd, "scripts/set_dns.sh"), + }); +const resolveUnSetDnsScript = () => + resolveResource({ + file: "unset_dns.sh", + localPath: path.join(cwd, "scripts/unset_dns.sh"), + }); + /** * download the file to the resources dir */ async function resolveResource(binInfo) { - const { file, downloadURL } = binInfo; + const { file, downloadURL, localPath } = binInfo; const resDir = path.join(cwd, "src-tauri/resources"); const targetPath = path.join(resDir, file); - if (!FORCE && (await fs.pathExists(targetPath))) return; + if (!FORCE && fs.existsSync(targetPath)) return; - await fs.mkdirp(resDir); - await downloadFile(downloadURL, targetPath); + if (downloadURL) { + await fsp.mkdir(resDir, { recursive: true }); + await downloadFile(downloadURL, targetPath); + } - console.log(`[INFO]: ${file} finished`); + if (localPath) { + await fs.copyFile(localPath, targetPath, (err) => { + if (err) { + console.error("Error copying file:", err); + } else { + console.log("File was copied successfully"); + } + }); + log_debug(`copy file finished: "${localPath}"`); + } + + log_success(`${file} finished`); } /** * download file and save to `path` - */ -async function downloadFile(url, path) { + */ async function downloadFile(url, path) { const options = {}; const httpProxy = @@ -316,9 +341,9 @@ async function downloadFile(url, path) { headers: { "Content-Type": "application/octet-stream" }, }); const buffer = await response.arrayBuffer(); - await fs.writeFile(path, new Uint8Array(buffer)); + await fsp.writeFile(path, new Uint8Array(buffer)); - console.log(`[INFO]: download finished "${url}"`); + log_success(`download finished: ${url}`); } // SimpleSC.dll @@ -329,43 +354,46 @@ const resolvePlugin = async () => { const tempDir = path.join(TEMP_DIR, "SimpleSC"); const tempZip = path.join( tempDir, - "NSIS_Simple_Service_Plugin_Unicode_1.30.zip" + "NSIS_Simple_Service_Plugin_Unicode_1.30.zip", ); const tempDll = path.join(tempDir, "SimpleSC.dll"); const pluginDir = path.join(process.env.APPDATA, "Local/NSIS"); const pluginPath = path.join(pluginDir, "SimpleSC.dll"); - await fs.mkdirp(pluginDir); - await fs.mkdirp(tempDir); - if (!FORCE && (await fs.pathExists(pluginPath))) return; + await fsp.mkdir(pluginDir, { recursive: true }); + await fsp.mkdir(tempDir, { recursive: true }); + if (!FORCE && fs.existsSync(pluginPath)) return; try { - if (!(await fs.pathExists(tempZip))) { + if (!fs.existsSync(tempZip)) { await downloadFile(url, tempZip); } const zip = new AdmZip(tempZip); zip.getEntries().forEach((entry) => { - console.log(`[DEBUG]: "SimpleSC" entry name`, entry.entryName); + log_debug(`"SimpleSC" entry name`, entry.entryName); }); zip.extractAllTo(tempDir, true); - await fs.copyFile(tempDll, pluginPath); - console.log(`[INFO]: "SimpleSC" unzip finished`); + await fsp.cp(tempDll, pluginPath, { recursive: true, force: true }); + log_success(`unzip finished: "SimpleSC"`); } finally { - await fs.remove(tempDir); + await fsp.rm(tempDir, { recursive: true, force: true }); } }; // service chmod const resolveServicePermission = async () => { const serviceExecutables = [ - "clash-verge-service", - "install-service", - "uninstall-service", + "clash-verge-service*", + "install-service*", + "uninstall-service*", ]; const resDir = path.join(cwd, "src-tauri/resources"); for (let f of serviceExecutables) { - const targetPath = path.join(resDir, f); - if (await fs.pathExists(targetPath)) { - execSync(`chmod 755 ${targetPath}`); - console.log(`[INFO]: "${targetPath}" chmod finished`); + // 使用glob模块来处理通配符 + const files = glob.sync(path.join(resDir, f)); + for (let filePath of files) { + if (fs.existsSync(filePath)) { + execSync(`chmod 755 ${filePath}`); + log_success(`chmod finished: "${filePath}"`); + } } } }; @@ -373,29 +401,32 @@ const resolveServicePermission = async () => { /** * main */ - const SERVICE_URL = `https://github.com/clash-verge-rev/clash-verge-service/releases/download/${SIDECAR_HOST}`; const resolveService = () => { let ext = platform === "win32" ? ".exe" : ""; + let suffix = platform === "linux" ? "-" + SIDECAR_HOST : ""; resolveResource({ - file: "clash-verge-service" + ext, + file: "clash-verge-service" + suffix + ext, downloadURL: `${SERVICE_URL}/clash-verge-service${ext}`, }); }; const resolveInstall = () => { let ext = platform === "win32" ? ".exe" : ""; + let suffix = platform === "linux" ? "-" + SIDECAR_HOST : ""; resolveResource({ - file: "install-service" + ext, + file: "install-service" + suffix + ext, downloadURL: `${SERVICE_URL}/install-service${ext}`, }); }; const resolveUninstall = () => { let ext = platform === "win32" ? ".exe" : ""; + let suffix = platform === "linux" ? "-" + SIDECAR_HOST : ""; + resolveResource({ - file: "uninstall-service" + ext, + file: "uninstall-service" + suffix + ext, downloadURL: `${SERVICE_URL}/uninstall-service${ext}`, }); }; @@ -421,6 +452,12 @@ const resolveEnableLoopback = () => downloadURL: `https://github.com/Kuingsmile/uwp-tool/releases/download/latest/enableLoopback.exe`, }); +const resolveWinSysproxy = () => + resolveResource({ + file: "sysproxy.exe", + downloadURL: `https://github.com/clash-verge-rev/sysproxy/releases/download/${arch}/sysproxy.exe`, + }); + const tasks = [ // { name: "clash", func: resolveClash, retry: 5 }, { @@ -454,6 +491,24 @@ const tasks = [ retry: 1, unixOnly: true, }, + { + name: "windows-sysproxy", + func: resolveWinSysproxy, + retry: 5, + winOnly: true, + }, + { + name: "set_dns_script", + func: resolveSetDnsScript, + retry: 5, + macosOnly: true, + }, + { + name: "unset_dns_script", + func: resolveUnSetDnsScript, + retry: 5, + macosOnly: true, + }, ]; async function runTask() { @@ -462,13 +517,14 @@ async function runTask() { if (task.winOnly && platform !== "win32") return runTask(); if (task.linuxOnly && platform !== "linux") return runTask(); if (task.unixOnly && platform === "win32") return runTask(); + if (task.macosOnly && platform !== "darwin") return runTask(); for (let i = 0; i < task.retry; i++) { try { await task.func(); break; } catch (err) { - console.error(`[ERROR]: task::${task.name} try ${i} ==`, err.message); + log_error(`task::${task.name} try ${i} ==`, err.message); if (i === task.retry - 1) throw err; } } diff --git a/scripts/portable-fixed-webview2.mjs b/scripts/portable-fixed-webview2.mjs index 94285ce7..b3424fb5 100644 --- a/scripts/portable-fixed-webview2.mjs +++ b/scripts/portable-fixed-webview2.mjs @@ -1,4 +1,5 @@ -import fs from "fs-extra"; +import fs from "fs"; +import fsp from "fs/promises"; import path from "path"; import AdmZip from "adm-zip"; import { createRequire } from "module"; @@ -30,12 +31,14 @@ async function resolvePortable() { const configDir = path.join(releaseDir, ".config"); - if (!(await fs.pathExists(releaseDir))) { + if (!fs.existsSync(releaseDir)) { throw new Error("could not found the release dir"); } - await fs.mkdir(configDir); - await fs.createFile(path.join(configDir, "PORTABLE")); + await fsp.mkdir(configDir, { recursive: true }); + if (!fs.existsSync(path.join(configDir, "PORTABLE"))) { + await fsp.writeFile(path.join(configDir, "PORTABLE"), ""); + } const zip = new AdmZip(); @@ -46,9 +49,9 @@ async function resolvePortable() { zip.addLocalFolder( path.join( releaseDir, - `Microsoft.WebView2.FixedVersionRuntime.109.0.1518.78.${arch}` + `Microsoft.WebView2.FixedVersionRuntime.109.0.1518.78.${arch}`, ), - `Microsoft.WebView2.FixedVersionRuntime.109.0.1518.78.${arch}` + `Microsoft.WebView2.FixedVersionRuntime.109.0.1518.78.${arch}`, ); zip.addLocalFolder(configDir, ".config"); diff --git a/scripts/portable.mjs b/scripts/portable.mjs index 1a9d1258..97a00d4a 100644 --- a/scripts/portable.mjs +++ b/scripts/portable.mjs @@ -1,4 +1,4 @@ -import fs from "fs-extra"; +import fs from "fs"; import path from "path"; import AdmZip from "adm-zip"; import { createRequire } from "module"; @@ -29,12 +29,14 @@ async function resolvePortable() { : `./src-tauri/target/release`; const configDir = path.join(releaseDir, ".config"); - if (!(await fs.pathExists(releaseDir))) { + if (!fs.existsSync(releaseDir)) { throw new Error("could not found the release dir"); } - await fs.mkdir(configDir); - await fs.createFile(path.join(configDir, "PORTABLE")); + await fsp.mkdir(configDir, { recursive: true }); + if (!fs.existsSync(path.join(configDir, "PORTABLE"))) { + await fsp.writeFile(path.join(configDir, "PORTABLE"), ""); + } const zip = new AdmZip(); diff --git a/scripts/set_dns.sh b/scripts/set_dns.sh new file mode 100644 index 00000000..300e9085 --- /dev/null +++ b/scripts/set_dns.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +# 验证IPv4地址格式 +function is_valid_ipv4() { + local ip=$1 + local IFS='.' + local -a octets + + [[ ! $ip =~ ^([0-9]+\.){3}[0-9]+$ ]] && return 1 + read -r -a octets <<<"$ip" + [ "${#octets[@]}" -ne 4 ] && return 1 + + for octet in "${octets[@]}"; do + if ! [[ "$octet" =~ ^[0-9]+$ ]] || ((octet < 0 || octet > 255)); then + return 1 + fi + done + return 0 +} + +# 验证IPv6地址格式 +function is_valid_ipv6() { + local ip=$1 + if [[ ! $ip =~ ^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$ ]] && + [[ ! $ip =~ ^(([0-9a-fA-F]{0,4}:){0,7}:|(:[0-9a-fA-F]{0,4}:){0,6}:[0-9a-fA-F]{0,4})$ ]]; then + return 1 + fi + return 0 +} + +# 验证IP地址是否为有效的IPv4或IPv6 +function is_valid_ip() { + is_valid_ipv4 "$1" || is_valid_ipv6 "$1" +} + +# 检查参数 +[ $# -lt 1 ] && echo "Usage: $0 " && exit 1 +! is_valid_ip "$1" && echo "$1 is not a valid IP address." && exit 1 + +# 获取网络接口和硬件端口 +nic=$(route -n get default | grep "interface" | awk '{print $2}') +hardware_port=$(networksetup -listallhardwareports | awk -v dev="$nic" ' + /Hardware Port:/{port=$0; gsub("Hardware Port: ", "", port)} + /Device: /{if ($2 == dev) {print port; exit}} +') + +# 获取当前DNS设置 +original_dns=$(networksetup -getdnsservers "$hardware_port") + +# 检查当前DNS设置是否有效 +is_valid_dns=false +for ip in $original_dns; do + ip=$(echo "$ip" | tr -d '[:space:]') + if [ -n "$ip" ] && (is_valid_ipv4 "$ip" || is_valid_ipv6 "$ip"); then + is_valid_dns=true + break + fi +done + +# 更新DNS设置 +if [ "$is_valid_dns" = false ]; then + echo "empty" >.original_dns.txt +else + echo "$original_dns" >.original_dns.txt +fi +networksetup -setdnsservers "$hardware_port" "$1" diff --git a/scripts/unset_dns.sh b/scripts/unset_dns.sh new file mode 100644 index 00000000..6b46b61f --- /dev/null +++ b/scripts/unset_dns.sh @@ -0,0 +1,20 @@ +#!/bin/bash +nic=$(route -n get default | grep "interface" | awk '{print $2}') + +hardware_port=$(networksetup -listallhardwareports | awk -v dev="$nic" ' + /Hardware Port:/{ + port=$0; gsub("Hardware Port: ", "", port) + } + /Device: /{ + if ($2 == dev) { + print port; + exit + } + } +') + +if [ -f .original_dns.txt ]; then + original_dns=$(cat .original_dns.txt) + networksetup -setdnsservers "$hardware_port" $original_dns + rm -rf .original_dns.txt +fi diff --git a/scripts/updatelog.mjs b/scripts/updatelog.mjs index fae7f628..914098cb 100644 --- a/scripts/updatelog.mjs +++ b/scripts/updatelog.mjs @@ -1,4 +1,5 @@ -import fs from "fs-extra"; +import fs from "fs"; +import fsp from "fs/promises"; import path from "path"; const UPDATE_LOG = "UPDATELOG.md"; @@ -12,11 +13,11 @@ export async function resolveUpdateLog(tag) { const file = path.join(cwd, UPDATE_LOG); - if (!(await fs.pathExists(file))) { + if (!fs.existsSync(file)) { throw new Error("could not found UPDATELOG.md"); } - const data = await fs.readFile(file).then((d) => d.toString("utf8")); + const data = await fsp.readFile(file, "utf-8"); const map = {}; let p = ""; diff --git a/scripts/utils.mjs b/scripts/utils.mjs new file mode 100644 index 00000000..3db9a14e --- /dev/null +++ b/scripts/utils.mjs @@ -0,0 +1,11 @@ +import clc from "cli-color"; + +export const log_success = (msg, ...optionalParams) => + console.log(clc.green(msg), ...optionalParams); +export const log_error = (msg, ...optionalParams) => + console.log(clc.red(msg), ...optionalParams); +export const log_info = (msg, ...optionalParams) => + console.log(clc.bgBlue(msg), ...optionalParams); +var debugMsg = clc.xterm(245); +export const log_debug = (msg, ...optionalParams) => + console.log(debugMsg(msg), ...optionalParams); diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 6c809a3e..4d938eb2 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -4,25 +4,65 @@ version = 3 [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "adler2" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.15", + "once_cell", + "version_check", +] + [[package]] name = "ahash" version = "0.8.11" @@ -62,9 +102,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" [[package]] name = "android-tzdata" @@ -83,28 +123,28 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" [[package]] name = "arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" dependencies = [ "derive_arbitrary", ] [[package]] name = "arboard" -version = "3.4.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb4009533e8ff8f1450a5bcbc30f4242a1d34442221f72314bea1f5dc9c7f89" +checksum = "df099ccb16cd014ff054ac1bf392c67feeef57164b05c42f037cd40f5d4357f4" dependencies = [ "clipboard-win", "core-graphics 0.23.2", - "image 0.25.2", + "image", "log", "objc2", "objc2-app-kit", @@ -128,19 +168,23 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "ashpd" -version = "0.8.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd884d7c72877a94102c3715f3b1cd09ff4fac28221add3e57cfbe25c236d093" +checksum = "e9c39d707614dbcc6bed00015539f488d8e3fe3e66ed60961efc0c90f4b380b3" dependencies = [ "enumflags2", "futures-channel", "futures-util", "rand 0.8.5", + "raw-window-handle 0.6.2", "serde", "serde_repr", "tokio", "url", - "zbus", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "zbus 5.1.1", ] [[package]] @@ -149,7 +193,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" dependencies = [ - "event-listener 5.3.0", + "event-listener 5.3.1", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -180,14 +224,14 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7ebdfa2ebdab6b1760375fa7d6f382b9f486eac35fc994625a00e89280bdbb7" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" dependencies = [ "async-task", "concurrent-queue", - "fastrand 2.1.1", - "futures-lite 2.3.0", + "fastrand 2.2.0", + "futures-lite 2.5.0", "slab", ] @@ -211,7 +255,7 @@ checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" dependencies = [ "async-lock 3.4.0", "blocking", - "futures-lite 2.3.0", + "futures-lite 2.5.0", ] [[package]] @@ -236,18 +280,18 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ "async-lock 3.4.0", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "parking", - "polling 3.7.3", - "rustix 0.38.35", + "polling 3.7.4", + "rustix 0.38.41", "slab", "tracing", "windows-sys 0.59.0", @@ -268,7 +312,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 5.3.0", + "event-listener 5.3.1", "event-listener-strategy", "pin-project-lite", ] @@ -297,28 +341,27 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.35", + "rustix 0.38.41", "windows-sys 0.48.0", ] [[package]] name = "async-process" -version = "2.2.4" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a07789659a4d385b79b18b9127fc27e1a59e1e89117c78c5ea3b806f016374" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" dependencies = [ "async-channel 2.3.1", - "async-io 2.3.4", + "async-io 2.4.0", "async-lock 3.4.0", "async-signal", "async-task", "blocking", "cfg-if", - "event-listener 5.3.0", - "futures-lite 2.3.0", - "rustix 0.38.35", + "event-listener 5.3.1", + "futures-lite 2.5.0", + "rustix 0.38.41", "tracing", - "windows-sys 0.59.0", ] [[package]] @@ -329,7 +372,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -338,13 +381,13 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" dependencies = [ - "async-io 2.3.4", + "async-io 2.4.0", "async-lock 3.4.0", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.35", + "rustix 0.38.41", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -352,9 +395,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", @@ -363,13 +406,13 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -380,13 +423,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.81" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -425,15 +468,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f012b8cc0c850f34117ec8252a44418f2e34a2cf501de89e29b241ae5f79471" dependencies = [ "dirs 4.0.0", - "thiserror", + "thiserror 1.0.69", "winreg 0.10.1", ] [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" @@ -448,7 +491,7 @@ dependencies = [ "futures-util", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.30", + "hyper 0.14.31", "itoa 1.0.11", "matchit", "memchr", @@ -482,17 +525,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", - "miniz_oxide 0.7.4", + "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -513,12 +556,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "bit_field" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" - [[package]] name = "bitflags" version = "1.3.2" @@ -576,29 +613,29 @@ dependencies = [ "async-channel 2.3.1", "async-task", "futures-io", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "piper", ] [[package]] name = "boa_ast" -version = "0.18.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b6fb81ca0f301f33aff7401e2ffab37dc9e0e4a1cf0ccf6b34f4d9e60aa0682" +checksum = "3a69ee3a749ea36d4e56d92941e7b25076b493d4917c3d155b6cf369e23547d9" dependencies = [ "bitflags 2.6.0", "boa_interner", "boa_macros", - "indexmap 2.5.0", + "indexmap 2.6.0", "num-bigint", - "rustc-hash 1.1.0", + "rustc-hash", ] [[package]] name = "boa_engine" -version = "0.18.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "600e4e4a65b26efcef08a7b1cf2899d3845a32e82e067ee3b75eaf7e413ff31c" +checksum = "06e4559b35b80ceb2e6328481c0eca9a24506663ea33ee1e279be6b5b618b25c" dependencies = [ "arrayvec", "bitflags 2.6.0", @@ -608,26 +645,26 @@ dependencies = [ "boa_macros", "boa_parser", "boa_profiler", + "boa_string", "bytemuck", "cfg-if", - "dashmap", + "dashmap 5.5.3", "fast-float", "hashbrown 0.14.5", "icu_normalizer", - "indexmap 2.5.0", + "indexmap 2.6.0", "intrusive-collections", - "itertools", + "itertools 0.13.0", "num-bigint", "num-integer", "num-traits", "num_enum", "once_cell", - "paste", "pollster", "portable-atomic", "rand 0.8.5", "regress", - "rustc-hash 1.1.0", + "rustc-hash", "ryu-js", "serde", "serde_json", @@ -635,55 +672,56 @@ dependencies = [ "static_assertions", "tap", "thin-vec", - "thiserror", + "thiserror 1.0.69", "time", ] [[package]] name = "boa_gc" -version = "0.18.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c055ef3cd87ea7db014779195bc90c6adfc35de4902e3b2fe587adecbd384578" +checksum = "716406f57d67bc3ac7fd227d5513b42df401dff14a3be22cbd8ee29817225363" dependencies = [ "boa_macros", "boa_profiler", + "boa_string", "hashbrown 0.14.5", "thin-vec", ] [[package]] name = "boa_interner" -version = "0.18.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cacc9caf022d92195c827a3e5bf83f96089d4bfaff834b359ac7b6be46e9187" +checksum = "4e18df2272616e1ba0322a69333d37dbb78797f1aa0595aad9dc41e8ecd06ad9" dependencies = [ "boa_gc", "boa_macros", "hashbrown 0.14.5", - "indexmap 2.5.0", + "indexmap 2.6.0", "once_cell", "phf 0.11.2", - "rustc-hash 1.1.0", + "rustc-hash", "static_assertions", ] [[package]] name = "boa_macros" -version = "0.18.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6be9c93793b60dac381af475b98634d4b451e28336e72218cad9a20176218dbc" +checksum = "240f4126219a83519bad05c9a40bfc0303921eeb571fc2d7e44c17ffac99d3f1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", "synstructure", ] [[package]] name = "boa_parser" -version = "0.18.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8592556849f0619ed142ce2b3a19086769314a8d657f93a5765d06dbce4818" +checksum = "62b59dc05bf1dc019b11478a92986f590cff43fced4d20e866eefb913493e91c" dependencies = [ "bitflags 2.6.0", "boa_ast", @@ -695,20 +733,33 @@ dependencies = [ "num-bigint", "num-traits", "regress", - "rustc-hash 1.1.0", + "rustc-hash", ] [[package]] name = "boa_profiler" -version = "0.18.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0d8372f2d5cbac600a260de87877141b42da1e18d2c7a08ccb493a49cbd55c0" +checksum = "00ee0645509b3b91abd724f25072649d9e8e65653a78ff0b6e592788a58dd838" + +[[package]] +name = "boa_string" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae85205289bab1f2c7c8a30ddf0541cf89ba2ff7dbd144feef50bbfa664288d4" +dependencies = [ + "fast-float", + "paste", + "rustc-hash", + "sptr", + "static_assertions", +] [[package]] name = "brotli" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -733,22 +784,22 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.17.1" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773d90827bc3feecfb67fab12e24de0749aad83c74b9504ecde46237b5cd24e2" +checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -765,13 +816,34 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" dependencies = [ "serde", ] +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + [[package]] name = "cairo-rs" version = "0.18.5" @@ -783,7 +855,7 @@ dependencies = [ "glib", "libc", "once_cell", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -826,7 +898,7 @@ dependencies = [ "semver 1.0.23", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -836,15 +908,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719" dependencies = [ "serde", - "toml 0.8.2", + "toml 0.8.19", ] [[package]] name = "cc" -version = "1.1.15" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" +checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" dependencies = [ + "jobserver", + "libc", "shlex", ] @@ -902,18 +976,30 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clash-verge" version = "2.0.0" dependencies = [ + "aes-gcm", "anyhow", - "auto-launch", + "base64 0.22.1", "boa_engine", "chrono", "deelevate", "delay_timer", "dirs 5.0.1", "dunce", + "getrandom 0.2.15", "log", "log4rs", "nanoid", @@ -924,6 +1010,7 @@ dependencies = [ "percent-encoding", "port_scanner", "reqwest", + "reqwest_dav", "runas", "serde", "serde_json", @@ -932,7 +1019,9 @@ dependencies = [ "sysproxy", "tauri", "tauri-build", + "tauri-plugin-autostart", "tauri-plugin-clipboard-manager", + "tauri-plugin-deep-link", "tauri-plugin-devtools", "tauri-plugin-dialog", "tauri-plugin-fs", @@ -941,11 +1030,14 @@ dependencies = [ "tauri-plugin-process", "tauri-plugin-shell", "tauri-plugin-updater", + "tauri-plugin-window-state", "tokio", + "url", "users", "warp", "window-shadows", "winreg 0.52.0", + "zip", ] [[package]] @@ -1017,12 +1109,6 @@ dependencies = [ "objc", ] -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - [[package]] name = "colored" version = "2.1.0" @@ -1050,7 +1136,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -1062,12 +1148,48 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.15", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + [[package]] name = "convert_case" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[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.9.4" @@ -1144,13 +1266,28 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "0ca741a962e1b0bff6d724a1a0958b686406e853bb14061f218562e1896f95e6" dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crc32fast" version = "1.4.2" @@ -1218,6 +1355,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", + "rand_core 0.6.4", "typenum", ] @@ -1245,7 +1383,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -1255,7 +1393,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.87", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", ] [[package]] @@ -1279,7 +1426,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -1290,7 +1437,17 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.77", + "syn 2.0.87", +] + +[[package]] +name = "dashmap" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" +dependencies = [ + "cfg-if", + "num_cpus", ] [[package]] @@ -1327,18 +1484,24 @@ dependencies = [ ] [[package]] -name = "delay_timer" -version = "0.11.6" +name = "deflate64" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20eba879b7ee5f1d255d5666e16646fe384f899f71a4c0b4b0644e2e074964fe" +checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" + +[[package]] +name = "delay_timer" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d70c0d5d2addc05d1e0cf7e60b3a5bf08415f03136a773d7c66b4e4a3b892cef" dependencies = [ "anyhow", "async-trait", "autocfg", "concat-idents", "cron_clock", - "dashmap", - "event-listener 5.3.0", + "dashmap 4.0.2", + "event-listener 2.5.3", "futures", "log", "lru", @@ -1346,7 +1509,7 @@ dependencies = [ "rs-snowflake", "rustc_version 0.2.3", "smol", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -1374,13 +1537,13 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -1393,7 +1556,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -1404,20 +1567,20 @@ checksum = "3c877555693c14d2f84191cfd3ad8582790fc52b5e2274b40b59cf5f5cea25c7" [[package]] name = "devtools-core" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f21c374111065b917a9ed5d1e377cd5792cd19f641ee0bf316f72878908bb99" +checksum = "e78cdd51f6f62ad4eb9b6581d7e238e1779db3144ddbd711388f552e6ed3194b" dependencies = [ "async-stream", "bytes", "devtools-wire-format", "futures", "http 0.2.12", - "hyper 0.14.30", + "hyper 0.14.31", "log", "prost-types", "ringbuf", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tonic", @@ -1433,9 +1596,9 @@ dependencies = [ [[package]] name = "devtools-wire-format" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d841ad485c6bc179ffed4886197490045644f2f194b52ce090c8488bb0028b" +checksum = "a1c0de542960449c9566001c1879d10ede95f3f2e0013fdae0cc3b153bfabb0d" dependencies = [ "bitflags 2.6.0", "prost", @@ -1461,6 +1624,20 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", "crypto-common", + "subtle", +] + +[[package]] +name = "digest_auth" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3054f4e81d395e50822796c5e99ca522e6ba7be98947d6d4b0e5e61640bdb894" +dependencies = [ + "digest 0.10.7", + "hex", + "md-5", + "rand 0.8.5", + "sha2 0.10.8", ] [[package]] @@ -1539,7 +1716,16 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", +] + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading 0.8.5", ] [[package]] @@ -1562,9 +1748,24 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] +[[package]] +name = "dlv-list" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" +dependencies = [ + "const-random", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + [[package]] name = "dpi" version = "0.1.1" @@ -1609,14 +1810,14 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "embed-resource" -version = "2.4.3" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4edcacde9351c33139a41e3c97eb2334351a81a2791bebb0b243df837128f602" +checksum = "b68b6f9f63a0b6a38bc447d4ce84e2b388f3ec95c99c641c8ff0dd3ef89a6379" dependencies = [ "cc", "memchr", "rustc_version 0.4.1", - "toml 0.8.2", + "toml 0.8.19", "vswhom", "winreg 0.52.0", ] @@ -1629,9 +1830,9 @@ checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -1660,7 +1861,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -1691,9 +1892,9 @@ dependencies = [ [[package]] name = "error-code" -version = "3.2.0" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b" +checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" [[package]] name = "event-listener" @@ -1714,9 +1915,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.3.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ "concurrent-queue", "parking", @@ -1729,26 +1930,10 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "event-listener 5.3.0", + "event-listener 5.3.1", "pin-project-lite", ] -[[package]] -name = "exr" -version = "1.72.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" -dependencies = [ - "bit_field", - "flume", - "half", - "lebe", - "miniz_oxide 0.7.4", - "rayon-core", - "smallvec", - "zune-inflate", -] - [[package]] name = "fast-float" version = "0.2.0" @@ -1766,15 +1951,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] name = "fdeflate" -version = "0.3.4" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +checksum = "07c6f4c64c1d33a3111c4466f7365ebdcc37c5bd1ea0d62aae2e3d722aacbedb" dependencies = [ "simd-adler32", ] @@ -1796,7 +1981,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7199d965852c3bac31f779ef99cbb4537f80e952e2d6aa0ffeb30cce00f4f46e" dependencies = [ "libc", - "thiserror", + "thiserror 1.0.69", "winapi", ] @@ -1814,30 +1999,12 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", - "miniz_oxide 0.8.0", -] - -[[package]] -name = "fluent-uri" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "spin", + "miniz_oxide", ] [[package]] @@ -1873,7 +2040,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -1909,9 +2076,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1924,9 +2091,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1934,15 +2101,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1951,9 +2118,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" @@ -1972,11 +2139,11 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ - "fastrand 2.1.1", + "fastrand 2.2.0", "futures-core", "futures-io", "parking", @@ -1985,32 +2152,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -2132,19 +2299,6 @@ dependencies = [ "x11", ] -[[package]] -name = "generator" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" -dependencies = [ - "cc", - "libc", - "log", - "rustversion", - "windows 0.48.0", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -2183,25 +2337,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] -name = "gif" -version = "0.13.1" +name = "ghash" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" dependencies = [ - "color_quant", - "weezl", + "opaque-debug", + "polyval", ] [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "gio" @@ -2219,7 +2375,7 @@ dependencies = [ "once_cell", "pin-project-lite", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2255,7 +2411,7 @@ dependencies = [ "memchr", "once_cell", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2265,11 +2421,11 @@ 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-crate 2.0.0", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -2290,18 +2446,17 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "global-hotkey" -version = "0.6.0" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298a7667d6011efe6b35673c6b29001b88677ae1b3d6b2feccfbff4b44892866" +checksum = "b00d88f1be7bf4cd2e61623ce08e84be2dfa4eab458e5d632d3dab95f16c1f64" dependencies = [ - "bitflags 2.6.0", - "cocoa 0.26.0", "crossbeam-channel", "keyboard-types", - "objc", + "objc2", + "objc2-app-kit", "once_cell", "serde", - "thiserror", + "thiserror 1.0.69", "windows-sys 0.59.0", "x11-dl", ] @@ -2366,7 +2521,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -2381,7 +2536,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.5.0", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -2390,9 +2545,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ "atomic-waker", "bytes", @@ -2400,23 +2555,13 @@ dependencies = [ "futures-core", "futures-sink", "http 1.1.0", - "indexmap 2.5.0", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", "tracing", ] -[[package]] -name = "half" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" -dependencies = [ - "cfg-if", - "crunchy", -] - [[package]] name = "handlebars" version = "3.5.5" @@ -2436,6 +2581,9 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] [[package]] name = "hashbrown" @@ -2443,10 +2591,16 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash", + "ahash 0.8.11", "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" + [[package]] name = "headers" version = "0.3.9" @@ -2501,6 +2655,15 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + [[package]] name = "home" version = "0.5.9" @@ -2594,9 +2757,9 @@ checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -2612,9 +2775,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.30" +version = "0.14.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" dependencies = [ "bytes", "futures-channel", @@ -2636,14 +2799,14 @@ dependencies = [ [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.6", + "h2 0.4.7", "http 1.1.0", "http-body 1.0.1", "httparse", @@ -2656,13 +2819,13 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.4.1", + "hyper 1.5.1", "hyper-util", "rustls", "rustls-pki-types", @@ -2678,7 +2841,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper 0.14.30", + "hyper 0.14.31", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -2692,7 +2855,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.4.1", + "hyper 1.5.1", "hyper-util", "native-tls", "tokio", @@ -2702,29 +2865,28 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.7" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", "futures-util", "http 1.1.0", "http-body 1.0.1", - "hyper 1.4.1", + "hyper 1.5.1", "pin-project-lite", "socket2 0.5.7", "tokio", - "tower", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2755,9 +2917,9 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "137d96353afc8544d437e8a99eceb10ab291352699573b0de5b08bda38c78c60" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" dependencies = [ "displaydoc", "yoke", @@ -2767,9 +2929,9 @@ dependencies = [ [[package]] name = "icu_locid" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c0aa2536adc14c07e2a521e95512b75ed8ef832f0fdf9299d4a0a45d2be2a9d" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ "displaydoc", "litemap", @@ -2780,9 +2942,9 @@ dependencies = [ [[package]] name = "icu_locid_transform" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c17d8f6524fdca4471101dd71f0a132eb6382b5d6d7f2970441cb25f6f435a" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" dependencies = [ "displaydoc", "icu_locid", @@ -2794,15 +2956,15 @@ dependencies = [ [[package]] name = "icu_locid_transform_data" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545c6c3e8bf9580e2dafee8de6f9ec14826aaf359787789c7724f1f85f47d3dc" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" [[package]] name = "icu_normalizer" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accb85c5b2e76f8dade22978b3795ae1e550198c6cfc7e915144e17cd6e2ab56" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" dependencies = [ "displaydoc", "icu_collections", @@ -2818,15 +2980,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3744fecc0df9ce19999cdaf1f9f3a48c253431ce1d67ef499128fe9d0b607ab" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" [[package]] name = "icu_properties" -version = "1.4.3" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db9e559598096627aeca8cdfb98138a70eb4078025f8d1d5f2416a361241f756" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" dependencies = [ "displaydoc", "icu_collections", @@ -2839,15 +3001,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70a8b51ee5dd4ff8f20ee9b1dd1bc07afc110886a3747b1fec04cc6e5a15815" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" [[package]] name = "icu_provider" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba58e782287eb6950247abbf11719f83f5d4e4a5c1f2cd490d30a334bc47c2f4" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" dependencies = [ "displaydoc", "icu_locid", @@ -2862,13 +3024,13 @@ dependencies = [ [[package]] name = "icu_provider_macros" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2abdd3a62551e8337af119c5899e600ca0c88ec8f23a46c60ba216c803dcf1a" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -2879,37 +3041,30 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] name = "image" -version = "0.24.9" +version = "0.25.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "exr", - "gif", - "jpeg-decoder", - "num-traits", - "png", - "qoi", - "tiff", -] - -[[package]] -name = "image" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" dependencies = [ "bytemuck", "byteorder-lite", @@ -2931,24 +3086,33 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.1", "serde", ] [[package]] name = "infer" -version = "0.15.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb33622da908807a06f9513c19b3c1ad50fab3e4137d82a78107d502075aa199" +checksum = "bc150e5ce2330295b8616ce0e3f53250e53af31759a9dbedad1621ba29151847" dependencies = [ "cfb", ] +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + [[package]] name = "instant" version = "0.1.13" @@ -2976,9 +3140,9 @@ dependencies = [ [[package]] name = "intrusive-collections" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b694dc9f70c3bda874626d2aed13b780f137aab435f4e9814121955cf706122e" +checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86" dependencies = [ "memoffset 0.9.1", ] @@ -2996,9 +3160,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "iptools" @@ -3006,7 +3170,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bab2ab6edf9330906c4da149dddc19e850b14c682865d81fb21962bbfc2e0ae" dependencies = [ - "ahash", + "ahash 0.8.11", "once_cell", "regex", ] @@ -3039,6 +3203,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.8" @@ -3085,7 +3258,7 @@ dependencies = [ "combine", "jni-sys", "log", - "thiserror", + "thiserror 1.0.69", "walkdir", "windows-sys 0.45.0", ] @@ -3096,43 +3269,48 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + [[package]] name = "jpeg-decoder" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" -dependencies = [ - "rayon", -] [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] [[package]] name = "json-patch" -version = "2.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" dependencies = [ "jsonptr", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "jsonptr" -version = "0.4.7" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c6e529149475ca0b2820835d3dce8fcc41c6b943ca608d32f35b449255e4627" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" dependencies = [ - "fluent-uri", "serde", "serde_json", ] @@ -3167,12 +3345,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "lebe" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" - [[package]] name = "libappindicator" version = "0.9.0" @@ -3193,15 +3365,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" dependencies = [ "gtk-sys", - "libloading", + "libloading 0.7.4", "once_cell", ] [[package]] name = "libc" -version = "0.2.158" +version = "0.2.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "433bfe06b8c75da9b2e3fbea6e5329ff87748f0b144ef75306e674c3f6f7c13f" [[package]] name = "libloading" @@ -3213,6 +3385,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "libloading" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + [[package]] name = "libredox" version = "0.1.3" @@ -3250,7 +3432,7 @@ checksum = "612ed4ea9ce5acfb5d26339302528a5e1e59dfed95e9e11af3c083236ff1d15d" dependencies = [ "libc", "neli", - "thiserror", + "thiserror 1.0.69", "windows-sys 0.48.0", ] @@ -3264,6 +3446,12 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "lockfree-object-pool" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" + [[package]] name = "log" version = "0.4.22" @@ -3301,34 +3489,29 @@ dependencies = [ "serde-value", "serde_json", "serde_yaml", - "thiserror", + "thiserror 1.0.69", "thread-id", "typemap-ors", "winapi", ] [[package]] -name = "loom" -version = "0.5.6" +name = "lru" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "serde", - "serde_json", - "tracing", - "tracing-subscriber", + "hashbrown 0.12.3", ] [[package]] -name = "lru" -version = "0.12.4" +name = "lzma-rs" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e" dependencies = [ - "hashbrown 0.14.5", + "byteorder", + "crc", ] [[package]] @@ -3339,9 +3522,9 @@ checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" [[package]] name = "mac-notification-sys" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51fca4d74ff9dbaac16a01b924bc3693fa2bba0862c2c633abc73f9a8ea21f64" +checksum = "dce8f34f3717aa37177e723df6c1fc5fb02b2a1087374ea3fe0ea42316dc8f91" dependencies = [ "cc", "dirs-next", @@ -3394,6 +3577,16 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest 0.10.7", +] + [[package]] name = "memchr" version = "2.7.4" @@ -3452,16 +3645,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a05b5d0594e0cb1ad8cee3373018d2b84e25905dc75b2468114cc9a8e86cfc20" -[[package]] -name = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", - "simd-adler32", -] - [[package]] name = "miniz_oxide" version = "0.8.0" @@ -3469,6 +3652,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -3485,20 +3669,21 @@ dependencies = [ [[package]] name = "muda" -version = "0.14.1" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba8ac4080fb1e097c2c22acae467e46e4da72d941f02e82b67a87a2a89fa38b1" +checksum = "fdae9c00e61cc0579bcac625e8ad22104c60548a025bfc972dc83868a28e1484" dependencies = [ - "cocoa 0.26.0", "crossbeam-channel", "dpi", "gtk", "keyboard-types", - "objc", + "objc2", + "objc2-app-kit", + "objc2-foundation", "once_cell", "png", "serde", - "thiserror", + "thiserror 1.0.69", "windows-sys 0.59.0", ] @@ -3558,7 +3743,7 @@ dependencies = [ "ndk-sys", "num_enum", "raw-window-handle 0.6.2", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3610,7 +3795,7 @@ dependencies = [ "cc", "libc", "serde", - "thiserror", + "thiserror 1.0.69", "winapi", ] @@ -3635,12 +3820,13 @@ dependencies = [ [[package]] name = "nix" -version = "0.27.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ "bitflags 2.6.0", "cfg-if", + "cfg_aliases", "libc", "memoffset 0.9.1", ] @@ -3673,15 +3859,15 @@ dependencies = [ [[package]] name = "notify-rust" -version = "4.11.1" +version = "4.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26a1d03b6305ecefdd9c6c60150179bb8d9f0cd4e64bbcad1e41419e7bf5e414" +checksum = "5134a72dc570b178bff81b01e81ab14a6fcc015391ed4b3b14853090658cd3a3" dependencies = [ "log", "mac-notification-sys", "serde", "tauri-winrt-notification", - "zbus", + "zbus 4.4.0", ] [[package]] @@ -3749,6 +3935,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + [[package]] name = "num_enum" version = "0.7.3" @@ -3764,10 +3960,10 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 2.0.2", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -3786,7 +3982,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", - "objc_exception", ] [[package]] @@ -3805,6 +4000,9 @@ name = "objc-sys" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" +dependencies = [ + "cc", +] [[package]] name = "objc2" @@ -3832,6 +4030,30 @@ dependencies = [ "objc2-quartz-core", ] +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + [[package]] name = "objc2-core-data" version = "0.2.2" @@ -3856,6 +4078,18 @@ dependencies = [ "objc2-metal", ] +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2", + "objc2-contacts", + "objc2-foundation", +] + [[package]] name = "objc2-encode" version = "4.0.3" @@ -3875,6 +4109,18 @@ dependencies = [ "objc2", ] +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", +] + [[package]] name = "objc2-metal" version = "0.2.2" @@ -3901,12 +4147,71 @@ dependencies = [ ] [[package]] -name = "objc_exception" -version = "0.1.2" +name = "objc2-symbols" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" dependencies = [ - "cc", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68bc69301064cebefc6c4c90ce9cba69225239e4b8ff99d445a2b5563797da65" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", ] [[package]] @@ -3920,18 +4225,18 @@ dependencies = [ [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opaque-debug" @@ -3941,9 +4246,9 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "open" -version = "5.3.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a877bf6abd716642a53ef1b89fb498923a4afca5c754f9050b4d081c05c4b3" +checksum = "3ecd52f0b8d15c40ce4820aa251ed5de032e5d91fab27f7db2f40d42a8bdf69c" dependencies = [ "is-wsl", "libc", @@ -3952,9 +4257,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.66" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -3973,7 +4278,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -3984,9 +4289,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.103" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", @@ -4009,6 +4314,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "ordered-multimap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" +dependencies = [ + "dlv-list", + "hashbrown 0.14.5", +] + [[package]] name = "ordered-stream" version = "0.2.0" @@ -4062,9 +4377,9 @@ dependencies = [ [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -4097,9 +4412,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pathdiff" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" [[package]] name = "pathsearch" @@ -4111,6 +4426,16 @@ dependencies = [ "libc", ] +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest 0.10.7", + "hmac", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -4119,20 +4444,20 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.11" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" +checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ "memchr", - "thiserror", + "thiserror 1.0.69", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.7.11" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a548d2beca6773b1c244554d36fcf8548a8a58e74156968211567250e48e49a" +checksum = "d214365f632b123a47fd913301e14c946c61d1c183ee245fa76eb752e59a02dd" dependencies = [ "pest", "pest_generator", @@ -4140,22 +4465,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.11" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c93a82e8d145725dcbaf44e5ea887c8a869efdcc28706df2d08c69e17077183" +checksum = "eb55586734301717aea2ac313f50b2eb8f60d2fc3dc01d190eefa2e625f60c4e" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "pest_meta" -version = "2.7.11" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f" +checksum = "b75da2a70cf4d9cb76833c990ac9cd3923c9a8905a8929789ce347c84564d03d" dependencies = [ "once_cell", "pest", @@ -4276,7 +4601,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -4308,29 +4633,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -4345,15 +4670,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand 2.1.1", + "fastrand 2.2.0", "futures-io", ] [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "plist" @@ -4362,7 +4687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" dependencies = [ "base64 0.22.1", - "indexmap 2.5.0", + "indexmap 2.6.0", "quick-xml 0.32.0", "serde", "time", @@ -4370,15 +4695,15 @@ dependencies = [ [[package]] name = "png" -version = "0.17.13" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0" dependencies = [ "bitflags 1.3.2", "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.7.4", + "miniz_oxide", ] [[package]] @@ -4399,15 +4724,15 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.3" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.35", + "rustix 0.38.41", "tracing", "windows-sys 0.59.0", ] @@ -4418,6 +4743,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + [[package]] name = "port_scanner" version = "0.1.5" @@ -4426,9 +4763,9 @@ checksum = "325a6d2ac5dee293c3b2612d4993b98aec1dff096b0a2dae70ed7d95784a05da" [[package]] name = "portable-atomic" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da544ee218f0d287a911e9c99a39a8c9bc8fcad3cb8db5959940044ecfc67265" +checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" [[package]] name = "powerfmt" @@ -4463,12 +4800,20 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" dependencies = [ - "toml_datetime", - "toml_edit 0.20.2", + "toml_edit 0.20.7", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit 0.22.22", ] [[package]] @@ -4503,9 +4848,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -4527,10 +4872,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools", + "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -4542,15 +4887,6 @@ dependencies = [ "prost", ] -[[package]] -name = "qoi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" -dependencies = [ - "bytemuck", -] - [[package]] name = "quick-error" version = "2.0.1" @@ -4576,51 +4912,64 @@ dependencies = [ ] [[package]] -name = "quinn" -version = "0.11.3" +name = "quick-xml" +version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b22d8e7369034b9a7132bc2008cac12f2013c8132b45e0554e6e20e2617f2156" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" dependencies = [ "bytes", "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.0.0", + "rustc-hash", "rustls", "socket2 0.5.7", - "thiserror", + "thiserror 2.0.3", "tokio", "tracing", ] [[package]] name = "quinn-proto" -version = "0.11.6" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba92fb39ec7ad06ca2582c0ca834dfeadcaf06ddfc8e635c80aa7e1c05315fdd" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", + "getrandom 0.2.15", "rand 0.8.5", "ring", - "rustc-hash 2.0.0", + "rustc-hash", "rustls", + "rustls-pki-types", "slab", - "thiserror", + "thiserror 2.0.3", "tinyvec", "tracing", + "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285" +checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" dependencies = [ + "cfg_aliases", "libc", "once_cell", "socket2 0.5.7", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4747,9 +5096,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.3" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] @@ -4762,19 +5111,19 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom 0.2.15", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] [[package]] @@ -4788,13 +5137,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -4805,15 +5154,15 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "regress" -version = "0.9.1" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eae2a1ebfecc58aff952ef8ccd364329abe627762f5bf09ff42eb9d98522479" +checksum = "1541daf4e4ed43a0922b7969bdc2170178bcacc5dabf7e39bc508a9fa3953a7a" dependencies = [ "hashbrown 0.14.5", "memchr", @@ -4821,20 +5170,20 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.7" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64 0.22.1", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2 0.4.6", + "h2 0.4.7", "http 1.1.0", "http-body 1.0.1", "http-body-util", - "hyper 1.4.1", + "hyper 1.5.1", "hyper-rustls", "hyper-tls", "hyper-util", @@ -4866,26 +5215,45 @@ dependencies = [ "wasm-streams", "web-sys", "webpki-roots", - "windows-registry", + "windows-registry 0.2.0", +] + +[[package]] +name = "reqwest_dav" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea79cbb695b7cc877ae9c0f0eeb8468e36cd03dc9c41a93bcf237396357c7b42" +dependencies = [ + "async-trait", + "chrono", + "digest_auth", + "http 1.1.0", + "httpdate", + "reqwest", + "serde", + "serde-xml-rs", + "serde_derive", + "serde_json", + "tokio", + "url", ] [[package]] name = "rfd" -version = "0.14.1" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a73a7337fc24366edfca76ec521f51877b114e42dab584008209cca6719251" +checksum = "46f6f80a9b882647d9014673ca9925d30ffc9750f2eed2b4490e189eaebd01e8" dependencies = [ "ashpd", - "block", - "dispatch", + "block2", "glib-sys", "gobject-sys", "gtk-sys", "js-sys", "log", - "objc", - "objc-foundation", - "objc_id", + "objc2", + "objc2-app-kit", + "objc2-foundation", "raw-window-handle 0.6.2", "wasm-bindgen", "wasm-bindgen-futures", @@ -4910,11 +5278,12 @@ dependencies = [ [[package]] name = "ringbuf" -version = "0.4.4" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f7f1b88601a8ee13cabf203611ccdf64345dc1c5d24de8b11e1a678ee619b6" +checksum = "726bb493fe9cac765e8f96a144c3a8396bdf766dedad22e504b70b908dcbceb4" dependencies = [ "crossbeam-utils", + "portable-atomic", ] [[package]] @@ -4935,18 +5304,23 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "rust-ini" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e310ef0e1b6eeb79169a1171daf9abcb87a2e17c03bee2c4bb100b55c75409f" +dependencies = [ + "cfg-if", + "ordered-multimap", + "trim-in-place", +] + [[package]] name = "rustc-demangle" version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc-hash" version = "2.0.0" @@ -4987,9 +5361,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.35" +version = "0.38.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" +checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" dependencies = [ "bitflags 2.6.0", "errno", @@ -5000,9 +5374,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.12" +version = "0.23.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" +checksum = "7f1a745511c54ba6d4465e8d5dfbd81b45791756de28d4981af70d6dca128f1e" dependencies = [ "once_cell", "ring", @@ -5014,25 +5388,27 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +dependencies = [ + "web-time", +] [[package]] name = "rustls-webpki" -version = "0.102.7" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84678086bd54edf2b415183ed7a94d0efb049f1b646a33e22a36f3794be6ae56" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", "rustls-pki-types", @@ -5041,9 +5417,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "ryu" @@ -5068,11 +5444,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5087,6 +5463,7 @@ dependencies = [ "serde", "serde_json", "url", + "uuid", ] [[package]] @@ -5098,7 +5475,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -5128,9 +5505,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.1" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" dependencies = [ "core-foundation-sys", "libc", @@ -5171,7 +5548,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" dependencies = [ - "semver-parser 0.10.2", + "semver-parser 0.10.3", ] [[package]] @@ -5191,18 +5568,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "semver-parser" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" dependencies = [ "pest", ] [[package]] name = "serde" -version = "1.0.209" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] @@ -5229,14 +5606,26 @@ dependencies = [ ] [[package]] -name = "serde_derive" -version = "1.0.209" +name = "serde-xml-rs" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782" +dependencies = [ + "log", + "serde", + "thiserror 1.0.69", + "xml-rs", +] + +[[package]] +name = "serde_derive" +version = "1.0.215" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -5247,14 +5636,14 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "serde_json" -version = "1.0.127" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa 1.0.11", "memchr", @@ -5270,14 +5659,14 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -5296,15 +5685,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.5.0", + "indexmap 2.6.0", "serde", "serde_derive", "serde_json", @@ -5314,14 +5703,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -5330,7 +5719,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "itoa 1.0.11", "ryu", "serde", @@ -5524,25 +5913,24 @@ dependencies = [ [[package]] name = "softbuffer" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d623bff5d06f60d738990980d782c8c866997d9194cfe79ecad00aa2f76826dd" +checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" dependencies = [ "bytemuck", "cfg_aliases", - "core-graphics 0.23.2", + "core-graphics 0.24.0", "foreign-types 0.5.0", "js-sys", "log", "objc2", - "objc2-app-kit", "objc2-foundation", "objc2-quartz-core", "raw-window-handle 0.6.2", "redox_syscall", "wasm-bindgen", "web-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5576,9 +5964,6 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] [[package]] name = "sptr" @@ -5592,15 +5977,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "state" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8" -dependencies = [ - "loom", -] - [[package]] name = "static_assertions" version = "1.1.0" @@ -5669,9 +6045,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -5701,33 +6077,32 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "sysinfo" -version = "0.30.13" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" +checksum = "e3b5ae3f4f7d64646c46c4cae4e3f01d1c5d255c7406fdd7c7f999a94e488791" dependencies = [ - "cfg-if", "core-foundation-sys", "libc", + "memchr", "ntapi", - "once_cell", "rayon", - "windows 0.52.0", + "windows 0.57.0", ] [[package]] name = "sysproxy" version = "0.3.0" -source = "git+https://github.com/zzzgydi/sysproxy-rs?branch=main#45fffb0cdddb7c2d0ce30300dd72a934bb458c09" +source = "git+https://github.com/clash-verge-rev/sysproxy-rs?branch=main#b18d75d31976efc26cd7b70e07b877e406b5133e" dependencies = [ "interfaces", "iptools", "log", - "thiserror", + "thiserror 1.0.69", "windows 0.58.0", "winreg 0.52.0", "xdg", @@ -5763,15 +6138,15 @@ dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml 0.8.2", + "toml 0.8.19", "version-compare", ] [[package]] name = "tao" -version = "0.29.1" +version = "0.30.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3a97abbc7d6cfd0720da3e06fcb1cf2ac87cbfdb5bbbce103a1279a211c4d81" +checksum = "6682a07cf5bab0b8a2bd20d0a542917ab928b5edb75ebd4eda6b05cbaab872da" dependencies = [ "bitflags 2.6.0", "cocoa 0.26.0", @@ -5814,7 +6189,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -5825,9 +6200,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.41" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" +checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" dependencies = [ "filetime", "libc", @@ -5842,13 +6217,12 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.0.0-rc.8" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8345ccc676ef16e26b61fc0f5340b4e770678b1e1f53f08c69ebdac5e56b422" +checksum = "e545de0a2dfe296fa67db208266cd397c5a55ae782da77973ef4c4fac90e9f2c" dependencies = [ "anyhow", "bytes", - "cocoa 0.26.0", "dirs 5.0.1", "dunce", "embed_plist", @@ -5859,28 +6233,30 @@ dependencies = [ "heck 0.5.0", "http 1.1.0", "http-range", - "image 0.24.9", + "image", "jni", "libc", "log", "mime", "muda", - "objc", + "objc2", + "objc2-app-kit", + "objc2-foundation", "percent-encoding", + "plist", "raw-window-handle 0.6.2", "reqwest", "serde", "serde_json", "serde_repr", "serialize-to-javascript", - "state", "swift-rs", "tauri-build", "tauri-macros", "tauri-runtime", "tauri-runtime-wry", "tauri-utils", - "thiserror", + "thiserror 2.0.3", "tokio", "tracing", "tray-icon", @@ -5894,9 +6270,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.0.0-rc.7" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5ad5fcfaf02cf79aa6727f6c5df38567d8dce172b00b62690c6bc46c08b7ce" +checksum = "7bd2a4bcfaf5fb9f4be72520eefcb61ae565038f8ccba2a497d8c28f463b8c01" dependencies = [ "anyhow", "cargo_toml", @@ -5910,15 +6286,15 @@ dependencies = [ "serde_json", "tauri-utils", "tauri-winres", - "toml 0.8.2", + "toml 0.8.19", "walkdir", ] [[package]] name = "tauri-codegen" -version = "2.0.0-rc.7" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809ef6316726fc72593d296cf6f4e7461326e310c313d6a6c42b6e7f1e2671cf" +checksum = "bf79faeecf301d3e969b1fae977039edb77a4c1f25cc0a961be298b54bff97cf" dependencies = [ "base64 0.22.1", "brotli", @@ -5932,9 +6308,9 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.8", - "syn 2.0.77", + "syn 2.0.87", "tauri-utils", - "thiserror", + "thiserror 2.0.3", "time", "url", "uuid", @@ -5943,23 +6319,23 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.0.0-rc.6" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1359e8861d210d25731f8b1bfbb4d111dd06406cf73c59659366ef450364d811" +checksum = "c52027c8c5afb83166dacddc092ee8fff50772f9646d461d8c33ee887e447a03" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", "tauri-codegen", "tauri-utils", ] [[package]] name = "tauri-plugin" -version = "2.0.0-rc.7" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7dded420c86183f592d0fe925ef9447f41e26fa79f0bdfef8d3f17bfbcdbfb7" +checksum = "e753f2a30933a9bbf0a202fa47d7cc4a3401f06e8d6dcc53b79aa62954828c79" dependencies = [ "anyhow", "glob", @@ -5968,35 +6344,69 @@ dependencies = [ "serde", "serde_json", "tauri-utils", - "toml 0.8.2", + "toml 0.8.19", "walkdir", ] [[package]] -name = "tauri-plugin-clipboard-manager" -version = "2.1.0-beta.7" +name = "tauri-plugin-autostart" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "becbc5a692e842f8d6a7ab5e490c3c36d267b5c3d5bf4b6a0cdd039d7df25569" +checksum = "bba6bb936e0fd0a58ed958b49e2e423dd40949c9d9425cc991be996959e3838e" dependencies = [ - "arboard", - "image 0.24.9", + "auto-launch", "log", "serde", "serde_json", "tauri", "tauri-plugin", - "thiserror", + "thiserror 1.0.69", +] + +[[package]] +name = "tauri-plugin-clipboard-manager" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a66feaa0fb7fce8e5073323d11ca381c9da7ac06f458e42b9ff77364b76a360" +dependencies = [ + "arboard", + "log", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 1.0.69", +] + +[[package]] +name = "tauri-plugin-deep-link" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31a9b5725027c6e9e075b06cb2d5c2cd3b5c29daa8012b404e1ff755cc56082f" +dependencies = [ + "dunce", + "log", + "rust-ini", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-utils", + "thiserror 1.0.69", + "url", + "windows-registry 0.3.0", + "windows-result 0.2.0", ] [[package]] name = "tauri-plugin-devtools" -version = "2.0.0-rc.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f7333811c0b81f32e980d34894effc92454f464409fb97a7e566294b7ebddd0" +checksum = "8e5cd17faa36a826e5686bd0fda5bc3f4c903682263f00cd50f2f778fc4bb866" dependencies = [ "async-stream", "bytes", - "cocoa 0.25.0", + "cocoa 0.26.0", "colored", "devtools-core", "futures", @@ -6017,11 +6427,10 @@ dependencies = [ [[package]] name = "tauri-plugin-dialog" -version = "2.0.0-rc.3" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa8bd381f75c47687f41fb603f67fdd99a1af377da22d03d8fb959d2481845c1" +checksum = "4307310e1d2c09ab110235834722e7c2b85099b683e1eb7342ab351b0be5ada3" dependencies = [ - "dunce", "log", "raw-window-handle 0.6.2", "rfd", @@ -6030,34 +6439,36 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-plugin-fs", - "thiserror", + "thiserror 1.0.69", "url", ] [[package]] name = "tauri-plugin-fs" -version = "2.0.0-rc.1" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "694a746b0e0c1d318198fabf4957800c42fb4b705e866e0eed7ec21476ef88db" +checksum = "96ba7d46e86db8c830d143ef90ab5a453328365b0cc834c24edea4267b16aba0" dependencies = [ "anyhow", + "dunce", "glob", + "percent-encoding", "schemars", "serde", "serde_json", "serde_repr", "tauri", "tauri-plugin", - "thiserror", + "thiserror 1.0.69", "url", "uuid", ] [[package]] name = "tauri-plugin-global-shortcut" -version = "2.0.0-rc.2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91f141154ffde51f57325dc324f696c2c7b5f194d2228a5ec46b1c419f81dd76" +checksum = "2c15fb7f5e4c80a73ce97217dcff27e423f496178cbcb87e13b4efe99eebb550" dependencies = [ "global-hotkey", "log", @@ -6065,14 +6476,14 @@ dependencies = [ "serde_json", "tauri", "tauri-plugin", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "tauri-plugin-notification" -version = "2.0.0-rc.3" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf32fba3a2650f89c7dfc532b38de566a37779e482f07dccabf45fe24444e26" +checksum = "ef492a2d19b6376bb4c9e0c4fab3f3bf8a220ea112d24f35027b737ff55de20c" dependencies = [ "log", "notify-rust", @@ -6082,16 +6493,16 @@ dependencies = [ "serde_repr", "tauri", "tauri-plugin", - "thiserror", + "thiserror 1.0.69", "time", "url", ] [[package]] name = "tauri-plugin-process" -version = "2.0.0-rc.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9eb80b601682dcbd45dc5ed5f7cc214f1d994aeea730d500899cc616784559" +checksum = "ae06a00087c148962a52814a2d7265b1a0505bced5ffb74f8c284a5f96a4d03d" dependencies = [ "tauri", "tauri-plugin", @@ -6099,9 +6510,9 @@ dependencies = [ [[package]] name = "tauri-plugin-shell" -version = "2.0.0-rc.3" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83800ddf78b820172efb5ed7310344e8e4f97fd30cd8237a3f20c12a79eb136" +checksum = "0ad7880c5586b6b2104be451e3d7fc0f3800c84bda69e9ba81c828f87cb34267" dependencies = [ "encoding_rs", "log", @@ -6114,15 +6525,15 @@ dependencies = [ "shared_child", "tauri", "tauri-plugin", - "thiserror", + "thiserror 1.0.69", "tokio", ] [[package]] name = "tauri-plugin-updater" -version = "2.0.0-rc.2" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7048854b4271f3bc58ee850f0582f8d9bb0190118afa8397f36fc260daaa68b" +checksum = "1dd3d2fe0f02bf52eebb5a9d23b987fffac6684646ab6fd683d706dafb18da87" dependencies = [ "base64 0.22.1", "dirs 5.0.1", @@ -6131,6 +6542,7 @@ dependencies = [ "http 1.1.0", "infer", "minisign-verify", + "percent-encoding", "reqwest", "semver 1.0.23", "serde", @@ -6139,7 +6551,7 @@ dependencies = [ "tauri", "tauri-plugin", "tempfile", - "thiserror", + "thiserror 1.0.69", "time", "tokio", "url", @@ -6148,10 +6560,25 @@ dependencies = [ ] [[package]] -name = "tauri-runtime" -version = "2.0.0-rc.7" +name = "tauri-plugin-window-state" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75c72b844f387bfc3341c355f3e16b8cbf4161848fa4e348670effb222cd3ba5" +checksum = "683c8764751fbbcebf3a594bcee24cf84c62773fa0080d1b40fc80698472421e" +dependencies = [ + "bitflags 2.6.0", + "log", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 1.0.69", +] + +[[package]] +name = "tauri-runtime" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cce18d43f80d4aba3aa8a0c953bbe835f3d0f2370aca75e8dbb14bd4bab27958" dependencies = [ "dpi", "gtk", @@ -6161,22 +6588,24 @@ dependencies = [ "serde", "serde_json", "tauri-utils", - "thiserror", + "thiserror 2.0.3", "url", "windows 0.58.0", ] [[package]] name = "tauri-runtime-wry" -version = "2.0.0-rc.7" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73accf936a7cd01d1382de7850726fdf6c1f6ab3b01ccb7a0950cb852e332596" +checksum = "9f442a38863e10129ffe2cec7bd09c2dcf8a098a3a27801a476a304d5bb991d2" dependencies = [ - "cocoa 0.26.0", "gtk", "http 1.1.0", "jni", "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", "percent-encoding", "raw-window-handle 0.6.2", "softbuffer", @@ -6193,9 +6622,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.0.0-rc.7" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53d9fe87e985b273696ae22ce2b9f099a8f1b44bc8fb127467bda5fcb3e4371" +checksum = "9271a88f99b4adea0dc71d0baca4505475a0bbd139fb135f62958721aaa8fe54" dependencies = [ "brotli", "cargo_metadata", @@ -6203,6 +6632,7 @@ dependencies = [ "dunce", "glob", "html5ever", + "http 1.1.0", "infer", "json-patch", "kuchikiki", @@ -6219,10 +6649,11 @@ dependencies = [ "serde_json", "serde_with", "swift-rs", - "thiserror", - "toml 0.8.2", + "thiserror 2.0.3", + "toml 0.8.19", "url", "urlpattern", + "uuid", "walkdir", ] @@ -6249,14 +6680,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.12.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", - "fastrand 2.1.1", + "fastrand 2.2.0", "once_cell", - "rustix 0.38.35", + "rustix 0.38.41", "windows-sys 0.59.0", ] @@ -6318,7 +6749,7 @@ dependencies = [ "signal-hook", "terminfo", "termios", - "thiserror", + "thiserror 1.0.69", "ucd-trie", "unicode-segmentation", "vtparse", @@ -6339,22 +6770,42 @@ checksum = "a38c90d48152c236a3ab59271da4f4ae63d678c5d7ad6b7714d7cb9760be5e4b" [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" +dependencies = [ + "thiserror-impl 2.0.3", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", ] [[package]] @@ -6422,6 +6873,15 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tinystr" version = "0.7.6" @@ -6449,9 +6909,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", @@ -6484,7 +6944,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -6510,9 +6970,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", @@ -6533,9 +6993,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -6558,21 +7018,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.2" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.20.2", + "toml_edit 0.22.22", ] [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] @@ -6583,24 +7043,35 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.20.2" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap 2.6.0", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.6.20", ] [[package]] @@ -6617,7 +7088,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.30", + "hyper 0.14.31", "hyper-timeout", "percent-encoding", "pin-project", @@ -6653,7 +7124,7 @@ dependencies = [ "bytes", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.30", + "hyper 0.14.31", "pin-project", "tokio-stream", "tonic", @@ -6733,7 +7204,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -6777,9 +7248,9 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.16.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "131a65b2cef2081bc14dbcd414c906edbfa3bb5323dd7e748cc298614681196b" +checksum = "7c92af36a182b46206723bdf8a7942e20838cde1cf062e5b97854d57eb01763b" dependencies = [ "core-graphics 0.24.0", "crossbeam-channel", @@ -6792,10 +7263,16 @@ dependencies = [ "once_cell", "png", "serde", - "thiserror", + "thiserror 1.0.69", "windows-sys 0.59.0", ] +[[package]] +name = "trim-in-place" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "343e926fc669bc8cde4fa3129ab681c63671bae288b1f1081ceee6d9d37904fc" + [[package]] name = "try-lock" version = "0.2.5" @@ -6816,7 +7293,7 @@ dependencies = [ "log", "rand 0.8.5", "sha1", - "thiserror", + "thiserror 1.0.69", "url", "utf-8", ] @@ -6844,9 +7321,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uds_windows" @@ -6902,39 +7379,31 @@ dependencies = [ [[package]] name = "unicase" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] [[package]] name = "unsafe-any-ors" @@ -6959,9 +7428,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" dependencies = [ "form_urlencoded", "idna", @@ -6971,11 +7440,10 @@ dependencies = [ [[package]] name = "urlpattern" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9bd5ff03aea02fa45b13a7980151fe45009af1980ba69f651ec367121a31609" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" dependencies = [ - "derive_more", "regex", "serde", "unic-ucd-ident", @@ -7018,11 +7486,12 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom 0.2.15", + "serde", ] [[package]] @@ -7114,7 +7583,7 @@ dependencies = [ "futures-util", "headers", "http 0.2.12", - "hyper 0.14.30", + "hyper 0.14.31", "log", "mime", "mime_guess", @@ -7146,9 +7615,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -7157,24 +7626,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -7184,9 +7653,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7194,28 +7663,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wasm-streams" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -7225,10 +7694,80 @@ dependencies = [ ] [[package]] -name = "web-sys" -version = "0.3.70" +name = "wayland-backend" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" +dependencies = [ + "cc", + "downcast-rs", + "rustix 0.38.41", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" +dependencies = [ + "bitflags 2.6.0", + "rustix 0.38.41", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" +dependencies = [ + "proc-macro2", + "quick-xml 0.36.2", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" +dependencies = [ + "dlib", + "log", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -7280,9 +7819,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.5" +version = "0.26.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bd24728e5af82c6c4ec1b66ac4844bdf8156257fccda846ec58b42cd0cdbe6a" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" dependencies = [ "rustls-pki-types", ] @@ -7309,7 +7848,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -7318,7 +7857,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3a3e2eeb58f82361c93f9777014668eb3d07e7d174ee4c819575a9208011886" dependencies = [ - "thiserror", + "thiserror 1.0.69", "windows 0.58.0", "windows-core 0.58.0", ] @@ -7338,7 +7877,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.35", + "rustix 0.38.41", ] [[package]] @@ -7386,36 +7925,18 @@ dependencies = [ [[package]] name = "window-vibrancy" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8cdd6999298d969289d8078dae02ce798ad23452075985cccba8b6326711ecf" +checksum = "3ea403deff7b51fff19e261330f71608ff2cdef5721d72b64180bb95be7c4150" dependencies = [ - "cocoa 0.26.0", - "objc", + "objc2", + "objc2-app-kit", + "objc2-foundation", "raw-window-handle 0.6.2", "windows-sys 0.59.0", "windows-version", ] -[[package]] -name = "windows" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" -dependencies = [ - "windows-core 0.52.0", - "windows-targets 0.52.6", -] - [[package]] name = "windows" version = "0.56.0" @@ -7426,6 +7947,16 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +dependencies = [ + "windows-core 0.57.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows" version = "0.58.0" @@ -7457,6 +7988,18 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" +dependencies = [ + "windows-implement 0.57.0", + "windows-interface 0.57.0", + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" version = "0.58.0" @@ -7466,7 +8009,7 @@ dependencies = [ "windows-implement 0.58.0", "windows-interface 0.58.0", "windows-result 0.2.0", - "windows-strings", + "windows-strings 0.1.0", "windows-targets 0.52.6", ] @@ -7478,7 +8021,18 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", +] + +[[package]] +name = "windows-implement" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", ] [[package]] @@ -7489,7 +8043,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -7500,7 +8054,18 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", +] + +[[package]] +name = "windows-interface" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", ] [[package]] @@ -7511,7 +8076,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -7521,7 +8086,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ "windows-result 0.2.0", - "windows-strings", + "windows-strings 0.1.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-registry" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bafa604f2104cf5ae2cc2db1dee84b7e6a5d11b05f737b60def0ffdc398cbc0a" +dependencies = [ + "windows-result 0.2.0", + "windows-strings 0.2.0", "windows-targets 0.52.6", ] @@ -7553,6 +8129,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-strings" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978d65aedf914c664c510d9de43c8fd85ca745eaff1ed53edf409b479e441663" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -7785,6 +8370,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.10.1" @@ -7818,14 +8412,13 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wry" -version = "0.42.0" +version = "0.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b8049c8f239cdbfaaea4bacb9646f6b208938ceec0acd5b3e99cd05f70903f" +checksum = "8055a1afbf8c8cbeefbd7ae209b534e92334665460c0b876188c5deb37f3be4d" dependencies = [ "base64 0.22.1", - "block", - "cocoa 0.26.0", - "core-graphics 0.24.0", + "block2", + "cookie", "crossbeam-channel", "dpi", "dunce", @@ -7838,16 +8431,20 @@ dependencies = [ "kuchikiki", "libc", "ndk", - "objc", - "objc_id", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", "once_cell", "percent-encoding", "raw-window-handle 0.6.2", "sha2 0.10.8", "soup3", "tao-macros", - "thiserror", + "thiserror 1.0.69", "tracing", + "url", "webkit2gtk", "webkit2gtk-sys", "webview2-com", @@ -7885,7 +8482,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ "gethostname", - "rustix 0.38.35", + "rustix 0.38.41", "x11rb-protocol", ] @@ -7903,7 +8500,7 @@ checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", "linux-raw-sys 0.4.14", - "rustix 0.38.35", + "rustix 0.38.41", ] [[package]] @@ -7922,6 +8519,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "xml-rs" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af310deaae937e48a26602b730250b4949e125f468f11e6990be3e5304ddd96f" + [[package]] name = "yoke" version = "0.7.4" @@ -7942,62 +8545,104 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", "synstructure", ] [[package]] name = "zbus" -version = "4.0.1" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b8e3d6ae3342792a6cc2340e4394334c7402f3d793b390d2c5494a4032b3030" +checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" dependencies = [ "async-broadcast", "async-executor", "async-fs 2.1.2", - "async-io 2.3.4", + "async-io 2.4.0", "async-lock 3.4.0", - "async-process 2.2.4", + "async-process 2.3.0", "async-recursion", "async-task", "async-trait", "blocking", - "derivative", "enumflags2", - "event-listener 5.3.0", + "event-listener 5.3.1", "futures-core", "futures-sink", "futures-util", "hex", - "nix 0.27.1", + "nix 0.29.0", "ordered-stream", "rand 0.8.5", "serde", "serde_repr", "sha1", "static_assertions", - "tokio", "tracing", "uds_windows", "windows-sys 0.52.0", "xdg-home", - "zbus_macros", - "zbus_names", - "zvariant", + "zbus_macros 4.4.0", + "zbus_names 3.0.0", + "zvariant 4.2.0", +] + +[[package]] +name = "zbus" +version = "5.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1162094dc63b1629fcc44150bcceeaa80798cd28bcbe7fa987b65a034c258608" +dependencies = [ + "async-broadcast", + "async-recursion", + "async-trait", + "enumflags2", + "event-listener 5.3.1", + "futures-core", + "futures-util", + "hex", + "nix 0.29.0", + "ordered-stream", + "serde", + "serde_repr", + "static_assertions", + "tokio", + "tracing", + "uds_windows", + "windows-sys 0.59.0", + "winnow 0.6.20", + "xdg-home", + "zbus_macros 5.1.1", + "zbus_names 4.1.0", + "zvariant 5.1.0", ] [[package]] name = "zbus_macros" -version = "4.0.1" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7a3e850ff1e7217a3b7a07eba90d37fe9bb9e89a310f718afcde5885ca9b6d7" +checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "regex", - "syn 1.0.109", - "zvariant_utils", + "syn 2.0.87", + "zvariant_utils 2.1.0", +] + +[[package]] +name = "zbus_macros" +version = "5.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cd2dcdce3e2727f7d74b7e33b5a89539b3cc31049562137faf7ae4eb86cd16d" +dependencies = [ + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 2.0.87", + "zbus_names 4.1.0", + "zvariant 5.1.0", + "zvariant_utils 3.0.2", ] [[package]] @@ -8008,7 +8653,19 @@ checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" dependencies = [ "serde", "static_assertions", - "zvariant", + "zvariant 4.2.0", +] + +[[package]] +name = "zbus_names" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "856b7a38811f71846fd47856ceee8bccaec8399ff53fb370247e66081ace647b" +dependencies = [ + "serde", + "static_assertions", + "winnow 0.6.20", + "zvariant 5.1.0", ] [[package]] @@ -8029,7 +8686,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -8049,7 +8706,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", "synstructure", ] @@ -8058,6 +8715,20 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] [[package]] name = "zerovec" @@ -8078,7 +8749,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -8087,58 +8758,147 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc5e4288ea4057ae23afc69a4472434a87a2495cafce6632fd1c4ec9f5cf3494" dependencies = [ + "aes", "arbitrary", + "bzip2", + "constant_time_eq", "crc32fast", "crossbeam-utils", + "deflate64", "displaydoc", - "indexmap 2.5.0", + "flate2", + "hmac", + "indexmap 2.6.0", + "lzma-rs", "memchr", - "thiserror", + "pbkdf2", + "rand 0.8.5", + "sha1", + "thiserror 1.0.69", + "time", + "zeroize", + "zopfli", + "zstd", ] [[package]] -name = "zune-inflate" -version = "0.2.54" +name = "zopfli" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" dependencies = [ + "bumpalo", + "crc32fast", + "lockfree-object-pool", + "log", + "once_cell", "simd-adler32", ] [[package]] -name = "zvariant" -version = "4.0.0" +name = "zstd" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e09e8be97d44eeab994d752f341e67b3b0d80512a8b315a0671d47232ef1b65" +checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.13+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "zvariant" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" +dependencies = [ + "endi", + "enumflags2", + "serde", + "static_assertions", + "zvariant_derive 4.2.0", +] + +[[package]] +name = "zvariant" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1200ee6ac32f1e5a312e455a949a4794855515d34f9909f4a3e082d14e1a56f" dependencies = [ "endi", "enumflags2", "serde", "static_assertions", "url", - "zvariant_derive", + "winnow 0.6.20", + "zvariant_derive 5.1.0", + "zvariant_utils 3.0.2", ] [[package]] name = "zvariant_derive" -version = "4.0.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a5857e2856435331636a9fbb415b09243df4521a267c5bedcd5289b4d5799e" +checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 1.0.109", - "zvariant_utils", + "syn 2.0.87", + "zvariant_utils 2.1.0", +] + +[[package]] +name = "zvariant_derive" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687e3b97fae6c9104fbbd36c73d27d149abf04fb874e2efbd84838763daa8916" +dependencies = [ + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 2.0.87", + "zvariant_utils 3.0.2", ] [[package]] name = "zvariant_utils" -version = "1.1.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00bedb16a193cc12451873fee2a1bc6550225acece0e36f333e68326c73c8172" +checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.87", +] + +[[package]] +name = "zvariant_utils" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20d1d011a38f12360e5fcccceeff5e2c42a8eb7f27f0dcba97a0862ede05c9c6" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "static_assertions", + "syn 2.0.87", + "winnow 0.6.20", ] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml old mode 100644 new mode 100755 index f39a2a4d..9caea7c9 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -10,7 +10,7 @@ edition = "2021" build = "build.rs" [build-dependencies] -tauri-build = { version = "2.0.0-rc", features = [] } +tauri-build = { version = "2.0.3", features = [] } [dependencies] warp = "0.3" @@ -22,22 +22,21 @@ dunce = "1.0" log4rs = "1" nanoid = "0.4" chrono = "0.4" -sysinfo = "0.30" -boa_engine = "0.18" +sysinfo = "0.32.0" +boa_engine = "0.19.1" serde_json = "1.0" serde_yaml = "0.9" once_cell = "1.19" port_scanner = "0.1.5" delay_timer = "0.11" parking_lot = "0.12" -auto-launch = "0.5.0" percent-encoding = "2.3.1" window-shadows = { version = "0.2.2" } tokio = { version = "1", features = ["full"] } serde = { version = "1.0", features = ["derive"] } reqwest = { version = "0.12", features = ["json", "rustls-tls"] } -sysproxy = { git = "https://github.com/zzzgydi/sysproxy-rs", branch = "main" } -tauri = { version = "2.0.0-rc", features = [ +sysproxy = { git = "https://github.com/clash-verge-rev/sysproxy-rs", branch = "main" } +tauri = { version = "2.1.1", features = [ "protocol-asset", "devtools", "tray-icon", @@ -45,24 +44,36 @@ tauri = { version = "2.0.0-rc", features = [ "image-png", ] } network-interface = { version = "2.0.0", features = ["serde"] } -tauri-plugin-shell = "2.0.0-rc" -tauri-plugin-dialog = "2.0.0-rc" -tauri-plugin-fs = "2.0.0-rc" -tauri-plugin-notification = "2.0.0-rc" -tauri-plugin-process = "2.0.0-rc" -tauri-plugin-clipboard-manager = "2.1.0-beta.7" +tauri-plugin-shell = "2.0.2" +tauri-plugin-dialog = "2.0.2" +tauri-plugin-fs = "2.0.2" +tauri-plugin-notification = "2.0.1" +tauri-plugin-process = "2.0.1" +tauri-plugin-clipboard-manager = "2.0.1" +tauri-plugin-deep-link = "2.0.1" tauri-plugin-devtools = "2.0.0-rc" +url = "2.5.2" +zip = "2.2.0" +reqwest_dav = "0.1.14" +aes-gcm = { version = "0.10.3", features = ["std"] } +base64 = "0.22.1" +getrandom = "0.2" + [target.'cfg(windows)'.dependencies] runas = "=1.2.0" deelevate = "0.2.0" winreg = "0.52.0" +url = "2.5.2" + [target.'cfg(target_os = "linux")'.dependencies] users = "0.11.0" [target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies] -tauri-plugin-global-shortcut = "2.0.0-rc" -tauri-plugin-updater = "2.0.0-rc" +tauri-plugin-autostart = "2.0.0-rc" +tauri-plugin-global-shortcut = "2.0.1" +tauri-plugin-updater = "2.0.2" +tauri-plugin-window-state = "2.0.2" #openssl [features] @@ -79,3 +90,7 @@ strip = true [profile.dev] incremental = true + +[lib] +name = "app_lib" +crate-type = ["staticlib", "cdylib", "rlib"] diff --git a/src-tauri/Info.plist b/src-tauri/Info.plist deleted file mode 100644 index 954d43a9..00000000 --- a/src-tauri/Info.plist +++ /dev/null @@ -1,17 +0,0 @@ - - - - -CFBundleURLTypes - - - CFBundleURLName - Clash Verge - CFBundleURLSchemes - - clash - - - - - \ No newline at end of file diff --git a/src-tauri/capabilities/desktop.json b/src-tauri/capabilities/desktop.json old mode 100644 new mode 100755 index c4936c0d..b483d98d --- a/src-tauri/capabilities/desktop.json +++ b/src-tauri/capabilities/desktop.json @@ -3,5 +3,12 @@ "platforms": ["macOS", "windows", "linux"], "webviews": ["main"], "windows": ["main"], - "permissions": ["global-shortcut:default", "updater:default"] + "permissions": [ + "global-shortcut:default", + "updater:default", + "deep-link:default", + "window-state:default", + "window-state:default", + "autostart:default" + ] } diff --git a/src-tauri/capabilities/migrated.json b/src-tauri/capabilities/migrated.json index f707b9d6..7cce56b5 100644 --- a/src-tauri/capabilities/migrated.json +++ b/src-tauri/capabilities/migrated.json @@ -11,6 +11,11 @@ "identifier": "fs:scope", "allow": ["$APPDATA/**", "$RESOURCE/../**", "**"] }, + "fs:allow-write-file", + { + "identifier": "fs:scope", + "allow": ["$APPDATA/**", "$RESOURCE/../**", "**"] + }, "core:window:allow-create", "core:window:allow-center", "core:window:allow-request-user-attention", @@ -43,6 +48,13 @@ "core:window:allow-set-cursor-position", "core:window:allow-set-ignore-cursor-events", "core:window:allow-start-dragging", + "core:window:allow-maximize", + "core:window:allow-toggle-maximize", + "core:window:allow-unmaximize", + "core:window:allow-minimize", + "core:window:allow-unminimize", + "core:window:allow-set-maximizable", + "core:window:allow-set-minimizable", "core:webview:allow-print", "shell:allow-execute", "shell:allow-open", diff --git a/src-tauri/template/clash-verge.desktop b/src-tauri/packages/linux/clash-verge.desktop similarity index 100% rename from src-tauri/template/clash-verge.desktop rename to src-tauri/packages/linux/clash-verge.desktop diff --git a/src-tauri/packages/linux/post-install.sh b/src-tauri/packages/linux/post-install.sh new file mode 100644 index 00000000..f398791c --- /dev/null +++ b/src-tauri/packages/linux/post-install.sh @@ -0,0 +1,4 @@ +#!/bin/bash +chmod +x /usr/bin/install-service +chmod +x /usr/bin/uninstall-service +chmod +x /usr/bin/clash-verge-service diff --git a/src-tauri/packages/linux/pre-remove.sh b/src-tauri/packages/linux/pre-remove.sh new file mode 100644 index 00000000..984ffec6 --- /dev/null +++ b/src-tauri/packages/linux/pre-remove.sh @@ -0,0 +1,2 @@ +#!/bin/bash +/usr/bin/uninstall-service diff --git a/src-tauri/template/installer.nsi b/src-tauri/packages/windows/installer.nsi similarity index 96% rename from src-tauri/template/installer.nsi rename to src-tauri/packages/windows/installer.nsi index 6b90a091..17e94bd6 100644 --- a/src-tauri/template/installer.nsi +++ b/src-tauri/packages/windows/installer.nsi @@ -1,5 +1,6 @@ ; This file is copied from https://github.com/tauri-apps/tauri/blob/tauri-v1.5/tooling/bundler/src/bundle/windows/templates/installer.nsi ; and edit to fit the needs of the project. the latest tauri 2.x has a different base nsi script. +RequestExecutionLevel admin Unicode true ; Set the compression algorithm. Default is LZMA. @@ -16,6 +17,8 @@ Unicode true !include "StrFunc.nsh" !include "Win\COM.nsh" !include "Win\Propkey.nsh" +!include "WinVer.nsh" +!include "LogicLib.nsh" !addplugindir "$%AppData%\Local\NSIS\" ${StrCase} ${StrLoc} @@ -688,9 +691,41 @@ SectionEnd app_check_done: !macroend + + +Var VC_REDIST_URL +Var VC_REDIST_EXE + +Section CheckAndInstallVSRuntime + ${If} ${IsNativeARM64} + StrCpy $VC_REDIST_URL "https://aka.ms/vs/17/release/vc_redist.arm64.exe" + StrCpy $VC_REDIST_EXE "vc_redist.arm64.exe" + IfFileExists "$SYSDIR\msvcp140.dll" Done + ${ElseIf} ${RunningX64} + StrCpy $VC_REDIST_URL "https://aka.ms/vs/17/release/vc_redist.x64.exe" + StrCpy $VC_REDIST_EXE "vc_redist.x64.exe" + IfFileExists "$WINDIR\SysWOW64\msvcp140.dll" Done + ${Else} + StrCpy $VC_REDIST_URL "https://aka.ms/vs/17/release/vc_redist.x86.exe" + StrCpy $VC_REDIST_EXE "vc_redist.x86.exe" + IfFileExists "$SYSDIR\msvcp140.dll" Done + ${EndIf} + + ; 下载并安装VC运行库 + nsisdl::download "$VC_REDIST_URL" "$TEMP\$VC_REDIST_EXE" + Pop $0 + ${If} $0 == "success" + nsExec::Exec '"$TEMP\$VC_REDIST_EXE" /quiet /norestart' + ${EndIf} + + Done: +SectionEnd + + + Section Install SetOutPath $INSTDIR - + nsExec::Exec 'netsh int tcp res' !insertmacro CheckIfAppIsRunning !insertmacro CheckAllVergeProcesses ; Copy main executable diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index a560fd80..2a3c4e47 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -2,20 +2,21 @@ use crate::{ config::*, core::*, feat, - utils::{dirs, help, resolve}, + utils::{dirs, help}, }; use crate::{ret_err, wrap_err}; use anyhow::{Context, Result}; use network_interface::NetworkInterface; use serde_yaml::Mapping; -use std::collections::{HashMap, VecDeque}; +use std::collections::HashMap; use sysproxy::{Autoproxy, Sysproxy}; type CmdResult = Result; +use reqwest_dav::list_cmd::ListFile; use tauri::Manager; #[tauri::command] -pub fn copy_clash_env(app_handle: tauri::AppHandle) -> CmdResult { - feat::copy_clash_env(&app_handle); +pub fn copy_clash_env() -> CmdResult { + feat::copy_clash_env(); Ok(()) } @@ -168,8 +169,10 @@ pub async fn patch_clash_config(payload: Mapping) -> CmdResult { } #[tauri::command] -pub fn get_verge_config() -> CmdResult { - Ok(Config::verge().data().clone()) +pub fn get_verge_config() -> CmdResult { + let verge = Config::verge(); + let verge_data = verge.data().clone(); + Ok(IVergeResponse::from(verge_data)) } #[tauri::command] @@ -184,8 +187,8 @@ pub async fn change_clash_core(clash_core: Option) -> CmdResult { /// restart the sidecar #[tauri::command] -pub async fn restart_sidecar() -> CmdResult { - wrap_err!(CoreManager::global().run_core().await) +pub async fn restart_core() -> CmdResult { + wrap_err!(CoreManager::global().restart_core().await) } /// get the system proxy @@ -215,11 +218,6 @@ pub fn get_auto_proxy() -> CmdResult { Ok(map) } -#[tauri::command] -pub fn get_clash_logs() -> CmdResult> { - Ok(logger::Logger::global().get_log()) -} - #[tauri::command] pub fn open_app_dir() -> CmdResult<()> { let app_dir = wrap_err!(dirs::app_home_dir())?; @@ -337,7 +335,7 @@ pub fn get_network_interfaces() -> Vec { for (interface_name, _) in &networks { result.push(interface_name.clone()); } - return result; + result } #[tauri::command] @@ -371,31 +369,52 @@ pub fn open_devtools(app_handle: tauri::AppHandle) { } #[tauri::command] -pub fn exit_app(app_handle: tauri::AppHandle) { - let _ = resolve::save_window_size_position(&app_handle, true); - resolve::resolve_reset(); - app_handle.exit(0); - std::process::exit(0); +pub fn exit_app() { + feat::quit(Some(0)); } -pub mod service { - use super::*; - use crate::core::service; +#[tauri::command] +pub async fn save_webdav_config(url: String, username: String, password: String) -> CmdResult<()> { + let patch = IVerge { + webdav_url: Some(url), + webdav_username: Some(username), + webdav_password: Some(password), + ..IVerge::default() + }; + Config::verge().draft().patch_config(patch.clone()); + Config::verge().apply(); + Config::verge() + .data() + .save_file() + .map_err(|err| err.to_string())?; + backup::WebDavClient::global().reset(); + Ok(()) +} - #[tauri::command] - pub async fn check_service() -> CmdResult { - wrap_err!(service::check_service().await) - } +#[tauri::command] +pub async fn create_webdav_backup() -> CmdResult<()> { + wrap_err!(feat::create_backup_and_upload_webdav().await) +} - #[tauri::command] - pub async fn install_service(passwd: String) -> CmdResult { - wrap_err!(service::install_service(passwd).await) - } +#[tauri::command] +pub async fn list_webdav_backup() -> CmdResult> { + wrap_err!(feat::list_wevdav_backup().await) +} - #[tauri::command] - pub async fn uninstall_service(passwd: String) -> CmdResult { - wrap_err!(service::uninstall_service(passwd).await) - } +#[tauri::command] +pub async fn delete_webdav_backup(filename: String) -> CmdResult<()> { + wrap_err!(feat::delete_webdav_backup(filename).await) +} + +#[tauri::command] +pub async fn restore_webdav_backup(filename: String) -> CmdResult<()> { + wrap_err!(feat::restore_webdav_backup(filename).await) +} + +#[tauri::command] +pub async fn restart_app() -> CmdResult<()> { + feat::restart_app(); + Ok(()) } #[cfg(not(windows))] diff --git a/src-tauri/src/config/clash.rs b/src-tauri/src/config/clash.rs index e1d4aa3e..87a7d2b1 100644 --- a/src-tauri/src/config/clash.rs +++ b/src-tauri/src/config/clash.rs @@ -32,13 +32,12 @@ impl IClashTemp { pub fn template() -> Self { let mut map = Mapping::new(); let mut tun = Mapping::new(); + tun.insert("enable".into(), false.into()); tun.insert("stack".into(), "gvisor".into()); - tun.insert("device".into(), "Mihomo".into()); tun.insert("auto-route".into(), true.into()); tun.insert("strict-route".into(), false.into()); tun.insert("auto-detect-interface".into(), true.into()); tun.insert("dns-hijack".into(), vec!["any:53"].into()); - tun.insert("mtu".into(), 1500.into()); #[cfg(not(target_os = "windows"))] map.insert("redir-port".into(), 7895.into()); #[cfg(target_os = "linux")] @@ -50,9 +49,13 @@ impl IClashTemp { map.insert("allow-lan".into(), false.into()); map.insert("mode".into(), "rule".into()); map.insert("external-controller".into(), "127.0.0.1:9097".into()); + let mut cors_map = Mapping::new(); + cors_map.insert("allow-private-network".into(), true.into()); + cors_map.insert("allow-origins".into(), vec!["*"].into()); map.insert("secret".into(), "".into()); map.insert("tun".into(), tun.into()); - + map.insert("external-controller-cors".into(), cors_map.into()); + map.insert("unified-delay".into(), true.into()); Self(map) } diff --git a/src-tauri/src/config/config.rs b/src-tauri/src/config/config.rs index bc074b2c..edc85faa 100644 --- a/src-tauri/src/config/config.rs +++ b/src-tauri/src/config/config.rs @@ -6,7 +6,7 @@ use crate::{ }; use anyhow::{anyhow, Result}; use once_cell::sync::OnceCell; -use std::{env::temp_dir, path::PathBuf}; +use std::path::PathBuf; pub const RUNTIME_CONFIG: &str = "clash-verge.yaml"; pub const CHECK_CONFIG: &str = "clash-verge-check.yaml"; @@ -85,7 +85,7 @@ impl Config { pub fn generate_file(typ: ConfigType) -> Result { let path = match typ { ConfigType::Run => dirs::app_home_dir()?.join(RUNTIME_CONFIG), - ConfigType::Check => temp_dir().join(CHECK_CONFIG), + ConfigType::Check => dirs::app_home_dir()?.join(CHECK_CONFIG), }; let runtime = Config::runtime(); diff --git a/src-tauri/src/config/encrypt.rs b/src-tauri/src/config/encrypt.rs new file mode 100644 index 00000000..ef475f0e --- /dev/null +++ b/src-tauri/src/config/encrypt.rs @@ -0,0 +1,95 @@ +use crate::utils::dirs::get_encryption_key; +use aes_gcm::{ + aead::{Aead, KeyInit}, + Aes256Gcm, Key, +}; +use base64::{engine::general_purpose::STANDARD, Engine}; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; + +const NONCE_LENGTH: usize = 12; + +/// Encrypt data +pub fn encrypt_data(data: &str) -> Result> { + let encryption_key = get_encryption_key()?; + let key = Key::::from_slice(&encryption_key); + let cipher = Aes256Gcm::new(key); + + // Generate random nonce + let mut nonce = vec![0u8; NONCE_LENGTH]; + getrandom::getrandom(&mut nonce)?; + + // Encrypt data + let ciphertext = cipher + .encrypt(nonce.as_slice().into(), data.as_bytes()) + .map_err(|e| format!("Encryption failed: {}", e))?; + + // Concatenate nonce and ciphertext and encode them in base64 + let mut combined = nonce; + combined.extend(ciphertext); + Ok(STANDARD.encode(combined)) +} + +/// Decrypt data +pub fn decrypt_data(encrypted: &str) -> Result> { + let encryption_key = get_encryption_key()?; + let key = Key::::from_slice(&encryption_key); + let cipher = Aes256Gcm::new(key); + // Decode from base64 + let data = STANDARD.decode(encrypted)?; + if data.len() < NONCE_LENGTH { + return Err("Invalid encrypted data".into()); + } + + // Separate nonce and ciphertext + let (nonce, ciphertext) = data.split_at(NONCE_LENGTH); + + // Decrypt data + let plaintext = cipher + .decrypt(nonce.into(), ciphertext) + .map_err(|e| format!("Decryption failed: {}", e))?; + + String::from_utf8(plaintext).map_err(|e| e.into()) +} + +/// Serialize encrypted function +pub fn serialize_encrypted(value: &T, serializer: S) -> Result +where + T: Serialize, + S: Serializer, +{ + // 如果序列化失败,返回 None + let json = match serde_json::to_string(value) { + Ok(j) => j, + Err(_) => return serializer.serialize_none(), + }; + + // 如果加密失败,返回 None + match encrypt_data(&json) { + Ok(encrypted) => serializer.serialize_str(&encrypted), + Err(_) => serializer.serialize_none(), + } +} + +/// Deserialize decrypted function +pub fn deserialize_encrypted<'a, T, D>(deserializer: D) -> Result +where + T: for<'de> Deserialize<'de> + Default, + D: Deserializer<'a>, +{ + // 如果反序列化字符串失败,返回默认值 + let encrypted = match String::deserialize(deserializer) { + Ok(s) => s, + Err(_) => return Ok(T::default()), + }; + + // 如果解密失败,返回默认值 + let decrypted_string = match decrypt_data(&encrypted) { + Ok(data) => data, + Err(_) => return Ok(T::default()), + }; + // 如果 JSON 解析失败,返回默认值 + match serde_json::from_str(&decrypted_string) { + Ok(value) => Ok(value), + Err(_) => Ok(T::default()), + } +} diff --git a/src-tauri/src/config/mod.rs b/src-tauri/src/config/mod.rs index 2f815800..69b1b123 100644 --- a/src-tauri/src/config/mod.rs +++ b/src-tauri/src/config/mod.rs @@ -2,6 +2,7 @@ mod clash; #[allow(clippy::module_inception)] mod config; mod draft; +mod encrypt; mod prfitem; mod profiles; mod runtime; @@ -10,6 +11,7 @@ mod verge; pub use self::clash::*; pub use self::config::*; pub use self::draft::*; +pub use self::encrypt::*; pub use self::prfitem::*; pub use self::profiles::*; pub use self::runtime::*; diff --git a/src-tauri/src/config/runtime.rs b/src-tauri/src/config/runtime.rs index 892e6be7..66b3fec2 100644 --- a/src-tauri/src/config/runtime.rs +++ b/src-tauri/src/config/runtime.rs @@ -19,27 +19,31 @@ impl IRuntime { // 这里只更改 allow-lan | ipv6 | log-level | tun pub fn patch_config(&mut self, patch: Mapping) { if let Some(config) = self.config.as_mut() { - ["allow-lan", "ipv6", "log-level"] + ["allow-lan", "ipv6", "log-level", "unified-delay"] .into_iter() .for_each(|key| { if let Some(value) = patch.get(key).to_owned() { config.insert(key.into(), value.clone()); } }); - let tun = config.get("tun"); - let mut tun = tun.map_or(Mapping::new(), |val| { - val.as_mapping().cloned().unwrap_or(Mapping::new()) - }); + let patch_tun = patch.get("tun"); - let patch_tun = patch_tun.map_or(Mapping::new(), |val| { - val.as_mapping().cloned().unwrap_or(Mapping::new()) - }); - use_keys(&patch_tun).into_iter().for_each(|key| { - if let Some(value) = patch_tun.get(&key).to_owned() { - tun.insert(key.into(), value.clone()); - } - }); - config.insert("tun".into(), Value::from(tun)); + if patch_tun.is_some() { + let tun = config.get("tun"); + let mut tun = tun.map_or(Mapping::new(), |val| { + val.as_mapping().cloned().unwrap_or(Mapping::new()) + }); + let patch_tun = patch_tun.map_or(Mapping::new(), |val| { + val.as_mapping().cloned().unwrap_or(Mapping::new()) + }); + use_keys(&patch_tun).into_iter().for_each(|key| { + if let Some(value) = patch_tun.get(&key).to_owned() { + tun.insert(key.into(), value.clone()); + } + }); + + config.insert("tun".into(), Value::from(tun)); + } } } } diff --git a/src-tauri/src/config/verge.rs b/src-tauri/src/config/verge.rs index 6086b8ce..596f8c2a 100644 --- a/src-tauri/src/config/verge.rs +++ b/src-tauri/src/config/verge.rs @@ -1,4 +1,5 @@ use crate::config::DEFAULT_PAC; +use crate::config::{deserialize_encrypted, serialize_encrypted}; use crate::utils::{dirs, help}; use anyhow::Result; use log::LevelFilter; @@ -7,9 +8,6 @@ use serde::{Deserialize, Serialize}; /// ### `verge.yaml` schema #[derive(Default, Debug, Clone, Deserialize, Serialize)] pub struct IVerge { - /// app listening port for app singleton - pub app_singleton_port: Option, - /// app log level /// silent | error | warn | info | debug | trace pub app_log_level: Option, @@ -59,10 +57,6 @@ pub struct IVerge { /// clash tun mode pub enable_tun_mode: Option, - /// windows service mode - #[serde(skip_serializing_if = "Option::is_none")] - pub enable_service_mode: Option, - /// can the app auto startup pub enable_auto_launch: Option, @@ -122,21 +116,13 @@ pub struct IVerge { /// proxy 页面布局 列数 pub proxy_layout_column: Option, - /// 测试网站列表 + /// 测试站列表 pub test_list: Option>, /// 日志清理 /// 0: 不清理; 1: 7天; 2: 30天; 3: 90天 pub auto_log_clean: Option, - /// window size and position - #[serde(skip_serializing_if = "Option::is_none")] - pub window_size_position: Option>, - - /// window size and position - #[serde(skip_serializing_if = "Option::is_none")] - pub window_is_maximized: Option, - /// 是否启用随机端口 pub enable_random_port: Option, @@ -162,6 +148,33 @@ pub struct IVerge { pub verge_port: Option, pub verge_http_enabled: Option, + + /// WebDAV 配置 (加密存储) + #[serde( + serialize_with = "serialize_encrypted", + deserialize_with = "deserialize_encrypted", + skip_serializing_if = "Option::is_none", + default + )] + pub webdav_url: Option, + + /// WebDAV 用户名 (加密存储) + #[serde( + serialize_with = "serialize_encrypted", + deserialize_with = "deserialize_encrypted", + skip_serializing_if = "Option::is_none", + default + )] + pub webdav_username: Option, + + /// WebDAV 密码 (加密存储) + #[serde( + serialize_with = "serialize_encrypted", + deserialize_with = "deserialize_encrypted", + skip_serializing_if = "Option::is_none", + default + )] + pub webdav_password: Option, } #[derive(Default, Debug, Clone, Deserialize, Serialize)] @@ -244,6 +257,9 @@ impl IVerge { auto_check_update: Some(true), enable_builtin_enhanced: Some(true), auto_log_clean: Some(3), + webdav_url: None, + webdav_username: None, + webdav_password: None, ..Self::default() } } @@ -282,7 +298,6 @@ impl IVerge { patch!(tun_tray_icon); patch!(enable_tun_mode); - patch!(enable_service_mode); patch!(enable_auto_launch); patch!(enable_silent_start); patch!(enable_random_port); @@ -320,8 +335,10 @@ impl IVerge { patch!(proxy_layout_column); patch!(test_list); patch!(auto_log_clean); - patch!(window_size_position); - patch!(window_is_maximized); + + patch!(webdav_url); + patch!(webdav_username); + patch!(webdav_password); } /// 在初始化前尝试拿到单例端口的值 @@ -330,11 +347,7 @@ impl IVerge { const SERVER_PORT: u16 = 33331; #[cfg(feature = "verge-dev")] const SERVER_PORT: u16 = 11233; - - match dirs::verge_path().and_then(|path| help::read_yaml::(&path)) { - Ok(config) => config.app_singleton_port.unwrap_or(SERVER_PORT), - Err(_) => SERVER_PORT, // 这里就不log错误了 - } + SERVER_PORT } /// 获取日志等级 @@ -354,3 +367,124 @@ impl IVerge { } } } + +#[derive(Debug, Clone, Serialize)] +pub struct IVergeResponse { + pub app_log_level: Option, + pub language: Option, + pub theme_mode: Option, + pub tray_event: Option, + pub env_type: Option, + pub start_page: Option, + pub startup_script: Option, + pub traffic_graph: Option, + pub enable_memory_usage: Option, + pub enable_group_icon: Option, + pub common_tray_icon: Option, + #[cfg(target_os = "macos")] + pub tray_icon: Option, + pub menu_icon: Option, + pub sysproxy_tray_icon: Option, + pub tun_tray_icon: Option, + pub enable_tun_mode: Option, + pub enable_auto_launch: Option, + pub enable_silent_start: Option, + pub enable_system_proxy: Option, + pub enable_proxy_guard: Option, + pub use_default_bypass: Option, + pub system_proxy_bypass: Option, + pub proxy_guard_duration: Option, + pub proxy_auto_config: Option, + pub pac_file_content: Option, + pub theme_setting: Option, + pub web_ui_list: Option>, + pub clash_core: Option, + pub hotkeys: Option>, + pub auto_close_connection: Option, + pub auto_check_update: Option, + pub default_latency_test: Option, + pub default_latency_timeout: Option, + pub enable_builtin_enhanced: Option, + pub proxy_layout_column: Option, + pub test_list: Option>, + pub auto_log_clean: Option, + pub enable_random_port: Option, + #[cfg(not(target_os = "windows"))] + pub verge_redir_port: Option, + #[cfg(not(target_os = "windows"))] + pub verge_redir_enabled: Option, + #[cfg(target_os = "linux")] + pub verge_tproxy_port: Option, + #[cfg(target_os = "linux")] + pub verge_tproxy_enabled: Option, + pub verge_mixed_port: Option, + pub verge_socks_port: Option, + pub verge_socks_enabled: Option, + pub verge_port: Option, + pub verge_http_enabled: Option, + pub webdav_url: Option, + pub webdav_username: Option, + pub webdav_password: Option, +} + +impl From for IVergeResponse { + fn from(verge: IVerge) -> Self { + Self { + app_log_level: verge.app_log_level, + language: verge.language, + theme_mode: verge.theme_mode, + tray_event: verge.tray_event, + env_type: verge.env_type, + start_page: verge.start_page, + startup_script: verge.startup_script, + traffic_graph: verge.traffic_graph, + enable_memory_usage: verge.enable_memory_usage, + enable_group_icon: verge.enable_group_icon, + common_tray_icon: verge.common_tray_icon, + #[cfg(target_os = "macos")] + tray_icon: verge.tray_icon, + menu_icon: verge.menu_icon, + sysproxy_tray_icon: verge.sysproxy_tray_icon, + tun_tray_icon: verge.tun_tray_icon, + enable_tun_mode: verge.enable_tun_mode, + enable_auto_launch: verge.enable_auto_launch, + enable_silent_start: verge.enable_silent_start, + enable_system_proxy: verge.enable_system_proxy, + enable_proxy_guard: verge.enable_proxy_guard, + use_default_bypass: verge.use_default_bypass, + system_proxy_bypass: verge.system_proxy_bypass, + proxy_guard_duration: verge.proxy_guard_duration, + proxy_auto_config: verge.proxy_auto_config, + pac_file_content: verge.pac_file_content, + theme_setting: verge.theme_setting, + web_ui_list: verge.web_ui_list, + clash_core: verge.clash_core, + hotkeys: verge.hotkeys, + auto_close_connection: verge.auto_close_connection, + auto_check_update: verge.auto_check_update, + default_latency_test: verge.default_latency_test, + default_latency_timeout: verge.default_latency_timeout, + enable_builtin_enhanced: verge.enable_builtin_enhanced, + proxy_layout_column: verge.proxy_layout_column, + test_list: verge.test_list, + auto_log_clean: verge.auto_log_clean, + enable_random_port: verge.enable_random_port, + #[cfg(not(target_os = "windows"))] + verge_redir_port: verge.verge_redir_port, + #[cfg(not(target_os = "windows"))] + verge_redir_enabled: verge.verge_redir_enabled, + #[cfg(target_os = "linux")] + verge_tproxy_port: verge.verge_tproxy_port, + #[cfg(target_os = "linux")] + verge_tproxy_enabled: verge.verge_tproxy_enabled, + verge_mixed_port: verge.verge_mixed_port, + verge_socks_port: verge.verge_socks_port, + verge_socks_enabled: verge.verge_socks_enabled, + verge_port: verge.verge_port, + verge_http_enabled: verge.verge_http_enabled, + webdav_url: verge.webdav_url, + webdav_username: verge.webdav_username, + webdav_password: verge.webdav_password, + } + } +} diff --git a/src-tauri/src/core/backup.rs b/src-tauri/src/core/backup.rs new file mode 100644 index 00000000..f41e9b5c --- /dev/null +++ b/src-tauri/src/core/backup.rs @@ -0,0 +1,156 @@ +use crate::config::Config; +use crate::utils::dirs; +use anyhow::Error; +use once_cell::sync::OnceCell; +use parking_lot::Mutex; +use reqwest_dav::list_cmd::{ListEntity, ListFile}; +use std::env::{consts::OS, temp_dir}; +use std::fs; +use std::io::Write; +use std::path::PathBuf; +use std::sync::Arc; +use zip::write::SimpleFileOptions; + +pub struct WebDavClient { + client: Arc>>, +} + +impl WebDavClient { + pub fn global() -> &'static WebDavClient { + static WEBDAV_CLIENT: OnceCell = OnceCell::new(); + WEBDAV_CLIENT.get_or_init(|| WebDavClient { + client: Arc::new(Mutex::new(None)), + }) + } + + async fn get_client(&self) -> Result { + if self.client.lock().is_none() { + let verge = Config::verge().latest().clone(); + if verge.webdav_url.is_none() + || verge.webdav_username.is_none() + || verge.webdav_password.is_none() + { + let msg = + "Unable to create web dav client, please make sure the webdav config is correct" + .to_string(); + log::error!(target: "app","{}",msg); + return Err(anyhow::Error::msg(msg)); + } + + let url = verge.webdav_url.unwrap_or_default(); + let username = verge.webdav_username.unwrap_or_default(); + let password = verge.webdav_password.unwrap_or_default(); + let url = url.trim_end_matches('/'); + let client = reqwest_dav::ClientBuilder::new() + .set_agent( + reqwest::Client::builder() + .danger_accept_invalid_certs(true) + .timeout(std::time::Duration::from_secs(3)) + .build() + .unwrap(), + ) + .set_host(url.to_owned()) + .set_auth(reqwest_dav::Auth::Basic( + username.to_owned(), + password.to_owned(), + )) + .build()?; + + if (client + .list(dirs::BACKUP_DIR, reqwest_dav::Depth::Number(0)) + .await) + .is_err() + { + client.mkcol(dirs::BACKUP_DIR).await?; + } + + *self.client.lock() = Some(client.clone()); + } + Ok(self.client.lock().clone().unwrap()) + } + + pub fn reset(&self) { + if !self.client.lock().is_none() { + self.client.lock().take(); + } + } + + pub async fn upload(&self, file_path: PathBuf, file_name: String) -> Result<(), Error> { + let client = self.get_client().await?; + let webdav_path: String = format!("{}/{}", dirs::BACKUP_DIR, file_name); + client + .put(webdav_path.as_ref(), fs::read(file_path)?) + .await?; + Ok(()) + } + + pub async fn download(&self, filename: String, storage_path: PathBuf) -> Result<(), Error> { + let client = self.get_client().await?; + let path = format!("{}/{}", dirs::BACKUP_DIR, filename); + let response = client.get(path.as_str()).await?; + let content = response.bytes().await?; + fs::write(&storage_path, &content)?; + Ok(()) + } + + pub async fn list(&self) -> Result, Error> { + let client = self.get_client().await?; + let path = format!("{}/", dirs::BACKUP_DIR); + let files = client + .list(path.as_str(), reqwest_dav::Depth::Number(1)) + .await?; + let mut final_files = Vec::new(); + for file in files { + if let ListEntity::File(file) = file { + final_files.push(file); + } + } + Ok(final_files) + } + + pub async fn delete(&self, file_name: String) -> Result<(), Error> { + let client = self.get_client().await?; + let path = format!("{}/{}", dirs::BACKUP_DIR, file_name); + client.delete(&path).await?; + Ok(()) + } +} + +pub fn create_backup() -> Result<(String, PathBuf), Error> { + let now = chrono::Local::now().format("%Y-%m-%d_%H-%M-%S").to_string(); + let zip_file_name = format!("{}-backup-{}.zip", OS, now); + let zip_path = temp_dir().join(&zip_file_name); + + let file = fs::File::create(&zip_path)?; + let mut zip = zip::ZipWriter::new(file); + zip.add_directory("profiles/", SimpleFileOptions::default())?; + let options = SimpleFileOptions::default().compression_method(zip::CompressionMethod::Stored); + if let Ok(entries) = fs::read_dir(dirs::app_profiles_dir()?) { + for entry in entries { + let entry = entry.unwrap(); + let path = entry.path(); + if path.is_file() { + let backup_path = format!("profiles/{}", entry.file_name().to_str().unwrap()); + zip.start_file(backup_path, options)?; + zip.write_all(fs::read(path).unwrap().as_slice())?; + } + } + } + zip.start_file(dirs::CLASH_CONFIG, options)?; + zip.write_all(fs::read(dirs::clash_path()?)?.as_slice())?; + + let mut verge_config: serde_json::Value = + serde_yaml::from_str(&fs::read_to_string(dirs::verge_path()?)?)?; + if let Some(obj) = verge_config.as_object_mut() { + obj.remove("webdav_username"); + obj.remove("webdav_password"); + obj.remove("webdav_url"); + } + zip.start_file(dirs::VERGE_CONFIG, options)?; + zip.write_all(serde_yaml::to_string(&verge_config)?.as_bytes())?; + + zip.start_file(dirs::PROFILE_YAML, options)?; + zip.write_all(fs::read(dirs::profiles_path()?)?.as_slice())?; + zip.finish()?; + Ok((zip_file_name, zip_path)) +} diff --git a/src-tauri/src/core/clash_api.rs b/src-tauri/src/core/clash_api.rs index 67fc112d..8d114676 100644 --- a/src-tauri/src/core/clash_api.rs +++ b/src-tauri/src/core/clash_api.rs @@ -9,7 +9,7 @@ use std::collections::HashMap; /// path 是绝对路径 pub async fn put_configs(path: &str) -> Result<()> { let (url, headers) = clash_client_info()?; - let url = format!("{url}/configs"); + let url = format!("{url}/configs?force=true"); let mut data = HashMap::new(); data.insert("path", path); @@ -52,7 +52,7 @@ pub async fn get_proxy_delay( let (url, headers) = clash_client_info()?; let url = format!("{url}/proxies/{name}/delay"); - let default_url = "http://1.1.1.1"; + let default_url = "http://cp.cloudflare.com/generate_204"; let test_url = test_url .map(|s| if s.is_empty() { default_url.into() } else { s }) .unwrap_or(default_url.into()); @@ -96,8 +96,7 @@ pub fn parse_log(log: String) -> String { log } -/// 缩短clash -t的错误输出 -/// 仅适配 clash p核 8-26、clash meta 1.13.1 +#[allow(dead_code)] pub fn parse_check_output(log: String) -> String { let t = log.find("time="); let m = log.find("msg="); @@ -127,7 +126,7 @@ pub fn parse_check_output(log: String) -> String { #[test] fn test_parse_check_output() { let str1 = r#"xxxx\n time="2022-11-18T20:42:58+08:00" level=error msg="proxy 0: 'alpn' expected type 'string', got unconvertible type '[]interface {}'""#; - let str2 = r#"20:43:49 ERR [Config] configuration file test failed error=proxy 0: unsupport proxy type: hysteria path=xxx"#; + //let str2 = r#"20:43:49 ERR [Config] configuration file test failed error=proxy 0: unsupport proxy type: hysteria path=xxx"#; let str3 = r#" "time="2022-11-18T21:38:01+08:00" level=info msg="Start initial configuration in progress" time="2022-11-18T21:38:01+08:00" level=error msg="proxy 0: 'alpn' expected type 'string', got unconvertible type '[]interface {}'" @@ -135,12 +134,8 @@ fn test_parse_check_output() { "#; let res1 = parse_check_output(str1.into()); - let res2 = parse_check_output(str2.into()); + // let res2 = parse_check_output(str2.into()); let res3 = parse_check_output(str3.into()); - println!("res1: {res1}"); - println!("res2: {res2}"); - println!("res3: {res3}"); - assert_eq!(res1, res3); } diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index 09d12702..ae3d71d3 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -1,47 +1,33 @@ use crate::config::*; -use crate::core::{clash_api, handle, logger::Logger, service}; +use crate::core::{clash_api, handle, service}; use crate::log_err; use crate::utils::dirs; -use anyhow::{bail, Context, Result}; +use anyhow::{bail, Result}; use once_cell::sync::OnceCell; -use parking_lot::Mutex; use serde_yaml::Mapping; -use std::{fs, io::Write, sync::Arc, time::Duration}; -use sysinfo::{ProcessRefreshKind, RefreshKind, System}; -use tauri::AppHandle; -use tauri_plugin_shell::process::{CommandChild, CommandEvent}; +use std::{sync::Arc, time::Duration}; use tauri_plugin_shell::ShellExt; - +use tokio::sync::Mutex; use tokio::time::sleep; #[derive(Debug)] pub struct CoreManager { - app_handle: Arc>>, - sidecar: Arc>>, - #[allow(unused)] - use_service_mode: Arc>, + running: Arc>, } impl CoreManager { pub fn global() -> &'static CoreManager { static CORE_MANAGER: OnceCell = OnceCell::new(); - CORE_MANAGER.get_or_init(|| CoreManager { - app_handle: Arc::new(Mutex::new(None)), - sidecar: Arc::new(Mutex::new(None)), - use_service_mode: Arc::new(Mutex::new(false)), + running: Arc::new(Mutex::new(false)), }) } - pub fn init(&self, app_handle: &AppHandle) -> Result<()> { - *self.app_handle.lock() = Some(app_handle.clone()); - tauri::async_runtime::spawn(async { - log::trace!("run core start"); - // 启动clash - log_err!(Self::global().run_core().await); - log::trace!("run core end"); - }); - + pub async fn init(&self) -> Result<()> { + log::trace!("run core start"); + // 启动clash + log_err!(Self::global().start_core().await); + log::trace!("run core end"); Ok(()) } @@ -51,241 +37,76 @@ impl CoreManager { let config_path = dirs::path_to_str(&config_path)?; let clash_core = { Config::verge().latest().clash_core.clone() }; - let mut clash_core = clash_core.unwrap_or("verge-mihomo".into()); - - // compatibility - if clash_core.contains("clash") { - clash_core = "verge-mihomo".to_string(); - Config::verge().draft().patch_config(IVerge { - clash_core: Some("verge-mihomo".to_string()), - ..IVerge::default() - }); - Config::verge().apply(); - match Config::verge().data().save_file() { - Ok(_) => handle::Handle::refresh_verge(), - Err(err) => log::error!(target: "app", "{err}"), - } - } + let clash_core = clash_core.unwrap_or("verge-mihomo".into()); let test_dir = dirs::app_home_dir()?.join("test"); let test_dir = dirs::path_to_str(&test_dir)?; - let app_handle_option = { - let lock = self.app_handle.lock(); - lock.as_ref().cloned() - }; + let app_handle = handle::Handle::global().app_handle().unwrap(); - if let Some(app_handle) = app_handle_option { - let output = app_handle - .shell() - .sidecar(clash_core)? - .args(["-t", "-d", test_dir, "-f", config_path]) - .output() - .await?; - - if !output.status.success() { - let stdout = String::from_utf8(output.stdout).unwrap_or_default(); - let error = clash_api::parse_check_output(stdout.clone()); - let error = match !error.is_empty() { - true => error, - false => stdout.clone(), - }; - Logger::global().set_log(stdout.clone()); - bail!("{error}"); - } - } - - Ok(()) - } - - /// 启动核心 - pub async fn run_core(&self) -> Result<()> { - let config_path = Config::generate_file(ConfigType::Run)?; - - // 关闭tun模式 - let mut disable = Mapping::new(); - let mut tun = Mapping::new(); - tun.insert("enable".into(), false.into()); - disable.insert("tun".into(), tun.into()); - log::debug!(target: "app", "disable tun mode"); - let _ = clash_api::patch_configs(&disable).await; - - if *self.use_service_mode.lock() { - log::debug!(target: "app", "stop the core by service"); - log_err!(service::stop_core_by_service().await); - } else { - let system = System::new_with_specifics( - RefreshKind::new().with_processes(ProcessRefreshKind::everything()), - ); - let procs = system.processes_by_name("verge-mihomo"); - - for proc in procs { - log::debug!(target: "app", "kill all clash process"); - proc.kill(); - } - } - - // 服务模式 - let enable = { Config::verge().latest().enable_service_mode }; - let enable = enable.unwrap_or(false); - - *self.use_service_mode.lock() = enable; - - if enable { - // 服务模式启动失败就直接运行sidecar - log::debug!(target: "app", "try to run core in service mode"); - - let res = async { - service::check_service().await?; - service::run_core_by_service(&config_path).await - } - .await; - match res { - Ok(_) => return Ok(()), - Err(err) => { - // 修改这个值,免得stop出错 - *self.use_service_mode.lock() = false; - log::error!(target: "app", "{err}"); - } - } - } - - let app_dir = dirs::app_home_dir()?; - let app_dir = dirs::path_to_str(&app_dir)?; - - let clash_core = { Config::verge().latest().clash_core.clone() }; - let mut clash_core = clash_core.unwrap_or("verge-mihomo".into()); - - // compatibility - if clash_core.contains("clash") { - clash_core = "verge-mihomo".to_string(); - Config::verge().draft().patch_config(IVerge { - clash_core: Some("verge-mihomo".to_string()), - ..IVerge::default() - }); - Config::verge().apply(); - match Config::verge().data().save_file() { - Ok(_) => handle::Handle::refresh_verge(), - Err(err) => log::error!(target: "app", "{err}"), - } - } - - let config_path = dirs::path_to_str(&config_path)?; - - let args = vec!["-d", app_dir, "-f", config_path]; - - let app_handle = self.app_handle.lock(); - - if let Some(app_handle) = app_handle.as_ref() { - let cmd = app_handle.shell().sidecar(clash_core)?; - let (mut rx, cmd_child) = cmd.args(args).spawn()?; - - // 将pid写入文件中 - crate::log_err!((|| { - let pid = cmd_child.pid(); - let path = dirs::clash_pid_path()?; - fs::File::create(path) - .context("failed to create the pid file")? - .write(format!("{pid}").as_bytes()) - .context("failed to write pid to the file")?; - >::Ok(()) - })()); - - let mut sidecar = self.sidecar.lock(); - *sidecar = Some(cmd_child); - drop(sidecar); - - tauri::async_runtime::spawn(async move { - while let Some(event) = rx.recv().await { - match event { - CommandEvent::Stdout(line) => { - let line = String::from_utf8(line).unwrap_or_default(); - log::info!(target: "app", "[mihomo]: {line}"); - Logger::global().set_log(line); - } - CommandEvent::Stderr(err) => { - let err = String::from_utf8(err).unwrap_or_default(); - log::error!(target: "app", "[mihomo]: {err}"); - Logger::global().set_log(err); - } - CommandEvent::Error(err) => { - log::error!(target: "app", "[mihomo]: {err}"); - Logger::global().set_log(err); - } - CommandEvent::Terminated(_) => { - log::info!(target: "app", "mihomo core terminated"); - let _ = CoreManager::global().recover_core(); - break; - } - _ => {} - } - } - }); - } - - Ok(()) - } - - /// 重启内核 - pub fn recover_core(&'static self) -> Result<()> { - // 服务模式不管 - if *self.use_service_mode.lock() { - return Ok(()); - } - - // 清空原来的sidecar值 - let _ = self.sidecar.lock().take(); - - tauri::async_runtime::spawn(async move { - // 6秒之后再查看服务是否正常 (时间随便搞的) - // terminated 可能是切换内核 (切换内核已经有500ms的延迟) - sleep(Duration::from_millis(6666)).await; - - if self.sidecar.lock().is_none() { - log::info!(target: "app", "recover clash core"); - - // 重新启动app - if let Err(err) = self.run_core().await { - log::error!(target: "app", "failed to recover clash core"); - log::error!(target: "app", "{err}"); - - let _ = self.recover_core(); - } - } - }); + let _ = app_handle + .shell() + .sidecar(clash_core)? + .args(["-t", "-d", test_dir, "-f", config_path]) + .output() + .await?; Ok(()) } /// 停止核心运行 pub async fn stop_core(&self) -> Result<()> { + let mut running = self.running.lock().await; + + if !*running { + log::debug!("core is not running"); + return Ok(()); + } + // 关闭tun模式 let mut disable = Mapping::new(); let mut tun = Mapping::new(); tun.insert("enable".into(), false.into()); disable.insert("tun".into(), tun.into()); log::debug!(target: "app", "disable tun mode"); - let _ = clash_api::patch_configs(&disable).await; + log_err!(clash_api::patch_configs(&disable).await); - if *self.use_service_mode.lock() { - log::debug!(target: "app", "stop the core by service"); - log_err!(service::stop_core_by_service().await); + // 服务模式 + if service::check_service().await.is_ok() { + log::info!(target: "app", "stop the core by service"); + service::stop_core_by_service().await?; + } + *running = false; + + Ok(()) + } + + /// 启动核心 + pub async fn start_core(&self) -> Result<()> { + let mut running = self.running.lock().await; + if *running { + log::info!("core is running"); return Ok(()); } - let mut sidecar = self.sidecar.lock(); - let _ = sidecar.take(); + let config_path = Config::generate_file(ConfigType::Run)?; - let system = System::new_with_specifics( - RefreshKind::new().with_processes(ProcessRefreshKind::everything()), - ); - let procs = system.processes_by_name("verge-mihomo"); - for proc in procs { - log::debug!(target: "app", "kill all clash process"); - proc.kill(); + // 服务模式 + if service::check_service().await.is_ok() { + log::info!(target: "app", "try to run core in service mode"); + service::run_core_by_service(&config_path).await?; + *running = true; } Ok(()) } + /// 重启内核 + pub async fn restart_core(&self) -> Result<()> { + // 重新启动app + self.stop_core().await?; + self.start_core().await?; + Ok(()) + } + /// 切换核心 pub async fn change_core(&self, clash_core: Option) -> Result<()> { let clash_core = clash_core.ok_or(anyhow::anyhow!("clash core is null"))?; @@ -295,7 +116,7 @@ impl CoreManager { bail!("invalid clash core name \"{clash_core}\""); } - log::debug!(target: "app", "change core to `{clash_core}`"); + log::info!(target: "app", "change core to `{clash_core}`"); Config::verge().draft().clash_core = Some(clash_core); @@ -304,10 +125,7 @@ impl CoreManager { self.check_config().await?; - // 清掉旧日志 - Logger::global().clear_log(); - - match self.run_core().await { + match self.restart_core().await { Ok(_) => { Config::verge().apply(); Config::runtime().apply(); diff --git a/src-tauri/src/core/handle.rs b/src-tauri/src/core/handle.rs index 614356cc..2bb51cc9 100644 --- a/src-tauri/src/core/handle.rs +++ b/src-tauri/src/core/handle.rs @@ -1,14 +1,15 @@ use super::tray::Tray; use crate::log_err; -use anyhow::{bail, Result}; +use anyhow::Result; use once_cell::sync::OnceCell; -use parking_lot::Mutex; +use parking_lot::RwLock; use std::sync::Arc; -use tauri::{AppHandle, WebviewWindow, Manager, Emitter}; +use tauri::{AppHandle, Emitter, Manager, WebviewWindow}; #[derive(Debug, Default, Clone)] pub struct Handle { - pub app_handle: Arc>>, + pub app_handle: Arc>>, + pub is_exiting: Arc>, } impl Handle { @@ -16,19 +17,27 @@ impl Handle { static HANDLE: OnceCell = OnceCell::new(); HANDLE.get_or_init(|| Handle { - app_handle: Arc::new(Mutex::new(None)), + app_handle: Arc::new(RwLock::new(None)), + is_exiting: Arc::new(RwLock::new(false)), }) } pub fn init(&self, app_handle: &AppHandle) { - *self.app_handle.lock() = Some(app_handle.clone()); + let mut handle = self.app_handle.write(); + *handle = Some(app_handle.clone()); + } + + pub fn app_handle(&self) -> Option { + self.app_handle.read().clone() } pub fn get_window(&self) -> Option { - self.app_handle - .lock() - .as_ref() - .and_then(|a| a.get_webview_window("main")) + let app_handle = self.app_handle().unwrap(); + let window: Option = app_handle.get_webview_window("main"); + if window.is_none() { + log::debug!(target:"app", "main window not found"); + } + window } pub fn refresh_clash() { @@ -56,22 +65,18 @@ impl Handle { } } - pub fn update_systray() -> Result<()> { - let app_handle = Self::global().app_handle.lock(); - if app_handle.is_none() { - bail!("update_systray unhandled error"); - } - Tray::update_systray(app_handle.as_ref().unwrap())?; + /// update the system tray state + pub fn update_systray_part() -> Result<()> { + Tray::update_part()?; Ok(()) } - /// update the system tray state - pub fn update_systray_part() -> Result<()> { - let app_handle = Self::global().app_handle.lock(); - if app_handle.is_none() { - bail!("update_systray unhandled error"); - } - Tray::update_part(app_handle.as_ref().unwrap())?; - Ok(()) + pub fn set_is_exiting(&self) { + let mut is_exiting = self.is_exiting.write(); + *is_exiting = true; + } + + pub fn is_exiting(&self) -> bool { + *self.is_exiting.read() } } diff --git a/src-tauri/src/core/hotkey.rs b/src-tauri/src/core/hotkey.rs old mode 100644 new mode 100755 index e53fdffc..de2d764c --- a/src-tauri/src/core/hotkey.rs +++ b/src-tauri/src/core/hotkey.rs @@ -1,14 +1,13 @@ +use crate::core::handle; use crate::{config::Config, feat, log_err}; use anyhow::{bail, Result}; use once_cell::sync::OnceCell; use parking_lot::Mutex; use std::{collections::HashMap, sync::Arc}; -use tauri::AppHandle; -use tauri_plugin_global_shortcut::GlobalShortcutExt; - +use tauri::Manager; +use tauri_plugin_global_shortcut::{Code, GlobalShortcutExt, ShortcutState}; pub struct Hotkey { current: Arc>>, // 保存当前的热键设置 - app_handle: Arc>>, } impl Hotkey { @@ -17,12 +16,10 @@ impl Hotkey { HOTKEY.get_or_init(|| Hotkey { current: Arc::new(Mutex::new(Vec::new())), - app_handle: Arc::new(Mutex::new(None)), }) } - pub fn init(&self, app_handle: &AppHandle) -> Result<()> { - *self.app_handle.lock() = Some(app_handle.clone()); + pub fn init(&self) -> Result<()> { let verge = Config::verge(); if let Some(hotkeys) = verge.latest().hotkeys.as_ref() { @@ -48,12 +45,9 @@ impl Hotkey { Ok(()) } - fn register(&self, hotkey: &str, func: &str) -> Result<()> { - let app_handle = self.app_handle.lock(); - if app_handle.is_none() { - bail!("failed to get the hotkey manager"); - } - let manager = app_handle.as_ref().unwrap().global_shortcut(); + pub fn register(&self, hotkey: &str, func: &str) -> Result<()> { + let app_handle = handle::Handle::global().app_handle().unwrap(); + let manager = app_handle.global_shortcut(); if manager.is_registered(hotkey) { manager.unregister(hotkey)?; @@ -66,23 +60,35 @@ impl Hotkey { "clash_mode_direct" => || feat::change_clash_mode("direct".into()), "toggle_system_proxy" => feat::toggle_system_proxy, "toggle_tun_mode" => feat::toggle_tun_mode, + "quit" => || feat::quit(Some(0)), + _ => bail!("invalid function \"{func}\""), }; - let _ = manager.on_shortcut(hotkey, move |_, _, _| f()); - log::info!(target: "app", "register hotkey {hotkey} {func}"); + let _ = manager.on_shortcut(hotkey, move |app_handle, hotkey, event| { + if event.state == ShortcutState::Pressed { + if hotkey.key == Code::KeyQ { + if let Some(window) = app_handle.get_webview_window("main") { + if window.is_focused().unwrap_or(false) { + f(); + } + } + } else { + f(); + } + } + }); + + log::debug!(target: "app", "register hotkey {hotkey} {func}"); Ok(()) } - fn unregister(&self, hotkey: &str) -> Result<()> { - let app_handle = self.app_handle.lock(); - if app_handle.is_none() { - bail!("failed to get the hotkey manager"); - } - let manager = app_handle.as_ref().unwrap().global_shortcut(); + pub fn unregister(&self, hotkey: &str) -> Result<()> { + let app_handle = handle::Handle::global().app_handle().unwrap(); + let manager = app_handle.global_shortcut(); manager.unregister(hotkey)?; - log::info!(target: "app", "unregister hotkey {hotkey}"); + log::debug!(target: "app", "unregister hotkey {hotkey}"); Ok(()) } @@ -105,7 +111,7 @@ impl Hotkey { Ok(()) } - fn get_map_from_vec(hotkeys: &Vec) -> HashMap<&str, &str> { + fn get_map_from_vec(hotkeys: &[String]) -> HashMap<&str, &str> { let mut map = HashMap::new(); hotkeys.iter().for_each(|hotkey| { @@ -153,10 +159,9 @@ impl Hotkey { impl Drop for Hotkey { fn drop(&mut self) { - if let Some(app_handle) = self.app_handle.lock().as_ref() { - if let Err(e) = app_handle.global_shortcut().unregister_all() { - log::error!("Error unregistering all hotkeys: {:?}", e); - } + let app_handle = handle::Handle::global().app_handle().unwrap(); + if let Err(e) = app_handle.global_shortcut().unregister_all() { + log::error!(target:"app", "Error unregistering all hotkeys: {:?}", e); } } } diff --git a/src-tauri/src/core/logger.rs b/src-tauri/src/core/logger.rs deleted file mode 100644 index b4264153..00000000 --- a/src-tauri/src/core/logger.rs +++ /dev/null @@ -1,36 +0,0 @@ -use once_cell::sync::OnceCell; -use parking_lot::Mutex; -use std::{collections::VecDeque, sync::Arc}; - -const LOGS_QUEUE_LEN: usize = 100; - -pub struct Logger { - log_data: Arc>>, -} - -impl Logger { - pub fn global() -> &'static Logger { - static LOGGER: OnceCell = OnceCell::new(); - - LOGGER.get_or_init(|| Logger { - log_data: Arc::new(Mutex::new(VecDeque::with_capacity(LOGS_QUEUE_LEN + 10))), - }) - } - - pub fn get_log(&self) -> VecDeque { - self.log_data.lock().clone() - } - - pub fn set_log(&self, text: String) { - let mut logs = self.log_data.lock(); - if logs.len() > LOGS_QUEUE_LEN { - logs.pop_front(); - } - logs.push_back(text); - } - - pub fn clear_log(&self) { - let mut logs = self.log_data.lock(); - logs.clear(); - } -} diff --git a/src-tauri/src/core/mod.rs b/src-tauri/src/core/mod.rs index 52e8f277..098052b9 100644 --- a/src-tauri/src/core/mod.rs +++ b/src-tauri/src/core/mod.rs @@ -1,9 +1,9 @@ +pub mod backup; pub mod clash_api; #[allow(clippy::module_inception)] mod core; pub mod handle; pub mod hotkey; -pub mod logger; pub mod service; pub mod sysopt; pub mod timer; diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index 3a06648f..d4d5a93a 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -1,13 +1,11 @@ -use crate::config::{Config, IVerge}; -use crate::core::handle; +use crate::config::Config; use crate::utils::dirs; use anyhow::{bail, Context, Result}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::path::PathBuf; -use std::time::Duration; use std::{env::current_exe, process::Command as StdCommand}; -use tokio::time::sleep; +use tokio::time::Duration; // Windows only @@ -28,32 +26,34 @@ pub struct JsonResponse { pub data: Option, } -#[cfg(not(target_os = "windows"))] -pub fn sudo(passwd: &String, cmd: String) -> StdCommand { - let shell = format!("echo \"{}\" | sudo -S {}", passwd, cmd); - let mut command = StdCommand::new("bash"); - command.arg("-c").arg(shell); - command -} - -/// Install the Clash Verge Service -/// 该函数应该在协程或者线程中执行,避免UAC弹窗阻塞主线程 -/// #[cfg(target_os = "windows")] -pub async fn install_service(_passwd: String) -> Result<()> { +pub async fn reinstall_service() -> Result<()> { + log::info!(target:"app", "reinstall service"); + use deelevate::{PrivilegeLevel, Token}; use runas::Command as RunasCommand; use std::os::windows::process::CommandExt; let binary_path = dirs::service_path()?; let install_path = binary_path.with_file_name("install-service.exe"); + let uninstall_path = binary_path.with_file_name("uninstall-service.exe"); if !install_path.exists() { - bail!("installer exe not found"); + bail!(format!("installer not found: {install_path:?}")); + } + + if !uninstall_path.exists() { + bail!(format!("uninstaller not found: {uninstall_path:?}")); } let token = Token::with_current_process()?; let level = token.privilege_level()?; + let _ = match level { + PrivilegeLevel::NotPrivileged => RunasCommand::new(uninstall_path).show(false).status()?, + _ => StdCommand::new(uninstall_path) + .creation_flags(0x08000000) + .status()?, + }; let status = match level { PrivilegeLevel::NotPrivileged => RunasCommand::new(install_path).show(false).status()?, @@ -73,111 +73,48 @@ pub async fn install_service(_passwd: String) -> Result<()> { } #[cfg(target_os = "linux")] -pub async fn install_service(passwd: String) -> Result<()> { +pub async fn reinstall_service() -> Result<()> { + log::info!(target:"app", "reinstall service"); use users::get_effective_uid; - let binary_path = dirs::service_path()?; - let installer_path = binary_path.with_file_name("install-service"); - if !installer_path.exists() { - bail!("installer not found"); + let install_path = tauri::utils::platform::current_exe()?.with_file_name("install-service"); + + let uninstall_path = tauri::utils::platform::current_exe()?.with_file_name("uninstall-service"); + + if !install_path.exists() { + bail!(format!("installer not found: {install_path:?}")); } - let output = match get_effective_uid() { - 0 => { - StdCommand::new("chmod") - .arg("+x") - .arg(installer_path.clone()) - .output()?; - StdCommand::new("chmod") - .arg("+x") - .arg(binary_path) - .output()?; - StdCommand::new(installer_path.clone()).output()? - } - _ => { - sudo( - &passwd, - format!("chmod +x {}", installer_path.to_string_lossy()), - ) - .output()?; - sudo( - &passwd, - format!("chmod +x {}", binary_path.to_string_lossy()), - ) - .output()?; - sudo(&passwd, format!("{}", installer_path.to_string_lossy())).output()? - } - }; - if !output.status.success() { - bail!( - "failed to install service with error: {}", - String::from_utf8_lossy(&output.stderr) - ); - } - - Ok(()) -} - -#[cfg(target_os = "macos")] -pub async fn install_service(passwd: String) -> Result<()> { - let binary_path = dirs::service_path()?; - let installer_path = binary_path.with_file_name("install-service"); - - if !installer_path.exists() { - bail!("installer not found"); - } - - sudo( - &passwd, - format!( - "chmod +x {}", - installer_path.to_string_lossy().replace(" ", "\\ ") - ), - ) - .output()?; - let output = sudo( - &passwd, - format!("{}", installer_path.to_string_lossy().replace(" ", "\\ ")), - ) - .output()?; - - if !output.status.success() { - bail!( - "failed to install service with error: {}", - String::from_utf8_lossy(&output.stderr) - ); - } - - Ok(()) -} -/// Uninstall the Clash Verge Service -/// 该函数应该在协程或者线程中执行,避免UAC弹窗阻塞主线程 -#[cfg(target_os = "windows")] -pub async fn uninstall_service(_passwd: String) -> Result<()> { - use deelevate::{PrivilegeLevel, Token}; - use runas::Command as RunasCommand; - use std::os::windows::process::CommandExt; - - let binary_path = dirs::service_path()?; - let uninstall_path = binary_path.with_file_name("uninstall-service.exe"); - if !uninstall_path.exists() { - bail!("uninstaller exe not found"); + bail!(format!("uninstaller not found: {uninstall_path:?}")); } - let token = Token::with_current_process()?; - let level = token.privilege_level()?; + let install_shell: String = install_path.to_string_lossy().replace(" ", "\\ "); + let uninstall_shell: String = uninstall_path.to_string_lossy().replace(" ", "\\ "); - let status = match level { - PrivilegeLevel::NotPrivileged => RunasCommand::new(uninstall_path).show(false).status()?, - _ => StdCommand::new(uninstall_path) - .creation_flags(0x08000000) + let elevator = crate::utils::help::linux_elevator(); + let status = match get_effective_uid() { + 0 => StdCommand::new(uninstall_shell).status()?, + _ => StdCommand::new(elevator.clone()) + .arg("sh") + .arg("-c") + .arg(uninstall_shell) + .status()?, + }; + log::info!(target:"app", "status code:{}", status.code().unwrap()); + + let status = match get_effective_uid() { + 0 => StdCommand::new(install_shell).status()?, + _ => StdCommand::new(elevator.clone()) + .arg("sh") + .arg("-c") + .arg(install_shell) .status()?, }; if !status.success() { bail!( - "failed to uninstall service with status {}", + "failed to install service with status {}", status.code().unwrap() ); } @@ -185,76 +122,40 @@ pub async fn uninstall_service(_passwd: String) -> Result<()> { Ok(()) } -#[cfg(target_os = "linux")] -pub async fn uninstall_service(passwd: String) -> Result<()> { - use users::get_effective_uid; - - let binary_path = dirs::service_path()?; - let uninstaller_path = binary_path.with_file_name("uninstall-service"); - - if !uninstaller_path.exists() { - bail!("uninstaller not found"); - } - - let output = match get_effective_uid() { - 0 => { - StdCommand::new("chmod") - .arg("+x") - .arg(uninstaller_path.clone()) - .output()?; - StdCommand::new(uninstaller_path.clone()).output()? - } - _ => { - sudo( - &passwd, - format!("chmod +x {}", uninstaller_path.to_string_lossy()), - ) - .output()?; - - sudo(&passwd, format!("{}", uninstaller_path.to_string_lossy())).output()? - } - }; - - if !output.status.success() { - bail!( - "failed to install service with error: {}", - String::from_utf8_lossy(&output.stderr) - ); - } - - Ok(()) -} - #[cfg(target_os = "macos")] -pub async fn uninstall_service(passwd: String) -> Result<()> { - let binary_path = dirs::service_path()?; - let uninstaller_path = binary_path.with_file_name("uninstall-service"); +pub async fn reinstall_service() -> Result<()> { + log::info!(target:"app", "reinstall service"); - if !uninstaller_path.exists() { - bail!("uninstaller not found"); + let binary_path = dirs::service_path()?; + let install_path = binary_path.with_file_name("install-service"); + let uninstall_path = binary_path.with_file_name("uninstall-service"); + + if !install_path.exists() { + bail!(format!("installer not found: {install_path:?}")); } - sudo( - &passwd, - format!( - "chmod +x {}", - uninstaller_path.to_string_lossy().replace(" ", "\\ ") - ), - ) - .output()?; - let output = sudo( - &passwd, - format!("{}", uninstaller_path.to_string_lossy().replace(" ", "\\ ")), - ) - .output()?; + if !uninstall_path.exists() { + bail!(format!("uninstaller not found: {uninstall_path:?}")); + } - if !output.status.success() { + let install_shell: String = install_path.to_string_lossy().into_owned(); + let uninstall_shell: String = uninstall_path.to_string_lossy().into_owned(); + let command = format!( + r#"do shell script "sudo '{uninstall_shell}' && sudo '{install_shell}'" with administrator privileges"# + ); + + log::debug!(target: "app", "command: {}", command); + + let status = StdCommand::new("osascript") + .args(vec!["-e", &command]) + .status()?; + + if !status.success() { bail!( - "failed to uninstall service with error: {}", - String::from_utf8_lossy(&output.stderr) + "failed to install service with status {}", + status.code().unwrap() ); } - Ok(()) } @@ -263,6 +164,7 @@ pub async fn check_service() -> Result { let url = format!("{SERVICE_URL}/get_clash"); let response = reqwest::ClientBuilder::new() .no_proxy() + .timeout(Duration::from_secs(3)) .build()? .get(url) .send() @@ -277,29 +179,8 @@ pub async fn check_service() -> Result { /// start the clash by service pub(super) async fn run_core_by_service(config_file: &PathBuf) -> Result<()> { - let status = check_service().await?; - - if status.code == 0 { - stop_core_by_service().await?; - sleep(Duration::from_secs(1)).await; - } - let clash_core = { Config::verge().latest().clash_core.clone() }; - let mut clash_core = clash_core.unwrap_or("verge-mihomo".into()); - - // compatibility - if clash_core.contains("clash") { - clash_core = "verge-mihomo".to_string(); - Config::verge().draft().patch_config(IVerge { - clash_core: Some("verge-mihomo".to_string()), - ..IVerge::default() - }); - Config::verge().apply(); - match Config::verge().data().save_file() { - Ok(_) => handle::Handle::refresh_verge(), - Err(err) => log::error!(target: "app", "{err}"), - } - } + let clash_core = clash_core.unwrap_or("verge-mihomo".into()); let bin_ext = if cfg!(windows) { ".exe" } else { "" }; let clash_bin = format!("{clash_core}{bin_ext}"); @@ -321,81 +202,31 @@ pub(super) async fn run_core_by_service(config_file: &PathBuf) -> Result<()> { map.insert("config_file", config_file); map.insert("log_file", log_path); + log::info!(target:"app", "start service: {:?}", map.clone()); + let url = format!("{SERVICE_URL}/start_clash"); - let res = reqwest::ClientBuilder::new() + let _ = reqwest::ClientBuilder::new() .no_proxy() .build()? .post(url) .json(&map) .send() - .await? - .json::() .await .context("failed to connect to the Clash Verge Service")?; - if res.code != 0 { - bail!(res.msg); - } - Ok(()) } /// stop the clash by service pub(super) async fn stop_core_by_service() -> Result<()> { let url = format!("{SERVICE_URL}/stop_clash"); - let res = reqwest::ClientBuilder::new() + let _ = reqwest::ClientBuilder::new() .no_proxy() .build()? .post(url) .send() - .await? - .json::() .await .context("failed to connect to the Clash Verge Service")?; - if res.code != 0 { - bail!(res.msg); - } - - Ok(()) -} - -/// set dns by service -pub async fn set_dns_by_service() -> Result<()> { - let url = format!("{SERVICE_URL}/set_dns"); - let res = reqwest::ClientBuilder::new() - .no_proxy() - .build()? - .post(url) - .send() - .await? - .json::() - .await - .context("failed to connect to the Clash Verge Service")?; - - if res.code != 0 { - bail!(res.msg); - } - - Ok(()) -} - -/// unset dns by service -pub async fn unset_dns_by_service() -> Result<()> { - let url = format!("{SERVICE_URL}/unset_dns"); - let res = reqwest::ClientBuilder::new() - .no_proxy() - .build()? - .post(url) - .send() - .await? - .json::() - .await - .context("failed to connect to the Clash Verge Service")?; - - if res.code != 0 { - bail!(res.msg); - } - Ok(()) } diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index 35ed33a8..525d03ea 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -1,36 +1,24 @@ +use crate::core::handle::Handle; use crate::{ config::{Config, IVerge}, log_err, }; -use anyhow::{anyhow, Result}; -use auto_launch::{AutoLaunch, AutoLaunchBuilder}; +use anyhow::Result; use once_cell::sync::OnceCell; use parking_lot::Mutex; -use std::env::current_exe; use std::sync::Arc; use sysproxy::{Autoproxy, Sysproxy}; use tauri::async_runtime::Mutex as TokioMutex; +use tauri_plugin_autostart::ManagerExt; +use tokio::time::{sleep, Duration}; pub struct Sysopt { - /// current system proxy setting - cur_sysproxy: Arc>>, - - /// record the original system proxy - /// recover it when exit - old_sysproxy: Arc>>, - - /// current auto proxy setting - cur_autoproxy: Arc>>, - - /// record the original auto proxy - /// recover it when exit - old_autoproxy: Arc>>, - + update_sysproxy: Arc>, + reset_sysproxy: Arc>, /// helps to auto launch the app - auto_launch: Arc>>, - + auto_launch: Arc>, /// record whether the guard async is running or not - guard_state: Arc>, + guard_state: Arc>, } #[cfg(target_os = "windows")] @@ -42,7 +30,6 @@ static DEFAULT_BYPASS: &str = "127.0.0.1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12,localhost,*.local,*.crashlytics.com,"; fn get_bypass() -> String { - // let bypass = DEFAULT_BYPASS.to_string(); let use_default = Config::verge().latest().use_default_bypass.unwrap_or(true); let res = { let verge = Config::verge(); @@ -53,125 +40,35 @@ fn get_bypass() -> String { Some(bypass) => bypass, None => "".to_string(), }; - #[cfg(target_os = "windows")] - let bypass = if custom_bypass.is_empty() { - DEFAULT_BYPASS.to_string() - } else { - if use_default { - format!("{};{}", DEFAULT_BYPASS, custom_bypass) - } else { - custom_bypass - } - }; - #[cfg(not(target_os = "windows"))] - let bypass = if custom_bypass.is_empty() { - DEFAULT_BYPASS.to_string() - } else { - if use_default { - format!("{},{}", DEFAULT_BYPASS, custom_bypass) - } else { - custom_bypass - } - }; - bypass + if custom_bypass.is_empty() { + DEFAULT_BYPASS.to_string() + } else if use_default { + format!("{},{}", DEFAULT_BYPASS, custom_bypass) + } else { + custom_bypass + } } impl Sysopt { pub fn global() -> &'static Sysopt { static SYSOPT: OnceCell = OnceCell::new(); - SYSOPT.get_or_init(|| Sysopt { - cur_sysproxy: Arc::new(Mutex::new(None)), - old_sysproxy: Arc::new(Mutex::new(None)), - cur_autoproxy: Arc::new(Mutex::new(None)), - old_autoproxy: Arc::new(Mutex::new(None)), - auto_launch: Arc::new(Mutex::new(None)), - guard_state: Arc::new(TokioMutex::new(false)), + update_sysproxy: Arc::new(TokioMutex::new(false)), + reset_sysproxy: Arc::new(TokioMutex::new(false)), + auto_launch: Arc::new(Mutex::new(false)), + guard_state: Arc::new(false.into()), }) } - /// init the sysproxy - pub fn init_sysproxy(&self) -> Result<()> { - let port = Config::verge() - .latest() - .verge_mixed_port - .unwrap_or(Config::clash().data().get_mixed_port()); - let pac_port = IVerge::get_singleton_port(); - - let (enable, pac) = { - let verge = Config::verge(); - let verge = verge.latest(); - ( - verge.enable_system_proxy.unwrap_or(false), - verge.proxy_auto_config.unwrap_or(false), - ) - }; - let mut sys = Sysproxy { - enable, - host: String::from("127.0.0.1"), - port, - bypass: get_bypass(), - }; - let mut auto = Autoproxy { - enable, - url: format!("http://127.0.0.1:{pac_port}/commands/pac"), - }; - if pac { - sys.enable = false; - let old = Sysproxy::get_system_proxy().ok(); - sys.set_system_proxy()?; - *self.old_sysproxy.lock() = old; - *self.cur_sysproxy.lock() = Some(sys); - - let old = Autoproxy::get_auto_proxy().ok(); - auto.set_auto_proxy()?; - *self.old_autoproxy.lock() = old; - *self.cur_autoproxy.lock() = Some(auto); - } else { - auto.enable = false; - let old = Autoproxy::get_auto_proxy().ok(); - auto.set_auto_proxy()?; - *self.old_autoproxy.lock() = old; - *self.cur_autoproxy.lock() = Some(auto); - - let old = Sysproxy::get_system_proxy().ok(); - sys.set_system_proxy()?; - *self.old_sysproxy.lock() = old; - *self.cur_sysproxy.lock() = Some(sys); - } - - // run the system proxy guard + pub fn init_guard_sysproxy(&self) -> Result<()> { self.guard_proxy(); Ok(()) } - /// update the system proxy - pub fn update_sysproxy(&self) -> Result<()> { - let mut cur_sysproxy = self.cur_sysproxy.lock(); - let old_sysproxy = self.old_sysproxy.lock(); - let mut cur_autoproxy = self.cur_autoproxy.lock(); - let old_autoproxy = self.old_autoproxy.lock(); - - let (enable, pac) = { - let verge = Config::verge(); - let verge = verge.latest(); - ( - verge.enable_system_proxy.unwrap_or(false), - verge.proxy_auto_config.unwrap_or(false), - ) - }; - if pac && (cur_autoproxy.is_none() || old_autoproxy.is_none()) { - drop(cur_autoproxy); - drop(old_autoproxy); - return self.init_sysproxy(); - } - - if !pac && (cur_sysproxy.is_none() || old_sysproxy.is_none()) { - drop(cur_sysproxy); - drop(old_sysproxy); - return self.init_sysproxy(); - } + /// init the sysproxy + pub async fn update_sysproxy(&self) -> Result<()> { + let _lock = self.update_sysproxy.lock().await; let port = Config::verge() .latest() @@ -179,185 +76,164 @@ impl Sysopt { .unwrap_or(Config::clash().data().get_mixed_port()); let pac_port = IVerge::get_singleton_port(); - let mut sysproxy = cur_sysproxy.take().unwrap(); - sysproxy.bypass = get_bypass(); - sysproxy.port = port; + let (sys_enable, pac_enable) = { + let verge = Config::verge(); + let verge = verge.latest(); + ( + verge.enable_system_proxy.unwrap_or(false), + verge.proxy_auto_config.unwrap_or(false), + ) + }; - let mut autoproxy = cur_autoproxy.take().unwrap(); - autoproxy.url = format!("http://127.0.0.1:{pac_port}/commands/pac"); + #[cfg(not(target_os = "windows"))] + { + let mut sys = Sysproxy { + enable: false, + host: String::from("127.0.0.1"), + port, + bypass: get_bypass(), + }; + let mut auto = Autoproxy { + enable: false, + url: format!("http://127.0.0.1:{pac_port}/commands/pac"), + }; - if pac { - sysproxy.enable = false; - sysproxy.set_system_proxy()?; - *cur_sysproxy = Some(sysproxy); - autoproxy.enable = enable; - autoproxy.set_auto_proxy()?; - *cur_autoproxy = Some(autoproxy); - } else { - autoproxy.enable = false; - autoproxy.set_auto_proxy()?; - *cur_autoproxy = Some(autoproxy); - sysproxy.enable = enable; - sysproxy.set_system_proxy()?; - *cur_sysproxy = Some(sysproxy); + if !sys_enable { + sys.set_system_proxy()?; + auto.set_auto_proxy()?; + return Ok(()); + } + + if pac_enable { + sys.enable = false; + auto.enable = true; + sys.set_system_proxy()?; + auto.set_auto_proxy()?; + return Ok(()); + } + + if sys_enable { + auto.enable = false; + sys.enable = true; + auto.set_auto_proxy()?; + sys.set_system_proxy()?; + return Ok(()); + } + } + #[cfg(target_os = "windows")] + { + if !sys_enable { + return self.reset_sysproxy().await; + } + use crate::core::handle::Handle; + use crate::utils::dirs; + use anyhow::bail; + use tauri_plugin_shell::ShellExt; + + let app_handle = Handle::global().app_handle().unwrap(); + + let binary_path = dirs::service_path()?; + let sysproxy_exe = binary_path.with_file_name("sysproxy.exe"); + if !sysproxy_exe.exists() { + bail!("sysproxy.exe not found"); + } + + let shell = app_handle.shell(); + let output = if pac_enable { + let address = format!("http://{}:{}/commands/pac", "127.0.0.1", pac_port); + let output = shell + .command(sysproxy_exe.as_path().to_str().unwrap()) + .args(["pac", address.as_str()]) + .output() + .await + .unwrap(); + output + } else { + let address = format!("{}:{}", "127.0.0.1", port); + let bypass = get_bypass(); + let output = shell + .command(sysproxy_exe.as_path().to_str().unwrap()) + .args(["global", address.as_str(), bypass.as_ref()]) + .output() + .await + .unwrap(); + output + }; + + if !output.status.success() { + bail!("sysproxy exe run failed"); + } } Ok(()) } /// reset the sysproxy - pub fn reset_sysproxy(&self) -> Result<()> { - let mut cur_sysproxy = self.cur_sysproxy.lock(); - let mut old_sysproxy = self.old_sysproxy.lock(); - let mut cur_autoproxy = self.cur_autoproxy.lock(); - let mut old_autoproxy = self.old_autoproxy.lock(); - - let cur_sysproxy = cur_sysproxy.take(); - let cur_autoproxy = cur_autoproxy.take(); - - if let Some(mut old) = old_sysproxy.take() { - // 如果原代理和当前代理 端口一致,就disable关闭,否则就恢复原代理设置 - // 当前没有设置代理的时候,不确定旧设置是否和当前一致,全关了 - let port_same = cur_sysproxy.map_or(true, |cur| old.port == cur.port); - - if old.enable && port_same { - old.enable = false; - log::info!(target: "app", "reset proxy by disabling the original proxy"); - } else { - log::info!(target: "app", "reset proxy to the original proxy"); - } - - old.set_system_proxy()?; - } else if let Some(mut cur @ Sysproxy { enable: true, .. }) = cur_sysproxy { - // 没有原代理,就按现在的代理设置disable即可 - log::info!(target: "app", "reset proxy by disabling the current proxy"); - cur.enable = false; - cur.set_system_proxy()?; - } else { - log::info!(target: "app", "reset proxy with no action"); + pub async fn reset_sysproxy(&self) -> Result<()> { + let _lock = self.reset_sysproxy.lock().await; + //直接关闭所有代理 + #[cfg(not(target_os = "windows"))] + { + let mut sysproxy: Sysproxy = Sysproxy::get_system_proxy()?; + let mut autoproxy = Autoproxy::get_auto_proxy()?; + sysproxy.enable = false; + autoproxy.enable = false; + autoproxy.set_auto_proxy()?; + sysproxy.set_system_proxy()?; } - if let Some(mut old) = old_autoproxy.take() { - // 如果原代理和当前代理 URL一致,就disable关闭,否则就恢复原代理设置 - // 当前没有设置代理的时候,不确定旧设置是否和当前一致,全关了 - let url_same = cur_autoproxy.map_or(true, |cur| old.url == cur.url); - - if old.enable && url_same { - old.enable = false; - log::info!(target: "app", "reset proxy by disabling the original proxy"); - } else { - log::info!(target: "app", "reset proxy to the original proxy"); - } - - old.set_auto_proxy()?; - } else if let Some(mut cur @ Autoproxy { enable: true, .. }) = cur_autoproxy { - // 没有原代理,就按现在的代理设置disable即可 - log::info!(target: "app", "reset proxy by disabling the current proxy"); - cur.enable = false; - cur.set_auto_proxy()?; - } else { - log::info!(target: "app", "reset proxy with no action"); - } - - Ok(()) - } - - /// init the auto launch - pub fn init_launch(&self) -> Result<()> { - let app_exe = current_exe()?; - // let app_exe = dunce::canonicalize(app_exe)?; - let app_name = app_exe - .file_stem() - .and_then(|f| f.to_str()) - .ok_or(anyhow!("failed to get file stem"))?; - - let app_path = app_exe - .as_os_str() - .to_str() - .ok_or(anyhow!("failed to get app_path"))? - .to_string(); - - // fix issue #26 #[cfg(target_os = "windows")] - let app_path = format!("\"{app_path}\""); - - // use the /Applications/Clash Verge.app path - #[cfg(target_os = "macos")] - let app_path = (|| -> Option { - let path = std::path::PathBuf::from(&app_path); - let path = path.parent()?.parent()?.parent()?; - let extension = path.extension()?.to_str()?; - match extension == "app" { - true => Some(path.as_os_str().to_str()?.to_string()), - false => None, - } - })() - .unwrap_or(app_path); - - // fix #403 - #[cfg(target_os = "linux")] - let app_path = { + { use crate::core::handle::Handle; - use tauri::Manager; + use crate::utils::dirs; + use anyhow::bail; + use tauri_plugin_shell::ShellExt; - let handle = Handle::global(); - match handle.app_handle.lock().as_ref() { - Some(app_handle) => { - let appimage = app_handle.env().appimage; - appimage - .and_then(|p| p.to_str().map(|s| s.to_string())) - .unwrap_or(app_path) - } - None => app_path, + let app_handle = Handle::global().app_handle().unwrap(); + + let binary_path = dirs::service_path()?; + let sysproxy_exe = binary_path.with_file_name("sysproxy.exe"); + + if !sysproxy_exe.exists() { + bail!("sysproxy.exe not found"); } - }; - let auto = AutoLaunchBuilder::new() - .set_app_name(app_name) - .set_app_path(&app_path) - .build()?; + let shell = app_handle.shell(); + let output = shell + .command(sysproxy_exe.as_path().to_str().unwrap()) + .args(["set", "1"]) + .output() + .await + .unwrap(); - *self.auto_launch.lock() = Some(auto); + if !output.status.success() { + bail!("sysproxy exe run failed"); + } + } Ok(()) } /// update the startup pub fn update_launch(&self) -> Result<()> { - let auto_launch = self.auto_launch.lock(); - - if auto_launch.is_none() { - drop(auto_launch); - return self.init_launch(); - } + let _lock = self.auto_launch.lock(); let enable = { Config::verge().latest().enable_auto_launch }; let enable = enable.unwrap_or(false); - let auto_launch = auto_launch.as_ref().unwrap(); - + let app_handle = Handle::global().app_handle().unwrap(); + let autostart_manager = app_handle.autolaunch(); + println!("enable: {}", enable); match enable { - true => auto_launch.enable()?, - false => log_err!(auto_launch.disable()), // 忽略关闭的错误 + true => log_err!(autostart_manager.enable()), + false => log_err!(autostart_manager.disable()), }; Ok(()) } - /// launch a system proxy guard - /// read config from file directly - pub fn guard_proxy(&self) { - use tokio::time::{sleep, Duration}; - - let guard_state = self.guard_state.clone(); + fn guard_proxy(&self) { + let _lock = self.guard_state.lock(); tauri::async_runtime::spawn(async move { - // if it is running, exit - let mut state = guard_state.lock().await; - if *state { - return; - } - *state = true; - drop(state); - // default duration is 10s let mut wait_secs = 10u64; @@ -377,7 +253,7 @@ impl Sysopt { // stop loop if !enable || !guard { - break; + continue; } // update duration @@ -385,6 +261,20 @@ impl Sysopt { log::debug!(target: "app", "try to guard the system proxy"); + let sysproxy = Sysproxy::get_system_proxy(); + let autoproxy = Autoproxy::get_auto_proxy(); + if sysproxy.is_err() || autoproxy.is_err() { + log::error!(target: "app", "failed to get the system proxy"); + continue; + } + + let sysproxy_enable = sysproxy.ok().map(|s| s.enable).unwrap_or(false); + let autoproxy_enable = autoproxy.ok().map(|s| s.enable).unwrap_or(false); + + if sysproxy_enable || autoproxy_enable { + continue; + } + let port = { Config::verge() .latest() @@ -392,27 +282,66 @@ impl Sysopt { .unwrap_or(Config::clash().data().get_mixed_port()) }; let pac_port = IVerge::get_singleton_port(); - if pac { - let autoproxy = Autoproxy { - enable: true, - url: format!("http://127.0.0.1:{pac_port}/commands/pac"), - }; - log_err!(autoproxy.set_auto_proxy()); - } else { - let sysproxy = Sysproxy { - enable: true, - host: "127.0.0.1".into(), - port, - bypass: get_bypass(), - }; + #[cfg(not(target_os = "windows"))] + { + if pac { + let autoproxy = Autoproxy { + enable: true, + url: format!("http://127.0.0.1:{pac_port}/commands/pac"), + }; + log_err!(autoproxy.set_auto_proxy()); + } else { + let sysproxy = Sysproxy { + enable: true, + host: "127.0.0.1".into(), + port, + bypass: get_bypass(), + }; - log_err!(sysproxy.set_system_proxy()); + log_err!(sysproxy.set_system_proxy()); + } } - } - let mut state = guard_state.lock().await; - *state = false; - drop(state); + #[cfg(target_os = "windows")] + { + use crate::core::handle::Handle; + use crate::utils::dirs; + use tauri_plugin_shell::ShellExt; + + let app_handle = Handle::global().app_handle().unwrap(); + + let binary_path = dirs::service_path().unwrap(); + let sysproxy_exe = binary_path.with_file_name("sysproxy.exe"); + if !sysproxy_exe.exists() { + break; + } + + let shell = app_handle.shell(); + let output = if pac { + let address = format!("http://{}:{}/commands/pac", "127.0.0.1", pac_port); + + shell + .command(sysproxy_exe.as_path().to_str().unwrap()) + .args(["pac", address.as_str()]) + .output() + .await + .unwrap() + } else { + let address = format!("{}:{}", "127.0.0.1", port); + let bypass = get_bypass(); + + shell + .command(sysproxy_exe.as_path().to_str().unwrap()) + .args(["global", address.as_str(), bypass.as_ref()]) + .output() + .await + .unwrap() + }; + if !output.status.success() { + break; + } + }; + } }); } } diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 633babf3..7e69c0f9 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -8,41 +8,65 @@ use crate::{ }, }; use anyhow::Result; -use tauri::tray::{MouseButton, MouseButtonState, TrayIconEvent}; +use tauri::AppHandle; +use tauri::{ + menu::CheckMenuItem, + tray::{MouseButton, MouseButtonState, TrayIconEvent, TrayIconId}, +}; use tauri::{ menu::{MenuEvent, MenuItem, PredefinedMenuItem, Submenu}, Wry, }; -use tauri::{AppHandle, Manager}; + +use super::handle; pub struct Tray {} impl Tray { - pub fn update_systray(app_handle: &AppHandle) -> Result<()> { - let tray = app_handle.tray_by_id("main").unwrap(); - tray.on_tray_icon_event(|tray, event| { + pub fn create_systray() -> Result<()> { + let app_handle = handle::Handle::global().app_handle().unwrap(); + let tray_incon_id = TrayIconId::new("main"); + let tray = app_handle.tray_by_id(&tray_incon_id).unwrap(); + + tray.on_tray_icon_event(|_, event| { let tray_event = { Config::verge().latest().tray_event.clone() }; let tray_event: String = tray_event.unwrap_or("main_window".into()); + + #[cfg(target_os = "macos")] if let TrayIconEvent::Click { - button: MouseButton::Left, - button_state: MouseButtonState::Up, + button: MouseButton::Right, + button_state: MouseButtonState::Down, .. } = event { - let app = tray.app_handle(); match tray_event.as_str() { "system_proxy" => feat::toggle_system_proxy(), "tun_mode" => feat::toggle_tun_mode(), - "main_window" => resolve::create_window(app), + "main_window" => resolve::create_window(), + _ => {} + } + } + + #[cfg(not(target_os = "macos"))] + if let TrayIconEvent::Click { + button: MouseButton::Left, + button_state: MouseButtonState::Down, + .. + } = event + { + match tray_event.as_str() { + "system_proxy" => feat::toggle_system_proxy(), + "tun_mode" => feat::toggle_tun_mode(), + "main_window" => resolve::create_window(), _ => {} } } }); tray.on_menu_event(on_menu_event); - Ok(()) } - pub fn update_part(app_handle: &AppHandle) -> Result<()> { + pub fn update_part() -> Result<()> { + let app_handle = handle::Handle::global().app_handle().unwrap(); let use_zh = { Config::verge().latest().language == Some("zh".into()) }; let version = VERSION.get().unwrap(); let mode = { @@ -58,42 +82,35 @@ impl Tray { let verge = Config::verge().latest().clone(); let system_proxy = verge.enable_system_proxy.as_ref().unwrap_or(&false); let tun_mode = verge.enable_tun_mode.as_ref().unwrap_or(&false); - #[cfg(target_os = "macos")] - let tray_icon = verge.tray_icon.clone().unwrap_or("monochrome".to_string()); let common_tray_icon = verge.common_tray_icon.as_ref().unwrap_or(&false); let sysproxy_tray_icon = verge.sysproxy_tray_icon.as_ref().unwrap_or(&false); let tun_tray_icon = verge.tun_tray_icon.as_ref().unwrap_or(&false); let tray = app_handle.tray_by_id("main").unwrap(); + #[cfg(target_os = "macos")] + let tray_icon = verge.tray_icon.clone().unwrap_or("monochrome".to_string()); let _ = tray.set_menu(Some(create_tray_menu( - app_handle, + &app_handle, Some(mode.as_str()), *system_proxy, *tun_mode, )?)); - // let _ = tray. #[cfg(target_os = "macos")] - match tray_icon.as_str() { - "monochrome" => { - let _ = tray.set_icon_as_template(true); - } - "colorful" => { - let _ = tray.set_icon_as_template(false); - } - _ => {} - } - - let mut indication_icon = if *system_proxy { + let mut use_custom_icon = false; + #[allow(unused)] + let mut indication_icon = if *system_proxy && !*tun_mode { #[cfg(target_os = "macos")] let mut icon = match tray_icon.as_str() { - "monochrome" => include_bytes!("../../icons/tray-icon-sys-mono.ico").to_vec(), - "colorful" => include_bytes!("../../icons/tray-icon-sys.ico").to_vec(), + "colorful" => { + use_custom_icon = true; + include_bytes!("../../icons/tray-icon-sys.ico").to_vec() + } _ => include_bytes!("../../icons/tray-icon-sys-mono.ico").to_vec(), }; + #[cfg(not(target_os = "macos"))] let mut icon = include_bytes!("../../icons/tray-icon-sys.ico").to_vec(); - if *sysproxy_tray_icon { let icon_dir_path = dirs::app_home_dir()?.join("icons"); let png_path = icon_dir_path.join("sysproxy.png"); @@ -103,37 +120,22 @@ impl Tray { } else if png_path.exists() { icon = std::fs::read(png_path).unwrap(); } - } - icon - } else { - #[cfg(target_os = "macos")] - let mut icon = match tray_icon.as_str() { - "monochrome" => include_bytes!("../../icons/tray-icon-mono.ico").to_vec(), - "colorful" => include_bytes!("../../icons/tray-icon.ico").to_vec(), - _ => include_bytes!("../../icons/tray-icon-mono.ico").to_vec(), - }; - #[cfg(not(target_os = "macos"))] - let mut icon = include_bytes!("../../icons/tray-icon.ico").to_vec(); - if *common_tray_icon { - let icon_dir_path = dirs::app_home_dir()?.join("icons"); - let png_path = icon_dir_path.join("common.png"); - let ico_path = icon_dir_path.join("common.ico"); - if ico_path.exists() { - icon = std::fs::read(ico_path).unwrap(); - } else if png_path.exists() { - icon = std::fs::read(png_path).unwrap(); + #[cfg(target_os = "macos")] + { + use_custom_icon = true; } } icon - }; - - if *tun_mode { + } else if *tun_mode { #[cfg(target_os = "macos")] let mut icon = match tray_icon.as_str() { - "monochrome" => include_bytes!("../../icons/tray-icon-tun-mono.ico").to_vec(), - "colorful" => include_bytes!("../../icons/tray-icon-tun.ico").to_vec(), + "colorful" => { + use_custom_icon = true; + include_bytes!("../../icons/tray-icon-tun.ico").to_vec() + } _ => include_bytes!("../../icons/tray-icon-tun-mono.ico").to_vec(), }; + #[cfg(not(target_os = "macos"))] let mut icon = include_bytes!("../../icons/tray-icon-tun.ico").to_vec(); if *tun_tray_icon { @@ -145,9 +147,52 @@ impl Tray { } else if png_path.exists() { icon = std::fs::read(png_path).unwrap(); } + #[cfg(target_os = "macos")] + { + use_custom_icon = true; + } + } + icon + } else { + #[cfg(target_os = "macos")] + let mut icon = match tray_icon.as_str() { + "colorful" => { + use_custom_icon = true; + include_bytes!("../../icons/tray-icon.ico").to_vec() + } + _ => include_bytes!("../../icons/tray-icon-mono.ico").to_vec(), + }; + + #[cfg(not(target_os = "macos"))] + let mut icon = include_bytes!("../../icons/tray-icon.ico").to_vec(); + if *common_tray_icon { + let icon_dir_path = dirs::app_home_dir()?.join("icons"); + let png_path = icon_dir_path.join("common.png"); + let ico_path = icon_dir_path.join("common.ico"); + if ico_path.exists() { + icon = std::fs::read(ico_path).unwrap(); + } else if png_path.exists() { + icon = std::fs::read(png_path).unwrap(); + } + #[cfg(target_os = "macos")] + { + use_custom_icon = true; + } + } + icon + }; + + #[cfg(target_os = "macos")] + { + if use_custom_icon { + let _ = tray.set_icon_as_template(false); + let _ = tray.set_icon(Some(tauri::image::Image::from_bytes(&indication_icon)?)); + } else { + let _ = tray.set_icon_as_template(true); } - indication_icon = icon } + + #[cfg(not(target_os = "macos"))] let _ = tray.set_icon(Some(tauri::image::Image::from_bytes(&indication_icon)?)); let switch_map = { @@ -191,40 +236,113 @@ fn create_tray_menu( let use_zh = { Config::verge().latest().language == Some("zh".into()) }; let version = VERSION.get().unwrap(); - let rule_mode_text = if mode == "rule" { - "✓ 规则模式" - } else { - "规则模式" - }; + let open_window = &MenuItem::with_id( + app_handle, + "open_window", + t!("Dashboard", "打开面板", use_zh), + true, + None::<&str>, + ) + .unwrap(); - let global_mode_text = if mode == "global" { - "✓ 全局模式" - } else { - "全局模式" - }; + let rule_mode = &CheckMenuItem::with_id( + app_handle, + "rule_mode", + t!("Rule Mode", "规则模式", use_zh), + true, + mode == "rule", + None::<&str>, + ) + .unwrap(); - let direct_mode_text = if mode == "direct" { - "✓ 直连模式" - } else { - "直连模式" - }; + let global_mode = &CheckMenuItem::with_id( + app_handle, + "global_mode", + t!("Global Mode", "全局模式", use_zh), + true, + mode == "global", + None::<&str>, + ) + .unwrap(); - let system_proxy_text = if system_proxy_enabled { - "✓ 系统代理" - } else { - "系统代理" - }; + let direct_mode = &CheckMenuItem::with_id( + app_handle, + "direct_mode", + t!("Direct Mode", "直连模式", use_zh), + true, + mode == "direct", + None::<&str>, + ) + .unwrap(); - let tun_mode_text = if tun_mode_enabled { - "✓ Tun 模式" - } else { - "Tun 模式" - }; + let system_proxy = &CheckMenuItem::with_id( + app_handle, + "system_proxy", + t!("System Proxy", "系统代理", use_zh), + true, + system_proxy_enabled, + None::<&str>, + ) + .unwrap(); + + let tun_mode = &CheckMenuItem::with_id( + app_handle, + "tun_mode", + t!("TUN Mode", "Tun模式", use_zh), + true, + tun_mode_enabled, + None::<&str>, + ) + .unwrap(); + + let copy_env = &MenuItem::with_id( + app_handle, + "copy_env", + t!("Copy Env", "复制环境变量", use_zh), + true, + None::<&str>, + ) + .unwrap(); + + let open_app_dir = &MenuItem::with_id( + app_handle, + "open_app_dir", + t!("Conf Dir", "配置目录", use_zh), + true, + None::<&str>, + ) + .unwrap(); + + let open_core_dir = &MenuItem::with_id( + app_handle, + "open_core_dir", + t!("Core Dir", "内核目录", use_zh), + true, + None::<&str>, + ) + .unwrap(); + + let open_logs_dir = &MenuItem::with_id( + app_handle, + "open_logs_dir", + t!("Logs Dir", "日志目录", use_zh), + true, + None::<&str>, + ) + .unwrap(); + let open_dir = &Submenu::with_id_and_items( + app_handle, + "open_dir", + t!("Open Dir", "打开目录", use_zh), + true, + &[open_app_dir, open_core_dir, open_logs_dir], + ) + .unwrap(); let restart_clash = &MenuItem::with_id( app_handle, "restart_clash", - t!("Restart App", "重启 Clash", use_zh), + t!("Restart Clash Core", "重启Clash内核", use_zh), true, None::<&str>, ) @@ -233,7 +351,7 @@ fn create_tray_menu( let restart_app = &MenuItem::with_id( app_handle, "restart_app", - t!("Restart App", "重启应用", use_zh), + t!("Restart App", "重启App", use_zh), true, None::<&str>, ) @@ -248,131 +366,67 @@ fn create_tray_menu( ) .unwrap(); + let more = &Submenu::with_id_and_items( + app_handle, + "more", + t!("More", "更多", use_zh), + true, + &[restart_clash, restart_app, app_version], + ) + .unwrap(); + + let quit = &MenuItem::with_id( + app_handle, + "quit", + t!("Quit", "退出", use_zh), + true, + Some("CmdOrControl+Q"), + ) + .unwrap(); + + let separator = &PredefinedMenuItem::separator(app_handle).unwrap(); + let menu = tauri::menu::MenuBuilder::new(app_handle) - .item( - &MenuItem::with_id( - app_handle, - "open_window", - t!("Dashboard", "打开面板", use_zh), - true, - None::<&str>, - ) - .unwrap(), - ) - .item(&PredefinedMenuItem::separator(app_handle).unwrap()) - .item( - &MenuItem::with_id( - app_handle, - "rule_mode", - t!("Rule Mode", rule_mode_text, use_zh), - true, - None::<&str>, - ) - .unwrap(), - ) - .item( - &MenuItem::with_id( - app_handle, - "global_mode", - t!("Global Mode", global_mode_text, use_zh), - true, - None::<&str>, - ) - .unwrap(), - ) - .item( - &MenuItem::with_id( - app_handle, - "direct_mode", - t!("Direct Mode", direct_mode_text, use_zh), - true, - None::<&str>, - ) - .unwrap(), - ) - .item(&PredefinedMenuItem::separator(app_handle).unwrap()) - .item( - &MenuItem::with_id( - app_handle, - "system_proxy", - t!("System Proxy", system_proxy_text, use_zh), - true, - None::<&str>, - ) - .unwrap(), - ) - .item( - &MenuItem::with_id( - app_handle, - "tun_mode", - t!("TUN Mode", tun_mode_text, use_zh), - true, - None::<&str>, - ) - .unwrap(), - ) - .item( - &MenuItem::with_id( - app_handle, - "copy_env", - t!("Copy Env", "复制环境变量", use_zh), - true, - None::<&str>, - ) - .unwrap(), - ) - .item( - &MenuItem::with_id( - app_handle, - "open_dir", - t!("Open Dir", "打开目录", use_zh), - true, - None::<&str>, - ) - .unwrap(), - ) - .item( - &Submenu::with_id_and_items( - app_handle, - "more", - t!("More", "更多", use_zh), - true, - &[restart_clash, restart_app, app_version], - ) - .unwrap(), - ) - .item(&PredefinedMenuItem::separator(app_handle).unwrap()) - .item( - &MenuItem::with_id( - app_handle, - "quit", - t!("Quit", "退出", use_zh), - true, - Some("CmdOrControl+Q"), - ) - .unwrap(), - ) + .items(&[ + open_window, + separator, + rule_mode, + global_mode, + direct_mode, + separator, + system_proxy, + tun_mode, + copy_env, + open_dir, + more, + separator, + quit, + ]) .build() .unwrap(); - Ok(menu) } -fn on_menu_event(app_handle: &AppHandle, event: MenuEvent) { +fn on_menu_event(_: &AppHandle, event: MenuEvent) { match event.id.as_ref() { mode @ ("rule_mode" | "global_mode" | "direct_mode") => { let mode = &mode[0..mode.len() - 5]; println!("change mode to: {}", mode); feat::change_clash_mode(mode.into()); } - "open_window" => resolve::create_window(app_handle), + "open_window" => resolve::create_window(), "system_proxy" => feat::toggle_system_proxy(), "tun_mode" => feat::toggle_tun_mode(), - "copy_env" => feat::copy_clash_env(app_handle), - "open_dir" => crate::log_err!(cmds::open_app_dir()), + "copy_env" => feat::copy_clash_env(), + "open_app_dir" => crate::log_err!(cmds::open_app_dir()), + "open_core_dir" => crate::log_err!(cmds::open_core_dir()), + "open_logs_dir" => crate::log_err!(cmds::open_logs_dir()), "restart_clash" => feat::restart_clash_core(), - "restart_app" => tauri::process::restart(&app_handle.env()), - "quit" => cmds::exit_app(app_handle.clone()), + "restart_app" => feat::restart_app(), + "quit" => { + println!("quit"); + feat::quit(Some(0)); + } _ => {} } } diff --git a/src-tauri/src/enhance/field.rs b/src-tauri/src/enhance/field.rs index d45cc142..f58b588c 100644 --- a/src-tauri/src/enhance/field.rs +++ b/src-tauri/src/enhance/field.rs @@ -1,7 +1,7 @@ use serde_yaml::{Mapping, Value}; use std::collections::HashSet; -pub const HANDLE_FIELDS: [&str; 11] = [ +pub const HANDLE_FIELDS: [&str; 12] = [ "mode", "redir-port", "tproxy-port", @@ -13,6 +13,7 @@ pub const HANDLE_FIELDS: [&str; 11] = [ "ipv6", "external-controller", "secret", + "unified-delay", ]; pub const DEFAULT_FIELDS: [&str; 5] = [ diff --git a/src-tauri/src/enhance/merge.rs b/src-tauri/src/enhance/merge.rs index dccd65cb..0aa81e7e 100644 --- a/src-tauri/src/enhance/merge.rs +++ b/src-tauri/src/enhance/merge.rs @@ -54,9 +54,7 @@ fn test_merge() -> anyhow::Result<()> { let merge = serde_yaml::from_str::(merge)?; let config = serde_yaml::from_str::(config)?; - let result = serde_yaml::to_string(&use_merge(merge, config))?; - - println!("{result}"); + let _ = serde_yaml::to_string(&use_merge(merge, config))?; Ok(()) } diff --git a/src-tauri/src/enhance/script.rs b/src-tauri/src/enhance/script.rs index e2465097..22ad0cef 100644 --- a/src-tauri/src/enhance/script.rs +++ b/src-tauri/src/enhance/script.rs @@ -103,9 +103,7 @@ fn test_script() { let config = serde_yaml::from_str(config).unwrap(); let (config, results) = use_script(script.into(), config, "".to_string()).unwrap(); - let config_str = serde_yaml::to_string(&config).unwrap(); - - println!("{config_str}"); + let _ = serde_yaml::to_string(&config).unwrap(); dbg!(results); } diff --git a/src-tauri/src/enhance/seq.rs b/src-tauri/src/enhance/seq.rs index c253b1e6..81e722b5 100644 --- a/src-tauri/src/enhance/seq.rs +++ b/src-tauri/src/enhance/seq.rs @@ -12,7 +12,7 @@ pub fn use_seq(seq_map: SeqMap, config: Mapping, name: &str) -> Mapping { let append = seq_map.append; let delete = seq_map.delete; - let origin_seq = config.get(&name).map_or(Sequence::default(), |val| { + let origin_seq = config.get(name).map_or(Sequence::default(), |val| { val.as_sequence().unwrap_or(&Sequence::default()).clone() }); let mut seq = origin_seq.clone(); @@ -23,7 +23,7 @@ pub fn use_seq(seq_map: SeqMap, config: Mapping, name: &str) -> Mapping { if let Some(name) = if item.is_string() { Some(item) } else { - item.get("name").map(|y| y.clone()) + item.get("name").cloned() } { delete_names.push(name.clone()); } @@ -34,7 +34,7 @@ pub fn use_seq(seq_map: SeqMap, config: Mapping, name: &str) -> Mapping { } else { x.get("name") } { - !delete_names.contains(&x_name) + !delete_names.contains(x_name) } else { true } @@ -51,5 +51,5 @@ pub fn use_seq(seq_map: SeqMap, config: Mapping, name: &str) -> Mapping { let mut config = config.clone(); config.insert(Value::from(name), Value::from(seq)); - return config; + config } diff --git a/src-tauri/src/enhance/tun.rs b/src-tauri/src/enhance/tun.rs index 2e9de259..bdba5fd2 100644 --- a/src-tauri/src/enhance/tun.rs +++ b/src-tauri/src/enhance/tun.rs @@ -1,4 +1,3 @@ -use crate::{core::service, log_err}; use serde_yaml::{Mapping, Value}; macro_rules! revise { @@ -9,6 +8,7 @@ macro_rules! revise { } // if key not exists then append value +#[allow(unused_macros)] macro_rules! append { ($map: expr, $key: expr, $val: expr) => { let ret_key = Value::String($key.into()); @@ -21,58 +21,33 @@ macro_rules! append { pub async fn use_tun(mut config: Mapping, enable: bool) -> Mapping { let tun_key = Value::from("tun"); let tun_val = config.get(&tun_key); - - if !enable && tun_val.is_none() { - return config; - } - let mut tun_val = tun_val.map_or(Mapping::new(), |val| { val.as_mapping().cloned().unwrap_or(Mapping::new()) }); - - revise!(tun_val, "enable", enable); - - revise!(config, "tun", tun_val); - - if enable { - log_err!(service::set_dns_by_service().await); - use_dns_for_tun(config) - } else { - log_err!(service::unset_dns_by_service().await); - config - } -} - -fn use_dns_for_tun(mut config: Mapping) -> Mapping { let dns_key = Value::from("dns"); let dns_val = config.get(&dns_key); - let mut dns_val = dns_val.map_or(Mapping::new(), |val| { val.as_mapping().cloned().unwrap_or(Mapping::new()) }); - // 开启tun将同时开启dns - revise!(dns_val, "enable", true); + if enable { + revise!(dns_val, "enable", true); + revise!(dns_val, "ipv6", true); + revise!(dns_val, "enhanced-mode", "fake-ip"); + revise!(dns_val, "fake-ip-range", "10.96.0.0/16"); + #[cfg(target_os = "macos")] + { + crate::utils::resolve::restore_public_dns().await; + crate::utils::resolve::set_public_dns("10.96.0.2".to_string()).await; + } + } else { + revise!(dns_val, "enhanced-mode", "redir-host"); + #[cfg(target_os = "macos")] + crate::utils::resolve::restore_public_dns().await; + } - append!(dns_val, "enhanced-mode", "fake-ip"); - append!(dns_val, "fake-ip-range", "198.18.0.1/16"); - append!( - dns_val, - "nameserver", - vec!["114.114.114.114", "223.5.5.5", "8.8.8.8"] - ); - append!(dns_val, "fallback", vec![] as Vec<&str>); - - #[cfg(target_os = "windows")] - append!( - dns_val, - "fake-ip-filter", - vec![ - "dns.msftncsi.com", - "www.msftncsi.com", - "www.msftconnecttest.com" - ] - ); + revise!(tun_val, "enable", enable); + revise!(config, "tun", tun_val); revise!(config, "dns", dns_val); config } diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 0260e5d0..a9137fea 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -7,31 +7,31 @@ use crate::config::*; use crate::core::*; use crate::log_err; +use crate::utils::dirs::app_home_dir; use crate::utils::resolve; use anyhow::{bail, Result}; +use reqwest_dav::list_cmd::ListFile; use serde_yaml::{Mapping, Value}; -use tauri::{AppHandle, Manager}; +use std::fs; +use tauri::Manager; use tauri_plugin_clipboard_manager::ClipboardExt; +use tauri_plugin_window_state::{AppHandleExt, StateFlags}; // 打开面板 pub fn open_or_close_dashboard() { - let handle = handle::Handle::global(); - let app_handle = handle.app_handle.lock(); - if let Some(app_handle) = app_handle.as_ref() { - if let Some(window) = app_handle.get_webview_window("main") { - if let Ok(true) = window.is_focused() { - let _ = window.close(); - return; - } + if let Some(window) = handle::Handle::global().get_window() { + if let Ok(true) = window.is_focused() { + let _ = window.hide(); + return; } - resolve::create_window(app_handle); } + resolve::create_window(); } // 重启clash pub fn restart_clash_core() { tauri::async_runtime::spawn(async { - match CoreManager::global().run_core().await { + match CoreManager::global().restart_core().await { Ok(_) => { handle::Handle::refresh_clash(); handle::Handle::notice_message("set_config::ok", "ok"); @@ -44,6 +44,19 @@ pub fn restart_clash_core() { }); } +pub fn restart_app() { + tauri::async_runtime::spawn_blocking(|| { + tauri::async_runtime::block_on(async { + log_err!(CoreManager::global().stop_core().await); + }); + resolve::resolve_reset(); + let app_handle = handle::Handle::global().app_handle().unwrap(); + std::thread::sleep(std::time::Duration::from_secs(1)); + let _ = app_handle.save_window_state(StateFlags::default()); + tauri::process::restart(&app_handle.env()); + }); +} + // 切换模式 rule/global/direct/script mode pub fn change_clash_mode(mode: String) { let mut mapping = Mapping::new(); @@ -103,6 +116,22 @@ pub fn toggle_tun_mode() { }); } +pub fn quit(code: Option) { + let app_handle = handle::Handle::global().app_handle().unwrap(); + handle::Handle::global().set_is_exiting(); + resolve::resolve_reset(); + log_err!(handle::Handle::global().get_window().unwrap().close()); + match app_handle.save_window_state(StateFlags::all()) { + Ok(_) => { + log::info!(target: "app", "window state saved successfully"); + } + Err(e) => { + log::error!(target: "app", "failed to save window state: {}", e); + } + }; + app_handle.exit(code.unwrap_or(0)); +} + /// 修改clash的订阅 pub async fn patch_clash(patch: Mapping) -> Result<()> { Config::clash().draft().patch_config(patch.clone()); @@ -111,16 +140,17 @@ pub async fn patch_clash(patch: Mapping) -> Result<()> { // 激活订阅 if patch.get("secret").is_some() || patch.get("external-controller").is_some() { Config::generate().await?; - CoreManager::global().run_core().await?; + CoreManager::global().restart_core().await?; handle::Handle::refresh_clash(); - } + } else { + if patch.get("mode").is_some() { + log_err!(handle::Handle::update_systray_part()); + } - if patch.get("mode").is_some() { - log_err!(handle::Handle::update_systray_part()); + Config::runtime().latest().patch_config(patch); + update_core_config(false).await?; } - Config::runtime().latest().patch_config(patch); - >::Ok(()) }; match res { @@ -140,6 +170,7 @@ pub async fn patch_clash(patch: Mapping) -> Result<()> { /// 一般都是一个个的修改 pub async fn patch_verge(patch: IVerge) -> Result<()> { Config::verge().draft().patch_config(patch.clone()); + let tun_mode = patch.enable_tun_mode; let auto_launch = patch.enable_auto_launch; let system_proxy = patch.enable_system_proxy; @@ -150,6 +181,8 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { let mixed_port = patch.verge_mixed_port; #[cfg(target_os = "macos")] let tray_icon = patch.tray_icon; + #[cfg(not(target_os = "macos"))] + let tray_icon: Option = None; let common_tray_icon = patch.common_tray_icon; let sysproxy_tray_icon = patch.sysproxy_tray_icon; let tun_tray_icon = patch.tun_tray_icon; @@ -165,34 +198,26 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { let socks_port = patch.verge_socks_port; let http_enabled = patch.verge_http_enabled; let http_port = patch.verge_port; - let res = { - let service_mode = patch.enable_service_mode; - let mut generated = false; - if service_mode.is_some() { - log::debug!(target: "app", "change service mode to {}", service_mode.unwrap()); - if !generated { - Config::generate().await?; - CoreManager::global().run_core().await?; - generated = true; - } - } else if tun_mode.is_some() { - update_core_config().await?; + + let res: std::result::Result<(), anyhow::Error> = { + let mut should_restart_core = false; + let mut should_update_clash_config = false; + let mut should_update_launch = false; + let mut should_update_sysproxy = false; + let mut should_update_systray_part = false; + + if tun_mode.is_some() { + should_update_clash_config = true; } + #[cfg(not(target_os = "windows"))] if redir_enabled.is_some() || redir_port.is_some() { - if !generated { - Config::generate().await?; - CoreManager::global().run_core().await?; - generated = true; - } + should_restart_core = true; } + #[cfg(target_os = "linux")] if tproxy_enabled.is_some() || tproxy_port.is_some() { - if !generated { - Config::generate().await?; - CoreManager::global().run_core().await?; - generated = true; - } + should_restart_core = true; } if socks_enabled.is_some() || http_enabled.is_some() @@ -200,13 +225,10 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { || http_port.is_some() || mixed_port.is_some() { - if !generated { - Config::generate().await?; - CoreManager::global().run_core().await?; - } + should_restart_core = true; } if auto_launch.is_some() { - sysopt::Sysopt::global().update_launch()?; + should_update_launch = true; } if system_proxy.is_some() || proxy_bypass.is_some() @@ -214,30 +236,39 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { || pac.is_some() || pac_content.is_some() { - sysopt::Sysopt::global().update_sysproxy()?; - sysopt::Sysopt::global().guard_proxy(); + should_update_sysproxy = true; } - if let Some(true) = patch.enable_proxy_guard { - sysopt::Sysopt::global().guard_proxy(); + if language.is_some() + || system_proxy.is_some() + || tun_mode.is_some() + || common_tray_icon.is_some() + || sysproxy_tray_icon.is_some() + || tun_tray_icon.is_some() + || tray_icon.is_some() + { + should_update_systray_part = true; + } + if should_restart_core { + Config::generate().await?; + CoreManager::global().restart_core().await?; + } + if should_update_clash_config { + update_core_config(false).await?; + } + if should_update_launch { + sysopt::Sysopt::global().update_launch()?; + } + + if should_update_sysproxy { + sysopt::Sysopt::global().update_sysproxy().await?; } if let Some(hotkeys) = patch.hotkeys { hotkey::Hotkey::global().update(hotkeys)?; } - if language.is_some() { - handle::Handle::update_systray()?; - } else if system_proxy.is_some() - || tun_mode.is_some() - || common_tray_icon.is_some() - || sysproxy_tray_icon.is_some() - || tun_tray_icon.is_some() - { - handle::Handle::update_systray_part()?; - } - #[cfg(target_os = "macos")] - if tray_icon.is_some() { + if should_update_systray_part { handle::Handle::update_systray_part()?; } @@ -247,6 +278,7 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { Ok(()) => { Config::verge().apply(); Config::verge().data().save_file()?; + Ok(()) } Err(err) => { @@ -288,29 +320,34 @@ pub async fn update_profile(uid: String, option: Option) -> Result<() }; if should_update { - update_core_config().await?; + update_core_config(true).await?; } Ok(()) } /// 更新订阅 -async fn update_core_config() -> Result<()> { +async fn update_core_config(notice: bool) -> Result<()> { match CoreManager::global().update_config().await { Ok(_) => { handle::Handle::refresh_clash(); - handle::Handle::notice_message("set_config::ok", "ok"); + if notice { + handle::Handle::notice_message("set_config::ok", "ok"); + } Ok(()) } Err(err) => { - handle::Handle::notice_message("set_config::error", format!("{err}")); + if notice { + handle::Handle::notice_message("set_config::error", format!("{err}")); + } Err(err) } } } /// copy env variable -pub fn copy_clash_env(app_handle: &AppHandle) { +pub fn copy_clash_env() { + let app_handle = handle::Handle::global().app_handle().unwrap(); let port = { Config::verge().latest().verge_mixed_port.unwrap_or(7897) }; let http_proxy = format!("http://127.0.0.1:{}", port); let socks5_proxy = format!("socks5://127.0.0.1:{}", port); @@ -387,3 +424,60 @@ pub async fn test_delay(url: String) -> Result { } } } + +pub async fn create_backup_and_upload_webdav() -> Result<()> { + let (file_name, temp_file_path) = backup::create_backup().map_err(|err| { + log::error!(target: "app", "Failed to create backup: {:#?}", err); + err + })?; + + if let Err(err) = backup::WebDavClient::global() + .upload(temp_file_path.clone(), file_name) + .await + { + log::error!(target: "app", "Failed to upload to WebDAV: {:#?}", err); + return Err(err); + } + + if let Err(err) = std::fs::remove_file(&temp_file_path) { + log::warn!(target: "app", "Failed to remove temp file: {:#?}", err); + } + + Ok(()) +} + +pub async fn list_wevdav_backup() -> Result> { + backup::WebDavClient::global().list().await.map_err(|err| { + log::error!(target: "app", "Failed to list WebDAV backup files: {:#?}", err); + err + }) +} + +pub async fn delete_webdav_backup(filename: String) -> Result<()> { + backup::WebDavClient::global() + .delete(filename) + .await + .map_err(|err| { + log::error!(target: "app", "Failed to delete WebDAV backup file: {:#?}", err); + err + }) +} + +pub async fn restore_webdav_backup(filename: String) -> Result<()> { + let backup_storage_path = app_home_dir().unwrap().join(&filename); + backup::WebDavClient::global() + .download(filename, backup_storage_path.clone()) + .await + .map_err(|err| { + log::error!(target: "app", "Failed to download WebDAV backup file: {:#?}", err); + err + })?; + + // extract zip file + let mut zip = zip::ZipArchive::new(fs::File::open(backup_storage_path.clone())?)?; + zip.extract(app_home_dir()?)?; + + // 最后删除临时文件 + fs::remove_file(backup_storage_path)?; + Ok(()) +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs new file mode 100644 index 00000000..73934f64 --- /dev/null +++ b/src-tauri/src/lib.rs @@ -0,0 +1,202 @@ +mod cmds; +mod config; +mod core; +mod enhance; +mod feat; +mod utils; +use crate::core::hotkey; +use crate::utils::{resolve, resolve::resolve_scheme, server}; +#[cfg(target_os = "macos")] +use tauri::Listener; +use tauri_plugin_autostart::MacosLauncher; + +pub fn run() { + // 单例检测 + let app_exists: bool = tauri::async_runtime::block_on(async move { + if server::check_singleton().await.is_err() { + println!("app exists"); + true + } else { + false + } + }); + if app_exists { + return; + } + + #[cfg(target_os = "linux")] + std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1"); + + #[cfg(debug_assertions)] + let devtools = tauri_plugin_devtools::init(); + + #[allow(unused_mut)] + let mut builder = tauri::Builder::default() + .plugin(tauri_plugin_autostart::init( + MacosLauncher::LaunchAgent, + None, + )) + .plugin(tauri_plugin_window_state::Builder::new().build()) + .plugin(tauri_plugin_updater::Builder::new().build()) + .plugin(tauri_plugin_clipboard_manager::init()) + .plugin(tauri_plugin_process::init()) + .plugin(tauri_plugin_global_shortcut::Builder::new().build()) + .plugin(tauri_plugin_notification::init()) + .plugin(tauri_plugin_fs::init()) + .plugin(tauri_plugin_dialog::init()) + .plugin(tauri_plugin_shell::init()) + .plugin(tauri_plugin_deep_link::init()) + .plugin(tauri_plugin_window_state::Builder::default().build()) + .setup(|app| { + #[cfg(target_os = "linux")] + { + use tauri_plugin_deep_link::DeepLinkExt; + log_err!(app.deep_link().register_all()); + } + #[cfg(target_os = "macos")] + { + app.listen("deep-link://new-url", |event| { + tauri::async_runtime::spawn(async move { + let payload = event.payload(); + log_err!(resolve_scheme(payload.to_owned()).await); + }); + }); + } + tauri::async_runtime::block_on(async move { + resolve::resolve_setup(app).await; + + #[cfg(not(target_os = "macos"))] + { + let argvs: Vec = std::env::args().collect(); + if argvs.len() > 1 { + log_err!(resolve_scheme(argvs[1].to_owned()).await); + } + } + }); + + Ok(()) + }) + .invoke_handler(tauri::generate_handler![ + // common + cmds::get_sys_proxy, + cmds::get_auto_proxy, + cmds::open_app_dir, + cmds::open_logs_dir, + cmds::open_web_url, + cmds::open_core_dir, + cmds::get_portable_flag, + cmds::get_network_interfaces, + // cmds::kill_sidecar, + cmds::restart_core, + cmds::restart_app, + // clash + cmds::get_clash_info, + cmds::patch_clash_config, + cmds::change_clash_core, + cmds::get_runtime_config, + cmds::get_runtime_yaml, + cmds::get_runtime_exists, + cmds::get_runtime_logs, + cmds::uwp::invoke_uwp_tool, + cmds::copy_clash_env, + // verge + cmds::get_verge_config, + cmds::patch_verge_config, + cmds::test_delay, + cmds::get_app_dir, + cmds::copy_icon_file, + cmds::download_icon_cache, + cmds::open_devtools, + cmds::exit_app, + cmds::get_network_interfaces_info, + // cmds::update_hotkeys, + // profile + cmds::get_profiles, + cmds::enhance_profiles, + cmds::patch_profiles_config, + cmds::view_profile, + cmds::patch_profile, + cmds::create_profile, + cmds::import_profile, + cmds::reorder_profile, + cmds::update_profile, + cmds::delete_profile, + cmds::read_profile_file, + cmds::save_profile_file, + // clash api + cmds::clash_api_get_proxy_delay, + // backup + cmds::create_webdav_backup, + cmds::save_webdav_config, + cmds::list_webdav_backup, + cmds::delete_webdav_backup, + cmds::restore_webdav_backup, + ]); + + #[cfg(debug_assertions)] + { + builder = builder.plugin(devtools); + } + + let app = builder + .build(tauri::generate_context!()) + .expect("error while running tauri application"); + + app.run(|_, e| match e { + tauri::RunEvent::ExitRequested { api, code, .. } => { + if code.is_none() { + api.prevent_exit(); + return; + } + } + tauri::RunEvent::WindowEvent { label, event, .. } => { + if label == "main" { + match event { + tauri::WindowEvent::CloseRequested { api, .. } => { + if core::handle::Handle::global().is_exiting() { + return; + } + println!("closing window..."); + api.prevent_close(); + let window = core::handle::Handle::global().get_window().unwrap(); + let _ = window.hide(); + } + tauri::WindowEvent::Focused(true) => { + #[cfg(target_os = "macos")] + { + log_err!(hotkey::Hotkey::global().register("CMD+Q", "quit")); + } + + #[cfg(not(target_os = "macos"))] + { + log_err!(hotkey::Hotkey::global().register("Control+Q", "quit")); + }; + } + tauri::WindowEvent::Focused(false) => { + #[cfg(target_os = "macos")] + { + log_err!(hotkey::Hotkey::global().unregister("CMD+Q")); + } + #[cfg(not(target_os = "macos"))] + { + log_err!(hotkey::Hotkey::global().unregister("Control+Q")); + }; + } + tauri::WindowEvent::Destroyed => { + #[cfg(target_os = "macos")] + { + log_err!(hotkey::Hotkey::global().unregister("CMD+Q")); + } + + #[cfg(not(target_os = "macos"))] + { + log_err!(hotkey::Hotkey::global().unregister("Control+Q")); + }; + } + _ => {} + } + } + } + _ => {} + }); +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs old mode 100644 new mode 100755 index fe0fb9c9..293b1b22 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -1,139 +1,4 @@ -#![cfg_attr( - all(not(debug_assertions), target_os = "windows"), - windows_subsystem = "windows" -)] - -mod cmds; -mod config; -mod core; -mod enhance; -mod feat; -mod utils; - -use crate::utils::{resolve, server}; - -fn main() -> std::io::Result<()> { - // 单例检测 - let app_exists: bool = tauri::async_runtime::block_on(async move { - if server::check_singleton().await.is_err() { - println!("app exists"); - true - } else { - false - } - }); - if app_exists { - return Ok(()); - } - - #[cfg(target_os = "linux")] - std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1"); - - #[cfg(debug_assertions)] - let devtools = tauri_plugin_devtools::init(); - - #[allow(unused_mut)] - let mut builder = tauri::Builder::default() - .plugin(tauri_plugin_updater::Builder::new().build()) - .plugin(tauri_plugin_clipboard_manager::init()) - .plugin(tauri_plugin_process::init()) - .plugin(tauri_plugin_global_shortcut::Builder::new().build()) - .plugin(tauri_plugin_notification::init()) - .plugin(tauri_plugin_fs::init()) - .plugin(tauri_plugin_dialog::init()) - .plugin(tauri_plugin_shell::init()) - .setup(|app| { - tauri::async_runtime::block_on(async move { - resolve::resolve_setup(app).await; - }); - Ok(()) - }) - .invoke_handler(tauri::generate_handler![ - // common - cmds::get_sys_proxy, - cmds::get_auto_proxy, - cmds::open_app_dir, - cmds::open_logs_dir, - cmds::open_web_url, - cmds::open_core_dir, - cmds::get_portable_flag, - cmds::get_network_interfaces, - // cmds::kill_sidecar, - cmds::restart_sidecar, - // clash - cmds::get_clash_info, - cmds::get_clash_logs, - cmds::patch_clash_config, - cmds::change_clash_core, - cmds::get_runtime_config, - cmds::get_runtime_yaml, - cmds::get_runtime_exists, - cmds::get_runtime_logs, - cmds::uwp::invoke_uwp_tool, - cmds::copy_clash_env, - // verge - cmds::get_verge_config, - cmds::patch_verge_config, - cmds::test_delay, - cmds::get_app_dir, - cmds::copy_icon_file, - cmds::download_icon_cache, - cmds::open_devtools, - cmds::exit_app, - cmds::get_network_interfaces_info, - // cmds::update_hotkeys, - // profile - cmds::get_profiles, - cmds::enhance_profiles, - cmds::patch_profiles_config, - cmds::view_profile, - cmds::patch_profile, - cmds::create_profile, - cmds::import_profile, - cmds::reorder_profile, - cmds::update_profile, - cmds::delete_profile, - cmds::read_profile_file, - cmds::save_profile_file, - // service mode - cmds::service::check_service, - cmds::service::install_service, - cmds::service::uninstall_service, - // clash api - cmds::clash_api_get_proxy_delay - ]); - - #[cfg(debug_assertions)] - { - builder = builder.plugin(devtools); - } - - let app = builder - .build(tauri::generate_context!()) - .expect("error while running tauri application"); - - app.run(|app_handle, e| match e { - tauri::RunEvent::ExitRequested { api, .. } => { - api.prevent_exit(); - } - tauri::RunEvent::WindowEvent { label, event, .. } => { - if label == "main" { - match event { - tauri::WindowEvent::Destroyed => { - let _ = resolve::save_window_size_position(app_handle, true); - } - tauri::WindowEvent::CloseRequested { .. } => { - let _ = resolve::save_window_size_position(app_handle, true); - } - tauri::WindowEvent::Moved(_) | tauri::WindowEvent::Resized(_) => { - let _ = resolve::save_window_size_position(app_handle, false); - } - _ => {} - } - } - } - _ => {} - }); - - Ok(()) +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] +fn main() { + app_lib::run(); } diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs index 227e1261..d4d8ddbf 100644 --- a/src-tauri/src/utils/dirs.rs +++ b/src-tauri/src/utils/dirs.rs @@ -1,19 +1,25 @@ use crate::core::handle; use anyhow::Result; use once_cell::sync::OnceCell; +use std::fs; use std::path::PathBuf; use tauri::Manager; #[cfg(not(feature = "verge-dev"))] pub static APP_ID: &str = "io.github.clash-verge-rev.clash-verge-rev"; +#[cfg(not(feature = "verge-dev"))] +pub static BACKUP_DIR: &str = "clash-verge-rev-backup"; + #[cfg(feature = "verge-dev")] pub static APP_ID: &str = "io.github.clash-verge-rev.clash-verge-rev.dev"; +#[cfg(feature = "verge-dev")] +pub static BACKUP_DIR: &str = "clash-verge-rev-backup-dev"; pub static PORTABLE_FLAG: OnceCell = OnceCell::new(); -static CLASH_CONFIG: &str = "config.yaml"; -static VERGE_CONFIG: &str = "verge.yaml"; -static PROFILE_YAML: &str = "profiles.yaml"; +pub static CLASH_CONFIG: &str = "config.yaml"; +pub static VERGE_CONFIG: &str = "verge.yaml"; +pub static PROFILE_YAML: &str = "profiles.yaml"; /// init portable flag pub fn init_portable_flag() -> Result<()> { @@ -44,40 +50,27 @@ pub fn app_home_dir() -> Result { .ok_or(anyhow::anyhow!("failed to get the portable app dir"))?; return Ok(PathBuf::from(app_dir).join(".config").join(APP_ID)); } + let app_handle = handle::Handle::global().app_handle().unwrap(); - let handle = handle::Handle::global(); - let app_handle = handle.app_handle.lock(); - - if let Some(app_handle) = app_handle.as_ref() { - match app_handle.path().data_dir() { - Ok(dir) => { - return Ok(dir.join(APP_ID)); - } - Err(e) => { - log::error!("Failed to get the app home directory: {}", e); - return Err(anyhow::anyhow!("Failed to get the app homedirectory")); - } + match app_handle.path().data_dir() { + Ok(dir) => Ok(dir.join(APP_ID)), + Err(e) => { + log::error!(target:"app", "Failed to get the app home directory: {}", e); + Err(anyhow::anyhow!("Failed to get the app homedirectory")) } } - Err(anyhow::anyhow!("failed to get the app home dir")) } /// get the resources dir pub fn app_resources_dir() -> Result { - let handle = handle::Handle::global(); - let app_handle = handle.app_handle.lock(); - if let Some(app_handle) = app_handle.as_ref() { - match app_handle.path().resource_dir() { - Ok(dir) => { - return Ok(dir.join("resources")); - } - Err(e) => { - log::error!("Failed to get the resource directory: {}", e); - return Err(anyhow::anyhow!("Failed to get the resource directory")); - } - }; - }; - Err(anyhow::anyhow!("failed to get the resource dir")) + let app_handle = handle::Handle::global().app_handle().unwrap(); + match app_handle.path().resource_dir() { + Ok(dir) => Ok(dir.join("resources")), + Err(e) => { + log::error!(target:"app", "Failed to get the resource directory: {}", e); + Err(anyhow::anyhow!("Failed to get the resource directory")) + } + } } /// profiles dir @@ -102,11 +95,7 @@ pub fn profiles_path() -> Result { Ok(app_home_dir()?.join(PROFILE_YAML)) } -pub fn clash_pid_path() -> Result { - Ok(app_home_dir()?.join("clash.pid")) -} - -#[cfg(not(target_os = "windows"))] +#[cfg(target_os = "macos")] pub fn service_path() -> Result { Ok(app_resources_dir()?.join("clash-verge-service")) } @@ -137,3 +126,27 @@ pub fn path_to_str(path: &PathBuf) -> Result<&str> { .ok_or(anyhow::anyhow!("failed to get path from {:?}", path))?; Ok(path_str) } + +pub fn get_encryption_key() -> Result> { + let app_dir = app_home_dir()?; + let key_path = app_dir.join(".encryption_key"); + + if key_path.exists() { + // Read existing key + fs::read(&key_path).map_err(|e| anyhow::anyhow!("Failed to read encryption key: {}", e)) + } else { + // Generate and save new key + let mut key = vec![0u8; 32]; + getrandom::getrandom(&mut key)?; + + // Ensure directory exists + if let Some(parent) = key_path.parent() { + fs::create_dir_all(parent) + .map_err(|e| anyhow::anyhow!("Failed to create key directory: {}", e))?; + } + // Save key + fs::write(&key_path, &key) + .map_err(|e| anyhow::anyhow!("Failed to save encryption key: {}", e))?; + Ok(key) + } +} diff --git a/src-tauri/src/utils/error.rs b/src-tauri/src/utils/error.rs new file mode 100644 index 00000000..d661b609 --- /dev/null +++ b/src-tauri/src/utils/error.rs @@ -0,0 +1,40 @@ +use crate::log_err; +use anyhow; +use std::{ + backtrace::{Backtrace, BacktraceStatus}, + thread, +}; + +pub fn redirect_panic_to_log() { + std::panic::set_hook(Box::new(move |panic_info| { + let thread = thread::current(); + let thread_name = thread.name().unwrap_or(""); + let payload = panic_info.payload(); + + let payload = if let Some(s) = payload.downcast_ref::<&str>() { + &**s + } else if let Some(s) = payload.downcast_ref::() { + s + } else { + &format!("{:?}", payload) + }; + + let location = panic_info + .location() + .map(|l| l.to_string()) + .unwrap_or("unknown location".to_string()); + + let backtrace = Backtrace::capture(); + let backtrace = if backtrace.status() == BacktraceStatus::Captured { + &format!("stack backtrace:\n{}", backtrace) + } else { + "note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace" + }; + + let err: Result<(), anyhow::Error> = Err(anyhow::anyhow!(format!( + "thread '{}' panicked at {}:\n{}\n{}", + thread_name, location, payload, backtrace + ))); + log_err!(err); + })); +} diff --git a/src-tauri/src/utils/help.rs b/src-tauri/src/utils/help.rs index 3583540a..0f6876c7 100644 --- a/src-tauri/src/utils/help.rs +++ b/src-tauri/src/utils/help.rs @@ -101,10 +101,38 @@ pub fn get_last_part_and_decode(url: &str) -> Option { /// open file /// use vscode by default pub fn open_file(app: tauri::AppHandle, path: PathBuf) -> Result<()> { - app.shell().open(path.to_string_lossy(), None).unwrap(); + #[cfg(target_os = "macos")] + let code = "Visual Studio Code"; + #[cfg(not(target_os = "macos"))] + let code = "code"; + if let Err(err) = open::with(&path.as_os_str(), code) { + log::error!(target: "app", "Can not open file with VS code, {}", err); + // default open + app.shell().open(path.to_string_lossy(), None)?; + }; Ok(()) } +#[cfg(target_os = "linux")] +pub fn linux_elevator() -> String { + use std::process::Command; + match Command::new("which").arg("pkexec").output() { + Ok(output) => { + if !output.stdout.is_empty() { + // Convert the output to a string slice + if let Ok(path) = std::str::from_utf8(&output.stdout) { + path.trim().to_string() + } else { + "sudo".to_string() + } + } else { + "sudo".to_string() + } + } + Err(_) => "sudo".to_string(), + } +} + #[macro_export] macro_rules! error { ($result: expr) => { diff --git a/src-tauri/src/utils/init.rs b/src-tauri/src/utils/init.rs index 621450a0..1cb509ea 100644 --- a/src-tauri/src/utils/init.rs +++ b/src-tauri/src/utils/init.rs @@ -1,4 +1,5 @@ use crate::config::*; +use crate::core::handle; use crate::utils::{dirs, help}; use anyhow::Result; use chrono::{Local, TimeZone}; @@ -10,7 +11,6 @@ use log4rs::encode::pattern::PatternEncoder; use std::fs::{self, DirEntry}; use std::path::PathBuf; use std::str::FromStr; -use tauri::AppHandle; use tauri_plugin_shell::ShellExt; /// initialize this instance's log file @@ -44,21 +44,9 @@ fn init_log() -> Result<()> { let log_more = log_level == LevelFilter::Trace || log_level == LevelFilter::Debug; - #[cfg(feature = "verge-dev")] - { - logger_builder = logger_builder.appenders(["file", "stdout"]); - if log_more { - root_builder = root_builder.appenders(["file", "stdout"]); - } else { - root_builder = root_builder.appenders(["stdout"]); - } - } - #[cfg(not(feature = "verge-dev"))] - { - logger_builder = logger_builder.appenders(["file"]); - if log_more { - root_builder = root_builder.appenders(["file"]); - } + logger_builder = logger_builder.appenders(["file"]); + if log_more { + root_builder = root_builder.appenders(["file"]); } let (config, _) = log4rs::config::Config::builder() @@ -207,8 +195,10 @@ pub fn init_resources() -> Result<()> { #[cfg(target_os = "windows")] let file_list = ["Country.mmdb", "geoip.dat", "geosite.dat"]; - #[cfg(not(target_os = "windows"))] + #[cfg(target_os = "macos")] let file_list = ["Country.mmdb", "geoip.dat", "geosite.dat"]; + #[cfg(target_os = "linux")] + let file_list: [&str; 0] = []; // copy the resource file // if the source file is newer than the destination file, copy it over @@ -216,12 +206,13 @@ pub fn init_resources() -> Result<()> { let src_path = res_dir.join(file); let dest_path = app_dir.join(file); let test_dest_path = test_dir.join(file); + log::debug!(target: "app", "src_path: {src_path:?}, dest_path: {dest_path:?}"); let handle_copy = |dest: &PathBuf| { match fs::copy(&src_path, dest) { Ok(_) => log::debug!(target: "app", "resources copied '{file}'"), Err(err) => { - log::error!(target: "app", "failed to copy resources '{file}', {err}") + log::error!(target: "app", "failed to copy resources '{file}' to '{dest:?}', {err}") } }; }; @@ -297,7 +288,9 @@ pub fn init_scheme() -> Result<()> { Ok(()) } -pub async fn startup_script(app_handle: &AppHandle) -> Result<()> { +pub async fn startup_script() -> Result<()> { + let app_handle = handle::Handle::global().app_handle().unwrap(); + let script_path = { let verge = Config::verge(); let verge = verge.latest(); @@ -330,7 +323,7 @@ pub async fn startup_script(app_handle: &AppHandle) -> Result<()> { app_handle .shell() .command(shell_type) - .current_dir(working_dir.to_path_buf()) + .current_dir(working_dir) .args(&[script_path]) .output() .await?; diff --git a/src-tauri/src/utils/mod.rs b/src-tauri/src/utils/mod.rs index 28eacc3b..b5ee04e7 100644 --- a/src-tauri/src/utils/mod.rs +++ b/src-tauri/src/utils/mod.rs @@ -1,4 +1,5 @@ pub mod dirs; +pub mod error; pub mod help; pub mod init; pub mod resolve; diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 079004e6..d23ab11d 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -1,12 +1,16 @@ -use crate::cmds::import_profile; use crate::config::IVerge; -use crate::{config::Config, core::*, utils::init, utils::server}; -use crate::{log_err, trace_err}; -use anyhow::Result; +use crate::utils::error; +use crate::{config::Config, config::PrfItem, core::*, utils::init, utils::server}; +use crate::{log_err, trace_err, wrap_err}; +use anyhow::{bail, Result}; use once_cell::sync::OnceCell; +use percent_encoding::percent_decode_str; use serde_yaml::Mapping; use std::net::TcpListener; -use tauri::{App, AppHandle, Manager}; +use tauri::{App, Manager}; +use tauri_plugin_window_state::{StateFlags, WindowExt}; + +use url::Url; //#[cfg(not(target_os = "linux"))] // use window_shadows::set_shadow; use tauri_plugin_notification::NotificationExt; @@ -32,98 +36,100 @@ pub fn find_unused_port() -> Result { /// handle something when start app pub async fn resolve_setup(app: &mut App) { + error::redirect_panic_to_log(); #[cfg(target_os = "macos")] app.set_activation_policy(tauri::ActivationPolicy::Accessory); let version = app.package_info().version.to_string(); + handle::Handle::global().init(app.app_handle()); VERSION.get_or_init(|| version.clone()); + log_err!(init::init_config()); log_err!(init::init_resources()); log_err!(init::init_scheme()); - log_err!(init::startup_script(app.app_handle()).await); + log_err!(init::startup_script().await); // 处理随机端口 - let enable_random_port = Config::verge().latest().enable_random_port.unwrap_or(false); - - let mut port = Config::verge() - .latest() - .verge_mixed_port - .unwrap_or(Config::clash().data().get_mixed_port()); - - if enable_random_port { - port = find_unused_port().unwrap_or( - Config::verge() - .latest() - .verge_mixed_port - .unwrap_or(Config::clash().data().get_mixed_port()), - ); - } - - Config::verge().data().patch_config(IVerge { - verge_mixed_port: Some(port), - ..IVerge::default() - }); - let _ = Config::verge().data().save_file(); - let mut mapping = Mapping::new(); - mapping.insert("mixed-port".into(), port.into()); - Config::clash().data().patch_config(mapping); - let _ = Config::clash().data().save_config(); - + log_err!(resolve_random_port_config()); // 启动核心 - log::trace!("init config"); - + log::trace!(target:"app", "init config"); log_err!(Config::init_config().await); - log::trace!("launch core"); - log_err!(CoreManager::global().init(app.app_handle())); + if service::check_service().await.is_err() { + match service::reinstall_service().await { + Ok(_) => { + log::info!(target:"app", "install service susccess."); + #[cfg(not(target_os = "macos"))] + std::thread::sleep(std::time::Duration::from_millis(1000)); + #[cfg(target_os = "macos")] + { + let mut service_runing = false; + for _ in 0..40 { + if service::check_service().await.is_ok() { + service_runing = true; + break; + } else { + log::warn!(target: "app", "service not runing, sleep 500ms and check again."); + std::thread::sleep(std::time::Duration::from_millis(500)); + } + } + if !service_runing { + log::error!(target: "app", "service not runing. exit"); + app.app_handle().exit(-2); + } + } + } + Err(e) => { + log::error!(target: "app", "{e:?}"); + app.app_handle().exit(-1); + } + } + } + + log::trace!(target: "app", "launch core"); + log_err!(CoreManager::global().init().await); // setup a simple http server for singleton - log::trace!("launch embed server"); - server::embed_server(app.app_handle()); + log::trace!(target: "app", "launch embed server"); + server::embed_server(); - log::trace!("init system tray"); - log_err!(tray::Tray::update_systray(&app.app_handle())); + log::trace!(target: "app", "init system tray"); + log_err!(tray::Tray::create_systray()); let silent_start = { Config::verge().data().enable_silent_start }; if !silent_start.unwrap_or(false) { - create_window(&app.app_handle()); + create_window(); } - log_err!(sysopt::Sysopt::global().init_launch()); - log_err!(sysopt::Sysopt::global().init_sysproxy()); + log_err!(sysopt::Sysopt::global().update_sysproxy().await); + log_err!(sysopt::Sysopt::global().init_guard_sysproxy()); log_err!(handle::Handle::update_systray_part()); - log_err!(hotkey::Hotkey::global().init(app.app_handle())); + log_err!(hotkey::Hotkey::global().init()); log_err!(timer::Timer::global().init()); - - let argvs: Vec = std::env::args().collect(); - if argvs.len() > 1 { - let param = argvs[1].as_str(); - if param.starts_with("clash:") { - log_err!(resolve_scheme(argvs[1].to_owned()).await); - } - } } /// reset system proxy pub fn resolve_reset() { - log_err!(sysopt::Sysopt::global().reset_sysproxy()); tauri::async_runtime::block_on(async move { + log_err!(sysopt::Sysopt::global().reset_sysproxy().await); log_err!(CoreManager::global().stop_core().await); - log_err!(service::unset_dns_by_service().await); + #[cfg(target_os = "macos")] + restore_public_dns().await; }); } /// create main window -pub fn create_window(app_handle: &AppHandle) { - if let Some(window) = app_handle.get_webview_window("main") { - trace_err!(window.unminimize(), "set win unminimize"); +pub fn create_window() { + let app_handle = handle::Handle::global().app_handle().unwrap(); + + if let Some(window) = handle::Handle::global().get_window() { trace_err!(window.show(), "set win visible"); trace_err!(window.set_focus(), "set win focus"); return; } - let mut builder = tauri::WebviewWindowBuilder::new( - app_handle, + let builder = tauri::WebviewWindowBuilder::new( + &app_handle, "main".to_string(), tauri::WebviewUrl::App("index.html".into()), ) @@ -132,140 +138,226 @@ pub fn create_window(app_handle: &AppHandle) { .fullscreen(false) .min_inner_size(600.0, 520.0); - match Config::verge().latest().window_size_position.clone() { - Some(size_pos) if size_pos.len() == 4 => { - let size = (size_pos[0], size_pos[1]); - let pos = (size_pos[2], size_pos[3]); - let w = size.0.clamp(600.0, f64::INFINITY); - let h = size.1.clamp(520.0, f64::INFINITY); - builder = builder.inner_size(w, h).position(pos.0, pos.1); - } - _ => { - #[cfg(target_os = "windows")] - { - builder = builder.inner_size(800.0, 636.0).center(); - } - - #[cfg(target_os = "macos")] - { - builder = builder.inner_size(800.0, 642.0).center(); - } - - #[cfg(target_os = "linux")] - { - builder = builder.inner_size(800.0, 642.0).center(); - } - } - }; #[cfg(target_os = "windows")] let window = builder .decorations(false) + .maximizable(true) .additional_browser_args("--enable-features=msWebView2EnableDraggableRegions --disable-features=OverscrollHistoryNavigation,msExperimentalScrolling") .transparent(true) .visible(false) - .build(); + .build().unwrap(); + #[cfg(target_os = "macos")] let window = builder .decorations(true) .hidden_title(true) .title_bar_style(tauri::TitleBarStyle::Overlay) - .build(); + .build() + .unwrap(); + #[cfg(target_os = "linux")] - let window = builder.decorations(false).transparent(true).build(); + let window = builder + .decorations(false) + .transparent(true) + .build() + .unwrap(); - match window { - Ok(win) => { - let is_maximized = Config::verge() - .latest() - .window_is_maximized - .unwrap_or(false); - log::trace!("try to calculate the monitor size"); - let center = (|| -> Result { - let mut center = false; - let monitor = win.current_monitor()?.ok_or(anyhow::anyhow!(""))?; - let size = monitor.size(); - let pos = win.outer_position()?; - - if pos.x < -400 - || pos.x > (size.width - 200) as i32 - || pos.y < -200 - || pos.y > (size.height - 200) as i32 - { - center = true; - } - Ok(center) - })(); - if center.unwrap_or(true) { - trace_err!(win.center(), "set win center"); - } - - // #[cfg(not(target_os = "linux"))] - // trace_err!(set_shadow(&win, true), "set win shadow"); - if is_maximized { - trace_err!(win.maximize(), "set win maximize"); - } + match window.restore_state(StateFlags::all()) { + Ok(_) => { + log::info!(target: "app", "window state restored successfully"); } - Err(_) => { - log::error!("failed to create window"); + Err(e) => { + log::error!(target: "app", "failed to restore window state: {}", e); + #[cfg(target_os = "windows")] + window + .set_size(tauri::Size::Physical(tauri::PhysicalSize { + width: 800, + height: 636, + })) + .unwrap(); + + #[cfg(not(target_os = "windows"))] + window + .set_size(tauri::Size::Physical(tauri::PhysicalSize { + width: 800, + height: 642, + })) + .unwrap(); } - } -} - -/// save window size and position -pub fn save_window_size_position(app_handle: &AppHandle, save_to_file: bool) -> Result<()> { - let verge = Config::verge(); - let mut verge = verge.latest(); - - if save_to_file { - verge.save_file()?; - } - - let win = app_handle - .get_webview_window("main") - .ok_or(anyhow::anyhow!("failed to get window"))?; - - let scale = win.scale_factor()?; - let size = win.inner_size()?; - let size = size.to_logical::(scale); - let pos = win.outer_position()?; - let pos = pos.to_logical::(scale); - let is_maximized = win.is_maximized()?; - verge.window_is_maximized = Some(is_maximized); - if !is_maximized && size.width >= 600.0 && size.height >= 520.0 { - verge.window_size_position = Some(vec![size.width, size.height, pos.x, pos.y]); - } - Ok(()) + }; } pub async fn resolve_scheme(param: String) -> Result<()> { - let url = param - .trim_start_matches("clash://install-config/?url=") - .trim_start_matches("clash://install-config?url="); + log::info!(target:"app", "received deep link: {}", param); - let handle = handle::Handle::global(); - let app_handle = handle.app_handle.lock().clone(); - if let Some(app_handle) = app_handle.as_ref() { - match import_profile(url.to_string(), None).await { - Ok(_) => { - app_handle - .notification() - .builder() - .title("Clash Verge") - .body("Import profile success") - .show() - .unwrap(); - } - Err(e) => { - app_handle - .notification() - .builder() - .title("Clash Verge") - .body(format!("Import profile failed: {e}")) - .show() - .unwrap(); - log::error!("Import profile failed: {e}"); + let app_handle = handle::Handle::global().app_handle().unwrap(); + + let param_str = if param.starts_with("[") && param.len() > 4 { + param + .get(2..param.len() - 2) + .ok_or_else(|| anyhow::anyhow!("Invalid string slice boundaries"))? + } else { + param.as_str() + }; + + // 解析 URL + let link_parsed = match Url::parse(param_str) { + Ok(url) => url, + Err(e) => { + bail!("failed to parse deep link: {:?}, param: {:?}", e, param); + } + }; + + if link_parsed.scheme() == "clash" || link_parsed.scheme() == "clash-verge" { + let name = link_parsed + .query_pairs() + .find(|(key, _)| key == "name") + .map(|(_, value)| value.into_owned()); + + let encode_url = link_parsed + .query_pairs() + .find(|(key, _)| key == "url") + .map(|(_, value)| value.into_owned()); + + match encode_url { + Some(url) => { + let url = percent_decode_str(url.as_ref()) + .decode_utf8_lossy() + .to_string(); + + create_window(); + match PrfItem::from_url(url.as_ref(), name, None, None).await { + Ok(item) => { + let uid = item.uid.clone().unwrap(); + let _ = wrap_err!(Config::profiles().data().append_item(item)); + app_handle + .notification() + .builder() + .title("Clash Verge") + .body("Import profile success") + .show() + .unwrap(); + + handle::Handle::notice_message("import_sub_url::ok", uid); + } + Err(e) => { + app_handle + .notification() + .builder() + .title("Clash Verge") + .body(format!("Import profile failed: {e}")) + .show() + .unwrap(); + handle::Handle::notice_message("import_sub_url::error", e.to_string()); + bail!("Failed to add subscriptions: {e}"); + } + } } + None => bail!("failed to get profile url"), } } + Ok(()) } + +fn resolve_random_port_config() -> Result<()> { + let verge_config = Config::verge(); + let clash_config = Config::clash(); + let enable_random_port = verge_config.latest().enable_random_port.unwrap_or(false); + + let default_port = verge_config + .latest() + .verge_mixed_port + .unwrap_or(clash_config.data().get_mixed_port()); + + let port = if enable_random_port { + find_unused_port().unwrap_or(default_port) + } else { + default_port + }; + + verge_config.data().patch_config(IVerge { + verge_mixed_port: Some(port), + ..IVerge::default() + }); + verge_config.data().save_file()?; + + let mut mapping = Mapping::new(); + mapping.insert("mixed-port".into(), port.into()); + clash_config.data().patch_config(mapping); + clash_config.data().save_config()?; + Ok(()) +} + +#[cfg(target_os = "macos")] +pub async fn set_public_dns(dns_server: String) { + use crate::core::handle; + use crate::utils::dirs; + use tauri_plugin_shell::ShellExt; + let app_handle = handle::Handle::global().app_handle().unwrap(); + + log::info!(target: "app", "try to set system dns"); + let resource_dir = dirs::app_resources_dir().unwrap(); + let script = resource_dir.join("set_dns.sh"); + if !script.exists() { + log::error!(target: "app", "set_dns.sh not found"); + return; + } + let script = script.to_string_lossy().into_owned(); + match app_handle + .shell() + .command("bash") + .args([script, dns_server]) + .current_dir(resource_dir) + .status() + .await + { + Ok(status) => { + if status.success() { + log::info!(target: "app", "set system dns successfully"); + } else { + let code = status.code().unwrap_or(-1); + log::error!(target: "app", "set system dns failed: {code}"); + } + } + Err(err) => { + log::error!(target: "app", "set system dns failed: {err}"); + } + } +} + +#[cfg(target_os = "macos")] +pub async fn restore_public_dns() { + use crate::core::handle; + use crate::utils::dirs; + use tauri_plugin_shell::ShellExt; + let app_handle = handle::Handle::global().app_handle().unwrap(); + log::info!(target: "app", "try to unset system dns"); + let resource_dir = dirs::app_resources_dir().unwrap(); + let script = resource_dir.join("unset_dns.sh"); + if !script.exists() { + log::error!(target: "app", "unset_dns.sh not found"); + return; + } + let script = script.to_string_lossy().into_owned(); + match app_handle + .shell() + .command("bash") + .args([script]) + .current_dir(resource_dir) + .status() + .await + { + Ok(status) => { + if status.success() { + log::info!(target: "app", "unset system dns successfully"); + } else { + let code = status.code().unwrap_or(-1); + log::error!(target: "app", "unset system dns failed: {code}"); + } + } + Err(err) => { + log::error!(target: "app", "unset system dns failed: {err}"); + } + } +} diff --git a/src-tauri/src/utils/server.rs b/src-tauri/src/utils/server.rs index 3090da36..2f2b20bb 100644 --- a/src-tauri/src/utils/server.rs +++ b/src-tauri/src/utils/server.rs @@ -2,11 +2,10 @@ extern crate warp; use super::resolve; use crate::config::{Config, IVerge, DEFAULT_PAC}; +use crate::log_err; use anyhow::{bail, Result}; use port_scanner::local_port_available; use std::convert::Infallible; -use tauri::AppHandle; -use warp::http::StatusCode; use warp::Filter; #[derive(serde::Deserialize, Debug)] @@ -17,36 +16,24 @@ struct QueryParam { /// check whether there is already exists pub async fn check_singleton() -> Result<()> { let port = IVerge::get_singleton_port(); - if !local_port_available(port) { - let resp = reqwest::get(format!("http://127.0.0.1:{port}/commands/ping")) - .await? - .text() - .await?; - - if &resp == "ok" { - let argvs: Vec = std::env::args().collect(); - if argvs.len() > 1 { + let argvs: Vec = std::env::args().collect(); + if argvs.len() > 1 { + #[cfg(not(target_os = "macos"))] + { let param = argvs[1].as_str(); if param.starts_with("clash:") { - reqwest::get(format!( + let _ = reqwest::get(format!( "http://127.0.0.1:{port}/commands/scheme?param={param}" )) - .await? - .text() - .await?; + .await; } - } else { - reqwest::get(format!("http://127.0.0.1:{port}/commands/visible")) - .await? - .text() - .await?; } - bail!("app exists"); + } else { + let _ = reqwest::get(format!("http://127.0.0.1:{port}/commands/visible")).await; } - log::error!("failed to setup singleton listen server"); - Ok(()) + bail!("app exists"); } else { Ok(()) } @@ -54,15 +41,12 @@ pub async fn check_singleton() -> Result<()> { /// The embed server only be used to implement singleton process /// maybe it can be used as pac server later -pub fn embed_server(app_handle: &AppHandle) { +pub fn embed_server() { let port = IVerge::get_singleton_port(); - let handle = app_handle.clone(); tauri::async_runtime::spawn(async move { - let ping = warp::path!("commands" / "ping").map(move || "ok"); - let visible = warp::path!("commands" / "visible").map(move || { - resolve::create_window(&handle); + resolve::create_window(); "ok" }); @@ -82,21 +66,15 @@ pub fn embed_server(app_handle: &AppHandle) { .body(content) .unwrap_or_default() }); + async fn scheme_handler(query: QueryParam) -> Result { + log_err!(resolve::resolve_scheme(query.param).await); + Ok("ok") + } + let scheme = warp::path!("commands" / "scheme") .and(warp::query::()) .and_then(scheme_handler); - - async fn scheme_handler(query: QueryParam) -> Result { - let result = resolve::resolve_scheme(query.param).await; - Ok(match result { - Ok(_) => warp::reply::with_status("Ok", StatusCode::OK), - Err(_) => { - warp::reply::with_status("Internal Error", StatusCode::INTERNAL_SERVER_ERROR) - } - }) - } - - let commands = ping.or(visible).or(pac).or(scheme); + let commands = visible.or(scheme).or(pac); warp::serve(commands).run(([127, 0, 0, 1], port)).await; }); } diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json old mode 100644 new mode 100755 index 0876ef18..613dcd62 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -2,7 +2,7 @@ "$schema": "../node_modules/@tauri-apps/cli/config.schema.json", "bundle": { "active": true, - "longDescription": "A Clash Meta GUI based on tauri.", + "longDescription": "Clash Verge Rev", "icon": [ "icons/32x32.png", "icons/128x128.png", @@ -15,7 +15,7 @@ "externalBin": ["sidecar/verge-mihomo", "sidecar/verge-mihomo-alpha"], "copyright": "GNU General Public License v3.0", "category": "DeveloperTool", - "shortDescription": "A Clash Meta GUI based on tauri.", + "shortDescription": "Clash Verge Rev", "createUpdaterArtifacts": "v1Compatible" }, "build": { @@ -34,6 +34,11 @@ "https://download.clashverge.dev/https://github.com/clash-verge-rev/clash-verge-rev/releases/download/updater/update-proxy.json", "https://github.com/clash-verge-rev/clash-verge-rev/releases/download/updater/update.json" ] + }, + "deep-link": { + "desktop": { + "schemes": ["clash", "clash-verge"] + } } }, "app": { @@ -44,7 +49,6 @@ "enable": true }, "csp": null - }, - "windows": [] + } } } diff --git a/src-tauri/tauri.linux.conf.json b/src-tauri/tauri.linux.conf.json index eb8e2aee..db6fa1a9 100644 --- a/src-tauri/tauri.linux.conf.json +++ b/src-tauri/tauri.linux.conf.json @@ -1,23 +1,35 @@ { "$schema": "../node_modules/@tauri-apps/cli/config.schema.json", + "identifier": "io.github.clash-verge-rev.clash-verge-rev", "bundle": { "targets": ["deb", "rpm"], "linux": { "deb": { "depends": ["openssl"], - "desktopTemplate": "./template/clash-verge.desktop", + "desktopTemplate": "./packages/linux/clash-verge.desktop", "provides": ["clash-verge"], "conflicts": ["clash-verge"], - "replaces": ["clash-verge"] + "replaces": ["clash-verge"], + "postInstallScript": "./packages/linux/post-install.sh", + "preRemoveScript": "./packages/linux/pre-remove.sh" }, "rpm": { "depends": ["openssl"], - "desktopTemplate": "./template/clash-verge.desktop", + "desktopTemplate": "./packages/linux/clash-verge.desktop", "provides": ["clash-verge"], "conflicts": ["clash-verge"], - "obsoletes": ["clash-verge"] + "obsoletes": ["clash-verge"], + "postInstallScript": "./packages/linux/post-install.sh", + "preRemoveScript": "./packages/linux/pre-remove.sh" } - } + }, + "externalBin": [ + "./resources/clash-verge-service", + "./resources/install-service", + "./resources/uninstall-service", + "./sidecar/verge-mihomo", + "./sidecar/verge-mihomo-alpha" + ] }, "app": { "trayIcon": { diff --git a/src-tauri/tauri.macos.conf.json b/src-tauri/tauri.macos.conf.json index 21748a57..1b1fd1a5 100644 --- a/src-tauri/tauri.macos.conf.json +++ b/src-tauri/tauri.macos.conf.json @@ -1,7 +1,9 @@ { "$schema": "../node_modules/@tauri-apps/cli/config.schema.json", + "identifier": "io.github.clash-verge-rev.clash-verge-rev", "bundle": { "targets": ["app", "dmg"], + "resources": ["resources"], "macOS": { "frameworks": [], "minimumSystemVersion": "10.15", diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json index f3a7d6ad..3241b2de 100644 --- a/src-tauri/tauri.windows.conf.json +++ b/src-tauri/tauri.windows.conf.json @@ -1,5 +1,6 @@ { "$schema": "../node_modules/@tauri-apps/cli/config.schema.json", + "identifier": "io.github.clash-verge-rev.clash-verge-rev", "bundle": { "targets": ["nsis"], "windows": { @@ -15,14 +16,16 @@ "installerIcon": "icons/icon.ico", "languages": ["SimpChinese", "English"], "installMode": "perMachine", - "template": "./template/installer.nsi" + "template": "./packages/windows/installer.nsi" } } }, "app": { "trayIcon": { "iconPath": "icons/tray-icon.ico", - "iconAsTemplate": true - } + "iconAsTemplate": true, + "menuOnLeftClick": false + }, + "windows": [] } } diff --git a/src-tauri/webview2.arm64.json b/src-tauri/webview2.arm64.json index 27bf4ebb..4c903432 100644 --- a/src-tauri/webview2.arm64.json +++ b/src-tauri/webview2.arm64.json @@ -16,7 +16,7 @@ "installerIcon": "icons/icon.ico", "languages": ["SimpChinese", "English"], "installMode": "perMachine", - "template": "./template/installer.nsi" + "template": "./packages/windows/installer.nsi" } } }, diff --git a/src-tauri/webview2.x64.json b/src-tauri/webview2.x64.json index 325ef64d..1d52ce0b 100644 --- a/src-tauri/webview2.x64.json +++ b/src-tauri/webview2.x64.json @@ -16,7 +16,7 @@ "installerIcon": "icons/icon.ico", "languages": ["SimpChinese", "English"], "installMode": "perMachine", - "template": "./template/installer.nsi" + "template": "./packages/windows/installer.nsi" } } }, diff --git a/src-tauri/webview2.x86.json b/src-tauri/webview2.x86.json index 03a955fe..ecb2cd87 100644 --- a/src-tauri/webview2.x86.json +++ b/src-tauri/webview2.x86.json @@ -16,7 +16,7 @@ "installerIcon": "icons/icon.ico", "languages": ["SimpChinese", "English"], "installMode": "perMachine", - "template": "./template/installer.nsi" + "template": "./packages/windows/installer.nsi" } } }, diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index cf8c4ac1..eeb68458 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -1,3 +1,7 @@ +@use "./layout.scss"; +@use "./page.scss"; +@use "./font.scss"; + body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", @@ -43,10 +47,6 @@ body { overflow: hidden; } -@import "./layout.scss"; -@import "./page.scss"; -@import "./font.scss"; - // @media (prefers-color-scheme: dark) { // :root { // background-color: rgba(18, 18, 18, 1); diff --git a/src/components/base/base-fieldset.tsx b/src/components/base/base-fieldset.tsx index ba16118b..131f6758 100644 --- a/src/components/base/base-fieldset.tsx +++ b/src/components/base/base-fieldset.tsx @@ -10,7 +10,7 @@ type Props = { }; export const BaseFieldset: React.FC = (props: Props) => { - const Fieldset = styled(Box)(() => ({ + const Fieldset = styled(Box)<{ component?: string }>(() => ({ position: "relative", border: "1px solid #bbb", borderRadius: "5px", diff --git a/src/components/base/base-loading-overlay.tsx b/src/components/base/base-loading-overlay.tsx new file mode 100644 index 00000000..036250b9 --- /dev/null +++ b/src/components/base/base-loading-overlay.tsx @@ -0,0 +1,33 @@ +import React from "react"; +import { Box, CircularProgress } from "@mui/material"; + +export interface BaseLoadingOverlayProps { + isLoading: boolean; +} + +export const BaseLoadingOverlay: React.FC = ({ + isLoading, +}) => { + if (!isLoading) return null; + + return ( + + + + ); +}; + +export default BaseLoadingOverlay; diff --git a/src/components/base/base-page.tsx b/src/components/base/base-page.tsx index 6e99dec1..b1f92e2c 100644 --- a/src/components/base/base-page.tsx +++ b/src/components/base/base-page.tsx @@ -1,7 +1,7 @@ import React, { ReactNode } from "react"; import { Typography } from "@mui/material"; import { BaseErrorBoundary } from "./base-error-boundary"; -import { useCustomTheme } from "@/components/layout/use-custom-theme"; +import { useTheme } from "@mui/material/styles"; interface Props { title?: React.ReactNode; // the page title @@ -13,7 +13,7 @@ interface Props { export const BasePage: React.FC = (props) => { const { title, header, contentStyle, full, children } = props; - const { theme } = useCustomTheme(); + const theme = useTheme(); const isDark = theme.palette.mode === "dark"; diff --git a/src/components/base/base-search-box.tsx b/src/components/base/base-search-box.tsx index eb50a460..ec4b22d8 100644 --- a/src/components/base/base-search-box.tsx +++ b/src/components/base/base-search-box.tsx @@ -7,20 +7,19 @@ import matchCaseIcon from "@/assets/image/component/match_case.svg?react"; import matchWholeWordIcon from "@/assets/image/component/match_whole_word.svg?react"; import useRegularExpressionIcon from "@/assets/image/component/use_regular_expression.svg?react"; +export type SearchState = { + text: string; + matchCase: boolean; + matchWholeWord: boolean; + useRegularExpression: boolean; +}; + type SearchProps = { placeholder?: string; matchCase?: boolean; matchWholeWord?: boolean; useRegularExpression?: boolean; - onSearch: ( - match: (content: string) => boolean, - state: { - text: string; - matchCase: boolean; - matchWholeWord: boolean; - useRegularExpression: boolean; - } - ) => void; + onSearch: (match: (content: string) => boolean, state: SearchState) => void; }; export const BaseSearchBox = styled((props: SearchProps) => { @@ -28,10 +27,10 @@ export const BaseSearchBox = styled((props: SearchProps) => { const inputRef = useRef(null); const [matchCase, setMatchCase] = useState(props.matchCase ?? false); const [matchWholeWord, setMatchWholeWord] = useState( - props.matchWholeWord ?? false + props.matchWholeWord ?? false, ); const [useRegularExpression, setUseRegularExpression] = useState( - props.useRegularExpression ?? false + props.useRegularExpression ?? false, ); const [errorMessage, setErrorMessage] = useState(""); @@ -60,7 +59,7 @@ export const BaseSearchBox = styled((props: SearchProps) => { matchCase, matchWholeWord, useRegularExpression, - } + }, ); }; diff --git a/src/components/base/index.ts b/src/components/base/index.ts index 57303ed6..3d17d59a 100644 --- a/src/components/base/index.ts +++ b/src/components/base/index.ts @@ -5,3 +5,4 @@ export { BaseLoading } from "./base-loading"; export { BaseErrorBoundary } from "./base-error-boundary"; export { Notice } from "./base-notice"; export { Switch } from "./base-switch"; +export { BaseLoadingOverlay } from "./base-loading-overlay"; diff --git a/src/components/connection/connection-detail.tsx b/src/components/connection/connection-detail.tsx index 055fb712..aeda2039 100644 --- a/src/components/connection/connection-detail.tsx +++ b/src/components/connection/connection-detail.tsx @@ -30,6 +30,7 @@ export const ConnectionDetail = forwardRef( anchorOrigin={{ vertical: "bottom", horizontal: "right" }} open={open} onClose={onClose} + sx={{ maxWidth: "520px" }} message={ detail ? ( @@ -37,7 +38,7 @@ export const ConnectionDetail = forwardRef( } /> ); - } + }, ); interface InnerProps { diff --git a/src/components/layout/layout-traffic.tsx b/src/components/layout/layout-traffic.tsx index fdadf489..9645b18c 100644 --- a/src/components/layout/layout-traffic.tsx +++ b/src/components/layout/layout-traffic.tsx @@ -8,7 +8,6 @@ import { import { useClashInfo } from "@/hooks/use-clash"; import { useVerge } from "@/hooks/use-verge"; import { TrafficGraph, type TrafficRef } from "./traffic-graph"; -import { useLogData } from "@/hooks/use-log-data"; import { useVisibility } from "@/hooks/use-visibility"; import parseTraffic from "@/utils/parse-traffic"; import useSWRSubscription from "swr/subscription"; @@ -39,11 +38,6 @@ export const LayoutTraffic = () => { return () => {}; }, [isDebug]); - // https://swr.vercel.app/docs/subscription#deduplication - // useSWRSubscription auto deduplicates to one subscription per key per entire app - // So we can simply invoke it here acting as preconnect - useLogData(); - const { data: traffic = { up: 0, down: 0 } } = useSWRSubscription< ITrafficItem, any, @@ -65,7 +59,7 @@ export const LayoutTraffic = () => { this.close(); next(event, { up: 0, down: 0 }); }, - } + }, ); return () => { @@ -75,7 +69,7 @@ export const LayoutTraffic = () => { { fallbackData: { up: 0, down: 0 }, keepPreviousData: true, - } + }, ); /* --------- meta memory information --------- */ @@ -102,7 +96,7 @@ export const LayoutTraffic = () => { this.close(); next(event, { inuse: 0 }); }, - } + }, ); return () => { @@ -112,7 +106,7 @@ export const LayoutTraffic = () => { { fallbackData: { inuse: 0 }, keepPreviousData: true, - } + }, ); const [up, upUnit] = parseTraffic(traffic.up); diff --git a/src/components/layout/scroll-top-button.tsx b/src/components/layout/scroll-top-button.tsx new file mode 100644 index 00000000..49b8c1d3 --- /dev/null +++ b/src/components/layout/scroll-top-button.tsx @@ -0,0 +1,35 @@ +import { IconButton, Fade } from "@mui/material"; +import KeyboardArrowUpIcon from "@mui/icons-material/KeyboardArrowUp"; + +interface Props { + onClick: () => void; + show: boolean; +} + +export const ScrollTopButton = ({ onClick, show }: Props) => { + return ( + + + theme.palette.mode === "dark" + ? "rgba(255,255,255,0.1)" + : "rgba(0,0,0,0.1)", + "&:hover": { + backgroundColor: (theme) => + theme.palette.mode === "dark" + ? "rgba(255,255,255,0.2)" + : "rgba(0,0,0,0.2)", + }, + visibility: show ? "visible" : "hidden", + }} + > + + + + ); +}; diff --git a/src/components/layout/use-custom-theme.ts b/src/components/layout/use-custom-theme.ts index 4d2ca52b..e21abe2f 100644 --- a/src/components/layout/use-custom-theme.ts +++ b/src/components/layout/use-custom-theme.ts @@ -4,6 +4,7 @@ import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow"; import { useSetThemeMode, useThemeMode } from "@/services/states"; import { defaultTheme, defaultDarkTheme } from "@/pages/_theme"; import { useVerge } from "@/hooks/use-verge"; +import { useTheme } from "@mui/material/styles"; const appWindow = getCurrentWebviewWindow(); /** @@ -103,7 +104,7 @@ export const useCustomTheme = () => { rootEle.style.setProperty("--primary-main", theme.palette.primary.main); rootEle.style.setProperty( "--background-color-alpha", - alpha(theme.palette.primary.main, 0.1) + alpha(theme.palette.primary.main, 0.1), ); // inject css diff --git a/src/components/log/log-item.tsx b/src/components/log/log-item.tsx index 012eb2e3..18e3a898 100644 --- a/src/components/log/log-item.tsx +++ b/src/components/log/log-item.tsx @@ -1,4 +1,5 @@ import { styled, Box } from "@mui/material"; +import { SearchState } from "@/components/base/base-search-box"; const Item = styled(Box)(({ theme: { palette, typography } }) => ({ padding: "8px 0", @@ -32,14 +33,54 @@ const Item = styled(Box)(({ theme: { palette, typography } }) => ({ color: palette.text.primary, overflowWrap: "anywhere", }, + "& .highlight": { + backgroundColor: palette.mode === "dark" ? "#ffeb3b40" : "#ffeb3b90", + borderRadius: 2, + padding: "0 2px", + }, })); interface Props { value: ILogItem; + searchState?: SearchState; } -const LogItem = (props: Props) => { - const { value } = props; +const LogItem = ({ value, searchState }: Props) => { + const renderHighlightText = (text: string) => { + if (!searchState?.text.trim()) return text; + + try { + const searchText = searchState.text; + let pattern: string; + + if (searchState.useRegularExpression) { + try { + new RegExp(searchText); + pattern = searchText; + } catch { + pattern = searchText.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + } + } else { + const escaped = searchText.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + pattern = searchState.matchWholeWord ? `\\b${escaped}\\b` : escaped; + } + + const flags = searchState.matchCase ? "g" : "gi"; + const parts = text.split(new RegExp(`(${pattern})`, flags)); + + return parts.map((part, index) => { + return index % 2 === 1 ? ( + + {part} + + ) : ( + part + ); + }); + } catch { + return text; + } + }; return ( @@ -50,7 +91,7 @@ const LogItem = (props: Props) => {
- {value.payload} + {renderHighlightText(value.payload)}
); diff --git a/src/components/proxy/provider-button.tsx b/src/components/proxy/provider-button.tsx index ca81a428..233e341c 100644 --- a/src/components/proxy/provider-button.tsx +++ b/src/components/proxy/provider-button.tsx @@ -34,7 +34,7 @@ export const ProviderButton = () => { const hasProvider = Object.keys(data || {}).length > 0; const [updating, setUpdating] = useState( - Object.keys(data || {}).map(() => false) + Object.keys(data || {}).map(() => false), ); const setUpdatingAt = (status: boolean, index: number) => { @@ -107,7 +107,7 @@ export const ProviderButton = () => { const expire = sub?.Expire || 0; const progress = Math.min( Math.round(((download + upload) * 100) / (total + 0.01)) + 1, - 100 + 100, ); return ( <> @@ -190,7 +190,7 @@ export const ProviderButton = () => { ); }; -const TypeBox = styled(Box)(({ theme }) => ({ +const TypeBox = styled(Box)<{ component?: React.ElementType }>(({ theme }) => ({ display: "inline-block", border: "1px solid #ccc", borderColor: alpha(theme.palette.secondary.main, 0.5), @@ -202,17 +202,19 @@ const TypeBox = styled(Box)(({ theme }) => ({ lineHeight: 1.25, })); -const StyledTypeBox = styled(Box)(({ theme }) => ({ - display: "inline-block", - border: "1px solid #ccc", - borderColor: alpha(theme.palette.primary.main, 0.5), - color: alpha(theme.palette.primary.main, 0.8), - borderRadius: 4, - fontSize: 10, - marginRight: "4px", - padding: "0 2px", - lineHeight: 1.25, -})); +const StyledTypeBox = styled(Box)<{ component?: React.ElementType }>( + ({ theme }) => ({ + display: "inline-block", + border: "1px solid #ccc", + borderColor: alpha(theme.palette.primary.main, 0.5), + color: alpha(theme.palette.primary.main, 0.8), + borderRadius: 4, + fontSize: 10, + marginRight: "4px", + padding: "0 2px", + lineHeight: 1.25, + }), +); const boxStyle = { height: 26, diff --git a/src/components/proxy/proxy-groups.tsx b/src/components/proxy/proxy-groups.tsx index bbe550a6..9d9af84c 100644 --- a/src/components/proxy/proxy-groups.tsx +++ b/src/components/proxy/proxy-groups.tsx @@ -1,4 +1,4 @@ -import { useRef } from "react"; +import { useRef, useState, useEffect } from "react"; import { useLockFn } from "ahooks"; import { Virtuoso, type VirtuosoHandle } from "react-virtuoso"; import { @@ -15,6 +15,7 @@ import { useRenderList } from "./use-render-list"; import { ProxyRender } from "./proxy-render"; import delayManager from "@/services/delay"; import { useTranslation } from "react-i18next"; +import { ScrollTopButton } from "../layout/scroll-top-button"; interface Props { mode: string; @@ -32,6 +33,22 @@ export const ProxyGroups = (props: Props) => { const virtuosoRef = useRef(null); + const [showScrollTop, setShowScrollTop] = useState(false); + + // 添加滚动处理函数 + const handleScroll = (e: any) => { + const scrollTop = e.target.scrollTop; + setShowScrollTop(scrollTop > 100); + }; + + // 滚动到顶部 + const scrollToTop = () => { + virtuosoRef.current?.scrollTo?.({ + top: 0, + behavior: "smooth", + }); + }; + // 切换分组的节点代理 const handleChangeProxy = useLockFn( async (group: IProxyGroupItem, proxy: IProxyItem) => { @@ -57,7 +74,7 @@ export const ProxyGroups = (props: Props) => { if (!current.selected) current.selected = []; const index = current.selected.findIndex( - (item) => item.name === group.name + (item) => item.name === group.name, ); if (index < 0) { @@ -66,14 +83,14 @@ export const ProxyGroups = (props: Props) => { current.selected[index] = { name, now: proxy.name }; } await patchCurrent({ selected: current.selected }); - } + }, ); // 测全部延迟 const handleCheckAll = useLockFn(async (groupName: string) => { const proxies = renderList .filter( - (e) => e.group?.name === groupName && (e.type === 2 || e.type === 4) + (e) => e.group?.name === groupName && (e.type === 2 || e.type === 4), ) .flatMap((e) => e.proxyCol || e.proxy!) .filter(Boolean); @@ -82,7 +99,7 @@ export const ProxyGroups = (props: Props) => { if (providers.size) { Promise.allSettled( - [...providers].map((p) => providerHealthCheck(p)) + [...providers].map((p) => providerHealthCheck(p)), ).then(() => onProxies()); } @@ -105,7 +122,7 @@ export const ProxyGroups = (props: Props) => { (e) => e.group?.name === name && ((e.type === 2 && e.proxy?.name === now) || - (e.type === 4 && e.proxyCol?.some((p) => p.name === now))) + (e.type === 4 && e.proxyCol?.some((p) => p.name === now))), ); if (index >= 0) { @@ -122,22 +139,33 @@ export const ProxyGroups = (props: Props) => { } return ( - ( - - )} - /> +
+ { + if (ref) { + ref.addEventListener("scroll", handleScroll); + } + }} + itemContent={(index) => ( + <> + + + )} + /> + + +
); }; diff --git a/src/components/proxy/proxy-item-mini.tsx b/src/components/proxy/proxy-item-mini.tsx index 0205070e..55504a19 100644 --- a/src/components/proxy/proxy-item-mini.tsx +++ b/src/components/proxy/proxy-item-mini.tsx @@ -160,6 +160,16 @@ export const ProxyItemMini = (props: Props) => { TFO )} + {proxy.mptcp && ( + + MPTCP + + )} + {proxy.smux && ( + + SMUX + + )} )} @@ -239,7 +249,9 @@ const Widget = styled(Box)(({ theme: { typography } }) => ({ borderRadius: "4px", })); -const TypeBox = styled(Box)(({ theme: { palette, typography } }) => ({ +const TypeBox = styled(Box, { + shouldForwardProp: (prop) => prop !== "component", +})<{ component?: React.ElementType }>(({ theme: { palette, typography } }) => ({ display: "inline-block", border: "1px solid #ccc", borderColor: "text.secondary", diff --git a/src/components/proxy/proxy-item.tsx b/src/components/proxy/proxy-item.tsx index 15e16790..12bf50ab 100644 --- a/src/components/proxy/proxy-item.tsx +++ b/src/components/proxy/proxy-item.tsx @@ -31,7 +31,7 @@ const Widget = styled(Box)(() => ({ borderRadius: "4px", })); -const TypeBox = styled(Box)(({ theme }) => ({ +const TypeBox = styled("span")(({ theme }) => ({ display: "inline-block", border: "1px solid #ccc", borderColor: alpha(theme.palette.text.secondary, 0.36), @@ -121,14 +121,14 @@ export const ProxyItem = (props: Props) => { {showType && proxy.now && ` - ${proxy.now}`} {showType && !!proxy.provider && ( - {proxy.provider} + {proxy.provider} )} - {showType && {proxy.type}} - {showType && proxy.udp && UDP} - {showType && proxy.xudp && ( - XUDP - )} - {showType && proxy.tfo && TFO} + {showType && {proxy.type}} + {showType && proxy.udp && UDP} + {showType && proxy.xudp && XUDP} + {showType && proxy.tfo && TFO} + {showType && proxy.mptcp && MPTCP} + {showType && proxy.smux && SMUX} } /> diff --git a/src/components/proxy/proxy-render.tsx b/src/components/proxy/proxy-render.tsx index 54675ed8..6a8d490a 100644 --- a/src/components/proxy/proxy-render.tsx +++ b/src/components/proxy/proxy-render.tsx @@ -59,7 +59,7 @@ export const ProxyRender = (props: RenderProps) => { return url.substring(url.lastIndexOf("/") + 1); } - if (type === 0 && !group.hidden) { + if (type === 0) { return ( { ); } - if (type === 1 && !group.hidden) { + if (type === 1) { return ( { ); } - if (type === 2 && !group.hidden) { + if (type === 2) { return ( { ); } - if (type === 3 && !group.hidden) { + if (type === 3) { return ( { ); } - if (type === 4 && !group.hidden) { + if (type === 4) { const proxyColItemsMemo = useMemo(() => { return proxyCol?.map((proxy) => ( { const { data: proxiesData, mutate: mutateProxies } = useSWR( "getProxies", getProxies, - { refreshInterval: 45000 } + { refreshInterval: 45000 }, ); const { verge } = useVerge(); @@ -78,7 +78,7 @@ export const useRenderList = (mode: string) => { group.all, group.name, headState.filterText, - headState.sortType + headState.sortType, ); ret.push({ type: 1, key: `head-${group.name}`, group, headState }); @@ -97,7 +97,7 @@ export const useRenderList = (mode: string) => { headState, col, proxyCol, - })) + })), ); } @@ -108,14 +108,14 @@ export const useRenderList = (mode: string) => { group, proxy, headState, - })) + })), ); } return ret; }); if (!useRule) return retList.slice(1); - return retList; + return retList.filter((item) => item.group.hidden === false); }, [headStates, proxiesData, mode, col]); return { diff --git a/src/components/rule/provider-button.tsx b/src/components/rule/provider-button.tsx index a6e27113..29cc1311 100644 --- a/src/components/rule/provider-button.tsx +++ b/src/components/rule/provider-button.tsx @@ -32,7 +32,7 @@ export const ProviderButton = () => { const hasProvider = Object.keys(data || {}).length > 0; const [updating, setUpdating] = useState( - Object.keys(data || {}).map(() => false) + Object.keys(data || {}).map(() => false), ); const setUpdatingAt = (status: boolean, index: number) => { @@ -162,7 +162,9 @@ export const ProviderButton = () => { ); }; -const TypeBox = styled(Box)(({ theme }) => ({ +const TypeBox = styled(Box, { + shouldForwardProp: (prop) => prop !== "component", +})<{ component?: React.ElementType }>(({ theme }) => ({ display: "inline-block", border: "1px solid #ccc", borderColor: alpha(theme.palette.secondary.main, 0.5), @@ -174,7 +176,9 @@ const TypeBox = styled(Box)(({ theme }) => ({ lineHeight: 1.25, })); -const StyledTypeBox = styled(Box)(({ theme }) => ({ +const StyledTypeBox = styled(Box, { + shouldForwardProp: (prop) => prop !== "component", +})<{ component?: React.ElementType }>(({ theme }) => ({ display: "inline-block", border: "1px solid #ccc", borderColor: alpha(theme.palette.primary.main, 0.5), diff --git a/src/components/setting/mods/backup-config-viewer.tsx b/src/components/setting/mods/backup-config-viewer.tsx new file mode 100644 index 00000000..32da19c9 --- /dev/null +++ b/src/components/setting/mods/backup-config-viewer.tsx @@ -0,0 +1,245 @@ +import { useState, useRef, memo, useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { useForm } from "react-hook-form"; +import { useVerge } from "@/hooks/use-verge"; +import { Notice } from "@/components/base"; +import { isValidUrl } from "@/utils/helper"; +import { useLockFn } from "ahooks"; +import { + TextField, + Button, + Grid2, + Box, + Stack, + IconButton, + InputAdornment, +} from "@mui/material"; +import Visibility from "@mui/icons-material/Visibility"; +import VisibilityOff from "@mui/icons-material/VisibilityOff"; +import { saveWebdavConfig, createWebdavBackup } from "@/services/cmds"; + +export interface BackupConfigViewerProps { + onBackupSuccess: () => Promise; + onSaveSuccess: () => Promise; + onRefresh: () => Promise; + onInit: () => Promise; + setLoading: (loading: boolean) => void; +} + +export const BackupConfigViewer = memo( + ({ + onBackupSuccess, + onSaveSuccess, + onRefresh, + onInit, + setLoading, + }: BackupConfigViewerProps) => { + const { t } = useTranslation(); + const { verge } = useVerge(); + const { webdav_url, webdav_username, webdav_password } = verge || {}; + const [showPassword, setShowPassword] = useState(false); + const usernameRef = useRef(null); + const passwordRef = useRef(null); + const urlRef = useRef(null); + + const { register, handleSubmit, watch } = useForm({ + defaultValues: { + url: webdav_url, + username: webdav_username, + password: webdav_password, + }, + }); + const url = watch("url"); + const username = watch("username"); + const password = watch("password"); + + const webdavChanged = + webdav_url !== url || + webdav_username !== username || + webdav_password !== password; + + console.log( + "webdavChanged", + webdavChanged, + webdav_url, + webdav_username, + webdav_password, + ); + + const handleClickShowPassword = () => { + setShowPassword((prev) => !prev); + }; + + useEffect(() => { + if (webdav_url && webdav_username && webdav_password) { + onInit(); + } + }, []); + + const checkForm = () => { + const username = usernameRef.current?.value; + const password = passwordRef.current?.value; + const url = urlRef.current?.value; + + if (!url) { + urlRef.current?.focus(); + Notice.error(t("WebDAV URL Required")); + throw new Error(t("WebDAV URL Required")); + } else if (!isValidUrl(url)) { + urlRef.current?.focus(); + Notice.error(t("Invalid WebDAV URL")); + throw new Error(t("Invalid WebDAV URL")); + } + if (!username) { + usernameRef.current?.focus(); + Notice.error(t("WebDAV URL Required")); + throw new Error(t("Username Required")); + } + if (!password) { + passwordRef.current?.focus(); + Notice.error(t("WebDAV URL Required")); + throw new Error(t("Password Required")); + } + }; + + const save = useLockFn(async (data: IWebDavConfig) => { + checkForm(); + try { + setLoading(true); + await saveWebdavConfig( + data.url.trim(), + data.username.trim(), + data.password, + ).then(() => { + Notice.success(t("WebDAV Config Saved")); + onSaveSuccess(); + }); + } catch (error) { + Notice.error(t("WebDAV Config Save Failed", { error }), 3000); + } finally { + setLoading(false); + } + }); + + const handleBackup = useLockFn(async () => { + checkForm(); + try { + setLoading(true); + await createWebdavBackup().then(async () => { + await onBackupSuccess(); + Notice.success(t("Backup Created")); + }); + } catch (error) { + Notice.error(t("Backup Failed", { error })); + } finally { + setLoading(false); + } + }); + + return ( +
e.preventDefault()}> + + + + + + + + + + + + + {showPassword ? : } + + + ), + }, + }} + /> + + + + + + {webdavChanged || + webdav_url === undefined || + webdav_username === undefined || + webdav_password === undefined ? ( + + ) : ( + <> + + + + )} + + + +
+ ); + }, +); diff --git a/src/components/setting/mods/backup-table-viewer.tsx b/src/components/setting/mods/backup-table-viewer.tsx new file mode 100644 index 00000000..2dcf60ec --- /dev/null +++ b/src/components/setting/mods/backup-table-viewer.tsx @@ -0,0 +1,266 @@ +import { SVGProps, memo } from "react"; +import { + Box, + Paper, + IconButton, + Divider, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TablePagination, +} from "@mui/material"; +import { Notice } from "@/components/base"; +import { Typography } from "@mui/material"; +import { useLockFn } from "ahooks"; +import { useTranslation } from "react-i18next"; +import { Dayjs } from "dayjs"; +import { + deleteWebdavBackup, + restoreWebDavBackup, + restartApp, +} from "@/services/cmds"; +import DeleteIcon from "@mui/icons-material/Delete"; +import RestoreIcon from "@mui/icons-material/Restore"; + +export type BackupFile = IWebDavFile & { + platform: string; + backup_time: Dayjs; + allow_apply: boolean; +}; + +export const DEFAULT_ROWS_PER_PAGE = 5; + +export interface BackupTableViewerProps { + datasource: BackupFile[]; + page: number; + onPageChange: ( + event: React.MouseEvent | null, + page: number, + ) => void; + total: number; + onRefresh: () => Promise; +} + +export const BackupTableViewer = memo( + ({ + datasource, + page, + onPageChange, + total, + onRefresh, + }: BackupTableViewerProps) => { + const { t } = useTranslation(); + + const handleDelete = useLockFn(async (filename: string) => { + await deleteWebdavBackup(filename); + await onRefresh(); + }); + + const handleRestore = useLockFn(async (filename: string) => { + await restoreWebDavBackup(filename).then(() => { + Notice.success(t("Restore Success, App will restart in 1s")); + }); + await restartApp(); + }); + + return ( + + + + + {t("Filename")} + {t("Backup Time")} + {t("Actions")} + + + + {datasource.length > 0 ? ( + datasource?.map((file, index) => ( + + + {file.platform === "windows" ? ( + + ) : file.platform === "linux" ? ( + + ) : ( + + )} + {file.filename} + + + {file.backup_time.fromNow()} + + + + { + e.preventDefault(); + const confirmed = await window.confirm( + t("Confirm to delete this backup file?"), + ); + if (confirmed) { + await handleDelete(file.filename); + } + }} + > + + + + { + e.preventDefault(); + const confirmed = await window.confirm( + t("Confirm to restore this backup file?"), + ); + if (confirmed) { + await handleRestore(file.filename); + } + }} + > + + + + + + )) + ) : ( + + + + + {t("No Backups")} + + + + + )} + +
+ +
+ ); + }, +); + +function LinuxIcon(props: SVGProps) { + return ( + + + + + + + + + + + + + + + + ); +} + +function WindowsIcon(props: SVGProps) { + return ( + + + + ); +} + +function MacIcon(props: SVGProps) { + return ( + + + + ); +} diff --git a/src/components/setting/mods/backup-viewer.tsx b/src/components/setting/mods/backup-viewer.tsx new file mode 100644 index 00000000..ca9d6c53 --- /dev/null +++ b/src/components/setting/mods/backup-viewer.tsx @@ -0,0 +1,144 @@ +import { + forwardRef, + useImperativeHandle, + useState, + useCallback, + useEffect, +} from "react"; +import { useTranslation } from "react-i18next"; +import { BaseDialog, DialogRef } from "@/components/base"; +import getSystem from "@/utils/get-system"; +import { BaseLoadingOverlay } from "@/components/base"; +import dayjs from "dayjs"; +import customParseFormat from "dayjs/plugin/customParseFormat"; +import { + BackupTableViewer, + BackupFile, + DEFAULT_ROWS_PER_PAGE, +} from "./backup-table-viewer"; +import { BackupConfigViewer } from "./backup-config-viewer"; +import { Box, Paper, Divider } from "@mui/material"; +import { listWebDavBackup } from "@/services/cmds"; +dayjs.extend(customParseFormat); + +const DATE_FORMAT = "YYYY-MM-DD_HH-mm-ss"; +const FILENAME_PATTERN = /\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}/; + +export const BackupViewer = forwardRef((props, ref) => { + const { t } = useTranslation(); + const [open, setOpen] = useState(false); + + const [isLoading, setIsLoading] = useState(false); + const [backupFiles, setBackupFiles] = useState([]); + const [dataSource, setDataSource] = useState([]); + const [total, setTotal] = useState(0); + const [page, setPage] = useState(0); + + const OS = getSystem(); + + useImperativeHandle(ref, () => ({ + open: () => { + setOpen(true); + }, + close: () => setOpen(false), + })); + + // Handle page change + const handleChangePage = useCallback( + (_: React.MouseEvent | null, page: number) => { + setPage(page); + }, + [], + ); + + const fetchAndSetBackupFiles = async () => { + try { + setIsLoading(true); + const files = await getAllBackupFiles(); + setBackupFiles(files); + setTotal(files.length); + } catch (error) { + setBackupFiles([]); + setTotal(0); + console.error(error); + // Notice.error(t("Failed to fetch backup files")); + } finally { + setIsLoading(false); + } + }; + + const getAllBackupFiles = async () => { + const files = await listWebDavBackup(); + return files + .map((file) => { + const platform = file.filename.split("-")[0]; + const fileBackupTimeStr = file.filename.match(FILENAME_PATTERN)!; + + if (fileBackupTimeStr === null) { + return null; + } + + const backupTime = dayjs(fileBackupTimeStr[0], DATE_FORMAT); + const allowApply = OS === platform; + return { + ...file, + platform, + backup_time: backupTime, + allow_apply: allowApply, + } as BackupFile; + }) + .filter((item) => item !== null) + .sort((a, b) => (a.backup_time.isAfter(b.backup_time) ? -1 : 1)); + }; + + useEffect(() => { + setDataSource( + backupFiles.slice( + page * DEFAULT_ROWS_PER_PAGE, + page * DEFAULT_ROWS_PER_PAGE + DEFAULT_ROWS_PER_PAGE, + ), + ); + }, [page, backupFiles]); + + return ( + setOpen(false)} + onCancel={() => setOpen(false)} + disableOk + > + + + + { + fetchAndSetBackupFiles(); + }} + onSaveSuccess={async () => { + fetchAndSetBackupFiles(); + }} + onRefresh={async () => { + fetchAndSetBackupFiles(); + }} + onInit={async () => { + fetchAndSetBackupFiles(); + }} + /> + + + + + + ); +}); diff --git a/src/components/setting/mods/clash-core-viewer.tsx b/src/components/setting/mods/clash-core-viewer.tsx index fc943528..c2301e59 100644 --- a/src/components/setting/mods/clash-core-viewer.tsx +++ b/src/components/setting/mods/clash-core-viewer.tsx @@ -17,7 +17,7 @@ import { ListItemButton, ListItemText, } from "@mui/material"; -import { changeClashCore, restartSidecar } from "@/services/cmds"; +import { changeClashCore, restartCore } from "@/services/cmds"; import { closeAllConnections, upgradeCore } from "@/services/api"; const VALID_CORE = [ @@ -59,7 +59,7 @@ export const ClashCoreViewer = forwardRef((props, ref) => { const onRestart = useLockFn(async () => { try { - await restartSidecar(); + await restartCore(); Notice.success(t(`Clash Core Restarted`), 1000); } catch (err: any) { Notice.error(err?.message || err.toString()); diff --git a/src/components/setting/mods/guard-state.tsx b/src/components/setting/mods/guard-state.tsx index 5ab8e991..745141e0 100644 --- a/src/components/setting/mods/guard-state.tsx +++ b/src/components/setting/mods/guard-state.tsx @@ -41,7 +41,6 @@ export function GuardState(props: Props) { childProps[onChangeProps] = async (...args: any[]) => { // 多次操作无效 if (lockRef.current) return; - lockRef.current = true; try { diff --git a/src/components/setting/mods/layout-viewer.tsx b/src/components/setting/mods/layout-viewer.tsx index 4253545d..be0d70cd 100644 --- a/src/components/setting/mods/layout-viewer.tsx +++ b/src/components/setting/mods/layout-viewer.tsx @@ -196,8 +196,8 @@ export const LayoutViewer = forwardRef((props, ref) => { }, ], }); - if (selected?.path.length) { - await copyIconFile(`${selected.path}`, "common"); + if (selected) { + await copyIconFile(`${selected}`, "common"); await initIconPath(); onChangeData({ common_tray_icon: true }); patchVerge({ common_tray_icon: true }); @@ -242,8 +242,8 @@ export const LayoutViewer = forwardRef((props, ref) => { }, ], }); - if (selected?.path.length) { - await copyIconFile(`${selected.path}`, "sysproxy"); + if (selected) { + await copyIconFile(`${selected}`, "sysproxy"); await initIconPath(); onChangeData({ sysproxy_tray_icon: true }); patchVerge({ sysproxy_tray_icon: true }); @@ -281,13 +281,13 @@ export const LayoutViewer = forwardRef((props, ref) => { multiple: false, filters: [ { - name: "Tray Icon Image", + name: "Tun Icon Image", extensions: ["png", "ico"], }, ], }); - if (selected?.path.length) { - await copyIconFile(`${selected.path}`, "tun"); + if (selected) { + await copyIconFile(`${selected}`, "tun"); await initIconPath(); onChangeData({ tun_tray_icon: true }); patchVerge({ tun_tray_icon: true }); diff --git a/src/components/setting/mods/misc-viewer.tsx b/src/components/setting/mods/misc-viewer.tsx index dace4355..df4a9a39 100644 --- a/src/components/setting/mods/misc-viewer.tsx +++ b/src/components/setting/mods/misc-viewer.tsx @@ -205,7 +205,7 @@ export const MiscViewer = forwardRef((props, ref) => { spellCheck="false" sx={{ width: 250, marginLeft: "auto" }} value={values.defaultLatencyTest} - placeholder="http://1.1.1.1" + placeholder="http://cp.cloudflare.com/generate_204" onChange={(e) => setValues((v) => ({ ...v, defaultLatencyTest: e.target.value })) } diff --git a/src/components/setting/mods/service-switcher.tsx b/src/components/setting/mods/service-switcher.tsx deleted file mode 100644 index 9dd2d5a6..00000000 --- a/src/components/setting/mods/service-switcher.tsx +++ /dev/null @@ -1,134 +0,0 @@ -import { KeyedMutator } from "swr"; -import { useState } from "react"; -import { useLockFn } from "ahooks"; -import { useTranslation } from "react-i18next"; -import { installService, uninstallService } from "@/services/cmds"; -import { Notice } from "@/components/base"; -import { LoadingButton } from "@mui/lab"; -import { PasswordInput } from "./password-input"; -import getSystem from "@/utils/get-system"; - -interface Props { - status: "active" | "installed" | "unknown" | "uninstall"; - mutate: KeyedMutator<"active" | "installed" | "unknown" | "uninstall">; - patchVerge: (value: Partial) => Promise; - onChangeData: (patch: Partial) => void; -} - -export const ServiceSwitcher = (props: Props) => { - const { status, mutate, patchVerge, onChangeData } = props; - const isWindows = getSystem() === "windows"; - const isActive = status === "active"; - const isInstalled = status === "installed"; - const isUninstall = status === "uninstall" || status === "unknown"; - - const { t } = useTranslation(); - const [serviceLoading, setServiceLoading] = useState(false); - const [uninstallServiceLoaing, setUninstallServiceLoading] = useState(false); - const [openInstall, setOpenInstall] = useState(false); - const [openUninstall, setOpenUninstall] = useState(false); - - async function install(passwd: string) { - try { - setOpenInstall(false); - await installService(passwd); - await mutate(); - setTimeout(() => { - mutate(); - }, 2000); - Notice.success(t("Service Installed Successfully")); - setServiceLoading(false); - } catch (err: any) { - await mutate(); - setTimeout(() => { - mutate(); - }, 2000); - Notice.error(err.message || err.toString()); - setServiceLoading(false); - } - } - - async function uninstall(passwd: string) { - try { - setOpenUninstall(false); - await uninstallService(passwd); - await mutate(); - setTimeout(() => { - mutate(); - }, 2000); - Notice.success(t("Service Uninstalled Successfully")); - setUninstallServiceLoading(false); - } catch (err: any) { - await mutate(); - setTimeout(() => { - mutate(); - }, 2000); - Notice.error(err.message || err.toString()); - setUninstallServiceLoading(false); - } - } - - const onInstallOrEnableService = useLockFn(async () => { - setServiceLoading(true); - if (isUninstall) { - // install service - if (isWindows) { - await install(""); - } else { - setOpenInstall(true); - } - } else { - try { - // enable or disable service - await patchVerge({ enable_service_mode: !isActive }); - onChangeData({ enable_service_mode: !isActive }); - await mutate(); - setTimeout(() => { - mutate(); - }, 2000); - setServiceLoading(false); - } catch (err: any) { - await mutate(); - Notice.error(err.message || err.toString()); - setServiceLoading(false); - } - } - }); - - const onUninstallService = useLockFn(async () => { - setUninstallServiceLoading(true); - if (isWindows) { - await uninstall(""); - } else { - setOpenUninstall(true); - } - }); - - return ( - <> - {openInstall && } - {openUninstall && } - - - {isActive ? t("Disable") : isInstalled ? t("Enable") : t("Install")} - - {isInstalled && ( - - {t("Uninstall")} - - )} - - ); -}; diff --git a/src/components/setting/mods/theme-viewer.tsx b/src/components/setting/mods/theme-viewer.tsx index 6e539705..bab22832 100644 --- a/src/components/setting/mods/theme-viewer.tsx +++ b/src/components/setting/mods/theme-viewer.tsx @@ -28,7 +28,7 @@ export const ThemeViewer = forwardRef((props, ref) => { useImperativeHandle(ref, () => ({ open: () => { setOpen(true); - setTheme({ ...theme_setting } || {}); + setTheme({ ...theme_setting }); }, close: () => setOpen(false), })); diff --git a/src/components/setting/mods/update-viewer.tsx b/src/components/setting/mods/update-viewer.tsx index d0887e6f..ae5e8b87 100644 --- a/src/components/setting/mods/update-viewer.tsx +++ b/src/components/setting/mods/update-viewer.tsx @@ -7,10 +7,11 @@ import { relaunch } from "@tauri-apps/plugin-process"; import { check as checkUpdate } from "@tauri-apps/plugin-updater"; import { BaseDialog, DialogRef, Notice } from "@/components/base"; import { useUpdateState, useSetUpdateState } from "@/services/states"; -import { listen, Event, UnlistenFn } from "@tauri-apps/api/event"; +import { Event, UnlistenFn } from "@tauri-apps/api/event"; import { portableFlag } from "@/pages/_layout"; import { open as openUrl } from "@tauri-apps/plugin-shell"; import ReactMarkdown from "react-markdown"; +import { useListen } from "@/hooks/use-listen"; let eventListener: UnlistenFn | null = null; @@ -21,6 +22,7 @@ export const UpdateViewer = forwardRef((props, ref) => { const updateState = useUpdateState(); const setUpdateState = useSetUpdateState(); + const { addListener } = useListen(); const { data: updateInfo } = useSWR("checkUpdate", checkUpdate, { errorRetryCount: 2, @@ -66,7 +68,7 @@ export const UpdateViewer = forwardRef((props, ref) => { if (eventListener !== null) { eventListener(); } - eventListener = await listen( + eventListener = await addListener( "tauri://update-download-progress", (e: Event) => { setTotal(e.payload.contentLength); @@ -74,7 +76,7 @@ export const UpdateViewer = forwardRef((props, ref) => { setDownloaded((a) => { return a + e.payload.chunkLength; }); - } + }, ); try { await updateInfo.install(); @@ -98,7 +100,7 @@ export const UpdateViewer = forwardRef((props, ref) => { size="small" onClick={() => { openUrl( - `https://github.com/clash-verge-rev/clash-verge-rev/releases/tag/v${updateInfo?.version}` + `https://github.com/clash-verge-rev/clash-verge-rev/releases/tag/v${updateInfo?.version}`, ); }} > diff --git a/src/components/setting/setting-clash.tsx b/src/components/setting/setting-clash.tsx index 0505614e..73db9508 100644 --- a/src/components/setting/setting-clash.tsx +++ b/src/components/setting/setting-clash.tsx @@ -1,7 +1,6 @@ import { useRef } from "react"; import { useTranslation } from "react-i18next"; import { TextField, Select, MenuItem, Typography } from "@mui/material"; - import { SettingsRounded, ShuffleRounded, @@ -34,7 +33,12 @@ const SettingClash = ({ onError }: Props) => { const { clash, version, mutateClash, patchClash } = useClash(); const { verge, mutateVerge, patchVerge } = useVerge(); - const { ipv6, "allow-lan": allowLan, "log-level": logLevel } = clash ?? {}; + const { + ipv6, + "allow-lan": allowLan, + "log-level": logLevel, + "unified-delay": unifiedDelay, + } = clash ?? {}; const { enable_random_port = false, verge_mixed_port } = verge ?? {}; @@ -106,10 +110,36 @@ const SettingClash = ({ onError }: Props) => { - + + } + > + onChangeData({ "unified-delay": e })} + onGuard={(e) => patchClash({ "unified-delay": e })} + > + + + + + + } + > e.target.value} onChange={(e) => onChangeData({ "log-level": e })} @@ -135,7 +165,7 @@ const SettingClash = ({ onError }: Props) => { onClick={() => { Notice.success( t("Restart Application to Apply Modifications"), - 1000 + 1000, ); onChangeVerge({ enable_random_port: !enable_random_port }); patchVerge({ enable_random_port: !enable_random_port }); diff --git a/src/components/setting/setting-system.tsx b/src/components/setting/setting-system.tsx index 7686c8f6..b76a2ad9 100644 --- a/src/components/setting/setting-system.tsx +++ b/src/components/setting/setting-system.tsx @@ -2,12 +2,10 @@ import useSWR from "swr"; import { useRef } from "react"; import { useTranslation } from "react-i18next"; import { SettingsRounded } from "@mui/icons-material"; -import { checkService } from "@/services/cmds"; import { useVerge } from "@/hooks/use-verge"; import { DialogRef, Notice, Switch } from "@/components/base"; import { SettingList, SettingItem } from "./mods/setting-comp"; import { GuardState } from "./mods/guard-state"; -import { ServiceSwitcher } from "./mods/service-switcher"; import { SysproxyViewer } from "./mods/sysproxy-viewer"; import { TunViewer } from "./mods/tun-viewer"; import { TooltipIcon } from "@/components/base/base-tooltip-icon"; @@ -20,16 +18,6 @@ const SettingSystem = ({ onError }: Props) => { const { t } = useTranslation(); const { verge, mutateVerge, patchVerge } = useVerge(); - // service mode - const { data: serviceStatus, mutate: mutateServiceStatus } = useSWR( - "checkService", - checkService, - { - revalidateIfStale: false, - shouldRetryOnError: false, - focusThrottleInterval: 36e5, // 1 hour - } - ); const sysproxyRef = useRef(null); const tunRef = useRef(null); @@ -67,34 +55,15 @@ const SettingSystem = ({ onError }: Props) => { onCatch={onError} onFormat={onSwitchFormat} onChange={(e) => { - if (serviceStatus !== "active") { - onChangeData({ enable_tun_mode: false }); - } else { - onChangeData({ enable_tun_mode: e }); - } + onChangeData({ enable_tun_mode: e }); }} onGuard={(e) => { - if (serviceStatus !== "active" && e) { - Notice.error(t("Please Enable Service Mode")); - return Promise.resolve(); - } else { - return patchVerge({ enable_tun_mode: e }); - } + return patchVerge({ enable_tun_mode: e }); }} > - - - - - { } + extra={ + + } > { const themeRef = useRef(null); const layoutRef = useRef(null); const updateRef = useRef(null); + const backupRef = useRef(null); const onChangeData = (patch: Partial) => { mutateVerge({ ...verge, ...patch }, false); @@ -83,6 +85,7 @@ const SettingVerge = ({ onError }: Props) => { + { }, ], }); - if (selected?.path.length) { - onChangeData({ startup_script: `${selected.path}` }); - patchVerge({ startup_script: `${selected.path}` }); + if (selected) { + onChangeData({ startup_script: `${selected}` }); + patchVerge({ startup_script: `${selected}` }); } }} > @@ -238,12 +241,23 @@ const SettingVerge = ({ onError }: Props) => { label={t("Hotkey Setting")} /> + backupRef.current?.open()} + label={t("Backup Setting")} + extra={ + + } + /> + configRef.current?.open()} label={t("Runtime Config")} /> - + diff --git a/src/components/test/test-item.tsx b/src/components/test/test-item.tsx index faee6e37..dfb75315 100644 --- a/src/components/test/test-item.tsx +++ b/src/components/test/test-item.tsx @@ -18,9 +18,9 @@ import { Notice } from "@/components/base"; import { TestBox } from "./test-box"; import delayManager from "@/services/delay"; import { cmdTestDelay, downloadIconCache } from "@/services/cmds"; -import { listen, UnlistenFn } from "@tauri-apps/api/event"; +import { UnlistenFn } from "@tauri-apps/api/event"; import { convertFileSrc } from "@tauri-apps/api/core"; - +import { useListen } from "@/hooks/use-listen"; interface Props { id: string; itemData: IVergeTestItem; @@ -47,6 +47,7 @@ export const TestItem = (props: Props) => { const [delay, setDelay] = useState(-1); const { uid, name, icon, url } = itemData; const [iconCachePath, setIconCachePath] = useState(""); + const { addListener } = useListen(); useEffect(() => { initIconCachePath(); @@ -91,7 +92,7 @@ export const TestItem = (props: Props) => { const listenTsetEvent = async () => { eventListener(); - eventListener = await listen("verge://test-all", () => { + eventListener = await addListener("verge://test-all", () => { onDelay(); }); }; diff --git a/src/components/test/test-viewer.tsx b/src/components/test/test-viewer.tsx index 00d7f8d0..8b04c3d9 100644 --- a/src/components/test/test-viewer.tsx +++ b/src/components/test/test-viewer.tsx @@ -67,6 +67,16 @@ export const TestViewer = forwardRef((props, ref) => { let newList; let uid; + if (form.icon && form.icon.startsWith("((props, ref) => { Notice.error(err.message || err.toString()); setLoading(false); } - }) + }), ); const handleClose = () => { diff --git a/src/hooks/use-clash.ts b/src/hooks/use-clash.ts index 143b4784..e680a18c 100644 --- a/src/hooks/use-clash.ts +++ b/src/hooks/use-clash.ts @@ -1,6 +1,6 @@ import useSWR, { mutate } from "swr"; import { useLockFn } from "ahooks"; -import { getAxios, getVersion, updateConfigs } from "@/services/api"; +import { getAxios, getVersion } from "@/services/api"; import { getClashInfo, patchClashConfig, @@ -10,16 +10,15 @@ import { export const useClash = () => { const { data: clash, mutate: mutateClash } = useSWR( "getRuntimeConfig", - getRuntimeConfig + getRuntimeConfig, ); const { data: versionData, mutate: mutateVersion } = useSWR( "getVersion", - getVersion + getVersion, ); const patchClash = useLockFn(async (patch: Partial) => { - await updateConfigs(patch); await patchClashConfig(patch); mutateClash(); }); @@ -27,8 +26,8 @@ export const useClash = () => { const version = versionData?.premium ? `${versionData.version} Premium` : versionData?.meta - ? `${versionData.version} Mihomo` - : versionData?.version || "-"; + ? `${versionData.version} Mihomo` + : versionData?.version || "-"; return { clash, @@ -42,7 +41,7 @@ export const useClash = () => { export const useClashInfo = () => { const { data: clashInfo, mutate: mutateInfo } = useSWR( "getClashInfo", - getClashInfo + getClashInfo, ); const patchInfo = async ( @@ -57,7 +56,7 @@ export const useClashInfo = () => { | "external-controller" | "secret" > - > + >, ) => { const hasInfo = patch["redir-port"] != null || diff --git a/src/hooks/use-listen.ts b/src/hooks/use-listen.ts new file mode 100644 index 00000000..4d17b6b5 --- /dev/null +++ b/src/hooks/use-listen.ts @@ -0,0 +1,31 @@ +import { listen, UnlistenFn, EventCallback } from "@tauri-apps/api/event"; +import { event } from "@tauri-apps/api"; +import { useRef } from "react"; + +export const useListen = () => { + const unlistenFns = useRef([]); + + const addListener = async ( + eventName: string, + handler: EventCallback, + ) => { + const unlisten = await listen(eventName, handler); + unlistenFns.current.push(unlisten); + return unlisten; + }; + const removeAllListeners = () => { + unlistenFns.current.forEach((unlisten) => unlisten()); + unlistenFns.current = []; + }; + + const setupCloseListener = async function () { + await event.once("tauri://close-requested", async () => { + removeAllListeners(); + }); + }; + + return { + addListener, + setupCloseListener, + }; +}; diff --git a/src/hooks/use-log-data.ts b/src/hooks/use-log-data.ts index 4debdcc0..7cf804bc 100644 --- a/src/hooks/use-log-data.ts +++ b/src/hooks/use-log-data.ts @@ -1,57 +1,105 @@ -import useSWRSubscription from "swr/subscription"; +import { useEffect } from "react"; import { useEnableLog } from "../services/states"; import { createSockette } from "../utils/websocket"; import { useClashInfo } from "./use-clash"; import dayjs from "dayjs"; -import { getClashLogs } from "../services/cmds"; +import { create } from "zustand"; const MAX_LOG_NUM = 1000; -export const useLogData = () => { - const { clashInfo } = useClashInfo(); +export type LogLevel = "warning" | "info" | "debug" | "error" | "all"; - const [enableLog] = useEnableLog(); - !enableLog || !clashInfo; +interface ILogItem { + time?: string; + type: string; + payload: string; + [key: string]: any; +} - return useSWRSubscription( - enableLog && clashInfo ? "getClashLog" : null, - (_key, { next }) => { - const { server = "", secret = "" } = clashInfo!; +const buildWSUrl = (server: string, secret: string, logLevel: LogLevel) => { + const baseUrl = `ws://${server}/logs`; + const params = new URLSearchParams(); - // populate the initial logs - getClashLogs().then( - (logs) => next(null, logs), - (err) => next(err) - ); - - const s = createSockette( - `ws://${server}/logs?token=${encodeURIComponent(secret)}`, - { - onmessage(event) { - const data = JSON.parse(event.data) as ILogItem; - - // append new log item on socket message - next(null, (l = []) => { - const time = dayjs().format("MM-DD HH:mm:ss"); - - if (l.length >= MAX_LOG_NUM) l.shift(); - return [...l, { ...data, time }]; - }); - }, - onerror(event) { - this.close(); - next(event); - }, - } - ); - - return () => { - s.close(); - }; - }, - { - fallbackData: [], - keepPreviousData: true, - } - ); + if (secret) { + params.append("token", encodeURIComponent(secret)); + } + if (logLevel === "all") { + params.append("level", "debug"); + } else { + params.append("level", logLevel); + } + const queryString = params.toString(); + return queryString ? `${baseUrl}?${queryString}` : baseUrl; +}; + +interface LogStore { + logs: Record; + clearLogs: (level?: LogLevel) => void; + appendLog: (level: LogLevel, log: ILogItem) => void; +} + +const useLogStore = create( + (set: (fn: (state: LogStore) => Partial) => void) => ({ + logs: { + warning: [], + info: [], + debug: [], + error: [], + all: [], + }, + clearLogs: (level?: LogLevel) => + set((state: LogStore) => ({ + logs: level + ? { ...state.logs, [level]: [] } + : { warning: [], info: [], debug: [], error: [], all: [] }, + })), + appendLog: (level: LogLevel, log: ILogItem) => + set((state: LogStore) => { + const currentLogs = state.logs[level]; + const newLogs = + currentLogs.length >= MAX_LOG_NUM + ? [...currentLogs.slice(1), log] + : [...currentLogs, log]; + return { logs: { ...state.logs, [level]: newLogs } }; + }), + }), +); + +export const useLogData = (logLevel: LogLevel) => { + const { clashInfo } = useClashInfo(); + const [enableLog] = useEnableLog(); + const { logs, appendLog } = useLogStore(); + + useEffect(() => { + if (!enableLog || !clashInfo) return; + + const { server = "", secret = "" } = clashInfo; + const wsUrl = buildWSUrl(server, secret, logLevel); + + let isActive = true; + const socket = createSockette(wsUrl, { + onmessage(event) { + if (!isActive) return; + const data = JSON.parse(event.data) as ILogItem; + const time = dayjs().format("MM-DD HH:mm:ss"); + appendLog(logLevel, { ...data, time }); + }, + onerror() { + if (!isActive) return; + socket.close(); + }, + }); + + return () => { + isActive = false; + socket.close(); + }; + }, [clashInfo, enableLog, logLevel]); + + return logs[logLevel]; +}; + +// 导出清空日志的方法 +export const clearLogs = (level?: LogLevel) => { + useLogStore.getState().clearLogs(level); }; diff --git a/src/hooks/use-verge.ts b/src/hooks/use-verge.ts index 6eeebe88..b6539c71 100644 --- a/src/hooks/use-verge.ts +++ b/src/hooks/use-verge.ts @@ -4,7 +4,10 @@ import { getVergeConfig, patchVergeConfig } from "@/services/cmds"; export const useVerge = () => { const { data: verge, mutate: mutateVerge } = useSWR( "getVergeConfig", - getVergeConfig + async () => { + const config = await getVergeConfig(); + return config; + }, ); const patchVerge = async (value: Partial) => { diff --git a/src/locales/en.json b/src/locales/en.json index 58e06f36..2eca4953 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -193,9 +193,9 @@ "Test URL": "Test URL", "Settings": "Settings", "System Setting": "System Setting", - "Tun Mode": "Tun Mode", + "Tun Mode": "Tun (Virtual NIC) Mode", "Reset to Default": "Reset to Default", - "Tun Mode Info": "The Tun mode requires granting core-related permissions. Please enable service mode before using it", + "Tun Mode Info": "Tun (Virtual NIC) mode: Captures all system traffic, when enabled, there is no need to enable system proxy.", "Stack": "Tun Stack", "System and Mixed Can Only be Used in Service Mode": "System and Mixed Can Only be Used in Service Mode", "Device": "Device Name", @@ -205,7 +205,7 @@ "DNS Hijack": "DNS Hijack", "MTU": "Max Transmission Unit", "Service Mode": "Service Mode", - "Service Mode Info": "The core launched by the service can obtain corresponding permissions after installation and authorization of the service", + "Service Mode Info": "Please install the service mode before enabling TUN mode. The kernel process started by the service can obtain the permission to install the virtual network card (TUN mode)", "Current State": "Current State", "pending": "pending", "installed": "installed", @@ -246,6 +246,8 @@ "Ip Address": "IP Address", "Mac Address": "MAC Address", "IPv6": "IPv6", + "Unified Delay": "Unified Delay", + "Unified Delay Info": "When unified delay is turned on, two delay tests will be performed to eliminate the delay differences between different types of nodes caused by connection handshakes, etc", "Log Level": "Log Level", "Port Config": "Port Config", "Random Port": "Random Port", @@ -330,15 +332,16 @@ "clash_mode_direct": "Direct Mode", "toggle_system_proxy": "Enable/Disable System Proxy", "toggle_tun_mode": "Enable/Disable Tun Mode", + "Backup Setting": "Backup Setting", "Runtime Config": "Runtime Config", - "Open App Dir": "Open App Dir", + "Open Conf Dir": "Open Conf Dir", "Open Core Dir": "Open Core Dir", "Open Logs Dir": "Open Logs Dir", "Check for Updates": "Check for Updates", "Go to Release Page": "Go to Release Page", "Portable Updater Error": "The portable version does not support in-app updates. Please manually download and replace it", "Break Change Update Error": "This version is a major update and does not support in-app updates. Please uninstall it and manually download and install the new version", - "Open Dev Tools": "Open Dev Tools", + "Open Dev Tools": "Dev Tools", "Exit": "Exit", "Verge Version": "Verge Version", "ReadOnly": "ReadOnly", @@ -367,5 +370,30 @@ "Clash Core Restarted": "Clash Core Restarted", "Switched to _clash Core": "Switched to {{core}} Core", "GeoData Updated": "GeoData Updated", - "Currently on the Latest Version": "Currently on the Latest Version" + "Currently on the Latest Version": "Currently on the Latest Version", + "Import Subscription Successful": "Import subscription successful", + "WebDAV Server URL": "WebDAV Server URL", + "Username": "Username", + "Password": "Password", + "Backup": "Backup", + "Filename": "Filename", + "Actions": "Actions", + "Restore": "Restore", + "No Backups": "No backups available", + "WebDAV URL Required": "WebDAV URL cannot be empty", + "Invalid WebDAV URL": "Invalid WebDAV URL format", + "Username Required": "Username cannot be empty", + "Password Required": "Password cannot be empty", + "Failed to Fetch Backups": "Failed to fetch backup files", + "WebDAV Config Saved": "WebDAV configuration saved successfully", + "WebDAV Config Save Failed": "Failed to save WebDAV configuration: {{error}}", + "Backup Created": "Backup created successfully", + "Backup Failed": "Backup failed: {{error}}", + "Delete Backup": "Delete Backup", + "Restore Backup": "Restore Backup", + "Backup Time": "Backup Time", + "Confirm to delete this backup file?": "Confirm to delete this backup file?", + "Confirm to restore this backup file?": "Confirm to restore this backup file?", + "Restore Success, App will restart in 1s": "Restore Success, App will restart in 1s", + "Failed to fetch backup files": "Failed to fetch backup files" } diff --git a/src/locales/fa.json b/src/locales/fa.json index 1b533dd8..336b6c44 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -65,6 +65,8 @@ "Append Rule": "اضافه کردن قانون به انتها", "Prepend Group": "اضافه کردن گروه به ابتدا", "Append Group": "اضافه کردن گروه به انتها", + "Prepend Proxy": "پیش‌افزودن پراکسی", + "Append Proxy": "پس‌افزودن پراکسی", "Rule Condition Required": "شرط قانون الزامی است", "Invalid Rule": "قانون نامعتبر", "Advanced": "پیشرفته", @@ -111,7 +113,7 @@ "select": "انتخاب پروکسی به صورت دستی", "url-test": "انتخاب پروکسی بر اساس تأخیر آزمایش URL", "fallback": "تعویض به پروکسی دیگر در صورت بروز خطا", - "load-balance": "توزیع پروکسی بر اساس توازن بار", + "load-balance": "توزیع ��روکسی بر اساس توازن بار", "relay": "عبور از زنجیره پروکسی تعریف شده", "Group Name": "نام گروه", "Use Proxies": "استفاده از پروکسی‌ها", @@ -191,9 +193,9 @@ "Test URL": "آدرس آزمون", "Settings": "تنظیمات", "System Setting": "تنظیمات سیستم", - "Tun Mode": "حالت Tun", + "Tun Mode": "Tun (کارت شبکه مجازی)", "Reset to Default": "بازنشانی به پیش‌فرض", - "Tun Mode Info": "حالت Tun نیاز به اعطای مجوزهای مربوط به هسته دارد. لطفاً قبل از استفاده، حالت سرویس را فعال کنید", + "Tun Mode Info": "حالت Tun (NIC مجازی): تمام ترافیک سیستم را ضبط می کند، وقتی فعال باشد، نیازی به فعال کردن پروکسی سیستم نیست.", "Stack": "انباشته Tun", "System and Mixed Can Only be Used in Service Mode": "سیستم و ترکیبی تنها می‌توانند در حالت سرویس استفاده شوند", "Device": "نام دستگاه", @@ -203,7 +205,7 @@ "DNS Hijack": "ربایش DNS", "MTU": "واحد حداکثر انتقال", "Service Mode": "حالت سرویس", - "Service Mode Info": "هسته راه اندازی شده توسط سرویس می تواند مجوزهای مربوطه را پس از نصب و مجوز سرویس دریافت کند", + "Service Mode Info": "لطفاً قبل از فعال کردن حالت TUN، حالت سرویس را نصب کنید.", "Current State": "وضعیت فعلی", "pending": "در انتظار", "installed": "نصب شده", @@ -235,13 +237,19 @@ "Auto Launch": "راه‌اندازی خودکار", "Silent Start": "شروع بی‌صدا", "Silent Start Info": "برنامه را در حالت پس‌زمینه بدون نمایش پانل اجرا کنید", + "TG Channel": "کانال تلگرام", + "Manual": "راهنما", + "Github Repo": "مخزن GitHub", "Clash Setting": "تنظیمات Clash", "Allow Lan": "اجازه LAN", "Network Interface": "رابط شبکه", "Ip Address": "آدرس IP", "Mac Address": "آدرس MAC", "IPv6": "IPv6", + "Unified Delay": "معادلDELAY", + "Unified Delay Info": "معادلDELAY را فعال کنید تا ترافیک شبکه به سرعت رسید", "Log Level": "سطح لاگ", + "Log Level Info": "این فقط روی فایل‌های لاگ هسته تحت فایل سرویس در فهرست ورود اثر می‌گذارد.", "Port Config": "پیکربندی پورت", "Random Port": "پورت تصادفی", "Mixed Port": "پورت پروکسی ترکیبی", @@ -267,9 +275,6 @@ "Open UWP tool": "باز کردن ابزار UWP", "Open UWP tool Info": "از ویندوز 8 به بعد، برنامه‌های UWP (مانند Microsoft Store) از دسترسی مستقیم به خدمات شبکه محلی محدود شده‌اند و این ابزار می‌تواند برای دور زدن این محدودیت استفاده شود", "Update GeoData": "به‌روزرسانی GeoData", - "TG Channel": "کانال تلگرام", - "Manual": "راهنما", - "Github Repo": "مخزن GitHub", "Verge Setting": "تنظیمات Verge", "Language": "زبان", "Theme Mode": "حالت تم", @@ -328,8 +333,10 @@ "clash_mode_direct": "حالت مستقیم", "toggle_system_proxy": "فعال/غیرفعال کردن پراکسی سیستم", "toggle_tun_mode": "فعال/غیرفعال کردن حالت Tun", + "Backup Setting": "تنظیمات پشتیبان گیری", + "Backup Setting Info": "از فایل های پیکربندی پشتیبان WebDAV پشتیبانی می کند", "Runtime Config": "پیکربندی زمان اجرا", - "Open App Dir": "باز کردن پوشه برنامه", + "Open Conf Dir": "باز کردن پوشه برنامه", "Open Core Dir": "باز کردن پوشه هسته", "Open Logs Dir": "باز کردن پوشه لاگ‌ها", "Check for Updates": "بررسی برای به‌روزرسانی‌ها", @@ -365,5 +372,30 @@ "Clash Core Restarted": "هسته Clash مجدداً راه‌اندازی شد", "Switched to _clash Core": "تغییر به هسته {{core}}", "GeoData Updated": "GeoData به‌روزرسانی شد", - "Currently on the Latest Version": "در حال حاضر در آخرین نسخه" + "Currently on the Latest Version": "در حال حاضر در آخرین نسخه", + "Import Subscription Successful": "وارد کردن اشتراک با موفقیت انجام شد", + "WebDAV Server URL": "http(s):// URL سرور WebDAV", + "Username": "نام کاربری", + "Password": "رمز عبور", + "Backup": "پشتیبان‌گیری", + "Filename": "نام فایل", + "Actions": "عملیات", + "Restore": "بازیابی", + "No Backups": "هیچ پشتیبانی موجود نیست", + "WebDAV URL Required": "آدرس WebDAV نمی‌تواند خالی باشد", + "Invalid WebDAV URL": "فرمت آدرس WebDAV نامعتبر است", + "Username Required": "نام کاربری نمی‌تواند خالی باشد", + "Password Required": "رمز عبور نمی‌تواند خالی باشد", + "Failed to Fetch Backups": "دریافت فایل‌های پشتیبان ناموفق بود", + "WebDAV Config Saved": "پیکربندی WebDAV با موفقیت ذخیره شد", + "WebDAV Config Save Failed": "خطا در ذخیره تنظیمات WebDAV: {{error}}", + "Backup Created": "پشتیبان‌گیری با موفقیت ایجاد شد", + "Backup Failed": "خطا در پشتیبان‌گیری: {{error}}", + "Delete Backup": "حذف پشتیبان", + "Restore Backup": "بازیابی پشتیبان", + "Backup Time": "زمان پشتیبان‌گیری", + "Confirm to delete this backup file?": "آیا از حذف این فایل پشتیبان اطمینان دارید؟", + "Confirm to restore this backup file?": "آیا از بازیابی این فایل پشتیبان اطمینان دارید؟", + "Restore Success, App will restart in 1s": "بازیابی با موفقیت انجام شد، برنامه در 1 ثانیه راه‌اندازی مجدد می‌شود", + "Failed to fetch backup files": "دریافت فایل‌های پشتیبان ناموفق بود" } diff --git a/src/locales/ru.json b/src/locales/ru.json index 1d753a0e..e09af779 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -65,6 +65,8 @@ "Append Rule": "Добавить правило в конец", "Prepend Group": "Добавить группу в начало", "Append Group": "Добавить группу в конец", + "Prepend Proxy": "Добавить прокси в начало", + "Append Proxy": "Добавить прокси в конец", "Rule Condition Required": "Требуется условие правила", "Invalid Rule": "Недействительное правило", "Advanced": "Дополнительно", @@ -191,9 +193,9 @@ "Test URL": "Тестовый URL", "Settings": "Настройки", "System Setting": "Настройки системы", - "Tun Mode": "Режим туннеля", + "Tun Mode": "Tun (виртуальный сетевой адаптер) режим", "Reset to Default": "Сбросить настройки по умолчанию", - "Tun Mode Info": "Режим туннеля требует предоставления разрешений, связанных с ядрам. Пожалуйста, включите сервисный режим перед его использованием", + "Tun Mode Info": "Режим Tun (виртуальный сетевой адаптер): захватывает весь системный трафик, при включении нет необходимости включать системный прокси-сервер.", "Stack": "Стек", "System and Mixed Can Only be Used in Service Mode": "Система и смешанные могут использоваться только в сервисном режиме", "Device": "Имя устройства", @@ -203,7 +205,7 @@ "DNS Hijack": "DNS-перехват", "MTU": "Максимальная единица передачи", "Service Mode": "Режим сервиса", - "Service Mode Info": "Ядро, запущенное сервисом, может получить соответствующие разрешения после установки и авторизации сервиса", + "Service Mode Info": "Установите сервисный режим перед включением режима TUN. Процесс ядра, запущенный службой, может получить разрешение на установку виртуальной сетевой карты (режим TUN).", "Current State": "Текущее состояние", "pending": "Ожидающий", "installed": "Установленный", @@ -244,7 +246,10 @@ "Ip Address": "IP адрес", "Mac Address": "MAC адрес", "IPv6": "IPv6", + "Unified Delay": "Общий задержка", + "Unified Delay Info": "Когда унифицированная задержка включена, будут выполнены два теста задержки, чтобы устранить различия в задержке между разными типами узлов, вызванные подтверждением соединения и т. д", "Log Level": "Уровень логов", + "Log Level Info": "Это действует только на файлы журнала ядра в служебном файле в каталоге журналов.", "Port Config": "Настройка порта", "Random Port": "Случайный порт", "Mixed Port": "Смешанный прокси-порт", @@ -328,8 +333,10 @@ "clash_mode_direct": "Прямой режим", "toggle_system_proxy": "Включить/Отключить системный прокси", "toggle_tun_mode": "Включить/Отключить режим туннеля", + "Backup Setting": "Настройки резервного копирования", + "Backup Setting Info": "Поддерживает файлы конфигурации резервного копирования WebDAV", "Runtime Config": "Используемый конфиг", - "Open App Dir": "Открыть папку приложения", + "Open Conf Dir": "Открыть папку приложения", "Open Core Dir": "Открыть папку ядра", "Open Logs Dir": "Открыть папку логов", "Check for Updates": "Проверить обновления", @@ -365,5 +372,30 @@ "Clash Core Restarted": "Clash ядра перезапущено", "Switched to _clash Core": "Переключено на ядра {{core}}", "GeoData Updated": "GeoData Обновлена", - "Currently on the Latest Version": "В настоящее время используется последняя версия" + "Currently on the Latest Version": "В настоящее время используется последняя версия", + "Import subscription successful": "Импорт подписки успешно", + "WebDAV Server URL": "URL-адрес сервера WebDAV http(s)://", + "Username": "Имя пользователя", + "Password": "Пароль", + "Backup": "Резервное копирование", + "Filename": "Имя файла", + "Actions": "Действия", + "Restore": "Восстановить", + "No Backups": "Нет доступных резервных копий", + "WebDAV URL Required": "URL-адрес WebDAV не может быть пустым", + "Invalid WebDAV URL": "Неверный формат URL-адреса WebDAV", + "Username Required": "Имя пользователя не может быть пустым", + "Password Required": "Пароль не может быть пустым", + "Failed to Fetch Backups": "Не удалось получить файлы резервных копий", + "WebDAV Config Saved": "Конфигурация WebDAV успешно сохранена", + "WebDAV Config Save Failed": "Не удалось сохранить конфигурацию WebDAV: {{error}}", + "Backup Created": "Резервная копия успешно создана", + "Backup Failed": "Ошибка резервного копирования: {{error}}", + "Delete Backup": "Удалить резервную копию", + "Restore Backup": "Восстановить резервную копию", + "Backup Time": "Время резервного копирования", + "Confirm to delete this backup file?": "Вы уверены, что хотите удалить этот файл резервной копии?", + "Confirm to restore this backup file?": "Вы уверены, что хотите восстановить этот файл резервной копии?", + "Restore Success, App will restart in 1s": "Восстановление успешно выполнено, приложение перезапустится через 1 секунду", + "Failed to fetch backup files": "Не удалось получить файлы резервных копий" } diff --git a/src/locales/zh.json b/src/locales/zh.json index 16a1cf7a..09a1b4a9 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -193,9 +193,9 @@ "Test URL": "测试地址", "Settings": "设置", "System Setting": "系统设置", - "Tun Mode": "Tun 模式", + "Tun Mode": "Tun(虚拟网卡)模式", "Reset to Default": "重置为默认值", - "Tun Mode Info": "Tun模式需要授予内核相关权限,使用前请先开启服务模式", + "Tun Mode Info": "Tun(虚拟网卡)模式接管系统所有流量,启用时无须打开系统代理", "Stack": "Tun 模式堆栈", "System and Mixed Can Only be Used in Service Mode": "System 和 Mixed 只能在服务模式下使用", "Device": "Tun 网卡名称", @@ -205,7 +205,7 @@ "DNS Hijack": "DNS 劫持", "MTU": "最大传输单元", "Service Mode": "服务模式", - "Service Mode Info": "安装并授权服务后,由该服务启动的内核进程可获得相关权限", + "Service Mode Info": "启用TUN模式前请安装服务模式,该服务启动的内核进程可获得安装虚拟网卡(TUN模式)的权限", "Current State": "当前状态", "pending": "等待中", "installed": "已安装", @@ -246,7 +246,10 @@ "Ip Address": "IP 地址", "Mac Address": "MAC 地址", "IPv6": "IPv6", + "Unified Delay": "统一延迟", + "Unified Delay Info": "开启统一延迟时,会进行两次延迟测试,以消除连接握手等带来的不同类型节点的延迟差异", "Log Level": "日志等级", + "Log Level Info": "仅对日志目录Service文件夹下的内核日志文件生效", "Port Config": "端口设置", "Random Port": "随机端口", "Mixed Port": "混合代理端口", @@ -330,15 +333,17 @@ "clash_mode_direct": "直连模式", "toggle_system_proxy": "打开/关闭系统代理", "toggle_tun_mode": "打开/关闭 Tun 模式", + "Backup Setting": "备份设置", + "Backup Setting Info": "支持WebDAV备份配置文件", "Runtime Config": "当前配置", - "Open App Dir": "应用目录", + "Open Conf Dir": "配置目录", "Open Core Dir": "内核目录", "Open Logs Dir": "日志目录", "Check for Updates": "检查更新", "Go to Release Page": "前往发布页", "Portable Updater Error": "便携版不支持应用内更新,请手动下载替换", "Break Change Update Error": "此版本为重大更新,不支持应用内更新,请卸载后手动下载安装", - "Open Dev Tools": "打开开发者工具", + "Open Dev Tools": "开发者工具", "Exit": "退出", "Verge Version": "Verge 版本", "ReadOnly": "只读", @@ -360,12 +365,37 @@ "Invalid Bypass Format": "无效的代理绕过格式", "Clash Port Modified": "Clash 端口已修改", "Port Conflict": "端口冲突", - "Restart Application to Apply Modifications": "重启应用程序以应用修改", + "Restart Application to Apply Modifications": "重启Verge以应用修改", "External Controller Address Modified": "外部控制器监听地址已修改", "Permissions Granted Successfully for _clash Core": "{{core}} 内核授权成功", "Core Version Updated": "内核版本已更新", "Clash Core Restarted": "已重启 Clash 内核", "Switched to _clash Core": "已切换至 {{core}} 内核", "GeoData Updated": "已更新 GeoData", - "Currently on the Latest Version": "当前已是最新版本" + "Currently on the Latest Version": "当前已是最新版本", + "Import Subscription Successful": "导入订阅成功", + "WebDAV Server URL": "WebDAV服务器地址 http(s)://", + "Username": "用户名", + "Password": "密码", + "Backup": "备份", + "Filename": "文件名称", + "Actions": "操作", + "Restore": "恢复", + "No Backups": "暂无备份", + "WebDAV URL Required": "WebDAV 服务器地址不能为空", + "Invalid WebDAV URL": "无效的 WebDAV 服务器地址格式", + "Username Required": "用户名不能为空", + "Password Required": "密码不能为空", + "Failed to Fetch Backups": "获取备份文件失败", + "WebDAV Config Saved": "WebDAV 配置保存成功", + "WebDAV Config Save Failed": "保存 WebDAV 配置失败: {{error}}", + "Backup Created": "备份创建成功", + "Backup Failed": "备份失败: {{error}}", + "Delete Backup": "删除备份", + "Restore Backup": "恢复备份", + "Backup Time": "备份时间", + "Confirm to delete this backup file?": "确认删除此备份文件吗?", + "Confirm to restore this backup file?": "确认恢复此 份文件吗?", + "Restore Success, App will restart in 1s": "恢复成功,应用将在1秒后重启", + "Failed to fetch backup files": "获取备份文件失败" } diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx index 56a53616..19d4f8c0 100644 --- a/src/pages/_layout.tsx +++ b/src/pages/_layout.tsx @@ -4,9 +4,8 @@ import relativeTime from "dayjs/plugin/relativeTime"; import { SWRConfig, mutate } from "swr"; import { useEffect } from "react"; import { useTranslation } from "react-i18next"; -import { useLocation, useRoutes } from "react-router-dom"; +import { useLocation, useRoutes, useNavigate } from "react-router-dom"; import { List, Paper, ThemeProvider, SvgIcon } from "@mui/material"; -import { listen } from "@tauri-apps/api/event"; import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow"; import { routers } from "./_routers"; import { getAxios } from "@/services/api"; @@ -25,9 +24,10 @@ import getSystem from "@/utils/get-system"; import "dayjs/locale/ru"; import "dayjs/locale/zh-cn"; import { getPortableFlag } from "@/services/cmds"; -import { useNavigate } from "react-router-dom"; import React from "react"; import { TransitionGroup, CSSTransition } from "react-transition-group"; +import { useListen } from "@/hooks/use-listen"; + const appWindow = getCurrentWebviewWindow(); export let portableFlag = false; @@ -46,17 +46,13 @@ const Layout = () => { const navigate = useNavigate(); const location = useLocation(); const routersEles = useRoutes(routers); + const { addListener, setupCloseListener } = useListen(); if (!routersEles) return null; - useEffect(() => { - window.addEventListener("keydown", (e) => { - // macOS有cmd+w - if (e.key === "Escape" && OS !== "macos") { - appWindow.close(); - } - }); + setupCloseListener(); - listen("verge://refresh-clash-config", async () => { + useEffect(() => { + addListener("verge://refresh-clash-config", async () => { // the clash info may be updated await getAxios(true); mutate("getProxies"); @@ -66,12 +62,21 @@ const Layout = () => { }); // update the verge config - listen("verge://refresh-verge-config", () => mutate("getVergeConfig")); + addListener("verge://refresh-verge-config", () => mutate("getVergeConfig")); // 设置提示监听 - listen("verge://notice-message", ({ payload }) => { + addListener("verge://notice-message", ({ payload }) => { const [status, msg] = payload as [string, string]; switch (status) { + case "import_sub_url::ok": + navigate("/profile", { state: { current: msg } }); + + Notice.success(t("Import Subscription Successful")); + break; + case "import_sub_url::error": + navigate("/profile"); + Notice.error(msg); + break; case "set_config::ok": Notice.success(t("Clash Config Updated")); break; diff --git a/src/pages/connections.tsx b/src/pages/connections.tsx index 3f28a216..44f79d97 100644 --- a/src/pages/connections.tsx +++ b/src/pages/connections.tsx @@ -15,11 +15,11 @@ import { ConnectionDetailRef, } from "@/components/connection/connection-detail"; import parseTraffic from "@/utils/parse-traffic"; -import { useCustomTheme } from "@/components/layout/use-custom-theme"; import { BaseSearchBox } from "@/components/base/base-search-box"; import { BaseStyledSelect } from "@/components/base/base-styled-select"; import useSWRSubscription from "swr/subscription"; import { createSockette } from "@/utils/websocket"; +import { useTheme } from "@mui/material/styles"; const initConn: IConnections = { uploadTotal: 0, @@ -32,7 +32,8 @@ type OrderFunc = (list: IConnectionsItem[]) => IConnectionsItem[]; const ConnectionsPage = () => { const { t } = useTranslation(); const { clashInfo } = useClashInfo(); - const { theme } = useCustomTheme(); + + const theme = useTheme(); const isDark = theme.palette.mode === "dark"; const [match, setMatch] = useState(() => (_: string) => true); const [curOrderOpt, setOrderOpt] = useState("Default"); @@ -46,7 +47,7 @@ const ConnectionsPage = () => { list.sort( (a, b) => new Date(b.start || "0").getTime()! - - new Date(a.start || "0").getTime()! + new Date(a.start || "0").getTime()!, ), "Upload Speed": (list) => list.sort((a, b) => b.curUpload! - a.curUpload!), "Download Speed": (list) => @@ -102,7 +103,7 @@ const ConnectionsPage = () => { next(event); }, }, - 3 + 3, ); return () => { @@ -113,7 +114,7 @@ const ConnectionsPage = () => { const [filterConn, download, upload] = useMemo(() => { const orderFunc = orderOpts[curOrderOpt]; let connections = connData.connections.filter((conn) => - match(conn.metadata.host || conn.metadata.destinationIP || "") + match(conn.metadata.host || conn.metadata.destinationIP || ""), ); if (orderFunc) connections = orderFunc(connections); @@ -151,7 +152,7 @@ const ConnectionsPage = () => { setSetting((o) => o?.layout !== "table" ? { ...o, layout: "table" } - : { ...o, layout: "list" } + : { ...o, layout: "list" }, ) } > diff --git a/src/pages/logs.tsx b/src/pages/logs.tsx index 6fb6b956..c454fd97 100644 --- a/src/pages/logs.tsx +++ b/src/pages/logs.tsx @@ -2,35 +2,43 @@ import { useMemo, useState } from "react"; import { Box, Button, IconButton, MenuItem } from "@mui/material"; import { Virtuoso } from "react-virtuoso"; import { useTranslation } from "react-i18next"; +import { useLocalStorage } from "foxact/use-local-storage"; + import { PlayCircleOutlineRounded, PauseCircleOutlineRounded, } from "@mui/icons-material"; -import { useLogData } from "@/hooks/use-log-data"; +import { useLogData, LogLevel, clearLogs } from "@/hooks/use-log-data"; import { useEnableLog } from "@/services/states"; import { BaseEmpty, BasePage } from "@/components/base"; import LogItem from "@/components/log/log-item"; -import { useCustomTheme } from "@/components/layout/use-custom-theme"; +import { useTheme } from "@mui/material/styles"; import { BaseSearchBox } from "@/components/base/base-search-box"; import { BaseStyledSelect } from "@/components/base/base-styled-select"; -import { mutate } from "swr"; +import { SearchState } from "@/components/base/base-search-box"; const LogPage = () => { const { t } = useTranslation(); - const { data: logData = [] } = useLogData(); const [enableLog, setEnableLog] = useEnableLog(); - const { theme } = useCustomTheme(); + const theme = useTheme(); const isDark = theme.palette.mode === "dark"; - const [logState, setLogState] = useState("all"); + const [logLevel, setLogLevel] = useLocalStorage( + "log:log-level", + "info", + ); const [match, setMatch] = useState(() => (_: string) => true); + const logData = useLogData(logLevel); + const [searchState, setSearchState] = useState(); const filterLogs = useMemo(() => { - return logData.filter( - (data) => - (logState === "all" ? true : data.type.includes(logState)) && - match(data.payload) - ); - }, [logData, logState, match]); + return logData + ? logData.filter((data) => + logLevel === "all" + ? match(data.payload) + : data.type.includes(logLevel) && match(data.payload), + ) + : []; + }, [logData, logLevel, match]); return ( { )} - + {enableLog === true && ( + + )}
} > @@ -75,15 +85,21 @@ const LogPage = () => { }} > setLogState(e.target.value)} + value={logLevel} + onChange={(e) => setLogLevel(e.target.value as LogLevel)} > ALL - INFO - WARN - ERROR + INFO + WARNING + ERROR + DEBUG - setMatch(() => match)} /> + { + setMatch(() => matcher); + setSearchState(state); + }} + /> { } + itemContent={(index, item) => ( + + )} followOutput={"smooth"} /> ) : ( diff --git a/src/pages/profiles.tsx b/src/pages/profiles.tsx index 71fee9af..7d6ee44f 100644 --- a/src/pages/profiles.tsx +++ b/src/pages/profiles.tsx @@ -47,13 +47,15 @@ import { useProfiles } from "@/hooks/use-profiles"; import { ConfigViewer } from "@/components/setting/mods/config-viewer"; import { throttle } from "lodash-es"; import { BaseStyledTextField } from "@/components/base/base-styled-text-field"; -import { listen } from "@tauri-apps/api/event"; import { readTextFile } from "@tauri-apps/plugin-fs"; import { readText } from "@tauri-apps/plugin-clipboard-manager"; +import { useLocation } from "react-router-dom"; +import { useListen } from "@/hooks/use-listen"; const ProfilePage = () => { const { t } = useTranslation(); - + const location = useLocation(); + const { addListener } = useListen(); const [url, setUrl] = useState(""); const [disabled, setDisabled] = useState(false); const [activatings, setActivatings] = useState([]); @@ -62,11 +64,12 @@ const ProfilePage = () => { useSensor(PointerSensor), useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates, - }) + }), ); + const { current } = location.state || {}; useEffect(() => { - const unlisten = listen("tauri://file-drop", async (event) => { + const unlisten = addListener("tauri://file-drop", async (event) => { const fileList = event.payload as string[]; for (let file of fileList) { if (!file.endsWith(".yaml") && !file.endsWith(".yml")) { @@ -102,7 +105,7 @@ const ProfilePage = () => { const { data: chainLogs = {}, mutate: mutateLogs } = useSWR( "getRuntimeLogs", - getRuntimeLogs + getRuntimeLogs, ); const viewerRef = useRef(null); @@ -132,23 +135,8 @@ const ProfilePage = () => { Notice.success(t("Profile Imported Successfully")); setUrl(""); setLoading(false); - - getProfiles().then(async (newProfiles) => { - mutate("getProfiles", newProfiles); - - const remoteItem = newProfiles.items?.find((e) => e.type === "remote"); - - const profilesCount = newProfiles.items?.filter( - (e) => e.type === "remote" || e.type === "local" - ).length as number; - - if (remoteItem && (profilesCount == 1 || !newProfiles.current)) { - const current = remoteItem.uid; - await patchProfiles({ current }); - mutateLogs(); - setTimeout(() => activateSelected(), 2000); - } - }); + mutateProfiles(); + await onEnhance(false); } catch (err: any) { Notice.error(err.message || err.toString()); setLoading(false); @@ -168,33 +156,49 @@ const ProfilePage = () => { } }; - const onSelect = useLockFn(async (current: string, force: boolean) => { - if (!force && current === profiles.current) return; + const activateProfile = async (profile: string, notifySuccess: boolean) => { // 避免大多数情况下loading态闪烁 const reset = setTimeout(() => { - setActivatings([...currentActivatings(), current]); + setActivatings((prev) => [...prev, profile]); }, 100); + try { - await patchProfiles({ current }); + await patchProfiles({ current: profile }); await mutateLogs(); closeAllConnections(); - activateSelected().then(() => { + await activateSelected(); + if (notifySuccess) { Notice.success(t("Profile Switched"), 1000); - }); + } } catch (err: any) { Notice.error(err?.message || err.toString(), 4000); } finally { clearTimeout(reset); setActivatings([]); } + }; + const onSelect = useLockFn(async (current: string, force: boolean) => { + if (!force && current === profiles.current) return; + await activateProfile(current, true); }); - const onEnhance = useLockFn(async () => { + useEffect(() => { + (async () => { + if (current) { + mutateProfiles(); + await activateProfile(current, false); + } + })(); + }, current); + + const onEnhance = useLockFn(async (notifySuccess: boolean) => { setActivatings(currentActivatings()); try { await enhanceProfiles(); mutateLogs(); - Notice.success(t("Profile Reactivated"), 1000); + if (notifySuccess) { + Notice.success(t("Profile Reactivated"), 1000); + } } catch (err: any) { Notice.error(err.message || err.toString(), 3000); } finally { @@ -209,7 +213,7 @@ const ProfilePage = () => { await deleteProfile(uid); mutateProfiles(); mutateLogs(); - current && (await onEnhance()); + current && (await onEnhance(false)); } catch (err: any) { Notice.error(err?.message || err.toString()); } finally { @@ -236,7 +240,7 @@ const ProfilePage = () => { setLoadingCache((cache) => { // 获取没有正在更新的订阅 const items = profileItems.filter( - (e) => e.type === "remote" && !cache[e.uid] + (e) => e.type === "remote" && !cache[e.uid], ); const change = Object.fromEntries(items.map((e) => [e.uid, true])); @@ -286,7 +290,7 @@ const ProfilePage = () => { size="small" color="primary" title={t("Reactivate Profiles")} - onClick={onEnhance} + onClick={() => onEnhance(true)} > @@ -385,7 +389,7 @@ const ProfilePage = () => { onEdit={() => viewerRef.current?.edit(item)} onSave={async (prev, curr) => { if (prev !== curr && profiles.current === item.uid) { - await onEnhance(); + await onEnhance(false); } }} onDelete={() => onDelete(item.uid)} @@ -408,7 +412,7 @@ const ProfilePage = () => { id="Merge" onSave={async (prev, curr) => { if (prev !== curr) { - await onEnhance(); + await onEnhance(false); } }} /> @@ -419,7 +423,7 @@ const ProfilePage = () => { logInfo={chainLogs["Script"]} onSave={async (prev, curr) => { if (prev !== curr) { - await onEnhance(); + await onEnhance(false); } }} /> @@ -428,7 +432,13 @@ const ProfilePage = () => { - mutateProfiles()} /> + { + mutateProfiles(); + await onEnhance(false); + }} + /> ); diff --git a/src/pages/proxies.tsx b/src/pages/proxies.tsx index 9259b8b3..b8f0b4ab 100644 --- a/src/pages/proxies.tsx +++ b/src/pages/proxies.tsx @@ -3,11 +3,7 @@ import { useEffect } from "react"; import { useLockFn } from "ahooks"; import { useTranslation } from "react-i18next"; import { Box, Button, ButtonGroup } from "@mui/material"; -import { - closeAllConnections, - getClashConfig, - updateConfigs, -} from "@/services/api"; +import { closeAllConnections, getClashConfig } from "@/services/api"; import { patchClashConfig } from "@/services/cmds"; import { useVerge } from "@/hooks/use-verge"; import { BasePage } from "@/components/base"; @@ -19,7 +15,7 @@ const ProxyPage = () => { const { data: clashConfig, mutate: mutateClash } = useSWR( "getClashConfig", - getClashConfig + getClashConfig, ); const { verge } = useVerge(); @@ -33,7 +29,6 @@ const ProxyPage = () => { if (mode !== curMode && verge?.auto_close_connection) { closeAllConnections(); } - await updateConfigs({ mode }); await patchClashConfig({ mode }); mutateClash(); }); diff --git a/src/pages/rules.tsx b/src/pages/rules.tsx index 130901bc..7dece0ea 100644 --- a/src/pages/rules.tsx +++ b/src/pages/rules.tsx @@ -1,26 +1,40 @@ import useSWR from "swr"; -import { useState, useMemo } from "react"; +import { useState, useMemo, useRef } from "react"; import { useTranslation } from "react-i18next"; -import { Virtuoso } from "react-virtuoso"; +import { Virtuoso, VirtuosoHandle } from "react-virtuoso"; import { Box } from "@mui/material"; import { getRules } from "@/services/api"; import { BaseEmpty, BasePage } from "@/components/base"; import RuleItem from "@/components/rule/rule-item"; import { ProviderButton } from "@/components/rule/provider-button"; -import { useCustomTheme } from "@/components/layout/use-custom-theme"; import { BaseSearchBox } from "@/components/base/base-search-box"; +import { useTheme } from "@mui/material/styles"; +import { ScrollTopButton } from "@/components/layout/scroll-top-button"; const RulesPage = () => { const { t } = useTranslation(); const { data = [] } = useSWR("getRules", getRules); - const { theme } = useCustomTheme(); + const theme = useTheme(); const isDark = theme.palette.mode === "dark"; const [match, setMatch] = useState(() => (_: string) => true); + const virtuosoRef = useRef(null); + const [showScrollTop, setShowScrollTop] = useState(false); const rules = useMemo(() => { return data.filter((item) => match(item.payload)); }, [data, match]); + const scrollToTop = () => { + virtuosoRef.current?.scrollTo({ + top: 0, + behavior: "smooth", + }); + }; + + const handleScroll = (e: any) => { + setShowScrollTop(e.target.scrollTop > 100); + }; + return ( { margin: "10px", borderRadius: "8px", bgcolor: isDark ? "#282a36" : "#ffffff", + position: "relative", }} > {rules.length > 0 ? ( - ( - - )} - followOutput={"smooth"} - /> + <> + ( + + )} + followOutput={"smooth"} + scrollerRef={(ref) => { + if (ref) ref.addEventListener("scroll", handleScroll); + }} + /> + + ) : ( )} diff --git a/src/services/api.ts b/src/services/api.ts index b46e6aef..2eec99d9 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -49,12 +49,6 @@ export const getClashConfig = async () => { return instance.get("/configs") as Promise; }; -/// Update current configs -export const updateConfigs = async (config: Partial) => { - const instance = await getAxios(); - return instance.patch("/configs", config); -}; - /// Update geo data export const updateGeoData = async () => { const instance = await getAxios(); @@ -78,16 +72,16 @@ export const getRules = async () => { export const getProxyDelay = async ( name: string, url?: string, - timeout?: number + timeout?: number, ) => { const params = { timeout: timeout || 10000, - url: url || "http://1.1.1.1", + url: url || "http://cp.cloudflare.com/generate_204", }; const instance = await getAxios(); const result = await instance.get( `/proxies/${encodeURIComponent(name)}/delay`, - { params } + { params }, ); return result as any as { delay: number }; }; @@ -114,8 +108,8 @@ export const getProxies = async () => { // provider name map const providerMap = Object.fromEntries( Object.entries(providerRecord).flatMap(([provider, item]) => - item.proxies.map((p) => [p.name, { ...p, provider }]) - ) + item.proxies.map((p) => [p.name, { ...p, provider }]), + ), ); // compatible with proxy-providers @@ -128,6 +122,8 @@ export const getProxies = async () => { udp: false, xudp: false, tfo: false, + mptcp: false, + smux: false, history: [], }; }; @@ -158,7 +154,7 @@ export const getProxies = async () => { } return acc; }, - [] + [], ); let globalNames = new Set(globalGroups.map((each) => each.name)); @@ -171,8 +167,8 @@ export const getProxies = async () => { const proxies = [direct, reject].concat( Object.values(proxyRecord).filter( - (p) => !p.all?.length && p.name !== "DIRECT" && p.name !== "REJECT" - ) + (p) => !p.all?.length && p.name !== "DIRECT" && p.name !== "REJECT", + ), ); const _global: IProxyGroupItem = { @@ -197,7 +193,7 @@ export const getProxyProviders = async () => { Object.entries(providers).filter(([key, item]) => { const type = item.vehicleType.toLowerCase(); return type === "http" || type === "file"; - }) + }), ); }; @@ -214,7 +210,7 @@ export const getRuleProviders = async () => { Object.entries(providers).filter(([key, item]) => { const type = item.vehicleType.toLowerCase(); return type === "http" || type === "file"; - }) + }), ); }; @@ -222,7 +218,7 @@ export const getRuleProviders = async () => { export const providerHealthCheck = async (name: string) => { const instance = await getAxios(); return instance.get( - `/providers/proxies/${encodeURIComponent(name)}/healthcheck` + `/providers/proxies/${encodeURIComponent(name)}/healthcheck`, ); }; @@ -258,16 +254,16 @@ export const closeAllConnections = async () => { export const getGroupProxyDelays = async ( groupName: string, url?: string, - timeout?: number + timeout?: number, ) => { const params = { timeout: timeout || 10000, - url: url || "http://1.1.1.1", + url: url || "http://cp.cloudflare.com/generate_204", }; const instance = await getAxios(); const result = await instance.get( `/group/${encodeURIComponent(groupName)}/delay`, - { params } + { params }, ); return result as any as Record; }; diff --git a/src/services/cmds.ts b/src/services/cmds.ts index 552da399..83d442cf 100644 --- a/src/services/cmds.ts +++ b/src/services/cmds.ts @@ -6,29 +6,6 @@ export async function copyClashEnv() { return invoke("copy_clash_env"); } -export async function getClashLogs() { - const regex = /time="(.+?)"\s+level=(.+?)\s+msg="(.+?)"/; - const newRegex = /(.+?)\s+(.+?)\s+(.+)/; - const logs = await invoke("get_clash_logs"); - - return logs.reduce((acc, log) => { - const result = log.match(regex); - if (result) { - const [_, _time, type, payload] = result; - const time = dayjs(_time).format("MM-DD HH:mm:ss"); - acc.push({ time, type, payload }); - return acc; - } - - const result2 = log.match(newRegex); - if (result2) { - const [_, time, type, payload] = result2; - acc.push({ time, type, payload }); - } - return acc; - }, []); -} - export async function getProfiles() { return invoke("get_profiles"); } @@ -43,7 +20,7 @@ export async function patchProfilesConfig(profiles: IProfilesConfig) { export async function createProfile( item: Partial, - fileData?: string | null + fileData?: string | null, ) { return invoke("create_profile", { item, fileData }); } @@ -84,7 +61,7 @@ export async function deleteProfile(index: string) { export async function patchProfile( index: string, - profile: Partial + profile: Partial, ) { return invoke("patch_profile", { index, profile }); } @@ -141,8 +118,12 @@ export async function changeClashCore(clashCore: string) { return invoke("change_clash_core", { clashCore }); } -export async function restartSidecar() { - return invoke("restart_sidecar"); +export async function restartCore() { + return invoke("restart_core"); +} + +export async function restartApp() { + return invoke("restart_app"); } export async function getAppDir() { @@ -151,19 +132,19 @@ export async function getAppDir() { export async function openAppDir() { return invoke("open_app_dir").catch((err) => - Notice.error(err?.message || err.toString(), 1500) + Notice.error(err?.message || err.toString(), 1500), ); } export async function openCoreDir() { return invoke("open_core_dir").catch((err) => - Notice.error(err?.message || err.toString(), 1500) + Notice.error(err?.message || err.toString(), 1500), ); } export async function openLogsDir() { return invoke("open_logs_dir").catch((err) => - Notice.error(err?.message || err.toString(), 1500) + Notice.error(err?.message || err.toString(), 1500), ); } @@ -174,7 +155,7 @@ export async function openWebUrl(url: string) { export async function cmdGetProxyDelay( name: string, timeout: number, - url?: string + url?: string, ) { name = encodeURIComponent(name); return invoke<{ delay: number }>("clash_api_get_proxy_delay", { @@ -188,30 +169,9 @@ export async function cmdTestDelay(url: string) { return invoke("test_delay", { url }); } -/// service mode - -export async function checkService() { - try { - const result = await invoke("check_service"); - if (result?.code === 0) return "active"; - if (result?.code === 400) return "installed"; - return "unknown"; - } catch (err: any) { - return "uninstall"; - } -} - -export async function installService(passwd: string) { - return invoke("install_service", { passwd }); -} - -export async function uninstallService(passwd: string) { - return invoke("uninstall_service", { passwd }); -} - export async function invoke_uwp_tool() { return invoke("invoke_uwp_tool").catch((err) => - Notice.error(err?.message || err.toString(), 1500) + Notice.error(err?.message || err.toString(), 1500), ); } @@ -229,7 +189,7 @@ export async function exitApp() { export async function copyIconFile( path: string, - name: "common" | "sysproxy" | "tun" + name: "common" | "sysproxy" | "tun", ) { return invoke("copy_icon_file", { path, name }); } @@ -245,3 +205,35 @@ export async function getNetworkInterfaces() { export async function getNetworkInterfacesInfo() { return invoke("get_network_interfaces_info"); } + +export async function createWebdavBackup() { + return invoke("create_webdav_backup"); +} + +export async function deleteWebdavBackup(filename: string) { + return invoke("delete_webdav_backup", { filename }); +} + +export async function restoreWebDavBackup(filename: string) { + return invoke("restore_webdav_backup", { filename }); +} + +export async function saveWebdavConfig( + url: string, + username: string, + password: String, +) { + return invoke("save_webdav_config", { + url, + username, + password, + }); +} + +export async function listWebDavBackup() { + let list: IWebDavFile[] = await invoke("list_webdav_backup"); + list.map((item) => { + item.filename = item.href.split("/").pop() as string; + }); + return list; +} diff --git a/src/services/states.ts b/src/services/states.ts index 4ea46298..7bd63ef9 100644 --- a/src/services/states.ts +++ b/src/services/states.ts @@ -5,7 +5,7 @@ const [ThemeModeProvider, useThemeMode, useSetThemeMode] = createContextState< "light" | "dark" >("light"); -export const useEnableLog = () => useLocalStorage("enable-log", true); +export const useEnableLog = () => useLocalStorage("enable-log", false); interface IConnectionSetting { layout: "table" | "list"; @@ -20,7 +20,7 @@ export const useConnectionSetting = () => { serializer: JSON.stringify, deserializer: JSON.parse, - } + }, ); // save the state of each profile item loading diff --git a/src/services/types.d.ts b/src/services/types.d.ts index df48e529..0aab5a46 100644 --- a/src/services/types.d.ts +++ b/src/services/types.d.ts @@ -32,6 +32,7 @@ interface IConfigData { "tproxy-port": number; "external-controller": string; secret: string; + "unified-delay": boolean; tun: { stack: string; device: string; @@ -55,6 +56,8 @@ interface IProxyItem { udp: boolean; xudp: boolean; tfo: boolean; + mptcp: boolean; + smux: boolean; history: { time: string; delay: number; @@ -467,6 +470,7 @@ interface IProxyVlessConfig extends IProxyBaseConfig { fingerprint?: string; servername?: string; "client-fingerprint"?: ClientFingerprint; + smux?: boolean; } // vmess interface IProxyVmessConfig extends IProxyBaseConfig { @@ -495,6 +499,7 @@ interface IProxyVmessConfig extends IProxyBaseConfig { "global-padding"?: boolean; "authenticated-length"?: boolean; "client-fingerprint"?: ClientFingerprint; + smux?: boolean; } interface WireGuardPeerOptions { server?: string; @@ -603,6 +608,7 @@ interface IProxyShadowsocksConfig extends IProxyBaseConfig { "udp-over-tcp"?: boolean; "udp-over-tcp-version"?: number; "client-fingerprint"?: ClientFingerprint; + smux?: boolean; } // shadowsocksR interface IProxyshadowsocksRConfig extends IProxyBaseConfig { @@ -702,7 +708,6 @@ interface IVergeConfig { tun_tray_icon?: boolean; enable_tun_mode?: boolean; enable_auto_launch?: boolean; - enable_service_mode?: boolean; enable_silent_start?: boolean; enable_system_proxy?: boolean; proxy_auto_config?: boolean; @@ -743,4 +748,22 @@ interface IVergeConfig { auto_log_clean?: 0 | 1 | 2 | 3; proxy_layout_column?: number; test_list?: IVergeTestItem[]; + webdav_url?: string; + webdav_username?: string; + webdav_password?: string; +} + +interface IWebDavFile { + filename: string; + href: string; + last_modified: string; + content_length: number; + content_type: string; + tag: string; +} + +interface IWebDavConfig { + url: string; + username: string; + password: string; } diff --git a/src/utils/helper.ts b/src/utils/helper.ts new file mode 100644 index 00000000..1a7d1046 --- /dev/null +++ b/src/utils/helper.ts @@ -0,0 +1,9 @@ +export const isValidUrl = (url: string) => { + try { + new URL(url); + return true; + } catch (e) { + console.log(e); + return false; + } +}; diff --git a/src/utils/parse-hotkey.ts b/src/utils/parse-hotkey.ts index 864ef4f8..12f96dcf 100644 --- a/src/utils/parse-hotkey.ts +++ b/src/utils/parse-hotkey.ts @@ -1,27 +1,63 @@ const KEY_MAP: Record = { - '"': "'", - ":": ";", - "?": "/", - ">": ".", - "<": ",", - "{": "[", - "}": "]", - "|": "\\", - "!": "1", - "@": "2", - "#": "3", - $: "4", - "%": "5", - "^": "6", - "&": "7", - "*": "8", - "(": "9", - ")": "0", - "~": "`", + // 特殊字符映射 + "-": "Minus", + "=": "Equal", + "[": "BracketLeft", + "]": "BracketRight", + "\\": "Backslash", + ";": "Semicolon", + "'": "Quote", + ",": "Comma", + ".": "Period", + "/": "Slash", + // Option + 特殊字符映射 + "–": "Minus", // Option + - + "≠": "Equal", // Option + = + "\u201C": "BracketLeft", // Option + [ + "\u2019": "BracketRight", // Option + ] + "«": "Backslash", // Option + \ + "…": "Semicolon", // Option + ; + æ: "Quote", // Option + ' + "≤": "Comma", // Option + , + "≥": "Period", // Option + . + "÷": "Slash", // Option + / + + // Option组合键映射 + Å: "A", + "∫": "B", + Ç: "C", + "∂": "D", + "´": "E", + ƒ: "F", + "©": "G", + "˙": "H", + ˆ: "I", + "∆": "J", + "˚": "K", + "¬": "L", + µ: "M", + "˜": "N", + Ø: "O", + π: "P", + Œ: "Q", + "®": "R", + ß: "S", + "†": "T", + "¨": "U", + "√": "V", + "∑": "W", + "≈": "X", + "¥": "Y", + Ω: "Z", }; +const mapKeyCombination = (key: string): string => { + const mappedKey = KEY_MAP[key] || key; + return `${mappedKey}`; +}; export const parseHotkey = (key: string) => { let temp = key.toUpperCase(); + console.log(temp); if (temp.startsWith("ARROW")) { temp = temp.slice(5); @@ -34,6 +70,7 @@ export const parseHotkey = (key: string) => { } else if (temp.endsWith("RIGHT")) { temp = temp.slice(0, -5); } + console.log(temp, mapKeyCombination(temp)); switch (temp) { case "CONTROL": diff --git a/src/utils/websocket.ts b/src/utils/websocket.ts index 9721341d..0582cf93 100644 --- a/src/utils/websocket.ts +++ b/src/utils/websocket.ts @@ -6,7 +6,7 @@ import Sockette, { type SocketteOptions } from "sockette"; export const createSockette = ( url: string, opt: SocketteOptions, - maxError = 10 + maxError = 10, ) => { let remainRetryCount = maxError; @@ -23,8 +23,10 @@ export const createSockette = ( remainRetryCount -= 1; if (remainRetryCount >= 0) { - this.close(); - this.reconnect(); + if (this instanceof Sockette) { + this.close(); + this.reconnect(); + } } else { opt.onerror?.call(this, ev); } diff --git a/vite.config.ts b/vite.config.mts similarity index 77% rename from vite.config.ts rename to vite.config.mts index 9e4f7140..9fb9b95c 100644 --- a/vite.config.ts +++ b/vite.config.mts @@ -3,7 +3,12 @@ import path from "path"; import svgr from "vite-plugin-svgr"; import react from "@vitejs/plugin-react"; import legacy from "@vitejs/plugin-legacy"; -import monacoEditor from "vite-plugin-monaco-editor"; +import monacoEditorPlugin, { + type IMonacoEditorOpts, +} from "vite-plugin-monaco-editor"; +const monacoEditorPluginDefault = (monacoEditorPlugin as any).default as ( + options: IMonacoEditorOpts, +) => any; export default defineConfig({ root: "src", @@ -23,7 +28,7 @@ export default defineConfig({ path.resolve("./src/polyfills/RegExp.js"), ], }), - monacoEditor({ + monacoEditorPluginDefault({ languageWorkers: ["editorWorkerService", "typescript", "css"], customWorkers: [ { @@ -43,6 +48,13 @@ export default defineConfig({ "@root": path.resolve("."), }, }, + css: { + preprocessorOptions: { + scss: { + api: "modern-compiler", + }, + }, + }, define: { OS_PLATFORM: `"${process.platform}"`, },