From 30ee7a9e8514b41d732c4f53d73b43a072035d17 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 12 Sep 2024 05:45:15 +0800 Subject: [PATCH 001/288] fix: missing items in system tray --- src-tauri/src/core/tray.rs | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 633babf3..08dafb81 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -221,6 +221,33 @@ fn create_tray_menu( "Tun 模式" }; + let open_app_dir = &MenuItem::with_id( + app_handle, + "open_app_dir", + t!("App 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 restart_clash = &MenuItem::with_id( app_handle, "restart_clash", @@ -322,12 +349,12 @@ fn create_tray_menu( .unwrap(), ) .item( - &MenuItem::with_id( + &Submenu::with_id_and_items( app_handle, "open_dir", t!("Open Dir", "打开目录", use_zh), true, - None::<&str>, + &[open_app_dir, open_core_dir, open_logs_dir], ) .unwrap(), ) @@ -369,7 +396,9 @@ fn on_menu_event(app_handle: &AppHandle, event: MenuEvent) { "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()), + "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()), From 1fc54e49d9710e45b39b4d186e56bec89495a33b Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 12 Sep 2024 06:14:04 +0800 Subject: [PATCH 002/288] chore: update deps --- package.json | 2 +- pnpm-lock.yaml | 90 +++++++++++++++++------------------ src-tauri/Cargo.lock | 111 ++++++++++++++++++++++--------------------- src-tauri/Cargo.toml | 13 ++--- 4 files changed, 110 insertions(+), 106 deletions(-) diff --git a/package.json b/package.json index e46a234a..6ec87284 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ }, "devDependencies": { "@actions/github": "^5.1.1", - "@tauri-apps/cli": "2.0.0-rc.8", + "@tauri-apps/cli": "2.0.0-rc.13", "@types/fs-extra": "^9.0.13", "@types/js-cookie": "^3.0.6", "@types/js-yaml": "^4.0.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 637363e2..a47a39f9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,8 +153,8 @@ importers: specifier: ^5.1.1 version: 5.1.1 "@tauri-apps/cli": - specifier: 2.0.0-rc.8 - version: 2.0.0-rc.8 + specifier: 2.0.0-rc.13 + version: 2.0.0-rc.13 "@types/fs-extra": specifier: ^9.0.13 version: 9.0.13 @@ -2106,100 +2106,100 @@ packages: integrity: sha512-UNiIhhKG08j4ooss2oEEVexffmWkgkYlC2M3GcX3VPtNsqFgVNL8Mcw/4Y7rO9M9S+ffAMnLOF5ypzyuyb8tyg==, } - "@tauri-apps/cli-darwin-arm64@2.0.0-rc.8": + "@tauri-apps/cli-darwin-arm64@2.0.0-rc.13": resolution: { - integrity: sha512-XDjFLfCz7gOsKg9qFyK7S9EbrdcLhWE2bSTvHDpnFdMc+DcjMR4O3HuCO7SrPmmFUf86OknYFiuMPEUoHf0Fiw==, + integrity: sha512-j2BTeqq0b5073SUr5jLUGWwmQ0Q7/T1uXQZd0hLynYgbL6ZR83afex2ct7i50Qui03er49188EoBWy3vDE/9Kg==, } engines: { node: ">= 10" } cpu: [arm64] os: [darwin] - "@tauri-apps/cli-darwin-x64@2.0.0-rc.8": + "@tauri-apps/cli-darwin-x64@2.0.0-rc.13": resolution: { - integrity: sha512-vYuITao7qq45jzTXRFdAcB+rVBULmofksWsKzoi+cgI8R0kcfB3bts+FRBdV3j+fkbpBQKpriW6Y6gdOzbf6Ow==, + integrity: sha512-xj9O2G2aC4XdQtNefJRlk3M+mLchHphefMpkmhxAeeHIFspt24Cr15WO4FnUF/BcSkpIt1Pxdy3XTISECzx3eA==, } 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.0.0-rc.13": resolution: { - integrity: sha512-iW1gJyRBvwxCeBEu+ain18v8FtFBhrsqepzuUyOy7hZJWUMPdKHJhbFVz6xp3RGZf5ycsLUr3ZhqMB3vKtv7iQ==, + integrity: sha512-n/moJC9pP1qDrqxgi825jjlubCQVRQ3D9VVriFaFOJ0mO4uPy+RTf27HLHWxe0MCk92Kxox2v3wzuDF5ldfy3A==, } 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.0.0-rc.13": resolution: { - integrity: sha512-k1HQHpu59B8JteXALCSdCQBUVb+ytsg1u/QEWPzCm7mFhzr7jqdfBjQVAKt0T5rdQQTcNtK341oB7izuXmJE2A==, + integrity: sha512-dFIqAADRGjEiS4aTe02ZmVLXmrV/9b6K2vF3I+N/zaBLHQvfRiGfyooXr4EsmyHmen2hHWErUcHe27g17eB4pA==, } 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.0.0-rc.13": resolution: { - integrity: sha512-tMotP7J/dMqCL8zPCwtMwjeO3SK1yxU9bUMZ3mwdAtf+3xr2d2hpmGo4KXk5r2jQee9+dIC3IBXexFhrVJGRHA==, + integrity: sha512-wc3lJNHfFB7ipux582i490h3uniGq2VakRZGvAIJXsUEWR4t4wcd2t77EXW1eaQMLA5UyiZJ7V3o7NiUJ5q0Hw==, } 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.0.0-rc.13": resolution: { - integrity: sha512-AnLghADQgt4oyp4rQyjpKfGpdAqofd+SRO9kht5d4c0RSViqwHBjIxrCt9FDhBpBwwkC6T6NNuQqaofZSnOH6Q==, + integrity: sha512-gC2Bmzqnb0R2lHgZ2tqwXJwaohz/kIBhmg1i+4UtNqJHNk96FSdWOPBX2fjvJsclks6WbI4u6y53jFFe9gzu4g==, } 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.0.0-rc.13": resolution: { - integrity: sha512-jv/uiXI2K41/XMA2vnKMcpdv1tKvez70HHvBoIwHhelmXV5V6Tpu5fTMEAXbA6WbJNfcFRi0kd55YRBOS0DZcw==, + integrity: sha512-lh8qZ4UCt3314LPQgO6GxNtlsZs6M9yvUz6TmHo0SPfxQp4iiRVF/g032Bc1QUZEj7LUtvo9psyWRbzRA660/Q==, } 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.0.0-rc.13": resolution: { - integrity: sha512-wctgwSfuyJ0lXBzQSzGq5TAy2m9VZichZPPJ7GitYzdHbqIRLmvxM1abRen7HikP1lpjdmjl96/kWQOebEV0qw==, + integrity: sha512-09kTW5EPB1Q/Vnnnqu5v32UcPOjaA/+hey7fG1zIvNjjI4C0SZewvlPpffVpn9CQf9HTeBjPFFcadUu5pfFKAg==, } 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.0.0-rc.13": resolution: { - integrity: sha512-BBjoAezNpHscGhBICHrt+X+IyJIh9jYnaEIGvbCIMcGB6sSDxvtttw4ef9+4jNh3JixotOR2mwIudTc1H9HffQ==, + integrity: sha512-LCSeYLqtcNGIax1GD+ss1JbMDN02Xv2Yg6J54exE7xYG8POD5kS6ZRYxpPeKOSr/tAA6OHBb0EOiZyq4T+mn1g==, } 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.0.0-rc.13": resolution: { - integrity: sha512-1pgDw2woeyDMvXctmqc53LBxsaAYqiRNUVgwvzlmzJDbUHv4+Pj4B1OGKQh1YKlsmks8LK3mK9uSbk+k1OLZhw==, + integrity: sha512-lx0QS0pb0jP94k0nzAjd4IdKbchamC0jpfwQ5V0wW7DcW9e2EVGM0HIpQSh2hJgY5M2DBx+ZDnehvzeBxxz3BA==, } engines: { node: ">= 10" } cpu: [x64] os: [win32] - "@tauri-apps/cli@2.0.0-rc.8": + "@tauri-apps/cli@2.0.0-rc.13": resolution: { - integrity: sha512-hB6Pa0IaJs/As3Hc5IOiiK4Ilh9jspEA+2uPURCRQg4BkzQWwQzNdGQ4gjAzFNFAWPzy/4uuIXdnd1a+jC4wLA==, + integrity: sha512-Pqn7uqMu3C2X1vnP//dU5TDaE6/PIFH5cbl2FjZiVJErKsjhlIbZMFzrWJTSSBTAK42ZxiEAh+dfw2erTBTjrQ==, } engines: { node: ">= 10" } hasBin: true @@ -6032,48 +6032,48 @@ snapshots: "@tauri-apps/api@2.0.0-rc.4": {} - "@tauri-apps/cli-darwin-arm64@2.0.0-rc.8": + "@tauri-apps/cli-darwin-arm64@2.0.0-rc.13": optional: true - "@tauri-apps/cli-darwin-x64@2.0.0-rc.8": + "@tauri-apps/cli-darwin-x64@2.0.0-rc.13": optional: true - "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.8": + "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.13": optional: true - "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.8": + "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.13": optional: true - "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.8": + "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.13": optional: true - "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.8": + "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.13": optional: true - "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.8": + "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.13": optional: true - "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.8": + "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.13": optional: true - "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.8": + "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.13": optional: true - "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.8": + "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.13": optional: true - "@tauri-apps/cli@2.0.0-rc.8": + "@tauri-apps/cli@2.0.0-rc.13": 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.0.0-rc.13 + "@tauri-apps/cli-darwin-x64": 2.0.0-rc.13 + "@tauri-apps/cli-linux-arm-gnueabihf": 2.0.0-rc.13 + "@tauri-apps/cli-linux-arm64-gnu": 2.0.0-rc.13 + "@tauri-apps/cli-linux-arm64-musl": 2.0.0-rc.13 + "@tauri-apps/cli-linux-x64-gnu": 2.0.0-rc.13 + "@tauri-apps/cli-linux-x64-musl": 2.0.0-rc.13 + "@tauri-apps/cli-win32-arm64-msvc": 2.0.0-rc.13 + "@tauri-apps/cli-win32-ia32-msvc": 2.0.0-rc.13 + "@tauri-apps/cli-win32-x64-msvc": 2.0.0-rc.13 "@tauri-apps/plugin-clipboard-manager@2.0.0-rc.0": dependencies: diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 6c809a3e..33d3ecc0 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1404,9 +1404,9 @@ 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", @@ -1433,9 +1433,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", @@ -2949,6 +2949,15 @@ dependencies = [ "cfb", ] +[[package]] +name = "infer" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc150e5ce2330295b8616ce0e3f53250e53af31759a9dbedad1621ba29151847" +dependencies = [ + "cfb", +] + [[package]] name = "instant" version = "0.1.13" @@ -5769,9 +5778,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.29.1" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3a97abbc7d6cfd0720da3e06fcb1cf2ac87cbfdb5bbbce103a1279a211c4d81" +checksum = "2a93f2c6b8fdaeb7f417bda89b5bc767999745c3052969664ae1fa65892deb7e" dependencies = [ "bitflags 2.6.0", "cocoa 0.26.0", @@ -5842,9 +5851,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.0.0-rc.8" +version = "2.0.0-rc.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8345ccc676ef16e26b61fc0f5340b4e770678b1e1f53f08c69ebdac5e56b422" +checksum = "4f60dc86a0513f775a6515d79cf2a54ce38f2fa7225e0c5b9d5ae8241e599afa" dependencies = [ "anyhow", "bytes", @@ -5859,7 +5868,7 @@ dependencies = [ "heck 0.5.0", "http 1.1.0", "http-range", - "image 0.24.9", + "image 0.25.2", "jni", "libc", "log", @@ -5894,9 +5903,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.0.0-rc.7" +version = "2.0.0-rc.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5ad5fcfaf02cf79aa6727f6c5df38567d8dce172b00b62690c6bc46c08b7ce" +checksum = "f9d6fc774b19bedadd547b0310fbdbfadbc7546978eccd6d3e389be7cabc437a" dependencies = [ "anyhow", "cargo_toml", @@ -5916,9 +5925,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.0.0-rc.7" +version = "2.0.0-rc.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809ef6316726fc72593d296cf6f4e7461326e310c313d6a6c42b6e7f1e2671cf" +checksum = "d14af7a85713898cb8a6be3ece89eb1c39392d8756dd1cc0309ebd6fdc966eb3" dependencies = [ "base64 0.22.1", "brotli", @@ -5943,9 +5952,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.0.0-rc.6" +version = "2.0.0-rc.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1359e8861d210d25731f8b1bfbb4d111dd06406cf73c59659366ef450364d811" +checksum = "b9f698301cd7297a7876bb81181a830d40d401461eb14fdaf7ae189b1b56ef76" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -5957,9 +5966,9 @@ dependencies = [ [[package]] name = "tauri-plugin" -version = "2.0.0-rc.7" +version = "2.0.0-rc.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7dded420c86183f592d0fe925ef9447f41e26fa79f0bdfef8d3f17bfbcdbfb7" +checksum = "ad2b0b4fe684059a1b700c1a0d7d51698c05b2257ca64eca2a730d7be2e47c6a" dependencies = [ "anyhow", "glob", @@ -5974,9 +5983,8 @@ dependencies = [ [[package]] name = "tauri-plugin-clipboard-manager" -version = "2.1.0-beta.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "becbc5a692e842f8d6a7ab5e490c3c36d267b5c3d5bf4b6a0cdd039d7df25569" +version = "2.0.0-rc.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#9291e4d2caa31c883c71e55f2193bd8754d72f03" dependencies = [ "arboard", "image 0.24.9", @@ -5990,13 +5998,13 @@ dependencies = [ [[package]] name = "tauri-plugin-devtools" -version = "2.0.0-rc.0" +version = "2.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f7333811c0b81f32e980d34894effc92454f464409fb97a7e566294b7ebddd0" +checksum = "4db4d0b3a0b5cd49d77900a236da574f717cc89919f64b6e030bf2990bd73cce" dependencies = [ "async-stream", "bytes", - "cocoa 0.25.0", + "cocoa 0.26.0", "colored", "devtools-core", "futures", @@ -6017,11 +6025,9 @@ dependencies = [ [[package]] name = "tauri-plugin-dialog" -version = "2.0.0-rc.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa8bd381f75c47687f41fb603f67fdd99a1af377da22d03d8fb959d2481845c1" +version = "2.0.0-rc.5" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#9291e4d2caa31c883c71e55f2193bd8754d72f03" dependencies = [ - "dunce", "log", "raw-window-handle 0.6.2", "rfd", @@ -6036,12 +6042,13 @@ dependencies = [ [[package]] name = "tauri-plugin-fs" -version = "2.0.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "694a746b0e0c1d318198fabf4957800c42fb4b705e866e0eed7ec21476ef88db" +version = "2.0.0-rc.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#9291e4d2caa31c883c71e55f2193bd8754d72f03" dependencies = [ "anyhow", + "dunce", "glob", + "percent-encoding", "schemars", "serde", "serde_json", @@ -6070,9 +6077,8 @@ dependencies = [ [[package]] name = "tauri-plugin-notification" -version = "2.0.0-rc.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf32fba3a2650f89c7dfc532b38de566a37779e482f07dccabf45fe24444e26" +version = "2.0.0-rc.4" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#9291e4d2caa31c883c71e55f2193bd8754d72f03" dependencies = [ "log", "notify-rust", @@ -6090,8 +6096,7 @@ dependencies = [ [[package]] name = "tauri-plugin-process" version = "2.0.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9eb80b601682dcbd45dc5ed5f7cc214f1d994aeea730d500899cc616784559" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#9291e4d2caa31c883c71e55f2193bd8754d72f03" dependencies = [ "tauri", "tauri-plugin", @@ -6100,8 +6105,7 @@ dependencies = [ [[package]] name = "tauri-plugin-shell" version = "2.0.0-rc.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83800ddf78b820172efb5ed7310344e8e4f97fd30cd8237a3f20c12a79eb136" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#9291e4d2caa31c883c71e55f2193bd8754d72f03" dependencies = [ "encoding_rs", "log", @@ -6129,7 +6133,7 @@ dependencies = [ "flate2", "futures-util", "http 1.1.0", - "infer", + "infer 0.15.0", "minisign-verify", "reqwest", "semver 1.0.23", @@ -6149,9 +6153,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.0.0-rc.7" +version = "2.0.0-rc.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75c72b844f387bfc3341c355f3e16b8cbf4161848fa4e348670effb222cd3ba5" +checksum = "6a0758dce4f9e08ebeee877d84de0062859495507e1d16f647f97b29f881b43d" dependencies = [ "dpi", "gtk", @@ -6168,9 +6172,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.0.0-rc.7" +version = "2.0.0-rc.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73accf936a7cd01d1382de7850726fdf6c1f6ab3b01ccb7a0950cb852e332596" +checksum = "78dd7f77e769630da5d91a55e4f102a84ff9c5a99c71e1b5c916a18b5ccafc16" dependencies = [ "cocoa 0.26.0", "gtk", @@ -6193,9 +6197,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.0.0-rc.7" +version = "2.0.0-rc.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53d9fe87e985b273696ae22ce2b9f099a8f1b44bc8fb127467bda5fcb3e4371" +checksum = "ba92ad9cdf7658fefa29a7218dda0acead9400c021bbf9c3f88e98f5e3b9bbab" dependencies = [ "brotli", "cargo_metadata", @@ -6203,7 +6207,7 @@ dependencies = [ "dunce", "glob", "html5ever", - "infer", + "infer 0.16.0", "json-patch", "kuchikiki", "log", @@ -6510,9 +6514,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", @@ -6777,9 +6781,9 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "131a65b2cef2081bc14dbcd414c906edbfa3bb5323dd7e748cc298614681196b" +checksum = "044d7738b3d50f288ddef035b793228740ad4d927f5466b0af55dc15e7e03cfe" dependencies = [ "core-graphics 0.24.0", "crossbeam-channel", @@ -6971,11 +6975,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", @@ -7818,9 +7821,9 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wry" -version = "0.42.0" +version = "0.43.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b8049c8f239cdbfaaea4bacb9646f6b208938ceec0acd5b3e99cd05f70903f" +checksum = "f4d715cf5fe88e9647f3d17b207b6d060d4a88e7171d4ccb2d2c657dd1d44728" dependencies = [ "base64 0.22.1", "block", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index f39a2a4d..73193ba6 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -45,13 +45,14 @@ 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 = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-dialog = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-fs = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-notification = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-process = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-clipboard-manager = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tauri-plugin-devtools = "2.0.0-rc" + [target.'cfg(windows)'.dependencies] runas = "=1.2.0" deelevate = "0.2.0" From 2396a6b35a04d563ad73788b44058e3d2b738fd3 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 12 Sep 2024 07:59:51 +0800 Subject: [PATCH 003/288] feat: log panic --- src-tauri/src/utils/error.rs | 40 ++++++++++++++++++++++++++++++++++ src-tauri/src/utils/mod.rs | 1 + src-tauri/src/utils/resolve.rs | 2 ++ 3 files changed, 43 insertions(+) create mode 100644 src-tauri/src/utils/error.rs 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/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..54081444 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -1,5 +1,6 @@ use crate::cmds::import_profile; use crate::config::IVerge; +use crate::utils::error; use crate::{config::Config, core::*, utils::init, utils::server}; use crate::{log_err, trace_err}; use anyhow::Result; @@ -32,6 +33,7 @@ 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(); From 9ec8c903c5adcb9592423154438570bfe5e6ac91 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 12 Sep 2024 15:35:08 +0800 Subject: [PATCH 004/288] feat: Optimize kernel startup logic 1. tun mode startup logic 2. Remove invalid creation process PID logic --- src-tauri/src/core/core.rs | 21 +++------------------ src-tauri/src/core/handle.rs | 2 +- src-tauri/src/enhance/mod.rs | 5 +++-- src-tauri/src/enhance/tun.rs | 17 +++++++++++------ src-tauri/src/utils/dirs.rs | 4 ---- 5 files changed, 18 insertions(+), 31 deletions(-) diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index 09d12702..c43696ac 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -2,11 +2,11 @@ use crate::config::*; use crate::core::{clash_api, handle, logger::Logger, 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 std::{sync::Arc, time::Duration}; use sysinfo::{ProcessRefreshKind, RefreshKind, System}; use tauri::AppHandle; use tauri_plugin_shell::process::{CommandChild, CommandEvent}; @@ -177,22 +177,7 @@ impl CoreManager { 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); + let (mut rx, _) = cmd.args(args).spawn()?; tauri::async_runtime::spawn(async move { while let Some(event) = rx.recv().await { diff --git a/src-tauri/src/core/handle.rs b/src-tauri/src/core/handle.rs index 614356cc..08a1d564 100644 --- a/src-tauri/src/core/handle.rs +++ b/src-tauri/src/core/handle.rs @@ -4,7 +4,7 @@ use anyhow::{bail, Result}; use once_cell::sync::OnceCell; use parking_lot::Mutex; use std::sync::Arc; -use tauri::{AppHandle, WebviewWindow, Manager, Emitter}; +use tauri::{AppHandle, Emitter, Manager, WebviewWindow}; #[derive(Debug, Default, Clone)] pub struct Handle { diff --git a/src-tauri/src/enhance/mod.rs b/src-tauri/src/enhance/mod.rs index 11355e87..c475020b 100644 --- a/src-tauri/src/enhance/mod.rs +++ b/src-tauri/src/enhance/mod.rs @@ -25,7 +25,7 @@ pub async fn enhance() -> (Mapping, Vec, HashMap) { // config.yaml 的订阅 let clash_config = { Config::clash().latest().0.clone() }; - let (clash_core, enable_tun, enable_builtin, socks_enabled, http_enabled) = { + let (clash_core, enable_tun, enable_builtin, socks_enabled, http_enabled, enable_service_mode) = { let verge = Config::verge(); let verge = verge.latest(); ( @@ -34,6 +34,7 @@ pub async fn enhance() -> (Mapping, Vec, HashMap) { verge.enable_builtin_enhanced.unwrap_or(true), verge.verge_socks_enabled.unwrap_or(false), verge.verge_http_enabled.unwrap_or(false), + verge.enable_service_mode.unwrap_or(false), ) }; #[cfg(not(target_os = "windows"))] @@ -259,7 +260,7 @@ pub async fn enhance() -> (Mapping, Vec, HashMap) { }); } - config = use_tun(config, enable_tun).await; + config = use_tun(config, enable_tun, enable_service_mode).await; config = use_sort(config); let mut exists_set = HashSet::new(); diff --git a/src-tauri/src/enhance/tun.rs b/src-tauri/src/enhance/tun.rs index 2e9de259..d3ca5c0d 100644 --- a/src-tauri/src/enhance/tun.rs +++ b/src-tauri/src/enhance/tun.rs @@ -18,28 +18,33 @@ macro_rules! append { }; } -pub async fn use_tun(mut config: Mapping, enable: bool) -> Mapping { +pub async fn use_tun(mut config: Mapping, enable: bool, enable_service_mode: 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_service_mode { + handle_dns_service(enable).await; + if enable { + return use_dns_for_tun(config); + } + } + config +} + +async fn handle_dns_service(enable: bool) { 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 } } diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs index 227e1261..82ad87c0 100644 --- a/src-tauri/src/utils/dirs.rs +++ b/src-tauri/src/utils/dirs.rs @@ -102,10 +102,6 @@ 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"))] pub fn service_path() -> Result { Ok(app_resources_dir()?.join("clash-verge-service")) From 624eb5b085c50c1fd9406448e8b031ec65be1946 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 12 Sep 2024 17:02:17 +0800 Subject: [PATCH 005/288] fix:tray click event --- src-tauri/src/core/tray.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 08dafb81..d59fad9f 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -24,7 +24,6 @@ impl Tray { let tray_event: String = tray_event.unwrap_or("main_window".into()); if let TrayIconEvent::Click { button: MouseButton::Left, - button_state: MouseButtonState::Up, .. } = event { From a39ece6156874a691e69720455a910e4cd4d02db Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 12 Sep 2024 19:01:08 +0800 Subject: [PATCH 006/288] chore: delete useless emebd server api --- src-tauri/src/core/tray.rs | 2 +- src-tauri/src/utils/server.rs | 51 +++-------------------------------- 2 files changed, 4 insertions(+), 49 deletions(-) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index d59fad9f..7c2174cd 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -8,7 +8,7 @@ use crate::{ }, }; use anyhow::Result; -use tauri::tray::{MouseButton, MouseButtonState, TrayIconEvent}; +use tauri::tray::{MouseButton, TrayIconEvent}; use tauri::{ menu::{MenuEvent, MenuItem, PredefinedMenuItem, Submenu}, Wry, diff --git a/src-tauri/src/utils/server.rs b/src-tauri/src/utils/server.rs index 3090da36..edc4a543 100644 --- a/src-tauri/src/utils/server.rs +++ b/src-tauri/src/utils/server.rs @@ -4,49 +4,19 @@ use super::resolve; use crate::config::{Config, IVerge, DEFAULT_PAC}; 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)] -struct QueryParam { - param: String, -} - /// 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")) + reqwest::get(format!("http://127.0.0.1:{port}/commands/visible")) .await? .text() .await?; - - if &resp == "ok" { - let argvs: Vec = std::env::args().collect(); - if argvs.len() > 1 { - let param = argvs[1].as_str(); - if param.starts_with("clash:") { - reqwest::get(format!( - "http://127.0.0.1:{port}/commands/scheme?param={param}" - )) - .await? - .text() - .await?; - } - } else { - reqwest::get(format!("http://127.0.0.1:{port}/commands/visible")) - .await? - .text() - .await?; - } - bail!("app exists"); - } - log::error!("failed to setup singleton listen server"); - Ok(()) + bail!("app exists"); } else { Ok(()) } @@ -59,8 +29,6 @@ pub fn embed_server(app_handle: &AppHandle) { 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); "ok" @@ -82,21 +50,8 @@ pub fn embed_server(app_handle: &AppHandle) { .body(content) .unwrap_or_default() }); - 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(pac); warp::serve(commands).run(([127, 0, 0, 1], port)).await; }); } From b888c7729e47e03adae73b376acef6db4db7f8cd Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 13 Sep 2024 03:21:55 +0800 Subject: [PATCH 007/288] refactor: url scheme implementation --- src-tauri/Cargo.lock | 100 ++++++++++++++++++++++++++-- src-tauri/Cargo.toml | 5 +- src-tauri/Info.plist | 17 ----- src-tauri/capabilities/desktop.json | 6 +- src-tauri/src/cmds.rs | 8 ++- src-tauri/src/main.rs | 18 ++++- src-tauri/src/utils/resolve.rs | 98 +++++++++++++++++---------- src-tauri/tauri.conf.json | 5 ++ src/services/cmds.ts | 1 + 9 files changed, 194 insertions(+), 64 deletions(-) mode change 100644 => 100755 src-tauri/Cargo.toml delete mode 100644 src-tauri/Info.plist mode change 100644 => 100755 src-tauri/capabilities/desktop.json mode change 100644 => 100755 src-tauri/src/main.rs mode change 100644 => 100755 src-tauri/tauri.conf.json diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 33d3ecc0..bfcc5e9e 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -933,6 +933,7 @@ dependencies = [ "tauri", "tauri-build", "tauri-plugin-clipboard-manager", + "tauri-plugin-deep-link", "tauri-plugin-devtools", "tauri-plugin-dialog", "tauri-plugin-fs", @@ -942,6 +943,7 @@ dependencies = [ "tauri-plugin-shell", "tauri-plugin-updater", "tokio", + "url", "users", "warp", "window-shadows", @@ -1062,6 +1064,26 @@ 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 = "convert_case" version = "0.4.0" @@ -1565,6 +1587,15 @@ dependencies = [ "syn 2.0.77", ] +[[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 = "dpi" version = "0.1.1" @@ -2627,7 +2658,7 @@ dependencies = [ "httpdate", "itoa 1.0.11", "pin-project-lite", - "socket2 0.5.7", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -4018,6 +4049,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" @@ -4944,6 +4985,17 @@ 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" @@ -5984,7 +6036,7 @@ dependencies = [ [[package]] name = "tauri-plugin-clipboard-manager" version = "2.0.0-rc.3" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#9291e4d2caa31c883c71e55f2193bd8754d72f03" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#984110a978774712bad4d746ed06134d54debcd0" dependencies = [ "arboard", "image 0.24.9", @@ -5996,6 +6048,25 @@ dependencies = [ "thiserror", ] +[[package]] +name = "tauri-plugin-deep-link" +version = "2.0.0-rc.4" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#984110a978774712bad4d746ed06134d54debcd0" +dependencies = [ + "dunce", + "log", + "rust-ini", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-utils", + "thiserror", + "url", + "windows-registry", + "windows-result 0.2.0", +] + [[package]] name = "tauri-plugin-devtools" version = "2.0.0-rc.1" @@ -6026,7 +6097,7 @@ dependencies = [ [[package]] name = "tauri-plugin-dialog" version = "2.0.0-rc.5" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#9291e4d2caa31c883c71e55f2193bd8754d72f03" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#984110a978774712bad4d746ed06134d54debcd0" dependencies = [ "log", "raw-window-handle 0.6.2", @@ -6043,7 +6114,7 @@ dependencies = [ [[package]] name = "tauri-plugin-fs" version = "2.0.0-rc.3" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#9291e4d2caa31c883c71e55f2193bd8754d72f03" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#984110a978774712bad4d746ed06134d54debcd0" dependencies = [ "anyhow", "dunce", @@ -6078,7 +6149,7 @@ dependencies = [ [[package]] name = "tauri-plugin-notification" version = "2.0.0-rc.4" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#9291e4d2caa31c883c71e55f2193bd8754d72f03" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#984110a978774712bad4d746ed06134d54debcd0" dependencies = [ "log", "notify-rust", @@ -6096,7 +6167,7 @@ dependencies = [ [[package]] name = "tauri-plugin-process" version = "2.0.0-rc.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#9291e4d2caa31c883c71e55f2193bd8754d72f03" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#984110a978774712bad4d746ed06134d54debcd0" dependencies = [ "tauri", "tauri-plugin", @@ -6105,7 +6176,7 @@ dependencies = [ [[package]] name = "tauri-plugin-shell" version = "2.0.0-rc.3" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#9291e4d2caa31c883c71e55f2193bd8754d72f03" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#984110a978774712bad4d746ed06134d54debcd0" dependencies = [ "encoding_rs", "log", @@ -6426,6 +6497,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" @@ -6800,6 +6880,12 @@ dependencies = [ "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" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml old mode 100644 new mode 100755 index 73193ba6..02d544df --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -51,12 +51,15 @@ tauri-plugin-fs = { git = "https://github.com/tauri-apps/plugins-workspace", bra tauri-plugin-notification = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tauri-plugin-process = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tauri-plugin-clipboard-manager = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-deep-link = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tauri-plugin-devtools = "2.0.0-rc" - +url = "2.5.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" 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..fbb332b0 --- a/src-tauri/capabilities/desktop.json +++ b/src-tauri/capabilities/desktop.json @@ -3,5 +3,9 @@ "platforms": ["macOS", "windows", "linux"], "webviews": ["main"], "windows": ["main"], - "permissions": ["global-shortcut:default", "updater:default"] + "permissions": [ + "global-shortcut:default", + "updater:default", + "deep-link:default" + ] } diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index a560fd80..69711c9c 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -32,8 +32,12 @@ pub async fn enhance_profiles() -> CmdResult { } #[tauri::command] -pub async fn import_profile(url: String, option: Option) -> CmdResult { - let item = wrap_err!(PrfItem::from_url(&url, None, None, option).await)?; +pub async fn import_profile( + url: String, + name: Option, + option: Option, +) -> CmdResult { + let item = wrap_err!(PrfItem::from_url(&url, name, None, option).await)?; wrap_err!(Config::profiles().data().append_item(item)) } diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs old mode 100644 new mode 100755 index fe0fb9c9..ca5cb108 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -10,7 +10,8 @@ mod enhance; mod feat; mod utils; -use crate::utils::{resolve, server}; +use crate::utils::{resolve, resolve::resolve_scheme, server}; +use tauri::Listener; fn main() -> std::io::Result<()> { // 单例检测 @@ -42,10 +43,25 @@ fn main() -> std::io::Result<()> { .plugin(tauri_plugin_fs::init()) .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_shell::init()) + .plugin(tauri_plugin_deep_link::init()) .setup(|app| { + #[cfg(target_os = "linux")] + { + use tauri_plugin_deep_link::DeepLinkExt; + app.deep_link().register_all()?; + } + + app.listen("deep-link://new-url", |event| { + tauri::async_runtime::spawn(async move { + let payload = event.payload(); + log_err!(resolve_scheme(payload.to_string()).await); + }); + }); + tauri::async_runtime::block_on(async move { resolve::resolve_setup(app).await; }); + Ok(()) }) .invoke_handler(tauri::generate_handler![ diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 54081444..a20379c7 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -2,12 +2,15 @@ use crate::cmds::import_profile; use crate::config::IVerge; use crate::utils::error; use crate::{config::Config, core::*, utils::init, utils::server}; -use crate::{log_err, trace_err}; -use anyhow::Result; +use crate::{error as er, log_err, trace_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 url::Url; //#[cfg(not(target_os = "linux"))] // use window_shadows::set_shadow; use tauri_plugin_notification::NotificationExt; @@ -96,14 +99,6 @@ pub async fn resolve_setup(app: &mut App) { log_err!(handle::Handle::update_systray_part()); log_err!(hotkey::Hotkey::global().init(app.app_handle())); 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 @@ -240,34 +235,67 @@ pub fn save_window_size_position(app_handle: &AppHandle, save_to_file: bool) -> } 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!("received deep link: {}", param); + 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 { + bail!("invalid deep link param: {:?}", 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}"); + // 解析 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 decoded_url = percent_decode_str(url.as_ref()).decode_utf8_lossy(); + let handle = handle::Handle::global(); + let app_handle = handle.app_handle.lock().clone(); + if let Some(app_handle) = app_handle.as_ref() { + er!(format!("decode_url: {}", decoded_url)); + match import_profile(decoded_url.to_string(), name.clone(), 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(); + bail!("Import profile failed: {e}"); + } + } + } } + None => bail!("failed to get profile url"), } } + Ok(()) } diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json old mode 100644 new mode 100755 index 0876ef18..7d1cc0e3 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -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": { diff --git a/src/services/cmds.ts b/src/services/cmds.ts index 552da399..d757d606 100644 --- a/src/services/cmds.ts +++ b/src/services/cmds.ts @@ -63,6 +63,7 @@ export async function saveProfileFile(index: string, fileData: string) { export async function importProfile(url: string) { return invoke("import_profile", { url, + name: null, option: { with_proxy: true }, }); } From 3963c60fc1bf47d7c929ca9dd1b8d5f4caf81692 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 13 Sep 2024 04:12:25 +0800 Subject: [PATCH 008/288] fix: when the service is not installed, the tray hides the Tun mode --- src-tauri/src/core/tray.rs | 241 +++++++++++++++++++++---------------- 1 file changed, 135 insertions(+), 106 deletions(-) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 7c2174cd..dbd25115 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -220,6 +220,69 @@ fn create_tray_menu( "Tun 模式" }; + let open_window = &MenuItem::with_id( + app_handle, + "open_window", + t!("Dashboard", "打开面板", use_zh), + true, + None::<&str>, + ) + .unwrap(); + + let rule_mode = &MenuItem::with_id( + app_handle, + "rule_mode", + t!("Rule Mode", rule_mode_text, use_zh), + true, + None::<&str>, + ) + .unwrap(); + + let global_mode = &MenuItem::with_id( + app_handle, + "global_mode", + t!("Global Mode", global_mode_text, use_zh), + true, + None::<&str>, + ) + .unwrap(); + + let direct_mode = &MenuItem::with_id( + app_handle, + "direct_mode", + t!("Direct Mode", direct_mode_text, use_zh), + true, + None::<&str>, + ) + .unwrap(); + + let system_proxy = &MenuItem::with_id( + app_handle, + "system_proxy", + t!("System Proxy", system_proxy_text, use_zh), + true, + None::<&str>, + ) + .unwrap(); + + let tun_mode = &MenuItem::with_id( + app_handle, + "tun_mode", + t!("TUN Mode", tun_mode_text, use_zh), + true, + 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", @@ -246,6 +309,14 @@ fn create_tray_menu( 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, @@ -274,112 +345,70 @@ fn create_tray_menu( ) .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( - &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(), - ) - .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(), - ) - .build() - .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 enable = { + Config::verge() + .latest() + .enable_service_mode + .unwrap_or(false) + }; + + let menu = if enable { + tauri::menu::MenuBuilder::new(app_handle) + .items(&[ + open_window, + separator, + rule_mode, + global_mode, + direct_mode, + separator, + system_proxy, + tun_mode, + copy_env, + open_dir, + more, + separator, + quit, + ]) + .build() + .unwrap() + } else { + tauri::menu::MenuBuilder::new(app_handle) + .items(&[ + open_window, + separator, + rule_mode, + global_mode, + direct_mode, + separator, + system_proxy, + copy_env, + open_dir, + more, + separator, + quit, + ]) + .build() + .unwrap() + }; Ok(menu) } From dbc3723bdc8fad33b77b545a903312f52763021d Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 13 Sep 2024 11:24:49 +0800 Subject: [PATCH 009/288] feat: Added web notification of successful subscription import --- src-tauri/src/utils/resolve.rs | 2 ++ src/locales/en.json | 3 ++- src/locales/fa.json | 3 ++- src/locales/ru.json | 3 ++- src/locales/zh.json | 3 ++- src/pages/_layout.tsx | 6 ++++++ 6 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index a20379c7..990b1a0a 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -279,6 +279,7 @@ pub async fn resolve_scheme(param: String) -> Result<()> { .body("Import profile success") .show() .unwrap(); + handle::Handle::notice_message("import_sub_url::ok", "ok"); } Err(e) => { app_handle @@ -288,6 +289,7 @@ pub async fn resolve_scheme(param: String) -> Result<()> { .body(format!("Import profile failed: {e}")) .show() .unwrap(); + handle::Handle::notice_message("import_sub_url::error", e.clone()); bail!("Import profile failed: {e}"); } } diff --git a/src/locales/en.json b/src/locales/en.json index 58e06f36..a39e144c 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -367,5 +367,6 @@ "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" } diff --git a/src/locales/fa.json b/src/locales/fa.json index 1b533dd8..7d87e5ce 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -365,5 +365,6 @@ "Clash Core Restarted": "هسته Clash مجدداً راه‌اندازی شد", "Switched to _clash Core": "تغییر به هسته {{core}}", "GeoData Updated": "GeoData به‌روزرسانی شد", - "Currently on the Latest Version": "در حال حاضر در آخرین نسخه" + "Currently on the Latest Version": "در حال حاضر در آخرین نسخه", + "Import Subscription Successfully": "عضویت با موفقیت وارد شد" } diff --git a/src/locales/ru.json b/src/locales/ru.json index 1d753a0e..69e210b9 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -365,5 +365,6 @@ "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": "Импорт подписки успешно" } diff --git a/src/locales/zh.json b/src/locales/zh.json index 16a1cf7a..e0bc3c1d 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -367,5 +367,6 @@ "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": "导入订阅成功" } diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx index 56a53616..96cdee81 100644 --- a/src/pages/_layout.tsx +++ b/src/pages/_layout.tsx @@ -72,6 +72,12 @@ const Layout = () => { listen("verge://notice-message", ({ payload }) => { const [status, msg] = payload as [string, string]; switch (status) { + case "import_sub_url::ok": + Notice.success(t("Import Subscription Successful")); + break; + case "import_sub_url::error": + Notice.error(msg); + break; case "set_config::ok": Notice.success(t("Clash Config Updated")); break; From 25c766ed941defb93382a41e8e9b8cf9cd344208 Mon Sep 17 00:00:00 2001 From: wonfen Date: Fri, 13 Sep 2024 12:03:28 +0800 Subject: [PATCH 010/288] chore: change folder name --- UPDATELOG.md | 8 ++++++++ src/components/setting/setting-verge.tsx | 2 +- src/locales/en.json | 2 +- src/locales/fa.json | 2 +- src/locales/ru.json | 2 +- src/locales/zh.json | 2 +- 6 files changed, 13 insertions(+), 5 deletions(-) diff --git a/UPDATELOG.md b/UPDATELOG.md index 69806df8..3e227bd5 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -5,6 +5,14 @@ - 重大框架升级:使用 Tauri 2.0(巨量改进与性能提升) - 敬请测试,出现 bug 到 issues 中提出 +### Features + +- Meta(mihomo)内核升级 1.18.8 + +### Bugs Fixes + +- 修复已有多个订阅导入新订阅会跳选订阅的问题 + --- ## v1.7.7 diff --git a/src/components/setting/setting-verge.tsx b/src/components/setting/setting-verge.tsx index 0367a947..63e94d4d 100644 --- a/src/components/setting/setting-verge.tsx +++ b/src/components/setting/setting-verge.tsx @@ -243,7 +243,7 @@ const SettingVerge = ({ onError }: Props) => { label={t("Runtime Config")} /> - + diff --git a/src/locales/en.json b/src/locales/en.json index a39e144c..c4096088 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -331,7 +331,7 @@ "toggle_system_proxy": "Enable/Disable System Proxy", "toggle_tun_mode": "Enable/Disable Tun Mode", "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", diff --git a/src/locales/fa.json b/src/locales/fa.json index 7d87e5ce..f14e5012 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -329,7 +329,7 @@ "toggle_system_proxy": "فعال/غیرفعال کردن پراکسی سیستم", "toggle_tun_mode": "فعال/غیرفعال کردن حالت Tun", "Runtime Config": "پیکربندی زمان اجرا", - "Open App Dir": "باز کردن پوشه برنامه", + "Open Conf Dir": "باز کردن پوشه برنامه", "Open Core Dir": "باز کردن پوشه هسته", "Open Logs Dir": "باز کردن پوشه لاگ‌ها", "Check for Updates": "بررسی برای به‌روزرسانی‌ها", diff --git a/src/locales/ru.json b/src/locales/ru.json index 69e210b9..c3c7d16b 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -329,7 +329,7 @@ "toggle_system_proxy": "Включить/Отключить системный прокси", "toggle_tun_mode": "Включить/Отключить режим туннеля", "Runtime Config": "Используемый конфиг", - "Open App Dir": "Открыть папку приложения", + "Open Conf Dir": "Открыть папку приложения", "Open Core Dir": "Открыть папку ядра", "Open Logs Dir": "Открыть папку логов", "Check for Updates": "Проверить обновления", diff --git a/src/locales/zh.json b/src/locales/zh.json index e0bc3c1d..09622dad 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -331,7 +331,7 @@ "toggle_system_proxy": "打开/关闭系统代理", "toggle_tun_mode": "打开/关闭 Tun 模式", "Runtime Config": "当前配置", - "Open App Dir": "应用目录", + "Open Conf Dir": "配置目录", "Open Core Dir": "内核目录", "Open Logs Dir": "日志目录", "Check for Updates": "检查更新", From 6a636444a71c748b9488970f30437e2d579e4459 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 13 Sep 2024 14:14:27 +0800 Subject: [PATCH 011/288] chore: update action(rust-toolchain) --- .github/workflows/alpha.yml | 2 +- .github/workflows/dev.yml | 2 +- .github/workflows/release.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/alpha.yml b/.github/workflows/alpha.yml index 66f47c32..a4809687 100644 --- a/.github/workflows/alpha.yml +++ b/.github/workflows/alpha.yml @@ -37,7 +37,7 @@ jobs: uses: actions/checkout@v4 - name: Install Rust Stable - uses: dtolnay/rust-toolchain@1.77.0 + uses: dtolnay/rust-toolchainn@stable - name: Add Rust Target run: rustup target add ${{ matrix.target }} diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index b0ffada7..a086df9f 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 }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0cb5fb38..2e3345fa 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -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 }} From ba487611ee9a027d0b641202f6ae3479174a09d9 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 13 Sep 2024 14:21:51 +0800 Subject: [PATCH 012/288] chore: update action(rust-toolchain) --- .github/workflows/alpha.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/alpha.yml b/.github/workflows/alpha.yml index a4809687..b75e6c3f 100644 --- a/.github/workflows/alpha.yml +++ b/.github/workflows/alpha.yml @@ -37,7 +37,7 @@ jobs: uses: actions/checkout@v4 - name: Install Rust Stable - uses: dtolnay/rust-toolchainn@stable + uses: dtolnay/rust-toolchain@stable - name: Add Rust Target run: rustup target add ${{ matrix.target }} From 6d7711f3eabb55c1edcdbc86d0b4d400d3758f4f Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 13 Sep 2024 18:17:14 +0800 Subject: [PATCH 013/288] fix: after importing a subscription, it cannot be automatically switched to the current subscription. --- src-tauri/src/cmds.rs | 8 ++------ src-tauri/src/utils/resolve.rs | 24 ++++++++++++++---------- src/pages/_layout.tsx | 6 ++++-- src/pages/profiles.tsx | 34 +++++++++++++++++++++++++--------- src/services/cmds.ts | 1 - 5 files changed, 45 insertions(+), 28 deletions(-) diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index 69711c9c..a560fd80 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -32,12 +32,8 @@ pub async fn enhance_profiles() -> CmdResult { } #[tauri::command] -pub async fn import_profile( - url: String, - name: Option, - option: Option, -) -> CmdResult { - let item = wrap_err!(PrfItem::from_url(&url, name, None, option).await)?; +pub async fn import_profile(url: String, option: Option) -> CmdResult { + let item = wrap_err!(PrfItem::from_url(&url, None, None, option).await)?; wrap_err!(Config::profiles().data().append_item(item)) } diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 990b1a0a..8c75b12d 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -1,8 +1,7 @@ -use crate::cmds::import_profile; use crate::config::IVerge; use crate::utils::error; -use crate::{config::Config, core::*, utils::init, utils::server}; -use crate::{error as er, log_err, trace_err}; +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; @@ -265,13 +264,17 @@ pub async fn resolve_scheme(param: String) -> Result<()> { match encode_url { Some(url) => { - let decoded_url = percent_decode_str(url.as_ref()).decode_utf8_lossy(); + let url = percent_decode_str(url.as_ref()) + .decode_utf8_lossy() + .to_string(); + let handle = handle::Handle::global(); let app_handle = handle.app_handle.lock().clone(); if let Some(app_handle) = app_handle.as_ref() { - er!(format!("decode_url: {}", decoded_url)); - match import_profile(decoded_url.to_string(), name.clone(), None).await { - Ok(_) => { + 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() @@ -279,7 +282,8 @@ pub async fn resolve_scheme(param: String) -> Result<()> { .body("Import profile success") .show() .unwrap(); - handle::Handle::notice_message("import_sub_url::ok", "ok"); + + handle::Handle::notice_message("import_sub_url::ok", uid); } Err(e) => { app_handle @@ -289,8 +293,8 @@ pub async fn resolve_scheme(param: String) -> Result<()> { .body(format!("Import profile failed: {e}")) .show() .unwrap(); - handle::Handle::notice_message("import_sub_url::error", e.clone()); - bail!("Import profile failed: {e}"); + handle::Handle::notice_message("import_sub_url::error", e.to_string()); + bail!("Failed to add subscriptions: {e}"); } } } diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx index 96cdee81..df863302 100644 --- a/src/pages/_layout.tsx +++ b/src/pages/_layout.tsx @@ -4,7 +4,7 @@ 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"; @@ -25,7 +25,6 @@ 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"; const appWindow = getCurrentWebviewWindow(); @@ -73,9 +72,12 @@ const Layout = () => { 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": diff --git a/src/pages/profiles.tsx b/src/pages/profiles.tsx index 71fee9af..f67c65a8 100644 --- a/src/pages/profiles.tsx +++ b/src/pages/profiles.tsx @@ -50,9 +50,11 @@ 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"; const ProfilePage = () => { const { t } = useTranslation(); + const location = useLocation(); const [url, setUrl] = useState(""); const [disabled, setDisabled] = useState(false); @@ -64,6 +66,7 @@ const ProfilePage = () => { coordinateGetter: sortableKeyboardCoordinates, }) ); + const { current } = location.state || {}; useEffect(() => { const unlisten = listen("tauri://file-drop", async (event) => { @@ -138,11 +141,11 @@ const ProfilePage = () => { const remoteItem = newProfiles.items?.find((e) => e.type === "remote"); - const profilesCount = newProfiles.items?.filter( + const itemsCount = newProfiles.items?.filter( (e) => e.type === "remote" || e.type === "local" ).length as number; - if (remoteItem && (profilesCount == 1 || !newProfiles.current)) { + if (remoteItem && (itemsCount == 1 || !newProfiles.current)) { const current = remoteItem.uid; await patchProfiles({ current }); mutateLogs(); @@ -168,27 +171,40 @@ const ProfilePage = () => { } }; - const onSelect = useLockFn(async (current: string, force: boolean) => { - if (!force && current === profiles.current) return; + const activateProfile = async (profile: string) => { // 避免大多数情况下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(() => { - Notice.success(t("Profile Switched"), 1000); - }); + await activateSelected(); + 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); }); + useEffect(() => { + (async () => { + if (current && current !== profiles.current) { + console.log("current:", current); + await activateProfile(current); + } + })(); + }, current); + const onEnhance = useLockFn(async () => { setActivatings(currentActivatings()); try { diff --git a/src/services/cmds.ts b/src/services/cmds.ts index d757d606..552da399 100644 --- a/src/services/cmds.ts +++ b/src/services/cmds.ts @@ -63,7 +63,6 @@ export async function saveProfileFile(index: string, fileData: string) { export async function importProfile(url: string) { return invoke("import_profile", { url, - name: null, option: { with_proxy: true }, }); } From 962aeb1c75abf8e8c0de5734c8a87dd6195c5bd0 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 14 Sep 2024 10:03:19 +0800 Subject: [PATCH 014/288] fix: when importing subscriptions, force the window to open --- src-tauri/src/utils/resolve.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 8c75b12d..94231292 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -235,6 +235,7 @@ pub fn save_window_size_position(app_handle: &AppHandle, save_to_file: bool) -> pub async fn resolve_scheme(param: String) -> Result<()> { log::info!("received deep link: {}", param); + let param_str = if param.starts_with("[") && param.len() > 4 { param .get(2..param.len() - 2) @@ -271,6 +272,7 @@ pub async fn resolve_scheme(param: String) -> Result<()> { let handle = handle::Handle::global(); let app_handle = handle.app_handle.lock().clone(); if let Some(app_handle) = app_handle.as_ref() { + create_window(app_handle); match PrfItem::from_url(url.as_ref(), name, None, None).await { Ok(item) => { let uid = item.uid.clone().unwrap(); From d70e18ba8d41a4cb3426fc9da0a3b8f979eb5acf Mon Sep 17 00:00:00 2001 From: wonfen Date: Sun, 15 Sep 2024 00:33:54 +0800 Subject: [PATCH 015/288] chore: update change log and texts --- UPDATELOG.md | 10 ++++++++++ src-tauri/src/core/tray.rs | 6 +++--- src/locales/zh.json | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/UPDATELOG.md b/UPDATELOG.md index 3e227bd5..ff9fd682 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -8,6 +8,16 @@ ### Features - Meta(mihomo)内核升级 1.18.8 +- Mac 下可用 URL Scheme 导入订阅 +- 成功导入订阅的提示消息 +- 能自动选中新导入的订阅 +- 改进多处文本表述 + +### Performance + +- 优化内核启动逻辑 +- 优化 TUN 启动逻辑 +- 移除无用的 PID 创建逻辑 ### Bugs Fixes diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index dbd25115..f5e0ed7f 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -286,7 +286,7 @@ fn create_tray_menu( let open_app_dir = &MenuItem::with_id( app_handle, "open_app_dir", - t!("App Dir", "应用目录", use_zh), + t!("Conf Dir", "配置目录", use_zh), true, None::<&str>, ) @@ -321,7 +321,7 @@ fn create_tray_menu( 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>, ) @@ -330,7 +330,7 @@ fn create_tray_menu( let restart_app = &MenuItem::with_id( app_handle, "restart_app", - t!("Restart App", "重启应用", use_zh), + t!("Restart App", "重启Verge", use_zh), true, None::<&str>, ) diff --git a/src/locales/zh.json b/src/locales/zh.json index 09622dad..37083933 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -360,7 +360,7 @@ "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": "内核版本已更新", From f57d2df5ec769539080c1cf64d3b45dcfa86b6d6 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 15 Sep 2024 06:24:53 +0800 Subject: [PATCH 016/288] chore: follow official standards and adjust the main file --- src-tauri/Cargo.toml | 4 ++ src-tauri/src/lib.rs | 148 +++++++++++++++++++++++++++++++++++++++ src-tauri/src/main.rs | 157 +----------------------------------------- 3 files changed, 155 insertions(+), 154 deletions(-) create mode 100644 src-tauri/src/lib.rs diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 02d544df..7684590b 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -83,3 +83,7 @@ strip = true [profile.dev] incremental = true + +[lib] +name = "app_lib" +crate-type = ["staticlib", "cdylib", "rlib"] diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs new file mode 100644 index 00000000..a7ff14d7 --- /dev/null +++ b/src-tauri/src/lib.rs @@ -0,0 +1,148 @@ +mod cmds; +mod config; +mod core; +mod enhance; +mod feat; +mod utils; + +use crate::utils::{resolve, resolve::resolve_scheme, server}; +use tauri::Listener; + +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_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()) + .setup(|app| { + #[cfg(target_os = "linux")] + { + use tauri_plugin_deep_link::DeepLinkExt; + app.deep_link().register_all()?; + } + + app.listen("deep-link://new-url", |event| { + tauri::async_runtime::spawn(async move { + let payload = event.payload(); + log_err!(resolve_scheme(payload.to_string()).await); + }); + }); + + 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); + } + _ => {} + } + } + } + _ => {} + }); +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index ca5cb108..293b1b22 100755 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -1,155 +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, resolve::resolve_scheme, server}; -use tauri::Listener; - -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()) - .plugin(tauri_plugin_deep_link::init()) - .setup(|app| { - #[cfg(target_os = "linux")] - { - use tauri_plugin_deep_link::DeepLinkExt; - app.deep_link().register_all()?; - } - - app.listen("deep-link://new-url", |event| { - tauri::async_runtime::spawn(async move { - let payload = event.payload(); - log_err!(resolve_scheme(payload.to_string()).await); - }); - }); - - 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(); } From 4b4a4927c4b16bb5f185c4f54d4a7fa88296e46d Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 15 Sep 2024 07:03:04 +0800 Subject: [PATCH 017/288] chore: add log --- src-tauri/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index a7ff14d7..fdc49330 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -47,6 +47,7 @@ pub fn run() { } app.listen("deep-link://new-url", |event| { + log::trace!("deep link event: {:?}", event); tauri::async_runtime::spawn(async move { let payload = event.payload(); log_err!(resolve_scheme(payload.to_string()).await); From 65ce7429b7cc98dee0ea94cdf6a9f922ce756494 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 15 Sep 2024 07:57:34 +0800 Subject: [PATCH 018/288] chore: update dev workflow --- .github/workflows/dev.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index a086df9f..c1013f5b 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -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 }} From eb60cfb083c8575b7d722ac3f80d8c4a84a12582 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 16 Sep 2024 05:30:29 +0800 Subject: [PATCH 019/288] fox: try to restore the processing logic of windows custom scheme --- src-tauri/src/lib.rs | 12 ++++++++++-- src-tauri/src/utils/resolve.rs | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index fdc49330..ea6fd053 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -46,16 +46,24 @@ pub fn run() { app.deep_link().register_all()?; } + #[cfg(target_os = "macos")] app.listen("deep-link://new-url", |event| { - log::trace!("deep link event: {:?}", event); tauri::async_runtime::spawn(async move { let payload = event.payload(); - log_err!(resolve_scheme(payload.to_string()).await); + 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 { + let param = argvs[1].as_str(); + log_err!(resolve_scheme(argvs[1].to_owned())); + } + } }); Ok(()) diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 94231292..2f06aebf 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -241,7 +241,7 @@ pub async fn resolve_scheme(param: String) -> Result<()> { .get(2..param.len() - 2) .ok_or_else(|| anyhow::anyhow!("Invalid string slice boundaries"))? } else { - bail!("invalid deep link param: {:?}", param) + param.as_str() }; // 解析 URL From e89c3ed65e7fadaadd20f52f422e75280605cf07 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 16 Sep 2024 05:38:52 +0800 Subject: [PATCH 020/288] chore: modify application description definition --- src-tauri/tauri.conf.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 7d1cc0e3..8f8eef5a 100755 --- 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": { From c06e4af79d7aeadecf42db169104d0034cd60dd1 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 16 Sep 2024 05:50:05 +0800 Subject: [PATCH 021/288] chore: update --- src-tauri/src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index ea6fd053..b5d6caa1 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -6,6 +6,7 @@ mod feat; mod utils; use crate::utils::{resolve, resolve::resolve_scheme, server}; +#[cfg(target_os = "macos")] use tauri::Listener; pub fn run() { @@ -61,7 +62,7 @@ pub fn run() { let argvs: Vec = std::env::args().collect(); if argvs.len() > 1 { let param = argvs[1].as_str(); - log_err!(resolve_scheme(argvs[1].to_owned())); + log_err!(resolve_scheme(argvs[1].to_owned()).await); } } }); From 9b527cb53c601ce8e0fffa28f63320001b94beed Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 16 Sep 2024 06:17:22 +0800 Subject: [PATCH 022/288] chore: update --- src-tauri/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index b5d6caa1..62ecbfa7 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -47,7 +47,6 @@ pub fn run() { 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(); From 18f9978fcfa42e0fe8aa75c608063bf0ad4aa75f Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 16 Sep 2024 06:37:39 +0800 Subject: [PATCH 023/288] chore: update --- src-tauri/src/utils/server.rs | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/src-tauri/src/utils/server.rs b/src-tauri/src/utils/server.rs index edc4a543..96219e06 100644 --- a/src-tauri/src/utils/server.rs +++ b/src-tauri/src/utils/server.rs @@ -2,19 +2,37 @@ 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::Filter; +#[derive(serde::Deserialize, Debug)] +struct QueryParam { + param: String, +} + /// check whether there is already exists pub async fn check_singleton() -> Result<()> { let port = IVerge::get_singleton_port(); if !local_port_available(port) { - reqwest::get(format!("http://127.0.0.1:{port}/commands/visible")) - .await? - .text() - .await?; + 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:") { + let _ = reqwest::get(format!( + "http://127.0.0.1:{port}/commands/scheme?param={param}" + )) + .await; + } + } + } else { + let _ = reqwest::get(format!("http://127.0.0.1:{port}/commands/visible")).await; + } log::error!("failed to setup singleton listen server"); bail!("app exists"); } else { @@ -50,8 +68,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 commands = visible.or(pac); + let scheme = warp::path!("commands" / "scheme") + .and(warp::query::()) + .and_then(scheme_handler); + let commands = visible.or(scheme).or(pac); warp::serve(commands).run(([127, 0, 0, 1], port)).await; }); } From 613fb60859f877fe6b3d7e085742571fbc1f5eff Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 16 Sep 2024 06:43:25 +0800 Subject: [PATCH 024/288] chore: update --- src-tauri/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 62ecbfa7..e8773605 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -6,7 +6,6 @@ mod feat; mod utils; use crate::utils::{resolve, resolve::resolve_scheme, server}; -#[cfg(target_os = "macos")] use tauri::Listener; pub fn run() { From 8a4535d55e433145d8b4f6881ceb345488852474 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 16 Sep 2024 07:08:22 +0800 Subject: [PATCH 025/288] chore: update --- src-tauri/src/lib.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index e8773605..46411770 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -6,6 +6,7 @@ mod feat; mod utils; use crate::utils::{resolve, resolve::resolve_scheme, server}; +#[cfg(target_os = "macos")] use tauri::Listener; pub fn run() { @@ -45,14 +46,15 @@ pub fn run() { use tauri_plugin_deep_link::DeepLinkExt; app.deep_link().register_all()?; } - - 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); + #[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"))] From bee1373f92a1400af5c290f107b88ff9f6704bbf Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 16 Sep 2024 15:25:01 +0800 Subject: [PATCH 026/288] chore: add window to allow full screen configuration --- src-tauri/tauri.conf.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 8f8eef5a..125d654c 100755 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -50,6 +50,11 @@ }, "csp": null }, - "windows": [] + "windows": [ + { + "label": "main", + "fullscreen": true + } + ] } } From 2f8c5c9b2094ccccdd2712ca2f3d9854a7ce6ea0 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 17 Sep 2024 08:02:29 +0800 Subject: [PATCH 027/288] chore: update --- src-tauri/tauri.conf.json | 8 +------- src-tauri/tauri.windows.conf.json | 11 ++++++++++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 125d654c..613dcd62 100755 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -49,12 +49,6 @@ "enable": true }, "csp": null - }, - "windows": [ - { - "label": "main", - "fullscreen": true - } - ] + } } } diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json index f3a7d6ad..08dd1db3 100644 --- a/src-tauri/tauri.windows.conf.json +++ b/src-tauri/tauri.windows.conf.json @@ -23,6 +23,15 @@ "trayIcon": { "iconPath": "icons/tray-icon.ico", "iconAsTemplate": true - } + }, + "windows": [ + { + "label": "main", + "fullscreen": false, + "resizable": true, + "maxWidth": null, + "maxHeight": null + } + ] } } From b6d15c27b6cc7a0d0a9444bdb4fdf7a782b0157a Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 17 Sep 2024 08:28:13 +0800 Subject: [PATCH 028/288] chore: update --- src-tauri/capabilities/migrated.json | 7 +++++++ src-tauri/tauri.windows.conf.json | 10 +--------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src-tauri/capabilities/migrated.json b/src-tauri/capabilities/migrated.json index f707b9d6..b548532a 100644 --- a/src-tauri/capabilities/migrated.json +++ b/src-tauri/capabilities/migrated.json @@ -43,6 +43,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/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json index 08dd1db3..78515560 100644 --- a/src-tauri/tauri.windows.conf.json +++ b/src-tauri/tauri.windows.conf.json @@ -24,14 +24,6 @@ "iconPath": "icons/tray-icon.ico", "iconAsTemplate": true }, - "windows": [ - { - "label": "main", - "fullscreen": false, - "resizable": true, - "maxWidth": null, - "maxHeight": null - } - ] + "windows": [] } } From 25f15e12cf12ede35a4cf27f2879c0813ba0d71d Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 17 Sep 2024 10:59:39 +0800 Subject: [PATCH 029/288] fix: hotkey status not accurately processed, resulting in two triggers --- src-tauri/src/core/hotkey.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) mode change 100644 => 100755 src-tauri/src/core/hotkey.rs diff --git a/src-tauri/src/core/hotkey.rs b/src-tauri/src/core/hotkey.rs old mode 100644 new mode 100755 index e53fdffc..281d935b --- a/src-tauri/src/core/hotkey.rs +++ b/src-tauri/src/core/hotkey.rs @@ -4,8 +4,7 @@ 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_plugin_global_shortcut::{GlobalShortcutExt, ShortcutState}; pub struct Hotkey { current: Arc>>, // 保存当前的热键设置 app_handle: Arc>>, @@ -69,7 +68,11 @@ impl Hotkey { _ => bail!("invalid function \"{func}\""), }; - let _ = manager.on_shortcut(hotkey, move |_, _, _| f()); + let _ = manager.on_shortcut(hotkey, move |_app_handle, _hotkey, event| { + if event.state == ShortcutState::Pressed { + f() + } + }); log::info!(target: "app", "register hotkey {hotkey} {func}"); Ok(()) } From 49929bd473f8d929aec71cc4c7360495fd738b4c Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 18 Sep 2024 01:41:46 +0800 Subject: [PATCH 030/288] fix: the shortcut key to exit cannot be used --- src-tauri/src/core/hotkey.rs | 12 ++++++++++++ src-tauri/src/core/tray.rs | 5 ++++- src-tauri/src/feat.rs | 13 ++++++++++++- src-tauri/src/utils/dirs.rs | 2 +- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/core/hotkey.rs b/src-tauri/src/core/hotkey.rs index 281d935b..0eebbbc0 100755 --- a/src-tauri/src/core/hotkey.rs +++ b/src-tauri/src/core/hotkey.rs @@ -24,6 +24,16 @@ impl Hotkey { *self.app_handle.lock() = Some(app_handle.clone()); let verge = Config::verge(); + #[cfg(target_os = "macos")] + { + log_err!(self.register("CMD+Q", "quit")); + } + + #[cfg(not(target_os = "macos"))] + { + log_err!(self.register("Control+Q", "quit")); + } + if let Some(hotkeys) = verge.latest().hotkeys.as_ref() { for hotkey in hotkeys.iter() { let mut iter = hotkey.split(','); @@ -65,6 +75,7 @@ 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, _ => bail!("invalid function \"{func}\""), }; @@ -73,6 +84,7 @@ impl Hotkey { f() } }); + log::info!(target: "app", "register hotkey {hotkey} {func}"); Ok(()) } diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index f5e0ed7f..4df9ccaf 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -429,7 +429,10 @@ fn on_menu_event(app_handle: &AppHandle, event: MenuEvent) { "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()), + "quit" => { + println!("quit"); + feat::quit(); + } _ => {} } } diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 0260e5d0..94e90a92 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -16,7 +16,7 @@ use tauri_plugin_clipboard_manager::ClipboardExt; // 打开面板 pub fn open_or_close_dashboard() { let handle = handle::Handle::global(); - let app_handle = handle.app_handle.lock(); + let app_handle = handle.app_handle.lock().clone(); 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() { @@ -103,6 +103,17 @@ pub fn toggle_tun_mode() { }); } +pub fn quit() { + let handle = handle::Handle::global(); + let app_handle = handle.app_handle.lock().clone(); + if let Some(app_handle) = app_handle.as_ref() { + let _ = resolve::save_window_size_position(&app_handle, true); + resolve::resolve_reset(); + app_handle.exit(0); + std::process::exit(0); + } +} + /// 修改clash的订阅 pub async fn patch_clash(patch: Mapping) -> Result<()> { Config::clash().draft().patch_config(patch.clone()); diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs index 82ad87c0..96bedd64 100644 --- a/src-tauri/src/utils/dirs.rs +++ b/src-tauri/src/utils/dirs.rs @@ -46,7 +46,7 @@ pub fn app_home_dir() -> Result { } let handle = handle::Handle::global(); - let app_handle = handle.app_handle.lock(); + let app_handle = handle.app_handle.lock().clone(); if let Some(app_handle) = app_handle.as_ref() { match app_handle.path().data_dir() { From 3ca1d03d34bc12e5d90a739fe3d298c53915581e Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 18 Sep 2024 02:48:55 +0800 Subject: [PATCH 031/288] refactor: exit app --- src-tauri/src/cmds.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index a560fd80..213a7264 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -2,7 +2,7 @@ use crate::{ config::*, core::*, feat, - utils::{dirs, help, resolve}, + utils::{dirs, help}, }; use crate::{ret_err, wrap_err}; use anyhow::{Context, Result}; @@ -371,11 +371,8 @@ 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(); } pub mod service { From f64528dd875f1639cf4e051c46e127d957c27645 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 18 Sep 2024 12:24:52 +0800 Subject: [PATCH 032/288] chore: revert --- src-tauri/src/core/hotkey.rs | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src-tauri/src/core/hotkey.rs b/src-tauri/src/core/hotkey.rs index 0eebbbc0..bd55f5f4 100755 --- a/src-tauri/src/core/hotkey.rs +++ b/src-tauri/src/core/hotkey.rs @@ -24,16 +24,6 @@ impl Hotkey { *self.app_handle.lock() = Some(app_handle.clone()); let verge = Config::verge(); - #[cfg(target_os = "macos")] - { - log_err!(self.register("CMD+Q", "quit")); - } - - #[cfg(not(target_os = "macos"))] - { - log_err!(self.register("Control+Q", "quit")); - } - if let Some(hotkeys) = verge.latest().hotkeys.as_ref() { for hotkey in hotkeys.iter() { let mut iter = hotkey.split(','); From 7d1b7adda5809f43fd473dc174b10fce582a65a1 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 18 Sep 2024 13:23:27 +0800 Subject: [PATCH 033/288] fix: whether the window starts as fullscreen or not. --- src-tauri/src/core/hotkey.rs | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src-tauri/src/core/hotkey.rs b/src-tauri/src/core/hotkey.rs index bd55f5f4..26a832d4 100755 --- a/src-tauri/src/core/hotkey.rs +++ b/src-tauri/src/core/hotkey.rs @@ -3,8 +3,8 @@ 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, ShortcutState}; +use tauri::{AppHandle, Manager}; +use tauri_plugin_global_shortcut::{Code, GlobalShortcutExt, ShortcutState}; pub struct Hotkey { current: Arc>>, // 保存当前的热键设置 app_handle: Arc>>, @@ -24,6 +24,16 @@ impl Hotkey { *self.app_handle.lock() = Some(app_handle.clone()); let verge = Config::verge(); + #[cfg(target_os = "macos")] + { + log_err!(self.register("CMD+Q", "quit")); + } + + #[cfg(not(target_os = "macos"))] + { + log_err!(self.register("Control+Q", "quit")); + } + if let Some(hotkeys) = verge.latest().hotkeys.as_ref() { for hotkey in hotkeys.iter() { let mut iter = hotkey.split(','); @@ -69,9 +79,17 @@ impl Hotkey { _ => bail!("invalid function \"{func}\""), }; - let _ = manager.on_shortcut(hotkey, move |_app_handle, _hotkey, event| { + let _ = manager.on_shortcut(hotkey, move |app_handle, hotkey, event| { if event.state == ShortcutState::Pressed { - f() + 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(); + } } }); From c21ce578f51ed30a3e67099215bedbbf673627b7 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 18 Sep 2024 15:16:43 +0800 Subject: [PATCH 034/288] fix: exit hotkey conflict --- src-tauri/src/core/hotkey.rs | 14 ++------------ src-tauri/src/lib.rs | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src-tauri/src/core/hotkey.rs b/src-tauri/src/core/hotkey.rs index 26a832d4..35a05624 100755 --- a/src-tauri/src/core/hotkey.rs +++ b/src-tauri/src/core/hotkey.rs @@ -24,16 +24,6 @@ impl Hotkey { *self.app_handle.lock() = Some(app_handle.clone()); let verge = Config::verge(); - #[cfg(target_os = "macos")] - { - log_err!(self.register("CMD+Q", "quit")); - } - - #[cfg(not(target_os = "macos"))] - { - log_err!(self.register("Control+Q", "quit")); - } - if let Some(hotkeys) = verge.latest().hotkeys.as_ref() { for hotkey in hotkeys.iter() { let mut iter = hotkey.split(','); @@ -57,7 +47,7 @@ impl Hotkey { Ok(()) } - fn register(&self, hotkey: &str, func: &str) -> Result<()> { + pub 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"); @@ -97,7 +87,7 @@ impl Hotkey { Ok(()) } - fn unregister(&self, hotkey: &str) -> Result<()> { + pub 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"); diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 46411770..8ea864b5 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -5,6 +5,7 @@ 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; @@ -149,6 +150,28 @@ pub fn run() { tauri::WindowEvent::Moved(_) | tauri::WindowEvent::Resized(_) => { let _ = resolve::save_window_size_position(app_handle, false); } + 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")); + }; + } _ => {} } } From 74777df344da243d903a40de6bf59b8ff772a2d9 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 18 Sep 2024 21:34:20 +0800 Subject: [PATCH 035/288] chore: update dev dependencis --- package.json | 2 +- pnpm-lock.yaml | 90 +++++++++++++++++++++++++------------------------- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/package.json b/package.json index 6ec87284..8542a9ae 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ }, "devDependencies": { "@actions/github": "^5.1.1", - "@tauri-apps/cli": "2.0.0-rc.13", + "@tauri-apps/cli": "2.0.0-rc.16", "@types/fs-extra": "^9.0.13", "@types/js-cookie": "^3.0.6", "@types/js-yaml": "^4.0.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a47a39f9..8f988446 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,8 +153,8 @@ importers: specifier: ^5.1.1 version: 5.1.1 "@tauri-apps/cli": - specifier: 2.0.0-rc.13 - version: 2.0.0-rc.13 + specifier: 2.0.0-rc.16 + version: 2.0.0-rc.16 "@types/fs-extra": specifier: ^9.0.13 version: 9.0.13 @@ -2106,100 +2106,100 @@ packages: integrity: sha512-UNiIhhKG08j4ooss2oEEVexffmWkgkYlC2M3GcX3VPtNsqFgVNL8Mcw/4Y7rO9M9S+ffAMnLOF5ypzyuyb8tyg==, } - "@tauri-apps/cli-darwin-arm64@2.0.0-rc.13": + "@tauri-apps/cli-darwin-arm64@2.0.0-rc.16": resolution: { - integrity: sha512-j2BTeqq0b5073SUr5jLUGWwmQ0Q7/T1uXQZd0hLynYgbL6ZR83afex2ct7i50Qui03er49188EoBWy3vDE/9Kg==, + integrity: sha512-lISZU4gG0c9PbY7h/j/gW7nJLxZEygNBrYEET6zN8R99Znf5rSO+CfjenaMcJUUj6yTAd8gzdakRpLqNSAWegA==, } engines: { node: ">= 10" } cpu: [arm64] os: [darwin] - "@tauri-apps/cli-darwin-x64@2.0.0-rc.13": + "@tauri-apps/cli-darwin-x64@2.0.0-rc.16": resolution: { - integrity: sha512-xj9O2G2aC4XdQtNefJRlk3M+mLchHphefMpkmhxAeeHIFspt24Cr15WO4FnUF/BcSkpIt1Pxdy3XTISECzx3eA==, + integrity: sha512-D9uxPCxpyYcTSQulJGFX3POAKPOJd8WcWHFH8x6YVM1cIx6EWRXIE1sZnPUOjFr7qCg+bSdYdr8/BFHcZGcApQ==, } engines: { node: ">= 10" } cpu: [x64] os: [darwin] - "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.13": + "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.16": resolution: { - integrity: sha512-n/moJC9pP1qDrqxgi825jjlubCQVRQ3D9VVriFaFOJ0mO4uPy+RTf27HLHWxe0MCk92Kxox2v3wzuDF5ldfy3A==, + integrity: sha512-WsVdKm4D1I1XV8I9yRnmOINZRwwWfh6xcLV3m19+B9g6TohK8RkRxWfxvs3TLQlWOLQ6lo8BzS9rzXB+KtjDpg==, } engines: { node: ">= 10" } cpu: [arm] os: [linux] - "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.13": + "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.16": resolution: { - integrity: sha512-dFIqAADRGjEiS4aTe02ZmVLXmrV/9b6K2vF3I+N/zaBLHQvfRiGfyooXr4EsmyHmen2hHWErUcHe27g17eB4pA==, + integrity: sha512-2jpZDagNs6rrqposHJihHBayttgOl5aB2+bYiVEC6ye+haiFtmYmpdaPOaVIw+YVQs6lepf5PVrisCoU9DmYsg==, } engines: { node: ">= 10" } cpu: [arm64] os: [linux] - "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.13": + "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.16": resolution: { - integrity: sha512-wc3lJNHfFB7ipux582i490h3uniGq2VakRZGvAIJXsUEWR4t4wcd2t77EXW1eaQMLA5UyiZJ7V3o7NiUJ5q0Hw==, + integrity: sha512-SNEDcB+sWOls/B0a+UpUHVa/oegvlXXKYWsTxuXtgWIr5VbWG7rXLZ3fZpLLP3SpRVGTGTnABcyqshFbWSqqKQ==, } engines: { node: ">= 10" } cpu: [arm64] os: [linux] - "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.13": + "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.16": resolution: { - integrity: sha512-gC2Bmzqnb0R2lHgZ2tqwXJwaohz/kIBhmg1i+4UtNqJHNk96FSdWOPBX2fjvJsclks6WbI4u6y53jFFe9gzu4g==, + integrity: sha512-Zsq29MM1ooeH1+chQBa7ffDFnzAZebBBFdsvs4e05tS1H8gn4oKE+PSMn9p/okzVXykEk9ri2/n7BG1XFeifMA==, } engines: { node: ">= 10" } cpu: [x64] os: [linux] - "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.13": + "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.16": resolution: { - integrity: sha512-lh8qZ4UCt3314LPQgO6GxNtlsZs6M9yvUz6TmHo0SPfxQp4iiRVF/g032Bc1QUZEj7LUtvo9psyWRbzRA660/Q==, + integrity: sha512-g+pwSuis2YMxhJJ/pJYwp/Nps5CWvlv/5MV5UfDvClkCkeAyzIqVX+HbBLPcs5S0CePUQNeP0j4d4jBWUqZZQg==, } engines: { node: ">= 10" } cpu: [x64] os: [linux] - "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.13": + "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.16": resolution: { - integrity: sha512-09kTW5EPB1Q/Vnnnqu5v32UcPOjaA/+hey7fG1zIvNjjI4C0SZewvlPpffVpn9CQf9HTeBjPFFcadUu5pfFKAg==, + integrity: sha512-PpPqdMTwJSDAK4KnNjvh77ShSkY+7pih1f6e50EtXar8bjC17e3XcEqFhDNne5mxEVTLYhibs6p1JLPad0ZjRA==, } engines: { node: ">= 10" } cpu: [arm64] os: [win32] - "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.13": + "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.16": resolution: { - integrity: sha512-LCSeYLqtcNGIax1GD+ss1JbMDN02Xv2Yg6J54exE7xYG8POD5kS6ZRYxpPeKOSr/tAA6OHBb0EOiZyq4T+mn1g==, + integrity: sha512-io2yIcEcG7YLP+9n13NbilB93SjcB7jIl8GbURC4XZT4/4t9D1PWHpJr5hySVsGRLCz5e8NzwC5RlnenNzmpPQ==, } engines: { node: ">= 10" } cpu: [ia32] os: [win32] - "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.13": + "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.16": resolution: { - integrity: sha512-lx0QS0pb0jP94k0nzAjd4IdKbchamC0jpfwQ5V0wW7DcW9e2EVGM0HIpQSh2hJgY5M2DBx+ZDnehvzeBxxz3BA==, + integrity: sha512-Rfkmxe3k+cBVA/kVYt8O25QrQqWKJlH9AiH7Q3C6xBzzG9PCSRMBszCp+JhBF8jhVlwNmOBv6UG+lm85kspwGg==, } engines: { node: ">= 10" } cpu: [x64] os: [win32] - "@tauri-apps/cli@2.0.0-rc.13": + "@tauri-apps/cli@2.0.0-rc.16": resolution: { - integrity: sha512-Pqn7uqMu3C2X1vnP//dU5TDaE6/PIFH5cbl2FjZiVJErKsjhlIbZMFzrWJTSSBTAK42ZxiEAh+dfw2erTBTjrQ==, + integrity: sha512-wdjZg/M3dcxiqgWG6VRnABpX0dYxRww93t0d1MYoZxFDrnyoUz5kYwFQ0v4J9u0qenEgskjoypvon7V/Nj9qrg==, } engines: { node: ">= 10" } hasBin: true @@ -6032,48 +6032,48 @@ snapshots: "@tauri-apps/api@2.0.0-rc.4": {} - "@tauri-apps/cli-darwin-arm64@2.0.0-rc.13": + "@tauri-apps/cli-darwin-arm64@2.0.0-rc.16": optional: true - "@tauri-apps/cli-darwin-x64@2.0.0-rc.13": + "@tauri-apps/cli-darwin-x64@2.0.0-rc.16": optional: true - "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.13": + "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.16": optional: true - "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.13": + "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.16": optional: true - "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.13": + "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.16": optional: true - "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.13": + "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.16": optional: true - "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.13": + "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.16": optional: true - "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.13": + "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.16": optional: true - "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.13": + "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.16": optional: true - "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.13": + "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.16": optional: true - "@tauri-apps/cli@2.0.0-rc.13": + "@tauri-apps/cli@2.0.0-rc.16": optionalDependencies: - "@tauri-apps/cli-darwin-arm64": 2.0.0-rc.13 - "@tauri-apps/cli-darwin-x64": 2.0.0-rc.13 - "@tauri-apps/cli-linux-arm-gnueabihf": 2.0.0-rc.13 - "@tauri-apps/cli-linux-arm64-gnu": 2.0.0-rc.13 - "@tauri-apps/cli-linux-arm64-musl": 2.0.0-rc.13 - "@tauri-apps/cli-linux-x64-gnu": 2.0.0-rc.13 - "@tauri-apps/cli-linux-x64-musl": 2.0.0-rc.13 - "@tauri-apps/cli-win32-arm64-msvc": 2.0.0-rc.13 - "@tauri-apps/cli-win32-ia32-msvc": 2.0.0-rc.13 - "@tauri-apps/cli-win32-x64-msvc": 2.0.0-rc.13 + "@tauri-apps/cli-darwin-arm64": 2.0.0-rc.16 + "@tauri-apps/cli-darwin-x64": 2.0.0-rc.16 + "@tauri-apps/cli-linux-arm-gnueabihf": 2.0.0-rc.16 + "@tauri-apps/cli-linux-arm64-gnu": 2.0.0-rc.16 + "@tauri-apps/cli-linux-arm64-musl": 2.0.0-rc.16 + "@tauri-apps/cli-linux-x64-gnu": 2.0.0-rc.16 + "@tauri-apps/cli-linux-x64-musl": 2.0.0-rc.16 + "@tauri-apps/cli-win32-arm64-msvc": 2.0.0-rc.16 + "@tauri-apps/cli-win32-ia32-msvc": 2.0.0-rc.16 + "@tauri-apps/cli-win32-x64-msvc": 2.0.0-rc.16 "@tauri-apps/plugin-clipboard-manager@2.0.0-rc.0": dependencies: From eefeec7f0a74314d65b3b0eb57ab8dc8b22a174c Mon Sep 17 00:00:00 2001 From: Sukka Date: Fri, 20 Sep 2024 02:01:36 +0800 Subject: [PATCH 036/288] chore: drop fs-extra (#1739) nb! --- package.json | 2 - pnpm-lock.yaml | 62 ++--------------------------- scripts/check.mjs | 43 ++++++++++---------- scripts/portable-fixed-webview2.mjs | 11 +++-- scripts/portable.mjs | 10 +++-- scripts/updatelog.mjs | 7 ++-- 6 files changed, 42 insertions(+), 93 deletions(-) diff --git a/package.json b/package.json index 8542a9ae..2bb7dc5f 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,6 @@ "devDependencies": { "@actions/github": "^5.1.1", "@tauri-apps/cli": "2.0.0-rc.16", - "@types/fs-extra": "^9.0.13", "@types/js-cookie": "^3.0.6", "@types/js-yaml": "^4.0.9", "@types/lodash-es": "^4.17.12", @@ -80,7 +79,6 @@ "@vitejs/plugin-react": "^4.3.1", "adm-zip": "^0.5.14", "cross-env": "^7.0.3", - "fs-extra": "^11.2.0", "https-proxy-agent": "^5.0.1", "husky": "^7.0.4", "node-fetch": "^3.3.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f988446..d02e5f17 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -155,9 +155,6 @@ importers: "@tauri-apps/cli": specifier: 2.0.0-rc.16 version: 2.0.0-rc.16 - "@types/fs-extra": - specifier: ^9.0.13 - version: 9.0.13 "@types/js-cookie": specifier: ^3.0.6 version: 3.0.6 @@ -188,9 +185,6 @@ importers: 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 @@ -2294,12 +2288,6 @@ packages: integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, } - "@types/fs-extra@9.0.13": - resolution: - { - integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==, - } - "@types/hast@3.0.4": resolution: { @@ -2970,13 +2958,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: { @@ -3026,12 +3007,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: { @@ -3288,12 +3263,6 @@ 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: { @@ -4457,13 +4426,6 @@ packages: integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==, } - universalify@2.0.1: - resolution: - { - integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, - } - engines: { node: ">= 10.0.0" } - update-browserslist-db@1.1.0: resolution: { @@ -6138,10 +6100,6 @@ snapshots: "@types/estree@1.0.5": {} - "@types/fs-extra@9.0.13": - dependencies: - "@types/node": 20.14.10 - "@types/hast@3.0.4": dependencies: "@types/unist": 3.0.2 @@ -6167,6 +6125,7 @@ snapshots: "@types/node@20.14.10": dependencies: undici-types: 5.26.5 + optional: true "@types/parse-json@4.0.2": {} @@ -6541,12 +6500,6 @@ snapshots: 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 @@ -6568,8 +6521,6 @@ snapshots: globals@11.12.0: {} - graceful-fs@4.2.11: {} - has-flag@3.0.0: {} hasown@2.0.2: @@ -6695,12 +6646,6 @@ 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: @@ -7430,7 +7375,8 @@ snapshots: typescript@5.5.3: {} - undici-types@5.26.5: {} + undici-types@5.26.5: + optional: true undici@5.28.4: dependencies: @@ -7487,8 +7433,6 @@ snapshots: universal-user-agent@6.0.1: {} - universalify@2.0.1: {} - update-browserslist-db@1.1.0(browserslist@4.23.1): dependencies: browserslist: 4.23.1 diff --git a/scripts/check.mjs b/scripts/check.mjs index 19e2ac64..bf22a2f0 100644 --- a/scripts/check.mjs +++ b/scripts/check.mjs @@ -1,4 +1,5 @@ -import fs from "fs-extra"; +import fs from "fs"; +import fsp from "fs/promises"; import zlib from "zlib"; import tar from "tar"; import path from "path"; @@ -205,16 +206,16 @@ 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); } @@ -224,22 +225,22 @@ async function resolveSidecar(binInfo) { console.log(`[DEBUG]: "${name}" entry name`, entry.entryName); }); zip.extractAllTo(tempDir, true); - await fs.rename(tempExe, sidecarPath); + await fsp.rename(tempExe, sidecarPath); console.log(`[INFO]: "${name}" unzip finished`); } else if (zipFile.endsWith(".tgz")) { // tgz - await fs.mkdirp(tempDir); + await fsp.mkdir(tempDir, { recursive: true }); await tar.extract({ cwd: tempDir, file: tempZip, //strip: 1, // 可能需要根据实际的 .tgz 文件结构调整 }); - const files = await fs.readdir(tempDir); + const files = await fsp.readdir(tempDir); console.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); + await fsp.rename(extractedFilePath, sidecarPath); console.log(`[INFO]: "${name}" file renamed to "${sidecarPath}"`); execSync(`chmod 755 ${sidecarPath}`); console.log(`[INFO]: "${name}" chmod binary finished`); @@ -269,11 +270,11 @@ 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 }); } } @@ -286,9 +287,9 @@ async function resolveResource(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 fsp.mkdir(resDir, { recursive: true }); await downloadFile(downloadURL, targetPath); console.log(`[INFO]: ${file} finished`); @@ -316,7 +317,7 @@ 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}"`); } @@ -334,11 +335,11 @@ const resolvePlugin = async () => { 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); @@ -346,10 +347,10 @@ const resolvePlugin = async () => { console.log(`[DEBUG]: "SimpleSC" entry name`, entry.entryName); }); zip.extractAllTo(tempDir, true); - await fs.copyFile(tempDll, pluginPath); + await fsp.cp(tempDll, pluginPath, { recursive: true, force: true }); console.log(`[INFO]: "SimpleSC" unzip finished`); } finally { - await fs.remove(tempDir); + await fsp.rm(tempDir, { recursive: true, force: true }); } }; @@ -363,7 +364,7 @@ const resolveServicePermission = async () => { const resDir = path.join(cwd, "src-tauri/resources"); for (let f of serviceExecutables) { const targetPath = path.join(resDir, f); - if (await fs.pathExists(targetPath)) { + if (fs.existsSync(targetPath)) { execSync(`chmod 755 ${targetPath}`); console.log(`[INFO]: "${targetPath}" chmod finished`); } diff --git a/scripts/portable-fixed-webview2.mjs b/scripts/portable-fixed-webview2.mjs index 94285ce7..696c21ea 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(); 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/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 = ""; From ab887c656a31abc70cf4d9f219c021704e5a80bf Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 20 Sep 2024 08:27:06 +0800 Subject: [PATCH 037/288] fix: function parameter call error --- src-tauri/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 8ea864b5..031a8a3a 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -158,7 +158,7 @@ pub fn run() { #[cfg(not(target_os = "macos"))] { - log_err!(hotkey::Hotkey::global().register()("Control+Q", "quit")); + log_err!(hotkey::Hotkey::global().register("Control+Q", "quit")); }; } tauri::WindowEvent::Focused(false) => { @@ -169,7 +169,7 @@ pub fn run() { #[cfg(not(target_os = "macos"))] { - log_err!(hotkey::Hotkey::global().unregister()("Control+Q")); + log_err!(hotkey::Hotkey::global().unregister("Control+Q")); }; } _ => {} From c246ae3bcf9de8f6256eb131cdf87435f469e2fd Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 20 Sep 2024 16:26:23 +0800 Subject: [PATCH 038/288] Fix: Custom tray icon not working 1. Contains potential deadlock --- src-tauri/capabilities/migrated.json | 5 +++++ src-tauri/src/core/handle.rs | 4 ++-- src-tauri/src/feat.rs | 5 +---- src-tauri/src/utils/dirs.rs | 3 +-- src/components/setting/mods/layout-viewer.tsx | 14 +++++++------- src/components/setting/setting-verge.tsx | 6 +++--- 6 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src-tauri/capabilities/migrated.json b/src-tauri/capabilities/migrated.json index b548532a..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", diff --git a/src-tauri/src/core/handle.rs b/src-tauri/src/core/handle.rs index 08a1d564..ad1323c8 100644 --- a/src-tauri/src/core/handle.rs +++ b/src-tauri/src/core/handle.rs @@ -57,7 +57,7 @@ impl Handle { } pub fn update_systray() -> Result<()> { - let app_handle = Self::global().app_handle.lock(); + let app_handle = Self::global().app_handle.lock().clone(); if app_handle.is_none() { bail!("update_systray unhandled error"); } @@ -67,7 +67,7 @@ impl Handle { /// update the system tray state pub fn update_systray_part() -> Result<()> { - let app_handle = Self::global().app_handle.lock(); + let app_handle = Self::global().app_handle.lock().clone(); if app_handle.is_none() { bail!("update_systray unhandled error"); } diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 94e90a92..8bd36d84 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -244,13 +244,10 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { || common_tray_icon.is_some() || sysproxy_tray_icon.is_some() || tun_tray_icon.is_some() + || tray_icon.is_some() { handle::Handle::update_systray_part()?; } - #[cfg(target_os = "macos")] - if tray_icon.is_some() { - handle::Handle::update_systray_part()?; - } >::Ok(()) }; diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs index 96bedd64..ffc77622 100644 --- a/src-tauri/src/utils/dirs.rs +++ b/src-tauri/src/utils/dirs.rs @@ -44,7 +44,6 @@ 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 handle = handle::Handle::global(); let app_handle = handle.app_handle.lock().clone(); @@ -65,7 +64,7 @@ pub fn app_home_dir() -> Result { /// get the resources dir pub fn app_resources_dir() -> Result { let handle = handle::Handle::global(); - let app_handle = handle.app_handle.lock(); + let app_handle = handle.app_handle.lock().clone(); if let Some(app_handle) = app_handle.as_ref() { match app_handle.path().resource_dir() { Ok(dir) => { 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/setting-verge.tsx b/src/components/setting/setting-verge.tsx index 63e94d4d..1a4dd8d3 100644 --- a/src/components/setting/setting-verge.tsx +++ b/src/components/setting/setting-verge.tsx @@ -194,9 +194,9 @@ 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}` }); } }} > From 29d54fe589003d247a17c54a42448c7b3ab1d7e9 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 20 Sep 2024 17:49:31 +0800 Subject: [PATCH 039/288] chore: update --- src-tauri/src/feat.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 8bd36d84..27eb12c2 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -161,6 +161,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 = 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; From 868707dbdee2952cd4440b5e2aa5c5f5ea32cfc4 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 20 Sep 2024 17:59:24 +0800 Subject: [PATCH 040/288] fix: tray menu text was not aligned --- src-tauri/src/core/tray.rs | 60 ++++++++++++-------------------------- 1 file changed, 19 insertions(+), 41 deletions(-) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 4df9ccaf..41bee5b6 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -8,7 +8,10 @@ use crate::{ }, }; use anyhow::Result; -use tauri::tray::{MouseButton, TrayIconEvent}; +use tauri::{ + menu::CheckMenuItem, + tray::{MouseButton, TrayIconEvent}, +}; use tauri::{ menu::{MenuEvent, MenuItem, PredefinedMenuItem, Submenu}, Wry, @@ -190,36 +193,6 @@ 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 global_mode_text = if mode == "global" { - "✓ 全局模式" - } else { - "全局模式" - }; - - let direct_mode_text = if mode == "direct" { - "✓ 直连模式" - } else { - "直连模式" - }; - - let system_proxy_text = if system_proxy_enabled { - "✓ 系统代理" - } else { - "系统代理" - }; - - let tun_mode_text = if tun_mode_enabled { - "✓ Tun 模式" - } else { - "Tun 模式" - }; - let open_window = &MenuItem::with_id( app_handle, "open_window", @@ -229,47 +202,52 @@ fn create_tray_menu( ) .unwrap(); - let rule_mode = &MenuItem::with_id( + let rule_mode = &CheckMenuItem::with_id( app_handle, "rule_mode", - t!("Rule Mode", rule_mode_text, use_zh), + t!("Rule Mode", "规则模式", use_zh), true, + mode == "rule", None::<&str>, ) .unwrap(); - let global_mode = &MenuItem::with_id( + let global_mode = &CheckMenuItem::with_id( app_handle, "global_mode", - t!("Global Mode", global_mode_text, use_zh), + t!("Global Mode", "全局模式", use_zh), true, + mode == "global", None::<&str>, ) .unwrap(); - let direct_mode = &MenuItem::with_id( + let direct_mode = &CheckMenuItem::with_id( app_handle, "direct_mode", - t!("Direct Mode", direct_mode_text, use_zh), + t!("Direct Mode", "直连模式", use_zh), true, + mode == "direct", None::<&str>, ) .unwrap(); - let system_proxy = &MenuItem::with_id( + let system_proxy = &CheckMenuItem::with_id( app_handle, "system_proxy", - t!("System Proxy", system_proxy_text, use_zh), + t!("System Proxy", "系统代理", use_zh), true, + system_proxy_enabled, None::<&str>, ) .unwrap(); - let tun_mode = &MenuItem::with_id( + let tun_mode = &CheckMenuItem::with_id( app_handle, "tun_mode", - t!("TUN Mode", tun_mode_text, use_zh), + t!("TUN Mode", "Tun 模式", use_zh), true, + tun_mode_enabled, None::<&str>, ) .unwrap(); From 424c1f7d8f7023507d6d17ece2c7aabf630ea275 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 20 Sep 2024 18:02:19 +0800 Subject: [PATCH 041/288] chore : update --- src-tauri/src/feat.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 27eb12c2..0ec9314f 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -162,7 +162,7 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { #[cfg(target_os = "macos")] let tray_icon = patch.tray_icon; #[cfg(not(target_os = "macos"))] - let tray_icon = None; + 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; From e92074e5868dcc8c3bd62087b0a5555c38444a1f Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 21 Sep 2024 15:38:14 +0800 Subject: [PATCH 042/288] chore: try adjusting the triggering of the tray mouse button --- src-tauri/src/core/tray.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 41bee5b6..2c6817a2 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -22,9 +22,29 @@ pub struct Tray {} impl Tray { pub fn update_systray(app_handle: &AppHandle) -> Result<()> { let tray = app_handle.tray_by_id("main").unwrap(); + #[cfg(not(target_os = "macos"))] + let _ = tray.set_show_menu_on_left_click(false); + tray.on_tray_icon_event(|tray, 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::Right, + .. + } = 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), + _ => {} + } + } + + #[cfg(not(target_os = "macos"))] if let TrayIconEvent::Click { button: MouseButton::Left, .. From 40ff3fd4bf59f52f23904c3150de6ff17974d23f Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 21 Sep 2024 21:05:34 +0800 Subject: [PATCH 043/288] chore: remove useless exit codes and hooks --- src-tauri/src/core/tray.rs | 1 - src-tauri/src/feat.rs | 1 - src-tauri/src/lib.rs | 3 --- 3 files changed, 5 deletions(-) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 2c6817a2..d57bbbf8 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -428,7 +428,6 @@ fn on_menu_event(app_handle: &AppHandle, event: MenuEvent) { "restart_clash" => feat::restart_clash_core(), "restart_app" => tauri::process::restart(&app_handle.env()), "quit" => { - println!("quit"); feat::quit(); } _ => {} diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 0ec9314f..91e88a7b 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -110,7 +110,6 @@ pub fn quit() { let _ = resolve::save_window_size_position(&app_handle, true); resolve::resolve_reset(); app_handle.exit(0); - std::process::exit(0); } } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 031a8a3a..a8a8222f 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -135,9 +135,6 @@ pub fn run() { .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 { From 84fe9c84a8b4f3b3a5fd74f1f88049bb41390232 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 22 Sep 2024 00:32:40 +0800 Subject: [PATCH 044/288] fix: remove unused variable --- src-tauri/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index a8a8222f..cf9d4cbf 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -62,7 +62,6 @@ pub fn run() { { let argvs: Vec = std::env::args().collect(); if argvs.len() > 1 { - let param = argvs[1].as_str(); log_err!(resolve_scheme(argvs[1].to_owned()).await); } } From e9721ecc4db9566bde31695c3f4f53a84519b093 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 22 Sep 2024 00:41:20 +0800 Subject: [PATCH 045/288] Revert "chore: remove useless exit codes and hooks" This reverts commit 40ff3fd4bf59f52f23904c3150de6ff17974d23f. --- src-tauri/src/core/tray.rs | 1 + src-tauri/src/feat.rs | 1 + src-tauri/src/lib.rs | 3 +++ 3 files changed, 5 insertions(+) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index d57bbbf8..2c6817a2 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -428,6 +428,7 @@ fn on_menu_event(app_handle: &AppHandle, event: MenuEvent) { "restart_clash" => feat::restart_clash_core(), "restart_app" => tauri::process::restart(&app_handle.env()), "quit" => { + println!("quit"); feat::quit(); } _ => {} diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 91e88a7b..0ec9314f 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -110,6 +110,7 @@ pub fn quit() { let _ = resolve::save_window_size_position(&app_handle, true); resolve::resolve_reset(); app_handle.exit(0); + std::process::exit(0); } } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index cf9d4cbf..6d1756b0 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -134,6 +134,9 @@ pub fn run() { .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 { From 56983c4d2a482255961fb121c0a865419c617a84 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 22 Sep 2024 14:08:08 +0800 Subject: [PATCH 046/288] chore: update --- src-tauri/src/core/tray.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 2c6817a2..73c5d0a8 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -10,7 +10,7 @@ use crate::{ use anyhow::Result; use tauri::{ menu::CheckMenuItem, - tray::{MouseButton, TrayIconEvent}, + tray::{MouseButton, MouseButtonState, TrayIconEvent}, }; use tauri::{ menu::{MenuEvent, MenuItem, PredefinedMenuItem, Submenu}, @@ -22,8 +22,6 @@ pub struct Tray {} impl Tray { pub fn update_systray(app_handle: &AppHandle) -> Result<()> { let tray = app_handle.tray_by_id("main").unwrap(); - #[cfg(not(target_os = "macos"))] - let _ = tray.set_show_menu_on_left_click(false); tray.on_tray_icon_event(|tray, event| { let tray_event = { Config::verge().latest().tray_event.clone() }; @@ -32,6 +30,7 @@ impl Tray { #[cfg(target_os = "macos")] if let TrayIconEvent::Click { button: MouseButton::Right, + button_state: MouseButtonState::Down, .. } = event { @@ -47,6 +46,7 @@ impl Tray { #[cfg(not(target_os = "macos"))] if let TrayIconEvent::Click { button: MouseButton::Left, + button_state: MouseButtonState::Down, .. } = event { From a5c871e933ff016ecfdae7efb17afdb6c66c4434 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 22 Sep 2024 15:39:52 +0800 Subject: [PATCH 047/288] chore: update --- src-tauri/src/core/handle.rs | 9 --------- src-tauri/src/feat.rs | 5 ++--- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src-tauri/src/core/handle.rs b/src-tauri/src/core/handle.rs index ad1323c8..b12ebc12 100644 --- a/src-tauri/src/core/handle.rs +++ b/src-tauri/src/core/handle.rs @@ -56,15 +56,6 @@ impl Handle { } } - pub fn update_systray() -> Result<()> { - let app_handle = Self::global().app_handle.lock().clone(); - if app_handle.is_none() { - bail!("update_systray unhandled error"); - } - Tray::update_systray(app_handle.as_ref().unwrap())?; - Ok(()) - } - /// update the system tray state pub fn update_systray_part() -> Result<()> { let app_handle = Self::global().app_handle.lock().clone(); diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 0ec9314f..dd75d7d1 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -239,9 +239,8 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { hotkey::Hotkey::global().update(hotkeys)?; } - if language.is_some() { - handle::Handle::update_systray()?; - } else if system_proxy.is_some() + if language.is_some() + || system_proxy.is_some() || tun_mode.is_some() || common_tray_icon.is_some() || sysproxy_tray_icon.is_some() From 4b7ffa146525d035434f3104a82319b6ad527ce9 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 22 Sep 2024 15:59:59 +0800 Subject: [PATCH 048/288] chore: update --- src-tauri/src/core/tray.rs | 75 +++++++++++++++++----------------- src-tauri/src/utils/resolve.rs | 2 +- 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 73c5d0a8..d2763337 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -10,7 +10,7 @@ use crate::{ use anyhow::Result; use tauri::{ menu::CheckMenuItem, - tray::{MouseButton, MouseButtonState, TrayIconEvent}, + tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent}, }; use tauri::{ menu::{MenuEvent, MenuItem, PredefinedMenuItem, Submenu}, @@ -20,46 +20,47 @@ use tauri::{AppHandle, Manager}; pub struct Tray {} impl Tray { - pub fn update_systray(app_handle: &AppHandle) -> Result<()> { - let tray = app_handle.tray_by_id("main").unwrap(); + pub fn create_systray(app_handle: &AppHandle) -> Result<()> { + let _ = TrayIconBuilder::with_id("main") + .on_tray_icon_event(|tray, event| { + let tray_event = { Config::verge().latest().tray_event.clone() }; + let tray_event: String = tray_event.unwrap_or("main_window".into()); - tray.on_tray_icon_event(|tray, 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::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), - _ => {} + #[cfg(target_os = "macos")] + if let TrayIconEvent::Click { + 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), + _ => {} + } } - } - #[cfg(not(target_os = "macos"))] - if let TrayIconEvent::Click { - button: MouseButton::Left, - 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), - _ => {} + #[cfg(not(target_os = "macos"))] + if let TrayIconEvent::Click { + button: MouseButton::Left, + 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), + _ => {} + } } - } - }); - tray.on_menu_event(on_menu_event); + }) + .on_menu_event(on_menu_event) + .menu_on_left_click(false) + .build(app_handle); Ok(()) } diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 2f06aebf..80c271a0 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -85,7 +85,7 @@ pub async fn resolve_setup(app: &mut App) { server::embed_server(app.app_handle()); log::trace!("init system tray"); - log_err!(tray::Tray::update_systray(&app.app_handle())); + log_err!(tray::Tray::create_systray(&app.app_handle())); let silent_start = { Config::verge().data().enable_silent_start }; if !silent_start.unwrap_or(false) { From c653c458b905e2bdf53748777fe59b8e6a4eea39 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 22 Sep 2024 16:46:24 +0800 Subject: [PATCH 049/288] Revert "chore: update" This reverts commit 4b7ffa146525d035434f3104a82319b6ad527ce9. --- src-tauri/src/core/tray.rs | 77 +++++++++++++++++----------------- src-tauri/src/utils/resolve.rs | 2 +- 2 files changed, 39 insertions(+), 40 deletions(-) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index d2763337..73c5d0a8 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -10,7 +10,7 @@ use crate::{ use anyhow::Result; use tauri::{ menu::CheckMenuItem, - tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent}, + tray::{MouseButton, MouseButtonState, TrayIconEvent}, }; use tauri::{ menu::{MenuEvent, MenuItem, PredefinedMenuItem, Submenu}, @@ -20,47 +20,46 @@ use tauri::{AppHandle, Manager}; pub struct Tray {} impl Tray { - pub fn create_systray(app_handle: &AppHandle) -> Result<()> { - let _ = TrayIconBuilder::with_id("main") - .on_tray_icon_event(|tray, event| { - let tray_event = { Config::verge().latest().tray_event.clone() }; - let tray_event: String = tray_event.unwrap_or("main_window".into()); + pub fn update_systray(app_handle: &AppHandle) -> Result<()> { + let tray = app_handle.tray_by_id("main").unwrap(); - #[cfg(target_os = "macos")] - if let TrayIconEvent::Click { - 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), - _ => {} - } - } + tray.on_tray_icon_event(|tray, event| { + let tray_event = { Config::verge().latest().tray_event.clone() }; + let tray_event: String = tray_event.unwrap_or("main_window".into()); - #[cfg(not(target_os = "macos"))] - if let TrayIconEvent::Click { - button: MouseButton::Left, - 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), - _ => {} - } + #[cfg(target_os = "macos")] + if let TrayIconEvent::Click { + 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), + _ => {} } - }) - .on_menu_event(on_menu_event) - .menu_on_left_click(false) - .build(app_handle); + } + + #[cfg(not(target_os = "macos"))] + if let TrayIconEvent::Click { + button: MouseButton::Left, + 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), + _ => {} + } + } + }); + tray.on_menu_event(on_menu_event); Ok(()) } diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 80c271a0..2f06aebf 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -85,7 +85,7 @@ pub async fn resolve_setup(app: &mut App) { server::embed_server(app.app_handle()); log::trace!("init system tray"); - log_err!(tray::Tray::create_systray(&app.app_handle())); + log_err!(tray::Tray::update_systray(&app.app_handle())); let silent_start = { Config::verge().data().enable_silent_start }; if !silent_start.unwrap_or(false) { From bfded924d7145367ce1d264b9a79407e2624d083 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 22 Sep 2024 20:29:43 +0800 Subject: [PATCH 050/288] chore: rename method --- src-tauri/src/core/tray.rs | 12 ++++++++---- src-tauri/src/utils/resolve.rs | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 73c5d0a8..c9c0f68b 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -10,7 +10,7 @@ use crate::{ use anyhow::Result; use tauri::{ menu::CheckMenuItem, - tray::{MouseButton, MouseButtonState, TrayIconEvent}, + tray::{MouseButton, MouseButtonState, TrayIconEvent, TrayIconId}, }; use tauri::{ menu::{MenuEvent, MenuItem, PredefinedMenuItem, Submenu}, @@ -20,8 +20,9 @@ use tauri::{AppHandle, Manager}; pub struct Tray {} impl Tray { - pub fn update_systray(app_handle: &AppHandle) -> Result<()> { - let tray = app_handle.tray_by_id("main").unwrap(); + pub fn create_systray(app_handle: &AppHandle) -> Result<()> { + let tray_incon_id = TrayIconId::new("main"); + let tray = app_handle.tray_by_id(&tray_incon_id).unwrap(); tray.on_tray_icon_event(|tray, event| { let tray_event = { Config::verge().latest().tray_event.clone() }; @@ -50,6 +51,8 @@ impl Tray { .. } = event { + let _ = tray.set_visible(false); + let app = tray.app_handle(); match tray_event.as_str() { "system_proxy" => feat::toggle_system_proxy(), @@ -57,10 +60,11 @@ impl Tray { "main_window" => resolve::create_window(app), _ => {} } + let _ = tray.set_visible(true); } }); + println!("{:?}", tray.id()); tray.on_menu_event(on_menu_event); - Ok(()) } diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 2f06aebf..80c271a0 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -85,7 +85,7 @@ pub async fn resolve_setup(app: &mut App) { server::embed_server(app.app_handle()); log::trace!("init system tray"); - log_err!(tray::Tray::update_systray(&app.app_handle())); + log_err!(tray::Tray::create_systray(&app.app_handle())); let silent_start = { Config::verge().data().enable_silent_start }; if !silent_start.unwrap_or(false) { From 0a9182519d3ade9a1735346c5f197bc1a306fced Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 22 Sep 2024 22:15:36 +0800 Subject: [PATCH 051/288] chore: update --- src-tauri/src/core/handle.rs | 1 + src-tauri/src/core/tray.rs | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/src/core/handle.rs b/src-tauri/src/core/handle.rs index b12ebc12..23e809ee 100644 --- a/src-tauri/src/core/handle.rs +++ b/src-tauri/src/core/handle.rs @@ -27,6 +27,7 @@ impl Handle { pub fn get_window(&self) -> Option { self.app_handle .lock() + .clone() .as_ref() .and_then(|a| a.get_webview_window("main")) } diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index c9c0f68b..926ceb36 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -63,7 +63,6 @@ impl Tray { let _ = tray.set_visible(true); } }); - println!("{:?}", tray.id()); tray.on_menu_event(on_menu_event); Ok(()) } From 60e0f972d0054f9d25bc53f6a7c2aee82e693ecb Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 23 Sep 2024 16:31:58 +0800 Subject: [PATCH 052/288] refactor: unify and simplify the call of app_handle --- src-tauri/src/cmds.rs | 4 +- src-tauri/src/core/core.rs | 99 +++++++++++++++------------------- src-tauri/src/core/handle.rs | 16 +++--- src-tauri/src/core/hotkey.rs | 27 ++++------ src-tauri/src/core/tray.rs | 19 ++++--- src-tauri/src/feat.rs | 32 +++++------ src-tauri/src/lib.rs | 8 +-- src-tauri/src/utils/init.rs | 5 +- src-tauri/src/utils/resolve.rs | 77 +++++++++++++------------- src-tauri/src/utils/server.rs | 6 +-- 10 files changed, 135 insertions(+), 158 deletions(-) diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index 213a7264..9a532f76 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -14,8 +14,8 @@ type CmdResult = Result; 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(()) } diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index c43696ac..bdae8409 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -8,7 +8,6 @@ use parking_lot::Mutex; use serde_yaml::Mapping; use std::{sync::Arc, time::Duration}; use sysinfo::{ProcessRefreshKind, RefreshKind, System}; -use tauri::AppHandle; use tauri_plugin_shell::process::{CommandChild, CommandEvent}; use tauri_plugin_shell::ShellExt; @@ -16,7 +15,6 @@ use tokio::time::sleep; #[derive(Debug)] pub struct CoreManager { - app_handle: Arc>>, sidecar: Arc>>, #[allow(unused)] use_service_mode: Arc>, @@ -27,14 +25,12 @@ impl 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)), }) } - pub fn init(&self, app_handle: &AppHandle) -> Result<()> { - *self.app_handle.lock() = Some(app_handle.clone()); + pub fn init(&self) -> Result<()> { tauri::async_runtime::spawn(async { log::trace!("run core start"); // 启动clash @@ -69,29 +65,24 @@ impl CoreManager { 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?; + 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}"); - } + 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(()) @@ -173,39 +164,37 @@ impl CoreManager { let args = vec!["-d", app_dir, "-f", config_path]; - let app_handle = self.app_handle.lock(); + let app_handle = handle::Handle::global().app_handle().unwrap(); - if let Some(app_handle) = app_handle.as_ref() { - let cmd = app_handle.shell().sidecar(clash_core)?; - let (mut rx, _) = cmd.args(args).spawn()?; + let cmd = app_handle.shell().sidecar(clash_core)?; + let (mut rx, _) = cmd.args(args).spawn()?; - 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; - } - _ => {} + 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(()) } diff --git a/src-tauri/src/core/handle.rs b/src-tauri/src/core/handle.rs index 23e809ee..5880b187 100644 --- a/src-tauri/src/core/handle.rs +++ b/src-tauri/src/core/handle.rs @@ -1,6 +1,6 @@ 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 std::sync::Arc; @@ -24,10 +24,12 @@ impl Handle { *self.app_handle.lock() = Some(app_handle.clone()); } + pub fn app_handle(&self) -> Option { + self.app_handle.lock().clone() + } + pub fn get_window(&self) -> Option { - self.app_handle - .lock() - .clone() + self.app_handle() .as_ref() .and_then(|a| a.get_webview_window("main")) } @@ -59,11 +61,7 @@ impl Handle { /// update the system tray state pub fn update_systray_part() -> Result<()> { - let app_handle = Self::global().app_handle.lock().clone(); - if app_handle.is_none() { - bail!("update_systray unhandled error"); - } - Tray::update_part(app_handle.as_ref().unwrap())?; + Tray::update_part()?; Ok(()) } } diff --git a/src-tauri/src/core/hotkey.rs b/src-tauri/src/core/hotkey.rs index 35a05624..9b7ea6dc 100755 --- a/src-tauri/src/core/hotkey.rs +++ b/src-tauri/src/core/hotkey.rs @@ -1,3 +1,4 @@ +use crate::core::handle; use crate::{config::Config, feat, log_err}; use anyhow::{bail, Result}; use once_cell::sync::OnceCell; @@ -7,7 +8,6 @@ use tauri::{AppHandle, Manager}; use tauri_plugin_global_shortcut::{Code, GlobalShortcutExt, ShortcutState}; pub struct Hotkey { current: Arc>>, // 保存当前的热键设置 - app_handle: Arc>>, } impl Hotkey { @@ -16,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,11 +46,8 @@ impl Hotkey { } pub 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(); + let app_handle: AppHandle = handle::Handle::global().app_handle().unwrap(); + let manager = app_handle.global_shortcut(); if manager.is_registered(hotkey) { manager.unregister(hotkey)?; @@ -88,11 +83,8 @@ impl Hotkey { } pub 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(); + let app_handle: AppHandle = handle::Handle::global().app_handle().unwrap(); + let manager = app_handle.global_shortcut(); manager.unregister(hotkey)?; log::info!(target: "app", "unregister hotkey {hotkey}"); @@ -166,10 +158,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: AppHandle = handle::Handle::global().app_handle().unwrap(); + if let Err(e) = app_handle.global_shortcut().unregister_all() { + log::error!("Error unregistering all hotkeys: {:?}", e); } } } diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 926ceb36..3ac1abae 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -17,14 +17,17 @@ use tauri::{ Wry, }; use tauri::{AppHandle, Manager}; + +use super::handle; pub struct Tray {} impl Tray { - pub fn create_systray(app_handle: &AppHandle) -> Result<()> { + pub fn create_systray() -> Result<()> { + let app_handle: AppHandle = 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(|tray, event| { + 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()); @@ -35,11 +38,10 @@ impl Tray { .. } = 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(), _ => {} } } @@ -67,7 +69,8 @@ impl Tray { Ok(()) } - pub fn update_part(app_handle: &AppHandle) -> Result<()> { + pub fn update_part() -> Result<()> { + let app_handle: AppHandle = handle::Handle::global().app_handle().unwrap(); let use_zh = { Config::verge().latest().language == Some("zh".into()) }; let version = VERSION.get().unwrap(); let mode = { @@ -91,7 +94,7 @@ impl Tray { let tray = app_handle.tray_by_id("main").unwrap(); let _ = tray.set_menu(Some(create_tray_menu( - app_handle, + &app_handle, Some(mode.as_str()), *system_proxy, *tun_mode, @@ -421,10 +424,10 @@ fn on_menu_event(app_handle: &AppHandle, event: MenuEvent) { 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), + "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()), diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index dd75d7d1..a39b5e4b 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -10,22 +10,18 @@ use crate::log_err; use crate::utils::resolve; use anyhow::{bail, Result}; use serde_yaml::{Mapping, Value}; -use tauri::{AppHandle, Manager}; +use tauri::AppHandle; use tauri_plugin_clipboard_manager::ClipboardExt; // 打开面板 pub fn open_or_close_dashboard() { - let handle = handle::Handle::global(); - let app_handle = handle.app_handle.lock().clone(); - 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.close(); + return; } - resolve::create_window(app_handle); } + resolve::create_window(); } // 重启clash @@ -104,14 +100,11 @@ pub fn toggle_tun_mode() { } pub fn quit() { - let handle = handle::Handle::global(); - let app_handle = handle.app_handle.lock().clone(); - if let Some(app_handle) = app_handle.as_ref() { - let _ = resolve::save_window_size_position(&app_handle, true); - resolve::resolve_reset(); - app_handle.exit(0); - std::process::exit(0); - } + let app_handle: AppHandle = handle::Handle::global().app_handle().unwrap(); + let _ = resolve::save_window_size_position(true); + resolve::resolve_reset(); + app_handle.exit(0); + std::process::exit(0); } /// 修改clash的订阅 @@ -319,7 +312,8 @@ async fn update_core_config() -> Result<()> { } /// 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); diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 6d1756b0..254f9d46 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -133,7 +133,7 @@ pub fn run() { .build(tauri::generate_context!()) .expect("error while running tauri application"); - app.run(|app_handle, e| match e { + app.run(|_, e| match e { tauri::RunEvent::ExitRequested { api, .. } => { api.prevent_exit(); } @@ -141,13 +141,13 @@ pub fn run() { if label == "main" { match event { tauri::WindowEvent::Destroyed => { - let _ = resolve::save_window_size_position(app_handle, true); + let _ = resolve::save_window_size_position(true); } tauri::WindowEvent::CloseRequested { .. } => { - let _ = resolve::save_window_size_position(app_handle, true); + let _ = resolve::save_window_size_position(true); } tauri::WindowEvent::Moved(_) | tauri::WindowEvent::Resized(_) => { - let _ = resolve::save_window_size_position(app_handle, false); + let _ = resolve::save_window_size_position(false); } tauri::WindowEvent::Focused(true) => { #[cfg(target_os = "macos")] diff --git a/src-tauri/src/utils/init.rs b/src-tauri/src/utils/init.rs index 621450a0..208b0fd6 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}; @@ -297,7 +298,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: AppHandle = handle::Handle::global().app_handle().unwrap(); + let script_path = { let verge = Config::verge(); let verge = verge.latest(); diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 80c271a0..29eec37d 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -44,7 +44,7 @@ pub async fn resolve_setup(app: &mut App) { 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); @@ -78,25 +78,25 @@ pub async fn resolve_setup(app: &mut App) { log_err!(Config::init_config().await); log::trace!("launch core"); - log_err!(CoreManager::global().init(app.app_handle())); + log_err!(CoreManager::global().init()); // setup a simple http server for singleton log::trace!("launch embed server"); - server::embed_server(app.app_handle()); + server::embed_server(); log::trace!("init system tray"); - log_err!(tray::Tray::create_systray(&app.app_handle())); + 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!(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()); } @@ -110,8 +110,10 @@ pub fn resolve_reset() { } /// create main window -pub fn create_window(app_handle: &AppHandle) { - if let Some(window) = app_handle.get_webview_window("main") { +pub fn create_window() { + let app_handle: AppHandle = handle::Handle::global().app_handle().unwrap(); + + if let Some(window) = handle::Handle::global().get_window() { trace_err!(window.unminimize(), "set win unminimize"); trace_err!(window.show(), "set win visible"); trace_err!(window.set_focus(), "set win focus"); @@ -119,7 +121,7 @@ pub fn create_window(app_handle: &AppHandle) { } let mut builder = tauri::WebviewWindowBuilder::new( - app_handle, + &app_handle, "main".to_string(), tauri::WebviewUrl::App("index.html".into()), ) @@ -208,7 +210,8 @@ pub fn create_window(app_handle: &AppHandle) { } /// save window size and position -pub fn save_window_size_position(app_handle: &AppHandle, save_to_file: bool) -> Result<()> { +pub fn save_window_size_position(save_to_file: bool) -> Result<()> { + let app_handle: AppHandle = handle::Handle::global().app_handle().unwrap(); let verge = Config::verge(); let mut verge = verge.latest(); @@ -236,6 +239,8 @@ pub fn save_window_size_position(app_handle: &AppHandle, save_to_file: bool) -> pub async fn resolve_scheme(param: String) -> Result<()> { log::info!("received deep link: {}", param); + let app_handle: AppHandle = handle::Handle::global().app_handle().unwrap(); + let param_str = if param.starts_with("[") && param.len() > 4 { param .get(2..param.len() - 2) @@ -269,35 +274,31 @@ pub async fn resolve_scheme(param: String) -> Result<()> { .decode_utf8_lossy() .to_string(); - let handle = handle::Handle::global(); - let app_handle = handle.app_handle.lock().clone(); - if let Some(app_handle) = app_handle.as_ref() { - create_window(app_handle); - 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(); + 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}"); - } + 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}"); } } } diff --git a/src-tauri/src/utils/server.rs b/src-tauri/src/utils/server.rs index 96219e06..2f2b20bb 100644 --- a/src-tauri/src/utils/server.rs +++ b/src-tauri/src/utils/server.rs @@ -6,7 +6,6 @@ use crate::log_err; use anyhow::{bail, Result}; use port_scanner::local_port_available; use std::convert::Infallible; -use tauri::AppHandle; use warp::Filter; #[derive(serde::Deserialize, Debug)] @@ -42,13 +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 visible = warp::path!("commands" / "visible").map(move || { - resolve::create_window(&handle); + resolve::create_window(); "ok" }); From 52d5f2c9923f29bb0adef8001b0ff0dda5d40c15 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 23 Sep 2024 16:53:00 +0800 Subject: [PATCH 053/288] chore: update --- src-tauri/src/core/tray.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 3ac1abae..c014ec45 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -59,7 +59,7 @@ impl Tray { 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(), _ => {} } let _ = tray.set_visible(true); From 8a3a094414ca551466d09b47b868606988a70703 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 23 Sep 2024 17:15:28 +0800 Subject: [PATCH 054/288] chore: update --- src-tauri/src/core/tray.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index c014ec45..eda60124 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -53,16 +53,12 @@ impl Tray { .. } = event { - let _ = tray.set_visible(false); - - 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(), _ => {} } - let _ = tray.set_visible(true); } }); tray.on_menu_event(on_menu_event); From a3465d292c493e1314ae030512f6ea1536501f8e Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 23 Sep 2024 23:15:51 +0800 Subject: [PATCH 055/288] refactor: unify and simplify the call of app_handle(2) --- package.json | 4 ++-- src-tauri/src/config/verge.rs | 9 +------ src-tauri/src/core/clash_api.rs | 4 ---- src-tauri/src/core/handle.rs | 11 +++++---- src-tauri/src/core/hotkey.rs | 8 +++---- src-tauri/src/core/tray.rs | 4 ++-- src-tauri/src/enhance/merge.rs | 2 -- src-tauri/src/enhance/script.rs | 2 -- src-tauri/src/feat.rs | 3 +-- src-tauri/src/utils/dirs.rs | 42 +++++++++++++-------------------- src-tauri/src/utils/init.rs | 3 +-- src-tauri/src/utils/resolve.rs | 9 +++---- 12 files changed, 39 insertions(+), 62 deletions(-) diff --git a/package.json b/package.json index 2bb7dc5f..9cecb928 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "version": "2.0.0", "license": "GPL-3.0-only", "scripts": { - "dev": "tauri dev", - "dev:diff": "tauri dev -f verge-dev", + "dev": "RUST_BACKTRACE=1 tauri dev", + "dev:diff": "RUST_BACKTRACE=1 tauri dev -f verge-dev", "build": "tauri build", "tauri": "tauri", "web:dev": "vite", diff --git a/src-tauri/src/config/verge.rs b/src-tauri/src/config/verge.rs index 6086b8ce..2aaa98b1 100644 --- a/src-tauri/src/config/verge.rs +++ b/src-tauri/src/config/verge.rs @@ -7,9 +7,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, @@ -330,11 +327,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 } /// 获取日志等级 diff --git a/src-tauri/src/core/clash_api.rs b/src-tauri/src/core/clash_api.rs index 67fc112d..71518efa 100644 --- a/src-tauri/src/core/clash_api.rs +++ b/src-tauri/src/core/clash_api.rs @@ -138,9 +138,5 @@ fn test_parse_check_output() { 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/handle.rs b/src-tauri/src/core/handle.rs index 5880b187..19eed0ee 100644 --- a/src-tauri/src/core/handle.rs +++ b/src-tauri/src/core/handle.rs @@ -2,13 +2,13 @@ use super::tray::Tray; use crate::log_err; use anyhow::Result; use once_cell::sync::OnceCell; -use parking_lot::Mutex; +use parking_lot::RwLock; use std::sync::Arc; use tauri::{AppHandle, Emitter, Manager, WebviewWindow}; #[derive(Debug, Default, Clone)] pub struct Handle { - pub app_handle: Arc>>, + pub app_handle: Arc>>, } impl Handle { @@ -16,16 +16,17 @@ 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)), }) } 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.lock().clone() + self.app_handle.read().clone() } pub fn get_window(&self) -> Option { diff --git a/src-tauri/src/core/hotkey.rs b/src-tauri/src/core/hotkey.rs index 9b7ea6dc..cb486d89 100755 --- a/src-tauri/src/core/hotkey.rs +++ b/src-tauri/src/core/hotkey.rs @@ -4,7 +4,7 @@ use anyhow::{bail, Result}; use once_cell::sync::OnceCell; use parking_lot::Mutex; use std::{collections::HashMap, sync::Arc}; -use tauri::{AppHandle, Manager}; +use tauri::Manager; use tauri_plugin_global_shortcut::{Code, GlobalShortcutExt, ShortcutState}; pub struct Hotkey { current: Arc>>, // 保存当前的热键设置 @@ -46,7 +46,7 @@ impl Hotkey { } pub fn register(&self, hotkey: &str, func: &str) -> Result<()> { - let app_handle: AppHandle = handle::Handle::global().app_handle().unwrap(); + let app_handle = handle::Handle::global().app_handle().unwrap(); let manager = app_handle.global_shortcut(); if manager.is_registered(hotkey) { @@ -83,7 +83,7 @@ impl Hotkey { } pub fn unregister(&self, hotkey: &str) -> Result<()> { - let app_handle: AppHandle = handle::Handle::global().app_handle().unwrap(); + let app_handle = handle::Handle::global().app_handle().unwrap(); let manager = app_handle.global_shortcut(); manager.unregister(hotkey)?; @@ -158,7 +158,7 @@ impl Hotkey { impl Drop for Hotkey { fn drop(&mut self) { - let app_handle: AppHandle = handle::Handle::global().app_handle().unwrap(); + let app_handle = handle::Handle::global().app_handle().unwrap(); if let Err(e) = app_handle.global_shortcut().unregister_all() { log::error!("Error unregistering all hotkeys: {:?}", e); } diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index eda60124..a250c7da 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -23,7 +23,7 @@ pub struct Tray {} impl Tray { pub fn create_systray() -> Result<()> { - let app_handle: AppHandle = handle::Handle::global().app_handle().unwrap(); + 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(); @@ -66,7 +66,7 @@ impl Tray { } pub fn update_part() -> Result<()> { - let app_handle: AppHandle = handle::Handle::global().app_handle().unwrap(); + 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 = { diff --git a/src-tauri/src/enhance/merge.rs b/src-tauri/src/enhance/merge.rs index dccd65cb..3061e9fa 100644 --- a/src-tauri/src/enhance/merge.rs +++ b/src-tauri/src/enhance/merge.rs @@ -56,7 +56,5 @@ fn test_merge() -> anyhow::Result<()> { let result = serde_yaml::to_string(&use_merge(merge, config))?; - println!("{result}"); - Ok(()) } diff --git a/src-tauri/src/enhance/script.rs b/src-tauri/src/enhance/script.rs index e2465097..51cbfbad 100644 --- a/src-tauri/src/enhance/script.rs +++ b/src-tauri/src/enhance/script.rs @@ -105,7 +105,5 @@ fn test_script() { let config_str = serde_yaml::to_string(&config).unwrap(); - println!("{config_str}"); - dbg!(results); } diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index a39b5e4b..37ee2c28 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -10,7 +10,6 @@ use crate::log_err; use crate::utils::resolve; use anyhow::{bail, Result}; use serde_yaml::{Mapping, Value}; -use tauri::AppHandle; use tauri_plugin_clipboard_manager::ClipboardExt; // 打开面板 @@ -100,7 +99,7 @@ pub fn toggle_tun_mode() { } pub fn quit() { - let app_handle: AppHandle = handle::Handle::global().app_handle().unwrap(); + let app_handle = handle::Handle::global().app_handle().unwrap(); let _ = resolve::save_window_size_position(true); resolve::resolve_reset(); app_handle.exit(0); diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs index ffc77622..a44a1ce0 100644 --- a/src-tauri/src/utils/dirs.rs +++ b/src-tauri/src/utils/dirs.rs @@ -44,39 +44,31 @@ 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 handle = handle::Handle::global(); - let app_handle = handle.app_handle.lock().clone(); + let app_handle = handle::Handle::global().app_handle().unwrap(); - 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) => { + 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")); } } - 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().clone(); - 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")); - } - }; + let app_handle = handle::Handle::global().app_handle().unwrap(); + 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")) } /// profiles dir diff --git a/src-tauri/src/utils/init.rs b/src-tauri/src/utils/init.rs index 208b0fd6..d7ee89a9 100644 --- a/src-tauri/src/utils/init.rs +++ b/src-tauri/src/utils/init.rs @@ -11,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 @@ -299,7 +298,7 @@ pub fn init_scheme() -> Result<()> { } pub async fn startup_script() -> Result<()> { - let app_handle: AppHandle = handle::Handle::global().app_handle().unwrap(); + let app_handle = handle::Handle::global().app_handle().unwrap(); let script_path = { let verge = Config::verge(); diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 29eec37d..3159ff0e 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -7,7 +7,7 @@ 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 url::Url; //#[cfg(not(target_os = "linux"))] @@ -39,6 +39,7 @@ pub async fn resolve_setup(app: &mut App) { #[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()); @@ -111,7 +112,7 @@ pub fn resolve_reset() { /// create main window pub fn create_window() { - let app_handle: AppHandle = handle::Handle::global().app_handle().unwrap(); + let app_handle = handle::Handle::global().app_handle().unwrap(); if let Some(window) = handle::Handle::global().get_window() { trace_err!(window.unminimize(), "set win unminimize"); @@ -211,7 +212,7 @@ pub fn create_window() { /// save window size and position pub fn save_window_size_position(save_to_file: bool) -> Result<()> { - let app_handle: AppHandle = handle::Handle::global().app_handle().unwrap(); + let app_handle = handle::Handle::global().app_handle().unwrap(); let verge = Config::verge(); let mut verge = verge.latest(); @@ -239,7 +240,7 @@ pub fn save_window_size_position(save_to_file: bool) -> Result<()> { pub async fn resolve_scheme(param: String) -> Result<()> { log::info!("received deep link: {}", param); - let app_handle: AppHandle = handle::Handle::global().app_handle().unwrap(); + let app_handle = handle::Handle::global().app_handle().unwrap(); let param_str = if param.starts_with("[") && param.len() > 4 { param From 5d742a90376dec2cc998d3f510871b55d2fe6679 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 23 Sep 2024 23:57:08 +0800 Subject: [PATCH 056/288] chore: update --- src-tauri/src/core/sysopt.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index 35ed33a8..a9060424 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -294,14 +294,13 @@ impl Sysopt { })() .unwrap_or(app_path); - // fix #403 #[cfg(target_os = "linux")] let app_path = { use crate::core::handle::Handle; use tauri::Manager; - let handle = Handle::global(); - match handle.app_handle.lock().as_ref() { + let app_handle = Handle::global().app_handle(); + match app_handle { Some(app_handle) => { let appimage = app_handle.env().appimage; appimage From 2ca7310baffe7444670b1b737840a69ad4b73c7e Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 24 Sep 2024 16:35:19 +0800 Subject: [PATCH 057/288] chore: add cross-env dev dependency --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9cecb928..31c5c6f6 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "version": "2.0.0", "license": "GPL-3.0-only", "scripts": { - "dev": "RUST_BACKTRACE=1 tauri dev", - "dev:diff": "RUST_BACKTRACE=1 tauri dev -f verge-dev", + "dev": "cross-env RUST_BACKTRACE=1 tauri dev", + "dev:diff": "cross-env RUST_BACKTRACE=1 tauri dev -f verge-dev", "build": "tauri build", "tauri": "tauri", "web:dev": "vite", From 4b234a32119f27fea86ecffae4231690e879b52c Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 24 Sep 2024 20:06:25 +0800 Subject: [PATCH 058/288] fix: code lint --- src-tauri/src/cmds.rs | 2 +- src-tauri/src/core/service.rs | 4 ++-- src-tauri/src/core/sysopt.rs | 8 +++----- src-tauri/src/enhance/seq.rs | 8 ++++---- src-tauri/src/feat.rs | 22 ++++++++-------------- src-tauri/src/utils/dirs.rs | 10 +++++----- src-tauri/src/utils/init.rs | 2 +- 7 files changed, 24 insertions(+), 32 deletions(-) diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index 9a532f76..66283b71 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -337,7 +337,7 @@ pub fn get_network_interfaces() -> Vec { for (interface_name, _) in &networks { result.push(interface_name.clone()); } - return result; + result } #[tauri::command] diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index 3a06648f..a49659a5 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -137,7 +137,7 @@ pub async fn install_service(passwd: String) -> Result<()> { .output()?; let output = sudo( &passwd, - format!("{}", installer_path.to_string_lossy().replace(" ", "\\ ")), + installer_path.to_string_lossy().replace(" ", "\\ ").to_string(), ) .output()?; @@ -244,7 +244,7 @@ pub async fn uninstall_service(passwd: String) -> Result<()> { .output()?; let output = sudo( &passwd, - format!("{}", uninstaller_path.to_string_lossy().replace(" ", "\\ ")), + uninstaller_path.to_string_lossy().replace(" ", "\\ ").to_string(), ) .output()?; diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index a9060424..57ea66c4 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -66,12 +66,10 @@ fn get_bypass() -> String { #[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 { - if use_default { - format!("{},{}", DEFAULT_BYPASS, custom_bypass) - } else { - custom_bypass - } + custom_bypass }; bypass 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/feat.rs b/src-tauri/src/feat.rs index 37ee2c28..8b90684d 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -184,12 +184,10 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { update_core_config().await?; } #[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; - } + if (redir_enabled.is_some() || redir_port.is_some()) && !generated { + Config::generate().await?; + CoreManager::global().run_core().await?; + generated = true; } #[cfg(target_os = "linux")] if tproxy_enabled.is_some() || tproxy_port.is_some() { @@ -199,16 +197,12 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { generated = true; } } - if socks_enabled.is_some() + if (socks_enabled.is_some() || http_enabled.is_some() || socks_port.is_some() - || http_port.is_some() - || mixed_port.is_some() - { - if !generated { - Config::generate().await?; - CoreManager::global().run_core().await?; - } + || http_port.is_some() || mixed_port.is_some()) && !generated { + Config::generate().await?; + CoreManager::global().run_core().await?; } if auto_launch.is_some() { sysopt::Sysopt::global().update_launch()?; diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs index a44a1ce0..e4030620 100644 --- a/src-tauri/src/utils/dirs.rs +++ b/src-tauri/src/utils/dirs.rs @@ -48,11 +48,11 @@ pub fn app_home_dir() -> Result { match app_handle.path().data_dir() { Ok(dir) => { - return Ok(dir.join(APP_ID)); + 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")); + Err(anyhow::anyhow!("Failed to get the app homedirectory")) } } } @@ -62,13 +62,13 @@ pub fn app_resources_dir() -> Result { let app_handle = handle::Handle::global().app_handle().unwrap(); match app_handle.path().resource_dir() { Ok(dir) => { - return Ok(dir.join("resources")); + 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 directory")) } - }; + } } /// profiles dir diff --git a/src-tauri/src/utils/init.rs b/src-tauri/src/utils/init.rs index d7ee89a9..e56e7718 100644 --- a/src-tauri/src/utils/init.rs +++ b/src-tauri/src/utils/init.rs @@ -332,7 +332,7 @@ pub async fn startup_script() -> Result<()> { app_handle .shell() .command(shell_type) - .current_dir(working_dir.to_path_buf()) + .current_dir(working_dir) .args(&[script_path]) .output() .await?; From 4b20b65a2276ab3d7630562a154e2514195f64c3 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 24 Sep 2024 20:09:30 +0800 Subject: [PATCH 059/288] fix: code lint --- src-tauri/src/core/clash_api.rs | 2 +- src-tauri/src/core/hotkey.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/core/clash_api.rs b/src-tauri/src/core/clash_api.rs index 71518efa..0e89b625 100644 --- a/src-tauri/src/core/clash_api.rs +++ b/src-tauri/src/core/clash_api.rs @@ -135,7 +135,7 @@ 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()); assert_eq!(res1, res3); diff --git a/src-tauri/src/core/hotkey.rs b/src-tauri/src/core/hotkey.rs index cb486d89..9f56bc5b 100755 --- a/src-tauri/src/core/hotkey.rs +++ b/src-tauri/src/core/hotkey.rs @@ -110,7 +110,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| { From 3bcd8b8b2c5ace8b15e9b736a2a79d5210428777 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 24 Sep 2024 20:11:33 +0800 Subject: [PATCH 060/288] fix: code lint --- src-tauri/src/core/clash_api.rs | 2 +- src-tauri/src/enhance/merge.rs | 2 +- src-tauri/src/enhance/script.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/core/clash_api.rs b/src-tauri/src/core/clash_api.rs index 0e89b625..4a21fa28 100644 --- a/src-tauri/src/core/clash_api.rs +++ b/src-tauri/src/core/clash_api.rs @@ -127,7 +127,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 {}'" diff --git a/src-tauri/src/enhance/merge.rs b/src-tauri/src/enhance/merge.rs index 3061e9fa..0aa81e7e 100644 --- a/src-tauri/src/enhance/merge.rs +++ b/src-tauri/src/enhance/merge.rs @@ -54,7 +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))?; + 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 51cbfbad..22ad0cef 100644 --- a/src-tauri/src/enhance/script.rs +++ b/src-tauri/src/enhance/script.rs @@ -103,7 +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(); + let _ = serde_yaml::to_string(&config).unwrap(); dbg!(results); } From 08b1160d63fb40636fb1c6190fc5e8e240ef0910 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 25 Sep 2024 11:47:01 +0800 Subject: [PATCH 061/288] chore: remove useless exit codes --- src-tauri/src/cmds.rs | 2 +- src-tauri/src/core/hotkey.rs | 3 ++- src-tauri/src/core/tray.rs | 2 +- src-tauri/src/feat.rs | 11 +++++++---- src-tauri/src/lib.rs | 6 ++++-- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index 66283b71..cc79e760 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -372,7 +372,7 @@ pub fn open_devtools(app_handle: tauri::AppHandle) { #[tauri::command] pub fn exit_app() { - feat::quit(); + feat::quit(Some(0)); } pub mod service { diff --git a/src-tauri/src/core/hotkey.rs b/src-tauri/src/core/hotkey.rs index 9f56bc5b..3d685c63 100755 --- a/src-tauri/src/core/hotkey.rs +++ b/src-tauri/src/core/hotkey.rs @@ -60,7 +60,8 @@ 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, + "quit" => || feat::quit(Some(0)), + _ => bail!("invalid function \"{func}\""), }; diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index a250c7da..7e8ac626 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -431,7 +431,7 @@ fn on_menu_event(app_handle: &AppHandle, event: MenuEvent) { "restart_app" => tauri::process::restart(&app_handle.env()), "quit" => { println!("quit"); - feat::quit(); + feat::quit(Some(0)); } _ => {} } diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 8b90684d..09b201ca 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -98,12 +98,12 @@ pub fn toggle_tun_mode() { }); } -pub fn quit() { +pub fn quit(code: Option) { let app_handle = handle::Handle::global().app_handle().unwrap(); let _ = resolve::save_window_size_position(true); resolve::resolve_reset(); - app_handle.exit(0); - std::process::exit(0); + app_handle.exit(code.unwrap_or(0)); + //std::process::exit(0); } /// 修改clash的订阅 @@ -200,7 +200,10 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { if (socks_enabled.is_some() || http_enabled.is_some() || socks_port.is_some() - || http_port.is_some() || mixed_port.is_some()) && !generated { + || http_port.is_some() + || mixed_port.is_some()) + && !generated + { Config::generate().await?; CoreManager::global().run_core().await?; } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 254f9d46..65715f27 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -134,8 +134,10 @@ pub fn run() { .expect("error while running tauri application"); app.run(|_, e| match e { - tauri::RunEvent::ExitRequested { api, .. } => { - api.prevent_exit(); + tauri::RunEvent::ExitRequested { api, code, .. } => { + if code.is_none() { + api.prevent_exit(); + } } tauri::RunEvent::WindowEvent { label, event, .. } => { if label == "main" { From 4eccedcd7852285a67bfc5298d51b21206788672 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 25 Sep 2024 13:54:05 +0800 Subject: [PATCH 062/288] fix: the save_indow_size_position method has been triggered twice, at the same time 1. remove windowEvent::destoryed hook --- src-tauri/src/lib.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 65715f27..85d39d97 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -142,10 +142,8 @@ pub fn run() { tauri::RunEvent::WindowEvent { label, event, .. } => { if label == "main" { match event { - tauri::WindowEvent::Destroyed => { - let _ = resolve::save_window_size_position(true); - } tauri::WindowEvent::CloseRequested { .. } => { + println!("closing window..."); let _ = resolve::save_window_size_position(true); } tauri::WindowEvent::Moved(_) | tauri::WindowEvent::Resized(_) => { From b8cb48aeada25ae71371ee48a0010f6fa9b68c8c Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 25 Sep 2024 15:44:05 +0800 Subject: [PATCH 063/288] chore: cover panic error --- src-tauri/src/utils/error.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src-tauri/src/utils/error.rs b/src-tauri/src/utils/error.rs index d661b609..8fe838a0 100644 --- a/src-tauri/src/utils/error.rs +++ b/src-tauri/src/utils/error.rs @@ -19,6 +19,11 @@ pub fn redirect_panic_to_log() { &format!("{:?}", payload) }; + //TODO skip this error + if payload.contains("PostMessage failed ; is the messages queue full?") { + return; + } + let location = panic_info .location() .map(|l| l.to_string()) From fc5c959a55d80e24725d799bf7dff214e8a36a9e Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 25 Sep 2024 15:45:12 +0800 Subject: [PATCH 064/288] chore: unified hotkey registration --- src-tauri/src/lib.rs | 2 ++ src/pages/_layout.tsx | 8 +------- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 85d39d97..a04561f1 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -158,6 +158,7 @@ pub fn run() { #[cfg(not(target_os = "macos"))] { log_err!(hotkey::Hotkey::global().register("Control+Q", "quit")); + log_err!(hotkey::Hotkey::global().register("Escape", "quit")); }; } tauri::WindowEvent::Focused(false) => { @@ -169,6 +170,7 @@ pub fn run() { #[cfg(not(target_os = "macos"))] { log_err!(hotkey::Hotkey::global().unregister("Control+Q")); + log_err!(hotkey::Hotkey::global().unregister("Escape")); }; } _ => {} diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx index df863302..9a7b6629 100644 --- a/src/pages/_layout.tsx +++ b/src/pages/_layout.tsx @@ -27,6 +27,7 @@ import "dayjs/locale/zh-cn"; import { getPortableFlag } from "@/services/cmds"; import React from "react"; import { TransitionGroup, CSSTransition } from "react-transition-group"; + const appWindow = getCurrentWebviewWindow(); export let portableFlag = false; @@ -48,13 +49,6 @@ const Layout = () => { if (!routersEles) return null; useEffect(() => { - window.addEventListener("keydown", (e) => { - // macOS有cmd+w - if (e.key === "Escape" && OS !== "macos") { - appWindow.close(); - } - }); - listen("verge://refresh-clash-config", async () => { // the clash info may be updated await getAxios(true); From ec2bf37ad4597aae24c5b74cabc412b0692ab022 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 25 Sep 2024 20:22:49 +0800 Subject: [PATCH 065/288] Revert "chore: cover panic error" This reverts commit b8cb48aeada25ae71371ee48a0010f6fa9b68c8c. --- src-tauri/src/utils/error.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src-tauri/src/utils/error.rs b/src-tauri/src/utils/error.rs index 8fe838a0..d661b609 100644 --- a/src-tauri/src/utils/error.rs +++ b/src-tauri/src/utils/error.rs @@ -19,11 +19,6 @@ pub fn redirect_panic_to_log() { &format!("{:?}", payload) }; - //TODO skip this error - if payload.contains("PostMessage failed ; is the messages queue full?") { - return; - } - let location = panic_info .location() .map(|l| l.to_string()) From 2aa3c8cfe1292408cc9f9cde68cff6457db33446 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 25 Sep 2024 21:07:01 +0800 Subject: [PATCH 066/288] chore: update --- src/components/test/test-item.tsx | 5 +++-- src/hooks/use-listen.ts | 34 +++++++++++++++++++++++++++++++ src/pages/_layout.tsx | 10 ++++++--- 3 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 src/hooks/use-listen.ts diff --git a/src/components/test/test-item.tsx b/src/components/test/test-item.tsx index faee6e37..a63e4c17 100644 --- a/src/components/test/test-item.tsx +++ b/src/components/test/test-item.tsx @@ -20,7 +20,7 @@ import delayManager from "@/services/delay"; import { cmdTestDelay, downloadIconCache } from "@/services/cmds"; import { listen, 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/hooks/use-listen.ts b/src/hooks/use-listen.ts new file mode 100644 index 00000000..87abac39 --- /dev/null +++ b/src/hooks/use-listen.ts @@ -0,0 +1,34 @@ +import { listen, UnlistenFn, EventCallback } from "@tauri-apps/api/event"; +import { event } from "@tauri-apps/api"; + +export const useListen = () => { + let unlistenFns: UnlistenFn[] = []; + + const addListener = async function ( + eventName: string, + handler: EventCallback + ) { + const unlisten = await listen(eventName, handler); + unlistenFns.push(unlisten); + return unlisten; + }; + const removeAllListeners = async function () { + for (const unlisten of unlistenFns) { + Promise.resolve(unlisten()).catch(console.error); + } + unlistenFns = []; + }; + + const setupCloseListener = async function () { + await event.once("tauri://close-requested", async () => { + console.log("Window close requested."); + await removeAllListeners(); + }); + }; + + return { + addListener, + removeAllListeners, + setupCloseListener, + }; +}; diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx index 9a7b6629..c62855ae 100644 --- a/src/pages/_layout.tsx +++ b/src/pages/_layout.tsx @@ -27,6 +27,7 @@ import "dayjs/locale/zh-cn"; import { getPortableFlag } from "@/services/cmds"; 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,10 +47,13 @@ const Layout = () => { const navigate = useNavigate(); const location = useLocation(); const routersEles = useRoutes(routers); + const { addListener, setupCloseListener } = useListen(); if (!routersEles) return null; + setupCloseListener(); + useEffect(() => { - listen("verge://refresh-clash-config", async () => { + addListener("verge://refresh-clash-config", async () => { // the clash info may be updated await getAxios(true); mutate("getProxies"); @@ -59,10 +63,10 @@ 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": From 7a9fd118a3949f6baa52689eedfe0ed5238f4473 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 25 Sep 2024 21:20:36 +0800 Subject: [PATCH 067/288] chore: update --- src/components/setting/mods/update-viewer.tsx | 6 ++++-- src/components/test/test-item.tsx | 2 +- src/pages/_layout.tsx | 1 - src/pages/profiles.tsx | 6 +++--- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/components/setting/mods/update-viewer.tsx b/src/components/setting/mods/update-viewer.tsx index d0887e6f..ca600ff6 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); diff --git a/src/components/test/test-item.tsx b/src/components/test/test-item.tsx index a63e4c17..dfb75315 100644 --- a/src/components/test/test-item.tsx +++ b/src/components/test/test-item.tsx @@ -18,7 +18,7 @@ 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 { diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx index c62855ae..19d4f8c0 100644 --- a/src/pages/_layout.tsx +++ b/src/pages/_layout.tsx @@ -6,7 +6,6 @@ import { useEffect } from "react"; import { useTranslation } from "react-i18next"; 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"; diff --git a/src/pages/profiles.tsx b/src/pages/profiles.tsx index f67c65a8..32731415 100644 --- a/src/pages/profiles.tsx +++ b/src/pages/profiles.tsx @@ -47,15 +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([]); @@ -69,7 +69,7 @@ const ProfilePage = () => { 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")) { From 053754fea8223513e6e128ea4d2676302a3cb80f Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 26 Sep 2024 12:20:57 +0800 Subject: [PATCH 068/288] chore: update --- src/hooks/use-listen.ts | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/hooks/use-listen.ts b/src/hooks/use-listen.ts index 87abac39..180a0774 100644 --- a/src/hooks/use-listen.ts +++ b/src/hooks/use-listen.ts @@ -1,34 +1,31 @@ import { listen, UnlistenFn, EventCallback } from "@tauri-apps/api/event"; import { event } from "@tauri-apps/api"; +import { useRef } from "react"; export const useListen = () => { - let unlistenFns: UnlistenFn[] = []; + const unlistenFns = useRef([]); - const addListener = async function ( + const addListener = async ( eventName: string, handler: EventCallback - ) { + ) => { const unlisten = await listen(eventName, handler); - unlistenFns.push(unlisten); + unlistenFns.current.push(unlisten); return unlisten; }; - const removeAllListeners = async function () { - for (const unlisten of unlistenFns) { - Promise.resolve(unlisten()).catch(console.error); - } - unlistenFns = []; + const removeAllListeners = () => { + unlistenFns.current.forEach((unlisten) => unlisten()); + unlistenFns.current = []; }; const setupCloseListener = async function () { await event.once("tauri://close-requested", async () => { - console.log("Window close requested."); - await removeAllListeners(); + removeAllListeners(); }); }; return { addListener, - removeAllListeners, setupCloseListener, }; }; From 5b822d238dbea3739620baed077ce480d287982b Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 26 Sep 2024 19:23:16 +0800 Subject: [PATCH 069/288] chore: update --- src-tauri/src/feat.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 09b201ca..252a39f7 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -100,10 +100,8 @@ pub fn toggle_tun_mode() { pub fn quit(code: Option) { let app_handle = handle::Handle::global().app_handle().unwrap(); - let _ = resolve::save_window_size_position(true); resolve::resolve_reset(); app_handle.exit(code.unwrap_or(0)); - //std::process::exit(0); } /// 修改clash的订阅 From e8ed7c1e3eba5c12d13f6c276849bc570ef67509 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 26 Sep 2024 19:47:00 +0800 Subject: [PATCH 070/288] chore: remove compatibility code --- src-tauri/src/core/core.rs | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index bdae8409..f90f9e2d 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -146,20 +146,6 @@ impl CoreManager { 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]; From 11a8e3465f1f7969419c5a2ea80fa63f62b9775b Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 26 Sep 2024 19:47:25 +0800 Subject: [PATCH 071/288] chore: update --- src-tauri/src/core/core.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index f90f9e2d..c2b835d0 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -144,7 +144,7 @@ impl CoreManager { 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()); + let clash_core = clash_core.unwrap_or("verge-mihomo".into()); let config_path = dirs::path_to_str(&config_path)?; From c50e8f9de82297552d2e8f65bd47fbd350b49dd4 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 27 Sep 2024 00:24:05 +0800 Subject: [PATCH 072/288] refactor: logic optimization --- src-tauri/src/cmds.rs | 2 +- src-tauri/src/core/core.rs | 197 ++++++++++++--------------------- src-tauri/src/feat.rs | 19 ++-- src-tauri/src/utils/resolve.rs | 2 +- 4 files changed, 86 insertions(+), 134 deletions(-) diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index cc79e760..9152151a 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -185,7 +185,7 @@ 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) + wrap_err!(CoreManager::global().restart_core().await) } /// get the system proxy diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index c2b835d0..40d2b53b 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -4,20 +4,18 @@ use crate::log_err; use crate::utils::dirs; use anyhow::{bail, Result}; use once_cell::sync::OnceCell; -use parking_lot::Mutex; use serde_yaml::Mapping; use std::{sync::Arc, time::Duration}; use sysinfo::{ProcessRefreshKind, RefreshKind, System}; -use tauri_plugin_shell::process::{CommandChild, CommandEvent}; +use tauri_plugin_shell::process::CommandEvent; use tauri_plugin_shell::ShellExt; +use tokio::sync::Mutex; use tokio::time::sleep; #[derive(Debug)] pub struct CoreManager { - sidecar: Arc>>, - #[allow(unused)] - use_service_mode: Arc>, + running: Arc>, } impl CoreManager { @@ -25,19 +23,15 @@ impl CoreManager { static CORE_MANAGER: OnceCell = OnceCell::new(); CORE_MANAGER.get_or_init(|| CoreManager { - sidecar: Arc::new(Mutex::new(None)), - use_service_mode: Arc::new(Mutex::new(false)), + running: Arc::new(Mutex::new(false)), }) } - pub fn init(&self) -> Result<()> { - 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(()) } @@ -47,21 +41,7 @@ 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)?; @@ -88,40 +68,54 @@ impl CoreManager { Ok(()) } - /// 启动核心 - pub async fn run_core(&self) -> Result<()> { - let config_path = Config::generate_file(ConfigType::Run)?; + /// 停止核心运行 + pub async fn stop_core(&self) -> Result<()> { + let mut running = self.running.lock().await; + if !*running { + log::debug!("core is not running"); + return Ok(()); + } + + let clash_core = { Config::verge().latest().clash_core.clone() }; + let clash_core = clash_core.unwrap_or("verge-mihomo".into()); // 关闭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(); - } - } + log_err!(clash_api::patch_configs(&disable).await); // 服务模式 - let enable = { Config::verge().latest().enable_service_mode }; - let enable = enable.unwrap_or(false); + let service_enable = { Config::verge().latest().enable_service_mode }; + let service_enable = service_enable.unwrap_or(false); + if service_enable { + log::debug!(target: "app", "stop the core by service"); + log_err!(service::stop_core_by_service().await); + return Ok(()); + } + kill_processes_by_name(clash_core.as_str()); + *running = false; - *self.use_service_mode.lock() = enable; + Ok(()) + } - if enable { + /// 启动核心 + pub async fn start_core(&self) -> Result<()> { + let mut running = self.running.lock().await; + if *running { + log::debug!("core is running"); + return Ok(()); + } + + let config_path = Config::generate_file(ConfigType::Run)?; + let clash_core = { Config::verge().latest().clash_core.clone() }; + let clash_core = clash_core.unwrap_or("verge-mihomo".into()); + // 服务模式 + let service_enable = { Config::verge().latest().enable_service_mode }; + let service_enable = service_enable.unwrap_or(false); + if service_enable { // 服务模式启动失败就直接运行sidecar log::debug!(target: "app", "try to run core in service mode"); @@ -131,27 +125,23 @@ impl CoreManager { } .await; match res { - Ok(_) => return Ok(()), + Ok(_) => { + return { + *running = true; + Ok(()) + } + } Err(err) => { - // 修改这个值,免得stop出错 - *self.use_service_mode.lock() = false; - log::error!(target: "app", "{err}"); + log::error!(target: "app start service err", "{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 clash_core = clash_core.unwrap_or("verge-mihomo".into()); - let config_path = dirs::path_to_str(&config_path)?; - let args = vec!["-d", app_dir, "-f", config_path]; - let app_handle = handle::Handle::global().app_handle().unwrap(); - let cmd = app_handle.shell().sidecar(clash_core)?; let (mut rx, _) = cmd.args(args).spawn()?; @@ -174,75 +164,21 @@ impl CoreManager { } CommandEvent::Terminated(_) => { log::info!(target: "app", "mihomo core terminated"); - let _ = CoreManager::global().recover_core(); break; } _ => {} } } }); - + *running = true; 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(); - } - } - }); - - Ok(()) - } - - /// 停止核心运行 - pub async fn stop_core(&self) -> Result<()> { - // 关闭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); - return Ok(()); - } - - let mut sidecar = self.sidecar.lock(); - let _ = sidecar.take(); - - 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(); - } + pub async fn restart_core(&self) -> Result<()> { + // 重新启动app + self.stop_core().await?; + self.start_core().await?; Ok(()) } @@ -267,7 +203,7 @@ impl CoreManager { // 清掉旧日志 Logger::global().clear_log(); - match self.run_core().await { + match self.restart_core().await { Ok(_) => { Config::verge().apply(); Config::runtime().apply(); @@ -313,3 +249,16 @@ impl CoreManager { Ok(()) } } + +fn kill_processes_by_name(process_name: &str) { + let mut system = System::new_with_specifics( + RefreshKind::new().with_processes(ProcessRefreshKind::everything()), + ); + + system.refresh_processes(); + let procs = system.processes_by_name(process_name); + for proc in procs { + log::debug!(target: "app", "Killing process: {}", proc.name()); + proc.kill(); + } +} diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 252a39f7..87c930ee 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -26,7 +26,7 @@ pub fn open_or_close_dashboard() { // 重启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"); @@ -112,7 +112,7 @@ 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(); } @@ -141,6 +141,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; @@ -168,6 +169,7 @@ 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; @@ -175,7 +177,7 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { log::debug!(target: "app", "change service mode to {}", service_mode.unwrap()); if !generated { Config::generate().await?; - CoreManager::global().run_core().await?; + CoreManager::global().restart_core().await?; generated = true; } } else if tun_mode.is_some() { @@ -184,14 +186,15 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { #[cfg(not(target_os = "windows"))] if (redir_enabled.is_some() || redir_port.is_some()) && !generated { Config::generate().await?; - CoreManager::global().run_core().await?; + CoreManager::global().restart_core().await?; generated = true; } + #[cfg(target_os = "linux")] if tproxy_enabled.is_some() || tproxy_port.is_some() { if !generated { Config::generate().await?; - CoreManager::global().run_core().await?; + CoreManager::global().restart_core().await?; generated = true; } } @@ -203,7 +206,7 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { && !generated { Config::generate().await?; - CoreManager::global().run_core().await?; + CoreManager::global().restart_core().await?; } if auto_launch.is_some() { sysopt::Sysopt::global().update_launch()?; @@ -243,11 +246,11 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { Ok(()) => { Config::verge().apply(); Config::verge().data().save_file()?; - Ok(()) + return Ok(()); } Err(err) => { Config::verge().discard(); - Err(err) + return Err(err); } } } diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 3159ff0e..79291590 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -79,7 +79,7 @@ pub async fn resolve_setup(app: &mut App) { log_err!(Config::init_config().await); log::trace!("launch core"); - log_err!(CoreManager::global().init()); + log_err!(CoreManager::global().init().await); // setup a simple http server for singleton log::trace!("launch embed server"); From cee872e9440a34e1b7bec9bc0353a38a4812fd50 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 27 Sep 2024 10:04:23 +0800 Subject: [PATCH 073/288] chore: remove compatibility code --- src-tauri/src/core/service.rs | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index a49659a5..ba69e5ec 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -137,7 +137,10 @@ pub async fn install_service(passwd: String) -> Result<()> { .output()?; let output = sudo( &passwd, - installer_path.to_string_lossy().replace(" ", "\\ ").to_string(), + installer_path + .to_string_lossy() + .replace(" ", "\\ ") + .to_string(), ) .output()?; @@ -244,7 +247,10 @@ pub async fn uninstall_service(passwd: String) -> Result<()> { .output()?; let output = sudo( &passwd, - uninstaller_path.to_string_lossy().replace(" ", "\\ ").to_string(), + uninstaller_path + .to_string_lossy() + .replace(" ", "\\ ") + .to_string(), ) .output()?; @@ -285,21 +291,7 @@ pub(super) async fn run_core_by_service(config_file: &PathBuf) -> Result<()> { } 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}"); From aef215d810704d2e26f54490d4d1c2249def7094 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 27 Sep 2024 10:05:31 +0800 Subject: [PATCH 074/288] chore: update --- src-tauri/src/core/service.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index ba69e5ec..670bcf5c 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -1,5 +1,4 @@ -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}; From 30ebfd84cfa8bf01aa17542585d3334aaa73d892 Mon Sep 17 00:00:00 2001 From: wonfen Date: Fri, 27 Sep 2024 14:08:50 +0800 Subject: [PATCH 075/288] chore: update bug report template --- .github/ISSUE_TEMPLATE/bug_report.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 542e9937..755eafbb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -24,7 +24,13 @@ body: id: description attributes: label: 问题描述 / Describe the bug - description: 详细清晰地描述你遇到的问题 / A clear and concise description of what the bug is + description: 详细清晰地描述你遇到的问题,并配合截图 / Describe the problem you encountered in detail and clearly, and provide screenshots + validations: + required: true + - type: textarea + attributes: + label: 软件版本 / Verge Version + description: 请提供Verge的具体版本,如果是alpha版本,请注明下载时间(精确到小时分钟) / Please provide the specific version of Verge. If it is an alpha version, please indicate the download time (accurate to hours and minutes) validations: required: true - type: textarea From ba1a7e0fd621a95ba861d9133e5bd22e9363a7f5 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 27 Sep 2024 22:25:23 +0800 Subject: [PATCH 076/288] ,fix: when updating the verge configuration, notification error --- src-tauri/src/feat.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 87c930ee..4355ddda 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -181,7 +181,7 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { generated = true; } } else if tun_mode.is_some() { - update_core_config().await?; + update_core_config(false).await?; } #[cfg(not(target_os = "windows"))] if (redir_enabled.is_some() || redir_port.is_some()) && !generated { @@ -287,22 +287,26 @@ 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) } } From 79d1539149e1ed11b30ce6a1b8dd27956a54295e Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 28 Sep 2024 12:37:01 +0800 Subject: [PATCH 077/288] refactor: logic optimization --- src-tauri/src/core/core.rs | 10 ++--- src-tauri/src/feat.rs | 82 +++++++++++++++++++++++--------------- 2 files changed, 53 insertions(+), 39 deletions(-) diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index 40d2b53b..fde97a5a 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -88,13 +88,9 @@ impl CoreManager { log_err!(clash_api::patch_configs(&disable).await); // 服务模式 - let service_enable = { Config::verge().latest().enable_service_mode }; - let service_enable = service_enable.unwrap_or(false); - if service_enable { - log::debug!(target: "app", "stop the core by service"); - log_err!(service::stop_core_by_service().await); - return Ok(()); - } + log::debug!(target: "app", "stop the core by service"); + log_err!(service::stop_core_by_service().await); + kill_processes_by_name(clash_core.as_str()); *running = false; diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 4355ddda..f0bc2bc8 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -170,46 +170,42 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { let http_enabled = patch.verge_http_enabled; let http_port = patch.verge_port; - let res = { + 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_guard_proxy = false; + let mut should_update_systray_part = false; + 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().restart_core().await?; - generated = true; - } - } else if tun_mode.is_some() { - update_core_config(false).await?; + should_restart_core = true; } + + if tun_mode.is_some() { + should_update_clash_config = true; + } + #[cfg(not(target_os = "windows"))] - if (redir_enabled.is_some() || redir_port.is_some()) && !generated { - Config::generate().await?; - CoreManager::global().restart_core().await?; - generated = true; + if redir_enabled.is_some() || redir_port.is_some() { + should_restart_core = true; } #[cfg(target_os = "linux")] if tproxy_enabled.is_some() || tproxy_port.is_some() { - if !generated { - Config::generate().await?; - CoreManager::global().restart_core().await?; - generated = true; - } + should_restart_core = true; } - if (socks_enabled.is_some() + if socks_enabled.is_some() || http_enabled.is_some() || socks_port.is_some() || http_port.is_some() - || mixed_port.is_some()) - && !generated + || mixed_port.is_some() { - Config::generate().await?; - CoreManager::global().restart_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() @@ -217,16 +213,12 @@ 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; + should_update_guard_proxy = true; } if let Some(true) = patch.enable_proxy_guard { - sysopt::Sysopt::global().guard_proxy(); - } - - if let Some(hotkeys) = patch.hotkeys { - hotkey::Hotkey::global().update(hotkeys)?; + should_update_guard_proxy = true; } if language.is_some() @@ -237,6 +229,31 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { || 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()?; + } + if should_update_guard_proxy { + sysopt::Sysopt::global().guard_proxy(); + } + + if let Some(hotkeys) = patch.hotkeys { + hotkey::Hotkey::global().update(hotkeys)?; + } + + if should_update_systray_part { handle::Handle::update_systray_part()?; } @@ -246,6 +263,7 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { Ok(()) => { Config::verge().apply(); Config::verge().data().save_file()?; + return Ok(()); } Err(err) => { From b3d93d07619087e732bd6ee8640f6d1e736beda6 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 28 Sep 2024 20:20:40 +0800 Subject: [PATCH 078/288] chore: update --- package.json | 2 +- pnpm-lock.yaml | 90 +++++++++++++++++++++++++------------------------- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/package.json b/package.json index 31c5c6f6..5a2715bb 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ }, "devDependencies": { "@actions/github": "^5.1.1", - "@tauri-apps/cli": "2.0.0-rc.16", + "@tauri-apps/cli": "2.0.0-rc.17", "@types/js-cookie": "^3.0.6", "@types/js-yaml": "^4.0.9", "@types/lodash-es": "^4.17.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d02e5f17..21481811 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,8 +153,8 @@ importers: specifier: ^5.1.1 version: 5.1.1 "@tauri-apps/cli": - specifier: 2.0.0-rc.16 - version: 2.0.0-rc.16 + specifier: 2.0.0-rc.17 + version: 2.0.0-rc.17 "@types/js-cookie": specifier: ^3.0.6 version: 3.0.6 @@ -2100,100 +2100,100 @@ packages: integrity: sha512-UNiIhhKG08j4ooss2oEEVexffmWkgkYlC2M3GcX3VPtNsqFgVNL8Mcw/4Y7rO9M9S+ffAMnLOF5ypzyuyb8tyg==, } - "@tauri-apps/cli-darwin-arm64@2.0.0-rc.16": + "@tauri-apps/cli-darwin-arm64@2.0.0-rc.17": resolution: { - integrity: sha512-lISZU4gG0c9PbY7h/j/gW7nJLxZEygNBrYEET6zN8R99Znf5rSO+CfjenaMcJUUj6yTAd8gzdakRpLqNSAWegA==, + integrity: sha512-LXlLpavNfhvELPBcjCzQ9DOLx7rlAzZM4iltsaKawAewx30Q0EpIjK53Sg5AR3p5/KzNfCsTMjjpeUZg1AcFgw==, } engines: { node: ">= 10" } cpu: [arm64] os: [darwin] - "@tauri-apps/cli-darwin-x64@2.0.0-rc.16": + "@tauri-apps/cli-darwin-x64@2.0.0-rc.17": resolution: { - integrity: sha512-D9uxPCxpyYcTSQulJGFX3POAKPOJd8WcWHFH8x6YVM1cIx6EWRXIE1sZnPUOjFr7qCg+bSdYdr8/BFHcZGcApQ==, + integrity: sha512-86jlpD9DQEMdPCu+foqady2Kov3u151Pgs1uOdA3SQxXph4L31T7j26axIhADLYZH6T1be+lSVPm6+fp0iXGgw==, } engines: { node: ">= 10" } cpu: [x64] os: [darwin] - "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.16": + "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.17": resolution: { - integrity: sha512-WsVdKm4D1I1XV8I9yRnmOINZRwwWfh6xcLV3m19+B9g6TohK8RkRxWfxvs3TLQlWOLQ6lo8BzS9rzXB+KtjDpg==, + integrity: sha512-ZFZeVBFdM9ogNebqzU3vo6f662YwmnE5XzeT6UEKUy+df49Fw2Npebmg0t/BPoF9e/nEgK1w1Jy68aK2JISscg==, } engines: { node: ">= 10" } cpu: [arm] os: [linux] - "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.16": + "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.17": resolution: { - integrity: sha512-2jpZDagNs6rrqposHJihHBayttgOl5aB2+bYiVEC6ye+haiFtmYmpdaPOaVIw+YVQs6lepf5PVrisCoU9DmYsg==, + integrity: sha512-GvO7BNJL6y8CumvaidJ+cEXn0KRaCzhmwtrMfTEl9jsqhGYvmNXuOlZR41hgoy6CQtUiu11ZGoBtU37/lxEKaQ==, } engines: { node: ">= 10" } cpu: [arm64] os: [linux] - "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.16": + "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.17": resolution: { - integrity: sha512-SNEDcB+sWOls/B0a+UpUHVa/oegvlXXKYWsTxuXtgWIr5VbWG7rXLZ3fZpLLP3SpRVGTGTnABcyqshFbWSqqKQ==, + integrity: sha512-DypDS3rJjcKzpgZKqHsCrzVGDbjo17XcYNhAYd2VxvXmGVAq05eZ71jLYHSSofXTxbpLZMcGKaino0jKyX1mOA==, } engines: { node: ">= 10" } cpu: [arm64] os: [linux] - "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.16": + "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.17": resolution: { - integrity: sha512-Zsq29MM1ooeH1+chQBa7ffDFnzAZebBBFdsvs4e05tS1H8gn4oKE+PSMn9p/okzVXykEk9ri2/n7BG1XFeifMA==, + integrity: sha512-nKCAJtC4b9HnVpDsCVXASPEXOEIZb/HFmdRPuKiYXmpziL5OByCJLjhVx5EFhpVtqAg1isCmOutqKc8Nmw1QQQ==, } engines: { node: ">= 10" } cpu: [x64] os: [linux] - "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.16": + "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.17": resolution: { - integrity: sha512-g+pwSuis2YMxhJJ/pJYwp/Nps5CWvlv/5MV5UfDvClkCkeAyzIqVX+HbBLPcs5S0CePUQNeP0j4d4jBWUqZZQg==, + integrity: sha512-cSi3M/hcNo+NubSKJG96Af6o6cL38RCvP0ImFiyIOU/adYmW0bQGWI4u/eL14IpdNCR1pbifgEcQL6dteyod0g==, } engines: { node: ">= 10" } cpu: [x64] os: [linux] - "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.16": + "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.17": resolution: { - integrity: sha512-PpPqdMTwJSDAK4KnNjvh77ShSkY+7pih1f6e50EtXar8bjC17e3XcEqFhDNne5mxEVTLYhibs6p1JLPad0ZjRA==, + integrity: sha512-hMtNtm2zXvUwzzTEJIf/GQplWHNLEeAjiLGaX9sS2Me96X/OzU1PUXcWTYdjVA102cf6q//0/pgpPo/Yn480KA==, } engines: { node: ">= 10" } cpu: [arm64] os: [win32] - "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.16": + "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.17": resolution: { - integrity: sha512-io2yIcEcG7YLP+9n13NbilB93SjcB7jIl8GbURC4XZT4/4t9D1PWHpJr5hySVsGRLCz5e8NzwC5RlnenNzmpPQ==, + integrity: sha512-XO+zgvYvpz65aYbXMyFhej4Td5sEK7bSLPr2+8BigiI7F4tHaS7KJpYVtJtjHQtAo6KBy/bT8P9VW6xM4G+YVA==, } engines: { node: ">= 10" } cpu: [ia32] os: [win32] - "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.16": + "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.17": resolution: { - integrity: sha512-Rfkmxe3k+cBVA/kVYt8O25QrQqWKJlH9AiH7Q3C6xBzzG9PCSRMBszCp+JhBF8jhVlwNmOBv6UG+lm85kspwGg==, + integrity: sha512-sVV0o9careFJuL3fTtkp6ed8X4FGGfMyK1WbXR5ci4Z2dn94wIJuefzTnGaQnvur4PaEJQ9WmTlQ2Pe3UrokBQ==, } engines: { node: ">= 10" } cpu: [x64] os: [win32] - "@tauri-apps/cli@2.0.0-rc.16": + "@tauri-apps/cli@2.0.0-rc.17": resolution: { - integrity: sha512-wdjZg/M3dcxiqgWG6VRnABpX0dYxRww93t0d1MYoZxFDrnyoUz5kYwFQ0v4J9u0qenEgskjoypvon7V/Nj9qrg==, + integrity: sha512-7YQljT+izYmhLqsI5G2xg3AHBPx3gAHc+gB/s+NKqdSL4CuGImLiii8Rw/qBtuJpWFWLJiaGXnpra35zrSlknQ==, } engines: { node: ">= 10" } hasBin: true @@ -5994,48 +5994,48 @@ snapshots: "@tauri-apps/api@2.0.0-rc.4": {} - "@tauri-apps/cli-darwin-arm64@2.0.0-rc.16": + "@tauri-apps/cli-darwin-arm64@2.0.0-rc.17": optional: true - "@tauri-apps/cli-darwin-x64@2.0.0-rc.16": + "@tauri-apps/cli-darwin-x64@2.0.0-rc.17": optional: true - "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.16": + "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.17": optional: true - "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.16": + "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.17": optional: true - "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.16": + "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.17": optional: true - "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.16": + "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.17": optional: true - "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.16": + "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.17": optional: true - "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.16": + "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.17": optional: true - "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.16": + "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.17": optional: true - "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.16": + "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.17": optional: true - "@tauri-apps/cli@2.0.0-rc.16": + "@tauri-apps/cli@2.0.0-rc.17": optionalDependencies: - "@tauri-apps/cli-darwin-arm64": 2.0.0-rc.16 - "@tauri-apps/cli-darwin-x64": 2.0.0-rc.16 - "@tauri-apps/cli-linux-arm-gnueabihf": 2.0.0-rc.16 - "@tauri-apps/cli-linux-arm64-gnu": 2.0.0-rc.16 - "@tauri-apps/cli-linux-arm64-musl": 2.0.0-rc.16 - "@tauri-apps/cli-linux-x64-gnu": 2.0.0-rc.16 - "@tauri-apps/cli-linux-x64-musl": 2.0.0-rc.16 - "@tauri-apps/cli-win32-arm64-msvc": 2.0.0-rc.16 - "@tauri-apps/cli-win32-ia32-msvc": 2.0.0-rc.16 - "@tauri-apps/cli-win32-x64-msvc": 2.0.0-rc.16 + "@tauri-apps/cli-darwin-arm64": 2.0.0-rc.17 + "@tauri-apps/cli-darwin-x64": 2.0.0-rc.17 + "@tauri-apps/cli-linux-arm-gnueabihf": 2.0.0-rc.17 + "@tauri-apps/cli-linux-arm64-gnu": 2.0.0-rc.17 + "@tauri-apps/cli-linux-arm64-musl": 2.0.0-rc.17 + "@tauri-apps/cli-linux-x64-gnu": 2.0.0-rc.17 + "@tauri-apps/cli-linux-x64-musl": 2.0.0-rc.17 + "@tauri-apps/cli-win32-arm64-msvc": 2.0.0-rc.17 + "@tauri-apps/cli-win32-ia32-msvc": 2.0.0-rc.17 + "@tauri-apps/cli-win32-x64-msvc": 2.0.0-rc.17 "@tauri-apps/plugin-clipboard-manager@2.0.0-rc.0": dependencies: From 709ab3dd88d54b206f5453b57074e10fff53db07 Mon Sep 17 00:00:00 2001 From: wonfen Date: Mon, 30 Sep 2024 01:04:15 +0800 Subject: [PATCH 079/288] chore: add service mode info --- src/components/setting/setting-system.tsx | 5 ++++- src/locales/en.json | 4 ++-- src/locales/fa.json | 2 +- src/locales/ru.json | 2 +- src/locales/zh.json | 4 ++-- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/components/setting/setting-system.tsx b/src/components/setting/setting-system.tsx index 7686c8f6..bb827b7b 100644 --- a/src/components/setting/setting-system.tsx +++ b/src/components/setting/setting-system.tsx @@ -86,7 +86,10 @@ const SettingSystem = ({ onError }: Props) => { - + } + > Date: Mon, 30 Sep 2024 23:07:46 +0800 Subject: [PATCH 080/288] chore: remove the manual release lock --- src-tauri/src/core/sysopt.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index 57ea66c4..af3fb0c7 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -160,14 +160,10 @@ impl Sysopt { ) }; 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(); } From 0b8f24a92eeb150e0c6b5ffe8649264d4ea7538f Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 1 Oct 2024 00:27:08 +0800 Subject: [PATCH 081/288] chore: optimize lock --- src-tauri/src/core/sysopt.rs | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index af3fb0c7..ff7335b3 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -339,18 +339,10 @@ impl Sysopt { /// read config from file directly pub fn guard_proxy(&self) { use tokio::time::{sleep, Duration}; - let guard_state = self.guard_state.clone(); 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); - + let _ = guard_state.lock().await; // default duration is 10s let mut wait_secs = 10u64; @@ -402,10 +394,6 @@ impl Sysopt { log_err!(sysproxy.set_system_proxy()); } } - - let mut state = guard_state.lock().await; - *state = false; - drop(state); }); } } From 0e1e54aff41ba281023597af18883f1903b5813d Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 1 Oct 2024 20:49:03 +0800 Subject: [PATCH 082/288] feat: test item, when icon is svg, add svg format check --- src/components/test/test-viewer.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/components/test/test-viewer.tsx b/src/components/test/test-viewer.tsx index 00d7f8d0..97601fec 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(" Date: Wed, 2 Oct 2024 17:43:14 +0800 Subject: [PATCH 083/288] chore: replace sysproxy-rs repo --- src-tauri/Cargo.lock | 2 +- src-tauri/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index bfcc5e9e..7453f48c 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -5783,7 +5783,7 @@ dependencies = [ [[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", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 7684590b..8fe8fbf6 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -36,7 +36,7 @@ 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" } +sysproxy = { git = "https://github.com/clash-verge-rev/sysproxy-rs", branch = "main" } tauri = { version = "2.0.0-rc", features = [ "protocol-asset", "devtools", From 335578dd9174e0e189564d1c00fd50e5d00e9a37 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 3 Oct 2024 01:31:37 +0800 Subject: [PATCH 084/288] refactor: simplify sysproxy logic 1. close all proxies directly when reset_proxy 2. init_sysproxy and update_sysproxy combined into one 3. optimize lock usage 4 ptimize the thread loop of guard_sysproxy, --- src-tauri/src/core/sysopt.rs | 199 ++++++++------------------------- src-tauri/src/feat.rs | 9 -- src-tauri/src/utils/resolve.rs | 3 +- 3 files changed, 48 insertions(+), 163 deletions(-) diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index ff7335b3..9db819cc 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -10,25 +10,13 @@ use std::env::current_exe; use std::sync::Arc; use sysproxy::{Autoproxy, Sysproxy}; use tauri::async_runtime::Mutex as TokioMutex; +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>>, - /// record whether the guard async is running or not guard_state: Arc>, } @@ -78,19 +66,23 @@ fn get_bypass() -> String { 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)), + update_sysproxy: Arc::new(TokioMutex::new(false)), + reset_sysproxy: Arc::new(TokioMutex::new(false)), auto_launch: Arc::new(Mutex::new(None)), guard_state: Arc::new(TokioMutex::new(false)), }) } + pub fn init_guard_sysproxy(&self) -> Result<()> { + self.guard_proxy(); + Ok(()) + } + /// init the sysproxy - pub fn init_sysproxy(&self) -> Result<()> { + pub fn update_sysproxy(&self) -> Result<()> { + let _ = self.update_sysproxy.lock(); + let port = Config::verge() .latest() .verge_mixed_port @@ -105,6 +97,11 @@ impl Sysopt { verge.proxy_auto_config.unwrap_or(false), ) }; + + if enable == false { + return Ok(()); + } + let mut sys = Sysproxy { enable, host: String::from("127.0.0.1"), @@ -117,141 +114,32 @@ impl Sysopt { }; if pac { sys.enable = false; - let old = Sysproxy::get_system_proxy().ok(); + auto.enable = true; 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(); + sys.enable = true; 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 - 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()) { - return self.init_sysproxy(); - } - - if !pac && (cur_sysproxy.is_none() || old_sysproxy.is_none()) { - return self.init_sysproxy(); - } - - let port = Config::verge() - .latest() - .verge_mixed_port - .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 mut autoproxy = cur_autoproxy.take().unwrap(); - autoproxy.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); - } - + //self.guard_proxy(); 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 _ = self.reset_sysproxy.lock(); + //直接关闭所有代理 + let mut sysproxy: Sysproxy = Sysproxy::get_system_proxy()?; + sysproxy.enable = false; + sysproxy.set_system_proxy()?; - 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"); - } - - 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"); - } + let mut autoproxy = Autoproxy::get_auto_proxy()?; + autoproxy.enable = false; + autoproxy.set_auto_proxy()?; Ok(()) } @@ -319,10 +207,6 @@ impl Sysopt { 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 enable = { Config::verge().latest().enable_auto_launch }; let enable = enable.unwrap_or(false); let auto_launch = auto_launch.as_ref().unwrap(); @@ -335,14 +219,9 @@ impl Sysopt { 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 _ = self.guard_state.lock(); tauri::async_runtime::spawn(async move { - let _ = guard_state.lock().await; // default duration is 10s let mut wait_secs = 10u64; @@ -362,7 +241,7 @@ impl Sysopt { // stop loop if !enable || !guard { - break; + continue; } // update duration @@ -370,6 +249,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_ok() || !autoproxy.is_ok() { + 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() diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index f0bc2bc8..40ab351d 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -175,7 +175,6 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { let mut should_update_clash_config = false; let mut should_update_launch = false; let mut should_update_sysproxy = false; - let mut should_update_guard_proxy = false; let mut should_update_systray_part = false; let service_mode = patch.enable_service_mode; @@ -214,11 +213,6 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { || pac_content.is_some() { should_update_sysproxy = true; - should_update_guard_proxy = true; - } - - if let Some(true) = patch.enable_proxy_guard { - should_update_guard_proxy = true; } if language.is_some() @@ -245,9 +239,6 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { if should_update_sysproxy { sysopt::Sysopt::global().update_sysproxy()?; } - if should_update_guard_proxy { - sysopt::Sysopt::global().guard_proxy(); - } if let Some(hotkeys) = patch.hotkeys { hotkey::Hotkey::global().update(hotkeys)?; diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 79291590..f31dee98 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -94,7 +94,8 @@ pub async fn resolve_setup(app: &mut App) { } log_err!(sysopt::Sysopt::global().init_launch()); - log_err!(sysopt::Sysopt::global().init_sysproxy()); + log_err!(sysopt::Sysopt::global().update_sysproxy()); + log_err!(sysopt::Sysopt::global().init_guard_sysproxy()); log_err!(handle::Handle::update_systray_part()); log_err!(hotkey::Hotkey::global().init()); From bf1f201d4b9452e8fbebd9273d5e71bd9e4d2b13 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 3 Oct 2024 02:09:22 +0800 Subject: [PATCH 085/288] =?UTF-8?q?feat=EF=BC=9A=20windows=20uses=20syspro?= =?UTF-8?q?xy.exe=20for=20system=20proxy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/check.mjs | 12 +++ src-tauri/src/core/sysopt.rs | 143 +++++++++++++++++++++++++++-------- 2 files changed, 123 insertions(+), 32 deletions(-) diff --git a/scripts/check.mjs b/scripts/check.mjs index bf22a2f0..ab0eac92 100644 --- a/scripts/check.mjs +++ b/scripts/check.mjs @@ -422,6 +422,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 }, { @@ -455,6 +461,12 @@ const tasks = [ retry: 1, unixOnly: true, }, + { + name: "windows-sysproxy", + func: resolveWinSysproxy, + retry: 5, + winOnly: true, + }, ]; async function runTask() { diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index 9db819cc..87126ff4 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -98,34 +98,80 @@ impl Sysopt { ) }; - if enable == false { - return Ok(()); + #[cfg(not(target_os = "windows"))] + { + 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; + auto.enable = true; + sys.set_system_proxy()?; + auto.set_auto_proxy()?; + } else { + auto.enable = false; + sys.enable = true; + auto.set_auto_proxy()?; + sys.set_system_proxy()?; + } + } + #[cfg(target_os = "windows")] + { + if !enable { + return self.reset_sysproxy(); + } + 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::app_resources_dir()?; + 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 { + let address = format!("http://{}:{}/pac", "127.0.0.1", port); + let output = tauri::async_runtime::block_on(async move { + shell + .command(sysproxy_exe.as_path().to_str().unwrap()) + .args(["opac", address.as_str()]) + .output() + .await + .unwrap() + }); + output + } else { + let address = format!("{}:{}", "127.0.0.1", port); + let bypass = get_bypass(); + let output = tauri::async_runtime::block_on(async move { + 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"); + } } - 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; - auto.enable = true; - sys.set_system_proxy()?; - auto.set_auto_proxy()?; - } else { - auto.enable = false; - sys.enable = true; - auto.set_auto_proxy()?; - sys.set_system_proxy()?; - } - - // run the system proxy guard - //self.guard_proxy(); Ok(()) } @@ -133,13 +179,46 @@ impl Sysopt { pub fn reset_sysproxy(&self) -> Result<()> { let _ = self.reset_sysproxy.lock(); //直接关闭所有代理 - let mut sysproxy: Sysproxy = Sysproxy::get_system_proxy()?; - sysproxy.enable = false; - sysproxy.set_system_proxy()?; + #[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()?; + } - let mut autoproxy = Autoproxy::get_auto_proxy()?; - autoproxy.enable = false; - autoproxy.set_auto_proxy()?; + #[cfg(target_os = "windows")] + { + 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::app_resources_dir()?; + 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 = tauri::async_runtime::block_on(async move { + shell + .command(sysproxy_exe.as_path().to_str().unwrap()) + .args(["set", "1"]) + .output() + .await + .unwrap() + }); + + if !output.status.success() { + bail!("sysproxy exe run failed"); + } + } Ok(()) } From 2685a02e1a43ec1c1c76557229afc57977e8802c Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 3 Oct 2024 12:01:06 +0800 Subject: [PATCH 086/288] chore: update --- src-tauri/src/core/sysopt.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index 87126ff4..cd04e747 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -143,7 +143,7 @@ impl Sysopt { let shell = app_handle.shell(); let output = if pac { - let address = format!("http://{}:{}/pac", "127.0.0.1", port); + let address = format!("http://{}:{}/pac", "127.0.0.1", pac_port); let output = tauri::async_runtime::block_on(async move { shell .command(sysproxy_exe.as_path().to_str().unwrap()) From a626f2ce294faeacbd21f6ed0bb1001dfedd37b0 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 3 Oct 2024 14:31:40 +0800 Subject: [PATCH 087/288] chore: update --- src-tauri/src/core/sysopt.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index cd04e747..7ddeec30 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -134,9 +134,8 @@ impl Sysopt { let app_handle = Handle::global().app_handle().unwrap(); - let binary_path = dirs::app_resources_dir()?; + 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"); } @@ -198,7 +197,7 @@ impl Sysopt { let app_handle = Handle::global().app_handle().unwrap(); - let binary_path = dirs::app_resources_dir()?; + let binary_path = dirs::service_path()?; let sysproxy_exe = binary_path.with_file_name("sysproxy.exe"); if !sysproxy_exe.exists() { From 6b902a7ad82bb6dd27856a7e0d0b4427bd988b16 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 4 Oct 2024 05:27:59 +0800 Subject: [PATCH 088/288] chore: update --- src-tauri/src/core/sysopt.rs | 48 +++++++++++++++------------------- src-tauri/src/feat.rs | 2 +- src-tauri/src/utils/resolve.rs | 4 +-- 3 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index 7ddeec30..a332f60e 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -80,7 +80,7 @@ impl Sysopt { } /// init the sysproxy - pub fn update_sysproxy(&self) -> Result<()> { + pub async fn update_sysproxy(&self) -> Result<()> { let _ = self.update_sysproxy.lock(); let port = Config::verge() @@ -125,7 +125,7 @@ impl Sysopt { #[cfg(target_os = "windows")] { if !enable { - return self.reset_sysproxy(); + return self.reset_sysproxy().await; } use crate::core::handle::Handle; use crate::utils::dirs; @@ -143,26 +143,22 @@ impl Sysopt { let shell = app_handle.shell(); let output = if pac { let address = format!("http://{}:{}/pac", "127.0.0.1", pac_port); - let output = tauri::async_runtime::block_on(async move { - shell - .command(sysproxy_exe.as_path().to_str().unwrap()) - .args(["opac", address.as_str()]) - .output() - .await - .unwrap() - }); + let output = shell + .command(sysproxy_exe.as_path().to_str().unwrap()) + .args(["opac", address.as_str()]) + .output() + .await + .unwrap(); output } else { let address = format!("{}:{}", "127.0.0.1", port); let bypass = get_bypass(); - let output = tauri::async_runtime::block_on(async move { - shell - .command(sysproxy_exe.as_path().to_str().unwrap()) - .args(["global", address.as_str(), bypass.as_ref()]) - .output() - .await - .unwrap() - }); + let output = shell + .command(sysproxy_exe.as_path().to_str().unwrap()) + .args(["global", address.as_str(), bypass.as_ref()]) + .output() + .await + .unwrap(); output }; @@ -175,7 +171,7 @@ impl Sysopt { } /// reset the sysproxy - pub fn reset_sysproxy(&self) -> Result<()> { + pub async fn reset_sysproxy(&self) -> Result<()> { let _ = self.reset_sysproxy.lock(); //直接关闭所有代理 #[cfg(not(target_os = "windows"))] @@ -205,14 +201,12 @@ impl Sysopt { } let shell = app_handle.shell(); - let output = tauri::async_runtime::block_on(async move { - shell - .command(sysproxy_exe.as_path().to_str().unwrap()) - .args(["set", "1"]) - .output() - .await - .unwrap() - }); + let output = shell + .command(sysproxy_exe.as_path().to_str().unwrap()) + .args(["set", "1"]) + .output() + .await + .unwrap(); if !output.status.success() { bail!("sysproxy exe run failed"); diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 40ab351d..261f2ea4 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -237,7 +237,7 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { } if should_update_sysproxy { - sysopt::Sysopt::global().update_sysproxy()?; + sysopt::Sysopt::global().update_sysproxy().await?; } if let Some(hotkeys) = patch.hotkeys { diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index f31dee98..6c7a28bc 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -94,7 +94,7 @@ pub async fn resolve_setup(app: &mut App) { } log_err!(sysopt::Sysopt::global().init_launch()); - log_err!(sysopt::Sysopt::global().update_sysproxy()); + log_err!(sysopt::Sysopt::global().update_sysproxy().await); log_err!(sysopt::Sysopt::global().init_guard_sysproxy()); log_err!(handle::Handle::update_systray_part()); @@ -104,8 +104,8 @@ pub async fn resolve_setup(app: &mut App) { /// 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); }); From aa4b1ad8e86ddf3fbe80d111a24f4654dd8f47b9 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 4 Oct 2024 05:37:53 +0800 Subject: [PATCH 089/288] chore: update --- src-tauri/src/core/sysopt.rs | 71 +++++++++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 14 deletions(-) diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index a332f60e..ee7be0c8 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -342,22 +342,65 @@ 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()); + } } + + // #[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://{}:{}/pac", "127.0.0.1", pac_port); + let output = shell + .command(sysproxy_exe.as_path().to_str().unwrap()) + .args(["opac", 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() { + break; + } + }; } }); } From 477d1f2aeed318e4bb38092dc8162e20259c4e51 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 4 Oct 2024 22:38:06 +0800 Subject: [PATCH 090/288] feat: add color to log --- package.json | 1 + pnpm-lock.yaml | 180 ++++++++++++++++++++++++++++++++++++++++++++++ scripts/check.mjs | 37 +++++----- scripts/utils.mjs | 11 +++ 4 files changed, 211 insertions(+), 18 deletions(-) create mode 100644 scripts/utils.mjs diff --git a/package.json b/package.json index 5a2715bb..0bf9cf26 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "@types/json-schema": "^7.0.15", "ahooks": "^3.8.0", "axios": "^1.7.2", + "cli-color": "^2.0.4", "dayjs": "1.11.5", "foxact": "^0.2.35", "i18next": "^23.11.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 21481811..64a42352 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -73,6 +73,9 @@ importers: axios: specifier: ^1.7.2 version: 1.7.2 + cli-color: + specifier: ^2.0.4 + version: 2.0.4 dayjs: specifier: 1.11.5 version: 1.11.5 @@ -2624,6 +2627,13 @@ packages: } engines: { node: ">=10" } + cli-color@2.0.4: + resolution: + { + integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==, + } + engines: { node: ">=0.10" } + client-only@0.0.1: resolution: { @@ -2739,6 +2749,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: { @@ -2833,6 +2850,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: { @@ -2862,6 +2905,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: { @@ -2881,6 +2931,12 @@ packages: } engines: { node: ">=0.10.0" } + event-emitter@0.3.5: + resolution: + { + integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, + } + execa@4.1.0: resolution: { @@ -2888,6 +2944,12 @@ packages: } engines: { node: ">=10" } + ext@1.7.0: + resolution: + { + integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==, + } + extend@3.0.2: resolution: { @@ -3190,6 +3252,12 @@ packages: } engines: { node: ">=0.10.0" } + is-promise@2.2.2: + resolution: + { + integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, + } + is-stream@2.0.1: resolution: { @@ -3326,6 +3394,12 @@ packages: } engines: { node: ">=10" } + lru-queue@0.1.0: + resolution: + { + integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==, + } + magic-string@0.30.10: resolution: { @@ -3380,6 +3454,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: { @@ -3644,6 +3725,12 @@ packages: engines: { node: ^18 || >=20 } hasBin: true + next-tick@1.1.0: + resolution: + { + integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, + } + no-case@3.0.4: resolution: { @@ -4278,6 +4365,13 @@ packages: engines: { node: ">=10" } hasBin: true + timers-ext@0.1.8: + resolution: + { + integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==, + } + engines: { node: ">=0.12" } + to-fast-properties@2.0.0: resolution: { @@ -4323,6 +4417,12 @@ packages: } engines: { node: ">=0.6.11 <=0.7.0 || >=0.7.3" } + type@2.7.3: + resolution: + { + integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==, + } + types-pac@1.0.2: resolution: { @@ -6310,6 +6410,14 @@ snapshots: chownr@2.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: {} @@ -6369,6 +6477,11 @@ 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: {} @@ -6413,6 +6526,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 @@ -6445,12 +6583,24 @@ snapshots: 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: {} + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + execa@4.1.0: dependencies: cross-spawn: 7.0.3 @@ -6463,6 +6613,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: @@ -6622,6 +6776,8 @@ snapshots: is-plain-object@5.0.0: {} + is-promise@2.2.2: {} + is-stream@2.0.1: {} isexe@2.0.0: {} @@ -6676,6 +6832,10 @@ snapshots: dependencies: yallist: 4.0.0 + lru-queue@0.1.0: + dependencies: + es5-ext: 0.10.64 + magic-string@0.30.10: dependencies: "@jridgewell/sourcemap-codec": 1.4.15 @@ -6769,6 +6929,17 @@ 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: {} @@ -6971,6 +7142,8 @@ snapshots: nanoid@5.0.7: {} + next-tick@1.1.0: {} + no-case@3.0.4: dependencies: lower-case: 2.0.2 @@ -7355,6 +7528,11 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + timers-ext@0.1.8: + dependencies: + es5-ext: 0.10.64 + next-tick: 1.1.0 + to-fast-properties@2.0.0: {} to-regex-range@5.0.1: @@ -7371,6 +7549,8 @@ snapshots: tunnel@0.0.6: {} + type@2.7.3: {} + types-pac@1.0.2: {} typescript@5.5.3: {} diff --git a/scripts/check.mjs b/scripts/check.mjs index ab0eac92..f3066a9e 100644 --- a/scripts/check.mjs +++ b/scripts/check.mjs @@ -7,6 +7,7 @@ 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"; const cwd = process.cwd(); const TEMP_DIR = path.join(cwd, "node_modules/.verge"); @@ -92,9 +93,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); } } @@ -139,9 +140,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); } } @@ -222,11 +223,11 @@ async function resolveSidecar(binInfo) { 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 fsp.rename(tempExe, sidecarPath); - console.log(`[INFO]: "${name}" unzip finished`); + log_success(`unzip finished: "${name}"`); } else if (zipFile.endsWith(".tgz")) { // tgz await fsp.mkdir(tempDir, { recursive: true }); @@ -236,14 +237,14 @@ async function resolveSidecar(binInfo) { //strip: 1, // 可能需要根据实际的 .tgz 文件结构调整 }); const files = await fsp.readdir(tempDir); - console.log(`[DEBUG]: "${name}" files in tempDir:`, files); + log_debug(`"${name}" files in tempDir:`, files); const extractedFile = files.find((file) => file.startsWith("虚空终端-")); if (extractedFile) { const extractedFilePath = path.join(tempDir, extractedFile); await fsp.rename(extractedFilePath, sidecarPath); - console.log(`[INFO]: "${name}" file renamed to "${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}`); } @@ -253,16 +254,16 @@ 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`); + log_success(`chmod binary finished: "${name}"`); execSync(`chmod 755 ${sidecarPath}`); - console.log(`[INFO]: "${name}" chmod binary finished`); + log_success(`chmod binary finished: "${name}"`); resolve(); }) .on("error", onError); @@ -292,7 +293,7 @@ async function resolveResource(binInfo) { await fsp.mkdir(resDir, { recursive: true }); await downloadFile(downloadURL, targetPath); - console.log(`[INFO]: ${file} finished`); + log_success(`${file} finished`); } /** @@ -319,7 +320,7 @@ async function downloadFile(url, path) { const buffer = await response.arrayBuffer(); await fsp.writeFile(path, new Uint8Array(buffer)); - console.log(`[INFO]: download finished "${url}"`); + log_success(`download finished: ${file}`); } // SimpleSC.dll @@ -344,11 +345,11 @@ const resolvePlugin = async () => { } 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 fsp.cp(tempDll, pluginPath, { recursive: true, force: true }); - console.log(`[INFO]: "SimpleSC" unzip finished`); + log_success(`unzip finished: "SimpleSC"`); } finally { await fsp.rm(tempDir, { recursive: true, force: true }); } @@ -366,7 +367,7 @@ const resolveServicePermission = async () => { const targetPath = path.join(resDir, f); if (fs.existsSync(targetPath)) { execSync(`chmod 755 ${targetPath}`); - console.log(`[INFO]: "${targetPath}" chmod finished`); + log_success(`chmod finished: "${f}"`); } } }; @@ -481,7 +482,7 @@ async function runTask() { 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/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); From d0ba50601175b2c72e5f556df4066f2a799138b3 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 4 Oct 2024 23:56:50 +0800 Subject: [PATCH 091/288] chore: update deps --- package.json | 2 +- pnpm-lock.yaml | 90 ++++++++++++------------ src-tauri/Cargo.lock | 140 +++++++++++++++++++------------------ src-tauri/Cargo.toml | 4 +- src-tauri/src/core/core.rs | 7 +- 5 files changed, 126 insertions(+), 117 deletions(-) diff --git a/package.json b/package.json index 0bf9cf26..226e4496 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ }, "devDependencies": { "@actions/github": "^5.1.1", - "@tauri-apps/cli": "2.0.0-rc.17", + "@tauri-apps/cli": "2.0.0-rc.18", "@types/js-cookie": "^3.0.6", "@types/js-yaml": "^4.0.9", "@types/lodash-es": "^4.17.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 64a42352..e2ec9df9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -156,8 +156,8 @@ importers: specifier: ^5.1.1 version: 5.1.1 "@tauri-apps/cli": - specifier: 2.0.0-rc.17 - version: 2.0.0-rc.17 + specifier: 2.0.0-rc.18 + version: 2.0.0-rc.18 "@types/js-cookie": specifier: ^3.0.6 version: 3.0.6 @@ -2103,100 +2103,100 @@ packages: integrity: sha512-UNiIhhKG08j4ooss2oEEVexffmWkgkYlC2M3GcX3VPtNsqFgVNL8Mcw/4Y7rO9M9S+ffAMnLOF5ypzyuyb8tyg==, } - "@tauri-apps/cli-darwin-arm64@2.0.0-rc.17": + "@tauri-apps/cli-darwin-arm64@2.0.0-rc.18": resolution: { - integrity: sha512-LXlLpavNfhvELPBcjCzQ9DOLx7rlAzZM4iltsaKawAewx30Q0EpIjK53Sg5AR3p5/KzNfCsTMjjpeUZg1AcFgw==, + integrity: sha512-L2/VQ4q1pZyhqOifarVDJf/+JabU6DSUMj6979wXrUOOxmyfLCZaw5qGGsbirYOfxWMo+qcXEFRF411YIv9qWw==, } engines: { node: ">= 10" } cpu: [arm64] os: [darwin] - "@tauri-apps/cli-darwin-x64@2.0.0-rc.17": + "@tauri-apps/cli-darwin-x64@2.0.0-rc.18": resolution: { - integrity: sha512-86jlpD9DQEMdPCu+foqady2Kov3u151Pgs1uOdA3SQxXph4L31T7j26axIhADLYZH6T1be+lSVPm6+fp0iXGgw==, + integrity: sha512-ri0NrRAh2CqejoKym67m9Devpqppnn4SrwWnuqV68oHXan3ibn2CeY+g3ygkb6Ch0v5ZcbxJEtop5fZwUTFH4w==, } engines: { node: ">= 10" } cpu: [x64] os: [darwin] - "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.17": + "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.18": resolution: { - integrity: sha512-ZFZeVBFdM9ogNebqzU3vo6f662YwmnE5XzeT6UEKUy+df49Fw2Npebmg0t/BPoF9e/nEgK1w1Jy68aK2JISscg==, + integrity: sha512-+dDZQIHXufqq3WVrKycudVeJa8xfRzIY2XHSYunWS5RMRx1PrcvLbZLBcm3BMtwuY9pwbzrpDHL4K/1+Maj4JQ==, } engines: { node: ">= 10" } cpu: [arm] os: [linux] - "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.17": + "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.18": resolution: { - integrity: sha512-GvO7BNJL6y8CumvaidJ+cEXn0KRaCzhmwtrMfTEl9jsqhGYvmNXuOlZR41hgoy6CQtUiu11ZGoBtU37/lxEKaQ==, + integrity: sha512-pti3FmMAJKArbr8FyoU8eFbcRHRcFRaD16crjNfXfGFGUGNXeMcrAAZptDpGZ9fPfMYBQYzUN/uKqHvrlrYFIw==, } engines: { node: ">= 10" } cpu: [arm64] os: [linux] - "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.17": + "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.18": resolution: { - integrity: sha512-DypDS3rJjcKzpgZKqHsCrzVGDbjo17XcYNhAYd2VxvXmGVAq05eZ71jLYHSSofXTxbpLZMcGKaino0jKyX1mOA==, + integrity: sha512-1e+h543bXRnLLhUwhglnnH6eN4dgtbxKS48oHsBCpLEqLNrovHTHEd1xSZgUAEOh9J9hpIh6Bme7loCwOps9ZQ==, } engines: { node: ">= 10" } cpu: [arm64] os: [linux] - "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.17": + "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.18": resolution: { - integrity: sha512-nKCAJtC4b9HnVpDsCVXASPEXOEIZb/HFmdRPuKiYXmpziL5OByCJLjhVx5EFhpVtqAg1isCmOutqKc8Nmw1QQQ==, + integrity: sha512-5lwBuY06s5J1iCOZq+hM6spBhaGejkh8zn8HdVjnL0mqZ+cH/qbC1Uss6HO/gC1Q53JQFoYeam2P2/8UuNjlHQ==, } engines: { node: ">= 10" } cpu: [x64] os: [linux] - "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.17": + "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.18": resolution: { - integrity: sha512-cSi3M/hcNo+NubSKJG96Af6o6cL38RCvP0ImFiyIOU/adYmW0bQGWI4u/eL14IpdNCR1pbifgEcQL6dteyod0g==, + integrity: sha512-jtJ1EP6GhW258MKujampDbPWX+El26m8yGBzEcZxurrhFvN8d3QHgle4eT/cgqlVT+AZ9DVrhDwTfXilGjERZA==, } engines: { node: ">= 10" } cpu: [x64] os: [linux] - "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.17": + "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.18": resolution: { - integrity: sha512-hMtNtm2zXvUwzzTEJIf/GQplWHNLEeAjiLGaX9sS2Me96X/OzU1PUXcWTYdjVA102cf6q//0/pgpPo/Yn480KA==, + integrity: sha512-E9PSjWwvUnhnW/wjXti0UQgXDYLTUBKWtT2yOS2dXLspmvh1vwdRgZn/AjhjMM2HwZzhBW94Qys06mQAz6z2vg==, } engines: { node: ">= 10" } cpu: [arm64] os: [win32] - "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.17": + "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.18": resolution: { - integrity: sha512-XO+zgvYvpz65aYbXMyFhej4Td5sEK7bSLPr2+8BigiI7F4tHaS7KJpYVtJtjHQtAo6KBy/bT8P9VW6xM4G+YVA==, + integrity: sha512-I+r88I/Dyqex7oV1NOtW3kxYoRegjxtQrQLILGsn6xcirTERnX0pPl1GYW5ooTxvs/H+qt4tuW5iL8Fp1lpmuQ==, } engines: { node: ">= 10" } cpu: [ia32] os: [win32] - "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.17": + "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.18": resolution: { - integrity: sha512-sVV0o9careFJuL3fTtkp6ed8X4FGGfMyK1WbXR5ci4Z2dn94wIJuefzTnGaQnvur4PaEJQ9WmTlQ2Pe3UrokBQ==, + integrity: sha512-IEl0dDc10ln1rt2SGoNxKiYJIDS/fBsS1hTKT4cfZeeKCgHOqMqpdGq25RaVmkkk0UhW/9WeyjxIyFGO3ll4TA==, } engines: { node: ">= 10" } cpu: [x64] os: [win32] - "@tauri-apps/cli@2.0.0-rc.17": + "@tauri-apps/cli@2.0.0-rc.18": resolution: { - integrity: sha512-7YQljT+izYmhLqsI5G2xg3AHBPx3gAHc+gB/s+NKqdSL4CuGImLiii8Rw/qBtuJpWFWLJiaGXnpra35zrSlknQ==, + integrity: sha512-43PjSEISHI3uH2jyR7QlEJUv1yQYlCOvm5eEdadhHIooV5Dqjs6zkddwEJuHYRpSLI/IfiQ8VPBYrw/GfyvhCA==, } engines: { node: ">= 10" } hasBin: true @@ -6094,48 +6094,48 @@ snapshots: "@tauri-apps/api@2.0.0-rc.4": {} - "@tauri-apps/cli-darwin-arm64@2.0.0-rc.17": + "@tauri-apps/cli-darwin-arm64@2.0.0-rc.18": optional: true - "@tauri-apps/cli-darwin-x64@2.0.0-rc.17": + "@tauri-apps/cli-darwin-x64@2.0.0-rc.18": optional: true - "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.17": + "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.18": optional: true - "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.17": + "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.18": optional: true - "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.17": + "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.18": optional: true - "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.17": + "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.18": optional: true - "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.17": + "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.18": optional: true - "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.17": + "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.18": optional: true - "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.17": + "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.18": optional: true - "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.17": + "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.18": optional: true - "@tauri-apps/cli@2.0.0-rc.17": + "@tauri-apps/cli@2.0.0-rc.18": optionalDependencies: - "@tauri-apps/cli-darwin-arm64": 2.0.0-rc.17 - "@tauri-apps/cli-darwin-x64": 2.0.0-rc.17 - "@tauri-apps/cli-linux-arm-gnueabihf": 2.0.0-rc.17 - "@tauri-apps/cli-linux-arm64-gnu": 2.0.0-rc.17 - "@tauri-apps/cli-linux-arm64-musl": 2.0.0-rc.17 - "@tauri-apps/cli-linux-x64-gnu": 2.0.0-rc.17 - "@tauri-apps/cli-linux-x64-musl": 2.0.0-rc.17 - "@tauri-apps/cli-win32-arm64-msvc": 2.0.0-rc.17 - "@tauri-apps/cli-win32-ia32-msvc": 2.0.0-rc.17 - "@tauri-apps/cli-win32-x64-msvc": 2.0.0-rc.17 + "@tauri-apps/cli-darwin-arm64": 2.0.0-rc.18 + "@tauri-apps/cli-darwin-x64": 2.0.0-rc.18 + "@tauri-apps/cli-linux-arm-gnueabihf": 2.0.0-rc.18 + "@tauri-apps/cli-linux-arm64-gnu": 2.0.0-rc.18 + "@tauri-apps/cli-linux-arm64-musl": 2.0.0-rc.18 + "@tauri-apps/cli-linux-x64-gnu": 2.0.0-rc.18 + "@tauri-apps/cli-linux-x64-musl": 2.0.0-rc.18 + "@tauri-apps/cli-win32-arm64-msvc": 2.0.0-rc.18 + "@tauri-apps/cli-win32-ia32-msvc": 2.0.0-rc.18 + "@tauri-apps/cli-win32-x64-msvc": 2.0.0-rc.18 "@tauri-apps/plugin-clipboard-manager@2.0.0-rc.0": dependencies: diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 7453f48c..4c2facab 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -582,23 +582,23 @@ dependencies = [ [[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", "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,6 +608,7 @@ dependencies = [ "boa_macros", "boa_parser", "boa_profiler", + "boa_string", "bytemuck", "cfg-if", "dashmap", @@ -616,18 +617,17 @@ dependencies = [ "icu_normalizer", "indexmap 2.5.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", @@ -641,21 +641,22 @@ dependencies = [ [[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", @@ -663,15 +664,15 @@ dependencies = [ "indexmap 2.5.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", @@ -681,9 +682,9 @@ dependencies = [ [[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,14 +696,27 @@ 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" @@ -2658,7 +2672,7 @@ dependencies = [ "httpdate", "itoa 1.0.11", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.5.7", "tokio", "tower-service", "tracing", @@ -2786,9 +2800,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", @@ -2798,9 +2812,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", @@ -2811,9 +2825,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", @@ -2825,15 +2839,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", @@ -2849,15 +2863,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", @@ -2870,15 +2884,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", @@ -2893,9 +2907,9 @@ 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", @@ -3079,6 +3093,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" @@ -4577,7 +4600,7 @@ 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", @@ -4635,7 +4658,7 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.0.0", + "rustc-hash", "rustls", "socket2 0.5.7", "thiserror", @@ -4652,7 +4675,7 @@ dependencies = [ "bytes", "rand 0.8.5", "ring", - "rustc-hash 2.0.0", + "rustc-hash", "rustls", "slab", "thiserror", @@ -4861,9 +4884,9 @@ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[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", @@ -5002,12 +5025,6 @@ 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" @@ -5767,17 +5784,16 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.30.13" +version = "0.31.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" +checksum = "355dbe4f8799b304b05e1b0f05fc59b2a18d36645cf169607da45bde2f69a1be" dependencies = [ - "cfg-if", "core-foundation-sys", "libc", + "memchr", "ntapi", - "once_cell", "rayon", - "windows 0.52.0", + "windows 0.56.0", ] [[package]] @@ -7495,16 +7511,6 @@ 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" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 8fe8fbf6..0194bdd4 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -22,8 +22,8 @@ dunce = "1.0" log4rs = "1" nanoid = "0.4" chrono = "0.4" -sysinfo = "0.30" -boa_engine = "0.18" +sysinfo = "0.31.4" +boa_engine = "0.19.1" serde_json = "1.0" serde_yaml = "0.9" once_cell = "1.19" diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index fde97a5a..f50b9c53 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -5,7 +5,9 @@ use crate::utils::dirs; use anyhow::{bail, Result}; use once_cell::sync::OnceCell; use serde_yaml::Mapping; +use std::ffi::OsStr; use std::{sync::Arc, time::Duration}; +use sysinfo::ProcessesToUpdate; use sysinfo::{ProcessRefreshKind, RefreshKind, System}; use tauri_plugin_shell::process::CommandEvent; use tauri_plugin_shell::ShellExt; @@ -251,10 +253,11 @@ fn kill_processes_by_name(process_name: &str) { RefreshKind::new().with_processes(ProcessRefreshKind::everything()), ); - system.refresh_processes(); + system.refresh_processes(ProcessesToUpdate::All); + let process_name = OsStr::new(process_name); let procs = system.processes_by_name(process_name); for proc in procs { - log::debug!(target: "app", "Killing process: {}", proc.name()); + log::debug!(target: "app", "Killing process: {:?}", proc.name()); proc.kill(); } } From bcf33b779e4f493c86402b934b9cd2b4b0b342a0 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 5 Oct 2024 00:03:11 +0800 Subject: [PATCH 092/288] chore: update --- scripts/check.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/check.mjs b/scripts/check.mjs index f3066a9e..60001989 100644 --- a/scripts/check.mjs +++ b/scripts/check.mjs @@ -320,7 +320,7 @@ async function downloadFile(url, path) { const buffer = await response.arrayBuffer(); await fsp.writeFile(path, new Uint8Array(buffer)); - log_success(`download finished: ${file}`); + log_success(`download finished: ${url}`); } // SimpleSC.dll From a3e78bd76d8010195fe0dfcb9ca6ca472369297e Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 5 Oct 2024 02:58:41 +0800 Subject: [PATCH 093/288] refactor: get_bypass func --- src-tauri/src/core/sysopt.rs | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index ee7be0c8..ab214fbf 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -30,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(); @@ -41,17 +40,7 @@ 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 { @@ -59,7 +48,6 @@ fn get_bypass() -> String { } else { custom_bypass }; - bypass } From 1178f7c892989ffc54bc361874d704210bdef617 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 5 Oct 2024 12:19:44 +0800 Subject: [PATCH 094/288] refactor: init_log --- src-tauri/src/utils/init.rs | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/src-tauri/src/utils/init.rs b/src-tauri/src/utils/init.rs index e56e7718..5c0b9c60 100644 --- a/src-tauri/src/utils/init.rs +++ b/src-tauri/src/utils/init.rs @@ -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() From 0541a0c69fce818038fa96fd7b192ef9533013b4 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 5 Oct 2024 22:45:59 +0800 Subject: [PATCH 095/288] refactor: tun mode is turned on and off, does not depend on services, and does not affect other configurations --- src-tauri/src/core/service.rs | 40 --------------- src-tauri/src/core/tray.rs | 62 +++++++---------------- src-tauri/src/enhance/mod.rs | 7 +-- src-tauri/src/enhance/tun.rs | 61 ++-------------------- src-tauri/src/utils/resolve.rs | 1 - src/components/setting/setting-system.tsx | 15 +----- 6 files changed, 28 insertions(+), 158 deletions(-) diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index 670bcf5c..9e67ce77 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -350,43 +350,3 @@ pub(super) async fn stop_core_by_service() -> Result<()> { 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/tray.rs b/src-tauri/src/core/tray.rs index 7e8ac626..29eaf587 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -364,51 +364,25 @@ fn create_tray_menu( .unwrap(); let separator = &PredefinedMenuItem::separator(app_handle).unwrap(); - let enable = { - Config::verge() - .latest() - .enable_service_mode - .unwrap_or(false) - }; - let menu = if enable { - tauri::menu::MenuBuilder::new(app_handle) - .items(&[ - open_window, - separator, - rule_mode, - global_mode, - direct_mode, - separator, - system_proxy, - tun_mode, - copy_env, - open_dir, - more, - separator, - quit, - ]) - .build() - .unwrap() - } else { - tauri::menu::MenuBuilder::new(app_handle) - .items(&[ - open_window, - separator, - rule_mode, - global_mode, - direct_mode, - separator, - system_proxy, - copy_env, - open_dir, - more, - separator, - quit, - ]) - .build() - .unwrap() - }; + let menu = tauri::menu::MenuBuilder::new(app_handle) + .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) } diff --git a/src-tauri/src/enhance/mod.rs b/src-tauri/src/enhance/mod.rs index c475020b..6da1b537 100644 --- a/src-tauri/src/enhance/mod.rs +++ b/src-tauri/src/enhance/mod.rs @@ -25,7 +25,7 @@ pub async fn enhance() -> (Mapping, Vec, HashMap) { // config.yaml 的订阅 let clash_config = { Config::clash().latest().0.clone() }; - let (clash_core, enable_tun, enable_builtin, socks_enabled, http_enabled, enable_service_mode) = { + let (clash_core, enable_tun, enable_builtin, socks_enabled, http_enabled) = { let verge = Config::verge(); let verge = verge.latest(); ( @@ -34,7 +34,6 @@ pub async fn enhance() -> (Mapping, Vec, HashMap) { verge.enable_builtin_enhanced.unwrap_or(true), verge.verge_socks_enabled.unwrap_or(false), verge.verge_http_enabled.unwrap_or(false), - verge.enable_service_mode.unwrap_or(false), ) }; #[cfg(not(target_os = "windows"))] @@ -260,7 +259,9 @@ pub async fn enhance() -> (Mapping, Vec, HashMap) { }); } - config = use_tun(config, enable_tun, enable_service_mode).await; + if enable_tun { + config = use_tun(config).await; + } config = use_sort(config); let mut exists_set = HashSet::new(); diff --git a/src-tauri/src/enhance/tun.rs b/src-tauri/src/enhance/tun.rs index d3ca5c0d..650ebd03 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()); @@ -18,66 +18,13 @@ macro_rules! append { }; } -pub async fn use_tun(mut config: Mapping, enable: bool, enable_service_mode: bool) -> Mapping { +pub async fn use_tun(mut config: Mapping) -> 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!(tun_val, "enable", true); revise!(config, "tun", tun_val); - - if enable_service_mode { - handle_dns_service(enable).await; - if enable { - return use_dns_for_tun(config); - } - } - config -} - -async fn handle_dns_service(enable: bool) { - if enable { - log_err!(service::set_dns_by_service().await); - } else { - log_err!(service::unset_dns_by_service().await); - } -} - -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); - - 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!(config, "dns", dns_val); - config + return config; } diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 6c7a28bc..1dee014a 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -107,7 +107,6 @@ pub fn resolve_reset() { 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); }); } diff --git a/src/components/setting/setting-system.tsx b/src/components/setting/setting-system.tsx index bb827b7b..5393b233 100644 --- a/src/components/setting/setting-system.tsx +++ b/src/components/setting/setting-system.tsx @@ -67,20 +67,9 @@ const SettingSystem = ({ onError }: Props) => { onCatch={onError} onFormat={onSwitchFormat} onChange={(e) => { - if (serviceStatus !== "active") { - onChangeData({ enable_tun_mode: false }); - } else { - 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 }); - } + onChangeData({ enable_tun_mode: e }); }} + onGuard={(e) => patchVerge({ enable_tun_mode: e })} > From e299e246e3b742bb3492467ae84a82b5047e3dd9 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 6 Oct 2024 01:09:59 +0800 Subject: [PATCH 096/288] chore: revert --- src-tauri/src/core/tray.rs | 62 ++++++++++++++++------- src/components/setting/setting-system.tsx | 15 +++++- 2 files changed, 57 insertions(+), 20 deletions(-) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 29eaf587..7e8ac626 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -364,25 +364,51 @@ fn create_tray_menu( .unwrap(); let separator = &PredefinedMenuItem::separator(app_handle).unwrap(); + let enable = { + Config::verge() + .latest() + .enable_service_mode + .unwrap_or(false) + }; - let menu = tauri::menu::MenuBuilder::new(app_handle) - .items(&[ - open_window, - separator, - rule_mode, - global_mode, - direct_mode, - separator, - system_proxy, - tun_mode, - copy_env, - open_dir, - more, - separator, - quit, - ]) - .build() - .unwrap(); + let menu = if enable { + tauri::menu::MenuBuilder::new(app_handle) + .items(&[ + open_window, + separator, + rule_mode, + global_mode, + direct_mode, + separator, + system_proxy, + tun_mode, + copy_env, + open_dir, + more, + separator, + quit, + ]) + .build() + .unwrap() + } else { + tauri::menu::MenuBuilder::new(app_handle) + .items(&[ + open_window, + separator, + rule_mode, + global_mode, + direct_mode, + separator, + system_proxy, + copy_env, + open_dir, + more, + separator, + quit, + ]) + .build() + .unwrap() + }; Ok(menu) } diff --git a/src/components/setting/setting-system.tsx b/src/components/setting/setting-system.tsx index 5393b233..bb827b7b 100644 --- a/src/components/setting/setting-system.tsx +++ b/src/components/setting/setting-system.tsx @@ -67,9 +67,20 @@ const SettingSystem = ({ onError }: Props) => { onCatch={onError} onFormat={onSwitchFormat} onChange={(e) => { - onChangeData({ enable_tun_mode: e }); + if (serviceStatus !== "active") { + onChangeData({ enable_tun_mode: false }); + } else { + 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 }); + } }} - onGuard={(e) => patchVerge({ enable_tun_mode: e })} > From 7f2f9588acd11509c38cc5a33f701dda8abc1311 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 6 Oct 2024 02:03:32 +0800 Subject: [PATCH 097/288] chore: update --- scripts/check.mjs | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/check.mjs b/scripts/check.mjs index 60001989..0d0a3bdf 100644 --- a/scripts/check.mjs +++ b/scripts/check.mjs @@ -261,7 +261,6 @@ async function resolveSidecar(binInfo) { .pipe(zlib.createGunzip().on("error", onError)) .pipe(writeStream) .on("finish", () => { - log_success(`chmod binary finished: "${name}"`); execSync(`chmod 755 ${sidecarPath}`); log_success(`chmod binary finished: "${name}"`); resolve(); From 5e126364ed01f90da82ff1d734caa1fd81ef1cf7 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 8 Oct 2024 02:39:17 +0800 Subject: [PATCH 098/288] refactor: core logic --- src-tauri/src/core/core.rs | 70 +++++++++++++---------------------- src-tauri/src/core/service.rs | 27 ++------------ 2 files changed, 29 insertions(+), 68 deletions(-) diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index f50b9c53..863f744f 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -5,27 +5,24 @@ use crate::utils::dirs; use anyhow::{bail, Result}; use once_cell::sync::OnceCell; use serde_yaml::Mapping; -use std::ffi::OsStr; use std::{sync::Arc, time::Duration}; -use sysinfo::ProcessesToUpdate; -use sysinfo::{ProcessRefreshKind, RefreshKind, System}; -use tauri_plugin_shell::process::CommandEvent; +use tauri_plugin_shell::process::{CommandChild, CommandEvent}; use tauri_plugin_shell::ShellExt; use tokio::sync::Mutex; - use tokio::time::sleep; #[derive(Debug)] pub struct CoreManager { running: Arc>, + sidecar: Arc>>, } impl CoreManager { pub fn global() -> &'static CoreManager { static CORE_MANAGER: OnceCell = OnceCell::new(); - CORE_MANAGER.get_or_init(|| CoreManager { running: Arc::new(Mutex::new(false)), + sidecar: Arc::new(Mutex::new(None)), }) } @@ -79,8 +76,6 @@ impl CoreManager { return Ok(()); } - let clash_core = { Config::verge().latest().clash_core.clone() }; - let clash_core = clash_core.unwrap_or("verge-mihomo".into()); // 关闭tun模式 let mut disable = Mapping::new(); let mut tun = Mapping::new(); @@ -89,11 +84,15 @@ impl CoreManager { log::debug!(target: "app", "disable tun mode"); log_err!(clash_api::patch_configs(&disable).await); - // 服务模式 - log::debug!(target: "app", "stop the core by service"); - log_err!(service::stop_core_by_service().await); - - kill_processes_by_name(clash_core.as_str()); + if let Some(sidecar) = self.sidecar.lock().await.take() { + let _ = sidecar.kill(); + } else { + // 服务模式 + if service::check_service().await.is_ok() { + log::debug!(target: "app", "stop the core by service"); + log_err!(service::stop_core_by_service().await); + } + } *running = false; Ok(()) @@ -113,25 +112,17 @@ impl CoreManager { // 服务模式 let service_enable = { Config::verge().latest().enable_service_mode }; let service_enable = service_enable.unwrap_or(false); - if service_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 { - *running = true; - Ok(()) - } - } - Err(err) => { - log::error!(target: "app start service err", "{err}"); + if service::check_service().await.is_ok() { + log::debug!(target: "app", "try to run core in service mode"); + if service_enable { + service::run_core_by_service(&config_path).await?; + let mut sidecar = self.sidecar.lock().await; + if sidecar.is_some() { + sidecar.take(); } + *running = true; + return Ok(()); } } @@ -141,7 +132,10 @@ impl CoreManager { let args = vec!["-d", app_dir, "-f", config_path]; let app_handle = handle::Handle::global().app_handle().unwrap(); let cmd = app_handle.shell().sidecar(clash_core)?; - let (mut rx, _) = cmd.args(args).spawn()?; + let (mut rx, cmd_child) = cmd.args(args).spawn()?; + let mut sidecar = self.sidecar.lock().await; + + *sidecar = Some(cmd_child); tauri::async_runtime::spawn(async move { while let Some(event) = rx.recv().await { @@ -247,17 +241,3 @@ impl CoreManager { Ok(()) } } - -fn kill_processes_by_name(process_name: &str) { - let mut system = System::new_with_specifics( - RefreshKind::new().with_processes(ProcessRefreshKind::everything()), - ); - - system.refresh_processes(ProcessesToUpdate::All); - let process_name = OsStr::new(process_name); - let procs = system.processes_by_name(process_name); - for proc in procs { - log::debug!(target: "app", "Killing process: {:?}", proc.name()); - proc.kill(); - } -} diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index 9e67ce77..e27c3684 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -4,9 +4,8 @@ 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 @@ -268,6 +267,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() @@ -282,13 +282,6 @@ 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 clash_core = clash_core.unwrap_or("verge-mihomo".into()); @@ -313,40 +306,28 @@ pub(super) async fn run_core_by_service(config_file: &PathBuf) -> Result<()> { map.insert("log_file", log_path); 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(()) } From 30c77b891d1d6e52b03cb6d3b10f9a3200624812 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 9 Oct 2024 01:14:03 +0800 Subject: [PATCH 099/288] chore: update --- src-tauri/src/utils/resolve.rs | 56 ++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 1dee014a..af220eee 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -47,32 +47,7 @@ pub async fn resolve_setup(app: &mut App) { log_err!(init::init_scheme()); 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"); @@ -309,3 +284,32 @@ pub async fn resolve_scheme(param: String) -> Result<()> { 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(()) +} From 3f3fad0db7b0b7595005cd98de5557fd6f87be2e Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 10 Oct 2024 00:34:36 +0800 Subject: [PATCH 100/288] feat: Modify startup logic and install services by default --- src-tauri/src/cmds.rs | 10 - src-tauri/src/config/verge.rs | 5 - src-tauri/src/core/core.rs | 73 +----- src-tauri/src/core/service.rs | 212 +++++++----------- src-tauri/src/core/tray.rs | 63 ++---- src-tauri/src/feat.rs | 5 - src-tauri/src/lib.rs | 2 - src-tauri/src/utils/help.rs | 15 ++ src-tauri/src/utils/resolve.rs | 7 + .../setting/mods/service-switcher.tsx | 134 ----------- src/components/setting/setting-system.tsx | 27 +-- src/services/cmds.ts | 9 - 12 files changed, 126 insertions(+), 436 deletions(-) delete mode 100644 src/components/setting/mods/service-switcher.tsx diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index 9152151a..a2c7cb8a 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -383,16 +383,6 @@ pub mod service { pub async fn check_service() -> CmdResult { wrap_err!(service::check_service().await) } - - #[tauri::command] - pub async fn install_service(passwd: String) -> CmdResult { - wrap_err!(service::install_service(passwd).await) - } - - #[tauri::command] - pub async fn uninstall_service(passwd: String) -> CmdResult { - wrap_err!(service::uninstall_service(passwd).await) - } } #[cfg(not(windows))] diff --git a/src-tauri/src/config/verge.rs b/src-tauri/src/config/verge.rs index 2aaa98b1..3f988831 100644 --- a/src-tauri/src/config/verge.rs +++ b/src-tauri/src/config/verge.rs @@ -56,10 +56,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, @@ -279,7 +275,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); diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index 863f744f..3acc03e2 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -6,7 +6,6 @@ use anyhow::{bail, Result}; use once_cell::sync::OnceCell; use serde_yaml::Mapping; use std::{sync::Arc, time::Duration}; -use tauri_plugin_shell::process::{CommandChild, CommandEvent}; use tauri_plugin_shell::ShellExt; use tokio::sync::Mutex; use tokio::time::sleep; @@ -14,7 +13,6 @@ use tokio::time::sleep; #[derive(Debug)] pub struct CoreManager { running: Arc>, - sidecar: Arc>>, } impl CoreManager { @@ -22,7 +20,6 @@ impl CoreManager { static CORE_MANAGER: OnceCell = OnceCell::new(); CORE_MANAGER.get_or_init(|| CoreManager { running: Arc::new(Mutex::new(false)), - sidecar: Arc::new(Mutex::new(None)), }) } @@ -75,6 +72,7 @@ impl CoreManager { log::debug!("core is not running"); return Ok(()); } + println!("stop core"); // 关闭tun模式 let mut disable = Mapping::new(); @@ -84,22 +82,18 @@ impl CoreManager { log::debug!(target: "app", "disable tun mode"); log_err!(clash_api::patch_configs(&disable).await); - if let Some(sidecar) = self.sidecar.lock().await.take() { - let _ = sidecar.kill(); - } else { - // 服务模式 - if service::check_service().await.is_ok() { - 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::debug!(target: "app", "stop the core by service"); + service::stop_core_by_service().await?; } *running = false; - Ok(()) } /// 启动核心 pub async fn start_core(&self) -> Result<()> { + println!("start core"); let mut running = self.running.lock().await; if *running { log::debug!("core is running"); @@ -107,62 +101,13 @@ impl CoreManager { } let config_path = Config::generate_file(ConfigType::Run)?; - let clash_core = { Config::verge().latest().clash_core.clone() }; - let clash_core = clash_core.unwrap_or("verge-mihomo".into()); - // 服务模式 - let service_enable = { Config::verge().latest().enable_service_mode }; - let service_enable = service_enable.unwrap_or(false); + // 服务模式 if service::check_service().await.is_ok() { log::debug!(target: "app", "try to run core in service mode"); - if service_enable { - service::run_core_by_service(&config_path).await?; - let mut sidecar = self.sidecar.lock().await; - if sidecar.is_some() { - sidecar.take(); - } - *running = true; - return Ok(()); - } + service::run_core_by_service(&config_path).await?; + *running = true; } - - let app_dir = dirs::app_home_dir()?; - let app_dir = dirs::path_to_str(&app_dir)?; - let config_path = dirs::path_to_str(&config_path)?; - let args = vec!["-d", app_dir, "-f", config_path]; - let app_handle = handle::Handle::global().app_handle().unwrap(); - let cmd = app_handle.shell().sidecar(clash_core)?; - let (mut rx, cmd_child) = cmd.args(args).spawn()?; - let mut sidecar = self.sidecar.lock().await; - - *sidecar = Some(cmd_child); - - 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"); - break; - } - _ => {} - } - } - }); - *running = true; Ok(()) } diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index e27c3684..222d0ca4 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -26,32 +26,42 @@ 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(_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 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"); } + if !uninstall_path.exists() { + bail!("uninstaller exe not found"); + } + let token = Token::with_current_process()?; let level = token.privilege_level()?; + let status = match level { + PrivilegeLevel::NotPrivileged => RunasCommand::new(uninstall_path).show(false).status()?, + _ => StdCommand::new(uninstall_path) + .creation_flags(0x08000000) + .status()?, + }; + + if !status.success() { + bail!( + "failed to uninstall service with status {}", + status.code().unwrap() + ); + } let status = match level { PrivilegeLevel::NotPrivileged => RunasCommand::new(install_path).show(false).status()?, @@ -71,45 +81,52 @@ 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(passwd: String) -> Result<()> { use users::get_effective_uid; let binary_path = dirs::service_path()?; let installer_path = binary_path.with_file_name("install-service"); + let uninstaller_path = binary_path.with_file_name("uninstall-service"); + if !installer_path.exists() { bail!("installer not found"); } - 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 !uninstaller_path.exists() { + bail!("uninstaller not found"); + } + + let elevator = crate::utils::help::linux_elevator(); + let status = match get_effective_uid() { + 0 => StdCommand::new(uninstaller_path).status()?, + _ => StdCommand::new(elevator) + .arg("sh") + .arg("-c") + .arg(uninstaller_path) + .status()?, }; - if !output.status.success() { + + if !status.success() { bail!( - "failed to install service with error: {}", - String::from_utf8_lossy(&output.stderr) + "failed to install service with status {}", + status.code().unwrap() + ); + } + + let elevator = crate::utils::help::linux_elevator(); + let status = match get_effective_uid() { + 0 => StdCommand::new(installer_path).status()?, + _ => StdCommand::new(elevator) + .arg("sh") + .arg("-c") + .arg(installer_path) + .status()?, + }; + + if !status.success() { + bail!( + "failed to install service with status {}", + status.code().unwrap() ); } @@ -117,38 +134,35 @@ pub async fn install_service(passwd: String) -> Result<()> { } #[cfg(target_os = "macos")] -pub async fn install_service(passwd: String) -> Result<()> { +pub async fn reinstall_service() -> Result<()> { let binary_path = dirs::service_path()?; let installer_path = binary_path.with_file_name("install-service"); + let uninstall_path = binary_path.with_file_name("uninstall-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, - installer_path - .to_string_lossy() - .replace(" ", "\\ ") - .to_string(), - ) - .output()?; - - if !output.status.success() { - bail!( - "failed to install service with error: {}", - String::from_utf8_lossy(&output.stderr) - ); + if !uninstall_path.exists() { + bail!("uninstaller not found"); } + let install_shell: String = installer_path.to_string_lossy().replace(" ", "\\\\ "); + let uninstall_shell: String = uninstall_path.to_string_lossy().replace(" ", "\\\\ "); + let command = format!( + r#"do shell script "{uninstall_shell} && {install_shell}" with administrator privileges"# + ); + + let status = StdCommand::new("osascript") + .args(vec!["-e", &command]) + .status()?; + + if !status.success() { + bail!( + "failed to install service with status {}", + status.code().unwrap() + ); + } Ok(()) } /// Uninstall the Clash Verge Service @@ -186,82 +200,6 @@ 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"); - - if !uninstaller_path.exists() { - bail!("uninstaller not found"); - } - - sudo( - &passwd, - format!( - "chmod +x {}", - uninstaller_path.to_string_lossy().replace(" ", "\\ ") - ), - ) - .output()?; - let output = sudo( - &passwd, - uninstaller_path - .to_string_lossy() - .replace(" ", "\\ ") - .to_string(), - ) - .output()?; - - if !output.status.success() { - bail!( - "failed to uninstall service with error: {}", - String::from_utf8_lossy(&output.stderr) - ); - } - - Ok(()) -} - /// check the windows service status pub async fn check_service() -> Result { let url = format!("{SERVICE_URL}/get_clash"); diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 7e8ac626..e9c75adc 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -364,52 +364,25 @@ fn create_tray_menu( .unwrap(); let separator = &PredefinedMenuItem::separator(app_handle).unwrap(); - let enable = { - Config::verge() - .latest() - .enable_service_mode - .unwrap_or(false) - }; - - let menu = if enable { - tauri::menu::MenuBuilder::new(app_handle) - .items(&[ - open_window, - separator, - rule_mode, - global_mode, - direct_mode, - separator, - system_proxy, - tun_mode, - copy_env, - open_dir, - more, - separator, - quit, - ]) - .build() - .unwrap() - } else { - tauri::menu::MenuBuilder::new(app_handle) - .items(&[ - open_window, - separator, - rule_mode, - global_mode, - direct_mode, - separator, - system_proxy, - copy_env, - open_dir, - more, - separator, - quit, - ]) - .build() - .unwrap() - }; + let menu = tauri::menu::MenuBuilder::new(app_handle) + .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) } diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 261f2ea4..5975f690 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -177,11 +177,6 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { let mut should_update_sysproxy = false; let mut should_update_systray_part = false; - let service_mode = patch.enable_service_mode; - if service_mode.is_some() { - should_restart_core = true; - } - if tun_mode.is_some() { should_update_clash_config = true; } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index a04561f1..5eb860d3 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -118,8 +118,6 @@ pub fn run() { 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 ]); diff --git a/src-tauri/src/utils/help.rs b/src-tauri/src/utils/help.rs index 3583540a..ee47fa8b 100644 --- a/src-tauri/src/utils/help.rs +++ b/src-tauri/src/utils/help.rs @@ -105,6 +105,21 @@ pub fn open_file(app: tauri::AppHandle, path: PathBuf) -> Result<()> { Ok(()) } +#[cfg(target_os = "linux")] +pub fn linux_elevator() -> &'static str { + use std::process::Command; + match Command::new("which").arg("pkexec").output() { + Ok(output) => { + if output.stdout.is_empty() { + "sudo" + } else { + "pkexec" + } + } + Err(_) => "sudo", + } +} + #[macro_export] macro_rules! error { ($result: expr) => { diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index af220eee..074aea4a 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -42,6 +42,13 @@ pub async fn resolve_setup(app: &mut App) { handle::Handle::global().init(app.app_handle()); VERSION.get_or_init(|| version.clone()); + + if service::check_service().await.is_err() { + log_err!(service::reinstall_service().await); + //延迟启动,避免闪屏 + std::thread::sleep(std::time::Duration::from_millis(1000)); + } + log_err!(init::init_config()); log_err!(init::init_resources()); log_err!(init::init_scheme()); 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/setting-system.tsx b/src/components/setting/setting-system.tsx index bb827b7b..7f5799cb 100644 --- a/src/components/setting/setting-system.tsx +++ b/src/components/setting/setting-system.tsx @@ -7,7 +7,6 @@ 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"; @@ -67,37 +66,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 }); }} > - - } - > - - - ("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) From 045ddc5ca565763ed76555d1d6715ea12637d0e5 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 10 Oct 2024 02:21:22 +0800 Subject: [PATCH 101/288] chore: update --- src-tauri/src/core/core.rs | 2 -- src-tauri/src/core/service.rs | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index 3acc03e2..1013d3a5 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -72,7 +72,6 @@ impl CoreManager { log::debug!("core is not running"); return Ok(()); } - println!("stop core"); // 关闭tun模式 let mut disable = Mapping::new(); @@ -93,7 +92,6 @@ impl CoreManager { /// 启动核心 pub async fn start_core(&self) -> Result<()> { - println!("start core"); let mut running = self.running.lock().await; if *running { log::debug!("core is running"); diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index 222d0ca4..3df84e2b 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -150,7 +150,7 @@ pub async fn reinstall_service() -> Result<()> { let install_shell: String = installer_path.to_string_lossy().replace(" ", "\\\\ "); let uninstall_shell: String = uninstall_path.to_string_lossy().replace(" ", "\\\\ "); let command = format!( - r#"do shell script "{uninstall_shell} && {install_shell}" with administrator privileges"# + r#"do shell script "sudo {uninstall_shell} && sudo {install_shell}" with administrator privileges"# ); let status = StdCommand::new("osascript") From d14bda7e7a5b2129b5f9ee3a5c4afd02ca68b188 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 10 Oct 2024 18:40:39 +0800 Subject: [PATCH 102/288] chore: update --- src-tauri/src/core/sysopt.rs | 20 ++++++++++---------- src-tauri/src/enhance/tun.rs | 2 +- src-tauri/src/feat.rs | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index ab214fbf..ce20e746 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -41,14 +41,14 @@ fn get_bypass() -> String { None => "".to_string(), }; - let bypass = if custom_bypass.is_empty() { + + if custom_bypass.is_empty() { DEFAULT_BYPASS.to_string() } else if use_default { format!("{},{}", DEFAULT_BYPASS, custom_bypass) } else { custom_bypass - }; - bypass + } } impl Sysopt { @@ -311,7 +311,7 @@ impl Sysopt { let sysproxy = Sysproxy::get_system_proxy(); let autoproxy = Autoproxy::get_auto_proxy(); - if !sysproxy.is_ok() || !autoproxy.is_ok() { + if sysproxy.is_err() || autoproxy.is_err() { log::error!(target: "app", "failed to get the system proxy"); continue; } @@ -367,23 +367,23 @@ impl Sysopt { let shell = app_handle.shell(); let output = if pac { let address = format!("http://{}:{}/pac", "127.0.0.1", pac_port); - let output = shell + + shell .command(sysproxy_exe.as_path().to_str().unwrap()) .args(["opac", address.as_str()]) .output() .await - .unwrap(); - output + .unwrap() } else { let address = format!("{}:{}", "127.0.0.1", port); let bypass = get_bypass(); - let output = shell + + shell .command(sysproxy_exe.as_path().to_str().unwrap()) .args(["global", address.as_str(), bypass.as_ref()]) .output() .await - .unwrap(); - output + .unwrap() }; if !output.status.success() { break; diff --git a/src-tauri/src/enhance/tun.rs b/src-tauri/src/enhance/tun.rs index 650ebd03..b532f91f 100644 --- a/src-tauri/src/enhance/tun.rs +++ b/src-tauri/src/enhance/tun.rs @@ -26,5 +26,5 @@ pub async fn use_tun(mut config: Mapping) -> Mapping { }); revise!(tun_val, "enable", true); revise!(config, "tun", tun_val); - return config; + config } diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 5975f690..b71a9971 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -250,11 +250,11 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> { Config::verge().apply(); Config::verge().data().save_file()?; - return Ok(()); + Ok(()) } Err(err) => { Config::verge().discard(); - return Err(err); + Err(err) } } } From b4180b5b484bf0b8ae92f065a8fcfe1bbc1ea809 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 10 Oct 2024 18:52:20 +0800 Subject: [PATCH 103/288] =?UTF-8?q?chore=EF=BC=9Aupdate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/core/sysopt.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index ce20e746..5229ec64 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -18,7 +18,7 @@ pub struct Sysopt { /// helps to auto launch the app auto_launch: Arc>>, /// record whether the guard async is running or not - guard_state: Arc>, + guard_state: Arc>, } #[cfg(target_os = "windows")] @@ -41,7 +41,6 @@ fn get_bypass() -> String { None => "".to_string(), }; - if custom_bypass.is_empty() { DEFAULT_BYPASS.to_string() } else if use_default { @@ -58,7 +57,7 @@ impl Sysopt { update_sysproxy: Arc::new(TokioMutex::new(false)), reset_sysproxy: Arc::new(TokioMutex::new(false)), auto_launch: Arc::new(Mutex::new(None)), - guard_state: Arc::new(TokioMutex::new(false)), + guard_state: Arc::new(false.into()), }) } @@ -69,7 +68,7 @@ impl Sysopt { /// init the sysproxy pub async fn update_sysproxy(&self) -> Result<()> { - let _ = self.update_sysproxy.lock(); + let _lock = self.update_sysproxy.lock().await; let port = Config::verge() .latest() @@ -160,7 +159,7 @@ impl Sysopt { /// reset the sysproxy pub async fn reset_sysproxy(&self) -> Result<()> { - let _ = self.reset_sysproxy.lock(); + let _lock = self.reset_sysproxy.lock().await; //直接关闭所有代理 #[cfg(not(target_os = "windows"))] { @@ -280,7 +279,8 @@ impl Sysopt { } fn guard_proxy(&self) { - let _ = self.guard_state.lock(); + let _lock = self.guard_state.lock(); + tauri::async_runtime::spawn(async move { // default duration is 10s let mut wait_secs = 10u64; @@ -367,7 +367,7 @@ impl Sysopt { let shell = app_handle.shell(); let output = if pac { let address = format!("http://{}:{}/pac", "127.0.0.1", pac_port); - + shell .command(sysproxy_exe.as_path().to_str().unwrap()) .args(["opac", address.as_str()]) @@ -377,7 +377,7 @@ impl Sysopt { } 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()]) From 25e25c228593c0e6c1c468e2d18d24bfe07e9e0f Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 10 Oct 2024 23:34:55 +0800 Subject: [PATCH 104/288] chore: update --- src-tauri/src/core/service.rs | 38 ++--------------------------------- 1 file changed, 2 insertions(+), 36 deletions(-) diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index 3df84e2b..ed3ebf60 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -30,7 +30,7 @@ pub struct JsonResponse { /// 该函数应该在协程或者线程中执行,避免UAC弹窗阻塞主线程 /// #[cfg(target_os = "windows")] -pub async fn reinstall_service(_passwd: String) -> Result<()> { +pub async fn reinstall_service() -> Result<()> { use deelevate::{PrivilegeLevel, Token}; use runas::Command as RunasCommand; use std::os::windows::process::CommandExt; @@ -81,7 +81,7 @@ pub async fn reinstall_service(_passwd: String) -> Result<()> { } #[cfg(target_os = "linux")] -pub async fn reinstall_service(passwd: String) -> Result<()> { +pub async fn reinstall_service() -> Result<()> { use users::get_effective_uid; let binary_path = dirs::service_path()?; @@ -165,40 +165,6 @@ pub async fn reinstall_service() -> Result<()> { } 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"); - } - - let token = Token::with_current_process()?; - let level = token.privilege_level()?; - - let status = match level { - PrivilegeLevel::NotPrivileged => RunasCommand::new(uninstall_path).show(false).status()?, - _ => StdCommand::new(uninstall_path) - .creation_flags(0x08000000) - .status()?, - }; - - if !status.success() { - bail!( - "failed to uninstall service with status {}", - status.code().unwrap() - ); - } - - Ok(()) -} /// check the windows service status pub async fn check_service() -> Result { From c604ae38ddebe9869366c7d5f849a341f248b3f9 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 11 Oct 2024 00:59:34 +0800 Subject: [PATCH 105/288] fix: installation service error --- src-tauri/src/core/service.rs | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index ed3ebf60..d9efcf14 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -49,20 +49,13 @@ pub async fn reinstall_service() -> Result<()> { let token = Token::with_current_process()?; let level = token.privilege_level()?; - let status = match level { + let _ = match level { PrivilegeLevel::NotPrivileged => RunasCommand::new(uninstall_path).show(false).status()?, _ => StdCommand::new(uninstall_path) .creation_flags(0x08000000) .status()?, }; - if !status.success() { - bail!( - "failed to uninstall service with status {}", - status.code().unwrap() - ); - } - let status = match level { PrivilegeLevel::NotPrivileged => RunasCommand::new(install_path).show(false).status()?, _ => StdCommand::new(install_path) @@ -97,7 +90,7 @@ pub async fn reinstall_service() -> Result<()> { } let elevator = crate::utils::help::linux_elevator(); - let status = match get_effective_uid() { + let _ = match get_effective_uid() { 0 => StdCommand::new(uninstaller_path).status()?, _ => StdCommand::new(elevator) .arg("sh") @@ -106,13 +99,6 @@ pub async fn reinstall_service() -> Result<()> { .status()?, }; - if !status.success() { - bail!( - "failed to install service with status {}", - status.code().unwrap() - ); - } - let elevator = crate::utils::help::linux_elevator(); let status = match get_effective_uid() { 0 => StdCommand::new(installer_path).status()?, From 5e7ff36e8e739d18b93f34dc8846886a601ef704 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 11 Oct 2024 14:33:11 +0800 Subject: [PATCH 106/288] chore: complete field identifier --- src-tauri/tauri.linux.conf.json | 1 + src-tauri/tauri.macos.conf.json | 1 + src-tauri/tauri.windows.conf.json | 1 + 3 files changed, 3 insertions(+) diff --git a/src-tauri/tauri.linux.conf.json b/src-tauri/tauri.linux.conf.json index eb8e2aee..774ba634 100644 --- a/src-tauri/tauri.linux.conf.json +++ b/src-tauri/tauri.linux.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": ["deb", "rpm"], "linux": { diff --git a/src-tauri/tauri.macos.conf.json b/src-tauri/tauri.macos.conf.json index 21748a57..95dc299a 100644 --- a/src-tauri/tauri.macos.conf.json +++ b/src-tauri/tauri.macos.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": ["app", "dmg"], "macOS": { diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json index 78515560..84047f1b 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": { From e78f619be1fc37ae7f6ffdb962202bc1d97b4734 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 11 Oct 2024 22:01:57 +0800 Subject: [PATCH 107/288] fox: external-controller cors error --- src-tauri/src/config/clash.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src-tauri/src/config/clash.rs b/src-tauri/src/config/clash.rs index e1d4aa3e..6f94e33c 100644 --- a/src-tauri/src/config/clash.rs +++ b/src-tauri/src/config/clash.rs @@ -50,9 +50,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-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()); Self(map) } From a07c579497cf80b3cb025d6894f4ba4e99f87604 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 13 Oct 2024 02:42:37 +0800 Subject: [PATCH 108/288] chore: adjust tun default parameters --- src-tauri/src/config/clash.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src-tauri/src/config/clash.rs b/src-tauri/src/config/clash.rs index 6f94e33c..33f968cb 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")] From cd8daa929ac42036ebf232f739a282542171585b Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 13 Oct 2024 02:55:35 +0800 Subject: [PATCH 109/288] chore: update deps --- package.json | 2 +- pnpm-lock.yaml | 90 +-- src-tauri/Cargo.lock | 1382 ++++++++++++++++++++++++++++-------------- 3 files changed, 980 insertions(+), 494 deletions(-) diff --git a/package.json b/package.json index 226e4496..41439635 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ }, "devDependencies": { "@actions/github": "^5.1.1", - "@tauri-apps/cli": "2.0.0-rc.18", + "@tauri-apps/cli": "2.0.3", "@types/js-cookie": "^3.0.6", "@types/js-yaml": "^4.0.9", "@types/lodash-es": "^4.17.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e2ec9df9..4c9c8604 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -156,8 +156,8 @@ importers: specifier: ^5.1.1 version: 5.1.1 "@tauri-apps/cli": - specifier: 2.0.0-rc.18 - version: 2.0.0-rc.18 + specifier: 2.0.3 + version: 2.0.3 "@types/js-cookie": specifier: ^3.0.6 version: 3.0.6 @@ -2103,100 +2103,100 @@ packages: integrity: sha512-UNiIhhKG08j4ooss2oEEVexffmWkgkYlC2M3GcX3VPtNsqFgVNL8Mcw/4Y7rO9M9S+ffAMnLOF5ypzyuyb8tyg==, } - "@tauri-apps/cli-darwin-arm64@2.0.0-rc.18": + "@tauri-apps/cli-darwin-arm64@2.0.3": resolution: { - integrity: sha512-L2/VQ4q1pZyhqOifarVDJf/+JabU6DSUMj6979wXrUOOxmyfLCZaw5qGGsbirYOfxWMo+qcXEFRF411YIv9qWw==, + integrity: sha512-jIsbxGWS+As1ZN7umo90nkql/ZAbrDK0GBT6UsgHSz5zSwwArICsZFFwE1pLZip5yoiV5mn3TGG2c1+v+0puzQ==, } engines: { node: ">= 10" } cpu: [arm64] os: [darwin] - "@tauri-apps/cli-darwin-x64@2.0.0-rc.18": + "@tauri-apps/cli-darwin-x64@2.0.3": resolution: { - integrity: sha512-ri0NrRAh2CqejoKym67m9Devpqppnn4SrwWnuqV68oHXan3ibn2CeY+g3ygkb6Ch0v5ZcbxJEtop5fZwUTFH4w==, + integrity: sha512-ROITHtLTA1muyrwgyuwyasmaLCGtT4as/Kd1kerXaSDtFcYrnxiM984ZD0+FDUEDl5BgXtYa/sKKkKQFjgmM0A==, } engines: { node: ">= 10" } cpu: [x64] os: [darwin] - "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.18": + "@tauri-apps/cli-linux-arm-gnueabihf@2.0.3": resolution: { - integrity: sha512-+dDZQIHXufqq3WVrKycudVeJa8xfRzIY2XHSYunWS5RMRx1PrcvLbZLBcm3BMtwuY9pwbzrpDHL4K/1+Maj4JQ==, + integrity: sha512-bQ3EZwCFfrLg/ZQ2I8sLuifSxESz4TP56SleTkKsPtTIZgNnKpM88PRDz4neiRroHVOq8NK0X276qi9LjGcXPw==, } engines: { node: ">= 10" } cpu: [arm] os: [linux] - "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.18": + "@tauri-apps/cli-linux-arm64-gnu@2.0.3": resolution: { - integrity: sha512-pti3FmMAJKArbr8FyoU8eFbcRHRcFRaD16crjNfXfGFGUGNXeMcrAAZptDpGZ9fPfMYBQYzUN/uKqHvrlrYFIw==, + integrity: sha512-aLfAA8P9OTErVUk3sATxtXqpAtlfDPMPp4fGjDysEELG/MyekGhmh2k/kG/i32OdPeCfO+Nr37wJksARJKubGw==, } engines: { node: ">= 10" } cpu: [arm64] os: [linux] - "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.18": + "@tauri-apps/cli-linux-arm64-musl@2.0.3": resolution: { - integrity: sha512-1e+h543bXRnLLhUwhglnnH6eN4dgtbxKS48oHsBCpLEqLNrovHTHEd1xSZgUAEOh9J9hpIh6Bme7loCwOps9ZQ==, + integrity: sha512-I4MVD7nf6lLLRmNQPpe5beEIFM6q7Zkmh77ROA5BNu/+vHNL5kiTMD+bmd10ZL2r753A6pO7AvqkIxcBuIl0tg==, } engines: { node: ">= 10" } cpu: [arm64] os: [linux] - "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.18": + "@tauri-apps/cli-linux-x64-gnu@2.0.3": resolution: { - integrity: sha512-5lwBuY06s5J1iCOZq+hM6spBhaGejkh8zn8HdVjnL0mqZ+cH/qbC1Uss6HO/gC1Q53JQFoYeam2P2/8UuNjlHQ==, + integrity: sha512-C6Jkx2zZGKkoi+sg5FK9GoH/0EvAaOgrZfF5azV5EALGba46g7VpWcZgp9zFUd7K2IzTi+0OOY8TQ2OVfKZgew==, } engines: { node: ">= 10" } cpu: [x64] os: [linux] - "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.18": + "@tauri-apps/cli-linux-x64-musl@2.0.3": resolution: { - integrity: sha512-jtJ1EP6GhW258MKujampDbPWX+El26m8yGBzEcZxurrhFvN8d3QHgle4eT/cgqlVT+AZ9DVrhDwTfXilGjERZA==, + integrity: sha512-qi4ghmTfSAl+EEUDwmwI9AJUiOLNSmU1RgiGgcPRE+7A/W+Am9UnxYySAiRbB/gJgTl9sj/pqH5Y9duP1/sqHg==, } engines: { node: ">= 10" } cpu: [x64] os: [linux] - "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.18": + "@tauri-apps/cli-win32-arm64-msvc@2.0.3": resolution: { - integrity: sha512-E9PSjWwvUnhnW/wjXti0UQgXDYLTUBKWtT2yOS2dXLspmvh1vwdRgZn/AjhjMM2HwZzhBW94Qys06mQAz6z2vg==, + integrity: sha512-UXxHkYmFesC97qVmZre4vY7oDxRDtC2OeKNv0bH+iSnuUp/ROxzJYGyaelnv9Ybvgl4YVqDCnxgB28qMM938TA==, } engines: { node: ">= 10" } cpu: [arm64] os: [win32] - "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.18": + "@tauri-apps/cli-win32-ia32-msvc@2.0.3": resolution: { - integrity: sha512-I+r88I/Dyqex7oV1NOtW3kxYoRegjxtQrQLILGsn6xcirTERnX0pPl1GYW5ooTxvs/H+qt4tuW5iL8Fp1lpmuQ==, + integrity: sha512-D+xoaa35RGlkXDpnL5uDTpj29untuC5Wp6bN9snfgFDagD0wnFfC8+2ZQGu16bD0IteWqDI0OSoIXhNvy+F+wg==, } engines: { node: ">= 10" } cpu: [ia32] os: [win32] - "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.18": + "@tauri-apps/cli-win32-x64-msvc@2.0.3": resolution: { - integrity: sha512-IEl0dDc10ln1rt2SGoNxKiYJIDS/fBsS1hTKT4cfZeeKCgHOqMqpdGq25RaVmkkk0UhW/9WeyjxIyFGO3ll4TA==, + integrity: sha512-eWV9XWb4dSYHXl13OtYWLjX1JHphUEkHkkGwJrhr8qFBm7RbxXxQvrsUEprSi51ug/dwJenjJgM4zR8By4htfw==, } engines: { node: ">= 10" } cpu: [x64] os: [win32] - "@tauri-apps/cli@2.0.0-rc.18": + "@tauri-apps/cli@2.0.3": resolution: { - integrity: sha512-43PjSEISHI3uH2jyR7QlEJUv1yQYlCOvm5eEdadhHIooV5Dqjs6zkddwEJuHYRpSLI/IfiQ8VPBYrw/GfyvhCA==, + integrity: sha512-JwEyhc5BAVpn4E8kxzY/h7+bVOiXQdudR1r3ODMfyyumZBfgIWqpD/WuTcPq6Yjchju1BSS+80jAE/oYwI/RKg==, } engines: { node: ">= 10" } hasBin: true @@ -6094,48 +6094,48 @@ snapshots: "@tauri-apps/api@2.0.0-rc.4": {} - "@tauri-apps/cli-darwin-arm64@2.0.0-rc.18": + "@tauri-apps/cli-darwin-arm64@2.0.3": optional: true - "@tauri-apps/cli-darwin-x64@2.0.0-rc.18": + "@tauri-apps/cli-darwin-x64@2.0.3": optional: true - "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.18": + "@tauri-apps/cli-linux-arm-gnueabihf@2.0.3": optional: true - "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.18": + "@tauri-apps/cli-linux-arm64-gnu@2.0.3": optional: true - "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.18": + "@tauri-apps/cli-linux-arm64-musl@2.0.3": optional: true - "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.18": + "@tauri-apps/cli-linux-x64-gnu@2.0.3": optional: true - "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.18": + "@tauri-apps/cli-linux-x64-musl@2.0.3": optional: true - "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.18": + "@tauri-apps/cli-win32-arm64-msvc@2.0.3": optional: true - "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.18": + "@tauri-apps/cli-win32-ia32-msvc@2.0.3": optional: true - "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.18": + "@tauri-apps/cli-win32-x64-msvc@2.0.3": optional: true - "@tauri-apps/cli@2.0.0-rc.18": + "@tauri-apps/cli@2.0.3": optionalDependencies: - "@tauri-apps/cli-darwin-arm64": 2.0.0-rc.18 - "@tauri-apps/cli-darwin-x64": 2.0.0-rc.18 - "@tauri-apps/cli-linux-arm-gnueabihf": 2.0.0-rc.18 - "@tauri-apps/cli-linux-arm64-gnu": 2.0.0-rc.18 - "@tauri-apps/cli-linux-arm64-musl": 2.0.0-rc.18 - "@tauri-apps/cli-linux-x64-gnu": 2.0.0-rc.18 - "@tauri-apps/cli-linux-x64-musl": 2.0.0-rc.18 - "@tauri-apps/cli-win32-arm64-msvc": 2.0.0-rc.18 - "@tauri-apps/cli-win32-ia32-msvc": 2.0.0-rc.18 - "@tauri-apps/cli-win32-x64-msvc": 2.0.0-rc.18 + "@tauri-apps/cli-darwin-arm64": 2.0.3 + "@tauri-apps/cli-darwin-x64": 2.0.3 + "@tauri-apps/cli-linux-arm-gnueabihf": 2.0.3 + "@tauri-apps/cli-linux-arm64-gnu": 2.0.3 + "@tauri-apps/cli-linux-arm64-musl": 2.0.3 + "@tauri-apps/cli-linux-x64-gnu": 2.0.3 + "@tauri-apps/cli-linux-x64-musl": 2.0.3 + "@tauri-apps/cli-win32-arm64-msvc": 2.0.3 + "@tauri-apps/cli-win32-ia32-msvc": 2.0.3 + "@tauri-apps/cli-win32-x64-msvc": 2.0.3 "@tauri-apps/plugin-clipboard-manager@2.0.0-rc.0": dependencies: diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 4c2facab..829ced23 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -4,9 +4,9 @@ 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", ] @@ -45,6 +45,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -83,9 +89,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "arbitrary" @@ -98,13 +104,13 @@ dependencies = [ [[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", @@ -120,6 +126,17 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + [[package]] name = "arrayvec" version = "0.7.6" @@ -128,18 +145,22 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "ashpd" -version = "0.8.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd884d7c72877a94102c3715f3b1cd09ff4fac28221add3e57cfbe25c236d093" +checksum = "4d43c03d9e36dd40cab48435be0b09646da362c278223ca535493877b2c1dee9" dependencies = [ "enumflags2", "futures-channel", "futures-util", "rand 0.8.5", + "raw-window-handle 0.6.2", "serde", "serde_repr", "tokio", "url", + "wayland-backend", + "wayland-client", + "wayland-protocols", "zbus", ] @@ -180,9 +201,9 @@ 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", @@ -247,7 +268,7 @@ dependencies = [ "futures-lite 2.3.0", "parking", "polling 3.7.3", - "rustix 0.38.35", + "rustix 0.38.37", "slab", "tracing", "windows-sys 0.59.0", @@ -297,15 +318,15 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.35", + "rustix 0.38.37", "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", @@ -316,9 +337,8 @@ dependencies = [ "cfg-if", "event-listener 5.3.0", "futures-lite 2.3.0", - "rustix 0.38.35", + "rustix 0.38.37", "tracing", - "windows-sys 0.59.0", ] [[package]] @@ -329,7 +349,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -344,7 +364,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.35", + "rustix 0.38.37", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -352,9 +372,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 +383,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.79", ] [[package]] @@ -380,13 +400,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.79", ] [[package]] @@ -431,9 +451,32 @@ dependencies = [ [[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 = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom 7.1.3", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876c75a42f6364451a033496a14c44bffe41f5f4a8236f697391f11024e596d2" +dependencies = [ + "arrayvec", +] [[package]] name = "axum" @@ -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 0.8.0", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -534,6 +577,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bitstream-io" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b81e1519b0d82120d2fd469d5bfb2919a9361c48b02d82d04befc1cdd2002452" + [[package]] name = "block" version = "0.1.6" @@ -589,7 +638,7 @@ dependencies = [ "bitflags 2.6.0", "boa_interner", "boa_macros", - "indexmap 2.5.0", + "indexmap 2.6.0", "num-bigint", "rustc-hash", ] @@ -615,7 +664,7 @@ dependencies = [ "fast-float", "hashbrown 0.14.5", "icu_normalizer", - "indexmap 2.5.0", + "indexmap 2.6.0", "intrusive-collections", "itertools 0.13.0", "num-bigint", @@ -661,7 +710,7 @@ 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", @@ -676,7 +725,7 @@ checksum = "240f4126219a83519bad05c9a40bfc0303921eeb571fc2d7e44c17ffac99d3f1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "synstructure", ] @@ -739,6 +788,12 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "built" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "236e6289eda5a812bc6b53c3b024039382a2895fbbeef2d748b2931546d392c4" + [[package]] name = "bumpalo" version = "3.16.0" @@ -747,22 +802,22 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773d90827bc3feecfb67fab12e24de0749aad83c74b9504ecde46237b5cd24e2" +checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" 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.79", ] [[package]] @@ -779,9 +834,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.7.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" dependencies = [ "serde", ] @@ -855,10 +910,12 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.15" +version = "1.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" +checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" dependencies = [ + "jobserver", + "libc", "shlex", ] @@ -1066,7 +1123,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1180,9 +1237,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -1281,7 +1338,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1291,7 +1348,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1315,7 +1372,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1326,7 +1383,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1416,7 +1473,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1429,7 +1486,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1575,7 +1632,16 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", +] + +[[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]] @@ -1598,7 +1664,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1610,6 +1676,12 @@ 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" @@ -1654,9 +1726,9 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "embed-resource" -version = "2.4.3" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4edcacde9351c33139a41e3c97eb2334351a81a2791bebb0b243df837128f602" +checksum = "f4e24052d7be71f0efb50c201557f6fe7d237cfd5a64fd5bcd7fd8fe32dbbffa" dependencies = [ "cc", "memchr", @@ -1705,7 +1777,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1736,9 +1808,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" @@ -1817,9 +1889,9 @@ checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "fdeflate" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +checksum = "d8090f921a24b04994d9929e204f50b498a33ea6ba559ffaa05e04f7ee7fb5ab" dependencies = [ "simd-adler32", ] @@ -1859,9 +1931,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.33" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", "miniz_oxide 0.8.0", @@ -1891,6 +1963,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -1918,7 +1996,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1954,9 +2032,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", @@ -1969,9 +2047,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", @@ -1979,15 +2057,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", @@ -1996,9 +2074,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" @@ -2030,32 +2108,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.79", ] [[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", @@ -2177,19 +2255,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" @@ -2244,9 +2309,9 @@ dependencies = [ [[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" @@ -2314,7 +2379,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2335,15 +2400,14 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "global-hotkey" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298a7667d6011efe6b35673c6b29001b88677ae1b3d6b2feccfbff4b44892866" +checksum = "d1b75248f33c73df1ed69673f6cb36d2e048ae84d29aa1d3e53199d138ebb1df" dependencies = [ - "bitflags 2.6.0", - "cocoa 0.26.0", "crossbeam-channel", "keyboard-types", - "objc", + "objc2", + "objc2-app-kit", "once_cell", "serde", "thiserror", @@ -2411,7 +2475,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2426,7 +2490,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.5.0", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -2445,7 +2509,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.1.0", - "indexmap 2.5.0", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -2492,6 +2556,17 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + [[package]] name = "headers" version = "0.3.9" @@ -2639,9 +2714,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" @@ -2701,9 +2776,9 @@ 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", @@ -2747,9 +2822,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" dependencies = [ "bytes", "futures-channel", @@ -2760,16 +2835,15 @@ dependencies = [ "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", @@ -2913,7 +2987,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2932,24 +3006,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "image" -version = "0.24.9" -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" @@ -2958,11 +3014,37 @@ checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" dependencies = [ "bytemuck", "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", "num-traits", "png", + "qoi", + "ravif", + "rayon", + "rgb", "tiff", + "zune-core", + "zune-jpeg", ] +[[package]] +name = "image-webp" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79afb8cbee2ef20f59ccd477a218c12a93943d075b492015ecb1bb81f8ee904" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" + [[package]] name = "indexmap" version = "1.9.3" @@ -2976,24 +3058,15 @@ 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.0", "serde", ] -[[package]] -name = "infer" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb33622da908807a06f9513c19b3c1ad50fab3e4137d82a78107d502075aa199" -dependencies = [ - "cfb", -] - [[package]] name = "infer" version = "0.16.0" @@ -3029,10 +3102,21 @@ dependencies = [ ] [[package]] -name = "intrusive-collections" -version = "0.9.6" +name = "interpolate_name" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b694dc9f70c3bda874626d2aed13b780f137aab435f4e9814121955cf706122e" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "intrusive-collections" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86" dependencies = [ "memoffset 0.9.1", ] @@ -3050,9 +3134,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" @@ -3159,20 +3243,26 @@ 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", ] @@ -3256,15 +3346,26 @@ 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.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" +dependencies = [ + "arbitrary", + "cc", + "once_cell", +] [[package]] name = "libloading" @@ -3276,6 +3377,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" @@ -3371,27 +3482,21 @@ dependencies = [ ] [[package]] -name = "loom" -version = "0.5.6" +name = "loop9" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "serde", - "serde_json", - "tracing", - "tracing-subscriber", + "imgref", ] [[package]] name = "lru" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] @@ -3402,9 +3507,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", @@ -3457,6 +3562,15 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", +] + [[package]] name = "memchr" version = "2.7.4" @@ -3522,7 +3636,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", - "simd-adler32", ] [[package]] @@ -3532,6 +3645,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -3548,16 +3662,17 @@ dependencies = [ [[package]] name = "muda" -version = "0.14.1" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba8ac4080fb1e097c2c22acae467e46e4da72d941f02e82b67a87a2a89fa38b1" +checksum = "b8123dfd4996055ac9b15a60ad263b44b01e539007523ad7a4a533a3d93b0591" dependencies = [ - "cocoa 0.26.0", "crossbeam-channel", "dpi", "gtk", "keyboard-types", - "objc", + "objc2", + "objc2-app-kit", + "objc2-foundation", "once_cell", "png", "serde", @@ -3735,10 +3850,16 @@ dependencies = [ ] [[package]] -name = "notify-rust" -version = "4.11.1" +name = "noop_proc_macro" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26a1d03b6305ecefdd9c6c60150179bb8d9f0cd4e64bbcad1e41419e7bf5e414" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "notify-rust" +version = "4.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5134a72dc570b178bff81b01e81ab14a6fcc015391ed4b3b14853090658cd3a3" dependencies = [ "log", "mac-notification-sys", @@ -3794,6 +3915,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -3803,6 +3935,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -3830,7 +3973,7 @@ dependencies = [ "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3849,7 +3992,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", - "objc_exception", ] [[package]] @@ -3868,6 +4010,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" @@ -3895,6 +4040,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" @@ -3919,6 +4088,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" @@ -3938,6 +4119,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" @@ -3964,12 +4157,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]] @@ -3983,18 +4235,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" @@ -4036,7 +4288,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4135,9 +4387,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" @@ -4170,9 +4422,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" @@ -4192,9 +4444,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.11" +version = "2.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" +checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9" dependencies = [ "memchr", "thiserror", @@ -4203,9 +4455,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.11" +version = "2.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a548d2beca6773b1c244554d36fcf8548a8a58e74156968211567250e48e49a" +checksum = "4d3a6e3394ec80feb3b6393c725571754c6188490265c61aaf260810d6b95aa0" dependencies = [ "pest", "pest_generator", @@ -4213,22 +4465,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.11" +version = "2.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c93a82e8d145725dcbaf44e5ea887c8a869efdcc28706df2d08c69e17077183" +checksum = "94429506bde1ca69d1b5601962c73f4172ab4726571a59ea95931218cb0e930e" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "pest_meta" -version = "2.7.11" +version = "2.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f" +checksum = "ac8a071862e93690b6e34e9a5fb8e33ff3734473ac0245b27232222c4906a33f" dependencies = [ "once_cell", "pest", @@ -4349,7 +4601,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4381,22 +4633,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4424,9 +4676,9 @@ dependencies = [ [[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" @@ -4435,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", @@ -4443,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 0.8.0", ] [[package]] @@ -4480,7 +4732,7 @@ dependencies = [ "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.35", + "rustix 0.38.37", "tracing", "windows-sys 0.59.0", ] @@ -4499,9 +4751,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" @@ -4576,13 +4828,32 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" +dependencies = [ + "quote", + "syn 2.0.79", +] + [[package]] name = "prost" version = "0.12.6" @@ -4603,7 +4874,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4649,10 +4920,19 @@ 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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" dependencies = [ "bytes", "pin-project-lite", @@ -4668,9 +4948,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.6" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba92fb39ec7ad06ca2582c0ca834dfeadcaf06ddfc8e635c80aa7e1c05315fdd" +checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" dependencies = [ "bytes", "rand 0.8.5", @@ -4685,15 +4965,15 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285" +checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" dependencies = [ "libc", "once_cell", "socket2 0.5.7", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4786,6 +5066,55 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.12.1", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive 0.4.2", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand 0.8.5", + "rand_chacha 0.3.1", + "simd_helpers", + "system-deps", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f0bfd976333248de2078d350bfdf182ff96e168a24d23d2436cef320dd4bdd" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rgb", +] + [[package]] name = "raw-window-handle" version = "0.5.2" @@ -4820,9 +5149,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", ] @@ -4840,14 +5169,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.6" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", ] [[package]] @@ -4861,13 +5190,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -4878,9 +5207,9 @@ 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" @@ -4894,9 +5223,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.7" +version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ "base64 0.22.1", "bytes", @@ -4939,26 +5268,25 @@ dependencies = [ "wasm-streams", "web-sys", "webpki-roots", - "windows-registry", + "windows-registry 0.2.0", ] [[package]] name = "rfd" -version = "0.14.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a73a7337fc24366edfca76ec521f51877b114e42dab584008209cca6719251" +checksum = "8af382a047821a08aa6bfc09ab0d80ff48d45d8726f7cd8e44891f7cb4a4278e" 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", @@ -4966,6 +5294,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +dependencies = [ + "bytemuck", +] + [[package]] name = "ring" version = "0.17.8" @@ -4983,11 +5320,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]] @@ -5065,9 +5403,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.35" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ "bitflags 2.6.0", "errno", @@ -5078,9 +5416,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.12" +version = "0.23.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" +checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" dependencies = [ "once_cell", "ring", @@ -5092,25 +5430,24 @@ 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.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" [[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", @@ -5146,11 +5483,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5165,6 +5502,7 @@ dependencies = [ "serde", "serde_json", "url", + "uuid", ] [[package]] @@ -5176,7 +5514,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5206,9 +5544,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.1" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -5278,9 +5616,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] @@ -5308,13 +5646,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5325,14 +5663,14 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "serde_json" -version = "1.0.127" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa 1.0.11", "memchr", @@ -5348,14 +5686,14 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[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", ] @@ -5374,15 +5712,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", @@ -5392,14 +5730,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.79", ] [[package]] @@ -5408,7 +5746,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", @@ -5542,6 +5880,15 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "siphasher" version = "0.3.11" @@ -5602,25 +5949,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]] @@ -5670,15 +6016,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" @@ -5747,9 +6084,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -5779,7 +6116,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5793,7 +6130,7 @@ dependencies = [ "memchr", "ntapi", "rayon", - "windows 0.56.0", + "windows 0.57.0", ] [[package]] @@ -5846,9 +6183,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.30.0" +version = "0.30.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a93f2c6b8fdaeb7f417bda89b5bc767999745c3052969664ae1fa65892deb7e" +checksum = "a0dbbebe82d02044dfa481adca1550d6dd7bd16e086bc34fa0fbecceb5a63751" dependencies = [ "bitflags 2.6.0", "cocoa 0.26.0", @@ -5891,7 +6228,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5902,9 +6239,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" +checksum = "4ff6c40d3aedb5e06b57c6f669ad17ab063dd1e63d977c6a88e7f4dfa4f04020" dependencies = [ "filetime", "libc", @@ -5919,13 +6256,12 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.0.0-rc.11" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f60dc86a0513f775a6515d79cf2a54ce38f2fa7225e0c5b9d5ae8241e599afa" +checksum = "fd96d46534b10765ce0c6208f9451d98ea38636364a41b272d3610c70dd0e4c3" dependencies = [ "anyhow", "bytes", - "cocoa 0.26.0", "dirs 5.0.1", "dunce", "embed_plist", @@ -5936,21 +6272,23 @@ dependencies = [ "heck 0.5.0", "http 1.1.0", "http-range", - "image 0.25.2", + "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", @@ -5971,9 +6309,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.0.0-rc.10" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d6fc774b19bedadd547b0310fbdbfadbc7546978eccd6d3e389be7cabc437a" +checksum = "935f9b3c49b22b3e2e485a57f46d61cd1ae07b1cbb2ba87387a387caf2d8c4e7" dependencies = [ "anyhow", "cargo_toml", @@ -5993,9 +6331,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.0.0-rc.10" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d14af7a85713898cb8a6be3ece89eb1c39392d8756dd1cc0309ebd6fdc966eb3" +checksum = "95d7443dd4f0b597704b6a14b964ee2ed16e99928d8e6292ae9825f09fbcd30e" dependencies = [ "base64 0.22.1", "brotli", @@ -6009,7 +6347,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.8", - "syn 2.0.77", + "syn 2.0.79", "tauri-utils", "thiserror", "time", @@ -6020,23 +6358,23 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.0.0-rc.9" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f698301cd7297a7876bb81181a830d40d401461eb14fdaf7ae189b1b56ef76" +checksum = "4d2c0963ccfc3f5194415f2cce7acc975942a8797fbabfb0aa1ed6f59326ae7f" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "tauri-codegen", "tauri-utils", ] [[package]] name = "tauri-plugin" -version = "2.0.0-rc.10" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad2b0b4fe684059a1b700c1a0d7d51698c05b2257ca64eca2a730d7be2e47c6a" +checksum = "b2e6660a409963e4d57b9bfab4addd141eeff41bd3a7fb14e13004a832cf7ef6" dependencies = [ "anyhow", "glob", @@ -6051,11 +6389,11 @@ dependencies = [ [[package]] name = "tauri-plugin-clipboard-manager" -version = "2.0.0-rc.3" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#984110a978774712bad4d746ed06134d54debcd0" +version = "2.0.1" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#7e1c17a635f10d69e10ea9f35081a68c71276203" dependencies = [ "arboard", - "image 0.24.9", + "image", "log", "serde", "serde_json", @@ -6066,8 +6404,8 @@ dependencies = [ [[package]] name = "tauri-plugin-deep-link" -version = "2.0.0-rc.4" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#984110a978774712bad4d746ed06134d54debcd0" +version = "2.0.1" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#7e1c17a635f10d69e10ea9f35081a68c71276203" dependencies = [ "dunce", "log", @@ -6079,15 +6417,15 @@ dependencies = [ "tauri-utils", "thiserror", "url", - "windows-registry", + "windows-registry 0.3.0", "windows-result 0.2.0", ] [[package]] name = "tauri-plugin-devtools" -version = "2.0.0-rc.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4db4d0b3a0b5cd49d77900a236da574f717cc89919f64b6e030bf2990bd73cce" +checksum = "8e5cd17faa36a826e5686bd0fda5bc3f4c903682263f00cd50f2f778fc4bb866" dependencies = [ "async-stream", "bytes", @@ -6112,8 +6450,8 @@ dependencies = [ [[package]] name = "tauri-plugin-dialog" -version = "2.0.0-rc.5" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#984110a978774712bad4d746ed06134d54debcd0" +version = "2.0.1" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#7e1c17a635f10d69e10ea9f35081a68c71276203" dependencies = [ "log", "raw-window-handle 0.6.2", @@ -6129,8 +6467,8 @@ dependencies = [ [[package]] name = "tauri-plugin-fs" -version = "2.0.0-rc.3" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#984110a978774712bad4d746ed06134d54debcd0" +version = "2.0.1" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#7e1c17a635f10d69e10ea9f35081a68c71276203" dependencies = [ "anyhow", "dunce", @@ -6149,9 +6487,9 @@ dependencies = [ [[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", @@ -6164,8 +6502,8 @@ dependencies = [ [[package]] name = "tauri-plugin-notification" -version = "2.0.0-rc.4" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#984110a978774712bad4d746ed06134d54debcd0" +version = "2.0.1" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#7e1c17a635f10d69e10ea9f35081a68c71276203" dependencies = [ "log", "notify-rust", @@ -6182,8 +6520,8 @@ dependencies = [ [[package]] name = "tauri-plugin-process" -version = "2.0.0-rc.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#984110a978774712bad4d746ed06134d54debcd0" +version = "2.0.1" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#7e1c17a635f10d69e10ea9f35081a68c71276203" dependencies = [ "tauri", "tauri-plugin", @@ -6191,8 +6529,8 @@ dependencies = [ [[package]] name = "tauri-plugin-shell" -version = "2.0.0-rc.3" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#984110a978774712bad4d746ed06134d54debcd0" +version = "2.0.1" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#7e1c17a635f10d69e10ea9f35081a68c71276203" dependencies = [ "encoding_rs", "log", @@ -6211,17 +6549,18 @@ dependencies = [ [[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", "flate2", "futures-util", "http 1.1.0", - "infer 0.15.0", + "infer", "minisign-verify", + "percent-encoding", "reqwest", "semver 1.0.23", "serde", @@ -6240,9 +6579,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.0.0-rc.10" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a0758dce4f9e08ebeee877d84de0062859495507e1d16f647f97b29f881b43d" +checksum = "c8f437293d6f5e5dce829250f4dbdce4e0b52905e297a6689cc2963eb53ac728" dependencies = [ "dpi", "gtk", @@ -6259,15 +6598,17 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.0.0-rc.10" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78dd7f77e769630da5d91a55e4f102a84ff9c5a99c71e1b5c916a18b5ccafc16" +checksum = "aaac63b65df8e85570993eaf93ae1dd73a6fb66d8bd99674ce65f41dc3c63e7d" 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", @@ -6284,9 +6625,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.0.0-rc.10" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba92ad9cdf7658fefa29a7218dda0acead9400c021bbf9c3f88e98f5e3b9bbab" +checksum = "c38b0230d6880cf6dd07b6d7dd7789a0869f98ac12146e0d18d1c1049215a045" dependencies = [ "brotli", "cargo_metadata", @@ -6294,7 +6635,7 @@ dependencies = [ "dunce", "glob", "html5ever", - "infer 0.16.0", + "infer", "json-patch", "kuchikiki", "log", @@ -6314,6 +6655,7 @@ dependencies = [ "toml 0.8.2", "url", "urlpattern", + "uuid", "walkdir", ] @@ -6340,14 +6682,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", "fastrand 2.1.1", "once_cell", - "rustix 0.38.35", + "rustix 0.38.37", "windows-sys 0.59.0", ] @@ -6400,7 +6742,7 @@ dependencies = [ "libc", "log", "memmem", - "num-derive", + "num-derive 0.3.3", "num-traits", "ordered-float", "regex", @@ -6430,22 +6772,22 @@ checksum = "a38c90d48152c236a3ab59271da4f4ae63d678c5d7ad6b7714d7cb9760be5e4b" [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -6584,7 +6926,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -6633,9 +6975,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", @@ -6683,7 +7025,7 @@ 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", @@ -6696,7 +7038,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "serde", "serde_spanned", "toml_datetime", @@ -6833,7 +7175,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -6877,9 +7219,9 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.17.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "044d7738b3d50f288ddef035b793228740ad4d927f5466b0af55dc15e7e03cfe" +checksum = "533fc2d4105e0e3d96ce1c71f2d308c9fbbe2ef9c587cab63dd627ab5bde218f" dependencies = [ "core-graphics 0.24.0", "crossbeam-channel", @@ -6950,9 +7292,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" @@ -7017,30 +7359,30 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[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 = "unsafe-any-ors" @@ -7128,6 +7470,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" dependencies = [ "getrandom 0.2.15", + "serde", +] + +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", ] [[package]] @@ -7251,9 +7605,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", @@ -7262,24 +7616,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.79", "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", @@ -7289,9 +7643,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", @@ -7299,28 +7653,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.79", "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.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" dependencies = [ "futures-util", "js-sys", @@ -7330,10 +7684,70 @@ 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.37", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3f45d1222915ef1fd2057220c1d9d9624b7654443ea35c3877f7a52bd0a5a2d" +dependencies = [ + "bitflags 2.6.0", + "rustix 0.38.37", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b5755d77ae9040bb872a25026555ce4cb0ae75fd923e90d25fba07d81057de0" +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", @@ -7385,9 +7799,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", ] @@ -7414,7 +7828,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -7443,7 +7857,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.35", + "rustix 0.38.37", ] [[package]] @@ -7491,26 +7905,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.56.0" @@ -7521,6 +7927,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" @@ -7552,6 +7968,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" @@ -7561,7 +7989,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", ] @@ -7573,7 +8001,18 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", +] + +[[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.79", ] [[package]] @@ -7584,7 +8023,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -7595,7 +8034,18 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", +] + +[[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.79", ] [[package]] @@ -7606,7 +8056,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -7616,7 +8066,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", ] @@ -7648,6 +8109,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" @@ -7913,14 +8383,12 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wry" -version = "0.43.1" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4d715cf5fe88e9647f3d17b207b6d060d4a88e7171d4ccb2d2c657dd1d44728" +checksum = "469a3765ecc3e8aa9ccdf3c5a52c82697ec03037cd60494488763880d31a1b3a" dependencies = [ "base64 0.22.1", - "block", - "cocoa 0.26.0", - "core-graphics 0.24.0", + "block2", "crossbeam-channel", "dpi", "dunce", @@ -7933,8 +8401,11 @@ 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", @@ -7980,7 +8451,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ "gethostname", - "rustix 0.38.35", + "rustix 0.38.37", "x11rb-protocol", ] @@ -7998,7 +8469,7 @@ checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", "linux-raw-sys 0.4.14", - "rustix 0.38.35", + "rustix 0.38.37", ] [[package]] @@ -8037,7 +8508,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "synstructure", ] @@ -8052,7 +8523,7 @@ dependencies = [ "async-fs 2.1.2", "async-io 2.3.4", "async-lock 3.4.0", - "async-process 2.2.4", + "async-process 2.3.0", "async-recursion", "async-task", "async-trait", @@ -8124,7 +8595,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -8144,7 +8615,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "synstructure", ] @@ -8173,7 +8644,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -8186,11 +8657,17 @@ dependencies = [ "crc32fast", "crossbeam-utils", "displaydoc", - "indexmap 2.5.0", + "indexmap 2.6.0", "memchr", "thiserror", ] +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + [[package]] name = "zune-inflate" version = "0.2.54" @@ -8200,6 +8677,15 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "zune-jpeg" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16099418600b4d8f028622f73ff6e3deaabdff330fb9a2a131dea781ee8b0768" +dependencies = [ + "zune-core", +] + [[package]] name = "zvariant" version = "4.0.0" From 90361242ac081621c887d90f15c17a3cf2391a09 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 13 Oct 2024 03:01:32 +0800 Subject: [PATCH 110/288] chore: update --- src-tauri/src/config/clash.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src-tauri/src/config/clash.rs b/src-tauri/src/config/clash.rs index 33f968cb..8054ccae 100644 --- a/src-tauri/src/config/clash.rs +++ b/src-tauri/src/config/clash.rs @@ -51,7 +51,6 @@ impl IClashTemp { 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-private-network".into(), true.into()); cors_map.insert("allow-origins".into(), vec!["*"].into()); map.insert("secret".into(), "".into()); map.insert("tun".into(), tun.into()); From 12690ed464fc58ae1ab4eda13be6bfa922fe09a3 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 14 Oct 2024 13:45:26 +0800 Subject: [PATCH 111/288] chore: remove windows esc shortcut key --- src-tauri/src/lib.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 5eb860d3..cbf8245a 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -156,7 +156,6 @@ pub fn run() { #[cfg(not(target_os = "macos"))] { log_err!(hotkey::Hotkey::global().register("Control+Q", "quit")); - log_err!(hotkey::Hotkey::global().register("Escape", "quit")); }; } tauri::WindowEvent::Focused(false) => { @@ -168,7 +167,6 @@ pub fn run() { #[cfg(not(target_os = "macos"))] { log_err!(hotkey::Hotkey::global().unregister("Control+Q")); - log_err!(hotkey::Hotkey::global().unregister("Escape")); }; } _ => {} From 6ee7be7cae7f6a322a58e8679a33bf61539c6d27 Mon Sep 17 00:00:00 2001 From: wonfen Date: Tue, 15 Oct 2024 02:32:25 +0800 Subject: [PATCH 112/288] chore: update changelog and texts --- UPDATELOG.md | 18 ++++++++++++++++-- src-tauri/src/core/tray.rs | 4 ++-- src/locales/en.json | 4 ++-- src/locales/fa.json | 4 ++-- src/locales/ru.json | 4 ++-- src/locales/zh.json | 4 ++-- 6 files changed, 26 insertions(+), 12 deletions(-) diff --git a/UPDATELOG.md b/UPDATELOG.md index ff9fd682..aeeebbb1 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -7,21 +7,35 @@ ### Features -- Meta(mihomo)内核升级 1.18.8 +- Meta(mihomo)内核升级 1.18.9 +- Win 下的系统代理替换为 Shadowsocks/CFW/v2rayN 等成熟的 sysproxy.exe 方案,解决拨号/VPN 环境下无法设置系统代理的问题 +- 服务模式改进为启动软件时自动安装,TUN 模式可自由开启不再限制于服务模式 - Mac 下可用 URL Scheme 导入订阅 +- 可使用 Ctrl(cmd)+Q 快捷键退出程序 - 成功导入订阅的提示消息 - 能自动选中新导入的订阅 +- 日志加入颜色区分 - 改进多处文本表述 +- 加入图标 svg 格式检测 +- 增加更多 app 调试日志 ### Performance -- 优化内核启动逻辑 +- 优化及重构内核启动管理逻辑 - 优化 TUN 启动逻辑 +- 重构和优化 app_handle +- 重构系统代理绕过逻辑 - 移除无用的 PID 创建逻辑 ### Bugs Fixes - 修复已有多个订阅导入新订阅会跳选订阅的问题 +- 修复 Linux wayland 下任务栏图标缺失的问题 +- 移除多余退出变量和钩子 + +### 已知问题 + +- 由于[Tauri 底层依赖库 bug](https://github.com/tauri-apps/tauri/issues/10546),在测试节点连通性时关闭窗口会导致程序崩溃;在底层 bug 未修复前,暂时屏蔽窗口关闭功能。 --- diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index e9c75adc..8189381e 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -196,7 +196,7 @@ impl Tray { "Clash Verge {version}\n{}: {}\n{}: {}\n{}: {}", t!("SysProxy", "系统代理", use_zh), switch_map[system_proxy], - t!("TUN", "Tun模式", use_zh), + t!("TUN", "Tun(虚拟网卡)模式", use_zh), switch_map[tun_mode], t!("Profile", "当前订阅", use_zh), current_profile_name @@ -267,7 +267,7 @@ fn create_tray_menu( let tun_mode = &CheckMenuItem::with_id( app_handle, "tun_mode", - t!("TUN Mode", "Tun 模式", use_zh), + t!("TUN Mode", "Tun(虚拟网卡)模式", use_zh), true, tun_mode_enabled, None::<&str>, diff --git a/src/locales/en.json b/src/locales/en.json index aee51fed..b2285efe 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, and when enabled, there is no need to activate the 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", diff --git a/src/locales/fa.json b/src/locales/fa.json index 50162d2f..b513dbc0 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -191,9 +191,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": "سیستم و ترکیبی تنها می‌توانند در حالت سرویس استفاده شوند", "Device": "نام دستگاه", diff --git a/src/locales/ru.json b/src/locales/ru.json index cb0f381e..2d5b115a 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -191,9 +191,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": "Имя устройства", diff --git a/src/locales/zh.json b/src/locales/zh.json index aededb7f..21ce34a8 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 网卡名称", From ea2b6a9ad8fd11fc0d6f2ae7a1d10cb8b5031f8e Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 15 Oct 2024 02:35:50 +0800 Subject: [PATCH 113/288] fix: path escape issue --- src-tauri/src/core/service.rs | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index d9efcf14..dc821e87 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -26,9 +26,6 @@ pub struct JsonResponse { pub data: Option, } -/// Install the Clash Verge Service -/// 该函数应该在协程或者线程中执行,避免UAC弹窗阻塞主线程 -/// #[cfg(target_os = "windows")] pub async fn reinstall_service() -> Result<()> { use deelevate::{PrivilegeLevel, Token}; @@ -74,38 +71,41 @@ pub async fn reinstall_service() -> Result<()> { } #[cfg(target_os = "linux")] -pub async fn reinstall_service() -> Result<()> { +pub async fn reinstall_service1() -> Result<()> { use users::get_effective_uid; let binary_path = dirs::service_path()?; - let installer_path = binary_path.with_file_name("install-service"); - let uninstaller_path = binary_path.with_file_name("uninstall-service"); + let install_path = binary_path.with_file_name("install-service"); + let uninstall_path = binary_path.with_file_name("uninstall-service"); - if !installer_path.exists() { + if !install_path.exists() { bail!("installer not found"); } - if !uninstaller_path.exists() { + if !uninstall_path.exists() { bail!("uninstaller not found"); } + let install_shell: String = install_path.to_string_lossy().replace(" ", "\\ "); + let uninstall_shell: String = uninstall_path.to_string_lossy().replace(" ", "\\ "); + let elevator = crate::utils::help::linux_elevator(); let _ = match get_effective_uid() { - 0 => StdCommand::new(uninstaller_path).status()?, + 0 => StdCommand::new(uninstall_path).status()?, _ => StdCommand::new(elevator) .arg("sh") .arg("-c") - .arg(uninstaller_path) + .arg(uninstall_shell) .status()?, }; let elevator = crate::utils::help::linux_elevator(); let status = match get_effective_uid() { - 0 => StdCommand::new(installer_path).status()?, + 0 => StdCommand::new(install_shell).status()?, _ => StdCommand::new(elevator) .arg("sh") .arg("-c") - .arg(installer_path) + .arg(install_shell) .status()?, }; @@ -122,10 +122,10 @@ pub async fn reinstall_service() -> Result<()> { #[cfg(target_os = "macos")] pub async fn reinstall_service() -> Result<()> { let binary_path = dirs::service_path()?; - let installer_path = binary_path.with_file_name("install-service"); + let install_path = binary_path.with_file_name("install-service"); let uninstall_path = binary_path.with_file_name("uninstall-service"); - if !installer_path.exists() { + if !install_path.exists() { bail!("installer not found"); } @@ -133,8 +133,8 @@ pub async fn reinstall_service() -> Result<()> { bail!("uninstaller not found"); } - let install_shell: String = installer_path.to_string_lossy().replace(" ", "\\\\ "); - let uninstall_shell: String = uninstall_path.to_string_lossy().replace(" ", "\\\\ "); + let install_shell: String = install_path.to_string_lossy().replace(" ", "\\ "); + let uninstall_shell: String = uninstall_path.to_string_lossy().replace(" ", "\\ "); let command = format!( r#"do shell script "sudo {uninstall_shell} && sudo {install_shell}" with administrator privileges"# ); From 64634ef07b27474fdc2c8d037175c65e6f6aab90 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 16 Oct 2024 01:53:16 +0800 Subject: [PATCH 114/288] chore: t emporarily cancel window closure and change to minimize --- src/components/layout/layout-control.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/layout/layout-control.tsx b/src/components/layout/layout-control.tsx index eda6a8c3..bd12afd5 100644 --- a/src/components/layout/layout-control.tsx +++ b/src/components/layout/layout-control.tsx @@ -95,7 +95,7 @@ export const LayoutControl = () => { svg: { transform: "scale(1.05)" }, ":hover": { bgcolor: "#ff000090" }, }} - onClick={() => appWindow.close()} + onClick={() => appWindow.hide()} > From 5e8c6c6b2336dfd935adb5c725ada7f6d33d50b6 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 16 Oct 2024 01:53:33 +0800 Subject: [PATCH 115/288] chore : update version --- package.json | 2 +- src-tauri/tauri.conf.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 41439635..859ea1d9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "clash-verge", - "version": "2.0.0", + "version": "2.0.0-rc.1", "license": "GPL-3.0-only", "scripts": { "dev": "cross-env RUST_BACKTRACE=1 tauri dev", diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 613dcd62..cd52f209 100755 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -25,7 +25,7 @@ "devUrl": "http://localhost:3000/" }, "productName": "Clash Verge", - "version": "2.0.0", + "version": "2.0.0-rc.1", "identifier": "io.github.clash-verge-rev.clash-verge-rev", "plugins": { "updater": { From f7b1da75576e26ff7566f9dcdc58242da2b7e9bb Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 16 Oct 2024 01:55:22 +0800 Subject: [PATCH 116/288] chore: update --- src-tauri/src/core/service.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index dc821e87..6981b11d 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -71,7 +71,7 @@ pub async fn reinstall_service() -> Result<()> { } #[cfg(target_os = "linux")] -pub async fn reinstall_service1() -> Result<()> { +pub async fn reinstall_service() -> Result<()> { use users::get_effective_uid; let binary_path = dirs::service_path()?; From d5d39e1c2af5bd2ab2f5884cfb58791cc5cefc82 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 16 Oct 2024 02:52:48 +0800 Subject: [PATCH 117/288] fix: system proxy cannot be closed on mac --- src-tauri/src/core/sysopt.rs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index 5229ec64..2450b5de 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -76,7 +76,7 @@ impl Sysopt { .unwrap_or(Config::clash().data().get_mixed_port()); let pac_port = IVerge::get_singleton_port(); - let (enable, pac) = { + let (sys_enable, pac_enable) = { let verge = Config::verge(); let verge = verge.latest(); ( @@ -88,25 +88,36 @@ impl Sysopt { #[cfg(not(target_os = "windows"))] { let mut sys = Sysproxy { - enable, + enable: false, host: String::from("127.0.0.1"), port, bypass: get_bypass(), }; let mut auto = Autoproxy { - enable, + enable: false, url: format!("http://127.0.0.1:{pac_port}/commands/pac"), }; - if pac { + + if !sys_enable && !pac_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()?; - } else { + 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")] From 377ff279b82c834236755bc0b065ad84dfb76676 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 16 Oct 2024 02:55:23 +0800 Subject: [PATCH 118/288] chore: update --- src-tauri/src/core/sysopt.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index 2450b5de..976c0bb3 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -98,7 +98,7 @@ impl Sysopt { url: format!("http://127.0.0.1:{pac_port}/commands/pac"), }; - if !sys_enable && !pac_enable { + if !sys_enable { sys.set_system_proxy()?; auto.set_auto_proxy()?; return Ok(()); @@ -122,7 +122,7 @@ impl Sysopt { } #[cfg(target_os = "windows")] { - if !enable { + if !sys_enable { return self.reset_sysproxy().await; } use crate::core::handle::Handle; @@ -139,7 +139,7 @@ impl Sysopt { } let shell = app_handle.shell(); - let output = if pac { + let output = if pac_enable { let address = format!("http://{}:{}/pac", "127.0.0.1", pac_port); let output = shell .command(sysproxy_exe.as_path().to_str().unwrap()) From 4a64654f49d6350a9d71418ace106822e24415d1 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 16 Oct 2024 22:49:24 +0800 Subject: [PATCH 119/288] chore: update deps --- src-tauri/Cargo.lock | 122 +++++++++++++++++++++---------------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 829ced23..6501c92f 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -471,9 +471,9 @@ dependencies = [ [[package]] name = "avif-serialize" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876c75a42f6364451a033496a14c44bffe41f5f4a8236f697391f11024e596d2" +checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" dependencies = [ "arrayvec", ] @@ -491,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", @@ -802,9 +802,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" dependencies = [ "bytemuck_derive", ] @@ -1506,7 +1506,7 @@ dependencies = [ "devtools-wire-format", "futures", "http 0.2.12", - "hyper 0.14.30", + "hyper 0.14.31", "log", "prost-types", "ringbuf", @@ -2732,9 +2732,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", @@ -2756,9 +2756,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" dependencies = [ "bytes", "futures-channel", @@ -2782,7 +2782,7 @@ checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.4.1", + "hyper 1.5.0", "hyper-util", "rustls", "rustls-pki-types", @@ -2798,7 +2798,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", @@ -2812,7 +2812,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.4.1", + "hyper 1.5.0", "hyper-util", "native-tls", "tokio", @@ -2831,7 +2831,7 @@ dependencies = [ "futures-util", "http 1.1.0", "http-body 1.0.1", - "hyper 1.4.1", + "hyper 1.5.0", "pin-project-lite", "socket2 0.5.7", "tokio", @@ -3041,9 +3041,9 @@ dependencies = [ [[package]] name = "imgref" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" [[package]] name = "indexmap" @@ -4267,9 +4267,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.66" +version = "0.10.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +checksum = "7b8cefcf97f41316955f9294cd61f639bdcfa9f2f230faac6cb896aa8ab64704" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -4299,9 +4299,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", @@ -4444,9 +4444,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.13" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9" +checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ "memchr", "thiserror", @@ -4455,9 +4455,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.13" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d3a6e3394ec80feb3b6393c725571754c6188490265c61aaf260810d6b95aa0" +checksum = "d214365f632b123a47fd913301e14c946c61d1c183ee245fa76eb752e59a02dd" dependencies = [ "pest", "pest_generator", @@ -4465,9 +4465,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.13" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94429506bde1ca69d1b5601962c73f4172ab4726571a59ea95931218cb0e930e" +checksum = "eb55586734301717aea2ac313f50b2eb8f60d2fc3dc01d190eefa2e625f60c4e" dependencies = [ "pest", "pest_meta", @@ -4478,9 +4478,9 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.7.13" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac8a071862e93690b6e34e9a5fb8e33ff3734473ac0245b27232222c4906a33f" +checksum = "b75da2a70cf4d9cb76833c990ac9cd3923c9a8905a8929789ce347c84564d03d" dependencies = [ "once_cell", "pest", @@ -4828,27 +4828,27 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.87" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" +checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" dependencies = [ "profiling-procmacros", ] [[package]] name = "profiling-procmacros" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" dependencies = [ "quote", "syn 2.0.79", @@ -5236,7 +5236,7 @@ dependencies = [ "http 1.1.0", "http-body 1.0.1", "http-body-util", - "hyper 1.4.1", + "hyper 1.5.0", "hyper-rustls", "hyper-tls", "hyper-util", @@ -5416,9 +5416,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.14" +version = "0.23.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" +checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" dependencies = [ "once_cell", "ring", @@ -5439,9 +5439,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] name = "rustls-webpki" @@ -5456,9 +5456,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" @@ -6256,9 +6256,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.0.3" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd96d46534b10765ce0c6208f9451d98ea38636364a41b272d3610c70dd0e4c3" +checksum = "44438500b50708bfc1e6083844e135d1b516325aae58710dcd8fb67e050ae87c" dependencies = [ "anyhow", "bytes", @@ -6390,7 +6390,7 @@ dependencies = [ [[package]] name = "tauri-plugin-clipboard-manager" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#7e1c17a635f10d69e10ea9f35081a68c71276203" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" dependencies = [ "arboard", "image", @@ -6405,7 +6405,7 @@ dependencies = [ [[package]] name = "tauri-plugin-deep-link" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#7e1c17a635f10d69e10ea9f35081a68c71276203" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" dependencies = [ "dunce", "log", @@ -6451,7 +6451,7 @@ dependencies = [ [[package]] name = "tauri-plugin-dialog" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#7e1c17a635f10d69e10ea9f35081a68c71276203" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" dependencies = [ "log", "raw-window-handle 0.6.2", @@ -6468,7 +6468,7 @@ dependencies = [ [[package]] name = "tauri-plugin-fs" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#7e1c17a635f10d69e10ea9f35081a68c71276203" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" dependencies = [ "anyhow", "dunce", @@ -6503,7 +6503,7 @@ dependencies = [ [[package]] name = "tauri-plugin-notification" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#7e1c17a635f10d69e10ea9f35081a68c71276203" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" dependencies = [ "log", "notify-rust", @@ -6521,7 +6521,7 @@ dependencies = [ [[package]] name = "tauri-plugin-process" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#7e1c17a635f10d69e10ea9f35081a68c71276203" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" dependencies = [ "tauri", "tauri-plugin", @@ -6530,7 +6530,7 @@ dependencies = [ [[package]] name = "tauri-plugin-shell" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#7e1c17a635f10d69e10ea9f35081a68c71276203" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" dependencies = [ "encoding_rs", "log", @@ -6598,9 +6598,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaac63b65df8e85570993eaf93ae1dd73a6fb66d8bd99674ce65f41dc3c63e7d" +checksum = "1431602bcc71f2f840ad623915c9842ecc32999b867c4a787d975a17a9625cc6" dependencies = [ "gtk", "http 1.1.0", @@ -7059,7 +7059,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", @@ -7095,7 +7095,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", @@ -7219,9 +7219,9 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533fc2d4105e0e3d96ce1c71f2d308c9fbbe2ef9c587cab63dd627ab5bde218f" +checksum = "7c92af36a182b46206723bdf8a7942e20838cde1cf062e5b97854d57eb01763b" dependencies = [ "core-graphics 0.24.0", "crossbeam-channel", @@ -7465,9 +7465,9 @@ 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", @@ -7573,7 +7573,7 @@ dependencies = [ "futures-util", "headers", "http 0.2.12", - "hyper 0.14.30", + "hyper 0.14.31", "log", "mime", "mime_guess", @@ -8383,9 +8383,9 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wry" -version = "0.46.0" +version = "0.46.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469a3765ecc3e8aa9ccdf3c5a52c82697ec03037cd60494488763880d31a1b3a" +checksum = "6fa1c8c760041c64ce6be99f83d6cb55fe3fcd85a1ad46d32895f6e65cee87ba" dependencies = [ "base64 0.22.1", "block2", From 18139c7114d90ccdc5f27963f98cc6900ac3ad99 Mon Sep 17 00:00:00 2001 From: wonfen Date: Thu, 17 Oct 2024 05:09:00 +0800 Subject: [PATCH 120/288] chore: adjust translation --- src/locales/en.json | 2 +- src/locales/fa.json | 2 +- src/locales/ru.json | 2 +- src/locales/zh.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/locales/en.json b/src/locales/en.json index b2285efe..7a2d652a 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -195,7 +195,7 @@ "System Setting": "System Setting", "Tun Mode": "Tun (Virtual NIC) Mode", "Reset to Default": "Reset to Default", - "Tun Mode Info": "Tun (Virtual NIC) mode: Captures all system traffic, and when enabled, there is no need to activate the system proxy.", + "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", diff --git a/src/locales/fa.json b/src/locales/fa.json index b513dbc0..108dc01d 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -193,7 +193,7 @@ "System Setting": "تنظیمات سیستم", "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": "نام دستگاه", diff --git a/src/locales/ru.json b/src/locales/ru.json index 2d5b115a..09eaa205 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -193,7 +193,7 @@ "System Setting": "Настройки системы", "Tun Mode": "Tun (виртуальный сетевой адаптер) режим", "Reset to Default": "Сбросить настройки по умолчанию", - "Tun Mode Info": "Tun (виртуальный сетевой адаптер) режим: Перехватывает весь трафик системы, и при его включении нет необходимости активировать системный прокси.", + "Tun Mode Info": "Режим Tun (виртуальный сетевой адаптер): захватывает весь системный трафик, при включении нет необходимости включать системный прокси-сервер.", "Stack": "Стек", "System and Mixed Can Only be Used in Service Mode": "Система и смешанные могут использоваться только в сервисном режиме", "Device": "Имя устройства", diff --git a/src/locales/zh.json b/src/locales/zh.json index 21ce34a8..2760e3e9 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -195,7 +195,7 @@ "System Setting": "系统设置", "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 网卡名称", From 770f031b8b9540f155f4ceb0f5f231d4d5b9062f Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 18 Oct 2024 07:08:34 +0800 Subject: [PATCH 121/288] fix: try to fix service not started on linux --- src-tauri/src/core/service.rs | 6 ++---- src-tauri/src/utils/help.rs | 15 --------------- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index 6981b11d..f414f8ef 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -89,20 +89,18 @@ pub async fn reinstall_service() -> Result<()> { let install_shell: String = install_path.to_string_lossy().replace(" ", "\\ "); let uninstall_shell: String = uninstall_path.to_string_lossy().replace(" ", "\\ "); - let elevator = crate::utils::help::linux_elevator(); let _ = match get_effective_uid() { 0 => StdCommand::new(uninstall_path).status()?, - _ => StdCommand::new(elevator) + _ => StdCommand::new("sudo") .arg("sh") .arg("-c") .arg(uninstall_shell) .status()?, }; - let elevator = crate::utils::help::linux_elevator(); let status = match get_effective_uid() { 0 => StdCommand::new(install_shell).status()?, - _ => StdCommand::new(elevator) + _ => StdCommand::new("sudo") .arg("sh") .arg("-c") .arg(install_shell) diff --git a/src-tauri/src/utils/help.rs b/src-tauri/src/utils/help.rs index ee47fa8b..3583540a 100644 --- a/src-tauri/src/utils/help.rs +++ b/src-tauri/src/utils/help.rs @@ -105,21 +105,6 @@ pub fn open_file(app: tauri::AppHandle, path: PathBuf) -> Result<()> { Ok(()) } -#[cfg(target_os = "linux")] -pub fn linux_elevator() -> &'static str { - use std::process::Command; - match Command::new("which").arg("pkexec").output() { - Ok(output) => { - if output.stdout.is_empty() { - "sudo" - } else { - "pkexec" - } - } - Err(_) => "sudo", - } -} - #[macro_export] macro_rules! error { ($result: expr) => { From a47ded7cf27c15984ce903205f3ed4a938ced59c Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 18 Oct 2024 22:50:03 +0800 Subject: [PATCH 122/288] chore: update --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 859ea1d9..b882a9ad 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "dev": "cross-env RUST_BACKTRACE=1 tauri dev", "dev:diff": "cross-env RUST_BACKTRACE=1 tauri dev -f verge-dev", - "build": "tauri build", + "build": "cross-env NODE_OPTIONS='--max-old-space-size=4096' tauri build", "tauri": "tauri", "web:dev": "vite", "web:build": "tsc && vite build", From ee78b7898b339a9cea968edb33a071cb70247956 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 18 Oct 2024 22:30:29 +0800 Subject: [PATCH 123/288] chore: try to fix service not started on linux --- package.json | 3 +- pnpm-lock.yaml | 299 ++++++++++++++++++++++++++++++++ scripts/check.mjs | 29 ++-- src-tauri/src/core/core.rs | 8 +- src-tauri/src/core/hotkey.rs | 2 +- src-tauri/src/core/service.rs | 36 ++-- src-tauri/src/lib.rs | 1 + src-tauri/src/utils/dirs.rs | 12 +- src-tauri/src/utils/help.rs | 20 +++ src-tauri/src/utils/init.rs | 7 +- src-tauri/src/utils/resolve.rs | 24 ++- src-tauri/tauri.linux.conf.json | 9 +- 12 files changed, 396 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index 859ea1d9..d7e5e2c4 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "dev": "cross-env RUST_BACKTRACE=1 tauri dev", "dev:diff": "cross-env RUST_BACKTRACE=1 tauri dev -f verge-dev", - "build": "tauri build", + "build": "cross-env NODE_OPTIONS='--max-old-space-size=4096' tauri build", "tauri": "tauri", "web:dev": "vite", "web:build": "tsc && vite build", @@ -43,6 +43,7 @@ "cli-color": "^2.0.4", "dayjs": "1.11.5", "foxact": "^0.2.35", + "glob": "^11.0.0", "i18next": "^23.11.5", "js-base64": "^3.7.7", "js-yaml": "^4.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4c9c8604..baec87c3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -82,6 +82,9 @@ importers: foxact: specifier: ^0.2.35 version: 0.2.35(react@18.3.1) + glob: + specifier: ^11.0.0 + version: 11.0.0 i18next: specifier: ^23.11.5 version: 23.11.5 @@ -1528,6 +1531,13 @@ packages: integrity: sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==, } + "@isaacs/cliui@8.0.2": + resolution: + { + integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, + } + engines: { node: ">=12" } + "@jridgewell/gen-mapping@0.3.5": resolution: { @@ -2443,6 +2453,20 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 + ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + ansi-regex@6.1.0: + resolution: + { + integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==, + } + engines: { node: ">=12" } + ansi-styles@3.2.1: resolution: { @@ -2450,6 +2474,20 @@ packages: } engines: { node: ">=4" } + 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" } + anymatch@3.1.3: resolution: { @@ -2512,6 +2550,12 @@ packages: integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==, } + balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + before-after-hook@2.2.3: resolution: { @@ -2525,6 +2569,12 @@ packages: } engines: { node: ">=8" } + brace-expansion@2.0.1: + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } + braces@3.0.3: resolution: { @@ -2653,12 +2703,25 @@ packages: integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, } + color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + color-name@1.1.3: resolution: { integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, } + color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + combined-stream@1.0.8: resolution: { @@ -2825,12 +2888,30 @@ packages: integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==, } + eastasianwidth@0.2.0: + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } + electron-to-chromium@1.4.818: resolution: { integrity: sha512-eGvIk2V0dGImV9gWLq8fDfTTsCAeMDwZqEPMr+jMInxZdnp9Us8UpovYpRCf9NQ7VOFgrN2doNSgvISbsbNpxA==, } + emoji-regex@8.0.0: + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } + + emoji-regex@9.2.2: + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } + end-of-stream@1.4.4: resolution: { @@ -2995,6 +3076,13 @@ packages: debug: optional: true + foreground-child@3.3.0: + resolution: + { + integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==, + } + engines: { node: ">=14" } + form-data@4.0.0: resolution: { @@ -3062,6 +3150,14 @@ packages: } engines: { node: ">= 6" } + glob@11.0.0: + resolution: + { + integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==, + } + engines: { node: 20 || >=22 } + hasBin: true + globals@11.12.0: resolution: { @@ -3218,6 +3314,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: { @@ -3271,6 +3374,13 @@ packages: integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, } + jackspeak@4.0.2: + resolution: + { + integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==, + } + engines: { node: 20 || >=22 } + js-base64@3.7.7: resolution: { @@ -3381,6 +3491,13 @@ packages: integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==, } + lru-cache@11.0.1: + resolution: + { + integrity: sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==, + } + engines: { node: 20 || >=22 } + lru-cache@5.1.1: resolution: { @@ -3627,6 +3744,13 @@ packages: } engines: { node: ">=6" } + minimatch@10.0.1: + resolution: + { + integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==, + } + engines: { node: 20 || >=22 } + minipass@3.3.6: resolution: { @@ -3641,6 +3765,13 @@ packages: } engines: { node: ">=8" } + minipass@7.1.2: + resolution: + { + integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, + } + engines: { node: ">=16 || 14 >=14.17" } + minizlib@2.1.2: resolution: { @@ -3824,6 +3955,12 @@ packages: } engines: { node: ">=6" } + package-json-from-dist@1.0.1: + resolution: + { + integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, + } + parent-module@1.0.1: resolution: { @@ -3870,6 +4007,13 @@ packages: integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, } + path-scurry@2.0.0: + resolution: + { + integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==, + } + engines: { node: 20 || >=22 } + path-type@4.0.0: resolution: { @@ -4239,6 +4383,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: { @@ -4291,12 +4442,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: { @@ -4667,6 +4846,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: { @@ -5700,6 +5893,15 @@ snapshots: "@floating-ui/utils@0.2.4": {} + "@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 + "@jridgewell/gen-mapping@0.3.5": dependencies: "@jridgewell/set-array": 1.2.1 @@ -6299,10 +6501,20 @@ snapshots: screenfull: 5.2.0 tslib: 2.6.3 + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -6352,10 +6564,16 @@ snapshots: 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 @@ -6426,8 +6644,14 @@ snapshots: dependencies: color-name: 1.1.3 + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + color-name@1.1.3: {} + color-name@1.1.4: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -6514,8 +6738,14 @@ snapshots: no-case: 3.0.4 tslib: 2.6.3 + eastasianwidth@0.2.0: {} + electron-to-chromium@1.4.818: {} + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -6637,6 +6867,11 @@ snapshots: follow-redirects@1.15.6: {} + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + form-data@4.0.0: dependencies: asynckit: 0.4.0 @@ -6673,6 +6908,15 @@ snapshots: dependencies: is-glob: 4.0.3 + 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: {} has-flag@3.0.0: {} @@ -6764,6 +7008,8 @@ snapshots: is-extglob@2.1.1: {} + is-fullwidth-code-point@3.0.0: {} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -6782,6 +7028,10 @@ snapshots: isexe@2.0.0: {} + jackspeak@4.0.2: + dependencies: + "@isaacs/cliui": 8.0.2 + js-base64@3.7.7: {} js-cookie@2.2.1: {} @@ -6824,6 +7074,8 @@ snapshots: dependencies: tslib: 2.6.3 + lru-cache@11.0.1: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -7087,12 +7339,18 @@ snapshots: mimic-fn@2.1.0: {} + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + minipass@3.3.6: dependencies: yallist: 4.0.0 minipass@5.0.0: {} + minipass@7.1.2: {} + minizlib@2.1.2: dependencies: minipass: 3.3.6 @@ -7189,6 +7447,8 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -7219,6 +7479,11 @@ snapshots: path-parse@1.0.7: {} + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.1 + minipass: 7.1.2 + path-type@4.0.0: {} peggy@4.0.3: @@ -7461,6 +7726,8 @@ snapshots: signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + snake-case@3.0.4: dependencies: dot-case: 3.0.4 @@ -7483,11 +7750,31 @@ 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: @@ -7688,6 +7975,18 @@ snapshots: 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: {} diff --git a/scripts/check.mjs b/scripts/check.mjs index 0d0a3bdf..bf75cbac 100644 --- a/scripts/check.mjs +++ b/scripts/check.mjs @@ -8,6 +8,7 @@ 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"); @@ -357,16 +358,19 @@ const resolvePlugin = async () => { // 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 (fs.existsSync(targetPath)) { - execSync(`chmod 755 ${targetPath}`); - log_success(`chmod finished: "${f}"`); + // 使用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}"`); + } } } }; @@ -374,29 +378,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}`, }); }; diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index 1013d3a5..ea02df95 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -83,7 +83,7 @@ impl CoreManager { // 服务模式 if service::check_service().await.is_ok() { - log::debug!(target: "app", "stop the core by service"); + log::info!(target: "app", "stop the core by service"); service::stop_core_by_service().await?; } *running = false; @@ -94,7 +94,7 @@ impl CoreManager { pub async fn start_core(&self) -> Result<()> { let mut running = self.running.lock().await; if *running { - log::debug!("core is running"); + log::info!("core is running"); return Ok(()); } @@ -102,7 +102,7 @@ impl CoreManager { // 服务模式 if service::check_service().await.is_ok() { - log::debug!(target: "app", "try to run core in service mode"); + log::info!(target: "app", "try to run core in service mode"); service::run_core_by_service(&config_path).await?; *running = true; } @@ -126,7 +126,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); diff --git a/src-tauri/src/core/hotkey.rs b/src-tauri/src/core/hotkey.rs index 3d685c63..a51af840 100755 --- a/src-tauri/src/core/hotkey.rs +++ b/src-tauri/src/core/hotkey.rs @@ -161,7 +161,7 @@ impl Drop for Hotkey { fn drop(&mut self) { let app_handle = handle::Handle::global().app_handle().unwrap(); if let Err(e) = app_handle.global_shortcut().unregister_all() { - log::error!("Error unregistering all hotkeys: {:?}", e); + log::error!(target:"app", "Error unregistering all hotkeys: {:?}", e); } } } diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index f414f8ef..f20d665b 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -28,6 +28,8 @@ pub struct JsonResponse { #[cfg(target_os = "windows")] 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; @@ -37,11 +39,11 @@ pub async fn reinstall_service() -> Result<()> { 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!("uninstaller exe not found"); + bail!(format!("uninstaller not found: {uninstall_path:?}")); } let token = Token::with_current_process()?; @@ -72,35 +74,39 @@ pub async fn reinstall_service() -> Result<()> { #[cfg(target_os = "linux")] pub async fn reinstall_service() -> Result<()> { + log::info!(target:"app", "reinstall service"); use users::get_effective_uid; - 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"); + 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!("installer not found"); + bail!(format!("installer not found: {install_path:?}")); } if !uninstall_path.exists() { - bail!("uninstaller not found"); + bail!(format!("uninstaller not found: {uninstall_path:?}")); } let install_shell: String = install_path.to_string_lossy().replace(" ", "\\ "); let uninstall_shell: String = uninstall_path.to_string_lossy().replace(" ", "\\ "); - let _ = match get_effective_uid() { - 0 => StdCommand::new(uninstall_path).status()?, - _ => StdCommand::new("sudo") + let elevator = crate::utils::help::linux_elevator(); + let status = match get_effective_uid() { + 0 => StdCommand::new(uninstall_shell).status()?, + _ => StdCommand::new(elevator) .arg("sh") .arg("-c") .arg(uninstall_shell) .status()?, }; + log::info!(target:"app", "status code:{}", status.code().unwrap()); + let elevator = crate::utils::help::linux_elevator(); let status = match get_effective_uid() { 0 => StdCommand::new(install_shell).status()?, - _ => StdCommand::new("sudo") + _ => StdCommand::new(elevator) .arg("sh") .arg("-c") .arg(install_shell) @@ -119,16 +125,18 @@ pub async fn reinstall_service() -> Result<()> { #[cfg(target_os = "macos")] pub async fn reinstall_service() -> Result<()> { + log::info!(target:"app", "reinstall service"); + 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!("installer not found"); + bail!(format!("installer not found: {install_path:?}")); } if !uninstall_path.exists() { - bail!("uninstaller not found"); + bail!(format!("uninstaller not found: {uninstall_path:?}")); } let install_shell: String = install_path.to_string_lossy().replace(" ", "\\ "); @@ -193,6 +201,8 @@ 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 _ = reqwest::ClientBuilder::new() .no_proxy() diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index cbf8245a..c123b676 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -58,6 +58,7 @@ pub fn run() { } tauri::async_runtime::block_on(async move { resolve::resolve_setup(app).await; + #[cfg(not(target_os = "macos"))] { let argvs: Vec = std::env::args().collect(); diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs index e4030620..842b27fe 100644 --- a/src-tauri/src/utils/dirs.rs +++ b/src-tauri/src/utils/dirs.rs @@ -47,11 +47,9 @@ pub fn app_home_dir() -> Result { let app_handle = handle::Handle::global().app_handle().unwrap(); match app_handle.path().data_dir() { - Ok(dir) => { - Ok(dir.join(APP_ID)) - } + Ok(dir) => Ok(dir.join(APP_ID)), Err(e) => { - log::error!("Failed to get the app home directory: {}", e); + log::error!(target:"app", "Failed to get the app home directory: {}", e); Err(anyhow::anyhow!("Failed to get the app homedirectory")) } } @@ -61,11 +59,9 @@ pub fn app_home_dir() -> Result { pub fn app_resources_dir() -> Result { let app_handle = handle::Handle::global().app_handle().unwrap(); match app_handle.path().resource_dir() { - Ok(dir) => { - Ok(dir.join("resources")) - } + Ok(dir) => Ok(dir.join("resources")), Err(e) => { - log::error!("Failed to get the resource directory: {}", e); + log::error!(target:"app", "Failed to get the resource directory: {}", e); Err(anyhow::anyhow!("Failed to get the resource directory")) } } diff --git a/src-tauri/src/utils/help.rs b/src-tauri/src/utils/help.rs index 3583540a..b6fda2a9 100644 --- a/src-tauri/src/utils/help.rs +++ b/src-tauri/src/utils/help.rs @@ -105,6 +105,26 @@ pub fn open_file(app: tauri::AppHandle, path: PathBuf) -> Result<()> { Ok(()) } +#[cfg(target_os = "linux")] +pub fn linux_elevator() -> String { + use std::process::Command; + match Command::new("which").arg("sudo").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 5c0b9c60..609012af 100644 --- a/src-tauri/src/utils/init.rs +++ b/src-tauri/src/utils/init.rs @@ -195,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 @@ -204,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::info!(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}") } }; }; diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 074aea4a..28b6adc9 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -43,12 +43,6 @@ pub async fn resolve_setup(app: &mut App) { handle::Handle::global().init(app.app_handle()); VERSION.get_or_init(|| version.clone()); - if service::check_service().await.is_err() { - log_err!(service::reinstall_service().await); - //延迟启动,避免闪屏 - std::thread::sleep(std::time::Duration::from_millis(1000)); - } - log_err!(init::init_config()); log_err!(init::init_resources()); log_err!(init::init_scheme()); @@ -56,18 +50,22 @@ pub async fn resolve_setup(app: &mut App) { // 处理随机端口 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"); + if service::check_service().await.is_err() { + log_err!(service::reinstall_service().await); + std::thread::sleep(std::time::Duration::from_millis(1000)); + } + + log::trace!(target: "app", "launch core"); log_err!(CoreManager::global().init().await); // setup a simple http server for singleton - log::trace!("launch embed server"); + log::trace!(target: "app", "launch embed server"); server::embed_server(); - log::trace!("init system tray"); + log::trace!(target: "app", "init system tray"); log_err!(tray::Tray::create_systray()); let silent_start = { Config::verge().data().enable_silent_start }; @@ -160,7 +158,7 @@ pub fn create_window() { .latest() .window_is_maximized .unwrap_or(false); - log::trace!("try to calculate the monitor size"); + log::trace!(target:"app", "try to calculate the monitor size"); let center = (|| -> Result { let mut center = false; let monitor = win.current_monitor()?.ok_or(anyhow::anyhow!(""))?; @@ -220,7 +218,7 @@ pub fn save_window_size_position(save_to_file: bool) -> Result<()> { } pub async fn resolve_scheme(param: String) -> Result<()> { - log::info!("received deep link: {}", param); + log::info!(target:"app", "received deep link: {}", param); let app_handle = handle::Handle::global().app_handle().unwrap(); diff --git a/src-tauri/tauri.linux.conf.json b/src-tauri/tauri.linux.conf.json index 774ba634..7493b270 100644 --- a/src-tauri/tauri.linux.conf.json +++ b/src-tauri/tauri.linux.conf.json @@ -18,7 +18,14 @@ "conflicts": ["clash-verge"], "obsoletes": ["clash-verge"] } - } + }, + "externalBin": [ + "./resources/clash-verge-service", + "./resources/install-service", + "./resources/uninstall-service", + "./sidecar/verge-mihomo", + "./sidecar/verge-mihomo-alpha" + ] }, "app": { "trayIcon": { From 199700cf09df50884772ed7525ef0906f8fc62d8 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 20 Oct 2024 06:06:47 +0800 Subject: [PATCH 124/288] fix: mac commad+q global hijack is not released --- src-tauri/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index cbf8245a..6a653425 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -158,7 +158,7 @@ pub fn run() { log_err!(hotkey::Hotkey::global().register("Control+Q", "quit")); }; } - tauri::WindowEvent::Focused(false) => { + tauri::WindowEvent::Destroyed => { #[cfg(target_os = "macos")] { log_err!(hotkey::Hotkey::global().unregister("CMD+Q")); From 0dc92fbc9905f85c71e3d74288d351b79b557b41 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 20 Oct 2024 22:35:16 +0800 Subject: [PATCH 125/288] chore: update deps --- src-tauri/Cargo.lock | 188 +++++++++++++++++++++---------------------- 1 file changed, 91 insertions(+), 97 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 6501c92f..9733df59 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -89,9 +89,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.89" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" +checksum = "37bf3594c4c988a53154954629820791dde498571819ae4ca50ca811e060cc95" [[package]] name = "arbitrary" @@ -134,7 +134,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -349,7 +349,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -389,7 +389,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -406,7 +406,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -725,7 +725,7 @@ checksum = "240f4126219a83519bad05c9a40bfc0303921eeb571fc2d7e44c17ffac99d3f1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", "synstructure", ] @@ -790,9 +790,9 @@ dependencies = [ [[package]] name = "built" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "236e6289eda5a812bc6b53c3b024039382a2895fbbeef2d748b2931546d392c4" +checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" [[package]] name = "bumpalo" @@ -817,7 +817,7 @@ checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -910,9 +910,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.30" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" dependencies = [ "jobserver", "libc", @@ -1123,7 +1123,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d" dependencies = [ "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -1338,7 +1338,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -1348,7 +1348,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -1372,7 +1372,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -1383,7 +1383,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -1473,7 +1473,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -1486,7 +1486,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -1632,7 +1632,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -1664,7 +1664,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -1777,7 +1777,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -1950,9 +1950,9 @@ dependencies = [ [[package]] name = "flume" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ "spin", ] @@ -1996,7 +1996,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -2114,7 +2114,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -2379,7 +2379,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -2475,7 +2475,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -2987,7 +2987,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -3008,9 +3008,9 @@ dependencies = [ [[package]] name = "image" -version = "0.25.2" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" +checksum = "bc144d44a31d753b02ce64093d532f55ff8dc4ebf2ffb8a63c0dda691385acae" dependencies = [ "bytemuck", "byteorder-lite", @@ -3031,9 +3031,9 @@ dependencies = [ [[package]] name = "image-webp" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79afb8cbee2ef20f59ccd477a218c12a93943d075b492015ecb1bb81f8ee904" +checksum = "e031e8e3d94711a9ccb5d6ea357439ef3dcbed361798bd4071dc4d9793fbe22f" dependencies = [ "byteorder-lite", "quick-error", @@ -3109,7 +3109,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -3352,9 +3352,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.159" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libfuzzer-sys" @@ -3923,7 +3923,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -3973,7 +3973,7 @@ dependencies = [ "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -4267,9 +4267,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.67" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b8cefcf97f41316955f9294cd61f639bdcfa9f2f230faac6cb896aa8ab64704" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -4288,7 +4288,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -4473,7 +4473,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -4601,7 +4601,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -4648,7 +4648,7 @@ checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -4851,7 +4851,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" dependencies = [ "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -4874,7 +4874,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -5103,9 +5103,9 @@ dependencies = [ [[package]] name = "ravif" -version = "0.11.10" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f0bfd976333248de2078d350bfdf182ff96e168a24d23d2436cef320dd4bdd" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" dependencies = [ "avif-serialize", "imgref", @@ -5299,9 +5299,6 @@ name = "rgb" version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" -dependencies = [ - "bytemuck", -] [[package]] name = "ring" @@ -5514,7 +5511,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -5652,7 +5649,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -5663,14 +5660,14 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa 1.0.11", "memchr", @@ -5686,7 +5683,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -5737,7 +5734,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -6084,9 +6081,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.79" +version = "2.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "198514704ca887dd5a1e408c6c6cdcba43672f9b4062e1b24aa34e74e6d7faae" dependencies = [ "proc-macro2", "quote", @@ -6116,7 +6113,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -6228,7 +6225,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -6256,9 +6253,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.0.4" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44438500b50708bfc1e6083844e135d1b516325aae58710dcd8fb67e050ae87c" +checksum = "5ce2818e803ce3097987296623ed8c0d9f65ed93b4137ff9a83e168bdbf62932" dependencies = [ "anyhow", "bytes", @@ -6347,7 +6344,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.8", - "syn 2.0.79", + "syn 2.0.81", "tauri-utils", "thiserror", "time", @@ -6365,7 +6362,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", "tauri-codegen", "tauri-utils", ] @@ -6390,7 +6387,7 @@ dependencies = [ [[package]] name = "tauri-plugin-clipboard-manager" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#3fd283121f5ee739ac8a5149fa7e7520f992aeb0" dependencies = [ "arboard", "image", @@ -6405,7 +6402,7 @@ dependencies = [ [[package]] name = "tauri-plugin-deep-link" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#3fd283121f5ee739ac8a5149fa7e7520f992aeb0" dependencies = [ "dunce", "log", @@ -6450,8 +6447,8 @@ dependencies = [ [[package]] name = "tauri-plugin-dialog" -version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" +version = "2.0.2" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#3fd283121f5ee739ac8a5149fa7e7520f992aeb0" dependencies = [ "log", "raw-window-handle 0.6.2", @@ -6467,8 +6464,8 @@ dependencies = [ [[package]] name = "tauri-plugin-fs" -version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" +version = "2.0.2" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#3fd283121f5ee739ac8a5149fa7e7520f992aeb0" dependencies = [ "anyhow", "dunce", @@ -6503,7 +6500,7 @@ dependencies = [ [[package]] name = "tauri-plugin-notification" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#3fd283121f5ee739ac8a5149fa7e7520f992aeb0" dependencies = [ "log", "notify-rust", @@ -6521,7 +6518,7 @@ dependencies = [ [[package]] name = "tauri-plugin-process" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#3fd283121f5ee739ac8a5149fa7e7520f992aeb0" dependencies = [ "tauri", "tauri-plugin", @@ -6529,8 +6526,8 @@ dependencies = [ [[package]] name = "tauri-plugin-shell" -version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" +version = "2.0.2" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#3fd283121f5ee739ac8a5149fa7e7520f992aeb0" dependencies = [ "encoding_rs", "log", @@ -6787,7 +6784,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -6926,7 +6923,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -7175,7 +7172,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -7350,12 +7347,9 @@ 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", -] +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-bidi" @@ -7625,7 +7619,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", "wasm-bindgen-shared", ] @@ -7659,7 +7653,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7828,7 +7822,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -8001,7 +7995,7 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -8012,7 +8006,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -8023,7 +8017,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -8034,7 +8028,7 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -8045,7 +8039,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -8056,7 +8050,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -8508,7 +8502,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", "synstructure", ] @@ -8595,7 +8589,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] @@ -8615,7 +8609,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", "synstructure", ] @@ -8644,7 +8638,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.81", ] [[package]] From b61b63d100572ffa2397ef185a388fd925396bd1 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 20 Oct 2024 23:13:23 +0800 Subject: [PATCH 126/288] fix: failed to start system proxy with PAC mode --- src-tauri/src/core/sysopt.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index 976c0bb3..65bdcebb 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -143,7 +143,7 @@ impl Sysopt { let address = format!("http://{}:{}/pac", "127.0.0.1", pac_port); let output = shell .command(sysproxy_exe.as_path().to_str().unwrap()) - .args(["opac", address.as_str()]) + .args(["pac", address.as_str()]) .output() .await .unwrap(); @@ -361,7 +361,7 @@ impl Sysopt { } } - // #[cfg(target_os = "windows")] + #[cfg(target_os = "windows")] { use crate::core::handle::Handle; use crate::utils::dirs; @@ -381,7 +381,7 @@ impl Sysopt { shell .command(sysproxy_exe.as_path().to_str().unwrap()) - .args(["opac", address.as_str()]) + .args(["pac", address.as_str()]) .output() .await .unwrap() From 38999d284a95fa2d8bfa044484da34a792deecec Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 21 Oct 2024 00:34:28 +0800 Subject: [PATCH 127/288] chore: update --- src-tauri/Cargo.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 9733df59..6e23dcf8 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -6387,7 +6387,7 @@ dependencies = [ [[package]] name = "tauri-plugin-clipboard-manager" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#3fd283121f5ee739ac8a5149fa7e7520f992aeb0" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" dependencies = [ "arboard", "image", @@ -6447,8 +6447,8 @@ dependencies = [ [[package]] name = "tauri-plugin-dialog" -version = "2.0.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#3fd283121f5ee739ac8a5149fa7e7520f992aeb0" +version = "2.0.1" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" dependencies = [ "log", "raw-window-handle 0.6.2", @@ -6464,8 +6464,8 @@ dependencies = [ [[package]] name = "tauri-plugin-fs" -version = "2.0.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#3fd283121f5ee739ac8a5149fa7e7520f992aeb0" +version = "2.0.1" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" dependencies = [ "anyhow", "dunce", @@ -6500,7 +6500,7 @@ dependencies = [ [[package]] name = "tauri-plugin-notification" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#3fd283121f5ee739ac8a5149fa7e7520f992aeb0" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" dependencies = [ "log", "notify-rust", @@ -6518,7 +6518,7 @@ dependencies = [ [[package]] name = "tauri-plugin-process" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#3fd283121f5ee739ac8a5149fa7e7520f992aeb0" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" dependencies = [ "tauri", "tauri-plugin", @@ -6526,8 +6526,8 @@ dependencies = [ [[package]] name = "tauri-plugin-shell" -version = "2.0.2" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#3fd283121f5ee739ac8a5149fa7e7520f992aeb0" +version = "2.0.1" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" dependencies = [ "encoding_rs", "log", From 399bbd56ec10b1ab283f4a520fe620604a8d222c Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 21 Oct 2024 00:45:06 +0800 Subject: [PATCH 128/288] chore: update deps --- src-tauri/Cargo.lock | 27 +++++++++++++++++---------- src-tauri/Cargo.toml | 14 +++++++------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 6e23dcf8..39c76f2d 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -6387,7 +6387,8 @@ dependencies = [ [[package]] name = "tauri-plugin-clipboard-manager" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b7d556886c15849198c0948fd7f4c880492f0461539176da0a8a70272e2904" dependencies = [ "arboard", "image", @@ -6402,7 +6403,8 @@ dependencies = [ [[package]] name = "tauri-plugin-deep-link" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#3fd283121f5ee739ac8a5149fa7e7520f992aeb0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31a9b5725027c6e9e075b06cb2d5c2cd3b5c29daa8012b404e1ff755cc56082f" dependencies = [ "dunce", "log", @@ -6447,8 +6449,9 @@ dependencies = [ [[package]] name = "tauri-plugin-dialog" -version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff33d09331cc22bf4771a2633b62afc1038e36273eef22bff12f53d33decd91" dependencies = [ "log", "raw-window-handle 0.6.2", @@ -6464,8 +6467,9 @@ dependencies = [ [[package]] name = "tauri-plugin-fs" -version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d0816b27207c29aaff632c73b702785140cf16fe6150c201a2720245b8ea88" dependencies = [ "anyhow", "dunce", @@ -6500,7 +6504,8 @@ dependencies = [ [[package]] name = "tauri-plugin-notification" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef492a2d19b6376bb4c9e0c4fab3f3bf8a220ea112d24f35027b737ff55de20c" dependencies = [ "log", "notify-rust", @@ -6518,7 +6523,8 @@ dependencies = [ [[package]] name = "tauri-plugin-process" version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae06a00087c148962a52814a2d7265b1a0505bced5ffb74f8c284a5f96a4d03d" dependencies = [ "tauri", "tauri-plugin", @@ -6526,8 +6532,9 @@ dependencies = [ [[package]] name = "tauri-plugin-shell" -version = "2.0.1" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#cfd48b3b2ec0fccfc162197518694ed59ceda22c" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad7880c5586b6b2104be451e3d7fc0f3800c84bda69e9ba81c828f87cb34267" dependencies = [ "encoding_rs", "log", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 0194bdd4..00b6da98 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -45,13 +45,13 @@ tauri = { version = "2.0.0-rc", features = [ "image-png", ] } network-interface = { version = "2.0.0", features = ["serde"] } -tauri-plugin-shell = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } -tauri-plugin-dialog = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } -tauri-plugin-fs = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } -tauri-plugin-notification = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } -tauri-plugin-process = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } -tauri-plugin-clipboard-manager = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } -tauri-plugin-deep-link = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +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" [target.'cfg(windows)'.dependencies] From 3de18e2a86071f91a05e6190104ead746593cc8a Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 21 Oct 2024 00:50:43 +0800 Subject: [PATCH 129/288] chore: update --- src-tauri/Cargo.lock | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 39c76f2d..eef91464 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -778,6 +778,17 @@ dependencies = [ "brotli-decompressor", ] +[[package]] +name = "brotli" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + [[package]] name = "brotli-decompressor" version = "4.0.1" @@ -6333,7 +6344,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95d7443dd4f0b597704b6a14b964ee2ed16e99928d8e6292ae9825f09fbcd30e" dependencies = [ "base64 0.22.1", - "brotli", + "brotli 6.0.0", "ico", "json-patch", "plist", @@ -6602,9 +6613,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1431602bcc71f2f840ad623915c9842ecc32999b867c4a787d975a17a9625cc6" +checksum = "62fa2068e8498ad007b54d5773d03d57c3ff6dd96f8c8ce58beff44d0d5e0d30" dependencies = [ "gtk", "http 1.1.0", @@ -6629,11 +6640,11 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c38b0230d6880cf6dd07b6d7dd7789a0869f98ac12146e0d18d1c1049215a045" +checksum = "1fc65d6f5c54e56b66258948a6d9e47a82ea41f4b5a7612bfbdd1634c2913ed0" dependencies = [ - "brotli", + "brotli 7.0.0", "cargo_metadata", "ctor", "dunce", From abb0a049a8a9e850003beceb5873b07eab7969fe Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 21 Oct 2024 01:12:52 +0800 Subject: [PATCH 130/288] chore: update --- src-tauri/Cargo.lock | 114 +++++++++++++++++++++---------------------- src-tauri/Cargo.toml | 2 +- 2 files changed, 58 insertions(+), 58 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index eef91464..0d21d59e 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -134,7 +134,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -349,7 +349,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -389,7 +389,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -406,7 +406,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -725,7 +725,7 @@ checksum = "240f4126219a83519bad05c9a40bfc0303921eeb571fc2d7e44c17ffac99d3f1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", "synstructure", ] @@ -828,7 +828,7 @@ checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -1134,7 +1134,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d" dependencies = [ "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -1349,7 +1349,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -1359,7 +1359,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -1383,7 +1383,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -1394,7 +1394,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -1484,7 +1484,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -1497,7 +1497,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -1643,7 +1643,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -1675,7 +1675,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -1788,7 +1788,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -2007,7 +2007,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -2125,7 +2125,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -2390,7 +2390,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -2486,7 +2486,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -2998,7 +2998,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -3120,7 +3120,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -3934,7 +3934,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -3984,7 +3984,7 @@ dependencies = [ "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -4299,7 +4299,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -4484,7 +4484,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -4612,7 +4612,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -4659,7 +4659,7 @@ checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -4862,7 +4862,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" dependencies = [ "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -4885,7 +4885,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -5522,7 +5522,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -5660,7 +5660,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -5671,7 +5671,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -5694,7 +5694,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -5745,7 +5745,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -6092,9 +6092,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.81" +version = "2.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198514704ca887dd5a1e408c6c6cdcba43672f9b4062e1b24aa34e74e6d7faae" +checksum = "83540f837a8afc019423a8edb95b52a8effe46957ee402287f4292fae35be021" dependencies = [ "proc-macro2", "quote", @@ -6124,7 +6124,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -6236,7 +6236,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -6355,7 +6355,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.8", - "syn 2.0.81", + "syn 2.0.82", "tauri-utils", "thiserror", "time", @@ -6373,7 +6373,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", "tauri-codegen", "tauri-utils", ] @@ -6802,7 +6802,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -6941,7 +6941,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -7190,7 +7190,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -7637,7 +7637,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", "wasm-bindgen-shared", ] @@ -7671,7 +7671,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7840,7 +7840,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -8013,7 +8013,7 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -8024,7 +8024,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -8035,7 +8035,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -8046,7 +8046,7 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -8057,7 +8057,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -8068,7 +8068,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -8520,7 +8520,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", "synstructure", ] @@ -8607,7 +8607,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] @@ -8627,7 +8627,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", "synstructure", ] @@ -8656,7 +8656,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.82", ] [[package]] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 00b6da98..12a49b56 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -47,7 +47,7 @@ tauri = { version = "2.0.0-rc", features = [ network-interface = { version = "2.0.0", features = ["serde"] } tauri-plugin-shell = "2.0.2" tauri-plugin-dialog = "2.0.2" -tauri-plugin-fs = "2.0.2" +tauri-plugin-fs = "2.0.1" tauri-plugin-notification = "2.0.1" tauri-plugin-process = "2.0.1" tauri-plugin-clipboard-manager = "2.0.1" From a35014f0b5e6718496f6f8d7f9f93df04de3867f Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 21 Oct 2024 01:30:13 +0800 Subject: [PATCH 131/288] chore: update --- src-tauri/Cargo.lock | 137 ++++++++++++++++++++----------------------- 1 file changed, 63 insertions(+), 74 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 0d21d59e..39c76f2d 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -134,7 +134,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -349,7 +349,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -389,7 +389,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -406,7 +406,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -725,7 +725,7 @@ checksum = "240f4126219a83519bad05c9a40bfc0303921eeb571fc2d7e44c17ffac99d3f1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", "synstructure", ] @@ -778,17 +778,6 @@ dependencies = [ "brotli-decompressor", ] -[[package]] -name = "brotli" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - [[package]] name = "brotli-decompressor" version = "4.0.1" @@ -828,7 +817,7 @@ checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -1134,7 +1123,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d" dependencies = [ "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -1349,7 +1338,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -1359,7 +1348,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -1383,7 +1372,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -1394,7 +1383,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -1484,7 +1473,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -1497,7 +1486,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -1643,7 +1632,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -1675,7 +1664,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -1788,7 +1777,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -2007,7 +1996,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -2125,7 +2114,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -2390,7 +2379,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -2486,7 +2475,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -2998,7 +2987,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -3120,7 +3109,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -3934,7 +3923,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -3984,7 +3973,7 @@ dependencies = [ "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -4299,7 +4288,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -4484,7 +4473,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -4612,7 +4601,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -4659,7 +4648,7 @@ checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -4862,7 +4851,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" dependencies = [ "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -4885,7 +4874,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -5522,7 +5511,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -5660,7 +5649,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -5671,7 +5660,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -5694,7 +5683,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -5745,7 +5734,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -6092,9 +6081,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.82" +version = "2.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83540f837a8afc019423a8edb95b52a8effe46957ee402287f4292fae35be021" +checksum = "198514704ca887dd5a1e408c6c6cdcba43672f9b4062e1b24aa34e74e6d7faae" dependencies = [ "proc-macro2", "quote", @@ -6124,7 +6113,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -6236,7 +6225,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -6344,7 +6333,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95d7443dd4f0b597704b6a14b964ee2ed16e99928d8e6292ae9825f09fbcd30e" dependencies = [ "base64 0.22.1", - "brotli 6.0.0", + "brotli", "ico", "json-patch", "plist", @@ -6355,7 +6344,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.8", - "syn 2.0.82", + "syn 2.0.81", "tauri-utils", "thiserror", "time", @@ -6373,7 +6362,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", "tauri-codegen", "tauri-utils", ] @@ -6613,9 +6602,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.1.2" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62fa2068e8498ad007b54d5773d03d57c3ff6dd96f8c8ce58beff44d0d5e0d30" +checksum = "1431602bcc71f2f840ad623915c9842ecc32999b867c4a787d975a17a9625cc6" dependencies = [ "gtk", "http 1.1.0", @@ -6640,11 +6629,11 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.0.2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc65d6f5c54e56b66258948a6d9e47a82ea41f4b5a7612bfbdd1634c2913ed0" +checksum = "c38b0230d6880cf6dd07b6d7dd7789a0869f98ac12146e0d18d1c1049215a045" dependencies = [ - "brotli 7.0.0", + "brotli", "cargo_metadata", "ctor", "dunce", @@ -6802,7 +6791,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -6941,7 +6930,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -7190,7 +7179,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -7637,7 +7626,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", "wasm-bindgen-shared", ] @@ -7671,7 +7660,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7840,7 +7829,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -8013,7 +8002,7 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -8024,7 +8013,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -8035,7 +8024,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -8046,7 +8035,7 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -8057,7 +8046,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -8068,7 +8057,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -8520,7 +8509,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", "synstructure", ] @@ -8607,7 +8596,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] @@ -8627,7 +8616,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", "synstructure", ] @@ -8656,7 +8645,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.82", + "syn 2.0.81", ] [[package]] From ef03dc12bb81cde58b1c5374de5848d4b6abb2de Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 21 Oct 2024 01:35:28 +0800 Subject: [PATCH 132/288] chore: update --- .github/workflows/alpha.yml | 5 ----- .github/workflows/release.yml | 8 -------- src-tauri/Cargo.toml | 2 +- 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/.github/workflows/alpha.yml b/.github/workflows/alpha.yml index b75e6c3f..d9f7587a 100644 --- a/.github/workflows/alpha.yml +++ b/.github/workflows/alpha.yml @@ -22,8 +22,6 @@ 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 @@ -140,9 +138,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 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2e3345fa..d753d6aa 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,8 +15,6 @@ 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 @@ -89,12 +87,6 @@ jobs: include: - os: ubuntu-latest target: x86_64-unknown-linux-gnu - - os: ubuntu-latest - target: i686-unknown-linux-gnu - - os: ubuntu-latest - target: aarch64-unknown-linux-gnu - - os: ubuntu-latest - target: armv7-unknown-linux-gnueabihf runs-on: ${{ matrix.os }} steps: - name: Checkout Repository diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 12a49b56..00b6da98 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -47,7 +47,7 @@ tauri = { version = "2.0.0-rc", features = [ network-interface = { version = "2.0.0", features = ["serde"] } tauri-plugin-shell = "2.0.2" tauri-plugin-dialog = "2.0.2" -tauri-plugin-fs = "2.0.1" +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" From 90091db3b150ced0dec48c283060537d27d0da6c Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 21 Oct 2024 02:17:41 +0800 Subject: [PATCH 133/288] chore: update --- src-tauri/src/utils/dirs.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs index 842b27fe..cf0f9442 100644 --- a/src-tauri/src/utils/dirs.rs +++ b/src-tauri/src/utils/dirs.rs @@ -89,7 +89,7 @@ pub fn profiles_path() -> Result { Ok(app_home_dir()?.join(PROFILE_YAML)) } -#[cfg(not(target_os = "windows"))] +#[cfg(target_os = "macos")] pub fn service_path() -> Result { Ok(app_resources_dir()?.join("clash-verge-service")) } From babf5d840cfe3ebafc96a03546360c6c015c7972 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 21 Oct 2024 02:31:43 +0800 Subject: [PATCH 134/288] chore: replace sudo with pkexec execution --- src-tauri/src/core/service.rs | 1 - src-tauri/src/utils/help.rs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index f20d665b..07853b28 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -103,7 +103,6 @@ pub async fn reinstall_service() -> Result<()> { }; log::info!(target:"app", "status code:{}", status.code().unwrap()); - let elevator = crate::utils::help::linux_elevator(); let status = match get_effective_uid() { 0 => StdCommand::new(install_shell).status()?, _ => StdCommand::new(elevator) diff --git a/src-tauri/src/utils/help.rs b/src-tauri/src/utils/help.rs index b6fda2a9..35279187 100644 --- a/src-tauri/src/utils/help.rs +++ b/src-tauri/src/utils/help.rs @@ -108,7 +108,7 @@ pub fn open_file(app: tauri::AppHandle, path: PathBuf) -> Result<()> { #[cfg(target_os = "linux")] pub fn linux_elevator() -> String { use std::process::Command; - match Command::new("which").arg("sudo").output() { + match Command::new("which").arg("pkexec").output() { Ok(output) => { if !output.stdout.is_empty() { // Convert the output to a string slice From bbd72a79cb682a105153a2c1eea93222e73f83c9 Mon Sep 17 00:00:00 2001 From: wonfen Date: Mon, 21 Oct 2024 03:15:02 +0800 Subject: [PATCH 135/288] chore: update to 2.0 rc2 --- UPDATELOG.md | 10 ++++++---- package.json | 2 +- src-tauri/src/core/tray.rs | 4 ++-- src-tauri/tauri.conf.json | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/UPDATELOG.md b/UPDATELOG.md index aeeebbb1..b8ea2b40 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -1,8 +1,13 @@ ## v2.0.0 +### Notice + +- 由于更改了服务安装逻辑,Mac/Linux 首次安装需要输入 2 遍系统密码卸载和安装服务,以后可以丝滑使用 tun(虚拟网卡)模式 + ### Breaking changes - 重大框架升级:使用 Tauri 2.0(巨量改进与性能提升) +- 强烈建议完全删除 1.x 老版本再安装此版本 - 敬请测试,出现 bug 到 issues 中提出 ### Features @@ -30,13 +35,10 @@ ### Bugs Fixes - 修复已有多个订阅导入新订阅会跳选订阅的问题 +- 修复多个 Linux 下的 bug, Tun 模式在 Linux 下目前工作正常 - 修复 Linux wayland 下任务栏图标缺失的问题 - 移除多余退出变量和钩子 -### 已知问题 - -- 由于[Tauri 底层依赖库 bug](https://github.com/tauri-apps/tauri/issues/10546),在测试节点连通性时关闭窗口会导致程序崩溃;在底层 bug 未修复前,暂时屏蔽窗口关闭功能。 - --- ## v1.7.7 diff --git a/package.json b/package.json index d7e5e2c4..9cc1024f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "clash-verge", - "version": "2.0.0-rc.1", + "version": "2.0.0-rc.2", "license": "GPL-3.0-only", "scripts": { "dev": "cross-env RUST_BACKTRACE=1 tauri dev", diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 8189381e..f1602c56 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -196,7 +196,7 @@ impl Tray { "Clash Verge {version}\n{}: {}\n{}: {}\n{}: {}", t!("SysProxy", "系统代理", use_zh), switch_map[system_proxy], - t!("TUN", "Tun(虚拟网卡)模式", use_zh), + t!("TUN", "Tun模式", use_zh), switch_map[tun_mode], t!("Profile", "当前订阅", use_zh), current_profile_name @@ -267,7 +267,7 @@ fn create_tray_menu( let tun_mode = &CheckMenuItem::with_id( app_handle, "tun_mode", - t!("TUN Mode", "Tun(虚拟网卡)模式", use_zh), + t!("TUN Mode", "Tun模式", use_zh), true, tun_mode_enabled, None::<&str>, diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index cd52f209..668f19c4 100755 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -25,7 +25,7 @@ "devUrl": "http://localhost:3000/" }, "productName": "Clash Verge", - "version": "2.0.0-rc.1", + "version": "2.0.0-rc.2", "identifier": "io.github.clash-verge-rev.clash-verge-rev", "plugins": { "updater": { From 5b93c2b90759f09cc2c0aa1751b54372a0246758 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 21 Oct 2024 04:35:21 +0800 Subject: [PATCH 136/288] chore: update --- src-tauri/src/core/service.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index 07853b28..66dd1936 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -95,7 +95,7 @@ pub async fn reinstall_service() -> Result<()> { let elevator = crate::utils::help::linux_elevator(); let status = match get_effective_uid() { 0 => StdCommand::new(uninstall_shell).status()?, - _ => StdCommand::new(elevator) + _ => StdCommand::new(elevator.clone()) .arg("sh") .arg("-c") .arg(uninstall_shell) @@ -105,7 +105,7 @@ pub async fn reinstall_service() -> Result<()> { let status = match get_effective_uid() { 0 => StdCommand::new(install_shell).status()?, - _ => StdCommand::new(elevator) + _ => StdCommand::new(elevator.clone()) .arg("sh") .arg("-c") .arg(install_shell) From b28fc26ae6797ea3991eb9a201816e94901e160d Mon Sep 17 00:00:00 2001 From: wonfen Date: Mon, 21 Oct 2024 11:30:07 +0800 Subject: [PATCH 137/288] chore: update bug_report template --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- .github/workflows/alpha.yml | 16 +++++++--------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 755eafbb..f6e5ef2b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -57,6 +57,6 @@ body: - type: textarea attributes: label: 日志 / Log - description: 请提供完整或相关部分的Debug日志 / Please provide the complete or relevant part of the Debug log + description: 请提供完整或相关部分的Debug日志(请在“软件左侧菜单”->“设置”->“日志等级”调整到debug,Verge错误请把“杂项设置”->“app日志等级”调整到trace,并重启Verge生效。日志文件在“软件左侧菜单”->“设置”->“日志目录”下) / Please provide a complete or relevant part of the Debug log (please adjust the "Log level" to debug in "Software left menu" -> "Settings" -> "Log level". If there is a Verge error, please adjust "Miscellaneous settings" -> "app log level" to trace, and restart Verge to take effect. The log file is under "Software left menu" -> "Settings" -> "Log directory") validations: required: true diff --git a/.github/workflows/alpha.yml b/.github/workflows/alpha.yml index d9f7587a..9fd37061 100644 --- a/.github/workflows/alpha.yml +++ b/.github/workflows/alpha.yml @@ -235,7 +235,7 @@ jobs: cat > release.txt << 'EOF' ## 我应该下载哪个版本? - ### MacOS (提示文件损坏或开发者无法验证请查看下面FAQ) + ### MacOS - MacOS intel芯片: x64.dmg - MacOS apple M芯片: aarch64.dmg @@ -245,20 +245,18 @@ jobs: ### 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 From bf245a4ee15d2bf4f7e2ad3d94a4daa8bfd0a2d8 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 21 Oct 2024 22:52:10 +0800 Subject: [PATCH 138/288] fix: pac url error ,fixes #1889 --- src-tauri/src/core/sysopt.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/core/sysopt.rs b/src-tauri/src/core/sysopt.rs index 65bdcebb..0674d5b4 100644 --- a/src-tauri/src/core/sysopt.rs +++ b/src-tauri/src/core/sysopt.rs @@ -140,7 +140,7 @@ impl Sysopt { let shell = app_handle.shell(); let output = if pac_enable { - let address = format!("http://{}:{}/pac", "127.0.0.1", pac_port); + 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()]) @@ -377,7 +377,7 @@ impl Sysopt { let shell = app_handle.shell(); let output = if pac { - let address = format!("http://{}:{}/pac", "127.0.0.1", pac_port); + let address = format!("http://{}:{}/commands/pac", "127.0.0.1", pac_port); shell .command(sysproxy_exe.as_path().to_str().unwrap()) From 545ea16ae8021b19679dbe6049cf745542986d82 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 21 Oct 2024 23:16:45 +0800 Subject: [PATCH 139/288] fix: change the window close to minimize the window. there is currently an error in the tauri library. --- src-tauri/src/feat.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index b71a9971..32023ee7 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -16,7 +16,7 @@ use tauri_plugin_clipboard_manager::ClipboardExt; pub fn open_or_close_dashboard() { if let Some(window) = handle::Handle::global().get_window() { if let Ok(true) = window.is_focused() { - let _ = window.close(); + let _ = window.minimize(); return; } } From c64b9d5a2b5fcb6db26330ecff2d7de9b7463cf8 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 22 Oct 2024 01:34:26 +0800 Subject: [PATCH 140/288] chore: update --- packages/linux/post-install.sh | 4 ++++ src-tauri/tauri.linux.conf.json | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 packages/linux/post-install.sh diff --git a/packages/linux/post-install.sh b/packages/linux/post-install.sh new file mode 100644 index 00000000..f398791c --- /dev/null +++ b/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/tauri.linux.conf.json b/src-tauri/tauri.linux.conf.json index 7493b270..2177ebca 100644 --- a/src-tauri/tauri.linux.conf.json +++ b/src-tauri/tauri.linux.conf.json @@ -9,14 +9,16 @@ "desktopTemplate": "./template/clash-verge.desktop", "provides": ["clash-verge"], "conflicts": ["clash-verge"], - "replaces": ["clash-verge"] + "replaces": ["clash-verge"], + "postInstallScript": "../../../packages/linux/post-install.sh" }, "rpm": { "depends": ["openssl"], "desktopTemplate": "./template/clash-verge.desktop", "provides": ["clash-verge"], "conflicts": ["clash-verge"], - "obsoletes": ["clash-verge"] + "obsoletes": ["clash-verge"], + "postInstallScript": "../../../packages/linux/post-install.sh" } }, "externalBin": [ From 5c577e533f8875cace86326fa7615162ec29b747 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 22 Oct 2024 01:45:09 +0800 Subject: [PATCH 141/288] fix: debian executable file has no permissions --- src-tauri/tauri.linux.conf.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src-tauri/tauri.linux.conf.json b/src-tauri/tauri.linux.conf.json index 2177ebca..5c72dd37 100644 --- a/src-tauri/tauri.linux.conf.json +++ b/src-tauri/tauri.linux.conf.json @@ -10,7 +10,7 @@ "provides": ["clash-verge"], "conflicts": ["clash-verge"], "replaces": ["clash-verge"], - "postInstallScript": "../../../packages/linux/post-install.sh" + "postInstallScript": "../packages/linux/post-install.sh" }, "rpm": { "depends": ["openssl"], @@ -18,7 +18,7 @@ "provides": ["clash-verge"], "conflicts": ["clash-verge"], "obsoletes": ["clash-verge"], - "postInstallScript": "../../../packages/linux/post-install.sh" + "postInstallScript": "../packages/linux/post-install.sh" } }, "externalBin": [ From 3e94adb4b1b3478e1651bc94c8ad0b51ae5ce80b Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 22 Oct 2024 03:17:04 +0800 Subject: [PATCH 142/288] feat: add linux uninstall script --- packages/linux/pre-remove.sh | 2 ++ src-tauri/tauri.linux.conf.json | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 packages/linux/pre-remove.sh diff --git a/packages/linux/pre-remove.sh b/packages/linux/pre-remove.sh new file mode 100644 index 00000000..984ffec6 --- /dev/null +++ b/packages/linux/pre-remove.sh @@ -0,0 +1,2 @@ +#!/bin/bash +/usr/bin/uninstall-service diff --git a/src-tauri/tauri.linux.conf.json b/src-tauri/tauri.linux.conf.json index 5c72dd37..f07a789b 100644 --- a/src-tauri/tauri.linux.conf.json +++ b/src-tauri/tauri.linux.conf.json @@ -10,7 +10,8 @@ "provides": ["clash-verge"], "conflicts": ["clash-verge"], "replaces": ["clash-verge"], - "postInstallScript": "../packages/linux/post-install.sh" + "postInstallScript": "../packages/linux/post-install.sh", + "preRemoveScript": "../packages/linux/pre-remove.sh" }, "rpm": { "depends": ["openssl"], @@ -18,7 +19,8 @@ "provides": ["clash-verge"], "conflicts": ["clash-verge"], "obsoletes": ["clash-verge"], - "postInstallScript": "../packages/linux/post-install.sh" + "postInstallScript": "../packages/linux/post-install.sh", + "preRemoveScript": "../packages/linux/pre-remove.sh" } }, "externalBin": [ From afde7e4a4405663ecd80518996bc91d0b6d990c1 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 22 Oct 2024 04:46:08 +0800 Subject: [PATCH 143/288] feat: add windows uninstall script --- packages/windows/nsis_hooks.sh | 5 +++++ src-tauri/tauri.windows.conf.json | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 packages/windows/nsis_hooks.sh diff --git a/packages/windows/nsis_hooks.sh b/packages/windows/nsis_hooks.sh new file mode 100644 index 00000000..2cd2df9a --- /dev/null +++ b/packages/windows/nsis_hooks.sh @@ -0,0 +1,5 @@ +!define NSIS_HOOK_PREUNINSTALL "NSIS_HOOK_PREUNINSTALL_" + +!macro NSIS_HOOK_PREUNINSTALL_ +ExecWait '"$INSTDIR\uninstall-service.exe"' +!macroend diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json index 84047f1b..bf46ee2d 100644 --- a/src-tauri/tauri.windows.conf.json +++ b/src-tauri/tauri.windows.conf.json @@ -16,7 +16,8 @@ "installerIcon": "icons/icon.ico", "languages": ["SimpChinese", "English"], "installMode": "perMachine", - "template": "./template/installer.nsi" + "template": "./template/installer.nsi", + "installerHooks": "../packages/windows/nsis_hooks.sh" } } }, From da8ed1ac5a0268770b7ab5138f3e8ef16785acf1 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 23 Oct 2024 04:46:47 +0800 Subject: [PATCH 144/288] fix: failed to install service on macos --- src-tauri/src/core/service.rs | 8 +++++--- src-tauri/src/utils/init.rs | 2 +- src-tauri/src/utils/resolve.rs | 12 ++++++++++-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index 66dd1936..d4d5a93a 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -138,12 +138,14 @@ pub async fn reinstall_service() -> Result<()> { bail!(format!("uninstaller not found: {uninstall_path:?}")); } - let install_shell: String = install_path.to_string_lossy().replace(" ", "\\ "); - let uninstall_shell: String = uninstall_path.to_string_lossy().replace(" ", "\\ "); + 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"# + 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()?; diff --git a/src-tauri/src/utils/init.rs b/src-tauri/src/utils/init.rs index 609012af..1cb509ea 100644 --- a/src-tauri/src/utils/init.rs +++ b/src-tauri/src/utils/init.rs @@ -206,7 +206,7 @@ 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::info!(target: "app", "src_path: {src_path:?}, dest_path: {dest_path:?}"); + log::debug!(target: "app", "src_path: {src_path:?}, dest_path: {dest_path:?}"); let handle_copy = |dest: &PathBuf| { match fs::copy(&src_path, dest) { diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 28b6adc9..055905b1 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -54,8 +54,16 @@ pub async fn resolve_setup(app: &mut App) { log_err!(Config::init_config().await); if service::check_service().await.is_err() { - log_err!(service::reinstall_service().await); - std::thread::sleep(std::time::Duration::from_millis(1000)); + match service::reinstall_service().await { + Ok(_) => { + log::info!(target:"app", "install service susccess."); + std::thread::sleep(std::time::Duration::from_millis(1000)); + } + Err(e) => { + log::error!(target: "app", "{e:?}"); + app.app_handle().exit(-1); + } + } } log::trace!(target: "app", "launch core"); From f9009de89435cf249564c29339c44583b648dbb0 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 23 Oct 2024 05:48:01 +0800 Subject: [PATCH 145/288] chore: update --- src-tauri/src/core/hotkey.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/core/hotkey.rs b/src-tauri/src/core/hotkey.rs index a51af840..de2d764c 100755 --- a/src-tauri/src/core/hotkey.rs +++ b/src-tauri/src/core/hotkey.rs @@ -79,7 +79,7 @@ impl Hotkey { } }); - log::info!(target: "app", "register hotkey {hotkey} {func}"); + log::debug!(target: "app", "register hotkey {hotkey} {func}"); Ok(()) } @@ -88,7 +88,7 @@ impl Hotkey { let manager = app_handle.global_shortcut(); manager.unregister(hotkey)?; - log::info!(target: "app", "unregister hotkey {hotkey}"); + log::debug!(target: "app", "unregister hotkey {hotkey}"); Ok(()) } From 2ab75db9c991b6e1330cf99625aeb1eed0a85a4e Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 23 Oct 2024 09:26:14 +0800 Subject: [PATCH 146/288] chore: update --- src-tauri/src/lib.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index d73b20fa..f972c67a 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -159,6 +159,16 @@ pub fn run() { 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")] { From 30b0c45539c36138eaea9622122952ea27a32732 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 23 Oct 2024 10:34:14 +0800 Subject: [PATCH 147/288] refactor: IRuntime::patch_config() --- src-tauri/src/config/runtime.rs | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src-tauri/src/config/runtime.rs b/src-tauri/src/config/runtime.rs index 892e6be7..c406c7f0 100644 --- a/src-tauri/src/config/runtime.rs +++ b/src-tauri/src/config/runtime.rs @@ -26,20 +26,24 @@ impl IRuntime { 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)); + } } } } From caf4ee68630f33150dd0bd0efd435dfd5c1b45b0 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 24 Oct 2024 02:16:28 +0800 Subject: [PATCH 148/288] fix: tun mode switch is not effective --- src-tauri/src/enhance/mod.rs | 4 +--- src-tauri/src/enhance/tun.rs | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src-tauri/src/enhance/mod.rs b/src-tauri/src/enhance/mod.rs index 6da1b537..11355e87 100644 --- a/src-tauri/src/enhance/mod.rs +++ b/src-tauri/src/enhance/mod.rs @@ -259,9 +259,7 @@ pub async fn enhance() -> (Mapping, Vec, HashMap) { }); } - if enable_tun { - config = use_tun(config).await; - } + config = use_tun(config, enable_tun).await; config = use_sort(config); let mut exists_set = HashSet::new(); diff --git a/src-tauri/src/enhance/tun.rs b/src-tauri/src/enhance/tun.rs index b532f91f..c8728090 100644 --- a/src-tauri/src/enhance/tun.rs +++ b/src-tauri/src/enhance/tun.rs @@ -18,13 +18,13 @@ macro_rules! append { }; } -pub async fn use_tun(mut config: Mapping) -> Mapping { +pub async fn use_tun(mut config: Mapping, enable: bool) -> Mapping { let tun_key = Value::from("tun"); let tun_val = config.get(&tun_key); let mut tun_val = tun_val.map_or(Mapping::new(), |val| { val.as_mapping().cloned().unwrap_or(Mapping::new()) }); - revise!(tun_val, "enable", true); + revise!(tun_val, "enable", enable); revise!(config, "tun", tun_val); config } From aab71e55de6f1f7ad6eb07281fb4c8132ed1323f Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 24 Oct 2024 02:54:57 +0800 Subject: [PATCH 149/288] fix: restart app failure --- src-tauri/src/core/tray.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index f1602c56..af2c855f 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -1,7 +1,8 @@ use crate::{ cmds, config::Config, - feat, t, + core::CoreManager, + feat, log_err, t, utils::{ dirs, resolve::{self, VERSION}, @@ -330,7 +331,7 @@ fn create_tray_menu( let restart_app = &MenuItem::with_id( app_handle, "restart_app", - t!("Restart App", "重启Verge", use_zh), + t!("Restart App", "重启App", use_zh), true, None::<&str>, ) @@ -401,7 +402,15 @@ fn on_menu_event(app_handle: &AppHandle, event: MenuEvent) { "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()), + "restart_app" => { + tauri::async_runtime::block_on(async move { + log_err!(CoreManager::global().stop_core().await); + }); + resolve::resolve_reset(); + //睡1秒再重启 + std::thread::sleep(std::time::Duration::from_secs(1)); + tauri::process::restart(&app_handle.env()); + } "quit" => { println!("quit"); feat::quit(Some(0)); From e79121e46acb3cebdddd81ccbb587b9d08545dca Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 24 Oct 2024 05:02:47 +0800 Subject: [PATCH 150/288] refactor: the logic of profiles activation --- src/pages/profiles.tsx | 61 +++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 34 deletions(-) diff --git a/src/pages/profiles.tsx b/src/pages/profiles.tsx index 32731415..4a8b15b1 100644 --- a/src/pages/profiles.tsx +++ b/src/pages/profiles.tsx @@ -66,7 +66,7 @@ const ProfilePage = () => { coordinateGetter: sortableKeyboardCoordinates, }) ); - const { current } = location.state || {}; + const { stateCurrent } = location.state || {}; useEffect(() => { const unlisten = addListener("tauri://file-drop", async (event) => { @@ -135,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 itemsCount = newProfiles.items?.filter( - (e) => e.type === "remote" || e.type === "local" - ).length as number; - - if (remoteItem && (itemsCount == 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); @@ -171,9 +156,8 @@ const ProfilePage = () => { } }; - const activateProfile = async (profile: string) => { + const activateProfile = async (profile: string, notifySuccess: boolean) => { // 避免大多数情况下loading态闪烁 - const reset = setTimeout(() => { setActivatings((prev) => [...prev, profile]); }, 100); @@ -183,7 +167,9 @@ const ProfilePage = () => { await mutateLogs(); closeAllConnections(); await activateSelected(); - Notice.success(t("Profile Switched"), 1000); + if (notifySuccess) { + Notice.success(t("Profile Switched"), 1000); + } } catch (err: any) { Notice.error(err?.message || err.toString(), 4000); } finally { @@ -193,24 +179,25 @@ const ProfilePage = () => { }; const onSelect = useLockFn(async (current: string, force: boolean) => { if (!force && current === profiles.current) return; - await activateProfile(current); + await activateProfile(current, true); }); useEffect(() => { (async () => { - if (current && current !== profiles.current) { - console.log("current:", current); - await activateProfile(current); + if (stateCurrent && stateCurrent !== profiles.current) { + await activateProfile(stateCurrent, false); } })(); - }, current); + }, stateCurrent); - const onEnhance = useLockFn(async () => { + 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 { @@ -225,7 +212,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 { @@ -302,7 +289,7 @@ const ProfilePage = () => { size="small" color="primary" title={t("Reactivate Profiles")} - onClick={onEnhance} + onClick={() => onEnhance(true)} > @@ -401,7 +388,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)} @@ -424,7 +411,7 @@ const ProfilePage = () => { id="Merge" onSave={async (prev, curr) => { if (prev !== curr) { - await onEnhance(); + await onEnhance(false); } }} /> @@ -435,7 +422,7 @@ const ProfilePage = () => { logInfo={chainLogs["Script"]} onSave={async (prev, curr) => { if (prev !== curr) { - await onEnhance(); + await onEnhance(false); } }} /> @@ -444,7 +431,13 @@ const ProfilePage = () => { - mutateProfiles()} /> + { + mutateProfiles(); + await onEnhance(false); + }} + /> ); From fdc8a83f25f9f49d0a4d5d4aea3df0e3b31cc56b Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 24 Oct 2024 06:54:27 +0800 Subject: [PATCH 151/288] fix: proxy view display error --- src/components/proxy/use-render-list.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/proxy/use-render-list.ts b/src/components/proxy/use-render-list.ts index e87be897..dd3efe09 100644 --- a/src/components/proxy/use-render-list.ts +++ b/src/components/proxy/use-render-list.ts @@ -115,7 +115,7 @@ export const useRenderList = (mode: string) => { }); if (!useRule) return retList.slice(1); - return retList; + return retList.filter((item) => item.group.hidden === false); }, [headStates, proxiesData, mode, col]); return { From b5fddf8fa1464964b2f348007dead97418e36634 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 24 Oct 2024 06:58:21 +0800 Subject: [PATCH 152/288] chore: update --- src/components/proxy/proxy-render.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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) => ( Date: Thu, 24 Oct 2024 07:30:30 +0800 Subject: [PATCH 153/288] chore: global mode doesn't show proxy groups, use placeholder images instead --- src/components/proxy/proxy-groups.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/proxy/proxy-groups.tsx b/src/components/proxy/proxy-groups.tsx index bbe550a6..74f0919f 100644 --- a/src/components/proxy/proxy-groups.tsx +++ b/src/components/proxy/proxy-groups.tsx @@ -121,6 +121,10 @@ export const ProxyGroups = (props: Props) => { return ; } + if (mode === "global") { + return ; + } + return ( Date: Thu, 24 Oct 2024 07:44:21 +0800 Subject: [PATCH 154/288] Revert "chore: global mode doesn't show proxy groups, use placeholder images instead" This reverts commit 3df4718709c49084a635ab190892d14b1744574b. --- src/components/proxy/proxy-groups.tsx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/components/proxy/proxy-groups.tsx b/src/components/proxy/proxy-groups.tsx index 74f0919f..bbe550a6 100644 --- a/src/components/proxy/proxy-groups.tsx +++ b/src/components/proxy/proxy-groups.tsx @@ -121,10 +121,6 @@ export const ProxyGroups = (props: Props) => { return ; } - if (mode === "global") { - return ; - } - return ( Date: Thu, 24 Oct 2024 11:14:18 +0800 Subject: [PATCH 155/288] chore: update --- src/pages/profiles.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/pages/profiles.tsx b/src/pages/profiles.tsx index 4a8b15b1..e6214b83 100644 --- a/src/pages/profiles.tsx +++ b/src/pages/profiles.tsx @@ -66,7 +66,7 @@ const ProfilePage = () => { coordinateGetter: sortableKeyboardCoordinates, }) ); - const { stateCurrent } = location.state || {}; + const { current } = location.state || {}; useEffect(() => { const unlisten = addListener("tauri://file-drop", async (event) => { @@ -184,11 +184,12 @@ const ProfilePage = () => { useEffect(() => { (async () => { - if (stateCurrent && stateCurrent !== profiles.current) { - await activateProfile(stateCurrent, false); + if (current) { + mutateProfiles(); + await activateProfile(current, false); } })(); - }, stateCurrent); + }, current); const onEnhance = useLockFn(async (notifySuccess: boolean) => { setActivatings(currentActivatings()); From d7dd797494693e884d001826c2a1c8276899b3ce Mon Sep 17 00:00:00 2001 From: wonfen Date: Thu, 24 Oct 2024 12:52:20 +0800 Subject: [PATCH 156/288] release 2.0rc3 --- UPDATELOG.md | 2 ++ package.json | 2 +- src-tauri/tauri.conf.json | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/UPDATELOG.md b/UPDATELOG.md index b8ea2b40..2b8e8400 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -38,6 +38,8 @@ - 修复多个 Linux 下的 bug, Tun 模式在 Linux 下目前工作正常 - 修复 Linux wayland 下任务栏图标缺失的问题 - 移除多余退出变量和钩子 +- 修复 MacOS 下 tray 菜单重启 app 失效的问题 +- 修复某些特定配置文件载入失败的问题 --- diff --git a/package.json b/package.json index 9cc1024f..26e4b9e3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "clash-verge", - "version": "2.0.0-rc.2", + "version": "2.0.0-rc.3", "license": "GPL-3.0-only", "scripts": { "dev": "cross-env RUST_BACKTRACE=1 tauri dev", diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 668f19c4..55114d57 100755 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -25,7 +25,7 @@ "devUrl": "http://localhost:3000/" }, "productName": "Clash Verge", - "version": "2.0.0-rc.2", + "version": "2.0.0-rc.3", "identifier": "io.github.clash-verge-rev.clash-verge-rev", "plugins": { "updater": { From fc2c10bb3f4f7a9aaae92dd81e034480a0870c4a Mon Sep 17 00:00:00 2001 From: wonfen Date: Fri, 25 Oct 2024 12:27:22 +0800 Subject: [PATCH 157/288] chore: add mac sun ico --- src-tauri/icons/tray-icon-sun.ico | Bin 0 -> 19550 bytes src-tauri/icons/tray-icon-sys-sun.ico | Bin 0 -> 22514 bytes src-tauri/icons/tray-icon-tun-sun.ico | Bin 0 -> 20835 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src-tauri/icons/tray-icon-sun.ico create mode 100644 src-tauri/icons/tray-icon-sys-sun.ico create mode 100644 src-tauri/icons/tray-icon-tun-sun.ico diff --git a/src-tauri/icons/tray-icon-sun.ico b/src-tauri/icons/tray-icon-sun.ico new file mode 100644 index 0000000000000000000000000000000000000000..f9ed34201b516eff6beaaab389f17f84954c2606 GIT binary patch literal 19550 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 A`Tzg` literal 0 HcmV?d00001 diff --git a/src-tauri/icons/tray-icon-sys-sun.ico b/src-tauri/icons/tray-icon-sys-sun.ico new file mode 100644 index 0000000000000000000000000000000000000000..46f7a1bead0df312a2f66f643e6d15ac6df837e0 GIT binary patch literal 22514 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 Az5oCK literal 0 HcmV?d00001 diff --git a/src-tauri/icons/tray-icon-tun-sun.ico b/src-tauri/icons/tray-icon-tun-sun.ico new file mode 100644 index 0000000000000000000000000000000000000000..7080143976af4cf5020b3460002b44ac4cf3e4b2 GIT binary patch literal 20835 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 Date: Fri, 25 Oct 2024 13:58:22 +0800 Subject: [PATCH 158/288] fix: the tray icon does not display the correct colours on macos. --- src-tauri/icons/tray-icon-sun.ico | Bin 19550 -> 0 bytes src-tauri/icons/tray-icon-sys-sun.ico | Bin 22514 -> 0 bytes src-tauri/icons/tray-icon-tun-sun.ico | Bin 20835 -> 0 bytes src-tauri/src/core/tray.rs | 83 ++++++++++---------------- 4 files changed, 30 insertions(+), 53 deletions(-) delete mode 100644 src-tauri/icons/tray-icon-sun.ico delete mode 100644 src-tauri/icons/tray-icon-sys-sun.ico delete mode 100644 src-tauri/icons/tray-icon-tun-sun.ico diff --git a/src-tauri/icons/tray-icon-sun.ico b/src-tauri/icons/tray-icon-sun.ico deleted file mode 100644 index f9ed34201b516eff6beaaab389f17f84954c2606..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19550 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 A`Tzg` diff --git a/src-tauri/icons/tray-icon-sys-sun.ico b/src-tauri/icons/tray-icon-sys-sun.ico deleted file mode 100644 index 46f7a1bead0df312a2f66f643e6d15ac6df837e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22514 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 Az5oCK diff --git a/src-tauri/icons/tray-icon-tun-sun.ico b/src-tauri/icons/tray-icon-tun-sun.ico deleted file mode 100644 index 7080143976af4cf5020b3460002b44ac4cf3e4b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20835 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 { - let _ = tray.set_icon_as_template(true); - } - "colorful" => { - let _ = tray.set_icon_as_template(false); - } - _ => {} - } - + let mut use_custom_icon = false; + #[allow(unused)] let mut indication_icon = if *system_proxy { - #[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(), - _ => 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"); @@ -128,38 +108,10 @@ impl Tray { } else if png_path.exists() { icon = std::fs::read(png_path).unwrap(); } + use_custom_icon = true; } 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(); - } - } - icon - }; - - 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(), - _ => include_bytes!("../../icons/tray-icon-tun-mono.ico").to_vec(), - }; - #[cfg(not(target_os = "macos"))] + } else if *tun_mode { let mut icon = include_bytes!("../../icons/tray-icon-tun.ico").to_vec(); if *tun_tray_icon { let icon_dir_path = dirs::app_home_dir()?.join("icons"); @@ -170,9 +122,34 @@ impl Tray { } else if png_path.exists() { icon = std::fs::read(png_path).unwrap(); } + use_custom_icon = true; + } + icon + } else { + 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(); + } + 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)?)); } - indication_icon = icon } + + #[cfg(not(target_os = "macos"))] let _ = tray.set_icon(Some(tauri::image::Image::from_bytes(&indication_icon)?)); let switch_map = { From a1c72fe78011b895db75a2d8c3667c02917e4b9c Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 25 Oct 2024 14:12:27 +0800 Subject: [PATCH 159/288] chore: update --- src-tauri/src/core/tray.rs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index d2675925..a7f6717d 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -87,6 +87,7 @@ impl Tray { 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(); + let tray_icon = verge.tray_icon.clone().unwrap_or("monochrome".to_string()); let _ = tray.set_menu(Some(create_tray_menu( &app_handle, @@ -98,6 +99,16 @@ impl Tray { let mut use_custom_icon = false; #[allow(unused)] let mut indication_icon = if *system_proxy { + #[cfg(target_os = "macos")] + let mut icon = match tray_icon.as_str() { + "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"); @@ -112,6 +123,16 @@ impl Tray { } icon } else if *tun_mode { + #[cfg(target_os = "macos")] + let mut icon = match tray_icon.as_str() { + "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 { let icon_dir_path = dirs::app_home_dir()?.join("icons"); @@ -126,6 +147,16 @@ impl Tray { } 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"); From ba2aa9d6e7bc13f41d6c217e48147346ab6565f3 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 25 Oct 2024 14:13:30 +0800 Subject: [PATCH 160/288] chore: update --- src-tauri/src/core/tray.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index a7f6717d..4a9ba636 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -177,6 +177,8 @@ impl Tray { 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); } } From 6c2af1bef5d849a428bea1de51ffabd65b5ddcb7 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 25 Oct 2024 21:25:06 +0800 Subject: [PATCH 161/288] chore: update --- src-tauri/src/core/tray.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 4a9ba636..4d1e5d71 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -87,6 +87,7 @@ impl Tray { 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( From 652a20c523b6ca95dbeb704dc339901d590e9ee2 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 26 Oct 2024 01:44:06 +0800 Subject: [PATCH 162/288] chore: update --- src-tauri/src/enhance/tun.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src-tauri/src/enhance/tun.rs b/src-tauri/src/enhance/tun.rs index c8728090..9e7446df 100644 --- a/src-tauri/src/enhance/tun.rs +++ b/src-tauri/src/enhance/tun.rs @@ -24,7 +24,23 @@ pub async fn use_tun(mut config: Mapping, enable: bool) -> Mapping { let mut tun_val = tun_val.map_or(Mapping::new(), |val| { val.as_mapping().cloned().unwrap_or(Mapping::new()) }); + 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()) + }); + + if enable { + revise!(dns_val, "enable", true); + revise!(dns_val, "ip-v6", true); + revise!(dns_val, "enhanced-mode", "fake-ip"); + revise!(dns_val, "fake-ip-range", "10.96.0.0/16"); + } else { + revise!(dns_val, "enhanced-mode", "redir-host"); + } + revise!(tun_val, "enable", enable); revise!(config, "tun", tun_val); + revise!(config, "dns", dns_val); config } From 76d04805a4663087a22e430e4f64544ce9d5ad1b Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 26 Oct 2024 08:55:00 +0800 Subject: [PATCH 163/288] fix:public DNS not set in macos, tun+fake-ip --- scripts/check.mjs | 46 +++++++++++++++++--- scripts/set_dns.sh | 58 +++++++++++++++++++++++++ scripts/unset_dns.sh | 22 ++++++++++ src-tauri/src/enhance/tun.rs | 77 +++++++++++++++++++++++++++++++++ src-tauri/tauri.macos.conf.json | 1 + 5 files changed, 199 insertions(+), 5 deletions(-) create mode 100644 scripts/set_dns.sh create mode 100644 scripts/unset_dns.sh diff --git a/scripts/check.mjs b/scripts/check.mjs index bf75cbac..a2e4cd70 100644 --- a/scripts/check.mjs +++ b/scripts/check.mjs @@ -279,27 +279,50 @@ async function resolveSidecar(binInfo) { } } +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 && fs.existsSync(targetPath)) return; - await fsp.mkdir(resDir, { recursive: true }); - await downloadFile(downloadURL, targetPath); + if (downloadURL) { + await fsp.mkdir(resDir, { recursive: true }); + await downloadFile(downloadURL, targetPath); + } + + 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 = @@ -474,6 +497,18 @@ const tasks = [ 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() { @@ -482,6 +517,7 @@ 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 { diff --git a/scripts/set_dns.sh b/scripts/set_dns.sh new file mode 100644 index 00000000..011adf75 --- /dev/null +++ b/scripts/set_dns.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +function is_valid_ip() { + local ip=$1 + local IFS='.' + local -a octets + + if [[ ! $ip =~ ^([0-9]+\.){3}[0-9]+$ ]]; then + return 1 + fi + + read -r -a octets <<<"$ip" + + if [ "${#octets[@]}" -ne 4 ]; then + return 1 + fi + + for octet in "${octets[@]}"; do + if ! [[ "$octet" =~ ^[0-9]+$ ]] || ((octet < 0 || octet > 255)); then + return 1 + fi + done + + return 0 +} + +if [ $# -lt 1 ]; then + echo "Usage: $0 " + exit 1 +fi + +if ! is_valid_ip "$1"; then + echo "$1 is not a valid IP address." + exit 1 +fi + +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 + } + } +') + +original_dns=$(networksetup -getdnsservers "$hardware_port") + +if [ ${#original_dns} -gt 15 ]; 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..9d98aff1 --- /dev/null +++ b/scripts/unset_dns.sh @@ -0,0 +1,22 @@ +#!/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) +else + original_dns=$(networksetup -getdnsservers "$hardware_port") +fi + +networksetup -setdnsservers "$hardware_port" $original_dns diff --git a/src-tauri/src/enhance/tun.rs b/src-tauri/src/enhance/tun.rs index 9e7446df..87c78efa 100644 --- a/src-tauri/src/enhance/tun.rs +++ b/src-tauri/src/enhance/tun.rs @@ -35,8 +35,12 @@ pub async fn use_tun(mut config: Mapping, enable: bool) -> Mapping { revise!(dns_val, "ip-v6", true); revise!(dns_val, "enhanced-mode", "fake-ip"); revise!(dns_val, "fake-ip-range", "10.96.0.0/16"); + #[cfg(target_os = "macos")] + set_public_dns("10.96.0.2".to_string()).await; } else { revise!(dns_val, "enhanced-mode", "redir-host"); + #[cfg(target_os = "macos")] + restore_public_dns().await; } revise!(tun_val, "enable", enable); @@ -44,3 +48,76 @@ pub async fn use_tun(mut config: Mapping, enable: bool) -> Mapping { revise!(config, "dns", dns_val); config } + +#[cfg(target_os = "macos")] +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")] +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/tauri.macos.conf.json b/src-tauri/tauri.macos.conf.json index 95dc299a..09dcdd10 100644 --- a/src-tauri/tauri.macos.conf.json +++ b/src-tauri/tauri.macos.conf.json @@ -3,6 +3,7 @@ "identifier": "io.github.clash-verge-rev.clash-verge-rev", "bundle": { "targets": ["app", "dmg"], + "resources": ["resources/set_dns.sh", "resources/unset_dns.sh"], "macOS": { "frameworks": [], "minimumSystemVersion": "10.15", From e5dc4a55b057de51085c9e517a0a61d4cc07cf9a Mon Sep 17 00:00:00 2001 From: wonfen Date: Sat, 26 Oct 2024 12:05:09 +0800 Subject: [PATCH 164/288] release rc.4 --- README.md | 8 ++++---- UPDATELOG.md | 2 ++ package.json | 2 +- src-tauri/tauri.conf.json | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 23395a6b..091c12db 100644 --- a/README.md +++ b/README.md @@ -25,21 +25,21 @@ 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 -[狗狗加速 —— 技术流机场 Doggygo VPN](https://狗狗加速.com) +[狗狗加速 —— 技术流机场 Doggygo VPN](https://verge.dginv.click/#/register?code=oaxsAGo6) - 高性能海外机场,免费试用,优惠套餐,解锁流媒体,全球首家支持 Hysteria 协议。 -- 使用 Clash Verge 专属邀请链接注册送 3 天,每天 1G 流量免费试用:https://verge.狗狗加速.com/#/register?code=oaxsAGo6 +- 使用 Clash Verge 专属邀请链接注册送 3 天,每天 1G 流量免费试用:https://verge.dginv.click/#/register?code=oaxsAGo6 - Clash Verge 专属 8 折优惠码: verge20 (仅有 500 份) - 优惠套餐每月仅需 15.8 元,160G 流量,年付 8 折 - 海外团队,无跑路风险,高达 50% 返佣 - 集群负载均衡设计,高速专线(兼容老客户端),极低延迟,无视晚高峰,4K 秒开 - 全球首家 Hysteria 协议机场,现已上线更快的 `Hysteria2` 协议(Clash Verge 客户端最佳搭配) - 解锁流媒体及 ChatGPT -- 官网:https://狗狗加速.com +- 官网:[https://狗狗加速.com](https://verge.dginv.click/#/register?code=oaxsAGo6) ## Features diff --git a/UPDATELOG.md b/UPDATELOG.md index 2b8e8400..7b6598bd 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -23,6 +23,7 @@ - 改进多处文本表述 - 加入图标 svg 格式检测 - 增加更多 app 调试日志 +- 添加 MacOS 下白色桌面的 tray 黑色配色(但会代理系统代理、tun 模式图标失效的问题) ### Performance @@ -40,6 +41,7 @@ - 移除多余退出变量和钩子 - 修复 MacOS 下 tray 菜单重启 app 失效的问题 - 修复某些特定配置文件载入失败的问题 +- 修复 MacOS 下 tun 模式 fakeip 不生效的问题 --- diff --git a/package.json b/package.json index 26e4b9e3..753aa570 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "clash-verge", - "version": "2.0.0-rc.3", + "version": "2.0.0-rc.4", "license": "GPL-3.0-only", "scripts": { "dev": "cross-env RUST_BACKTRACE=1 tauri dev", diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 55114d57..8d8896f3 100755 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -25,7 +25,7 @@ "devUrl": "http://localhost:3000/" }, "productName": "Clash Verge", - "version": "2.0.0-rc.3", + "version": "2.0.0-rc.4", "identifier": "io.github.clash-verge-rev.clash-verge-rev", "plugins": { "updater": { From 9e486e6836f84f6b7df3b642d60d7434f0aabd23 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 26 Oct 2024 19:23:49 +0800 Subject: [PATCH 165/288] chore: update --- src-tauri/tauri.macos.conf.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/tauri.macos.conf.json b/src-tauri/tauri.macos.conf.json index 09dcdd10..1b1fd1a5 100644 --- a/src-tauri/tauri.macos.conf.json +++ b/src-tauri/tauri.macos.conf.json @@ -3,7 +3,7 @@ "identifier": "io.github.clash-verge-rev.clash-verge-rev", "bundle": { "targets": ["app", "dmg"], - "resources": ["resources/set_dns.sh", "resources/unset_dns.sh"], + "resources": ["resources"], "macOS": { "frameworks": [], "minimumSystemVersion": "10.15", From 1cb1946497c35dfbe0a7b77249cb3ea8a5ddc748 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 27 Oct 2024 01:24:13 +0800 Subject: [PATCH 166/288] chore: update deps --- package.json | 2 +- pnpm-lock.yaml | 90 +++++++-------- src-tauri/Cargo.lock | 256 +++++++++++++++++++++++-------------------- 3 files changed, 185 insertions(+), 163 deletions(-) diff --git a/package.json b/package.json index 753aa570..f90cb4a5 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ }, "devDependencies": { "@actions/github": "^5.1.1", - "@tauri-apps/cli": "2.0.3", + "@tauri-apps/cli": "2.0.4", "@types/js-cookie": "^3.0.6", "@types/js-yaml": "^4.0.9", "@types/lodash-es": "^4.17.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index baec87c3..aacba839 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -159,8 +159,8 @@ importers: specifier: ^5.1.1 version: 5.1.1 "@tauri-apps/cli": - specifier: 2.0.3 - version: 2.0.3 + specifier: 2.0.4 + version: 2.0.4 "@types/js-cookie": specifier: ^3.0.6 version: 3.0.6 @@ -2113,100 +2113,100 @@ packages: integrity: sha512-UNiIhhKG08j4ooss2oEEVexffmWkgkYlC2M3GcX3VPtNsqFgVNL8Mcw/4Y7rO9M9S+ffAMnLOF5ypzyuyb8tyg==, } - "@tauri-apps/cli-darwin-arm64@2.0.3": + "@tauri-apps/cli-darwin-arm64@2.0.4": resolution: { - integrity: sha512-jIsbxGWS+As1ZN7umo90nkql/ZAbrDK0GBT6UsgHSz5zSwwArICsZFFwE1pLZip5yoiV5mn3TGG2c1+v+0puzQ==, + integrity: sha512-siH7rOHobb16rPbc11k64p1mxIpiRCkWmzs2qmL5IX21Gx9K5onI3Tk67Oqpf2uNupbYzItrOttaDT4NHFC7tw==, } engines: { node: ">= 10" } cpu: [arm64] os: [darwin] - "@tauri-apps/cli-darwin-x64@2.0.3": + "@tauri-apps/cli-darwin-x64@2.0.4": resolution: { - integrity: sha512-ROITHtLTA1muyrwgyuwyasmaLCGtT4as/Kd1kerXaSDtFcYrnxiM984ZD0+FDUEDl5BgXtYa/sKKkKQFjgmM0A==, + integrity: sha512-zIccfbCoZMfmUpnk6PFCV0keFyfVj1A9XV3Oiiitj/dkTZ9CQvzjhX3XC0XcK4rsTWegfr2PjSrK06aiPAROAw==, } engines: { node: ">= 10" } cpu: [x64] os: [darwin] - "@tauri-apps/cli-linux-arm-gnueabihf@2.0.3": + "@tauri-apps/cli-linux-arm-gnueabihf@2.0.4": resolution: { - integrity: sha512-bQ3EZwCFfrLg/ZQ2I8sLuifSxESz4TP56SleTkKsPtTIZgNnKpM88PRDz4neiRroHVOq8NK0X276qi9LjGcXPw==, + integrity: sha512-fgQqJzefOGWCBNg4yrVA82Rg4s1XQr5K0dc2rCxBhJfa696e8dQ1LDrnWq/AiO5r+uHfVaoQTIUvxxpFicYRSA==, } engines: { node: ">= 10" } cpu: [arm] os: [linux] - "@tauri-apps/cli-linux-arm64-gnu@2.0.3": + "@tauri-apps/cli-linux-arm64-gnu@2.0.4": resolution: { - integrity: sha512-aLfAA8P9OTErVUk3sATxtXqpAtlfDPMPp4fGjDysEELG/MyekGhmh2k/kG/i32OdPeCfO+Nr37wJksARJKubGw==, + integrity: sha512-u8wbt5tPA9pI6j+d7jGrfOz9UVCiTp+IYzKNiIqlrDsAjqAUFaNXYHKqOUboeFWEmI4zoCWj6LgpS2OJTQ5FKg==, } engines: { node: ">= 10" } cpu: [arm64] os: [linux] - "@tauri-apps/cli-linux-arm64-musl@2.0.3": + "@tauri-apps/cli-linux-arm64-musl@2.0.4": resolution: { - integrity: sha512-I4MVD7nf6lLLRmNQPpe5beEIFM6q7Zkmh77ROA5BNu/+vHNL5kiTMD+bmd10ZL2r753A6pO7AvqkIxcBuIl0tg==, + integrity: sha512-hntF1V8e3V1hlrESm93PsghDhf3lA5pbvFrRfYxU1c+fVD/jRXGVw8BH3O1lW8MWwhEg1YdhKk01oAgsuHLuig==, } engines: { node: ">= 10" } cpu: [arm64] os: [linux] - "@tauri-apps/cli-linux-x64-gnu@2.0.3": + "@tauri-apps/cli-linux-x64-gnu@2.0.4": resolution: { - integrity: sha512-C6Jkx2zZGKkoi+sg5FK9GoH/0EvAaOgrZfF5azV5EALGba46g7VpWcZgp9zFUd7K2IzTi+0OOY8TQ2OVfKZgew==, + integrity: sha512-Iq1GGJb+oT1T0ZV8izrgf0cBtlzPCJaWcNueRbf1ZXquMf+FSTyQv+/Lo8rq5T6buOIJOH7cAOTuEWWqiCZteg==, } engines: { node: ">= 10" } cpu: [x64] os: [linux] - "@tauri-apps/cli-linux-x64-musl@2.0.3": + "@tauri-apps/cli-linux-x64-musl@2.0.4": resolution: { - integrity: sha512-qi4ghmTfSAl+EEUDwmwI9AJUiOLNSmU1RgiGgcPRE+7A/W+Am9UnxYySAiRbB/gJgTl9sj/pqH5Y9duP1/sqHg==, + integrity: sha512-9NTk6Pf0bSwXqCBdAA+PDYts9HeHebZzIo8mbRzRyUbER6QngG5HZb9Ka36Z1QWtJjdRy6uxSb4zb/9NuTeHfA==, } engines: { node: ">= 10" } cpu: [x64] os: [linux] - "@tauri-apps/cli-win32-arm64-msvc@2.0.3": + "@tauri-apps/cli-win32-arm64-msvc@2.0.4": resolution: { - integrity: sha512-UXxHkYmFesC97qVmZre4vY7oDxRDtC2OeKNv0bH+iSnuUp/ROxzJYGyaelnv9Ybvgl4YVqDCnxgB28qMM938TA==, + integrity: sha512-OF2e9oxiBFR8A8wVMOhUx9QGN/I1ZkquWC7gVQBnA56nx9PabJlDT08QBy5UD8USqZFVznnfNr2ehlheQahb3g==, } engines: { node: ">= 10" } cpu: [arm64] os: [win32] - "@tauri-apps/cli-win32-ia32-msvc@2.0.3": + "@tauri-apps/cli-win32-ia32-msvc@2.0.4": resolution: { - integrity: sha512-D+xoaa35RGlkXDpnL5uDTpj29untuC5Wp6bN9snfgFDagD0wnFfC8+2ZQGu16bD0IteWqDI0OSoIXhNvy+F+wg==, + integrity: sha512-T+hCKB3rFP6q0saHHtR02hm6wr1ZPJ0Mkii3oRTxjPG6BBXoVzHNCYzvdgEGJPTA2sFuAQtJH764NRtNlDMifw==, } engines: { node: ">= 10" } cpu: [ia32] os: [win32] - "@tauri-apps/cli-win32-x64-msvc@2.0.3": + "@tauri-apps/cli-win32-x64-msvc@2.0.4": resolution: { - integrity: sha512-eWV9XWb4dSYHXl13OtYWLjX1JHphUEkHkkGwJrhr8qFBm7RbxXxQvrsUEprSi51ug/dwJenjJgM4zR8By4htfw==, + integrity: sha512-GVaiI3KWRFLomjJmApHqihhYlkJ+7FqhumhVfBO6Z2tWzZjQyVQgTdNp0kYEuW2WoAYEj0dKY6qd4YM33xYcUA==, } engines: { node: ">= 10" } cpu: [x64] os: [win32] - "@tauri-apps/cli@2.0.3": + "@tauri-apps/cli@2.0.4": resolution: { - integrity: sha512-JwEyhc5BAVpn4E8kxzY/h7+bVOiXQdudR1r3ODMfyyumZBfgIWqpD/WuTcPq6Yjchju1BSS+80jAE/oYwI/RKg==, + integrity: sha512-Hl9eFXz+O366+6su9PfaSzu2EJdFe1p8K8ghkWmi40dz8VmSE7vsMTaOStD0I71ckSOkh2ICDX7FQTBgjlpjWw==, } engines: { node: ">= 10" } hasBin: true @@ -6296,48 +6296,48 @@ snapshots: "@tauri-apps/api@2.0.0-rc.4": {} - "@tauri-apps/cli-darwin-arm64@2.0.3": + "@tauri-apps/cli-darwin-arm64@2.0.4": optional: true - "@tauri-apps/cli-darwin-x64@2.0.3": + "@tauri-apps/cli-darwin-x64@2.0.4": optional: true - "@tauri-apps/cli-linux-arm-gnueabihf@2.0.3": + "@tauri-apps/cli-linux-arm-gnueabihf@2.0.4": optional: true - "@tauri-apps/cli-linux-arm64-gnu@2.0.3": + "@tauri-apps/cli-linux-arm64-gnu@2.0.4": optional: true - "@tauri-apps/cli-linux-arm64-musl@2.0.3": + "@tauri-apps/cli-linux-arm64-musl@2.0.4": optional: true - "@tauri-apps/cli-linux-x64-gnu@2.0.3": + "@tauri-apps/cli-linux-x64-gnu@2.0.4": optional: true - "@tauri-apps/cli-linux-x64-musl@2.0.3": + "@tauri-apps/cli-linux-x64-musl@2.0.4": optional: true - "@tauri-apps/cli-win32-arm64-msvc@2.0.3": + "@tauri-apps/cli-win32-arm64-msvc@2.0.4": optional: true - "@tauri-apps/cli-win32-ia32-msvc@2.0.3": + "@tauri-apps/cli-win32-ia32-msvc@2.0.4": optional: true - "@tauri-apps/cli-win32-x64-msvc@2.0.3": + "@tauri-apps/cli-win32-x64-msvc@2.0.4": optional: true - "@tauri-apps/cli@2.0.3": + "@tauri-apps/cli@2.0.4": optionalDependencies: - "@tauri-apps/cli-darwin-arm64": 2.0.3 - "@tauri-apps/cli-darwin-x64": 2.0.3 - "@tauri-apps/cli-linux-arm-gnueabihf": 2.0.3 - "@tauri-apps/cli-linux-arm64-gnu": 2.0.3 - "@tauri-apps/cli-linux-arm64-musl": 2.0.3 - "@tauri-apps/cli-linux-x64-gnu": 2.0.3 - "@tauri-apps/cli-linux-x64-musl": 2.0.3 - "@tauri-apps/cli-win32-arm64-msvc": 2.0.3 - "@tauri-apps/cli-win32-ia32-msvc": 2.0.3 - "@tauri-apps/cli-win32-x64-msvc": 2.0.3 + "@tauri-apps/cli-darwin-arm64": 2.0.4 + "@tauri-apps/cli-darwin-x64": 2.0.4 + "@tauri-apps/cli-linux-arm-gnueabihf": 2.0.4 + "@tauri-apps/cli-linux-arm64-gnu": 2.0.4 + "@tauri-apps/cli-linux-arm64-musl": 2.0.4 + "@tauri-apps/cli-linux-x64-gnu": 2.0.4 + "@tauri-apps/cli-linux-x64-musl": 2.0.4 + "@tauri-apps/cli-win32-arm64-msvc": 2.0.4 + "@tauri-apps/cli-win32-ia32-msvc": 2.0.4 + "@tauri-apps/cli-win32-x64-msvc": 2.0.4 "@tauri-apps/plugin-clipboard-manager@2.0.0-rc.0": dependencies: diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 39c76f2d..7346320b 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -89,9 +89,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.90" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37bf3594c4c988a53154954629820791dde498571819ae4ca50ca811e060cc95" +checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" [[package]] name = "arbitrary" @@ -134,7 +134,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -349,7 +349,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -389,7 +389,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -406,7 +406,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -725,7 +725,7 @@ checksum = "240f4126219a83519bad05c9a40bfc0303921eeb571fc2d7e44c17ffac99d3f1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", "synstructure", ] @@ -769,9 +769,9 @@ dependencies = [ [[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", @@ -817,7 +817,7 @@ checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -834,9 +834,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.7.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" dependencies = [ "serde", ] @@ -1123,7 +1123,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d" dependencies = [ "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -1338,7 +1338,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -1348,7 +1348,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -1372,7 +1372,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -1383,7 +1383,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -1473,7 +1473,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -1486,7 +1486,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -1632,7 +1632,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -1664,7 +1664,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -1746,9 +1746,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", ] @@ -1777,7 +1777,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -1996,7 +1996,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -2114,7 +2114,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -2379,7 +2379,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -2475,7 +2475,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -2987,7 +2987,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -3109,7 +3109,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -3273,7 +3273,19 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc" dependencies = [ - "jsonptr", + "jsonptr 0.4.7", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr 0.6.3", "serde", "serde_json", "thiserror", @@ -3290,6 +3302,16 @@ dependencies = [ "serde_json", ] +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "keyboard-types" version = "0.7.0" @@ -3923,7 +3945,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -3973,7 +3995,7 @@ dependencies = [ "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -4288,7 +4310,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -4473,7 +4495,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -4601,7 +4623,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -4633,29 +4655,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[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" @@ -4828,9 +4850,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.88" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -4851,7 +4873,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" dependencies = [ "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -4874,7 +4896,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -5169,9 +5191,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -5511,7 +5533,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -5613,9 +5635,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.210" +version = "1.0.213" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" dependencies = [ "serde_derive", ] @@ -5643,13 +5665,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.213" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -5660,7 +5682,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -5683,7 +5705,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -5734,7 +5756,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -6081,9 +6103,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.81" +version = "2.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198514704ca887dd5a1e408c6c6cdcba43672f9b4062e1b24aa34e74e6d7faae" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" dependencies = [ "proc-macro2", "quote", @@ -6113,7 +6135,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -6225,7 +6247,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -6253,9 +6275,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.0.5" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce2818e803ce3097987296623ed8c0d9f65ed93b4137ff9a83e168bdbf62932" +checksum = "d3889b392db6d32a105d3757230ea0220090b8f94c90d3e60b6c5eb91178ab1b" dependencies = [ "anyhow", "bytes", @@ -6306,16 +6328,16 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "935f9b3c49b22b3e2e485a57f46d61cd1ae07b1cbb2ba87387a387caf2d8c4e7" +checksum = "9f96827ccfb1aa40d55d0ded79562d18ba18566657a553f992a982d755148376" dependencies = [ "anyhow", "cargo_toml", "dirs 5.0.1", "glob", "heck 0.5.0", - "json-patch", + "json-patch 3.0.1", "schemars", "semver 1.0.23", "serde", @@ -6328,14 +6350,14 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95d7443dd4f0b597704b6a14b964ee2ed16e99928d8e6292ae9825f09fbcd30e" +checksum = "8947f16f47becd9e9cd39b74ee337fd1981574d78819be18e4384d85e5a0b82f" dependencies = [ "base64 0.22.1", "brotli", "ico", - "json-patch", + "json-patch 2.0.0", "plist", "png", "proc-macro2", @@ -6344,7 +6366,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.8", - "syn 2.0.81", + "syn 2.0.85", "tauri-utils", "thiserror", "time", @@ -6355,23 +6377,23 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d2c0963ccfc3f5194415f2cce7acc975942a8797fbabfb0aa1ed6f59326ae7f" +checksum = "8bd1c8d4a66799d3438747c3a79705cd665a95d6f24cb5f315413ff7a981fe2a" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", "tauri-codegen", "tauri-utils", ] [[package]] name = "tauri-plugin" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e6660a409963e4d57b9bfab4addd141eeff41bd3a7fb14e13004a832cf7ef6" +checksum = "6fa4e6c94cb1d635f65a770c69e23de1bc054b0e4c554fa037a7cc7676333d39" dependencies = [ "anyhow", "glob", @@ -6449,9 +6471,9 @@ dependencies = [ [[package]] name = "tauri-plugin-dialog" -version = "2.0.2" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff33d09331cc22bf4771a2633b62afc1038e36273eef22bff12f53d33decd91" +checksum = "4307310e1d2c09ab110235834722e7c2b85099b683e1eb7342ab351b0be5ada3" dependencies = [ "log", "raw-window-handle 0.6.2", @@ -6467,9 +6489,9 @@ dependencies = [ [[package]] name = "tauri-plugin-fs" -version = "2.0.2" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d0816b27207c29aaff632c73b702785140cf16fe6150c201a2720245b8ea88" +checksum = "96ba7d46e86db8c830d143ef90ab5a453328365b0cc834c24edea4267b16aba0" dependencies = [ "anyhow", "dunce", @@ -6583,9 +6605,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8f437293d6f5e5dce829250f4dbdce4e0b52905e297a6689cc2963eb53ac728" +checksum = "a1ef7363e7229ac8d04e8a5d405670dbd43dde8fc4bc3bc56105c35452d03784" dependencies = [ "dpi", "gtk", @@ -6602,9 +6624,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1431602bcc71f2f840ad623915c9842ecc32999b867c4a787d975a17a9625cc6" +checksum = "62fa2068e8498ad007b54d5773d03d57c3ff6dd96f8c8ce58beff44d0d5e0d30" dependencies = [ "gtk", "http 1.1.0", @@ -6629,9 +6651,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c38b0230d6880cf6dd07b6d7dd7789a0869f98ac12146e0d18d1c1049215a045" +checksum = "1fc65d6f5c54e56b66258948a6d9e47a82ea41f4b5a7612bfbdd1634c2913ed0" dependencies = [ "brotli", "cargo_metadata", @@ -6640,7 +6662,7 @@ dependencies = [ "glob", "html5ever", "infer", - "json-patch", + "json-patch 2.0.0", "kuchikiki", "log", "memchr", @@ -6776,22 +6798,22 @@ checksum = "a38c90d48152c236a3ab59271da4f4ae63d678c5d7ad6b7714d7cb9760be5e4b" [[package]] name = "thiserror" -version = "1.0.64" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.64" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -6895,9 +6917,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" dependencies = [ "backtrace", "bytes", @@ -6930,7 +6952,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -7179,7 +7201,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -7626,7 +7648,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", "wasm-bindgen-shared", ] @@ -7660,7 +7682,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7673,9 +7695,9 @@ checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wasm-streams" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -7700,9 +7722,9 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3f45d1222915ef1fd2057220c1d9d9624b7654443ea35c3877f7a52bd0a5a2d" +checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" dependencies = [ "bitflags 2.6.0", "rustix 0.38.37", @@ -7712,9 +7734,9 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.32.4" +version = "0.32.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5755d77ae9040bb872a25026555ce4cb0ae75fd923e90d25fba07d81057de0" +checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e" dependencies = [ "bitflags 2.6.0", "wayland-backend", @@ -7829,7 +7851,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -8002,7 +8024,7 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -8013,7 +8035,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -8024,7 +8046,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -8035,7 +8057,7 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -8046,7 +8068,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -8057,7 +8079,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -8384,9 +8406,9 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wry" -version = "0.46.2" +version = "0.46.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa1c8c760041c64ce6be99f83d6cb55fe3fcd85a1ad46d32895f6e65cee87ba" +checksum = "cd5cdf57c66813d97601181349c63b96994b3074fc3d7a31a8cce96e968e3bbd" dependencies = [ "base64 0.22.1", "block2", @@ -8509,7 +8531,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", "synstructure", ] @@ -8596,7 +8618,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] @@ -8616,7 +8638,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", "synstructure", ] @@ -8645,7 +8667,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.81", + "syn 2.0.85", ] [[package]] From e3c52781f34b9bb921ac590ff4d672d1f1d5ec06 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 27 Oct 2024 04:46:24 +0800 Subject: [PATCH 167/288] chore: update resource --- scripts/check.mjs | 4 ++-- scripts/{ => darwin}/set_dns.sh | 0 scripts/{ => darwin}/unset_dns.sh | 0 src-tauri/tauri.conf.json | 9 ++++++++- src-tauri/tauri.macos.conf.json | 11 ++++++++++- 5 files changed, 20 insertions(+), 4 deletions(-) rename scripts/{ => darwin}/set_dns.sh (100%) rename scripts/{ => darwin}/unset_dns.sh (100%) diff --git a/scripts/check.mjs b/scripts/check.mjs index a2e4cd70..d867c95a 100644 --- a/scripts/check.mjs +++ b/scripts/check.mjs @@ -282,12 +282,12 @@ async function resolveSidecar(binInfo) { const resolveSetDnsScript = () => resolveResource({ file: "set_dns.sh", - localPath: path.join(cwd, "scripts/set_dns.sh"), + localPath: path.join(cwd, "scripts/darwin/set_dns.sh"), }); const resolveUnSetDnsScript = () => resolveResource({ file: "unset_dns.sh", - localPath: path.join(cwd, "scripts/unset_dns.sh"), + localPath: path.join(cwd, "scripts/darwin/unset_dns.sh"), }); /** diff --git a/scripts/set_dns.sh b/scripts/darwin/set_dns.sh similarity index 100% rename from scripts/set_dns.sh rename to scripts/darwin/set_dns.sh diff --git a/scripts/unset_dns.sh b/scripts/darwin/unset_dns.sh similarity index 100% rename from scripts/unset_dns.sh rename to scripts/darwin/unset_dns.sh diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 8d8896f3..f9c64601 100755 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -10,7 +10,14 @@ "icons/icon.icns", "icons/icon.ico" ], - "resources": ["resources"], + "resources": [ + "resources/clash-verge-service", + "resources/install-service", + "resources/uninstall-service", + "resources/geoip.dat", + "resources/geosite.dat", + "resources/Country.mmdb" + ], "publisher": "Clash Verge Rev", "externalBin": ["sidecar/verge-mihomo", "sidecar/verge-mihomo-alpha"], "copyright": "GNU General Public License v3.0", diff --git a/src-tauri/tauri.macos.conf.json b/src-tauri/tauri.macos.conf.json index 1b1fd1a5..9eb2b743 100644 --- a/src-tauri/tauri.macos.conf.json +++ b/src-tauri/tauri.macos.conf.json @@ -3,7 +3,16 @@ "identifier": "io.github.clash-verge-rev.clash-verge-rev", "bundle": { "targets": ["app", "dmg"], - "resources": ["resources"], + "resources": [ + "resources/clash-verge-service", + "resources/install-service", + "resources/uninstall-service", + "resources/geoip.dat", + "resources/geosite.dat", + "resources/Country.mmdb", + "resources/set_dns.sh", + "resources/unset_dns.sh" + ], "macOS": { "frameworks": [], "minimumSystemVersion": "10.15", From 5ef922017546a776220a3e5893a8d0d2f8b5168c Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 27 Oct 2024 05:06:42 +0800 Subject: [PATCH 168/288] chore: update --- src-tauri/tauri.conf.json | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index f9c64601..8d8896f3 100755 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -10,14 +10,7 @@ "icons/icon.icns", "icons/icon.ico" ], - "resources": [ - "resources/clash-verge-service", - "resources/install-service", - "resources/uninstall-service", - "resources/geoip.dat", - "resources/geosite.dat", - "resources/Country.mmdb" - ], + "resources": ["resources"], "publisher": "Clash Verge Rev", "externalBin": ["sidecar/verge-mihomo", "sidecar/verge-mihomo-alpha"], "copyright": "GNU General Public License v3.0", From df3c296850b2693903ead5c67ddc56732a3f5118 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 27 Oct 2024 05:10:26 +0800 Subject: [PATCH 169/288] Revert "chore: update resource" This reverts commit e3c52781f34b9bb921ac590ff4d672d1f1d5ec06. --- scripts/check.mjs | 4 ++-- scripts/{darwin => }/set_dns.sh | 0 scripts/{darwin => }/unset_dns.sh | 0 src-tauri/tauri.macos.conf.json | 11 +---------- 4 files changed, 3 insertions(+), 12 deletions(-) rename scripts/{darwin => }/set_dns.sh (100%) rename scripts/{darwin => }/unset_dns.sh (100%) diff --git a/scripts/check.mjs b/scripts/check.mjs index d867c95a..a2e4cd70 100644 --- a/scripts/check.mjs +++ b/scripts/check.mjs @@ -282,12 +282,12 @@ async function resolveSidecar(binInfo) { const resolveSetDnsScript = () => resolveResource({ file: "set_dns.sh", - localPath: path.join(cwd, "scripts/darwin/set_dns.sh"), + localPath: path.join(cwd, "scripts/set_dns.sh"), }); const resolveUnSetDnsScript = () => resolveResource({ file: "unset_dns.sh", - localPath: path.join(cwd, "scripts/darwin/unset_dns.sh"), + localPath: path.join(cwd, "scripts/unset_dns.sh"), }); /** diff --git a/scripts/darwin/set_dns.sh b/scripts/set_dns.sh similarity index 100% rename from scripts/darwin/set_dns.sh rename to scripts/set_dns.sh diff --git a/scripts/darwin/unset_dns.sh b/scripts/unset_dns.sh similarity index 100% rename from scripts/darwin/unset_dns.sh rename to scripts/unset_dns.sh diff --git a/src-tauri/tauri.macos.conf.json b/src-tauri/tauri.macos.conf.json index 9eb2b743..1b1fd1a5 100644 --- a/src-tauri/tauri.macos.conf.json +++ b/src-tauri/tauri.macos.conf.json @@ -3,16 +3,7 @@ "identifier": "io.github.clash-verge-rev.clash-verge-rev", "bundle": { "targets": ["app", "dmg"], - "resources": [ - "resources/clash-verge-service", - "resources/install-service", - "resources/uninstall-service", - "resources/geoip.dat", - "resources/geosite.dat", - "resources/Country.mmdb", - "resources/set_dns.sh", - "resources/unset_dns.sh" - ], + "resources": ["resources"], "macOS": { "frameworks": [], "minimumSystemVersion": "10.15", From 4ce7d9f7a92b8531ce8326e3fe6c3c64bf0b8e86 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 27 Oct 2024 06:32:25 +0800 Subject: [PATCH 170/288] feat: macos service installation query, can't avoid it, add service run check, if installation not confirmed, exit automatically after 10 seconds --- src-tauri/src/utils/resolve.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 055905b1..68f7b857 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -57,7 +57,25 @@ pub async fn resolve_setup(app: &mut App) { 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..20 { + 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:?}"); From db11651f85c4baa047063f39283a485606fe1ab0 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 27 Oct 2024 06:47:16 +0800 Subject: [PATCH 171/288] chore: update --- src-tauri/src/utils/resolve.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 68f7b857..c86db794 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -62,7 +62,7 @@ pub async fn resolve_setup(app: &mut App) { #[cfg(target_os = "macos")] { let mut service_runing = false; - for _ in 0..20 { + for _ in 0..40 { if service::check_service().await.is_ok() { service_runing = true; break; From 526c5bdd91e67a1c036cc2da098dbf895164bc67 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 27 Oct 2024 10:19:42 +0800 Subject: [PATCH 172/288] fix: unused variable --- src-tauri/src/core/tray.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 4d1e5d71..9c92ca64 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -97,6 +97,7 @@ impl Tray { *tun_mode, )?)); + #[cfg(target_os = "macos")] let mut use_custom_icon = false; #[allow(unused)] let mut indication_icon = if *system_proxy { @@ -120,7 +121,10 @@ impl Tray { } else if png_path.exists() { icon = std::fs::read(png_path).unwrap(); } - use_custom_icon = true; + #[cfg(target_os = "macos")] + { + use_custom_icon = true; + } } icon } else if *tun_mode { @@ -144,7 +148,10 @@ impl Tray { } else if png_path.exists() { icon = std::fs::read(png_path).unwrap(); } - use_custom_icon = true; + #[cfg(target_os = "macos")] + { + use_custom_icon = true; + } } icon } else { @@ -168,7 +175,10 @@ impl Tray { } else if png_path.exists() { icon = std::fs::read(png_path).unwrap(); } - use_custom_icon = true; + #[cfg(target_os = "macos")] + { + use_custom_icon = true; + } } icon }; From 486ffbdc08ab654a8180b1d32b3fca6dfb181881 Mon Sep 17 00:00:00 2001 From: "Christine." <105919355+Tychristine@users.noreply.github.com> Date: Sun, 27 Oct 2024 13:00:47 +0800 Subject: [PATCH 173/288] add more contribution details for Windows (#1939) * doc: add more building details Some friends said the build failed. * chore: replace test url replace default delay check URL, some user say that the delay numbers seen in CVR are very different from those in other software, and this default test result is not a valid reference. --- CONTRIBUTING.md | 29 ++++++++++++++++----- src/components/setting/mods/misc-viewer.tsx | 2 +- 2 files changed, 23 insertions(+), 8 deletions(-) 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/src/components/setting/mods/misc-viewer.tsx b/src/components/setting/mods/misc-viewer.tsx index dace4355..fef0511c 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="https://www.gstatic.com/generate_204" onChange={(e) => setValues((v) => ({ ...v, defaultLatencyTest: e.target.value })) } From a127cd6444a022168c825753f91c5f7e31490da3 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 28 Oct 2024 00:24:57 +0800 Subject: [PATCH 174/288] fix: dns not restored when exiting the app --- src-tauri/src/cmds.rs | 2 +- src-tauri/src/enhance/tun.rs | 77 +--------------------------------- src-tauri/src/feat.rs | 5 +++ src-tauri/src/utils/resolve.rs | 73 ++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 76 deletions(-) diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index a2c7cb8a..8bd24378 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -371,7 +371,7 @@ pub fn open_devtools(app_handle: tauri::AppHandle) { } #[tauri::command] -pub fn exit_app() { +pub async fn exit_app() { feat::quit(Some(0)); } diff --git a/src-tauri/src/enhance/tun.rs b/src-tauri/src/enhance/tun.rs index 87c78efa..3714d8c2 100644 --- a/src-tauri/src/enhance/tun.rs +++ b/src-tauri/src/enhance/tun.rs @@ -36,11 +36,11 @@ pub async fn use_tun(mut config: Mapping, enable: bool) -> Mapping { revise!(dns_val, "enhanced-mode", "fake-ip"); revise!(dns_val, "fake-ip-range", "10.96.0.0/16"); #[cfg(target_os = "macos")] - set_public_dns("10.96.0.2".to_string()).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")] - restore_public_dns().await; + crate::utils::resolve::restore_public_dns().await; } revise!(tun_val, "enable", enable); @@ -48,76 +48,3 @@ pub async fn use_tun(mut config: Mapping, enable: bool) -> Mapping { revise!(config, "dns", dns_val); config } - -#[cfg(target_os = "macos")] -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")] -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/feat.rs b/src-tauri/src/feat.rs index 32023ee7..0e0d5cfd 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -101,6 +101,11 @@ pub fn toggle_tun_mode() { pub fn quit(code: Option) { let app_handle = handle::Handle::global().app_handle().unwrap(); resolve::resolve_reset(); + #[cfg(target_os = "macos")] + tauri::async_runtime::block_on(async { + resolve::restore_public_dns().await; + }); + app_handle.exit(code.unwrap_or(0)); } diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index c86db794..7c37819f 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -344,3 +344,76 @@ fn resolve_random_port_config() -> Result<()> { 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}"); + } + } +} From 014829e69a7bc753a0581c9f791cd018281eb213 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 28 Oct 2024 13:09:55 +0800 Subject: [PATCH 175/288] chore: optimised the logic of dns processing --- scripts/set_dns.sh | 11 +++++------ scripts/unset_dns.sh | 6 ++---- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/scripts/set_dns.sh b/scripts/set_dns.sh index 011adf75..18a98fee 100644 --- a/scripts/set_dns.sh +++ b/scripts/set_dns.sh @@ -49,10 +49,9 @@ hardware_port=$(networksetup -listallhardwareports | awk -v dev="$nic" ' original_dns=$(networksetup -getdnsservers "$hardware_port") -if [ ${#original_dns} -gt 15 ]; then - echo "Empty" >original_dns.txt -else - echo $original_dns >original_dns.txt +if [ ${#original_dns} -le 15 ]; then + if [ -n "$original_dns" ]; then + echo $original_dns >original_dns.txt + networksetup -setdnsservers "$hardware_port" "$1" + fi fi - -networksetup -setdnsservers "$hardware_port" "$1" diff --git a/scripts/unset_dns.sh b/scripts/unset_dns.sh index 9d98aff1..76d7f7e8 100644 --- a/scripts/unset_dns.sh +++ b/scripts/unset_dns.sh @@ -15,8 +15,6 @@ hardware_port=$(networksetup -listallhardwareports | awk -v dev="$nic" ' if [ -f original_dns.txt ]; then original_dns=$(cat original_dns.txt) -else - original_dns=$(networksetup -getdnsservers "$hardware_port") + networksetup -setdnsservers "$hardware_port" $original_dns + rm -rf original_dns.txt fi - -networksetup -setdnsservers "$hardware_port" $original_dns From 9d476d7adddd7fc38fe28fee153acbbb7e50ff08 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 29 Oct 2024 09:07:08 +0800 Subject: [PATCH 176/288] fix incorrect usage of useCustomTheme --- src/components/base/base-page.tsx | 4 ++-- src/components/layout/use-custom-theme.ts | 1 + src/pages/connections.tsx | 5 +++-- src/pages/logs.tsx | 4 ++-- src/pages/rules.tsx | 4 ++-- 5 files changed, 10 insertions(+), 8 deletions(-) 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/layout/use-custom-theme.ts b/src/components/layout/use-custom-theme.ts index 4d2ca52b..adb313a1 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(); /** diff --git a/src/pages/connections.tsx b/src/pages/connections.tsx index 3f28a216..474fee69 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"); diff --git a/src/pages/logs.tsx b/src/pages/logs.tsx index 6fb6b956..6c59924c 100644 --- a/src/pages/logs.tsx +++ b/src/pages/logs.tsx @@ -10,7 +10,7 @@ import { useLogData } 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"; @@ -19,7 +19,7 @@ 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 [match, setMatch] = useState(() => (_: string) => true); diff --git a/src/pages/rules.tsx b/src/pages/rules.tsx index 130901bc..eb4f26ba 100644 --- a/src/pages/rules.tsx +++ b/src/pages/rules.tsx @@ -7,13 +7,13 @@ 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"; 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); From 2bb3498602ef0f589713479ea7b5750ab339b3d6 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 29 Oct 2024 09:19:21 +0800 Subject: [PATCH 177/288] chore: disable websocket logging by default to reduce performance consumption. --- src/services/states.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/states.ts b/src/services/states.ts index 4ea46298..7f4c3ba0 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"; From 202fb19ab1056c28e43721dcce2af1990d81fbea Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 29 Oct 2024 10:13:53 +0800 Subject: [PATCH 178/288] chore: update --- src/pages/logs.tsx | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/pages/logs.tsx b/src/pages/logs.tsx index 6c59924c..71447cef 100644 --- a/src/pages/logs.tsx +++ b/src/pages/logs.tsx @@ -52,15 +52,19 @@ const LogPage = () => { )} - + {enableLog === true && ( + + )} } > @@ -94,7 +98,7 @@ const LogPage = () => { bgcolor: isDark ? "#282a36" : "#ffffff", }} > - {filterLogs.length > 0 ? ( + {filterLogs.length > 0 && enableLog === true ? ( Date: Tue, 29 Oct 2024 10:15:07 +0800 Subject: [PATCH 179/288] chore: update --- src/hooks/use-log-data.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/hooks/use-log-data.ts b/src/hooks/use-log-data.ts index 4debdcc0..98cfb5b6 100644 --- a/src/hooks/use-log-data.ts +++ b/src/hooks/use-log-data.ts @@ -11,7 +11,6 @@ export const useLogData = () => { const { clashInfo } = useClashInfo(); const [enableLog] = useEnableLog(); - !enableLog || !clashInfo; return useSWRSubscription( enableLog && clashInfo ? "getClashLog" : null, From d10323701a92169d84944c5525ea2f80c8322ce0 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 30 Oct 2024 06:27:29 +0800 Subject: [PATCH 180/288] fix: performance issues caused by closing windows on mac --- src-tauri/src/core/handle.rs | 9 ++++++--- src-tauri/src/lib.rs | 5 ++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src-tauri/src/core/handle.rs b/src-tauri/src/core/handle.rs index 19eed0ee..0b487007 100644 --- a/src-tauri/src/core/handle.rs +++ b/src-tauri/src/core/handle.rs @@ -30,9 +30,12 @@ impl Handle { } pub fn get_window(&self) -> Option { - self.app_handle() - .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() { diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index f972c67a..efa8d1bc 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -141,8 +141,11 @@ pub fn run() { tauri::RunEvent::WindowEvent { label, event, .. } => { if label == "main" { match event { - tauri::WindowEvent::CloseRequested { .. } => { + tauri::WindowEvent::CloseRequested { api, .. } => { println!("closing window..."); + api.prevent_close(); + let window = core::handle::Handle::global().get_window().unwrap(); + log_err!(window.minimize()); let _ = resolve::save_window_size_position(true); } tauri::WindowEvent::Moved(_) | tauri::WindowEvent::Resized(_) => { From f0c43602105464c8a9ec38c02e0578d0620aec21 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 30 Oct 2024 06:30:49 +0800 Subject: [PATCH 181/288] chore: restore linux custom close button --- src/components/layout/layout-control.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/layout/layout-control.tsx b/src/components/layout/layout-control.tsx index bd12afd5..eda6a8c3 100644 --- a/src/components/layout/layout-control.tsx +++ b/src/components/layout/layout-control.tsx @@ -95,7 +95,7 @@ export const LayoutControl = () => { svg: { transform: "scale(1.05)" }, ":hover": { bgcolor: "#ff000090" }, }} - onClick={() => appWindow.hide()} + onClick={() => appWindow.close()} > From 7550c2321c9ea0b0441484fab51658457c12d0f6 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 30 Oct 2024 09:08:44 +0800 Subject: [PATCH 182/288] fix: linux file permissions problem check-config configuration file moved from temp_dir to home_dir, resolved --- src-tauri/src/config/config.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/src/config/config.rs b/src-tauri/src/config/config.rs index bc074b2c..d2f37058 100644 --- a/src-tauri/src/config/config.rs +++ b/src-tauri/src/config/config.rs @@ -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(); From dce72a16f0c08d0cae1be25ccb2cd3a392f578b1 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 30 Oct 2024 10:06:54 +0800 Subject: [PATCH 183/288] chore: remove useless hooks the window is not closed, it is minimized, so the position still exists --- src-tauri/src/config/config.rs | 2 +- src-tauri/src/lib.rs | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src-tauri/src/config/config.rs b/src-tauri/src/config/config.rs index d2f37058..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"; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index efa8d1bc..136692e7 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -143,13 +143,10 @@ pub fn run() { match event { tauri::WindowEvent::CloseRequested { api, .. } => { println!("closing window..."); + let _ = resolve::save_window_size_position(true); api.prevent_close(); let window = core::handle::Handle::global().get_window().unwrap(); log_err!(window.minimize()); - let _ = resolve::save_window_size_position(true); - } - tauri::WindowEvent::Moved(_) | tauri::WindowEvent::Resized(_) => { - let _ = resolve::save_window_size_position(false); } tauri::WindowEvent::Focused(true) => { #[cfg(target_os = "macos")] From 17fc9cf0eb7681ce7dc4afa4d8292c6d80751a03 Mon Sep 17 00:00:00 2001 From: wonfen Date: Wed, 30 Oct 2024 13:08:37 +0800 Subject: [PATCH 184/288] release: rc.5 --- UPDATELOG.md | 4 ++++ package.json | 2 +- src-tauri/tauri.conf.json | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/UPDATELOG.md b/UPDATELOG.md index 7b6598bd..2b48cae4 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -3,6 +3,7 @@ ### Notice - 由于更改了服务安装逻辑,Mac/Linux 首次安装需要输入 2 遍系统密码卸载和安装服务,以后可以丝滑使用 tun(虚拟网卡)模式 +- 因 Tauri 2.0 底层 bug,关闭窗口暂时修改为最小化功能 ### Breaking changes @@ -32,6 +33,8 @@ - 重构和优化 app_handle - 重构系统代理绕过逻辑 - 移除无用的 PID 创建逻辑 +- 优化系统 DNS 设置逻辑 +- 后端实现窗口控制 ### Bugs Fixes @@ -42,6 +45,7 @@ - 修复 MacOS 下 tray 菜单重启 app 失效的问题 - 修复某些特定配置文件载入失败的问题 - 修复 MacOS 下 tun 模式 fakeip 不生效的问题 +- 修复 Linux 下 关闭 tun 模式文件报错的问题 --- diff --git a/package.json b/package.json index f90cb4a5..f77c2bf7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "clash-verge", - "version": "2.0.0-rc.4", + "version": "2.0.0-rc.5", "license": "GPL-3.0-only", "scripts": { "dev": "cross-env RUST_BACKTRACE=1 tauri dev", diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 8d8896f3..57907c81 100755 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -25,7 +25,7 @@ "devUrl": "http://localhost:3000/" }, "productName": "Clash Verge", - "version": "2.0.0-rc.4", + "version": "2.0.0-rc.5", "identifier": "io.github.clash-verge-rev.clash-verge-rev", "plugins": { "updater": { From 4213a5fad1f9cd12767713255272566fdcd5db8a Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 30 Oct 2024 13:51:58 +0800 Subject: [PATCH 185/288] chore: window hide replaces window minimize --- src-tauri/src/lib.rs | 2 +- src-tauri/src/utils/resolve.rs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 136692e7..ff79b7a8 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -146,7 +146,7 @@ pub fn run() { let _ = resolve::save_window_size_position(true); api.prevent_close(); let window = core::handle::Handle::global().get_window().unwrap(); - log_err!(window.minimize()); + log_err!(window.hide()); } tauri::WindowEvent::Focused(true) => { #[cfg(target_os = "macos")] diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 7c37819f..90b64bb9 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -121,7 +121,6 @@ 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.unminimize(), "set win unminimize"); trace_err!(window.show(), "set win visible"); trace_err!(window.set_focus(), "set win focus"); return; From c5916cf5ec1e64b7a92947c7aafc668f3f525d57 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 30 Oct 2024 16:37:47 +0800 Subject: [PATCH 186/288] feat: use tauri-plugin-persisted-scope --- src-tauri/Cargo.lock | 26 +++++++++ src-tauri/Cargo.toml | 1 + src-tauri/src/config/verge.rs | 10 ---- src-tauri/src/lib.rs | 2 +- src-tauri/src/utils/resolve.rs | 103 ++++----------------------------- 5 files changed, 39 insertions(+), 103 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 7346320b..86a85217 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -556,6 +556,15 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bit_field" version = "0.10.2" @@ -1010,6 +1019,7 @@ dependencies = [ "tauri-plugin-fs", "tauri-plugin-global-shortcut", "tauri-plugin-notification", + "tauri-plugin-persisted-scope", "tauri-plugin-process", "tauri-plugin-shell", "tauri-plugin-updater", @@ -6542,6 +6552,22 @@ dependencies = [ "url", ] +[[package]] +name = "tauri-plugin-persisted-scope" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae4f33cca1496783c6115c14c9b282f928683920babeeae5c52df8ca3628001b" +dependencies = [ + "aho-corasick", + "bincode", + "log", + "serde", + "serde_json", + "tauri", + "tauri-plugin-fs", + "thiserror", +] + [[package]] name = "tauri-plugin-process" version = "2.0.1" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 00b6da98..2733a85f 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -54,6 +54,7 @@ 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" +tauri-plugin-persisted-scope = "2.0.3" [target.'cfg(windows)'.dependencies] runas = "=1.2.0" deelevate = "0.2.0" diff --git a/src-tauri/src/config/verge.rs b/src-tauri/src/config/verge.rs index 3f988831..b440e299 100644 --- a/src-tauri/src/config/verge.rs +++ b/src-tauri/src/config/verge.rs @@ -122,14 +122,6 @@ pub struct IVerge { /// 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, @@ -312,8 +304,6 @@ impl IVerge { patch!(proxy_layout_column); patch!(test_list); patch!(auto_log_clean); - patch!(window_size_position); - patch!(window_is_maximized); } /// 在初始化前尝试拿到单例端口的值 diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index ff79b7a8..285fe7dc 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -41,6 +41,7 @@ pub fn run() { .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_deep_link::init()) + .plugin(tauri_plugin_persisted_scope::init()) .setup(|app| { #[cfg(target_os = "linux")] { @@ -143,7 +144,6 @@ pub fn run() { match event { tauri::WindowEvent::CloseRequested { api, .. } => { println!("closing window..."); - let _ = resolve::save_window_size_position(true); api.prevent_close(); let window = core::handle::Handle::global().get_window().unwrap(); log_err!(window.hide()); diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 90b64bb9..e1e20de9 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -126,7 +126,7 @@ pub fn create_window() { return; } - let mut builder = tauri::WebviewWindowBuilder::new( + let builder = tauri::WebviewWindowBuilder::new( &app_handle, "main".to_string(), tauri::WebviewUrl::App("index.html".into()), @@ -136,110 +136,29 @@ pub fn create_window() { .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) .additional_browser_args("--enable-features=msWebView2EnableDraggableRegions --disable-features=OverscrollHistoryNavigation,msExperimentalScrolling") .transparent(true) + .inner_size(800.0, 636.0) .visible(false) .build(); + #[cfg(target_os = "macos")] - let window = builder + let _ = builder .decorations(true) .hidden_title(true) .title_bar_style(tauri::TitleBarStyle::Overlay) + .inner_size(800.0, 642.0) .build(); + #[cfg(target_os = "linux")] - let window = builder.decorations(false).transparent(true).build(); - - match window { - Ok(win) => { - let is_maximized = Config::verge() - .latest() - .window_is_maximized - .unwrap_or(false); - log::trace!(target:"app", "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"); - } - } - Err(_) => { - log::error!("failed to create window"); - } - } -} - -/// save window size and position -pub fn save_window_size_position(save_to_file: bool) -> Result<()> { - let app_handle = handle::Handle::global().app_handle().unwrap(); - 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(()) + let _ = builder + .decorations(false) + .transparent(true) + .inner_size(800.0, 642.0) + .build(); } pub async fn resolve_scheme(param: String) -> Result<()> { From 00bc6a6301f7f5bae28ce73cd761dab465035364 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 30 Oct 2024 18:28:55 +0800 Subject: [PATCH 187/288] revert: feat: use tauri-plugin-persisted-scope --- src-tauri/Cargo.lock | 26 -------------------------- src-tauri/Cargo.toml | 1 - src-tauri/src/lib.rs | 1 - 3 files changed, 28 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 86a85217..7346320b 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -556,15 +556,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - [[package]] name = "bit_field" version = "0.10.2" @@ -1019,7 +1010,6 @@ dependencies = [ "tauri-plugin-fs", "tauri-plugin-global-shortcut", "tauri-plugin-notification", - "tauri-plugin-persisted-scope", "tauri-plugin-process", "tauri-plugin-shell", "tauri-plugin-updater", @@ -6552,22 +6542,6 @@ dependencies = [ "url", ] -[[package]] -name = "tauri-plugin-persisted-scope" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae4f33cca1496783c6115c14c9b282f928683920babeeae5c52df8ca3628001b" -dependencies = [ - "aho-corasick", - "bincode", - "log", - "serde", - "serde_json", - "tauri", - "tauri-plugin-fs", - "thiserror", -] - [[package]] name = "tauri-plugin-process" version = "2.0.1" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 2733a85f..00b6da98 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -54,7 +54,6 @@ 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" -tauri-plugin-persisted-scope = "2.0.3" [target.'cfg(windows)'.dependencies] runas = "=1.2.0" deelevate = "0.2.0" diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 285fe7dc..e812bdf1 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -41,7 +41,6 @@ pub fn run() { .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_deep_link::init()) - .plugin(tauri_plugin_persisted_scope::init()) .setup(|app| { #[cfg(target_os = "linux")] { From 08bf70681c79aeef8a39a130950d3906cdb47bff Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 30 Oct 2024 18:52:53 +0800 Subject: [PATCH 188/288] feat: use tauri_plugin_window_state --- src-tauri/Cargo.lock | 16 ++++++++++++++++ src-tauri/Cargo.toml | 1 + src-tauri/capabilities/desktop.json | 4 +++- src-tauri/src/lib.rs | 5 +++++ src-tauri/src/utils/resolve.rs | 15 ++++++++++----- 5 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 7346320b..05d461a2 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1013,6 +1013,7 @@ dependencies = [ "tauri-plugin-process", "tauri-plugin-shell", "tauri-plugin-updater", + "tauri-plugin-window-state", "tokio", "url", "users", @@ -6603,6 +6604,21 @@ dependencies = [ "zip", ] +[[package]] +name = "tauri-plugin-window-state" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd1cef203a15b4772898e7bc8e57c1f34696e39848987dfcd294d51ba0525650" +dependencies = [ + "bitflags 2.6.0", + "log", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror", +] + [[package]] name = "tauri-runtime" version = "2.1.1" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 00b6da98..a2357865 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -67,6 +67,7 @@ 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-window-state = "2.0.0-rc" #openssl [features] diff --git a/src-tauri/capabilities/desktop.json b/src-tauri/capabilities/desktop.json index fbb332b0..f50c5730 100755 --- a/src-tauri/capabilities/desktop.json +++ b/src-tauri/capabilities/desktop.json @@ -6,6 +6,8 @@ "permissions": [ "global-shortcut:default", "updater:default", - "deep-link:default" + "deep-link:default", + "window-state:default", + "window-state:default" ] } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index e812bdf1..2c170830 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -9,6 +9,7 @@ use crate::core::hotkey; use crate::utils::{resolve, resolve::resolve_scheme, server}; #[cfg(target_os = "macos")] use tauri::Listener; +use tauri_plugin_window_state::{AppHandleExt, StateFlags}; pub fn run() { // 单例检测 @@ -32,6 +33,7 @@ pub fn run() { #[allow(unused_mut)] let mut builder = tauri::Builder::default() + .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()) @@ -41,6 +43,7 @@ pub fn run() { .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")] { @@ -144,6 +147,8 @@ pub fn run() { tauri::WindowEvent::CloseRequested { api, .. } => { println!("closing window..."); api.prevent_close(); + let app_hanele = core::handle::Handle::global().app_handle().unwrap(); + let _ = app_hanele.save_window_state(StateFlags::default()); let window = core::handle::Handle::global().get_window().unwrap(); log_err!(window.hide()); } diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index e1e20de9..2c69a567 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -8,6 +8,7 @@ use percent_encoding::percent_decode_str; use serde_yaml::Mapping; use std::net::TcpListener; use tauri::{App, Manager}; +use tauri_plugin_window_state::{StateFlags, WindowExt}; use url::Url; //#[cfg(not(target_os = "linux"))] @@ -143,22 +144,26 @@ pub fn create_window() { .transparent(true) .inner_size(800.0, 636.0) .visible(false) - .build(); + .build().unwrap(); #[cfg(target_os = "macos")] - let _ = builder + let window = builder .decorations(true) .hidden_title(true) .title_bar_style(tauri::TitleBarStyle::Overlay) .inner_size(800.0, 642.0) - .build(); + .build() + .unwrap(); #[cfg(target_os = "linux")] - let _ = builder + let window = builder .decorations(false) .transparent(true) .inner_size(800.0, 642.0) - .build(); + .build() + .unwrap(); + + let _ = window.restore_state(StateFlags::all()); } pub async fn resolve_scheme(param: String) -> Result<()> { From fc03ce1247eafb88f7e94eabfd71fc361859b672 Mon Sep 17 00:00:00 2001 From: downer <17774400+downerxl@users.noreply.github.com> Date: Thu, 31 Oct 2024 09:07:21 +0800 Subject: [PATCH 189/288] fix: fix TUN icon is overwritten by system proxy icon (#1961) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 周晓亮 --- src-tauri/src/core/tray.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 9c92ca64..834cdb2a 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -100,7 +100,7 @@ impl Tray { #[cfg(target_os = "macos")] let mut use_custom_icon = false; #[allow(unused)] - let mut indication_icon = if *system_proxy { + let mut indication_icon = if *system_proxy && !*tun_mode { #[cfg(target_os = "macos")] let mut icon = match tray_icon.as_str() { "colorful" => { From 953153ea1a375f0c202a7ceee86bd4c87f35ff4e Mon Sep 17 00:00:00 2001 From: The1111mp <31227919+1111mp@users.noreply.github.com> Date: Thu, 31 Oct 2024 17:20:16 +0800 Subject: [PATCH 190/288] chore: added support for compiling linux arm architecture (#1945) * chore: added support for compiling linux arm architecture Signed-off-by: The1111mp * chore: remove debug code Signed-off-by: The1111mp --------- Signed-off-by: The1111mp --- .cargo/config.toml | 5 ++ .github/build-for-linux/Dockerfile | 4 - .github/build-for-linux/action.yml | 14 ---- .github/build-for-linux/build.sh | 5 -- .github/build-for-linux/entrypoint.sh | 17 ---- .github/workflows/alpha.yml | 107 +++++++++++++++++++++++-- .github/workflows/release.yml | 111 +++++++++++++++++++++++--- 7 files changed, 204 insertions(+), 59 deletions(-) create mode 100644 .cargo/config.toml delete mode 100644 .github/build-for-linux/Dockerfile delete mode 100644 .github/build-for-linux/action.yml delete mode 100644 .github/build-for-linux/build.sh delete mode 100644 .github/build-for-linux/entrypoint.sh 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 9fd37061..8d532755 100644 --- a/.github/workflows/alpha.yml +++ b/.github/workflows/alpha.yml @@ -28,6 +28,8 @@ jobs: 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: @@ -46,6 +48,12 @@ jobs: workspaces: src-tauri 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 @@ -90,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" + 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: | @@ -214,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 @@ -241,6 +330,8 @@ jobs: ### Linux - Linux 64位: amd64.deb/amd64.rpm + - Linux arm64 architecture: arm64.deb/aarch64.rpm + - Linux armv7架构: armhf.deb/armhfp.rpm ### Windows (Win7 用户请查看下面FAQ中的解决方案) #### 正常版本(推荐) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d753d6aa..0a0c959d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,6 +21,8 @@ jobs: 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: @@ -39,6 +41,12 @@ 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: @@ -80,26 +88,107 @@ 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-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: Build for Linux - uses: ./.github/build-for-linux - env: - NODE_OPTIONS: "--max_old_space_size=4096" - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + - 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: - target: ${{ matrix.target }} + 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 + 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 }} - name: Get Version run: | @@ -201,7 +290,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 From d8d0a5937159ae03ae522243745ff33b2ce2ea5d Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 1 Nov 2024 06:03:01 +0800 Subject: [PATCH 191/288] chore: update --- packages/windows/nsis_hooks.sh | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/packages/windows/nsis_hooks.sh b/packages/windows/nsis_hooks.sh index 2cd2df9a..65f76a7c 100644 --- a/packages/windows/nsis_hooks.sh +++ b/packages/windows/nsis_hooks.sh @@ -1,5 +1,38 @@ +!define ORIGINAL_PROVIDER_FILE "$TEMP\clash_verge_original_congestion_provider.txt" + +!define NSIS_HOOK_POSTINSTALL "NSIS_HOOK_POSTINSTALL_" + +!macro NSIS_HOOK_POSTINSTALL_ +ExecWait 'netsh int tcp show global | findstr /R "^ *CongestionProvider" > "${ORIGINAL_PROVIDER_FILE}"' + +FileOpen $0 "${ORIGINAL_PROVIDER_FILE}" r +FileRead $0 $1 +FileClose $0 + +StrCpy $1 $1 "" 20 +StrCmp $1 "bbr2" 0 +5 +ExecWait 'netsh int tcp set supplemental template=internet congestionprovider=CUBIC' +ExecWait 'netsh int tcp set supplemental template=internetcustom congestionprovider=CUBIC' +ExecWait 'netsh int tcp set supplemental template=Compat congestionprovider=NewReno' +ExecWait 'netsh int tcp set supplemental template=Datacenter congestionprovider=CUBIC' +ExecWait 'netsh int tcp set supplemental template=Datacentercustom congestionprovider=CUBIC' +!macroend + !define NSIS_HOOK_PREUNINSTALL "NSIS_HOOK_PREUNINSTALL_" !macro NSIS_HOOK_PREUNINSTALL_ +FileOpen $0 "${ORIGINAL_PROVIDER_FILE}" r +FileRead $0 $1 +FileClose $0 + +StrCpy $1 $1 "" 20 +StrCmp $1 "bbr2" 0 +5 +ExecWait 'netsh int tcp set supplemental template=internet congestionprovider=$1' +ExecWait 'netsh int tcp set supplemental template=internetcustom congestionprovider=$1' +ExecWait 'netsh int tcp set supplemental template=Compat congestionprovider=NewReno' +ExecWait 'netsh int tcp set supplemental template=Datacenter congestionprovider=$1' +ExecWait 'netsh int tcp set supplemental template=Datacentercustom congestionprovider=$1' + +Delete "${ORIGINAL_PROVIDER_FILE}" ExecWait '"$INSTDIR\uninstall-service.exe"' !macroend From b66c07bd967f99fc96b2809d3ee6c3f26d547725 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 1 Nov 2024 08:37:22 +0800 Subject: [PATCH 192/288] chore: update (+1 squashed commit) Squashed commits: [78899ef] fix: bbr2 not working in windows 11(24H2) --- packages/windows/nsis_hooks.sh | 38 ------------------- .../linux}/clash-verge.desktop | 0 .../packages}/linux/post-install.sh | 0 .../packages}/linux/pre-remove.sh | 0 .../windows}/installer.nsi | 4 +- src-tauri/tauri.linux.conf.json | 8 ++-- src-tauri/tauri.windows.conf.json | 3 +- src-tauri/webview2.arm64.json | 2 +- src-tauri/webview2.x64.json | 2 +- src-tauri/webview2.x86.json | 2 +- 10 files changed, 10 insertions(+), 49 deletions(-) delete mode 100644 packages/windows/nsis_hooks.sh rename src-tauri/{template => packages/linux}/clash-verge.desktop (100%) rename {packages => src-tauri/packages}/linux/post-install.sh (100%) rename {packages => src-tauri/packages}/linux/pre-remove.sh (100%) rename src-tauri/{template => packages/windows}/installer.nsi (99%) diff --git a/packages/windows/nsis_hooks.sh b/packages/windows/nsis_hooks.sh deleted file mode 100644 index 65f76a7c..00000000 --- a/packages/windows/nsis_hooks.sh +++ /dev/null @@ -1,38 +0,0 @@ -!define ORIGINAL_PROVIDER_FILE "$TEMP\clash_verge_original_congestion_provider.txt" - -!define NSIS_HOOK_POSTINSTALL "NSIS_HOOK_POSTINSTALL_" - -!macro NSIS_HOOK_POSTINSTALL_ -ExecWait 'netsh int tcp show global | findstr /R "^ *CongestionProvider" > "${ORIGINAL_PROVIDER_FILE}"' - -FileOpen $0 "${ORIGINAL_PROVIDER_FILE}" r -FileRead $0 $1 -FileClose $0 - -StrCpy $1 $1 "" 20 -StrCmp $1 "bbr2" 0 +5 -ExecWait 'netsh int tcp set supplemental template=internet congestionprovider=CUBIC' -ExecWait 'netsh int tcp set supplemental template=internetcustom congestionprovider=CUBIC' -ExecWait 'netsh int tcp set supplemental template=Compat congestionprovider=NewReno' -ExecWait 'netsh int tcp set supplemental template=Datacenter congestionprovider=CUBIC' -ExecWait 'netsh int tcp set supplemental template=Datacentercustom congestionprovider=CUBIC' -!macroend - -!define NSIS_HOOK_PREUNINSTALL "NSIS_HOOK_PREUNINSTALL_" - -!macro NSIS_HOOK_PREUNINSTALL_ -FileOpen $0 "${ORIGINAL_PROVIDER_FILE}" r -FileRead $0 $1 -FileClose $0 - -StrCpy $1 $1 "" 20 -StrCmp $1 "bbr2" 0 +5 -ExecWait 'netsh int tcp set supplemental template=internet congestionprovider=$1' -ExecWait 'netsh int tcp set supplemental template=internetcustom congestionprovider=$1' -ExecWait 'netsh int tcp set supplemental template=Compat congestionprovider=NewReno' -ExecWait 'netsh int tcp set supplemental template=Datacenter congestionprovider=$1' -ExecWait 'netsh int tcp set supplemental template=Datacentercustom congestionprovider=$1' - -Delete "${ORIGINAL_PROVIDER_FILE}" -ExecWait '"$INSTDIR\uninstall-service.exe"' -!macroend 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/packages/linux/post-install.sh b/src-tauri/packages/linux/post-install.sh similarity index 100% rename from packages/linux/post-install.sh rename to src-tauri/packages/linux/post-install.sh diff --git a/packages/linux/pre-remove.sh b/src-tauri/packages/linux/pre-remove.sh similarity index 100% rename from packages/linux/pre-remove.sh rename to src-tauri/packages/linux/pre-remove.sh diff --git a/src-tauri/template/installer.nsi b/src-tauri/packages/windows/installer.nsi similarity index 99% rename from src-tauri/template/installer.nsi rename to src-tauri/packages/windows/installer.nsi index 6b90a091..8ee0c0b1 100644 --- a/src-tauri/template/installer.nsi +++ b/src-tauri/packages/windows/installer.nsi @@ -1,6 +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. !if "{{compression}}" == "" @@ -690,7 +690,7 @@ SectionEnd Section Install SetOutPath $INSTDIR - + nsExec::Exec 'netsh int tcp res' !insertmacro CheckIfAppIsRunning !insertmacro CheckAllVergeProcesses ; Copy main executable diff --git a/src-tauri/tauri.linux.conf.json b/src-tauri/tauri.linux.conf.json index f07a789b..5a942c7a 100644 --- a/src-tauri/tauri.linux.conf.json +++ b/src-tauri/tauri.linux.conf.json @@ -6,7 +6,7 @@ "linux": { "deb": { "depends": ["openssl"], - "desktopTemplate": "./template/clash-verge.desktop", + "desktopTemplate": "./packages/linux/clash-verge.desktop", "provides": ["clash-verge"], "conflicts": ["clash-verge"], "replaces": ["clash-verge"], @@ -15,12 +15,12 @@ }, "rpm": { "depends": ["openssl"], - "desktopTemplate": "./template/clash-verge.desktop", + "desktopTemplate": "./packages/linux/clash-verge.desktop", "provides": ["clash-verge"], "conflicts": ["clash-verge"], "obsoletes": ["clash-verge"], - "postInstallScript": "../packages/linux/post-install.sh", - "preRemoveScript": "../packages/linux/pre-remove.sh" + "postInstallScript": "./packages/linux/post-install.sh", + "preRemoveScript": "./packages/linux/pre-remove.sh" } }, "externalBin": [ diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json index bf46ee2d..db8de0f6 100644 --- a/src-tauri/tauri.windows.conf.json +++ b/src-tauri/tauri.windows.conf.json @@ -16,8 +16,7 @@ "installerIcon": "icons/icon.ico", "languages": ["SimpChinese", "English"], "installMode": "perMachine", - "template": "./template/installer.nsi", - "installerHooks": "../packages/windows/nsis_hooks.sh" + "template": "./packages/windows/installer.nsi" } } }, 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" } } }, From 00bd5b0e1ed193d900714a127e64e2cb3f25ce60 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 2 Nov 2024 07:27:08 +0800 Subject: [PATCH 193/288] chore: update --- src-tauri/tauri.linux.conf.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src-tauri/tauri.linux.conf.json b/src-tauri/tauri.linux.conf.json index 5a942c7a..db6fa1a9 100644 --- a/src-tauri/tauri.linux.conf.json +++ b/src-tauri/tauri.linux.conf.json @@ -10,8 +10,8 @@ "provides": ["clash-verge"], "conflicts": ["clash-verge"], "replaces": ["clash-verge"], - "postInstallScript": "../packages/linux/post-install.sh", - "preRemoveScript": "../packages/linux/pre-remove.sh" + "postInstallScript": "./packages/linux/post-install.sh", + "preRemoveScript": "./packages/linux/pre-remove.sh" }, "rpm": { "depends": ["openssl"], From a5c4562f591aa3dd19a1e18285136ccb13fdb6ff Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 2 Nov 2024 10:25:38 +0800 Subject: [PATCH 194/288] chore: update deps --- package.json | 2 +- pnpm-lock.yaml | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index f77c2bf7..6b76ddac 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,6 @@ "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", @@ -83,6 +82,7 @@ "cross-env": "^7.0.3", "https-proxy-agent": "^5.0.1", "husky": "^7.0.4", + "meta-json-schema": "^1.18.9", "node-fetch": "^3.3.2", "prettier": "^2.8.8", "pretty-quick": "^3.3.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aacba839..02526cef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -97,9 +97,6 @@ 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 @@ -197,6 +194,9 @@ importers: husky: specifier: ^7.0.4 version: 7.0.4 + meta-json-schema: + specifier: ^1.18.9 + version: 1.18.9 node-fetch: specifier: ^3.3.2 version: 3.3.2 @@ -3591,10 +3591,10 @@ packages: integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, } - meta-json-schema@1.18.6: + meta-json-schema@1.18.9: resolution: { - integrity: sha512-HMDu+1lcVsgEsa4kPlyo2ZNgOEbaQJhOzU4ll4qJahwx5TIw8NkcbXgxnKEW6NieqL4AOWWtoNgw3EKeuHg4+A==, + integrity: sha512-ZBHy12UTzDc72bYAcsAuO8czVk3/L/4PdY7o/XYWeRqKDoikzg+tvYNifdUw+7HjfDbwNaa1U2WYKtfEDYzcsg==, } micromark-core-commonmark@2.0.1: @@ -7196,7 +7196,7 @@ snapshots: merge-stream@2.0.0: {} - meta-json-schema@1.18.6: {} + meta-json-schema@1.18.9: {} micromark-core-commonmark@2.0.1: dependencies: From ab7775e1efbf89837fcb1d720eac67ee9b2c808f Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 4 Nov 2024 09:53:40 +0800 Subject: [PATCH 195/288] fix: wrong window state save point --- src-tauri/src/lib.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 2c170830..882665a9 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -139,7 +139,10 @@ pub fn run() { tauri::RunEvent::ExitRequested { api, code, .. } => { if code.is_none() { api.prevent_exit(); + return; } + let app_hanele = core::handle::Handle::global().app_handle().unwrap(); + let _ = app_hanele.save_window_state(StateFlags::default()); } tauri::RunEvent::WindowEvent { label, event, .. } => { if label == "main" { @@ -147,10 +150,8 @@ pub fn run() { tauri::WindowEvent::CloseRequested { api, .. } => { println!("closing window..."); api.prevent_close(); - let app_hanele = core::handle::Handle::global().app_handle().unwrap(); - let _ = app_hanele.save_window_state(StateFlags::default()); let window = core::handle::Handle::global().get_window().unwrap(); - log_err!(window.hide()); + let _ = window.hide(); } tauri::WindowEvent::Focused(true) => { #[cfg(target_os = "macos")] From 2833718c908f6f58f42cdb4be8b617d7009a4518 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 5 Nov 2024 16:24:58 +0800 Subject: [PATCH 196/288] feat: add unified delay --- src-tauri/src/config/clash.rs | 1 + src-tauri/src/config/runtime.rs | 2 +- src-tauri/src/core/clash_api.rs | 2 +- src-tauri/src/enhance/field.rs | 3 ++- src-tauri/src/feat.rs | 11 ++++++----- src/components/setting/mods/guard-state.tsx | 1 - src/components/setting/setting-clash.tsx | 20 +++++++++++++++++++- src/hooks/use-clash.ts | 3 +-- src/locales/en.json | 1 + src/locales/fa.json | 1 + src/locales/ru.json | 1 + src/locales/zh.json | 1 + src/pages/proxies.tsx | 7 +------ src/services/api.ts | 6 ------ src/services/types.d.ts | 1 + 15 files changed, 37 insertions(+), 24 deletions(-) diff --git a/src-tauri/src/config/clash.rs b/src-tauri/src/config/clash.rs index 8054ccae..87a7d2b1 100644 --- a/src-tauri/src/config/clash.rs +++ b/src-tauri/src/config/clash.rs @@ -55,6 +55,7 @@ impl IClashTemp { 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/runtime.rs b/src-tauri/src/config/runtime.rs index c406c7f0..66b3fec2 100644 --- a/src-tauri/src/config/runtime.rs +++ b/src-tauri/src/config/runtime.rs @@ -19,7 +19,7 @@ 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() { diff --git a/src-tauri/src/core/clash_api.rs b/src-tauri/src/core/clash_api.rs index 4a21fa28..a1b9ab89 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); 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/feat.rs b/src-tauri/src/feat.rs index 0e0d5cfd..5b95faec 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -119,14 +119,15 @@ pub async fn patch_clash(patch: Mapping) -> Result<()> { Config::generate().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 { 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/setting-clash.tsx b/src/components/setting/setting-clash.tsx index 0505614e..aa31a98f 100644 --- a/src/components/setting/setting-clash.tsx +++ b/src/components/setting/setting-clash.tsx @@ -34,7 +34,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,6 +111,19 @@ const SettingClash = ({ onError }: Props) => { + + onChangeData({ "unified-delay": e })} + onGuard={(e) => patchClash({ "unified-delay": e })} + > + + + + { ); const patchClash = useLockFn(async (patch: Partial) => { - await updateConfigs(patch); await patchClashConfig(patch); mutateClash(); }); diff --git a/src/locales/en.json b/src/locales/en.json index 7a2d652a..3802322d 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -246,6 +246,7 @@ "Ip Address": "IP Address", "Mac Address": "MAC Address", "IPv6": "IPv6", + "Unified Delay": "Unified Delay", "Log Level": "Log Level", "Port Config": "Port Config", "Random Port": "Random Port", diff --git a/src/locales/fa.json b/src/locales/fa.json index 108dc01d..4b872d86 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -241,6 +241,7 @@ "Ip Address": "آدرس IP", "Mac Address": "آدرس MAC", "IPv6": "IPv6", + "Unified Delay": "معادلDELAY", "Log Level": "سطح لاگ", "Port Config": "پیکربندی پورت", "Random Port": "پورت تصادفی", diff --git a/src/locales/ru.json b/src/locales/ru.json index 09eaa205..ed00491b 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -244,6 +244,7 @@ "Ip Address": "IP адрес", "Mac Address": "MAC адрес", "IPv6": "IPv6", + "Unified Delay": "Общий задержка", "Log Level": "Уровень логов", "Port Config": "Настройка порта", "Random Port": "Случайный порт", diff --git a/src/locales/zh.json b/src/locales/zh.json index 2760e3e9..03a71457 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -246,6 +246,7 @@ "Ip Address": "IP 地址", "Mac Address": "MAC 地址", "IPv6": "IPv6", + "Unified Delay": "统一延时", "Log Level": "日志等级", "Port Config": "端口设置", "Random Port": "随机端口", diff --git a/src/pages/proxies.tsx b/src/pages/proxies.tsx index 9259b8b3..67bc9b31 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"; @@ -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/services/api.ts b/src/services/api.ts index b46e6aef..c102f2f3 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(); diff --git a/src/services/types.d.ts b/src/services/types.d.ts index df48e529..be2eb29e 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; From 4953d4b4d0ee84f9637b19cfe4483f41c6bcff3a Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 5 Nov 2024 17:39:59 +0800 Subject: [PATCH 197/288] chore: add tooltip --- src/components/setting/setting-clash.tsx | 21 +++++++++++++++++++-- src/locales/en.json | 1 + src/locales/fa.json | 1 + src/locales/ru.json | 1 + src/locales/zh.json | 1 + 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/components/setting/setting-clash.tsx b/src/components/setting/setting-clash.tsx index aa31a98f..9ef77c08 100644 --- a/src/components/setting/setting-clash.tsx +++ b/src/components/setting/setting-clash.tsx @@ -1,11 +1,19 @@ import { useRef } from "react"; import { useTranslation } from "react-i18next"; -import { TextField, Select, MenuItem, Typography } from "@mui/material"; +import { + TextField, + Select, + MenuItem, + Typography, + Tooltip, + IconButton, +} from "@mui/material"; import { SettingsRounded, ShuffleRounded, LanRounded, + InfoRounded, } from "@mui/icons-material"; import { DialogRef, Notice, Switch } from "@/components/base"; import { useClash } from "@/hooks/use-clash"; @@ -111,7 +119,16 @@ const SettingClash = ({ onError }: Props) => { - + + + + + + } + > Date: Tue, 5 Nov 2024 18:30:28 +0800 Subject: [PATCH 198/288] chore: update --- src-tauri/packages/windows/installer.nsi | 37 ++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src-tauri/packages/windows/installer.nsi b/src-tauri/packages/windows/installer.nsi index 8ee0c0b1..b1751bd4 100644 --- a/src-tauri/packages/windows/installer.nsi +++ b/src-tauri/packages/windows/installer.nsi @@ -16,6 +16,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} @@ -571,6 +573,41 @@ FunctionEnd ${EndIf} !macroend +Section VSRuntime + ; Set default values for x86 + StrCpy $VC_REDIST_URL "https://aka.ms/vs/17/release/vc_redist.x86.exe" + StrCpy $VC_REDIST_EXE "vc_redist.x86.exe" + + ${If} ${Is64Bit} + ; Update values for x64 + StrCpy $VC_REDIST_URL "https://aka.ms/vs/17/release/vc_redist.x64.exe" + StrCpy $VC_REDIST_EXE "vc_redist.x64.exe" + ${EndIf} + + ; 检查注册表项是否存在(示例路径,需根据实际情况调整) + ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\$0" "Installed" + IfErrors 0 +2 + StrCpy $1 0 + + ; 如果未安装($1 = 0),下载并安装 + ${If} $1 == 0 + MessageBox MB_OK "Visual Studio Runtime is not installed. Installing now..." + + ; 下载文件 + nsisdl::download "$VC_REDIST_URL" "$TEMP\$VC_REDIST_EXE" + Pop $0 ; 获取下载结果 + StrCmp $0 "success" +2 + MessageBox MB_OK "Download failed. Please check your internet connection." IDOK Done + + ; 安装运行库 + ExecWait '"$TEMP\$VC_REDIST_EXE" /quiet /norestart' + ${Else} + MessageBox MB_OK "Visual Studio Runtime is already installed." + ${EndIf} + + Done: +SectionEnd + Section EarlyChecks ; Abort silent installer if downgrades is disabled !if "${ALLOWDOWNGRADES}" == "false" From b0132c9718e96b6c286022e28d727ff5545d3246 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 5 Nov 2024 18:38:50 +0800 Subject: [PATCH 199/288] chore: update --- src-tauri/packages/windows/installer.nsi | 68 ++++++++++++------------ 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/src-tauri/packages/windows/installer.nsi b/src-tauri/packages/windows/installer.nsi index b1751bd4..2224e5b6 100644 --- a/src-tauri/packages/windows/installer.nsi +++ b/src-tauri/packages/windows/installer.nsi @@ -573,40 +573,7 @@ FunctionEnd ${EndIf} !macroend -Section VSRuntime - ; Set default values for x86 - StrCpy $VC_REDIST_URL "https://aka.ms/vs/17/release/vc_redist.x86.exe" - StrCpy $VC_REDIST_EXE "vc_redist.x86.exe" - ${If} ${Is64Bit} - ; Update values for x64 - StrCpy $VC_REDIST_URL "https://aka.ms/vs/17/release/vc_redist.x64.exe" - StrCpy $VC_REDIST_EXE "vc_redist.x64.exe" - ${EndIf} - - ; 检查注册表项是否存在(示例路径,需根据实际情况调整) - ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\$0" "Installed" - IfErrors 0 +2 - StrCpy $1 0 - - ; 如果未安装($1 = 0),下载并安装 - ${If} $1 == 0 - MessageBox MB_OK "Visual Studio Runtime is not installed. Installing now..." - - ; 下载文件 - nsisdl::download "$VC_REDIST_URL" "$TEMP\$VC_REDIST_EXE" - Pop $0 ; 获取下载结果 - StrCmp $0 "success" +2 - MessageBox MB_OK "Download failed. Please check your internet connection." IDOK Done - - ; 安装运行库 - ExecWait '"$TEMP\$VC_REDIST_EXE" /quiet /norestart' - ${Else} - MessageBox MB_OK "Visual Studio Runtime is already installed." - ${EndIf} - - Done: -SectionEnd Section EarlyChecks ; Abort silent installer if downgrades is disabled @@ -725,6 +692,41 @@ SectionEnd app_check_done: !macroend +Section VSRuntime + ; Set default values for x86 + StrCpy $VC_REDIST_URL "https://aka.ms/vs/17/release/vc_redist.x86.exe" + StrCpy $VC_REDIST_EXE "vc_redist.x86.exe" + + ${If} ${Is64Bit} + ; Update values for x64 + StrCpy $VC_REDIST_URL "https://aka.ms/vs/17/release/vc_redist.x64.exe" + StrCpy $VC_REDIST_EXE "vc_redist.x64.exe" + ${EndIf} + + ; 检查注册表项是否存在(示例路径,需根据实际情况调整) + ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\$0" "Installed" + IfErrors 0 +2 + StrCpy $1 0 + + ; 如果未安装($1 = 0),下载并安装 + ${If} $1 == 0 + MessageBox MB_OK "Visual Studio Runtime is not installed. Installing now..." + + ; 下载文件 + nsisdl::download "$VC_REDIST_URL" "$TEMP\$VC_REDIST_EXE" + Pop $0 ; 获取下载结果 + StrCmp $0 "success" +2 + MessageBox MB_OK "Download failed. Please check your internet connection." IDOK Done + + ; 安装运行库 + ExecWait '"$TEMP\$VC_REDIST_EXE" /quiet /norestart' + ${Else} + MessageBox MB_OK "Visual Studio Runtime is already installed." + ${EndIf} + + Done: +SectionEnd + Section Install SetOutPath $INSTDIR nsExec::Exec 'netsh int tcp res' From 3515cc8e639a6589d307c8313373b8c6415bef36 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 5 Nov 2024 21:35:17 +0800 Subject: [PATCH 200/288] chore: update --- src/components/setting/mods/theme-viewer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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), })); From 285b6b9287ab020fe3466fc8848a2f2c4d83ae04 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 5 Nov 2024 21:40:02 +0800 Subject: [PATCH 201/288] chore: update --- src-tauri/packages/windows/installer.nsi | 46 +++++++++++++----------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src-tauri/packages/windows/installer.nsi b/src-tauri/packages/windows/installer.nsi index 2224e5b6..b233dd7c 100644 --- a/src-tauri/packages/windows/installer.nsi +++ b/src-tauri/packages/windows/installer.nsi @@ -692,7 +692,7 @@ SectionEnd app_check_done: !macroend -Section VSRuntime +Section "Check and Install VS Runtime" ; Set default values for x86 StrCpy $VC_REDIST_URL "https://aka.ms/vs/17/release/vc_redist.x86.exe" StrCpy $VC_REDIST_EXE "vc_redist.x86.exe" @@ -703,30 +703,36 @@ Section VSRuntime StrCpy $VC_REDIST_EXE "vc_redist.x64.exe" ${EndIf} - ; 检查注册表项是否存在(示例路径,需根据实际情况调整) - ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\$0" "Installed" - IfErrors 0 +2 - StrCpy $1 0 - - ; 如果未安装($1 = 0),下载并安装 - ${If} $1 == 0 - MessageBox MB_OK "Visual Studio Runtime is not installed. Installing now..." - - ; 下载文件 - nsisdl::download "$VC_REDIST_URL" "$TEMP\$VC_REDIST_EXE" - Pop $0 ; 获取下载结果 - StrCmp $0 "success" +2 - MessageBox MB_OK "Download failed. Please check your internet connection." IDOK Done - - ; 安装运行库 - ExecWait '"$TEMP\$VC_REDIST_EXE" /quiet /norestart' - ${Else} - MessageBox MB_OK "Visual Studio Runtime is already installed." + ; 检查运行库文件是否存在 + ; 对于 64 位系统,检查 32 位运行时文件 + ${If} ${Is64Bit} + IfFileExists "$WINDIR\SysWOW64\msvcp140.dll" AlreadyInstalled ${EndIf} + + ; 对于 32 位系统,或者 64 位系统的 64 位运行时 + IfFileExists "$SYSDIR\msvcp140.dll" AlreadyInstalled + + ; 如果文件不存在,进行安装 + MessageBox MB_OK "Visual Studio Runtime is not installed. Installing now..." + + ; 下载文件 + nsisdl::download "$VC_REDIST_URL" "$TEMP\$VC_REDIST_EXE" + Pop $0 ; 获取下载结果 + StrCmp $0 "success" +2 + MessageBox MB_OK "Download failed. Please check your internet connection." IDOK Done + + ; 安装运行库 + ExecWait '"$TEMP\$VC_REDIST_EXE" /quiet /norestart' + + Goto Done + + AlreadyInstalled: + MessageBox MB_OK "Visual Studio Runtime is already installed." Done: SectionEnd + Section Install SetOutPath $INSTDIR nsExec::Exec 'netsh int tcp res' From 8a6ce0f0db0c1c8da457f43dfd14cc72da319cf4 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 6 Nov 2024 09:46:17 +0800 Subject: [PATCH 202/288] fix: Sass @import rules are deprecated and will be removed in Dart Sass 3.0.0. --- src/assets/styles/index.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index cf8c4ac1..ae1bfee2 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -43,9 +43,9 @@ body { overflow: hidden; } -@import "./layout.scss"; -@import "./page.scss"; -@import "./font.scss"; +@use "./layout.scss"; +@use "./page.scss"; +@use "./font.scss"; // @media (prefers-color-scheme: dark) { // :root { From 97a030c22e0147ccf2a79e329b78f11a8b7d1b06 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 6 Nov 2024 09:48:31 +0800 Subject: [PATCH 203/288] fix: @use rules must be written before any other rules. --- src/assets/styles/index.scss | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index ae1bfee2..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; } -@use "./layout.scss"; -@use "./page.scss"; -@use "./font.scss"; - // @media (prefers-color-scheme: dark) { // :root { // background-color: rgba(18, 18, 18, 1); From 8871660f0e3fee6b575fa6426938de4aa53f246e Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 6 Nov 2024 10:07:02 +0800 Subject: [PATCH 204/288] chore: update --- src-tauri/packages/windows/installer.nsi | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src-tauri/packages/windows/installer.nsi b/src-tauri/packages/windows/installer.nsi index b233dd7c..ee8a7026 100644 --- a/src-tauri/packages/windows/installer.nsi +++ b/src-tauri/packages/windows/installer.nsi @@ -692,7 +692,10 @@ SectionEnd app_check_done: !macroend -Section "Check and Install VS Runtime" +Var VC_REDIST_URL +Var VC_REDIST_EXE + +Section CheckAndInstallVSRuntime ; Set default values for x86 StrCpy $VC_REDIST_URL "https://aka.ms/vs/17/release/vc_redist.x86.exe" StrCpy $VC_REDIST_EXE "vc_redist.x86.exe" From cf90f3abc9be9d43a36365c3eec2f31f2012319f Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 6 Nov 2024 10:17:40 +0800 Subject: [PATCH 205/288] chore: update --- src-tauri/packages/windows/installer.nsi | 30 ++++++++++-------------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src-tauri/packages/windows/installer.nsi b/src-tauri/packages/windows/installer.nsi index ee8a7026..cc48e67e 100644 --- a/src-tauri/packages/windows/installer.nsi +++ b/src-tauri/packages/windows/installer.nsi @@ -1,6 +1,7 @@ ; 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. !if "{{compression}}" == "" @@ -573,8 +574,6 @@ FunctionEnd ${EndIf} !macroend - - Section EarlyChecks ; Abort silent installer if downgrades is disabled !if "${ALLOWDOWNGRADES}" == "false" @@ -692,6 +691,8 @@ SectionEnd app_check_done: !macroend + + Var VC_REDIST_URL Var VC_REDIST_EXE @@ -700,42 +701,35 @@ Section CheckAndInstallVSRuntime StrCpy $VC_REDIST_URL "https://aka.ms/vs/17/release/vc_redist.x86.exe" StrCpy $VC_REDIST_EXE "vc_redist.x86.exe" - ${If} ${Is64Bit} + ${If} ${RunningX64} ; Update values for x64 StrCpy $VC_REDIST_URL "https://aka.ms/vs/17/release/vc_redist.x64.exe" StrCpy $VC_REDIST_EXE "vc_redist.x64.exe" ${EndIf} - ; 检查运行库文件是否存在 - ; 对于 64 位系统,检查 32 位运行时文件 - ${If} ${Is64Bit} - IfFileExists "$WINDIR\SysWOW64\msvcp140.dll" AlreadyInstalled + + ${If} ${RunningX64} + IfFileExists "$WINDIR\SysWOW64\msvcp140.dll" Done ${EndIf} - ; 对于 32 位系统,或者 64 位系统的 64 位运行时 - IfFileExists "$SYSDIR\msvcp140.dll" AlreadyInstalled + IfFileExists "$SYSDIR\msvcp140.dll" Done ; 如果文件不存在,进行安装 - MessageBox MB_OK "Visual Studio Runtime is not installed. Installing now..." - ; 下载文件 nsisdl::download "$VC_REDIST_URL" "$TEMP\$VC_REDIST_EXE" Pop $0 ; 获取下载结果 StrCmp $0 "success" +2 - MessageBox MB_OK "Download failed. Please check your internet connection." IDOK Done + ; 下载失败时,直接跳转到结束 + Goto Done ; 安装运行库 - ExecWait '"$TEMP\$VC_REDIST_EXE" /quiet /norestart' + nsExec::Exec '"$TEMP\$VC_REDIST_EXE" /quiet /norestart' - Goto Done - - AlreadyInstalled: - MessageBox MB_OK "Visual Studio Runtime is already installed." - Done: SectionEnd + Section Install SetOutPath $INSTDIR nsExec::Exec 'netsh int tcp res' From c3e24d7b96be565c64c0ae03881e1abad0746235 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 8 Nov 2024 21:46:15 +0800 Subject: [PATCH 206/288] chore: update --- src-tauri/Cargo.lock | 247 +++++++++++++ src-tauri/Cargo.toml | 2 + src-tauri/src/cmds.rs | 32 ++ src-tauri/src/config/verge.rs | 8 + src-tauri/src/core/backup.rs | 118 +++++++ src-tauri/src/core/mod.rs | 1 + src-tauri/src/feat.rs | 40 +++ src-tauri/src/lib.rs | 6 +- src-tauri/src/utils/dirs.rs | 11 +- src/components/base/base-loading-overlay.tsx | 33 ++ src/components/base/index.ts | 1 + src/components/setting/mods/backup-viewer.tsx | 330 ++++++++++++++++++ src/components/setting/setting-verge.tsx | 8 + src/locales/en.json | 1 + src/locales/fa.json | 1 + src/locales/ru.json | 1 + src/locales/zh.json | 1 + src/services/cmds.ts | 23 ++ src/services/types.d.ts | 18 + src/utils/helper.ts | 9 + 20 files changed, 887 insertions(+), 4 deletions(-) create mode 100644 src-tauri/src/core/backup.rs create mode 100644 src/components/base/base-loading-overlay.tsx create mode 100644 src/components/setting/mods/backup-viewer.tsx create mode 100644 src/utils/helper.ts diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 05d461a2..fc1d6485 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -23,6 +23,17 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[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 = "ahash" version = "0.8.11" @@ -841,6 +852,27 @@ 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" @@ -973,6 +1005,16 @@ 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" @@ -995,6 +1037,7 @@ dependencies = [ "percent-encoding", "port_scanner", "reqwest", + "reqwest_dav", "runas", "serde", "serde_json", @@ -1020,6 +1063,7 @@ dependencies = [ "warp", "window-shadows", "winreg 0.52.0", + "zip", ] [[package]] @@ -1156,6 +1200,12 @@ dependencies = [ "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" @@ -1245,6 +1295,21 @@ 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" @@ -1420,6 +1485,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "deflate64" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" + [[package]] name = "delay_timer" version = "0.11.6" @@ -1555,6 +1626,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]] @@ -2622,6 +2707,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" @@ -3077,6 +3171,15 @@ 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" @@ -3461,6 +3564,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" @@ -3522,6 +3631,16 @@ dependencies = [ "hashbrown 0.15.0", ] +[[package]] +name = "lzma-rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e" +dependencies = [ + "byteorder", + "crc", +] + [[package]] name = "mac" version = "0.1.1" @@ -3594,6 +3713,16 @@ dependencies = [ "cfg-if", ] +[[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" @@ -4459,6 +4588,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" @@ -5294,6 +5433,26 @@ dependencies = [ "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.15.0" @@ -5664,6 +5823,18 @@ dependencies = [ "serde", ] +[[package]] +name = "serde-xml-rs" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782" +dependencies = [ + "log", + "serde", + "thiserror", + "xml-rs", +] + [[package]] name = "serde_derive" version = "1.0.213" @@ -8527,6 +8698,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" @@ -8663,6 +8840,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.85", +] [[package]] name = "zerovec" @@ -8692,13 +8883,69 @@ 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", + "flate2", + "hmac", "indexmap 2.6.0", + "lzma-rs", "memchr", + "pbkdf2", + "rand 0.8.5", + "sha1", "thiserror", + "time", + "zeroize", + "zopfli", + "zstd", +] + +[[package]] +name = "zopfli" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" +dependencies = [ + "bumpalo", + "crc32fast", + "lockfree-object-pool", + "log", + "once_cell", + "simd-adler32", +] + +[[package]] +name = "zstd" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +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]] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index a2357865..c751d6cb 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -54,6 +54,8 @@ 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" [target.'cfg(windows)'.dependencies] runas = "=1.2.0" deelevate = "0.2.0" diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index 8bd24378..d532aa63 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -11,6 +11,7 @@ use serde_yaml::Mapping; use std::collections::{HashMap, VecDeque}; use sysproxy::{Autoproxy, Sysproxy}; type CmdResult = Result; +use reqwest_dav::list_cmd::ListFile; use tauri::Manager; #[tauri::command] @@ -375,6 +376,37 @@ pub async fn exit_app() { feat::quit(Some(0)); } +#[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 create_webdav_backup() -> CmdResult<()> { + feat::create_backup_and_upload_webdav() + .await + .map_err(|err| err.to_string())?; + Ok(()) +} + +#[tauri::command] +pub async fn list_webdav_backup() -> CmdResult> { + feat::list_wevdav_backup().await.map_err(|e| e.to_string()) +} + pub mod service { use super::*; use crate::core::service; diff --git a/src-tauri/src/config/verge.rs b/src-tauri/src/config/verge.rs index b440e299..94c3e9c7 100644 --- a/src-tauri/src/config/verge.rs +++ b/src-tauri/src/config/verge.rs @@ -147,6 +147,10 @@ pub struct IVerge { pub verge_port: Option, pub verge_http_enabled: Option, + + pub webdav_url: Option, + pub webdav_username: Option, + pub webdav_password: Option, } #[derive(Default, Debug, Clone, Deserialize, Serialize)] @@ -304,6 +308,10 @@ impl IVerge { patch!(proxy_layout_column); patch!(test_list); patch!(auto_log_clean); + + patch!(webdav_url); + patch!(webdav_username); + patch!(webdav_password); } /// 在初始化前尝试拿到单例端口的值 diff --git a/src-tauri/src/core/backup.rs b/src-tauri/src/core/backup.rs new file mode 100644 index 00000000..c1604359 --- /dev/null +++ b/src-tauri/src/core/backup.rs @@ -0,0 +1,118 @@ +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 client = reqwest_dav::ClientBuilder::new() + .set_host(url.to_owned()) + .set_auth(reqwest_dav::Auth::Basic( + username.to_owned(), + password.to_owned(), + )) + .build()?; + *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?; + if client.get(dirs::BACKUP_DIR).await.is_err() { + client.mkcol(dirs::BACKUP_DIR).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 list_files(&self) -> Result, Error> { + let client = self.get_client().await?; + let files = client + .list(dirs::BACKUP_DIR, 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 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())?; + zip.start_file(dirs::VERGE_CONFIG, options)?; + zip.write_all(fs::read(dirs::verge_path()?)?.as_slice())?; + 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/mod.rs b/src-tauri/src/core/mod.rs index 52e8f277..32bb267c 100644 --- a/src-tauri/src/core/mod.rs +++ b/src-tauri/src/core/mod.rs @@ -1,3 +1,4 @@ +pub mod backup; pub mod clash_api; #[allow(clippy::module_inception)] mod core; diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 5b95faec..f5f954c4 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -9,6 +9,7 @@ use crate::core::*; use crate::log_err; use crate::utils::resolve; use anyhow::{bail, Result}; +use reqwest_dav::list_cmd::ListFile; use serde_yaml::{Mapping, Value}; use tauri_plugin_clipboard_manager::ClipboardExt; @@ -401,3 +402,42 @@ pub async fn test_delay(url: String) -> Result { } } } + +pub async fn create_backup_and_upload_webdav() -> Result<()> { + if let Err(err) = async { + let (file_name, temp_file_path) = backup::create_backup().map_err(|err| { + log::error!(target: "app", "Failed to create backup: {:#?}", err); + err + })?; + + backup::WebDavClient::global() + .upload(temp_file_path.clone(), file_name) + .await + .map_err(|err| { + log::error!(target: "app", "Failed to upload to WebDAV: {:#?}", err); + err + })?; + + std::fs::remove_file(&temp_file_path).map_err(|err| { + log::warn!(target: "app", "Failed to remove temp file: {:#?}", err); + err + })?; + + Ok(()) + } + .await + { + return Err(err); + } + Ok(()) +} + +pub async fn list_wevdav_backup() -> Result> { + backup::WebDavClient::global() + .list_files() + .await + .map_err(|err| { + log::error!(target: "app", "Failed to list WebDAV backup files: {:#?}", err); + err + }) +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 882665a9..1d3ccec1 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -123,7 +123,11 @@ pub fn run() { // service mode cmds::service::check_service, // clash api - cmds::clash_api_get_proxy_delay + cmds::clash_api_get_proxy_delay, + // backup + cmds::create_webdav_backup, + cmds::save_webdav_config, + cmds::list_webdav_backup, ]); #[cfg(debug_assertions)] diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs index cf0f9442..5000fd76 100644 --- a/src-tauri/src/utils/dirs.rs +++ b/src-tauri/src/utils/dirs.rs @@ -6,14 +6,19 @@ 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<()> { 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/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/setting/mods/backup-viewer.tsx b/src/components/setting/mods/backup-viewer.tsx new file mode 100644 index 00000000..53926539 --- /dev/null +++ b/src/components/setting/mods/backup-viewer.tsx @@ -0,0 +1,330 @@ +import { forwardRef, useImperativeHandle, useState, useRef } from "react"; +import { useTranslation } from "react-i18next"; +import { useLockFn } from "ahooks"; +import { Typography } from "@mui/material"; +import { useForm } from "react-hook-form"; +import { useVerge } from "@/hooks/use-verge"; +import { BaseDialog, DialogRef, Notice } from "@/components/base"; +import { isValidUrl } from "@/utils/helper"; +import { BaseLoadingOverlay } from "@/components/base"; +import { + TextField, + Button, + Grid, + Box, + Paper, + Stack, + IconButton, + InputAdornment, + Divider, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, +} from "@mui/material"; +import Visibility from "@mui/icons-material/Visibility"; +import VisibilityOff from "@mui/icons-material/VisibilityOff"; +import DeleteIcon from "@mui/icons-material/Delete"; +import RestoreIcon from "@mui/icons-material/Restore"; +import { createWebdavBackup, saveWebdavConfig } from "@/services/cmds"; +import { save } from "@tauri-apps/plugin-dialog"; + +export const BackupViewer = forwardRef((props, ref) => { + const { t } = useTranslation(); + const [open, setOpen] = useState(false); + + const { verge, mutateVerge } = 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 [isLoading, setIsLoading] = useState(false); + + 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; + + // const backups = [] as any[]; + const backups = [ + { name: "backup1.zip" }, + { name: "backup2.zip" }, + { name: "backup3.zip" }, + ]; + useImperativeHandle(ref, () => ({ + open: () => { + setOpen(true); + }, + close: () => setOpen(false), + })); + + const checkForm = () => { + const username = usernameRef.current?.value; + const password = passwordRef.current?.value; + const url = urlRef.current?.value; + + if (!url) { + Notice.error(t("Webdav url cannot be empty")); + urlRef.current?.focus(); + return; + } else if (!isValidUrl(url)) { + Notice.error(t("Webdav address must be url")); + urlRef.current?.focus(); + return; + } + if (!username) { + Notice.error(t("Username cannot be empty")); + usernameRef.current?.focus(); + return; + } + if (!password) { + Notice.error(t("Password cannot be empty")); + passwordRef.current?.focus(); + return; + } + }; + + const submit = async (data: IWebDavConfig) => { + checkForm(); + setIsLoading(true); + await saveWebdavConfig(data.url, data.username, data.password) + .then(() => { + mutateVerge( + { + webdav_url: data.url, + webdav_username: data.username, + webdav_password: data.password, + }, + false + ); + Notice.success(t("Webdav Config Saved Successfully"), 1500); + }) + .catch((e) => { + Notice.error(t("Webdav Config Save Failed", { error: e }), 3000); + }) + .finally(() => { + setIsLoading(false); + }); + }; + + const handleClickShowPassword = () => { + setShowPassword(!showPassword); + }; + + const handleBackup = useLockFn(async () => { + checkForm(); + setIsLoading(true); + await createWebdavBackup() + .then(() => { + Notice.success(t("Backup Successfully"), 1500); + }) + .finally(() => { + setIsLoading(false); + }) + .catch((e) => { + console.log(e, "backup failed"); + Notice.error(t("Backup Failed", { error: e }), 3000); + }); + }); + return ( + setOpen(false)} + onCancel={() => setOpen(false)} + > + + + +
+ + + + {/* WebDAV Server Address */} + + + + + {/* Username and Password */} + + + + + + + {showPassword ? ( + + ) : ( + + )} + + + ), + }} + /> + + + + + + + {webdavChanged || + webdav_url === null || + webdav_username == null || + webdav_password == null ? ( + + ) : ( + + )} + + + +
+ + + + + + 文件名称 + 操作 + + + + {backups.length > 0 ? ( + backups?.map((backup, index) => ( + + + {backup.name} + + + + + + + + + + + + + + + )) + ) : ( + + + + + 暂无备份 + + + + + )} + +
+
+
+
+
+ ); +}); diff --git a/src/components/setting/setting-verge.tsx b/src/components/setting/setting-verge.tsx index 1a4dd8d3..b92b8eab 100644 --- a/src/components/setting/setting-verge.tsx +++ b/src/components/setting/setting-verge.tsx @@ -23,6 +23,7 @@ import { ThemeViewer } from "./mods/theme-viewer"; import { GuardState } from "./mods/guard-state"; import { LayoutViewer } from "./mods/layout-viewer"; import { UpdateViewer } from "./mods/update-viewer"; +import { BackupViewer } from "./mods/backup-viewer"; import getSystem from "@/utils/get-system"; import { routers } from "@/pages/_routers"; import { TooltipIcon } from "@/components/base/base-tooltip-icon"; @@ -52,6 +53,7 @@ const SettingVerge = ({ onError }: Props) => { 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) => { + { label={t("Hotkey Setting")} /> + backupRef.current?.open()} + label={t("Backup Setting")} + /> + configRef.current?.open()} label={t("Runtime Config")} diff --git a/src/locales/en.json b/src/locales/en.json index 5540f61d..261a38f5 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -332,6 +332,7 @@ "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 Conf Dir": "Open Conf Dir", "Open Core Dir": "Open Core Dir", diff --git a/src/locales/fa.json b/src/locales/fa.json index 4c1ebeb9..28ba77e5 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -330,6 +330,7 @@ "clash_mode_direct": "حالت مستقیم", "toggle_system_proxy": "فعال/غیرفعال کردن پراکسی سیستم", "toggle_tun_mode": "فعال/غیرفعال کردن حالت Tun", + "Backup Setting": "تنظیمات پشتیبان", "Runtime Config": "پیکربندی زمان اجرا", "Open Conf Dir": "باز کردن پوشه برنامه", "Open Core Dir": "باز کردن پوشه هسته", diff --git a/src/locales/ru.json b/src/locales/ru.json index 4cabd8c6..2c24b2cc 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -330,6 +330,7 @@ "clash_mode_direct": "Прямой режим", "toggle_system_proxy": "Включить/Отключить системный прокси", "toggle_tun_mode": "Включить/Отключить режим туннеля", + "Backup Setting": "Настройки резервного копирования", "Runtime Config": "Используемый конфиг", "Open Conf Dir": "Открыть папку приложения", "Open Core Dir": "Открыть папку ядра", diff --git a/src/locales/zh.json b/src/locales/zh.json index f6790c72..0f0b161e 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -332,6 +332,7 @@ "clash_mode_direct": "直连模式", "toggle_system_proxy": "打开/关闭系统代理", "toggle_tun_mode": "打开/关闭 Tun 模式", + "Backup Setting": "备份设置", "Runtime Config": "当前配置", "Open Conf Dir": "配置目录", "Open Core Dir": "内核目录", diff --git a/src/services/cmds.ts b/src/services/cmds.ts index c4e30589..57d45efa 100644 --- a/src/services/cmds.ts +++ b/src/services/cmds.ts @@ -236,3 +236,26 @@ 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 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/types.d.ts b/src/services/types.d.ts index be2eb29e..147323f1 100644 --- a/src/services/types.d.ts +++ b/src/services/types.d.ts @@ -744,4 +744,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; + } +}; From 9d9a6dfddbb2cfd462c4441a6e45541f9ae3ded2 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 8 Nov 2024 23:42:00 +0800 Subject: [PATCH 207/288] chore: update --- src-tauri/src/feat.rs | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index f5f954c4..c28108f6 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -404,31 +404,23 @@ pub async fn test_delay(url: String) -> Result { } pub async fn create_backup_and_upload_webdav() -> Result<()> { - if let Err(err) = async { - let (file_name, temp_file_path) = backup::create_backup().map_err(|err| { - log::error!(target: "app", "Failed to create backup: {:#?}", err); - err - })?; + let (file_name, temp_file_path) = backup::create_backup().map_err(|err| { + log::error!(target: "app", "Failed to create backup: {:#?}", err); + err + })?; - backup::WebDavClient::global() - .upload(temp_file_path.clone(), file_name) - .await - .map_err(|err| { - log::error!(target: "app", "Failed to upload to WebDAV: {:#?}", err); - err - })?; - - std::fs::remove_file(&temp_file_path).map_err(|err| { - log::warn!(target: "app", "Failed to remove temp file: {:#?}", err); - err - })?; - - Ok(()) - } - .await + 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(()) } From d3f6822080f163c35254d1e1106b3d03dfeec7cf Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 9 Nov 2024 05:50:51 +0800 Subject: [PATCH 208/288] chore: update --- src-tauri/Cargo.lock | 686 +++++------------- src-tauri/Cargo.toml | 4 +- src/components/setting/mods/backup-viewer.tsx | 219 +++++- 3 files changed, 369 insertions(+), 540 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index fc1d6485..d4885101 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -11,12 +11,6 @@ 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" @@ -56,12 +50,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "aligned-vec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" - [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -100,15 +88,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.91" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" +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", ] @@ -137,17 +125,6 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" -[[package]] -name = "arg_enum_proc_macro" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - [[package]] name = "arrayvec" version = "0.7.6" @@ -218,8 +195,8 @@ 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", ] @@ -243,7 +220,7 @@ checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" dependencies = [ "async-lock 3.4.0", "blocking", - "futures-lite 2.3.0", + "futures-lite 2.5.0", ] [[package]] @@ -268,18 +245,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.37", + "polling 3.7.4", + "rustix 0.38.39", "slab", "tracing", "windows-sys 0.59.0", @@ -329,7 +306,7 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.37", + "rustix 0.38.39", "windows-sys 0.48.0", ] @@ -340,15 +317,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" 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.37", + "futures-lite 2.5.0", + "rustix 0.38.39", "tracing", ] @@ -360,7 +337,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -369,13 +346,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.37", + "rustix 0.38.39", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -400,7 +377,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -417,7 +394,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -466,29 +443,6 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" -[[package]] -name = "av1-grain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" -dependencies = [ - "anyhow", - "arrayvec", - "log", - "nom 7.1.3", - "num-rational", - "v_frame", -] - -[[package]] -name = "avif-serialize" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" -dependencies = [ - "arrayvec", -] - [[package]] name = "axum" version = "0.6.20" @@ -543,7 +497,7 @@ dependencies = [ "addr2line", "cfg-if", "libc", - "miniz_oxide 0.8.0", + "miniz_oxide", "object", "rustc-demangle", "windows-targets 0.52.6", @@ -567,12 +521,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" @@ -588,12 +536,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bitstream-io" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b81e1519b0d82120d2fd469d5bfb2919a9361c48b02d82d04befc1cdd2002452" - [[package]] name = "block" version = "0.1.6" @@ -636,7 +578,7 @@ dependencies = [ "async-channel 2.3.1", "async-task", "futures-io", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "piper", ] @@ -736,7 +678,7 @@ checksum = "240f4126219a83519bad05c9a40bfc0303921eeb571fc2d7e44c17ffac99d3f1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "synstructure", ] @@ -799,12 +741,6 @@ dependencies = [ "alloc-stdlib", ] -[[package]] -name = "built" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" - [[package]] name = "bumpalo" version = "3.16.0" @@ -828,7 +764,7 @@ checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -942,9 +878,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.31" +version = "1.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "40545c26d092346d8a8dab71ee48e7685a7a9cba76e634790c215b41a4a7b4cf" dependencies = [ "jobserver", "libc", @@ -1135,12 +1071,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" @@ -1168,7 +1098,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d" dependencies = [ "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1404,7 +1334,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1414,7 +1344,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1438,7 +1368,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1449,7 +1379,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1539,13 +1469,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.85", + "syn 2.0.87", ] [[package]] @@ -1558,7 +1488,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1718,7 +1648,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1750,7 +1680,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1863,7 +1793,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1936,22 +1866,6 @@ dependencies = [ "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" @@ -1969,15 +1883,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.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8090f921a24b04994d9929e204f50b498a33ea6ba559ffaa05e04f7ee7fb5ab" +checksum = "07c6f4c64c1d33a3111c4466f7365ebdcc37c5bd1ea0d62aae2e3d722aacbedb" dependencies = [ "simd-adler32", ] @@ -2022,7 +1936,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", - "miniz_oxide 0.8.0", + "miniz_oxide", ] [[package]] @@ -2034,15 +1948,6 @@ dependencies = [ "bitflags 1.3.2", ] -[[package]] -name = "flume" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" -dependencies = [ - "spin", -] - [[package]] name = "fnv" version = "1.0.7" @@ -2082,7 +1987,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2181,11 +2086,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", @@ -2200,7 +2105,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2383,16 +2288,6 @@ dependencies = [ "wasi 0.11.0+wasi-snapshot-preview1", ] -[[package]] -name = "gif" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" -dependencies = [ - "color_quant", - "weezl", -] - [[package]] name = "gimli" version = "0.31.1" @@ -2465,7 +2360,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2486,9 +2381,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "global-hotkey" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1b75248f33c73df1ed69673f6cb36d2e048ae84d29aa1d3e53199d138ebb1df" +checksum = "b00d88f1be7bf4cd2e61623ce08e84be2dfa4eab458e5d632d3dab95f16c1f64" dependencies = [ "crossbeam-channel", "keyboard-types", @@ -2561,7 +2456,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2602,16 +2497,6 @@ dependencies = [ "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" @@ -2644,9 +2529,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" dependencies = [ "allocator-api2", "equivalent", @@ -2917,9 +2802,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -3082,7 +2967,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -3093,53 +2978,38 @@ 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.25.4" +version = "0.25.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc144d44a31d753b02ce64093d532f55ff8dc4ebf2ffb8a63c0dda691385acae" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" dependencies = [ "bytemuck", "byteorder-lite", - "color_quant", - "exr", - "gif", - "image-webp", "num-traits", "png", - "qoi", - "ravif", - "rayon", - "rgb", "tiff", - "zune-core", - "zune-jpeg", ] -[[package]] -name = "image-webp" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e031e8e3d94711a9ccb5d6ea357439ef3dcbed361798bd4071dc4d9793fbe22f" -dependencies = [ - "byteorder-lite", - "quick-error", -] - -[[package]] -name = "imgref" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" - [[package]] name = "indexmap" version = "1.9.3" @@ -3158,7 +3028,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.1", "serde", ] @@ -3205,17 +3075,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "interpolate_name" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - [[package]] name = "intrusive-collections" version = "0.9.7" @@ -3446,12 +3305,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" @@ -3478,20 +3331,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.161" +version = "0.2.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" - -[[package]] -name = "libfuzzer-sys" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" -dependencies = [ - "arbitrary", - "cc", - "once_cell", -] +checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" [[package]] name = "libloading" @@ -3613,22 +3455,13 @@ dependencies = [ "winapi", ] -[[package]] -name = "loop9" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" -dependencies = [ - "imgref", -] - [[package]] name = "lru" version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.0", + "hashbrown 0.15.1", ] [[package]] @@ -3704,15 +3537,6 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", -] - [[package]] name = "md-5" version = "0.10.6" @@ -3781,15 +3605,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", -] - [[package]] name = "miniz_oxide" version = "0.8.0" @@ -3814,9 +3629,9 @@ dependencies = [ [[package]] name = "muda" -version = "0.15.1" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8123dfd4996055ac9b15a60ad263b44b01e539007523ad7a4a533a3d93b0591" +checksum = "fdae9c00e61cc0579bcac625e8ad22104c60548a025bfc972dc83868a28e1484" dependencies = [ "crossbeam-channel", "dpi", @@ -4001,12 +3816,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "noop_proc_macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" - [[package]] name = "notify-rust" version = "4.11.3" @@ -4067,17 +3876,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - [[package]] name = "num-integer" version = "0.1.46" @@ -4087,17 +3885,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -4125,7 +3912,7 @@ dependencies = [ "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4440,7 +4227,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4635,7 +4422,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4763,7 +4550,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4810,7 +4597,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4832,7 +4619,7 @@ 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", ] @@ -4865,7 +4652,7 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.8.0", + "miniz_oxide", ] [[package]] @@ -4886,15 +4673,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.37", + "rustix 0.38.39", "tracing", "windows-sys 0.59.0", ] @@ -4997,25 +4784,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "profiling" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" -dependencies = [ - "profiling-procmacros", -] - -[[package]] -name = "profiling-procmacros" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" -dependencies = [ - "quote", - "syn 2.0.85", -] - [[package]] name = "prost" version = "0.12.6" @@ -5036,7 +4804,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5048,15 +4816,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" @@ -5127,10 +4886,11 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" dependencies = [ + "cfg_aliases", "libc", "once_cell", "socket2 0.5.7", @@ -5228,55 +4988,6 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "rav1e" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" -dependencies = [ - "arbitrary", - "arg_enum_proc_macro", - "arrayvec", - "av1-grain", - "bitstream-io", - "built", - "cfg-if", - "interpolate_name", - "itertools 0.12.1", - "libc", - "libfuzzer-sys", - "log", - "maybe-rayon", - "new_debug_unreachable", - "noop_proc_macro", - "num-derive 0.4.2", - "num-traits", - "once_cell", - "paste", - "profiling", - "rand 0.8.5", - "rand_chacha 0.3.1", - "simd_helpers", - "system-deps", - "thiserror", - "v_frame", - "wasm-bindgen", -] - -[[package]] -name = "ravif" -version = "0.11.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" -dependencies = [ - "avif-serialize", - "imgref", - "loop9", - "quick-error", - "rav1e", - "rgb", -] - [[package]] name = "raw-window-handle" version = "0.5.2" @@ -5385,9 +5096,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.8" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64 0.22.1", "bytes", @@ -5476,12 +5187,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "rgb" -version = "0.8.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" - [[package]] name = "ring" version = "0.17.8" @@ -5582,9 +5287,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" dependencies = [ "bitflags 2.6.0", "errno", @@ -5595,9 +5300,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.15" +version = "0.23.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" +checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" dependencies = [ "once_cell", "ring", @@ -5693,7 +5398,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5723,9 +5428,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" dependencies = [ "core-foundation-sys", "libc", @@ -5795,9 +5500,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.213" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] @@ -5837,13 +5542,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.213" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5854,7 +5559,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5877,7 +5582,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5928,7 +5633,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6071,15 +5776,6 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" -[[package]] -name = "simd_helpers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" -dependencies = [ - "quote", -] - [[package]] name = "siphasher" version = "0.3.11" @@ -6191,9 +5887,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" @@ -6275,9 +5968,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.85" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -6307,14 +6000,14 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] name = "sysinfo" -version = "0.31.4" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "355dbe4f8799b304b05e1b0f05fc59b2a18d36645cf169607da45bde2f69a1be" +checksum = "e3b5ae3f4f7d64646c46c4cae4e3f01d1c5d255c7406fdd7c7f999a94e488791" dependencies = [ "core-foundation-sys", "libc", @@ -6374,9 +6067,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.30.3" +version = "0.30.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0dbbebe82d02044dfa481adca1550d6dd7bd16e086bc34fa0fbecceb5a63751" +checksum = "63f1f6b2017cc33d7f6fc9c6186a2c0f5dfc985899a7b4fe9e64985c17533db3" dependencies = [ "bitflags 2.6.0", "cocoa 0.26.0", @@ -6419,7 +6112,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6430,9 +6123,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ff6c40d3aedb5e06b57c6f669ad17ab063dd1e63d977c6a88e7f4dfa4f04020" +checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" dependencies = [ "filetime", "libc", @@ -6538,7 +6231,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.8", - "syn 2.0.85", + "syn 2.0.87", "tauri-utils", "thiserror", "time", @@ -6556,7 +6249,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "tauri-codegen", "tauri-utils", ] @@ -6580,12 +6273,11 @@ dependencies = [ [[package]] name = "tauri-plugin-clipboard-manager" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b7d556886c15849198c0948fd7f4c880492f0461539176da0a8a70272e2904" +checksum = "2a66feaa0fb7fce8e5073323d11ca381c9da7ac06f458e42b9ff77364b76a360" dependencies = [ "arboard", - "image", "log", "serde", "serde_json", @@ -6777,9 +6469,9 @@ dependencies = [ [[package]] name = "tauri-plugin-window-state" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd1cef203a15b4772898e7bc8e57c1f34696e39848987dfcd294d51ba0525650" +checksum = "683c8764751fbbcebf3a594bcee24cf84c62773fa0080d1b40fc80698472421e" dependencies = [ "bitflags 2.6.0", "log", @@ -6895,14 +6587,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", - "fastrand 2.1.1", + "fastrand 2.2.0", "once_cell", - "rustix 0.38.37", + "rustix 0.38.39", "windows-sys 0.59.0", ] @@ -6955,7 +6647,7 @@ dependencies = [ "libc", "log", "memmem", - "num-derive 0.3.3", + "num-derive", "num-traits", "ordered-float", "regex", @@ -6985,22 +6677,22 @@ checksum = "a38c90d48152c236a3ab59271da4f4ae63d678c5d7ad6b7714d7cb9760be5e4b" [[package]] name = "thiserror" -version = "1.0.65" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.65" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -7104,9 +6796,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", @@ -7139,7 +6831,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -7388,7 +7080,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -7567,27 +7259,12 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" - [[package]] name = "unicode-ident" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-segmentation" version = "1.12.0" @@ -7617,9 +7294,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", @@ -7683,17 +7360,6 @@ dependencies = [ "serde", ] -[[package]] -name = "v_frame" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" -dependencies = [ - "aligned-vec", - "num-traits", - "wasm-bindgen", -] - [[package]] name = "valuable" version = "0.1.0" @@ -7835,7 +7501,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "wasm-bindgen-shared", ] @@ -7869,7 +7535,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7901,7 +7567,7 @@ checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" dependencies = [ "cc", "downcast-rs", - "rustix 0.38.37", + "rustix 0.38.39", "scoped-tls", "smallvec", "wayland-sys", @@ -7914,7 +7580,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" dependencies = [ "bitflags 2.6.0", - "rustix 0.38.37", + "rustix 0.38.39", "wayland-backend", "wayland-scanner", ] @@ -8038,7 +7704,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8067,7 +7733,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.37", + "rustix 0.38.39", ] [[package]] @@ -8211,7 +7877,7 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8222,7 +7888,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8233,7 +7899,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8244,7 +7910,7 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8255,7 +7921,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8266,7 +7932,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8661,7 +8327,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ "gethostname", - "rustix 0.38.37", + "rustix 0.38.39", "x11rb-protocol", ] @@ -8679,7 +8345,7 @@ checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", "linux-raw-sys 0.4.14", - "rustix 0.38.37", + "rustix 0.38.39", ] [[package]] @@ -8724,7 +8390,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "synstructure", ] @@ -8737,7 +8403,7 @@ 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.3.0", "async-recursion", @@ -8811,7 +8477,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8831,7 +8497,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "synstructure", ] @@ -8852,7 +8518,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8874,7 +8540,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8948,30 +8614,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "zune-core" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" - -[[package]] -name = "zune-inflate" -version = "0.2.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "zune-jpeg" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16099418600b4d8f028622f73ff6e3deaabdff330fb9a2a131dea781ee8b0768" -dependencies = [ - "zune-core", -] - [[package]] name = "zvariant" version = "4.0.0" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index c751d6cb..a9e7ec93 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -22,7 +22,7 @@ dunce = "1.0" log4rs = "1" nanoid = "0.4" chrono = "0.4" -sysinfo = "0.31.4" +sysinfo = "0.32.0" boa_engine = "0.19.1" serde_json = "1.0" serde_yaml = "0.9" @@ -55,7 +55,7 @@ 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" +reqwest_dav = "=0.1.14" [target.'cfg(windows)'.dependencies] runas = "=1.2.0" deelevate = "0.2.0" diff --git a/src/components/setting/mods/backup-viewer.tsx b/src/components/setting/mods/backup-viewer.tsx index 53926539..5a65594b 100644 --- a/src/components/setting/mods/backup-viewer.tsx +++ b/src/components/setting/mods/backup-viewer.tsx @@ -1,4 +1,10 @@ -import { forwardRef, useImperativeHandle, useState, useRef } from "react"; +import { + forwardRef, + useImperativeHandle, + useState, + useRef, + SVGProps, +} from "react"; import { useTranslation } from "react-i18next"; import { useLockFn } from "ahooks"; import { Typography } from "@mui/material"; @@ -6,7 +12,12 @@ import { useForm } from "react-hook-form"; import { useVerge } from "@/hooks/use-verge"; import { BaseDialog, DialogRef, Notice } from "@/components/base"; import { isValidUrl } from "@/utils/helper"; +import getSystem from "@/utils/get-system"; import { BaseLoadingOverlay } from "@/components/base"; +import dayjs, { Dayjs } from "dayjs"; +import customParseFormat from "dayjs/plugin/customParseFormat"; +dayjs.extend(customParseFormat); + import { TextField, Button, @@ -23,13 +34,24 @@ import { TableContainer, TableHead, TableRow, + TablePagination, } from "@mui/material"; import Visibility from "@mui/icons-material/Visibility"; import VisibilityOff from "@mui/icons-material/VisibilityOff"; import DeleteIcon from "@mui/icons-material/Delete"; import RestoreIcon from "@mui/icons-material/Restore"; -import { createWebdavBackup, saveWebdavConfig } from "@/services/cmds"; -import { save } from "@tauri-apps/plugin-dialog"; + +import { + createWebdavBackup, + listWebDavBackup, + saveWebdavConfig, +} from "@/services/cmds"; + +type BackupFile = IWebDavFile & { + platform: string; + backup_time: Dayjs; + allow_apply: boolean; +}; export const BackupViewer = forwardRef((props, ref) => { const { t } = useTranslation(); @@ -40,10 +62,13 @@ export const BackupViewer = forwardRef((props, ref) => { const [showPassword, setShowPassword] = useState(false); const usernameRef = useRef(null); const passwordRef = useRef(null); + const [backupFiles, setBackupFiles] = useState([]); + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(5); + + const OS = getSystem(); const urlRef = useRef(null); - const [isLoading, setIsLoading] = useState(false); - const { register, handleSubmit, watch } = useForm({ defaultValues: { url: webdav_url, @@ -60,19 +85,47 @@ export const BackupViewer = forwardRef((props, ref) => { webdav_username !== username || webdav_password !== password; - // const backups = [] as any[]; - const backups = [ - { name: "backup1.zip" }, - { name: "backup2.zip" }, - { name: "backup3.zip" }, - ]; useImperativeHandle(ref, () => ({ open: () => { setOpen(true); + if (webdav_url && webdav_username && webdav_password) { + fetchAndSetBackupFiles(); + } }, close: () => setOpen(false), })); + // Handle page change + const handleChangePage = ( + _: React.MouseEvent | null, + page: number + ) => { + console.log(page); + setPage(page); + }; + + // Handle rows per page change + const handleChangeRowsPerPage = (event: any) => { + setRowsPerPage(parseInt(event.target.value, 10)); + setPage(0); // Reset to the first page + }; + + const fetchAndSetBackupFiles = () => { + setIsLoading(true); // Assuming setIsLoading is defined in your component or context to manage loading state + + getAllBackupFiles() + .then((files: BackupFile[]) => { + console.log(files); + setBackupFiles(files); // Assuming setBackupFiles is a state setter function in your component or context + }) + .catch((e) => { + console.error(e); + }) + .finally(() => { + setIsLoading(false); + }); + }; + const checkForm = () => { const username = usernameRef.current?.value; const password = passwordRef.current?.value; @@ -119,6 +172,7 @@ export const BackupViewer = forwardRef((props, ref) => { }) .finally(() => { setIsLoading(false); + fetchAndSetBackupFiles(); }); }; @@ -135,12 +189,39 @@ export const BackupViewer = forwardRef((props, ref) => { }) .finally(() => { setIsLoading(false); + fetchAndSetBackupFiles(); }) .catch((e) => { console.log(e, "backup failed"); Notice.error(t("Backup Failed", { error: e }), 3000); }); }); + + const getAllBackupFiles = async () => { + const files = await listWebDavBackup(); + return files + .map((file) => { + const platform = file.filename.split("-")[0]; + const fileBackupTimeStr = file.filename.match( + /\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}/ + )!; + const backupTime = dayjs(fileBackupTimeStr[0], "YYYY-MM-DD_HH-mm-ss"); + const allowApply = OS === platform; + return { + ...file, + platform, + backup_time: backupTime, + allow_apply: allowApply, + } as BackupFile; + }) + .sort((a, b) => (a.backup_time.isAfter(b.backup_time) ? -1 : 1)); + }; + + const datasource = backupFiles.slice( + page * rowsPerPage, + page * rowsPerPage + rowsPerPage + ); + return ( ((props, ref) => { 文件名称 + 时间 操作 - {backups.length > 0 ? ( - backups?.map((backup, index) => ( + {datasource.length > 0 ? ( + datasource?.map((file, index) => ( - {backup.name} + {file.platform === "windows" ? ( + + ) : file.platform === "linux" ? ( + + ) : ( + + )} + {file.filename} + + + {file.backup_time.fromNow()} ((props, ref) => { )) ) : ( - + ((props, ref) => { height: 150, }} > - + 暂无备份 @@ -322,9 +418,100 @@ export const BackupViewer = forwardRef((props, ref) => { )} + ); }); + +export function LinuxIcon(props: SVGProps) { + return ( + + + + + + + + + + + + + + + + ); +} + +export function WindowsIcon(props: SVGProps) { + return ( + + + + ); +} + +export function MacIcon(props: SVGProps) { + return ( + + + + ); +} From ca97e3a3e69e77206b35312f8968b3945586a8ca Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 9 Nov 2024 06:56:58 +0800 Subject: [PATCH 209/288] chore: update --- src/components/setting/mods/backup-viewer.tsx | 607 ++++++++++-------- src/locales/en.json | 21 +- src/locales/fa.json | 25 +- src/locales/ru.json | 14 +- src/locales/zh.json | 32 +- 5 files changed, 429 insertions(+), 270 deletions(-) diff --git a/src/components/setting/mods/backup-viewer.tsx b/src/components/setting/mods/backup-viewer.tsx index 5a65594b..b410406a 100644 --- a/src/components/setting/mods/backup-viewer.tsx +++ b/src/components/setting/mods/backup-viewer.tsx @@ -4,11 +4,14 @@ import { useState, useRef, SVGProps, + useCallback, + useMemo, + memo, } from "react"; import { useTranslation } from "react-i18next"; import { useLockFn } from "ahooks"; import { Typography } from "@mui/material"; -import { useForm } from "react-hook-form"; +import { useForm, UseFormRegister } from "react-hook-form"; import { useVerge } from "@/hooks/use-verge"; import { BaseDialog, DialogRef, Notice } from "@/components/base"; import { isValidUrl } from "@/utils/helper"; @@ -53,6 +56,36 @@ type BackupFile = IWebDavFile & { allow_apply: boolean; }; +interface BackupTableProps { + datasource: BackupFile[]; + page: number; + rowsPerPage: number; + onPageChange: (event: any, newPage: number) => void; + onRowsPerPageChange: (event: React.ChangeEvent) => void; + totalCount: number; +} + +interface WebDAVConfigFormProps { + onSubmit: (e: React.FormEvent) => void; + initialValues: Partial; + urlRef: React.RefObject; + usernameRef: React.RefObject; + passwordRef: React.RefObject; + showPassword: boolean; + onShowPasswordClick: () => void; + webdavChanged: boolean; + webdavUrl: string | undefined | null; + webdavUsername: string | undefined | null; + webdavPassword: string | undefined | null; + handleBackup: () => Promise; + register: UseFormRegister; +} + +// 将魔法数字和配置提取为常量 +const DEFAULT_ROWS_PER_PAGE = 5; +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); @@ -62,13 +95,16 @@ export const BackupViewer = forwardRef((props, ref) => { const [showPassword, setShowPassword] = useState(false); const usernameRef = useRef(null); const passwordRef = useRef(null); - const [backupFiles, setBackupFiles] = useState([]); - const [page, setPage] = useState(0); - const [rowsPerPage, setRowsPerPage] = useState(5); + const [backupState, setBackupState] = useState({ + files: [] as BackupFile[], + page: 0, + rowsPerPage: DEFAULT_ROWS_PER_PAGE, + isLoading: false, + }); const OS = getSystem(); const urlRef = useRef(null); - const [isLoading, setIsLoading] = useState(false); + const { register, handleSubmit, watch } = useForm({ defaultValues: { url: webdav_url, @@ -96,34 +132,36 @@ export const BackupViewer = forwardRef((props, ref) => { })); // Handle page change - const handleChangePage = ( - _: React.MouseEvent | null, - page: number - ) => { - console.log(page); - setPage(page); - }; + const handleChangePage = useCallback( + (_: React.MouseEvent | null, page: number) => { + setBackupState((prev) => ({ ...prev, page })); + }, + [] + ); // Handle rows per page change - const handleChangeRowsPerPage = (event: any) => { - setRowsPerPage(parseInt(event.target.value, 10)); - setPage(0); // Reset to the first page - }; + const handleChangeRowsPerPage = useCallback( + (event: React.ChangeEvent) => { + setBackupState((prev) => ({ + ...prev, + rowsPerPage: parseInt(event.target.value, 10), + page: 0, + })); + }, + [] + ); - const fetchAndSetBackupFiles = () => { - setIsLoading(true); // Assuming setIsLoading is defined in your component or context to manage loading state - - getAllBackupFiles() - .then((files: BackupFile[]) => { - console.log(files); - setBackupFiles(files); // Assuming setBackupFiles is a state setter function in your component or context - }) - .catch((e) => { - console.error(e); - }) - .finally(() => { - setIsLoading(false); - }); + const fetchAndSetBackupFiles = async () => { + try { + setBackupState((prev) => ({ ...prev, isLoading: true })); + const files = await getAllBackupFiles(); + setBackupState((prev) => ({ ...prev, files })); + } catch (error) { + console.error("Failed to fetch backup files:", error); + Notice.error(t("Failed to fetch backup files")); + } finally { + setBackupState((prev) => ({ ...prev, isLoading: false })); + } }; const checkForm = () => { @@ -132,21 +170,21 @@ export const BackupViewer = forwardRef((props, ref) => { const url = urlRef.current?.value; if (!url) { - Notice.error(t("Webdav url cannot be empty")); + Notice.error(t("WebDAV URL Required")); urlRef.current?.focus(); return; } else if (!isValidUrl(url)) { - Notice.error(t("Webdav address must be url")); + Notice.error(t("Invalid WebDAV URL")); urlRef.current?.focus(); return; } if (!username) { - Notice.error(t("Username cannot be empty")); + Notice.error(t("Username Required")); usernameRef.current?.focus(); return; } if (!password) { - Notice.error(t("Password cannot be empty")); + Notice.error(t("Password Required")); passwordRef.current?.focus(); return; } @@ -154,7 +192,7 @@ export const BackupViewer = forwardRef((props, ref) => { const submit = async (data: IWebDavConfig) => { checkForm(); - setIsLoading(true); + setBackupState((prev) => ({ ...prev, isLoading: true })); await saveWebdavConfig(data.url, data.username, data.password) .then(() => { mutateVerge( @@ -165,36 +203,34 @@ export const BackupViewer = forwardRef((props, ref) => { }, false ); - Notice.success(t("Webdav Config Saved Successfully"), 1500); + Notice.success(t("WebDAV Config Saved")); }) .catch((e) => { - Notice.error(t("Webdav Config Save Failed", { error: e }), 3000); + Notice.error(t("WebDAV Config Save Failed", { error: e }), 3000); }) .finally(() => { - setIsLoading(false); + setBackupState((prev) => ({ ...prev, isLoading: false })); fetchAndSetBackupFiles(); }); }; - const handleClickShowPassword = () => { - setShowPassword(!showPassword); - }; + const handleClickShowPassword = useCallback(() => { + setShowPassword((prev) => !prev); + }, []); const handleBackup = useLockFn(async () => { - checkForm(); - setIsLoading(true); - await createWebdavBackup() - .then(() => { - Notice.success(t("Backup Successfully"), 1500); - }) - .finally(() => { - setIsLoading(false); - fetchAndSetBackupFiles(); - }) - .catch((e) => { - console.log(e, "backup failed"); - Notice.error(t("Backup Failed", { error: e }), 3000); - }); + try { + checkForm(); + setBackupState((prev) => ({ ...prev, isLoading: true })); + await createWebdavBackup(); + Notice.success(t("Backup Created")); + await fetchAndSetBackupFiles(); + } catch (error) { + console.error("Backup failed:", error); + Notice.error(t("Backup Failed", { error })); + } finally { + setBackupState((prev) => ({ ...prev, isLoading: false })); + } }); const getAllBackupFiles = async () => { @@ -202,10 +238,8 @@ export const BackupViewer = forwardRef((props, ref) => { return files .map((file) => { const platform = file.filename.split("-")[0]; - const fileBackupTimeStr = file.filename.match( - /\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}/ - )!; - const backupTime = dayjs(fileBackupTimeStr[0], "YYYY-MM-DD_HH-mm-ss"); + const fileBackupTimeStr = file.filename.match(FILENAME_PATTERN)!; + const backupTime = dayjs(fileBackupTimeStr[0], DATE_FORMAT); const allowApply = OS === platform; return { ...file, @@ -217,10 +251,17 @@ export const BackupViewer = forwardRef((props, ref) => { .sort((a, b) => (a.backup_time.isAfter(b.backup_time) ? -1 : 1)); }; - const datasource = backupFiles.slice( - page * rowsPerPage, - page * rowsPerPage + rowsPerPage - ); + const datasource = useMemo(() => { + return backupState.files.slice( + backupState.page * backupState.rowsPerPage, + backupState.page * backupState.rowsPerPage + backupState.rowsPerPage + ); + }, [backupState.files, backupState.page, backupState.rowsPerPage]); + + const onFormSubmit = (e: React.FormEvent) => { + e.preventDefault(); + handleSubmit(submit)(e); + }; return ( ((props, ref) => { onCancel={() => setOpen(false)} > - + -
- - - - {/* WebDAV Server Address */} - - - - - {/* Username and Password */} - - - - - - - {showPassword ? ( - - ) : ( - - )} - - - ), - }} - /> - - - - - - - {webdavChanged || - webdav_url === null || - webdav_username == null || - webdav_password == null ? ( - - ) : ( - - )} - - - -
+ - - - - - 文件名称 - 时间 - 操作 - - - - {datasource.length > 0 ? ( - datasource?.map((file, index) => ( - - - {file.platform === "windows" ? ( - - ) : file.platform === "linux" ? ( - - ) : ( - - )} - {file.filename} - - - {file.backup_time.fromNow()} - - - - - - - - - - - - - - - )) - ) : ( - - - - - 暂无备份 - - - - - )} - -
- -
+ handleChangePage(null, page)} + onRowsPerPageChange={handleChangeRowsPerPage} + totalCount={backupState.files.length} + />
); }); +const BackupTable = memo( + ({ + datasource, + page, + rowsPerPage, + onPageChange, + onRowsPerPageChange, + totalCount, + }: BackupTableProps) => { + const { t } = useTranslation(); + return ( + + + + + {t("Filename")} + {t("Time")} + {t("Actions")} + + + + {datasource.length > 0 ? ( + datasource?.map((file, index) => ( + + + {file.platform === "windows" ? ( + + ) : file.platform === "linux" ? ( + + ) : ( + + )} + {file.filename} + + + {file.backup_time.fromNow()} + + + + + + + + + + + + + + )) + ) : ( + + + + + {t("No Backups")} + + + + + )} + +
+ +
+ ); + } +); + +const WebDAVConfigForm = memo( + ({ + onSubmit, + initialValues, + urlRef, + usernameRef, + passwordRef, + showPassword, + onShowPasswordClick, + webdavChanged, + webdavUrl, + webdavUsername, + webdavPassword, + handleBackup, + register, + }: WebDAVConfigFormProps) => { + const { t } = useTranslation(); + return ( +
+ + + + + + + + + + + + + {showPassword ? : } + + + ), + }} + /> + + + + + + {webdavChanged || + webdavUrl === null || + webdavUsername == null || + webdavPassword == null ? ( + + ) : ( + + )} + + + +
+ ); + } +); + export function LinuxIcon(props: SVGProps) { return ( Date: Sat, 9 Nov 2024 08:59:30 +0800 Subject: [PATCH 210/288] fix: translation --- README.md | 14 +- src/components/setting/mods/backup-viewer.tsx | 607 ++++++++++-------- src/locales/en.json | 21 +- src/locales/fa.json | 29 +- src/locales/ru.json | 23 +- src/locales/zh.json | 21 +- 6 files changed, 446 insertions(+), 269 deletions(-) diff --git a/README.md b/README.md index 091c12db..0a3a9083 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Supports Windows (x64/x86), Linux (x64/arm64) and macOS 10.15+ (intel/apple). [狗狗加速 —— 技术流机场 Doggygo VPN](https://verge.dginv.click/#/register?code=oaxsAGo6) - 高性能海外机场,免费试用,优惠套餐,解锁流媒体,全球首家支持 Hysteria 协议。 -- 使用 Clash Verge 专属邀请链接注册送 3 天,每天 1G 流量免费试用:https://verge.dginv.click/#/register?code=oaxsAGo6 +- 使用 Clash Verge 专属邀请链接注册送 3 天,每天 1G 流量免费试用:[点此注册](https://verge.dginv.click/#/register?code=oaxsAGo6) - Clash Verge 专属 8 折优惠码: verge20 (仅有 500 份) - 优惠套餐每月仅需 15.8 元,160G 流量,年付 8 折 - 海外团队,无跑路风险,高达 50% 返佣 @@ -43,11 +43,13 @@ Supports Windows (x64/x86), Linux (x64/arm64) and macOS 10.15+ (intel/apple). ## Features -- Since the clash core has been removed. The project no longer maintains the clash core, but only the Clash Meta core. -- Profiles management and enhancement (by yaml and Javascript). [Doc](https://clash-verge-rev.github.io) -- Improved UI and supports custom theme color. -- Built-in support [Clash.Meta(mihomo)](https://github.com/MetaCubeX/mihomo) core. -- System proxy setting and guard. +- 基于性能强劲的 Rust 和 Tauri 2 框架 +- 内置[Clash.Meta(mihomo)](https://github.com/MetaCubeX/mihomo)内核,并支持切换 `Alpha` 版本内核。 +- 简洁美观的用户界面,支持自定义主题颜色、代理组/托盘图标以及 `CSS Injection`。 +- 配置文件管理和增强(Merge 和 Script),配置文件语法提示。 +- 系统代理和守卫、`TUN(虚拟网卡)` 模式。 +- 可视化节点和规则编辑 +- WebDav 配置备份和同步 ### FAQ diff --git a/src/components/setting/mods/backup-viewer.tsx b/src/components/setting/mods/backup-viewer.tsx index 5a65594b..b410406a 100644 --- a/src/components/setting/mods/backup-viewer.tsx +++ b/src/components/setting/mods/backup-viewer.tsx @@ -4,11 +4,14 @@ import { useState, useRef, SVGProps, + useCallback, + useMemo, + memo, } from "react"; import { useTranslation } from "react-i18next"; import { useLockFn } from "ahooks"; import { Typography } from "@mui/material"; -import { useForm } from "react-hook-form"; +import { useForm, UseFormRegister } from "react-hook-form"; import { useVerge } from "@/hooks/use-verge"; import { BaseDialog, DialogRef, Notice } from "@/components/base"; import { isValidUrl } from "@/utils/helper"; @@ -53,6 +56,36 @@ type BackupFile = IWebDavFile & { allow_apply: boolean; }; +interface BackupTableProps { + datasource: BackupFile[]; + page: number; + rowsPerPage: number; + onPageChange: (event: any, newPage: number) => void; + onRowsPerPageChange: (event: React.ChangeEvent) => void; + totalCount: number; +} + +interface WebDAVConfigFormProps { + onSubmit: (e: React.FormEvent) => void; + initialValues: Partial; + urlRef: React.RefObject; + usernameRef: React.RefObject; + passwordRef: React.RefObject; + showPassword: boolean; + onShowPasswordClick: () => void; + webdavChanged: boolean; + webdavUrl: string | undefined | null; + webdavUsername: string | undefined | null; + webdavPassword: string | undefined | null; + handleBackup: () => Promise; + register: UseFormRegister; +} + +// 将魔法数字和配置提取为常量 +const DEFAULT_ROWS_PER_PAGE = 5; +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); @@ -62,13 +95,16 @@ export const BackupViewer = forwardRef((props, ref) => { const [showPassword, setShowPassword] = useState(false); const usernameRef = useRef(null); const passwordRef = useRef(null); - const [backupFiles, setBackupFiles] = useState([]); - const [page, setPage] = useState(0); - const [rowsPerPage, setRowsPerPage] = useState(5); + const [backupState, setBackupState] = useState({ + files: [] as BackupFile[], + page: 0, + rowsPerPage: DEFAULT_ROWS_PER_PAGE, + isLoading: false, + }); const OS = getSystem(); const urlRef = useRef(null); - const [isLoading, setIsLoading] = useState(false); + const { register, handleSubmit, watch } = useForm({ defaultValues: { url: webdav_url, @@ -96,34 +132,36 @@ export const BackupViewer = forwardRef((props, ref) => { })); // Handle page change - const handleChangePage = ( - _: React.MouseEvent | null, - page: number - ) => { - console.log(page); - setPage(page); - }; + const handleChangePage = useCallback( + (_: React.MouseEvent | null, page: number) => { + setBackupState((prev) => ({ ...prev, page })); + }, + [] + ); // Handle rows per page change - const handleChangeRowsPerPage = (event: any) => { - setRowsPerPage(parseInt(event.target.value, 10)); - setPage(0); // Reset to the first page - }; + const handleChangeRowsPerPage = useCallback( + (event: React.ChangeEvent) => { + setBackupState((prev) => ({ + ...prev, + rowsPerPage: parseInt(event.target.value, 10), + page: 0, + })); + }, + [] + ); - const fetchAndSetBackupFiles = () => { - setIsLoading(true); // Assuming setIsLoading is defined in your component or context to manage loading state - - getAllBackupFiles() - .then((files: BackupFile[]) => { - console.log(files); - setBackupFiles(files); // Assuming setBackupFiles is a state setter function in your component or context - }) - .catch((e) => { - console.error(e); - }) - .finally(() => { - setIsLoading(false); - }); + const fetchAndSetBackupFiles = async () => { + try { + setBackupState((prev) => ({ ...prev, isLoading: true })); + const files = await getAllBackupFiles(); + setBackupState((prev) => ({ ...prev, files })); + } catch (error) { + console.error("Failed to fetch backup files:", error); + Notice.error(t("Failed to fetch backup files")); + } finally { + setBackupState((prev) => ({ ...prev, isLoading: false })); + } }; const checkForm = () => { @@ -132,21 +170,21 @@ export const BackupViewer = forwardRef((props, ref) => { const url = urlRef.current?.value; if (!url) { - Notice.error(t("Webdav url cannot be empty")); + Notice.error(t("WebDAV URL Required")); urlRef.current?.focus(); return; } else if (!isValidUrl(url)) { - Notice.error(t("Webdav address must be url")); + Notice.error(t("Invalid WebDAV URL")); urlRef.current?.focus(); return; } if (!username) { - Notice.error(t("Username cannot be empty")); + Notice.error(t("Username Required")); usernameRef.current?.focus(); return; } if (!password) { - Notice.error(t("Password cannot be empty")); + Notice.error(t("Password Required")); passwordRef.current?.focus(); return; } @@ -154,7 +192,7 @@ export const BackupViewer = forwardRef((props, ref) => { const submit = async (data: IWebDavConfig) => { checkForm(); - setIsLoading(true); + setBackupState((prev) => ({ ...prev, isLoading: true })); await saveWebdavConfig(data.url, data.username, data.password) .then(() => { mutateVerge( @@ -165,36 +203,34 @@ export const BackupViewer = forwardRef((props, ref) => { }, false ); - Notice.success(t("Webdav Config Saved Successfully"), 1500); + Notice.success(t("WebDAV Config Saved")); }) .catch((e) => { - Notice.error(t("Webdav Config Save Failed", { error: e }), 3000); + Notice.error(t("WebDAV Config Save Failed", { error: e }), 3000); }) .finally(() => { - setIsLoading(false); + setBackupState((prev) => ({ ...prev, isLoading: false })); fetchAndSetBackupFiles(); }); }; - const handleClickShowPassword = () => { - setShowPassword(!showPassword); - }; + const handleClickShowPassword = useCallback(() => { + setShowPassword((prev) => !prev); + }, []); const handleBackup = useLockFn(async () => { - checkForm(); - setIsLoading(true); - await createWebdavBackup() - .then(() => { - Notice.success(t("Backup Successfully"), 1500); - }) - .finally(() => { - setIsLoading(false); - fetchAndSetBackupFiles(); - }) - .catch((e) => { - console.log(e, "backup failed"); - Notice.error(t("Backup Failed", { error: e }), 3000); - }); + try { + checkForm(); + setBackupState((prev) => ({ ...prev, isLoading: true })); + await createWebdavBackup(); + Notice.success(t("Backup Created")); + await fetchAndSetBackupFiles(); + } catch (error) { + console.error("Backup failed:", error); + Notice.error(t("Backup Failed", { error })); + } finally { + setBackupState((prev) => ({ ...prev, isLoading: false })); + } }); const getAllBackupFiles = async () => { @@ -202,10 +238,8 @@ export const BackupViewer = forwardRef((props, ref) => { return files .map((file) => { const platform = file.filename.split("-")[0]; - const fileBackupTimeStr = file.filename.match( - /\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}/ - )!; - const backupTime = dayjs(fileBackupTimeStr[0], "YYYY-MM-DD_HH-mm-ss"); + const fileBackupTimeStr = file.filename.match(FILENAME_PATTERN)!; + const backupTime = dayjs(fileBackupTimeStr[0], DATE_FORMAT); const allowApply = OS === platform; return { ...file, @@ -217,10 +251,17 @@ export const BackupViewer = forwardRef((props, ref) => { .sort((a, b) => (a.backup_time.isAfter(b.backup_time) ? -1 : 1)); }; - const datasource = backupFiles.slice( - page * rowsPerPage, - page * rowsPerPage + rowsPerPage - ); + const datasource = useMemo(() => { + return backupState.files.slice( + backupState.page * backupState.rowsPerPage, + backupState.page * backupState.rowsPerPage + backupState.rowsPerPage + ); + }, [backupState.files, backupState.page, backupState.rowsPerPage]); + + const onFormSubmit = (e: React.FormEvent) => { + e.preventDefault(); + handleSubmit(submit)(e); + }; return ( ((props, ref) => { onCancel={() => setOpen(false)} > - + -
- - - - {/* WebDAV Server Address */} - - - - - {/* Username and Password */} - - - - - - - {showPassword ? ( - - ) : ( - - )} - - - ), - }} - /> - - - - - - - {webdavChanged || - webdav_url === null || - webdav_username == null || - webdav_password == null ? ( - - ) : ( - - )} - - - -
+ - -
- - - 文件名称 - 时间 - 操作 - - - - {datasource.length > 0 ? ( - datasource?.map((file, index) => ( - - - {file.platform === "windows" ? ( - - ) : file.platform === "linux" ? ( - - ) : ( - - )} - {file.filename} - - - {file.backup_time.fromNow()} - - - - - - - - - - - - - - - )) - ) : ( - - - - - 暂无备份 - - - - - )} - -
- - + handleChangePage(null, page)} + onRowsPerPageChange={handleChangeRowsPerPage} + totalCount={backupState.files.length} + /> ); }); +const BackupTable = memo( + ({ + datasource, + page, + rowsPerPage, + onPageChange, + onRowsPerPageChange, + totalCount, + }: BackupTableProps) => { + const { t } = useTranslation(); + return ( + + + + + {t("Filename")} + {t("Time")} + {t("Actions")} + + + + {datasource.length > 0 ? ( + datasource?.map((file, index) => ( + + + {file.platform === "windows" ? ( + + ) : file.platform === "linux" ? ( + + ) : ( + + )} + {file.filename} + + + {file.backup_time.fromNow()} + + + + + + + + + + + + + + )) + ) : ( + + + + + {t("No Backups")} + + + + + )} + +
+ +
+ ); + } +); + +const WebDAVConfigForm = memo( + ({ + onSubmit, + initialValues, + urlRef, + usernameRef, + passwordRef, + showPassword, + onShowPasswordClick, + webdavChanged, + webdavUrl, + webdavUsername, + webdavPassword, + handleBackup, + register, + }: WebDAVConfigFormProps) => { + const { t } = useTranslation(); + return ( +
+ + + + + + + + + + + + + {showPassword ? : } + + + ), + }} + /> + + + + + + {webdavChanged || + webdavUrl === null || + webdavUsername == null || + webdavPassword == null ? ( + + ) : ( + + )} + + + +
+ ); + } +); + export function LinuxIcon(props: SVGProps) { return ( Date: Sat, 9 Nov 2024 12:13:50 +0800 Subject: [PATCH 211/288] chore: update --- src/components/setting/mods/backup-viewer.tsx | 2 +- src/locales/en.json | 3 ++- src/locales/fa.json | 5 +++-- src/locales/ru.json | 3 ++- src/locales/zh.json | 3 ++- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/components/setting/mods/backup-viewer.tsx b/src/components/setting/mods/backup-viewer.tsx index b410406a..492c4c52 100644 --- a/src/components/setting/mods/backup-viewer.tsx +++ b/src/components/setting/mods/backup-viewer.tsx @@ -327,7 +327,7 @@ const BackupTable = memo( {t("Filename")} - {t("Time")} + {t("Backup Time")} {t("Actions")} diff --git a/src/locales/en.json b/src/locales/en.json index 3ba5eb8e..8858e135 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -390,5 +390,6 @@ "Backup Created": "Backup created successfully", "Backup Failed": "Failed to create backup", "Delete Backup": "Delete Backup", - "Restore Backup": "Restore Backup" + "Restore Backup": "Restore Backup", + "Backup Time": "Backup Time" } diff --git a/src/locales/fa.json b/src/locales/fa.json index 3aa49480..6769e674 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -113,7 +113,7 @@ "select": "انتخاب پروکسی به صورت دستی", "url-test": "انتخاب پروکسی بر اساس تأخیر آزمایش URL", "fallback": "تعویض به پروکسی دیگر در صورت بروز خطا", - "load-balance": "توزیع پروکسی بر اساس توازن بار", + "load-balance": "توزیع ��روکسی بر اساس توازن بار", "relay": "عبور از زنجیره پروکسی تعریف شده", "Group Name": "نام گروه", "Use Proxies": "استفاده از پروکسی‌ها", @@ -390,5 +390,6 @@ "Backup Created": "پشتیبان‌گیری با موفقیت ایجاد شد", "Backup Failed": "ایجاد پشتیبان ناموفق بود", "Delete Backup": "حذف پشتیبان", - "Restore Backup": "بازیابی پشتیبان" + "Restore Backup": "بازیابی پشتیبان", + "Backup Time": "زمان پشتیبان‌گیری" } diff --git a/src/locales/ru.json b/src/locales/ru.json index b8732406..297117dd 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -390,5 +390,6 @@ "Backup Created": "Резервная копия успешно создана", "Backup Failed": "Не удалось создать резервную копию", "Delete Backup": "Удалить резервную копию", - "Restore Backup": "Восстановить резервную копию" + "Restore Backup": "Восстановить резервную копию", + "Backup Time": "Время резервного копирования" } diff --git a/src/locales/zh.json b/src/locales/zh.json index b7e355a4..6a4e2188 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -390,5 +390,6 @@ "Backup Created": "备份创建成功", "Backup Failed": "备份创建失败", "Delete Backup": "删除备份", - "Restore Backup": "恢复备份" + "Restore Backup": "恢复备份", + "Backup Time": "备份时间" } From 3759239dac9e97ee2919df4e2398b87f8a5faae8 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 9 Nov 2024 23:11:02 +0800 Subject: [PATCH 212/288] feat: add webdav backup --- src-tauri/Cargo.toml | 2 +- src-tauri/src/cmds.rs | 25 +- src-tauri/src/core/backup.rs | 48 +- src-tauri/src/core/core.rs | 1 + src-tauri/src/core/tray.rs | 17 +- src-tauri/src/feat.rs | 45 +- src-tauri/src/lib.rs | 5 +- .../setting/mods/backup-config-viewer.tsx | 220 +++++++ .../setting/mods/backup-table-viewer.tsx | 266 ++++++++ src/components/setting/mods/backup-viewer.tsx | 586 ++---------------- .../setting/mods/clash-core-viewer.tsx | 4 +- src/locales/en.json | 10 +- src/locales/fa.json | 10 +- src/locales/ru.json | 10 +- src/locales/zh.json | 14 +- src/services/cmds.ts | 17 +- 16 files changed, 703 insertions(+), 577 deletions(-) create mode 100644 src/components/setting/mods/backup-config-viewer.tsx create mode 100644 src/components/setting/mods/backup-table-viewer.tsx diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index a9e7ec93..dc5126fb 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -55,7 +55,7 @@ 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" +reqwest_dav = "0.1.14" [target.'cfg(windows)'.dependencies] runas = "=1.2.0" deelevate = "0.2.0" diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index d532aa63..5a71440f 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -185,7 +185,7 @@ pub async fn change_clash_core(clash_core: Option) -> CmdResult { /// restart the sidecar #[tauri::command] -pub async fn restart_sidecar() -> CmdResult { +pub async fn restart_core() -> CmdResult { wrap_err!(CoreManager::global().restart_core().await) } @@ -396,15 +396,28 @@ pub async fn save_webdav_config(url: String, username: String, password: String) #[tauri::command] pub async fn create_webdav_backup() -> CmdResult<()> { - feat::create_backup_and_upload_webdav() - .await - .map_err(|err| err.to_string())?; - Ok(()) + wrap_err!(feat::create_backup_and_upload_webdav().await) } #[tauri::command] pub async fn list_webdav_backup() -> CmdResult> { - feat::list_wevdav_backup().await.map_err(|e| e.to_string()) + wrap_err!(feat::list_wevdav_backup().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(()) } pub mod service { diff --git a/src-tauri/src/core/backup.rs b/src-tauri/src/core/backup.rs index c1604359..f5e5d766 100644 --- a/src-tauri/src/core/backup.rs +++ b/src-tauri/src/core/backup.rs @@ -40,14 +40,27 @@ impl WebDavClient { 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) + .build() + .unwrap(), + ) .set_host(url.to_owned()) .set_auth(reqwest_dav::Auth::Basic( username.to_owned(), password.to_owned(), )) .build()?; + if let Err(_) = client + .list(dirs::BACKUP_DIR, reqwest_dav::Depth::Number(0)) + .await + { + client.mkcol(dirs::BACKUP_DIR).await?; + } + *self.client.lock() = Some(client.clone()); } Ok(self.client.lock().clone().unwrap()) @@ -61,10 +74,6 @@ impl WebDavClient { pub async fn upload(&self, file_path: PathBuf, file_name: String) -> Result<(), Error> { let client = self.get_client().await?; - if client.get(dirs::BACKUP_DIR).await.is_err() { - client.mkcol(dirs::BACKUP_DIR).await?; - } - let webdav_path: String = format!("{}/{}", dirs::BACKUP_DIR, file_name); client .put(webdav_path.as_ref(), fs::read(file_path)?) @@ -72,7 +81,16 @@ impl WebDavClient { Ok(()) } - pub async fn list_files(&self) -> Result, Error> { + 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 files = client .list(dirs::BACKUP_DIR, reqwest_dav::Depth::Number(1)) @@ -85,6 +103,13 @@ impl WebDavClient { } 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> { @@ -109,8 +134,17 @@ pub fn create_backup() -> Result<(String, PathBuf), Error> { } 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(fs::read(dirs::verge_path()?)?.as_slice())?; + 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()?; diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index ea02df95..947fa56f 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -87,6 +87,7 @@ impl CoreManager { service::stop_core_by_service().await?; } *running = false; + Ok(()) } diff --git a/src-tauri/src/core/tray.rs b/src-tauri/src/core/tray.rs index 834cdb2a..7e69c0f9 100644 --- a/src-tauri/src/core/tray.rs +++ b/src-tauri/src/core/tray.rs @@ -1,14 +1,14 @@ use crate::{ cmds, config::Config, - core::CoreManager, - feat, log_err, t, + feat, t, utils::{ dirs, resolve::{self, VERSION}, }, }; use anyhow::Result; +use tauri::AppHandle; use tauri::{ menu::CheckMenuItem, tray::{MouseButton, MouseButtonState, TrayIconEvent, TrayIconId}, @@ -17,7 +17,6 @@ use tauri::{ menu::{MenuEvent, MenuItem, PredefinedMenuItem, Submenu}, Wry, }; -use tauri::{AppHandle, Manager}; use super::handle; pub struct Tray {} @@ -408,7 +407,7 @@ fn create_tray_menu( 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]; @@ -423,15 +422,7 @@ fn on_menu_event(app_handle: &AppHandle, event: MenuEvent) { "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::async_runtime::block_on(async move { - log_err!(CoreManager::global().stop_core().await); - }); - resolve::resolve_reset(); - //睡1秒再重启 - std::thread::sleep(std::time::Duration::from_secs(1)); - tauri::process::restart(&app_handle.env()); - } + "restart_app" => feat::restart_app(), "quit" => { println!("quit"); feat::quit(Some(0)); diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index c28108f6..9374e2aa 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -7,10 +7,13 @@ 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 std::fs; +use tauri::Manager; use tauri_plugin_clipboard_manager::ClipboardExt; // 打开面板 @@ -40,6 +43,18 @@ 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)); + tauri::process::restart(&app_handle.env()); + }); +} + // 切换模式 rule/global/direct/script mode pub fn change_clash_mode(mode: String) { let mut mapping = Mapping::new(); @@ -425,11 +440,37 @@ pub async fn create_backup_and_upload_webdav() -> Result<()> { } 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() - .list_files() + .delete(filename) .await .map_err(|err| { - log::error!(target: "app", "Failed to list WebDAV backup files: {:#?}", 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 index 1d3ccec1..bf572749 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -84,7 +84,8 @@ pub fn run() { cmds::get_portable_flag, cmds::get_network_interfaces, // cmds::kill_sidecar, - cmds::restart_sidecar, + cmds::restart_core, + cmds::restart_app, // clash cmds::get_clash_info, cmds::get_clash_logs, @@ -128,6 +129,8 @@ pub fn run() { cmds::create_webdav_backup, cmds::save_webdav_config, cmds::list_webdav_backup, + cmds::delete_webdav_backup, + cmds::restore_webdav_backup, ]); #[cfg(debug_assertions)] 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..fe4b99c2 --- /dev/null +++ b/src/components/setting/mods/backup-config-viewer.tsx @@ -0,0 +1,220 @@ +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, + Grid, + 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; + onInit: () => Promise; + setLoading: (loading: boolean) => void; +} + +export const BackupConfigViewer = memo( + ({ + onBackupSuccess, + onSaveSuccess, + 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; + + 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, data.username, 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 === null || + webdav_username == null || + webdav_password == null ? ( + + ) : ( + + )} + + + +
+ ); + } +); 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..ef1b7b7f --- /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 index 492c4c52..a21eb58c 100644 --- a/src/components/setting/mods/backup-viewer.tsx +++ b/src/components/setting/mods/backup-viewer.tsx @@ -2,87 +2,25 @@ import { forwardRef, useImperativeHandle, useState, - useRef, - SVGProps, useCallback, - useMemo, - memo, + useEffect, } from "react"; import { useTranslation } from "react-i18next"; -import { useLockFn } from "ahooks"; -import { Typography } from "@mui/material"; -import { useForm, UseFormRegister } from "react-hook-form"; -import { useVerge } from "@/hooks/use-verge"; -import { BaseDialog, DialogRef, Notice } from "@/components/base"; -import { isValidUrl } from "@/utils/helper"; +import { BaseDialog, DialogRef } from "@/components/base"; import getSystem from "@/utils/get-system"; import { BaseLoadingOverlay } from "@/components/base"; -import dayjs, { Dayjs } from "dayjs"; +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); -import { - TextField, - Button, - Grid, - Box, - Paper, - Stack, - IconButton, - InputAdornment, - Divider, - Table, - TableBody, - TableCell, - TableContainer, - TableHead, - TableRow, - TablePagination, -} from "@mui/material"; -import Visibility from "@mui/icons-material/Visibility"; -import VisibilityOff from "@mui/icons-material/VisibilityOff"; -import DeleteIcon from "@mui/icons-material/Delete"; -import RestoreIcon from "@mui/icons-material/Restore"; - -import { - createWebdavBackup, - listWebDavBackup, - saveWebdavConfig, -} from "@/services/cmds"; - -type BackupFile = IWebDavFile & { - platform: string; - backup_time: Dayjs; - allow_apply: boolean; -}; - -interface BackupTableProps { - datasource: BackupFile[]; - page: number; - rowsPerPage: number; - onPageChange: (event: any, newPage: number) => void; - onRowsPerPageChange: (event: React.ChangeEvent) => void; - totalCount: number; -} - -interface WebDAVConfigFormProps { - onSubmit: (e: React.FormEvent) => void; - initialValues: Partial; - urlRef: React.RefObject; - usernameRef: React.RefObject; - passwordRef: React.RefObject; - showPassword: boolean; - onShowPasswordClick: () => void; - webdavChanged: boolean; - webdavUrl: string | undefined | null; - webdavUsername: string | undefined | null; - webdavPassword: string | undefined | null; - handleBackup: () => Promise; - register: UseFormRegister; -} - -// 将魔法数字和配置提取为常量 -const DEFAULT_ROWS_PER_PAGE = 5; const DATE_FORMAT = "YYYY-MM-DD_HH-mm-ss"; const FILENAME_PATTERN = /\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}/; @@ -90,43 +28,17 @@ export const BackupViewer = forwardRef((props, ref) => { const { t } = useTranslation(); const [open, setOpen] = useState(false); - const { verge, mutateVerge } = useVerge(); - const { webdav_url, webdav_username, webdav_password } = verge || {}; - const [showPassword, setShowPassword] = useState(false); - const usernameRef = useRef(null); - const passwordRef = useRef(null); - const [backupState, setBackupState] = useState({ - files: [] as BackupFile[], - page: 0, - rowsPerPage: DEFAULT_ROWS_PER_PAGE, - isLoading: 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(); - 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; useImperativeHandle(ref, () => ({ open: () => { setOpen(true); - if (webdav_url && webdav_username && webdav_password) { - fetchAndSetBackupFiles(); - } }, close: () => setOpen(false), })); @@ -134,111 +46,37 @@ export const BackupViewer = forwardRef((props, ref) => { // Handle page change const handleChangePage = useCallback( (_: React.MouseEvent | null, page: number) => { - setBackupState((prev) => ({ ...prev, page })); - }, - [] - ); - - // Handle rows per page change - const handleChangeRowsPerPage = useCallback( - (event: React.ChangeEvent) => { - setBackupState((prev) => ({ - ...prev, - rowsPerPage: parseInt(event.target.value, 10), - page: 0, - })); + setPage(page); }, [] ); const fetchAndSetBackupFiles = async () => { try { - setBackupState((prev) => ({ ...prev, isLoading: true })); + setIsLoading(true); const files = await getAllBackupFiles(); - setBackupState((prev) => ({ ...prev, files })); + setBackupFiles(files); + setTotal(files.length); } catch (error) { - console.error("Failed to fetch backup files:", error); - Notice.error(t("Failed to fetch backup files")); + console.error(error); + // Notice.error(t("Failed to fetch backup files")); } finally { - setBackupState((prev) => ({ ...prev, isLoading: false })); + setIsLoading(false); } }; - const checkForm = () => { - const username = usernameRef.current?.value; - const password = passwordRef.current?.value; - const url = urlRef.current?.value; - - if (!url) { - Notice.error(t("WebDAV URL Required")); - urlRef.current?.focus(); - return; - } else if (!isValidUrl(url)) { - Notice.error(t("Invalid WebDAV URL")); - urlRef.current?.focus(); - return; - } - if (!username) { - Notice.error(t("Username Required")); - usernameRef.current?.focus(); - return; - } - if (!password) { - Notice.error(t("Password Required")); - passwordRef.current?.focus(); - return; - } - }; - - const submit = async (data: IWebDavConfig) => { - checkForm(); - setBackupState((prev) => ({ ...prev, isLoading: true })); - await saveWebdavConfig(data.url, data.username, data.password) - .then(() => { - mutateVerge( - { - webdav_url: data.url, - webdav_username: data.username, - webdav_password: data.password, - }, - false - ); - Notice.success(t("WebDAV Config Saved")); - }) - .catch((e) => { - Notice.error(t("WebDAV Config Save Failed", { error: e }), 3000); - }) - .finally(() => { - setBackupState((prev) => ({ ...prev, isLoading: false })); - fetchAndSetBackupFiles(); - }); - }; - - const handleClickShowPassword = useCallback(() => { - setShowPassword((prev) => !prev); - }, []); - - const handleBackup = useLockFn(async () => { - try { - checkForm(); - setBackupState((prev) => ({ ...prev, isLoading: true })); - await createWebdavBackup(); - Notice.success(t("Backup Created")); - await fetchAndSetBackupFiles(); - } catch (error) { - console.error("Backup failed:", error); - Notice.error(t("Backup Failed", { error })); - } finally { - setBackupState((prev) => ({ ...prev, isLoading: 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)!; + console.log(file, fileBackupTimeStr); + + if (fileBackupTimeStr === null) { + return null; + } + const backupTime = dayjs(fileBackupTimeStr[0], DATE_FORMAT); const allowApply = OS === platform; return { @@ -248,365 +86,55 @@ export const BackupViewer = forwardRef((props, ref) => { allow_apply: allowApply, } as BackupFile; }) + .filter((item) => item !== null) .sort((a, b) => (a.backup_time.isAfter(b.backup_time) ? -1 : 1)); }; - const datasource = useMemo(() => { - return backupState.files.slice( - backupState.page * backupState.rowsPerPage, - backupState.page * backupState.rowsPerPage + backupState.rowsPerPage + useEffect(() => { + setDataSource( + backupFiles.slice( + page * DEFAULT_ROWS_PER_PAGE, + page * DEFAULT_ROWS_PER_PAGE + DEFAULT_ROWS_PER_PAGE + ) ); - }, [backupState.files, backupState.page, backupState.rowsPerPage]); - - const onFormSubmit = (e: React.FormEvent) => { - e.preventDefault(); - handleSubmit(submit)(e); - }; + }, [page, backupFiles]); return ( setOpen(false)} onCancel={() => setOpen(false)} + disableOk > - + - { + fetchAndSetBackupFiles(); + }} + onSaveSuccess={async () => { + fetchAndSetBackupFiles(); + }} + onInit={async () => { + fetchAndSetBackupFiles(); }} - urlRef={urlRef} - usernameRef={usernameRef} - passwordRef={passwordRef} - showPassword={showPassword} - onShowPasswordClick={handleClickShowPassword} - webdavChanged={webdavChanged} - webdavUrl={webdav_url} - webdavUsername={webdav_username} - webdavPassword={webdav_password} - handleBackup={handleBackup} - register={register} /> - handleChangePage(null, page)} - onRowsPerPageChange={handleChangeRowsPerPage} - totalCount={backupState.files.length} + ); }); - -const BackupTable = memo( - ({ - datasource, - page, - rowsPerPage, - onPageChange, - onRowsPerPageChange, - totalCount, - }: BackupTableProps) => { - const { t } = useTranslation(); - 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()} - - - - - - - - - - - - - - )) - ) : ( - - - - - {t("No Backups")} - - - - - )} - -
- -
- ); - } -); - -const WebDAVConfigForm = memo( - ({ - onSubmit, - initialValues, - urlRef, - usernameRef, - passwordRef, - showPassword, - onShowPasswordClick, - webdavChanged, - webdavUrl, - webdavUsername, - webdavPassword, - handleBackup, - register, - }: WebDAVConfigFormProps) => { - const { t } = useTranslation(); - return ( -
- - - - - - - - - - - - - {showPassword ? : } - - - ), - }} - /> - - - - - - {webdavChanged || - webdavUrl === null || - webdavUsername == null || - webdavPassword == null ? ( - - ) : ( - - )} - - - -
- ); - } -); - -export function LinuxIcon(props: SVGProps) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function WindowsIcon(props: SVGProps) { - return ( - - - - ); -} - -export function MacIcon(props: SVGProps) { - return ( - - - - ); -} 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/locales/en.json b/src/locales/en.json index 8858e135..2eca4953 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -386,10 +386,14 @@ "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", + "WebDAV Config Save Failed": "Failed to save WebDAV configuration: {{error}}", "Backup Created": "Backup created successfully", - "Backup Failed": "Failed to create backup", + "Backup Failed": "Backup failed: {{error}}", "Delete Backup": "Delete Backup", "Restore Backup": "Restore Backup", - "Backup Time": "Backup Time" + "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 6769e674..c86e0c5f 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -386,10 +386,14 @@ "Password Required": "رمز عبور نمی‌تواند خالی باشد", "Failed to Fetch Backups": "دریافت فایل‌های پشتیبان ناموفق بود", "WebDAV Config Saved": "پیکربندی WebDAV با موفقیت ذخیره شد", - "WebDAV Config Save Failed": "ذخیره پیکربندی WebDAV ناموفق بود", + "WebDAV Config Save Failed": "خطا در ذخیره تنظیمات WebDAV: {{error}}", "Backup Created": "پشتیبان‌گیری با موفقیت ایجاد شد", - "Backup Failed": "ایجاد پشتیبان ناموفق بود", + "Backup Failed": "خطا در پشتیبان‌گیری: {{error}}", "Delete Backup": "حذف پشتیبان", "Restore Backup": "بازیابی پشتیبان", - "Backup Time": "زمان پشتیبان‌گیری" + "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 297117dd..8d3b34f7 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -386,10 +386,14 @@ "Password Required": "Пароль не может быть пустым", "Failed to Fetch Backups": "Не удалось получить файлы резервных копий", "WebDAV Config Saved": "Конфигурация WebDAV успешно сохранена", - "WebDAV Config Save Failed": "Не удалось сохранить конфигурацию WebDAV", + "WebDAV Config Save Failed": "Не удалось сохранить конфигурацию WebDAV: {{error}}", "Backup Created": "Резервная копия успешно создана", - "Backup Failed": "Не удалось создать резервную копию", + "Backup Failed": "Ошибка резервного копирования: {{error}}", "Delete Backup": "Удалить резервную копию", "Restore Backup": "Восстановить резервную копию", - "Backup Time": "Время резервного копирования" + "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 6a4e2188..b32f9507 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -380,16 +380,20 @@ "Actions": "操作", "Restore": "恢复", "No Backups": "暂无备份", - "WebDAV URL Required": "WebDAV 地址不能为空", - "Invalid WebDAV URL": "无效的 WebDAV 地址格式", + "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 配置保存失败", + "WebDAV Config Save Failed": "保存 WebDAV 配置失败: {{error}}", "Backup Created": "备份创建成功", - "Backup Failed": "备份创建失败", + "Backup Failed": "备份失败: {{error}}", "Delete Backup": "删除备份", "Restore Backup": "恢复备份", - "Backup Time": "备份时间" + "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/services/cmds.ts b/src/services/cmds.ts index 57d45efa..9a416c28 100644 --- a/src/services/cmds.ts +++ b/src/services/cmds.ts @@ -141,8 +141,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() { @@ -240,6 +244,15 @@ export async function getNetworkInterfacesInfo() { 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, From 4306fba99708e92c3eae561254c3d92eac4e98e6 Mon Sep 17 00:00:00 2001 From: wonfen Date: Tue, 12 Nov 2024 03:49:21 +0800 Subject: [PATCH 213/288] release rc.6 --- UPDATELOG.md | 5 ++++- package.json | 2 +- src-tauri/tauri.conf.json | 2 +- src/locales/en.json | 2 +- src/locales/fa.json | 2 +- src/locales/ru.json | 2 +- src/locales/zh.json | 2 +- 7 files changed, 10 insertions(+), 7 deletions(-) diff --git a/UPDATELOG.md b/UPDATELOG.md index 2b48cae4..ec05e3e7 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -13,7 +13,7 @@ ### Features -- Meta(mihomo)内核升级 1.18.9 +- Meta(mihomo)内核升级 1.18.10 - Win 下的系统代理替换为 Shadowsocks/CFW/v2rayN 等成熟的 sysproxy.exe 方案,解决拨号/VPN 环境下无法设置系统代理的问题 - 服务模式改进为启动软件时自动安装,TUN 模式可自由开启不再限制于服务模式 - Mac 下可用 URL Scheme 导入订阅 @@ -25,6 +25,9 @@ - 加入图标 svg 格式检测 - 增加更多 app 调试日志 - 添加 MacOS 下白色桌面的 tray 黑色配色(但会代理系统代理、tun 模式图标失效的问题) +- 增加 Webdav 备份功能 +- 添加统一延迟的设置开关 +- 添加 Windows 下自动检测并下载 vc runtime 的功能 ### Performance diff --git a/package.json b/package.json index 6b76ddac..e363c287 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "clash-verge", - "version": "2.0.0-rc.5", + "version": "2.0.0-rc.6", "license": "GPL-3.0-only", "scripts": { "dev": "cross-env RUST_BACKTRACE=1 tauri dev", diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 57907c81..c4324268 100755 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -25,7 +25,7 @@ "devUrl": "http://localhost:3000/" }, "productName": "Clash Verge", - "version": "2.0.0-rc.5", + "version": "2.0.0-rc.6", "identifier": "io.github.clash-verge-rev.clash-verge-rev", "plugins": { "updater": { diff --git a/src/locales/en.json b/src/locales/en.json index 2eca4953..622cc93e 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -332,7 +332,7 @@ "clash_mode_direct": "Direct Mode", "toggle_system_proxy": "Enable/Disable System Proxy", "toggle_tun_mode": "Enable/Disable Tun Mode", - "Backup Setting": "Backup Setting", + "Backup Setting": "Webdav Backup Setting", "Runtime Config": "Runtime Config", "Open Conf Dir": "Open Conf Dir", "Open Core Dir": "Open Core Dir", diff --git a/src/locales/fa.json b/src/locales/fa.json index c86e0c5f..a6d4bd51 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -332,7 +332,7 @@ "clash_mode_direct": "حالت مستقیم", "toggle_system_proxy": "فعال/غیرفعال کردن پراکسی سیستم", "toggle_tun_mode": "فعال/غیرفعال کردن حالت Tun", - "Backup Setting": "تنظیمات پشتیبان", + "Backup Setting": "تنظیمات پشتیبان گیری Webdav", "Runtime Config": "پیکربندی زمان اجرا", "Open Conf Dir": "باز کردن پوشه برنامه", "Open Core Dir": "باز کردن پوشه هسته", diff --git a/src/locales/ru.json b/src/locales/ru.json index 8d3b34f7..cea22f61 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -332,7 +332,7 @@ "clash_mode_direct": "Прямой режим", "toggle_system_proxy": "Включить/Отключить системный прокси", "toggle_tun_mode": "Включить/Отключить режим туннеля", - "Backup Setting": "Настройки резервного копирования", + "Backup Setting": "Настройка резервного копирования WebDAV", "Runtime Config": "Используемый конфиг", "Open Conf Dir": "Открыть папку приложения", "Open Core Dir": "Открыть папку ядра", diff --git a/src/locales/zh.json b/src/locales/zh.json index b32f9507..fe8eb4b7 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -332,7 +332,7 @@ "clash_mode_direct": "直连模式", "toggle_system_proxy": "打开/关闭系统代理", "toggle_tun_mode": "打开/关闭 Tun 模式", - "Backup Setting": "备份设置", + "Backup Setting": "Webdav备份设置", "Runtime Config": "当前配置", "Open Conf Dir": "配置目录", "Open Core Dir": "内核目录", From 8763a7647570d3819f08540f739d55a2f712dc0c Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 12 Nov 2024 19:06:04 +0800 Subject: [PATCH 214/288] chore: update deps --- package.json | 88 +- pnpm-lock.yaml | 4250 ++++++++--------- src-tauri/Cargo.lock | 682 ++- src/components/setting/mods/backup-viewer.tsx | 1 - src/locales/en.json | 2 +- src/locales/fa.json | 2 +- src/locales/zh.json | 2 +- 7 files changed, 2664 insertions(+), 2363 deletions(-) diff --git a/package.json b/package.json index e363c287..9e693fdf 100644 --- a/package.json +++ b/package.json @@ -21,77 +21,77 @@ "@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", + "ahooks": "^3.8.1", + "axios": "^1.7.7", "cli-color": "^2.0.4", - "dayjs": "1.11.5", - "foxact": "^0.2.35", + "dayjs": "1.11.13", + "foxact": "^0.2.41", "glob": "^11.0.0", - "i18next": "^23.11.5", + "i18next": "^23.16.5", "js-base64": "^3.7.7", "js-yaml": "^4.1.0", "lodash-es": "^4.17.21", - "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" }, "devDependencies": { "@actions/github": "^5.1.1", - "@tauri-apps/cli": "2.0.4", + "@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", "https-proxy-agent": "^5.0.1", "husky": "^7.0.4", - "meta-json-schema": "^1.18.9", + "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", + "sass": "^1.80.6", + "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, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 02526cef..f55fbe64 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,77 +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: ^5.16.7 + version: 5.16.7(@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 @@ -101,14 +101,14 @@ importers: specifier: ^0.49.0 version: 0.49.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.49.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 @@ -119,26 +119,26 @@ importers: specifier: ^3.1.4 version: 3.1.4(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) + version: 13.5.0(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) + version: 0.55.0(@types/react@18.3.12)(monaco-editor@0.49.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 @@ -149,15 +149,15 @@ importers: specifier: ^6.2.1 version: 6.2.1 types-pac: - specifier: ^1.0.2 - version: 1.0.2 + specifier: ^1.0.3 + version: 1.0.3 devDependencies: "@actions/github": specifier: ^5.1.1 version: 5.1.1 "@tauri-apps/cli": - specifier: 2.0.4 - version: 2.0.4 + specifier: 2.1.0 + version: 2.1.0 "@types/js-cookie": specifier: ^3.0.6 version: 3.0.6 @@ -168,23 +168,23 @@ 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.80.6)(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.80.6)(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 @@ -195,8 +195,8 @@ importers: specifier: ^7.0.4 version: 7.0.4 meta-json-schema: - specifier: ^1.18.9 - version: 1.18.9 + specifier: ^1.18.10 + version: 1.18.10 node-fetch: specifier: ^3.3.2 version: 3.3.2 @@ -207,23 +207,23 @@ importers: specifier: ^3.3.1 version: 3.3.1(prettier@2.8.8) sass: - specifier: ^1.77.6 - version: 1.77.6 + specifier: ^1.80.6 + version: 1.80.6 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.80.6)(terser@5.36.0) vite-plugin-monaco-editor: specifier: ^1.1.0 version: 1.1.0(monaco-editor@0.49.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.80.6)(terser@5.36.0)) packages: "@actions/github@5.1.1": @@ -232,10 +232,10 @@ packages: integrity: sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g==, } - "@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 +245,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 +486,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 +513,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 +998,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 +1060,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 +1102,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 +1127,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,31 +1367,31 @@ 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": @@ -1565,10 +1428,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": @@ -1597,30 +1460,16 @@ 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@5.16.7": resolution: { - integrity: sha512-6ISoOhkp9w5gD0PEW9JklrcbyARDkFWNTBdwXZ1Oy5IGlyu9B0zG0hnUIe4H17IaF1Vgj6C8VI+v4tkSdK0veg==, + integrity: sha512-UrGwDJCXEszbDI7yV047BYU5A28eGJ79keTCP4cc74WyncuVrnurlmIRxaHL8YK+LI1Kzq+/JM52IAkNnv4u+Q==, } engines: { node: ">=12.0.0" } peerDependencies: @@ -1652,30 +1501,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: @@ -1685,10 +1537,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: @@ -1701,10 +1566,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: @@ -1720,21 +1601,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: @@ -1744,21 +1644,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: @@ -1843,10 +1764,134 @@ packages: integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==, } - "@peggyjs/from-mem@1.3.0": + "@parcel/watcher-android-arm64@2.5.0": resolution: { - integrity: sha512-kzGoIRJjkg3KuGI4bopz9UvF3KguzfxalHRDEIdqEZUe45xezsQ6cx30e0RKuxPUexojQRBfu89Okn7f4/QXsw==, + integrity: sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [android] + + "@parcel/watcher-darwin-arm64@2.5.0": + resolution: + { + 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" } @@ -1856,17 +1901,17 @@ packages: 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: @@ -1875,130 +1920,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] @@ -2107,156 +2168,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.4": + "@tauri-apps/cli-darwin-arm64@2.1.0": resolution: { - integrity: sha512-siH7rOHobb16rPbc11k64p1mxIpiRCkWmzs2qmL5IX21Gx9K5onI3Tk67Oqpf2uNupbYzItrOttaDT4NHFC7tw==, + integrity: sha512-ESc6J6CE8hl1yKH2vJ+ALF+thq4Be+DM1mvmTyUCQObvezNCNhzfS6abIUd3ou4x5RGH51ouiANeT3wekU6dCw==, } engines: { node: ">= 10" } cpu: [arm64] os: [darwin] - "@tauri-apps/cli-darwin-x64@2.0.4": + "@tauri-apps/cli-darwin-x64@2.1.0": resolution: { - integrity: sha512-zIccfbCoZMfmUpnk6PFCV0keFyfVj1A9XV3Oiiitj/dkTZ9CQvzjhX3XC0XcK4rsTWegfr2PjSrK06aiPAROAw==, + integrity: sha512-TasHS442DFs8cSH2eUQzuDBXUST4ECjCd0yyP+zZzvAruiB0Bg+c8A+I/EnqCvBQ2G2yvWLYG8q/LI7c87A5UA==, } engines: { node: ">= 10" } cpu: [x64] os: [darwin] - "@tauri-apps/cli-linux-arm-gnueabihf@2.0.4": + "@tauri-apps/cli-linux-arm-gnueabihf@2.1.0": resolution: { - integrity: sha512-fgQqJzefOGWCBNg4yrVA82Rg4s1XQr5K0dc2rCxBhJfa696e8dQ1LDrnWq/AiO5r+uHfVaoQTIUvxxpFicYRSA==, + integrity: sha512-aP7ZBGNL4ny07Cbb6kKpUOSrmhcIK2KhjviTzYlh+pPhAptxnC78xQGD3zKQkTi2WliJLPmBYbOHWWQa57lQ9w==, } engines: { node: ">= 10" } cpu: [arm] os: [linux] - "@tauri-apps/cli-linux-arm64-gnu@2.0.4": + "@tauri-apps/cli-linux-arm64-gnu@2.1.0": resolution: { - integrity: sha512-u8wbt5tPA9pI6j+d7jGrfOz9UVCiTp+IYzKNiIqlrDsAjqAUFaNXYHKqOUboeFWEmI4zoCWj6LgpS2OJTQ5FKg==, + integrity: sha512-ZTdgD5gLeMCzndMT2f358EkoYkZ5T+Qy6zPzU+l5vv5M7dHVN9ZmblNAYYXmoOuw7y+BY4X/rZvHV9pcGrcanQ==, } engines: { node: ">= 10" } cpu: [arm64] os: [linux] - "@tauri-apps/cli-linux-arm64-musl@2.0.4": + "@tauri-apps/cli-linux-arm64-musl@2.1.0": resolution: { - integrity: sha512-hntF1V8e3V1hlrESm93PsghDhf3lA5pbvFrRfYxU1c+fVD/jRXGVw8BH3O1lW8MWwhEg1YdhKk01oAgsuHLuig==, + integrity: sha512-NzwqjUCilhnhJzusz3d/0i0F1GFrwCQbkwR6yAHUxItESbsGYkZRJk0yMEWkg3PzFnyK4cWTlQJMEU52TjhEzA==, } engines: { node: ">= 10" } cpu: [arm64] os: [linux] - "@tauri-apps/cli-linux-x64-gnu@2.0.4": + "@tauri-apps/cli-linux-x64-gnu@2.1.0": resolution: { - integrity: sha512-Iq1GGJb+oT1T0ZV8izrgf0cBtlzPCJaWcNueRbf1ZXquMf+FSTyQv+/Lo8rq5T6buOIJOH7cAOTuEWWqiCZteg==, + integrity: sha512-TyiIpMEtZxNOQmuFyfJwaaYbg3movSthpBJLIdPlKxSAB2BW0VWLY3/ZfIxm/G2YGHyREkjJvimzYE0i37PnMA==, } engines: { node: ">= 10" } cpu: [x64] os: [linux] - "@tauri-apps/cli-linux-x64-musl@2.0.4": + "@tauri-apps/cli-linux-x64-musl@2.1.0": resolution: { - integrity: sha512-9NTk6Pf0bSwXqCBdAA+PDYts9HeHebZzIo8mbRzRyUbER6QngG5HZb9Ka36Z1QWtJjdRy6uxSb4zb/9NuTeHfA==, + integrity: sha512-/dQd0TlaxBdJACrR72DhynWftzHDaX32eBtS5WBrNJ+nnNb+znM3gON6nJ9tSE9jgDa6n1v2BkI/oIDtypfUXw==, } engines: { node: ">= 10" } cpu: [x64] os: [linux] - "@tauri-apps/cli-win32-arm64-msvc@2.0.4": + "@tauri-apps/cli-win32-arm64-msvc@2.1.0": resolution: { - integrity: sha512-OF2e9oxiBFR8A8wVMOhUx9QGN/I1ZkquWC7gVQBnA56nx9PabJlDT08QBy5UD8USqZFVznnfNr2ehlheQahb3g==, + integrity: sha512-NdQJO7SmdYqOcE+JPU7bwg7+odfZMWO6g8xF9SXYCMdUzvM2Gv/AQfikNXz5yS7ralRhNFuW32i5dcHlxh4pDg==, } engines: { node: ">= 10" } cpu: [arm64] os: [win32] - "@tauri-apps/cli-win32-ia32-msvc@2.0.4": + "@tauri-apps/cli-win32-ia32-msvc@2.1.0": resolution: { - integrity: sha512-T+hCKB3rFP6q0saHHtR02hm6wr1ZPJ0Mkii3oRTxjPG6BBXoVzHNCYzvdgEGJPTA2sFuAQtJH764NRtNlDMifw==, + integrity: sha512-f5h8gKT/cB8s1ticFRUpNmHqkmaLutT62oFDB7N//2YTXnxst7EpMIn1w+QimxTvTk2gcx6EcW6bEk/y2hZGzg==, } engines: { node: ">= 10" } cpu: [ia32] os: [win32] - "@tauri-apps/cli-win32-x64-msvc@2.0.4": + "@tauri-apps/cli-win32-x64-msvc@2.1.0": resolution: { - integrity: sha512-GVaiI3KWRFLomjJmApHqihhYlkJ+7FqhumhVfBO6Z2tWzZjQyVQgTdNp0kYEuW2WoAYEj0dKY6qd4YM33xYcUA==, + integrity: sha512-P/+LrdSSb5Xbho1LRP4haBjFHdyPdjWvGgeopL96OVtrFpYnfC+RctB45z2V2XxqFk3HweDDxk266btjttfjGw==, } engines: { node: ">= 10" } cpu: [x64] os: [win32] - "@tauri-apps/cli@2.0.4": + "@tauri-apps/cli@2.1.0": resolution: { - integrity: sha512-Hl9eFXz+O366+6su9PfaSzu2EJdFe1p8K8ghkWmi40dz8VmSE7vsMTaOStD0I71ckSOkh2ICDX7FQTBgjlpjWw==, + 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": @@ -2295,10 +2356,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==, + integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==, } "@types/hast@3.0.4": @@ -2331,10 +2392,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": @@ -2361,40 +2422,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": @@ -2403,37 +2464,37 @@ 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" } @@ -2444,10 +2505,10 @@ packages: } engines: { node: ">= 6.0.0" } - 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: @@ -2467,13 +2528,6 @@ packages: } engines: { node: ">=12" } - ansi-styles@3.2.1: - resolution: - { - integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, - } - engines: { node: ">=4" } - ansi-styles@4.3.0: resolution: { @@ -2488,13 +2542,6 @@ packages: } engines: { node: ">=12" } - anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: ">= 8" } - argparse@2.0.1: resolution: { @@ -2507,10 +2554,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: @@ -2520,26 +2567,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 @@ -2562,13 +2609,6 @@ packages: integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==, } - binary-extensions@2.3.0: - resolution: - { - integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, - } - engines: { node: ">=8" } - brace-expansion@2.0.1: resolution: { @@ -2592,10 +2632,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 @@ -2620,10 +2660,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: @@ -2632,13 +2672,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: { @@ -2663,12 +2696,12 @@ 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: resolution: @@ -2697,12 +2730,6 @@ packages: } engines: { node: ">=6" } - color-convert@1.9.3: - resolution: - { - integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, - } - color-convert@2.0.1: resolution: { @@ -2710,12 +2737,6 @@ packages: } engines: { node: ">=7.0.0" } - color-name@1.1.3: - resolution: - { - integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, - } - color-name@1.1.4: resolution: { @@ -2760,16 +2781,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: @@ -2799,10 +2820,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" } @@ -2826,16 +2847,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: @@ -2870,6 +2891,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: { @@ -2894,10 +2923,10 @@ packages: integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, } - electron-to-chromium@1.4.818: + electron-to-chromium@1.5.56: resolution: { - integrity: sha512-eGvIk2V0dGImV9gWLq8fDfTTsCAeMDwZqEPMr+jMInxZdnp9Us8UpovYpRCf9NQ7VOFgrN2doNSgvISbsbNpxA==, + integrity: sha512-7lXb9dAvimCFdvUMTyucD4mnIndt/xhRKFAlky0CyFogdnNmdPQNoHI23msF/2V4mpTxMzgMdjK4+YRlFlRQZw==, } emoji-regex@8.0.0: @@ -2965,20 +2994,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: { @@ -3064,10 +3086,10 @@ packages: } engines: { node: ">=8" } - 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: @@ -3083,10 +3105,10 @@ packages: } engines: { node: ">=14" } - form-data@4.0.0: + form-data@4.0.1: resolution: { - integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, + integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==, } engines: { node: ">= 6" } @@ -3097,10 +3119,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: "*" @@ -3143,13 +3165,6 @@ packages: } engines: { node: ">=8" } - glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: ">= 6" } - glob@11.0.0: resolution: { @@ -3165,13 +3180,6 @@ packages: } engines: { node: ">=4" } - has-flag@3.0.0: - resolution: - { - integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, - } - engines: { node: ">=4" } - hasown@2.0.2: resolution: { @@ -3179,10 +3187,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: @@ -3203,10 +3211,10 @@ 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: @@ -3231,23 +3239,23 @@ packages: engines: { node: ">=12" } 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@4.3.7: resolution: { - integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==, + integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==, } import-fresh@3.3.0: @@ -3257,10 +3265,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: @@ -3287,17 +3295,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" } @@ -3387,11 +3388,12 @@ packages: 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: @@ -3406,19 +3408,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: @@ -3491,10 +3486,10 @@ packages: integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==, } - lru-cache@11.0.1: + lru-cache@11.0.2: resolution: { - integrity: sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==, + integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==, } engines: { node: 20 || >=22 } @@ -3504,41 +3499,34 @@ packages: integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, } - lru-cache@6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: ">=10" } - lru-queue@0.1.0: resolution: { integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==, } - magic-string@0.30.10: + magic-string@0.30.12: resolution: { - integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==, + integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==, } - mdast-util-from-markdown@2.0.1: + mdast-util-from-markdown@2.0.2: resolution: { - integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==, + integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==, } - mdast-util-mdx-expression@2.0.0: + mdast-util-mdx-expression@2.0.1: resolution: { - integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==, + integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==, } - mdast-util-mdx-jsx@3.1.2: + mdast-util-mdx-jsx@3.1.3: resolution: { - integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==, + integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==, } mdast-util-mdxjs-esm@2.0.1: @@ -3559,10 +3547,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: @@ -3591,10 +3579,10 @@ packages: integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, } - meta-json-schema@1.18.9: + meta-json-schema@1.18.10: resolution: { - integrity: sha512-ZBHy12UTzDc72bYAcsAuO8czVk3/L/4PdY7o/XYWeRqKDoikzg+tvYNifdUw+7HjfDbwNaa1U2WYKtfEDYzcsg==, + integrity: sha512-bbjzCD1pXX/2jKNvFMPulvXujNj99iRFFf+eG82aNBgB/x42DHxZVqFOEiQ/L88tgQVS7o7CtfN0RIP7Rh04ZA==, } micromark-core-commonmark@2.0.1: @@ -3723,6 +3711,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: { @@ -3793,16 +3788,16 @@ packages: integrity: sha512-2I8/T3X/hLxB2oPHgqcNYUVdA/ZEFShT7IAujifIPMfKkNbLOqY8XCoyHCXrsdjb36dW9MwoTwBCFpXKMwNwaQ==, } - 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: @@ -3819,10 +3814,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" @@ -3834,10 +3829,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: @@ -3848,10 +3843,10 @@ 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 @@ -3868,6 +3863,12 @@ packages: integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==, } + node-addon-api@7.1.1: + resolution: + { + integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==, + } + node-domexception@1.0.0: resolution: { @@ -3894,19 +3895,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: { @@ -4021,18 +4015,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: @@ -4049,10 +4043,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 } @@ -4092,10 +4093,10 @@ packages: integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, } - pump@3.0.0: + pump@3.0.2: resolution: { - integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, + integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==, } react-dom@18.3.1: @@ -4121,12 +4122,12 @@ 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 @@ -4184,20 +4185,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: @@ -4212,10 +4213,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: @@ -4229,17 +4230,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" } @@ -4261,17 +4262,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 @@ -4281,16 +4288,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: @@ -4313,18 +4320,18 @@ packages: } hasBin: true - rollup@4.18.0: + rollup@4.25.0: resolution: { - integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==, + integrity: sha512-uVbClXmR6wvx5R1M3Od4utyLUxrmOcEm3pAtMphn73Apq19PDtHpgZoEvqH2YnnaNUuvKmg2DgRd2Sqv+odyqg==, } engines: { node: ">=18.0.0", npm: ">=8.0.0" } hasBin: true - sass@1.77.6: + sass@1.80.6: resolution: { - integrity: sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==, + integrity: sha512-ccZgdHNiBF1NHBsWvacvT5rju3y1d/Eu+8Ex6c21nHp2lZGLBEtuwc415QfiI1PJa1TpCo3iXwwSRjRpn2Ckjg==, } engines: { node: ">=14.0.0" } hasBin: true @@ -4349,10 +4356,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 @@ -4409,10 +4416,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" } @@ -4483,10 +4490,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: @@ -4495,13 +4502,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: { @@ -4536,10 +4536,10 @@ packages: } engines: { node: ">=10" } - 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 @@ -4551,13 +4551,6 @@ packages: } engines: { node: ">=0.12" } - to-fast-properties@2.0.0: - resolution: - { - integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, - } - engines: { node: ">=4" } - to-regex-range@5.0.1: resolution: { @@ -4583,10 +4576,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: @@ -4602,16 +4595,16 @@ packages: integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==, } - types-pac@1.0.2: + types-pac@1.0.3: resolution: { - integrity: sha512-9zOLBtvgzEesEgpkJPrrh+uGTzSdNcYA+gk1jv3+14ytTsuxnunBko98OgbCCgUfcMzraEi4h+3zPrZaPoEsQg==, + integrity: sha512-MF2UAZGvGMOM+vHi9Zj/LvQqdNN1m1xSB+PjAW9B/GvFqaB4GwR18YaIbGIGDRTW/J8iqFXQHLZd5eJVtho46w==, } - typescript@5.5.3: + typescript@5.6.3: resolution: { - integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==, + integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==, } engines: { node: ">=14.17" } hasBin: true @@ -4629,10 +4622,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" } @@ -4643,10 +4636,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" } @@ -4675,12 +4668,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: { @@ -4705,10 +4692,10 @@ packages: integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==, } - update-browserslist-db@1.1.0: + update-browserslist-db@1.1.1: resolution: { - integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==, + integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==, } hasBin: true peerDependencies: @@ -4728,10 +4715,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: @@ -4742,18 +4729,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 @@ -4762,6 +4749,7 @@ packages: less: "*" lightningcss: ^1.21.0 sass: "*" + sass-embedded: "*" stylus: "*" sugarss: "*" terser: ^5.4.0 @@ -4774,6 +4762,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -4801,10 +4791,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: @@ -4885,10 +4875,10 @@ 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 @@ -4902,14 +4892,14 @@ packages: snapshots: "@actions/github@5.1.1": dependencies: - "@actions/http-client": 2.2.1 + "@actions/http-client": 2.2.3 "@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.1": + "@actions/http-client@2.2.3": dependencies: tunnel: 0.0.6 undici: 5.28.4 @@ -4919,788 +4909,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: @@ -5708,27 +5587,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 @@ -5738,72 +5617,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 @@ -5876,22 +5755,22 @@ 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: @@ -5905,7 +5784,7 @@ snapshots: "@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": {} @@ -5917,80 +5796,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@5.16.7(@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 @@ -5999,95 +5864,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 @@ -6160,120 +6078,187 @@ snapshots: dependencies: "@octokit/openapi-types": 12.11.0 - "@peggyjs/from-mem@1.3.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: - semver: 7.6.0 + 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 "@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 @@ -6281,116 +6266,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.4": + "@tauri-apps/cli-darwin-arm64@2.1.0": optional: true - "@tauri-apps/cli-darwin-x64@2.0.4": + "@tauri-apps/cli-darwin-x64@2.1.0": optional: true - "@tauri-apps/cli-linux-arm-gnueabihf@2.0.4": + "@tauri-apps/cli-linux-arm-gnueabihf@2.1.0": optional: true - "@tauri-apps/cli-linux-arm64-gnu@2.0.4": + "@tauri-apps/cli-linux-arm64-gnu@2.1.0": optional: true - "@tauri-apps/cli-linux-arm64-musl@2.0.4": + "@tauri-apps/cli-linux-arm64-musl@2.1.0": optional: true - "@tauri-apps/cli-linux-x64-gnu@2.0.4": + "@tauri-apps/cli-linux-x64-gnu@2.1.0": optional: true - "@tauri-apps/cli-linux-x64-musl@2.0.4": + "@tauri-apps/cli-linux-x64-musl@2.1.0": optional: true - "@tauri-apps/cli-win32-arm64-msvc@2.0.4": + "@tauri-apps/cli-win32-arm64-msvc@2.1.0": optional: true - "@tauri-apps/cli-win32-ia32-msvc@2.0.4": + "@tauri-apps/cli-win32-ia32-msvc@2.1.0": optional: true - "@tauri-apps/cli-win32-x64-msvc@2.0.4": + "@tauri-apps/cli-win32-x64-msvc@2.1.0": optional: true - "@tauri-apps/cli@2.0.4": + "@tauri-apps/cli@2.1.0": optionalDependencies: - "@tauri-apps/cli-darwin-arm64": 2.0.4 - "@tauri-apps/cli-darwin-x64": 2.0.4 - "@tauri-apps/cli-linux-arm-gnueabihf": 2.0.4 - "@tauri-apps/cli-linux-arm64-gnu": 2.0.4 - "@tauri-apps/cli-linux-arm64-musl": 2.0.4 - "@tauri-apps/cli-linux-x64-gnu": 2.0.4 - "@tauri-apps/cli-linux-x64-musl": 2.0.4 - "@tauri-apps/cli-win32-arm64-msvc": 2.0.4 - "@tauri-apps/cli-win32-ia32-msvc": 2.0.4 - "@tauri-apps/cli-win32-x64-msvc": 2.0.4 + "@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: @@ -6398,13 +6383,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/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": {} @@ -6414,13 +6399,13 @@ 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": {} @@ -6431,134 +6416,125 @@ snapshots: "@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.80.6)(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.80.6)(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.80.6)(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.80.6)(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: 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-regex@5.0.1: {} ansi-regex@6.1.0: {} - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 ansi-styles@6.2.1: {} - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.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 @@ -6568,8 +6544,6 @@ snapshots: before-after-hook@2.2.3: {} - binary-extensions@2.3.0: {} - brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -6577,18 +6551,19 @@ snapshots: 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: {} @@ -6596,16 +6571,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: {} @@ -6614,17 +6583,9 @@ 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: {} @@ -6640,16 +6601,10 @@ snapshots: clsx@2.1.1: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} combined-stream@1.0.8: @@ -6666,11 +6621,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: @@ -6680,20 +6635,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 @@ -6708,11 +6663,11 @@ snapshots: 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: @@ -6724,23 +6679,26 @@ 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 eastasianwidth@0.2.0: {} - electron-to-chromium@1.4.818: {} + electron-to-chromium@1.5.56: {} emoji-regex@8.0.0: {} @@ -6807,9 +6765,7 @@ 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: {} @@ -6833,7 +6789,7 @@ snapshots: execa@4.1.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.5 get-stream: 5.2.0 human-signals: 1.1.1 is-stream: 2.0.1 @@ -6857,6 +6813,7 @@ snapshots: fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 + optional: true find-root@1.1.0: {} @@ -6865,14 +6822,14 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 - follow-redirects@1.15.6: {} + follow-redirects@1.15.9: {} foreground-child@3.3.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.5 signal-exit: 4.1.0 - form-data@4.0.0: + form-data@4.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -6882,7 +6839,7 @@ 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 @@ -6902,11 +6859,7 @@ snapshots: get-stream@5.2.0: dependencies: - pump: 3.0.0 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 + pump: 3.0.2 glob@11.0.0: dependencies: @@ -6919,27 +6872,25 @@ snapshots: globals@11.12.0: {} - 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: @@ -6957,12 +6908,12 @@ 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: dependencies: agent-base: 6.0.2 - debug: 4.3.5 + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -6970,20 +6921,20 @@ snapshots: husky@7.0.4: {} - 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@4.3.7: {} 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: {} @@ -6996,27 +6947,26 @@ 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: {} @@ -7034,7 +6984,7 @@ snapshots: js-base64@3.7.7: {} - js-cookie@2.2.1: {} + js-cookie@3.0.5: {} js-tokens@4.0.0: {} @@ -7042,9 +6992,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: {} @@ -7072,30 +7020,26 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 - lru-cache@11.0.1: {} + lru-cache@11.0.2: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - lru-queue@0.1.0: dependencies: 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 @@ -7109,30 +7053,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: @@ -7144,8 +7087,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 @@ -7164,15 +7107,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 @@ -7196,7 +7140,7 @@ snapshots: merge-stream@2.0.0: {} - meta-json-schema@1.18.9: {} + meta-json-schema@1.18.10: {} micromark-core-commonmark@2.0.1: dependencies: @@ -7312,7 +7256,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 @@ -7331,6 +7275,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: @@ -7360,13 +7310,13 @@ snapshots: monaco-editor@0.49.0: {} - monaco-languageserver-types@0.3.4: + 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 @@ -7376,36 +7326,38 @@ snapshots: dependencies: monaco-editor: 0.49.0 - monaco-yaml@5.2.0(monaco-editor@0.49.0): + monaco-yaml@5.2.3(monaco-editor@0.49.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-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) 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: {} @@ -7419,9 +7371,7 @@ snapshots: 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: @@ -7455,7 +7405,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 @@ -7466,7 +7416,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 @@ -7481,28 +7431,31 @@ snapshots: path-scurry@2.0.0: dependencies: - lru-cache: 11.0.1 + 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: {} @@ -7510,12 +7463,12 @@ snapshots: dependencies: execa: 4.1.0 find-up: 4.1.0 - ignore: 5.3.1 + 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 + tslib: 2.8.1 prop-types@15.8.1: dependencies: @@ -7527,7 +7480,7 @@ snapshots: proxy-from-env@1.1.0: {} - pump@3.0.0: + pump@3.0.2: dependencies: end-of-stream: 1.4.4 once: 1.4.0 @@ -7540,20 +7493,20 @@ snapshots: react-error-boundary@3.1.4(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@13.5.0(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) @@ -7562,54 +7515,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.55.0(@types/react@18.3.12)(monaco-editor@0.49.0)(react@18.3.1): dependencies: - "@types/react": 18.3.3 + "@types/react": 18.3.12 monaco-editor: 0.49.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) @@ -7618,11 +7571,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 @@ -7632,39 +7583,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: {} @@ -7672,37 +7625,41 @@ 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: + rollup@4.25.0: dependencies: - "@types/estree": 1.0.5 + "@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.80.6: dependencies: - chokidar: 3.6.0 - immutable: 4.3.6 - source-map-js: 1.2.0 + chokidar: 4.0.1 + immutable: 4.3.7 + source-map-js: 1.2.1 + optionalDependencies: + "@parcel/watcher": 2.5.0 scheduler@0.23.2: dependencies: @@ -7712,9 +7669,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: {} @@ -7731,13 +7686,13 @@ snapshots: 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: @@ -7777,16 +7732,12 @@ snapshots: 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: {} @@ -7808,10 +7759,10 @@ snapshots: mkdirp: 1.0.4 yallist: 4.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 @@ -7820,11 +7771,10 @@ snapshots: es5-ext: 0.10.64 next-tick: 1.1.0 - to-fast-properties@2.0.0: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 + optional: true tr46@0.0.3: {} @@ -7832,15 +7782,15 @@ snapshots: trough@2.2.0: {} - tslib@2.6.3: {} + tslib@2.8.1: {} tunnel@0.0.6: {} type@2.7.3: {} - types-pac@1.0.2: {} + types-pac@1.0.3: {} - typescript@5.5.3: {} + typescript@5.6.3: {} undici-types@5.26.5: optional: true @@ -7849,62 +7799,57 @@ snapshots: 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: {} - 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: @@ -7912,40 +7857,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): dependencies: monaco-editor: 0.49.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.80.6)(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.80.6)(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.80.6)(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.80.6 + terser: 5.36.0 void-elements@3.1.0: {} @@ -7956,7 +7900,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: {} @@ -7995,6 +7939,6 @@ snapshots: yaml@1.10.2: {} - yaml@2.4.5: {} + yaml@2.6.0: {} zwitch@2.0.4: {} diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index d4885101..2bf8bd2f 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -11,6 +11,12 @@ 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" @@ -50,6 +56,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -88,15 +100,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" dependencies = [ "derive_arbitrary", ] @@ -125,6 +137,17 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "arrayvec" version = "0.7.6" @@ -195,8 +218,8 @@ checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" dependencies = [ "async-task", "concurrent-queue", - "fastrand 2.2.0", - "futures-lite 2.5.0", + "fastrand 2.1.1", + "futures-lite 2.3.0", "slab", ] @@ -220,7 +243,7 @@ checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" dependencies = [ "async-lock 3.4.0", "blocking", - "futures-lite 2.5.0", + "futures-lite 2.3.0", ] [[package]] @@ -245,18 +268,18 @@ dependencies = [ [[package]] name = "async-io" -version = "2.4.0" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" dependencies = [ "async-lock 3.4.0", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.5.0", + "futures-lite 2.3.0", "parking", - "polling 3.7.4", - "rustix 0.38.39", + "polling 3.7.3", + "rustix 0.38.37", "slab", "tracing", "windows-sys 0.59.0", @@ -306,7 +329,7 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.39", + "rustix 0.38.37", "windows-sys 0.48.0", ] @@ -317,15 +340,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" dependencies = [ "async-channel 2.3.1", - "async-io 2.4.0", + "async-io 2.3.4", "async-lock 3.4.0", "async-signal", "async-task", "blocking", "cfg-if", "event-listener 5.3.0", - "futures-lite 2.5.0", - "rustix 0.38.39", + "futures-lite 2.3.0", + "rustix 0.38.37", "tracing", ] @@ -337,7 +360,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -346,13 +369,13 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" dependencies = [ - "async-io 2.4.0", + "async-io 2.3.4", "async-lock 3.4.0", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.39", + "rustix 0.38.37", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -377,7 +400,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -394,7 +417,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -443,6 +466,29 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom 7.1.3", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" +dependencies = [ + "arrayvec", +] + [[package]] name = "axum" version = "0.6.20" @@ -497,7 +543,7 @@ dependencies = [ "addr2line", "cfg-if", "libc", - "miniz_oxide", + "miniz_oxide 0.8.0", "object", "rustc-demangle", "windows-targets 0.52.6", @@ -521,6 +567,12 @@ 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" @@ -536,6 +588,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bitstream-io" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b81e1519b0d82120d2fd469d5bfb2919a9361c48b02d82d04befc1cdd2002452" + [[package]] name = "block" version = "0.1.6" @@ -578,7 +636,7 @@ dependencies = [ "async-channel 2.3.1", "async-task", "futures-io", - "futures-lite 2.5.0", + "futures-lite 2.3.0", "piper", ] @@ -678,7 +736,7 @@ checksum = "240f4126219a83519bad05c9a40bfc0303921eeb571fc2d7e44c17ffac99d3f1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", "synstructure", ] @@ -741,6 +799,12 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "built" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" + [[package]] name = "bumpalo" version = "3.16.0" @@ -764,7 +828,7 @@ checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -878,9 +942,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.37" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40545c26d092346d8a8dab71ee48e7685a7a9cba76e634790c215b41a4a7b4cf" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" dependencies = [ "jobserver", "libc", @@ -1071,6 +1135,12 @@ 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" @@ -1098,7 +1168,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d" dependencies = [ "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -1334,7 +1404,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -1344,7 +1414,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -1368,7 +1438,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -1379,7 +1449,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -1469,13 +1539,13 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.4.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -1488,7 +1558,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -1648,7 +1718,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -1680,7 +1750,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -1793,7 +1863,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -1866,6 +1936,22 @@ dependencies = [ "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" @@ -1883,15 +1969,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.2.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "fdeflate" -version = "0.3.6" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c6f4c64c1d33a3111c4466f7365ebdcc37c5bd1ea0d62aae2e3d722aacbedb" +checksum = "d8090f921a24b04994d9929e204f50b498a33ea6ba559ffaa05e04f7ee7fb5ab" dependencies = [ "simd-adler32", ] @@ -1936,7 +2022,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.8.0", ] [[package]] @@ -1948,6 +2034,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "spin", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1987,7 +2082,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -2086,11 +2181,11 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.5.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ - "fastrand 2.2.0", + "fastrand 2.1.1", "futures-core", "futures-io", "parking", @@ -2105,7 +2200,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -2288,6 +2383,16 @@ dependencies = [ "wasi 0.11.0+wasi-snapshot-preview1", ] +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gimli" version = "0.31.1" @@ -2360,7 +2465,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -2381,9 +2486,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "global-hotkey" -version = "0.6.3" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00d88f1be7bf4cd2e61623ce08e84be2dfa4eab458e5d632d3dab95f16c1f64" +checksum = "d1b75248f33c73df1ed69673f6cb36d2e048ae84d29aa1d3e53199d138ebb1df" dependencies = [ "crossbeam-channel", "keyboard-types", @@ -2456,7 +2561,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -2497,6 +2602,16 @@ dependencies = [ "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" @@ -2529,9 +2644,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" dependencies = [ "allocator-api2", "equivalent", @@ -2802,9 +2917,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" dependencies = [ "bytes", "futures-channel", @@ -2967,7 +3082,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -2978,38 +3093,53 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "1.0.3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ - "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", + "unicode-bidi", + "unicode-normalization", ] [[package]] name = "image" -version = "0.25.5" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" +checksum = "bc144d44a31d753b02ce64093d532f55ff8dc4ebf2ffb8a63c0dda691385acae" dependencies = [ "bytemuck", "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", "num-traits", "png", + "qoi", + "ravif", + "rayon", + "rgb", "tiff", + "zune-core", + "zune-jpeg", ] +[[package]] +name = "image-webp" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e031e8e3d94711a9ccb5d6ea357439ef3dcbed361798bd4071dc4d9793fbe22f" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" + [[package]] name = "indexmap" version = "1.9.3" @@ -3028,7 +3158,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.15.1", + "hashbrown 0.15.0", "serde", ] @@ -3075,6 +3205,17 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "intrusive-collections" version = "0.9.7" @@ -3305,6 +3446,12 @@ 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" @@ -3331,9 +3478,20 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.162" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" +dependencies = [ + "arbitrary", + "cc", + "once_cell", +] [[package]] name = "libloading" @@ -3455,13 +3613,22 @@ dependencies = [ "winapi", ] +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + [[package]] name = "lru" version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.1", + "hashbrown 0.15.0", ] [[package]] @@ -3537,6 +3704,15 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", +] + [[package]] name = "md-5" version = "0.10.6" @@ -3605,6 +3781,15 @@ 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", +] + [[package]] name = "miniz_oxide" version = "0.8.0" @@ -3629,9 +3814,9 @@ dependencies = [ [[package]] name = "muda" -version = "0.15.3" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdae9c00e61cc0579bcac625e8ad22104c60548a025bfc972dc83868a28e1484" +checksum = "b8123dfd4996055ac9b15a60ad263b44b01e539007523ad7a4a533a3d93b0591" dependencies = [ "crossbeam-channel", "dpi", @@ -3816,6 +4001,12 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + [[package]] name = "notify-rust" version = "4.11.3" @@ -3876,6 +4067,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -3885,6 +4087,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -3912,7 +4125,7 @@ dependencies = [ "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -4227,7 +4440,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -4422,7 +4635,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -4550,7 +4763,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -4597,7 +4810,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -4619,7 +4832,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand 2.2.0", + "fastrand 2.1.1", "futures-io", ] @@ -4652,7 +4865,7 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide", + "miniz_oxide 0.8.0", ] [[package]] @@ -4673,15 +4886,15 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.4" +version = "3.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.39", + "rustix 0.38.37", "tracing", "windows-sys 0.59.0", ] @@ -4784,6 +4997,25 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +dependencies = [ + "quote", + "syn 2.0.85", +] + [[package]] name = "prost" version = "0.12.6" @@ -4804,7 +5036,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -4816,6 +5048,15 @@ 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" @@ -4886,11 +5127,10 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.7" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" +checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" dependencies = [ - "cfg_aliases", "libc", "once_cell", "socket2 0.5.7", @@ -4988,6 +5228,55 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.12.1", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive 0.4.2", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand 0.8.5", + "rand_chacha 0.3.1", + "simd_helpers", + "system-deps", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rgb", +] + [[package]] name = "raw-window-handle" version = "0.5.2" @@ -5096,9 +5385,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ "base64 0.22.1", "bytes", @@ -5187,6 +5476,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" + [[package]] name = "ring" version = "0.17.8" @@ -5287,9 +5582,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.39" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ "bitflags 2.6.0", "errno", @@ -5300,9 +5595,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.16" +version = "0.23.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" +checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" dependencies = [ "once_cell", "ring", @@ -5398,7 +5693,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -5428,9 +5723,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.1" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -5500,9 +5795,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.214" +version = "1.0.213" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" dependencies = [ "serde_derive", ] @@ -5542,13 +5837,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.213" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -5559,7 +5854,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -5582,7 +5877,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -5633,7 +5928,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -5776,6 +6071,15 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "siphasher" version = "0.3.11" @@ -5887,6 +6191,9 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] [[package]] name = "sptr" @@ -5968,9 +6275,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.87" +version = "2.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" dependencies = [ "proc-macro2", "quote", @@ -6000,7 +6307,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -6067,9 +6374,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.30.5" +version = "0.30.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63f1f6b2017cc33d7f6fc9c6186a2c0f5dfc985899a7b4fe9e64985c17533db3" +checksum = "a0dbbebe82d02044dfa481adca1550d6dd7bd16e086bc34fa0fbecceb5a63751" dependencies = [ "bitflags 2.6.0", "cocoa 0.26.0", @@ -6112,7 +6419,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -6123,9 +6430,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.43" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" +checksum = "4ff6c40d3aedb5e06b57c6f669ad17ab063dd1e63d977c6a88e7f4dfa4f04020" dependencies = [ "filetime", "libc", @@ -6231,7 +6538,7 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.8", - "syn 2.0.87", + "syn 2.0.85", "tauri-utils", "thiserror", "time", @@ -6249,7 +6556,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", "tauri-codegen", "tauri-utils", ] @@ -6273,11 +6580,12 @@ dependencies = [ [[package]] name = "tauri-plugin-clipboard-manager" -version = "2.0.2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a66feaa0fb7fce8e5073323d11ca381c9da7ac06f458e42b9ff77364b76a360" +checksum = "78b7d556886c15849198c0948fd7f4c880492f0461539176da0a8a70272e2904" dependencies = [ "arboard", + "image", "log", "serde", "serde_json", @@ -6469,9 +6777,9 @@ dependencies = [ [[package]] name = "tauri-plugin-window-state" -version = "2.0.2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683c8764751fbbcebf3a594bcee24cf84c62773fa0080d1b40fc80698472421e" +checksum = "fd1cef203a15b4772898e7bc8e57c1f34696e39848987dfcd294d51ba0525650" dependencies = [ "bitflags 2.6.0", "log", @@ -6587,14 +6895,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.14.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", - "fastrand 2.2.0", + "fastrand 2.1.1", "once_cell", - "rustix 0.38.39", + "rustix 0.38.37", "windows-sys 0.59.0", ] @@ -6647,7 +6955,7 @@ dependencies = [ "libc", "log", "memmem", - "num-derive", + "num-derive 0.3.3", "num-traits", "ordered-float", "regex", @@ -6677,22 +6985,22 @@ checksum = "a38c90d48152c236a3ab59271da4f4ae63d678c5d7ad6b7714d7cb9760be5e4b" [[package]] name = "thiserror" -version = "1.0.68" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.68" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -6796,9 +7104,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.1" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" dependencies = [ "backtrace", "bytes", @@ -6831,7 +7139,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -7080,7 +7388,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -7259,12 +7567,27 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +[[package]] +name = "unicode-bidi" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" + [[package]] name = "unicode-ident" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-segmentation" version = "1.12.0" @@ -7294,9 +7617,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.3" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -7360,6 +7683,17 @@ dependencies = [ "serde", ] +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.0" @@ -7501,7 +7835,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", "wasm-bindgen-shared", ] @@ -7535,7 +7869,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7567,7 +7901,7 @@ checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" dependencies = [ "cc", "downcast-rs", - "rustix 0.38.39", + "rustix 0.38.37", "scoped-tls", "smallvec", "wayland-sys", @@ -7580,7 +7914,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" dependencies = [ "bitflags 2.6.0", - "rustix 0.38.39", + "rustix 0.38.37", "wayland-backend", "wayland-scanner", ] @@ -7704,7 +8038,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -7733,7 +8067,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.39", + "rustix 0.38.37", ] [[package]] @@ -7877,7 +8211,7 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -7888,7 +8222,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -7899,7 +8233,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -7910,7 +8244,7 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -7921,7 +8255,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -7932,7 +8266,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -8327,7 +8661,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ "gethostname", - "rustix 0.38.39", + "rustix 0.38.37", "x11rb-protocol", ] @@ -8345,7 +8679,7 @@ checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", "linux-raw-sys 0.4.14", - "rustix 0.38.39", + "rustix 0.38.37", ] [[package]] @@ -8390,7 +8724,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", "synstructure", ] @@ -8403,7 +8737,7 @@ dependencies = [ "async-broadcast", "async-executor", "async-fs 2.1.2", - "async-io 2.4.0", + "async-io 2.3.4", "async-lock 3.4.0", "async-process 2.3.0", "async-recursion", @@ -8477,7 +8811,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -8497,7 +8831,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", "synstructure", ] @@ -8518,7 +8852,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -8540,7 +8874,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.85", ] [[package]] @@ -8614,6 +8948,30 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16099418600b4d8f028622f73ff6e3deaabdff330fb9a2a131dea781ee8b0768" +dependencies = [ + "zune-core", +] + [[package]] name = "zvariant" version = "4.0.0" diff --git a/src/components/setting/mods/backup-viewer.tsx b/src/components/setting/mods/backup-viewer.tsx index a21eb58c..078e9c5e 100644 --- a/src/components/setting/mods/backup-viewer.tsx +++ b/src/components/setting/mods/backup-viewer.tsx @@ -71,7 +71,6 @@ export const BackupViewer = forwardRef((props, ref) => { .map((file) => { const platform = file.filename.split("-")[0]; const fileBackupTimeStr = file.filename.match(FILENAME_PATTERN)!; - console.log(file, fileBackupTimeStr); if (fileBackupTimeStr === null) { return null; diff --git a/src/locales/en.json b/src/locales/en.json index 622cc93e..2eca4953 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -332,7 +332,7 @@ "clash_mode_direct": "Direct Mode", "toggle_system_proxy": "Enable/Disable System Proxy", "toggle_tun_mode": "Enable/Disable Tun Mode", - "Backup Setting": "Webdav Backup Setting", + "Backup Setting": "Backup Setting", "Runtime Config": "Runtime Config", "Open Conf Dir": "Open Conf Dir", "Open Core Dir": "Open Core Dir", diff --git a/src/locales/fa.json b/src/locales/fa.json index a6d4bd51..d8da4871 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -332,7 +332,7 @@ "clash_mode_direct": "حالت مستقیم", "toggle_system_proxy": "فعال/غیرفعال کردن پراکسی سیستم", "toggle_tun_mode": "فعال/غیرفعال کردن حالت Tun", - "Backup Setting": "تنظیمات پشتیبان گیری Webdav", + "Backup Setting": "تنظیمات پشتیبان گیری", "Runtime Config": "پیکربندی زمان اجرا", "Open Conf Dir": "باز کردن پوشه برنامه", "Open Core Dir": "باز کردن پوشه هسته", diff --git a/src/locales/zh.json b/src/locales/zh.json index fe8eb4b7..b32f9507 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -332,7 +332,7 @@ "clash_mode_direct": "直连模式", "toggle_system_proxy": "打开/关闭系统代理", "toggle_tun_mode": "打开/关闭 Tun 模式", - "Backup Setting": "Webdav备份设置", + "Backup Setting": "备份设置", "Runtime Config": "当前配置", "Open Conf Dir": "配置目录", "Open Core Dir": "内核目录", From a681fdeee1fa117f51230c538a856c2f4618a753 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 12 Nov 2024 19:34:53 +0800 Subject: [PATCH 215/288] fix: undefined error --- src/utils/websocket.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/utils/websocket.ts b/src/utils/websocket.ts index 9721341d..53484267 100644 --- a/src/utils/websocket.ts +++ b/src/utils/websocket.ts @@ -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); } From 9e4a8708e790f4858255e227db19ad559f9c7f2a Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 12 Nov 2024 19:35:56 +0800 Subject: [PATCH 216/288] fix: import error caused by dependency upgrade --- scripts/check.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/check.mjs b/scripts/check.mjs index a2e4cd70..e60b8cfa 100644 --- a/scripts/check.mjs +++ b/scripts/check.mjs @@ -1,7 +1,7 @@ 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"; @@ -232,7 +232,7 @@ async function resolveSidecar(binInfo) { } else if (zipFile.endsWith(".tgz")) { // tgz await fsp.mkdir(tempDir, { recursive: true }); - await tar.extract({ + await extract({ cwd: tempDir, file: tempZip, //strip: 1, // 可能需要根据实际的 .tgz 文件结构调整 From ec0d872f11df52189312bea1bff024ac68a692bc Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 12 Nov 2024 19:44:57 +0800 Subject: [PATCH 217/288] chore: update --- pnpm-lock.yaml | 248 ++++++++++++++++++++++++++++++------------------- 1 file changed, 154 insertions(+), 94 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f55fbe64..4dfd9293 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,8 +26,8 @@ importers: specifier: ^3.4.0 version: 3.4.0 "@mui/icons-material": - specifier: ^5.16.7 - version: 5.16.7(@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) + 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.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) @@ -98,11 +98,11 @@ importers: specifier: ^4.17.21 version: 4.17.21 monaco-editor: - specifier: ^0.49.0 - version: 0.49.0 + specifier: ^0.52.0 + version: 0.52.0 monaco-yaml: specifier: ^5.2.3 - version: 5.2.3(monaco-editor@0.49.0) + version: 5.2.3(monaco-editor@0.52.0) nanoid: specifier: ^5.0.8 version: 5.0.8 @@ -116,20 +116,20 @@ 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.53.2 version: 7.53.2(react@18.3.1) react-i18next: - specifier: ^13.5.0 - version: 13.5.0(i18next@23.16.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.12)(react@18.3.1) react-monaco-editor: - specifier: ^0.55.0 - version: 0.55.0(@types/react@18.3.12)(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.28.0 version: 6.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -146,8 +146,8 @@ 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.3 version: 1.0.3 @@ -220,7 +220,7 @@ importers: version: 5.4.11(@types/node@20.14.10)(sass@1.80.6)(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.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.80.6)(terser@5.36.0)) @@ -1401,6 +1401,13 @@ packages: } 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: { @@ -1466,16 +1473,16 @@ packages: integrity: sha512-nz1SlR9TdBYYPz4qKoNasMPRiGb4PaIHFkzLzhju0YVYS5QSuFF2+n7CsiHMIDcHv3piPu/xDWI53ruhOqvZwQ==, } - "@mui/icons-material@5.16.7": + "@mui/icons-material@6.1.6": resolution: { - integrity: sha512-UrGwDJCXEszbDI7yV047BYU5A28eGJ79keTCP4cc74WyncuVrnurlmIRxaHL8YK+LI1Kzq+/JM52IAkNnv4u+Q==, + 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 @@ -1895,6 +1902,13 @@ packages: } engines: { node: ">=18" } + "@pkgjs/parseargs@0.11.0": + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + } + engines: { node: ">=14" } + "@popperjs/core@2.11.8": resolution: { @@ -2703,12 +2717,12 @@ packages: } 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: @@ -3130,13 +3144,6 @@ packages: react: optional: true - fs-minipass@2.1.0: - resolution: - { - integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==, - } - engines: { node: ">= 8" } - fsevents@2.3.3: resolution: { @@ -3165,6 +3172,13 @@ packages: } engines: { node: ">=8" } + glob@10.4.5: + resolution: + { + integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, + } + hasBin: true + glob@11.0.0: resolution: { @@ -3375,6 +3389,12 @@ packages: integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, } + jackspeak@3.4.3: + resolution: + { + integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, + } + jackspeak@4.0.2: resolution: { @@ -3486,6 +3506,12 @@ packages: integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==, } + lru-cache@10.4.3: + resolution: + { + integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, + } + lru-cache@11.0.2: resolution: { @@ -3746,19 +3772,12 @@ packages: } engines: { node: 20 || >=22 } - minipass@3.3.6: + minimatch@9.0.5: resolution: { - integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==, + integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, } - engines: { node: ">=8" } - - minipass@5.0.0: - resolution: - { - integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==, - } - engines: { node: ">=8" } + engines: { node: ">=16 || 14 >=14.17" } minipass@7.1.2: resolution: @@ -3767,25 +3786,25 @@ packages: } engines: { node: ">=16 || 14 >=14.17" } - minizlib@2.1.2: + minizlib@3.0.1: resolution: { - integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==, + integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==, } - engines: { node: ">= 8" } + engines: { node: ">= 18" } - mkdirp@1.0.4: + mkdirp@3.0.1: resolution: { - integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, + 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.4.0: @@ -4001,6 +4020,13 @@ 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: { @@ -4107,12 +4133,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" @@ -4131,10 +4156,10 @@ packages: 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" @@ -4168,14 +4193,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: @@ -4320,6 +4345,13 @@ packages: } hasBin: true + rimraf@5.0.10: + resolution: + { + integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==, + } + hasBin: true + rollup@4.25.0: resolution: { @@ -4529,12 +4561,12 @@ 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.36.0: resolution: @@ -4862,11 +4894,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: @@ -5781,6 +5814,10 @@ snapshots: 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 @@ -5821,7 +5858,7 @@ snapshots: "@mui/core-downloads-tracker@6.1.6": {} - "@mui/icons-material@5.16.7(@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/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.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) @@ -6143,6 +6180,9 @@ snapshots: dependencies: semver: 7.6.3 + "@pkgjs/parseargs@0.11.0": + optional: true + "@popperjs/core@2.11.8": {} "@remix-run/router@1.21.0": {} @@ -6587,7 +6627,7 @@ snapshots: dependencies: readdirp: 4.0.2 - chownr@2.0.0: {} + chownr@3.0.0: {} cli-color@2.0.4: dependencies: @@ -6846,10 +6886,6 @@ snapshots: optionalDependencies: react: 18.3.1 - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - fsevents@2.3.3: optional: true @@ -6861,6 +6897,15 @@ snapshots: dependencies: pump: 3.0.2 + glob@10.4.5: + dependencies: + 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 @@ -6978,6 +7023,12 @@ snapshots: 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 @@ -7022,6 +7073,8 @@ snapshots: dependencies: tslib: 2.8.1 + lru-cache@10.4.3: {} + lru-cache@11.0.2: {} lru-cache@5.1.1: @@ -7293,22 +7346,20 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minipass@3.3.6: + minimatch@9.0.5: dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} + brace-expansion: 2.0.1 minipass@7.1.2: {} - minizlib@2.1.2: + minizlib@3.0.1: dependencies: - minipass: 3.3.6 - yallist: 4.0.0 + minipass: 7.1.2 + rimraf: 5.0.10 - mkdirp@1.0.4: {} + mkdirp@3.0.1: {} - monaco-editor@0.49.0: {} + monaco-editor@0.52.0: {} monaco-languageserver-types@0.4.0: dependencies: @@ -7322,18 +7373,18 @@ snapshots: 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.3(monaco-editor@0.49.0): + monaco-yaml@5.2.3(monaco-editor@0.52.0): dependencies: jsonc-parser: 3.3.1 - monaco-editor: 0.49.0 + 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.12 @@ -7429,6 +7480,11 @@ 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 @@ -7491,7 +7547,7 @@ snapshots: 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.26.0 react: 18.3.1 @@ -7502,7 +7558,7 @@ snapshots: dependencies: react: 18.3.1 - react-i18next@13.5.0(i18next@23.16.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.26.0 html-parse-stringify: 3.0.1 @@ -7532,10 +7588,10 @@ snapshots: transitivePeerDependencies: - supports-color - react-monaco-editor@0.55.0(@types/react@18.3.12)(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.12 - monaco-editor: 0.49.0 + monaco-editor: 0.52.0 prop-types: 15.8.1 react: 18.3.1 @@ -7629,6 +7685,10 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + rimraf@5.0.10: + dependencies: + glob: 10.4.5 + rollup@4.25.0: dependencies: "@types/estree": 1.0.6 @@ -7750,14 +7810,14 @@ 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.36.0: dependencies: @@ -7865,9 +7925,9 @@ snapshots: "@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.3.0(rollup@4.25.0)(typescript@5.6.3)(vite@5.4.11(@types/node@20.14.10)(sass@1.80.6)(terser@5.36.0)): dependencies: @@ -7935,7 +7995,7 @@ snapshots: yallist@3.1.1: {} - yallist@4.0.0: {} + yallist@5.0.0: {} yaml@1.10.2: {} From 6e8def3ef771330907e3ff2bfaec7087b5bdd0c4 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 12 Nov 2024 20:05:28 +0800 Subject: [PATCH 218/288] fix: syntax issues caused by upgrading mui5 --- src/components/base/base-fieldset.tsx | 2 +- src/components/proxy/provider-button.tsx | 26 +++++++++++++----------- src/components/proxy/proxy-item-mini.tsx | 4 +++- src/components/proxy/proxy-item.tsx | 14 ++++++------- src/components/rule/provider-button.tsx | 8 ++++++-- 5 files changed, 30 insertions(+), 24 deletions(-) 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/proxy/provider-button.tsx b/src/components/proxy/provider-button.tsx index ca81a428..f9fddfd4 100644 --- a/src/components/proxy/provider-button.tsx +++ b/src/components/proxy/provider-button.tsx @@ -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-item-mini.tsx b/src/components/proxy/proxy-item-mini.tsx index 0205070e..b80da185 100644 --- a/src/components/proxy/proxy-item-mini.tsx +++ b/src/components/proxy/proxy-item-mini.tsx @@ -239,7 +239,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..53f8a23a 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,12 @@ 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} } /> diff --git a/src/components/rule/provider-button.tsx b/src/components/rule/provider-button.tsx index a6e27113..27b06415 100644 --- a/src/components/rule/provider-button.tsx +++ b/src/components/rule/provider-button.tsx @@ -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), From 9d9cf274608c59fd59bc19a1785df78ef273beae Mon Sep 17 00:00:00 2001 From: huzibaca Date: Tue, 12 Nov 2024 22:49:08 +0800 Subject: [PATCH 219/288] fix: application restart, window status not saved --- src-tauri/src/feat.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 9374e2aa..48992686 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -15,6 +15,7 @@ use serde_yaml::{Mapping, Value}; 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() { @@ -51,6 +52,7 @@ pub fn restart_app() { 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()); }); } From c37f22dc65cf02126e64ffbc80d52ab5bfb0a285 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 13 Nov 2024 00:21:22 +0800 Subject: [PATCH 220/288] fix: mui grid has been deprecated --- .../setting/mods/backup-config-viewer.tsx | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/components/setting/mods/backup-config-viewer.tsx b/src/components/setting/mods/backup-config-viewer.tsx index fe4b99c2..21f64985 100644 --- a/src/components/setting/mods/backup-config-viewer.tsx +++ b/src/components/setting/mods/backup-config-viewer.tsx @@ -8,7 +8,8 @@ import { useLockFn } from "ahooks"; import { TextField, Button, - Grid, + Grid2, + Box, Stack, IconButton, InputAdornment, @@ -125,10 +126,10 @@ export const BackupConfigViewer = memo( return (
e.preventDefault()}> - - - - + + + + - - + + - - + + - - - - + + + + )} - - + +
); } From 176620e3bb619132ae692a2c497a97cf11fb9c52 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 13 Nov 2024 00:30:30 +0800 Subject: [PATCH 221/288] fix: InputProps is deprecated --- .../setting/mods/backup-config-viewer.tsx | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/components/setting/mods/backup-config-viewer.tsx b/src/components/setting/mods/backup-config-viewer.tsx index 21f64985..1ad0b6e8 100644 --- a/src/components/setting/mods/backup-config-viewer.tsx +++ b/src/components/setting/mods/backup-config-viewer.tsx @@ -165,17 +165,19 @@ export const BackupConfigViewer = memo( spellCheck="false" inputRef={passwordRef} {...register("password")} - InputProps={{ - endAdornment: ( - - - {showPassword ? : } - - - ), + slotProps={{ + input: { + endAdornment: ( + + + {showPassword ? : } + + + ), + }, }} /> From b4df1b6e42f8f184f9423f93c0c6ee43459e547e Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 13 Nov 2024 00:53:52 +0800 Subject: [PATCH 222/288] feat: add refresh button --- .../setting/mods/backup-config-viewer.tsx | 36 ++++++++++++------- src/components/setting/mods/backup-viewer.tsx | 3 ++ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/components/setting/mods/backup-config-viewer.tsx b/src/components/setting/mods/backup-config-viewer.tsx index 1ad0b6e8..67119be4 100644 --- a/src/components/setting/mods/backup-config-viewer.tsx +++ b/src/components/setting/mods/backup-config-viewer.tsx @@ -21,6 +21,7 @@ import { saveWebdavConfig, createWebdavBackup } from "@/services/cmds"; export interface BackupConfigViewerProps { onBackupSuccess: () => Promise; onSaveSuccess: () => Promise; + onRefresh: () => Promise; onInit: () => Promise; setLoading: (loading: boolean) => void; } @@ -29,6 +30,7 @@ export const BackupConfigViewer = memo( ({ onBackupSuccess, onSaveSuccess, + onRefresh, onInit, setLoading, }: BackupConfigViewerProps) => { @@ -186,14 +188,14 @@ export const BackupConfigViewer = memo( {webdavChanged || webdav_url === null || - webdav_username == null || - webdav_password == null ? ( + webdav_username === null || + webdav_password === null ? ( + <> + + + )} diff --git a/src/components/setting/mods/backup-viewer.tsx b/src/components/setting/mods/backup-viewer.tsx index 078e9c5e..4b7a370e 100644 --- a/src/components/setting/mods/backup-viewer.tsx +++ b/src/components/setting/mods/backup-viewer.tsx @@ -120,6 +120,9 @@ export const BackupViewer = forwardRef((props, ref) => { onSaveSuccess={async () => { fetchAndSetBackupFiles(); }} + onRefresh={async () => { + fetchAndSetBackupFiles(); + }} onInit={async () => { fetchAndSetBackupFiles(); }} From 632d389411d55489fd13da4fb653d86dec2751c1 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 13 Nov 2024 21:39:55 +0800 Subject: [PATCH 223/288] chore: update deps --- src-tauri/Cargo.lock | 313 ++++++++++++++++++++++--------------------- src-tauri/Cargo.toml | 2 +- 2 files changed, 158 insertions(+), 157 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 2bf8bd2f..a0a84448 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -145,7 +145,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -360,7 +360,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -400,7 +400,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -417,7 +417,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -456,7 +456,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f012b8cc0c850f34117ec8252a44418f2e34a2cf501de89e29b241ae5f79471" dependencies = [ "dirs 4.0.0", - "thiserror", + "thiserror 1.0.65", "winreg 0.10.1", ] @@ -695,7 +695,7 @@ dependencies = [ "static_assertions", "tap", "thin-vec", - "thiserror", + "thiserror 1.0.65", "time", ] @@ -736,7 +736,7 @@ checksum = "240f4126219a83519bad05c9a40bfc0303921eeb571fc2d7e44c17ffac99d3f1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "synstructure", ] @@ -828,7 +828,7 @@ checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -884,7 +884,7 @@ dependencies = [ "glib", "libc", "once_cell", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -927,7 +927,7 @@ dependencies = [ "semver 1.0.23", "serde", "serde_json", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -1168,7 +1168,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d" dependencies = [ "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1212,6 +1212,16 @@ 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" @@ -1404,7 +1414,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1414,7 +1424,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1438,7 +1448,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1449,7 +1459,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1511,7 +1521,7 @@ dependencies = [ "rs-snowflake", "rustc_version 0.2.3", "smol", - "thiserror", + "thiserror 1.0.65", "tokio", "tracing", ] @@ -1545,7 +1555,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1558,7 +1568,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1582,7 +1592,7 @@ dependencies = [ "log", "prost-types", "ringbuf", - "thiserror", + "thiserror 1.0.65", "tokio", "tokio-stream", "tonic", @@ -1718,7 +1728,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1750,7 +1760,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1863,7 +1873,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -1999,7 +2009,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7199d965852c3bac31f779ef99cbb4537f80e952e2d6aa0ffeb30cce00f4f46e" dependencies = [ "libc", - "thiserror", + "thiserror 1.0.65", "winapi", ] @@ -2025,15 +2035,6 @@ dependencies = [ "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.1" @@ -2082,7 +2083,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2200,7 +2201,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2415,7 +2416,7 @@ dependencies = [ "once_cell", "pin-project-lite", "smallvec", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2451,7 +2452,7 @@ dependencies = [ "memchr", "once_cell", "smallvec", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -2465,7 +2466,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -2496,7 +2497,7 @@ dependencies = [ "objc2-app-kit", "once_cell", "serde", - "thiserror", + "thiserror 1.0.65", "windows-sys 0.59.0", "x11-dl", ] @@ -2561,7 +2562,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -3082,7 +3083,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -3213,7 +3214,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -3336,7 +3337,7 @@ dependencies = [ "combine", "jni-sys", "log", - "thiserror", + "thiserror 1.0.65", "walkdir", "windows-sys 0.45.0", ] @@ -3371,39 +3372,16 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "json-patch" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc" -dependencies = [ - "jsonptr 0.4.7", - "serde", - "serde_json", - "thiserror", -] - [[package]] name = "json-patch" version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" dependencies = [ - "jsonptr 0.6.3", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "jsonptr" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c6e529149475ca0b2820835d3dce8fcc41c6b943ca608d32f35b449255e4627" -dependencies = [ - "fluent-uri", + "jsonptr", "serde", "serde_json", + "thiserror 1.0.65", ] [[package]] @@ -3550,7 +3528,7 @@ checksum = "612ed4ea9ce5acfb5d26339302528a5e1e59dfed95e9e11af3c083236ff1d15d" dependencies = [ "libc", "neli", - "thiserror", + "thiserror 1.0.65", "windows-sys 0.48.0", ] @@ -3607,7 +3585,7 @@ dependencies = [ "serde-value", "serde_json", "serde_yaml", - "thiserror", + "thiserror 1.0.65", "thread-id", "typemap-ors", "winapi", @@ -3828,7 +3806,7 @@ dependencies = [ "once_cell", "png", "serde", - "thiserror", + "thiserror 1.0.65", "windows-sys 0.59.0", ] @@ -3888,7 +3866,7 @@ dependencies = [ "ndk-sys", "num_enum", "raw-window-handle 0.6.2", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -3940,7 +3918,7 @@ dependencies = [ "cc", "libc", "serde", - "thiserror", + "thiserror 1.0.65", "winapi", ] @@ -4075,7 +4053,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4125,7 +4103,7 @@ dependencies = [ "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4440,7 +4418,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4611,7 +4589,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ "memchr", - "thiserror", + "thiserror 1.0.65", "ucd-trie", ] @@ -4635,7 +4613,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4763,7 +4741,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -4810,7 +4788,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5013,7 +4991,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" dependencies = [ "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5036,7 +5014,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5103,7 +5081,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2 0.5.7", - "thiserror", + "thiserror 1.0.65", "tokio", "tracing", ] @@ -5120,7 +5098,7 @@ dependencies = [ "rustc-hash", "rustls", "slab", - "thiserror", + "thiserror 1.0.65", "tinyvec", "tracing", ] @@ -5258,7 +5236,7 @@ dependencies = [ "rand_chacha 0.3.1", "simd_helpers", "system-deps", - "thiserror", + "thiserror 1.0.65", "v_frame", "wasm-bindgen", ] @@ -5326,7 +5304,7 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom 0.2.15", "libredox", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -5693,7 +5671,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5831,7 +5809,7 @@ checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782" dependencies = [ "log", "serde", - "thiserror", + "thiserror 1.0.65", "xml-rs", ] @@ -5843,7 +5821,7 @@ checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5854,7 +5832,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5877,7 +5855,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -5928,7 +5906,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6275,9 +6253,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.85" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -6307,7 +6285,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6332,7 +6310,7 @@ dependencies = [ "interfaces", "iptools", "log", - "thiserror", + "thiserror 1.0.65", "windows 0.58.0", "winreg 0.52.0", "xdg", @@ -6374,9 +6352,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.30.3" +version = "0.30.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0dbbebe82d02044dfa481adca1550d6dd7bd16e086bc34fa0fbecceb5a63751" +checksum = "6682a07cf5bab0b8a2bd20d0a542917ab928b5edb75ebd4eda6b05cbaab872da" dependencies = [ "bitflags 2.6.0", "cocoa 0.26.0", @@ -6419,7 +6397,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -6447,9 +6425,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.0.6" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3889b392db6d32a105d3757230ea0220090b8f94c90d3e60b6c5eb91178ab1b" +checksum = "e545de0a2dfe296fa67db208266cd397c5a55ae782da77973ef4c4fac90e9f2c" dependencies = [ "anyhow", "bytes", @@ -6486,7 +6464,7 @@ dependencies = [ "tauri-runtime", "tauri-runtime-wry", "tauri-utils", - "thiserror", + "thiserror 2.0.3", "tokio", "tracing", "tray-icon", @@ -6500,16 +6478,16 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.0.2" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f96827ccfb1aa40d55d0ded79562d18ba18566657a553f992a982d755148376" +checksum = "7bd2a4bcfaf5fb9f4be72520eefcb61ae565038f8ccba2a497d8c28f463b8c01" dependencies = [ "anyhow", "cargo_toml", "dirs 5.0.1", "glob", "heck 0.5.0", - "json-patch 3.0.1", + "json-patch", "schemars", "semver 1.0.23", "serde", @@ -6522,14 +6500,14 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.0.2" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947f16f47becd9e9cd39b74ee337fd1981574d78819be18e4384d85e5a0b82f" +checksum = "bf79faeecf301d3e969b1fae977039edb77a4c1f25cc0a961be298b54bff97cf" dependencies = [ "base64 0.22.1", "brotli", "ico", - "json-patch 2.0.0", + "json-patch", "plist", "png", "proc-macro2", @@ -6538,9 +6516,9 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.8", - "syn 2.0.85", + "syn 2.0.87", "tauri-utils", - "thiserror", + "thiserror 2.0.3", "time", "url", "uuid", @@ -6549,14 +6527,14 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.0.2" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bd1c8d4a66799d3438747c3a79705cd665a95d6f24cb5f315413ff7a981fe2a" +checksum = "c52027c8c5afb83166dacddc092ee8fff50772f9646d461d8c33ee887e447a03" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "tauri-codegen", "tauri-utils", ] @@ -6591,7 +6569,7 @@ dependencies = [ "serde_json", "tauri", "tauri-plugin", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -6608,7 +6586,7 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-utils", - "thiserror", + "thiserror 1.0.65", "url", "windows-registry 0.3.0", "windows-result 0.2.0", @@ -6655,7 +6633,7 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-plugin-fs", - "thiserror", + "thiserror 1.0.65", "url", ] @@ -6675,7 +6653,7 @@ dependencies = [ "serde_repr", "tauri", "tauri-plugin", - "thiserror", + "thiserror 1.0.65", "url", "uuid", ] @@ -6692,7 +6670,7 @@ dependencies = [ "serde_json", "tauri", "tauri-plugin", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -6709,7 +6687,7 @@ dependencies = [ "serde_repr", "tauri", "tauri-plugin", - "thiserror", + "thiserror 1.0.65", "time", "url", ] @@ -6741,7 +6719,7 @@ dependencies = [ "shared_child", "tauri", "tauri-plugin", - "thiserror", + "thiserror 1.0.65", "tokio", ] @@ -6767,7 +6745,7 @@ dependencies = [ "tauri", "tauri-plugin", "tempfile", - "thiserror", + "thiserror 1.0.65", "time", "tokio", "url", @@ -6787,14 +6765,14 @@ dependencies = [ "serde_json", "tauri", "tauri-plugin", - "thiserror", + "thiserror 1.0.65", ] [[package]] name = "tauri-runtime" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ef7363e7229ac8d04e8a5d405670dbd43dde8fc4bc3bc56105c35452d03784" +checksum = "cce18d43f80d4aba3aa8a0c953bbe835f3d0f2370aca75e8dbb14bd4bab27958" dependencies = [ "dpi", "gtk", @@ -6804,16 +6782,16 @@ dependencies = [ "serde", "serde_json", "tauri-utils", - "thiserror", + "thiserror 2.0.3", "url", "windows 0.58.0", ] [[package]] name = "tauri-runtime-wry" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62fa2068e8498ad007b54d5773d03d57c3ff6dd96f8c8ce58beff44d0d5e0d30" +checksum = "9f442a38863e10129ffe2cec7bd09c2dcf8a098a3a27801a476a304d5bb991d2" dependencies = [ "gtk", "http 1.1.0", @@ -6838,9 +6816,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc65d6f5c54e56b66258948a6d9e47a82ea41f4b5a7612bfbdd1634c2913ed0" +checksum = "9271a88f99b4adea0dc71d0baca4505475a0bbd139fb135f62958721aaa8fe54" dependencies = [ "brotli", "cargo_metadata", @@ -6848,8 +6826,9 @@ dependencies = [ "dunce", "glob", "html5ever", + "http 1.1.0", "infer", - "json-patch 2.0.0", + "json-patch", "kuchikiki", "log", "memchr", @@ -6864,7 +6843,7 @@ dependencies = [ "serde_json", "serde_with", "swift-rs", - "thiserror", + "thiserror 2.0.3", "toml 0.8.2", "url", "urlpattern", @@ -6964,7 +6943,7 @@ dependencies = [ "signal-hook", "terminfo", "termios", - "thiserror", + "thiserror 1.0.65", "ucd-trie", "unicode-segmentation", "vtparse", @@ -6989,7 +6968,16 @@ version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.65", +] + +[[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]] @@ -7000,7 +6988,18 @@ checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "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]] @@ -7139,7 +7138,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -7388,7 +7387,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -7447,7 +7446,7 @@ dependencies = [ "once_cell", "png", "serde", - "thiserror", + "thiserror 1.0.65", "windows-sys 0.59.0", ] @@ -7477,7 +7476,7 @@ dependencies = [ "log", "rand 0.8.5", "sha1", - "thiserror", + "thiserror 1.0.65", "url", "utf-8", ] @@ -7835,7 +7834,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "wasm-bindgen-shared", ] @@ -7869,7 +7868,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -8038,7 +8037,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8047,7 +8046,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3a3e2eeb58f82361c93f9777014668eb3d07e7d174ee4c819575a9208011886" dependencies = [ - "thiserror", + "thiserror 1.0.65", "windows 0.58.0", "windows-core 0.58.0", ] @@ -8211,7 +8210,7 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8222,7 +8221,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8233,7 +8232,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8244,7 +8243,7 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8255,7 +8254,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8266,7 +8265,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8593,12 +8592,13 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wry" -version = "0.46.3" +version = "0.47.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd5cdf57c66813d97601181349c63b96994b3074fc3d7a31a8cce96e968e3bbd" +checksum = "553ca1ce149982123962fac2506aa75b8b76288779a77e72b12fa2fc34938647" dependencies = [ "base64 0.22.1", "block2", + "cookie", "crossbeam-channel", "dpi", "dunce", @@ -8622,8 +8622,9 @@ dependencies = [ "sha2 0.10.8", "soup3", "tao-macros", - "thiserror", + "thiserror 1.0.65", "tracing", + "url", "webkit2gtk", "webkit2gtk-sys", "webview2-com", @@ -8724,7 +8725,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "synstructure", ] @@ -8811,7 +8812,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8831,7 +8832,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", "synstructure", ] @@ -8852,7 +8853,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8874,7 +8875,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn 2.0.87", ] [[package]] @@ -8899,7 +8900,7 @@ dependencies = [ "pbkdf2", "rand 0.8.5", "sha1", - "thiserror", + "thiserror 1.0.65", "time", "zeroize", "zopfli", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index dc5126fb..28f63521 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -37,7 +37,7 @@ tokio = { version = "1", features = ["full"] } serde = { version = "1.0", features = ["derive"] } reqwest = { version = "0.12", features = ["json", "rustls-tls"] } sysproxy = { git = "https://github.com/clash-verge-rev/sysproxy-rs", branch = "main" } -tauri = { version = "2.0.0-rc", features = [ +tauri = { version = "2.1.1", features = [ "protocol-asset", "devtools", "tray-icon", From 867c83b84c6035ab235c1d5c9b3c8e40af53e625 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Wed, 13 Nov 2024 21:49:53 +0800 Subject: [PATCH 224/288] chore: update dep(tauri-bubild) --- src-tauri/Cargo.lock | 696 +++++++++++-------------------------------- src-tauri/Cargo.toml | 2 +- 2 files changed, 179 insertions(+), 519 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index a0a84448..938a8c6a 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -11,12 +11,6 @@ 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" @@ -56,12 +50,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "aligned-vec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" - [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -79,9 +67,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" @@ -100,15 +88,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.91" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" +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", ] @@ -137,17 +125,6 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" -[[package]] -name = "arg_enum_proc_macro" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - [[package]] name = "arrayvec" version = "0.7.6" @@ -218,8 +195,8 @@ 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", ] @@ -243,7 +220,7 @@ checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" dependencies = [ "async-lock 3.4.0", "blocking", - "futures-lite 2.3.0", + "futures-lite 2.5.0", ] [[package]] @@ -268,18 +245,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.37", + "polling 3.7.4", + "rustix 0.38.40", "slab", "tracing", "windows-sys 0.59.0", @@ -329,7 +306,7 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.37", + "rustix 0.38.40", "windows-sys 0.48.0", ] @@ -340,15 +317,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" 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.37", + "futures-lite 2.5.0", + "rustix 0.38.40", "tracing", ] @@ -369,13 +346,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.37", + "rustix 0.38.40", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -456,7 +433,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f012b8cc0c850f34117ec8252a44418f2e34a2cf501de89e29b241ae5f79471" dependencies = [ "dirs 4.0.0", - "thiserror 1.0.65", + "thiserror 1.0.69", "winreg 0.10.1", ] @@ -466,29 +443,6 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" -[[package]] -name = "av1-grain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" -dependencies = [ - "anyhow", - "arrayvec", - "log", - "nom 7.1.3", - "num-rational", - "v_frame", -] - -[[package]] -name = "avif-serialize" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" -dependencies = [ - "arrayvec", -] - [[package]] name = "axum" version = "0.6.20" @@ -543,7 +497,7 @@ dependencies = [ "addr2line", "cfg-if", "libc", - "miniz_oxide 0.8.0", + "miniz_oxide", "object", "rustc-demangle", "windows-targets 0.52.6", @@ -567,12 +521,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" @@ -588,12 +536,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bitstream-io" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b81e1519b0d82120d2fd469d5bfb2919a9361c48b02d82d04befc1cdd2002452" - [[package]] name = "block" version = "0.1.6" @@ -636,7 +578,7 @@ dependencies = [ "async-channel 2.3.1", "async-task", "futures-io", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "piper", ] @@ -695,7 +637,7 @@ dependencies = [ "static_assertions", "tap", "thin-vec", - "thiserror 1.0.65", + "thiserror 1.0.69", "time", ] @@ -799,12 +741,6 @@ dependencies = [ "alloc-stdlib", ] -[[package]] -name = "built" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" - [[package]] name = "bumpalo" version = "3.16.0" @@ -884,7 +820,7 @@ dependencies = [ "glib", "libc", "once_cell", - "thiserror 1.0.65", + "thiserror 1.0.69", ] [[package]] @@ -927,7 +863,7 @@ dependencies = [ "semver 1.0.23", "serde", "serde_json", - "thiserror 1.0.65", + "thiserror 1.0.69", ] [[package]] @@ -942,9 +878,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.31" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "1aeb932158bd710538c73702db6945cb68a8fb08c519e6e12706b94263b36db8" dependencies = [ "jobserver", "libc", @@ -1135,12 +1071,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" @@ -1298,9 +1228,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "0ca741a962e1b0bff6d724a1a0958b686406e853bb14061f218562e1896f95e6" dependencies = [ "libc", ] @@ -1521,7 +1451,7 @@ dependencies = [ "rs-snowflake", "rustc_version 0.2.3", "smol", - "thiserror 1.0.65", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -1549,9 +1479,9 @@ 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", @@ -1592,7 +1522,7 @@ dependencies = [ "log", "prost-types", "ringbuf", - "thiserror 1.0.65", + "thiserror 1.0.69", "tokio", "tokio-stream", "tonic", @@ -1822,9 +1752,9 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "embed-resource" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4e24052d7be71f0efb50c201557f6fe7d237cfd5a64fd5bcd7fd8fe32dbbffa" +checksum = "b68b6f9f63a0b6a38bc447d4ce84e2b388f3ec95c99c641c8ff0dd3ef89a6379" dependencies = [ "cc", "memchr", @@ -1946,22 +1876,6 @@ dependencies = [ "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" @@ -1979,15 +1893,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.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8090f921a24b04994d9929e204f50b498a33ea6ba559ffaa05e04f7ee7fb5ab" +checksum = "07c6f4c64c1d33a3111c4466f7365ebdcc37c5bd1ea0d62aae2e3d722aacbedb" dependencies = [ "simd-adler32", ] @@ -2009,7 +1923,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7199d965852c3bac31f779ef99cbb4537f80e952e2d6aa0ffeb30cce00f4f46e" dependencies = [ "libc", - "thiserror 1.0.65", + "thiserror 1.0.69", "winapi", ] @@ -2032,16 +1946,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", - "miniz_oxide 0.8.0", -] - -[[package]] -name = "flume" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" -dependencies = [ - "spin", + "miniz_oxide", ] [[package]] @@ -2182,11 +2087,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", @@ -2380,18 +2285,10 @@ 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", -] - -[[package]] -name = "gif" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" -dependencies = [ - "color_quant", - "weezl", + "wasm-bindgen", ] [[package]] @@ -2416,7 +2313,7 @@ dependencies = [ "once_cell", "pin-project-lite", "smallvec", - "thiserror 1.0.65", + "thiserror 1.0.69", ] [[package]] @@ -2452,7 +2349,7 @@ dependencies = [ "memchr", "once_cell", "smallvec", - "thiserror 1.0.65", + "thiserror 1.0.69", ] [[package]] @@ -2487,9 +2384,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "global-hotkey" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1b75248f33c73df1ed69673f6cb36d2e048ae84d29aa1d3e53199d138ebb1df" +checksum = "b00d88f1be7bf4cd2e61623ce08e84be2dfa4eab458e5d632d3dab95f16c1f64" dependencies = [ "crossbeam-channel", "keyboard-types", @@ -2497,7 +2394,7 @@ dependencies = [ "objc2-app-kit", "once_cell", "serde", - "thiserror 1.0.65", + "thiserror 1.0.69", "windows-sys 0.59.0", "x11-dl", ] @@ -2603,16 +2500,6 @@ dependencies = [ "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" @@ -2645,9 +2532,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" dependencies = [ "allocator-api2", "equivalent", @@ -2918,9 +2805,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -3094,53 +2981,38 @@ 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.25.4" +version = "0.25.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc144d44a31d753b02ce64093d532f55ff8dc4ebf2ffb8a63c0dda691385acae" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" dependencies = [ "bytemuck", "byteorder-lite", - "color_quant", - "exr", - "gif", - "image-webp", "num-traits", "png", - "qoi", - "ravif", - "rayon", - "rgb", "tiff", - "zune-core", - "zune-jpeg", ] -[[package]] -name = "image-webp" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e031e8e3d94711a9ccb5d6ea357439ef3dcbed361798bd4071dc4d9793fbe22f" -dependencies = [ - "byteorder-lite", - "quick-error", -] - -[[package]] -name = "imgref" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" - [[package]] name = "indexmap" version = "1.9.3" @@ -3159,7 +3031,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.1", "serde", ] @@ -3206,17 +3078,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "interpolate_name" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - [[package]] name = "intrusive-collections" version = "0.9.7" @@ -3337,7 +3198,7 @@ dependencies = [ "combine", "jni-sys", "log", - "thiserror 1.0.65", + "thiserror 1.0.69", "walkdir", "windows-sys 0.45.0", ] @@ -3381,7 +3242,7 @@ dependencies = [ "jsonptr", "serde", "serde_json", - "thiserror 1.0.65", + "thiserror 1.0.69", ] [[package]] @@ -3424,12 +3285,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" @@ -3456,20 +3311,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.161" +version = "0.2.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" - -[[package]] -name = "libfuzzer-sys" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" -dependencies = [ - "arbitrary", - "cc", - "once_cell", -] +checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" [[package]] name = "libloading" @@ -3528,7 +3372,7 @@ checksum = "612ed4ea9ce5acfb5d26339302528a5e1e59dfed95e9e11af3c083236ff1d15d" dependencies = [ "libc", "neli", - "thiserror 1.0.65", + "thiserror 1.0.69", "windows-sys 0.48.0", ] @@ -3585,28 +3429,19 @@ dependencies = [ "serde-value", "serde_json", "serde_yaml", - "thiserror 1.0.65", + "thiserror 1.0.69", "thread-id", "typemap-ors", "winapi", ] -[[package]] -name = "loop9" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" -dependencies = [ - "imgref", -] - [[package]] name = "lru" version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.0", + "hashbrown 0.15.1", ] [[package]] @@ -3682,15 +3517,6 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", -] - [[package]] name = "md-5" version = "0.10.6" @@ -3759,15 +3585,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", -] - [[package]] name = "miniz_oxide" version = "0.8.0" @@ -3792,9 +3609,9 @@ dependencies = [ [[package]] name = "muda" -version = "0.15.1" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8123dfd4996055ac9b15a60ad263b44b01e539007523ad7a4a533a3d93b0591" +checksum = "fdae9c00e61cc0579bcac625e8ad22104c60548a025bfc972dc83868a28e1484" dependencies = [ "crossbeam-channel", "dpi", @@ -3806,7 +3623,7 @@ dependencies = [ "once_cell", "png", "serde", - "thiserror 1.0.65", + "thiserror 1.0.69", "windows-sys 0.59.0", ] @@ -3866,7 +3683,7 @@ dependencies = [ "ndk-sys", "num_enum", "raw-window-handle 0.6.2", - "thiserror 1.0.65", + "thiserror 1.0.69", ] [[package]] @@ -3918,7 +3735,7 @@ dependencies = [ "cc", "libc", "serde", - "thiserror 1.0.65", + "thiserror 1.0.69", "winapi", ] @@ -3979,12 +3796,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "noop_proc_macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" - [[package]] name = "notify-rust" version = "4.11.3" @@ -4045,17 +3856,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - [[package]] name = "num-integer" version = "0.1.46" @@ -4065,17 +3865,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -4589,7 +4378,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ "memchr", - "thiserror 1.0.65", + "thiserror 1.0.69", "ucd-trie", ] @@ -4810,7 +4599,7 @@ 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", ] @@ -4843,7 +4632,7 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.8.0", + "miniz_oxide", ] [[package]] @@ -4864,15 +4653,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.37", + "rustix 0.38.40", "tracing", "windows-sys 0.59.0", ] @@ -4975,25 +4764,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "profiling" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" -dependencies = [ - "profiling-procmacros", -] - -[[package]] -name = "profiling-procmacros" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" -dependencies = [ - "quote", - "syn 2.0.87", -] - [[package]] name = "prost" version = "0.12.6" @@ -5026,15 +4796,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" @@ -5070,9 +4831,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" dependencies = [ "bytes", "pin-project-lite", @@ -5081,34 +4842,38 @@ dependencies = [ "rustc-hash", "rustls", "socket2 0.5.7", - "thiserror 1.0.65", + "thiserror 2.0.3", "tokio", "tracing", ] [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", + "getrandom 0.2.15", "rand 0.8.5", "ring", "rustc-hash", "rustls", + "rustls-pki-types", "slab", - "thiserror 1.0.65", + "thiserror 2.0.3", "tinyvec", "tracing", + "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" dependencies = [ + "cfg_aliases", "libc", "once_cell", "socket2 0.5.7", @@ -5206,55 +4971,6 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "rav1e" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" -dependencies = [ - "arbitrary", - "arg_enum_proc_macro", - "arrayvec", - "av1-grain", - "bitstream-io", - "built", - "cfg-if", - "interpolate_name", - "itertools 0.12.1", - "libc", - "libfuzzer-sys", - "log", - "maybe-rayon", - "new_debug_unreachable", - "noop_proc_macro", - "num-derive 0.4.2", - "num-traits", - "once_cell", - "paste", - "profiling", - "rand 0.8.5", - "rand_chacha 0.3.1", - "simd_helpers", - "system-deps", - "thiserror 1.0.65", - "v_frame", - "wasm-bindgen", -] - -[[package]] -name = "ravif" -version = "0.11.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" -dependencies = [ - "avif-serialize", - "imgref", - "loop9", - "quick-error", - "rav1e", - "rgb", -] - [[package]] name = "raw-window-handle" version = "0.5.2" @@ -5304,7 +5020,7 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom 0.2.15", "libredox", - "thiserror 1.0.65", + "thiserror 1.0.69", ] [[package]] @@ -5315,7 +5031,7 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -5330,9 +5046,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -5363,9 +5079,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.8" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64 0.22.1", "bytes", @@ -5454,12 +5170,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "rgb" -version = "0.8.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" - [[package]] name = "ring" version = "0.17.8" @@ -5560,9 +5270,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0" dependencies = [ "bitflags 2.6.0", "errno", @@ -5573,9 +5283,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.15" +version = "0.23.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" +checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" dependencies = [ "once_cell", "ring", @@ -5599,6 +5309,9 @@ name = "rustls-pki-types" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +dependencies = [ + "web-time", +] [[package]] name = "rustls-webpki" @@ -5701,9 +5414,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" dependencies = [ "core-foundation-sys", "libc", @@ -5773,9 +5486,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.213" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] @@ -5809,15 +5522,15 @@ checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782" dependencies = [ "log", "serde", - "thiserror 1.0.65", + "thiserror 1.0.69", "xml-rs", ] [[package]] name = "serde_derive" -version = "1.0.213" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", @@ -6049,15 +5762,6 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" -[[package]] -name = "simd_helpers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" -dependencies = [ - "quote", -] - [[package]] name = "siphasher" version = "0.3.11" @@ -6169,9 +5873,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" @@ -6310,7 +6011,7 @@ dependencies = [ "interfaces", "iptools", "log", - "thiserror 1.0.65", + "thiserror 1.0.69", "windows 0.58.0", "winreg 0.52.0", "xdg", @@ -6408,9 +6109,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ff6c40d3aedb5e06b57c6f669ad17ab063dd1e63d977c6a88e7f4dfa4f04020" +checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" dependencies = [ "filetime", "libc", @@ -6541,9 +6242,9 @@ dependencies = [ [[package]] name = "tauri-plugin" -version = "2.0.2" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa4e6c94cb1d635f65a770c69e23de1bc054b0e4c554fa037a7cc7676333d39" +checksum = "e753f2a30933a9bbf0a202fa47d7cc4a3401f06e8d6dcc53b79aa62954828c79" dependencies = [ "anyhow", "glob", @@ -6558,18 +6259,17 @@ dependencies = [ [[package]] name = "tauri-plugin-clipboard-manager" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b7d556886c15849198c0948fd7f4c880492f0461539176da0a8a70272e2904" +checksum = "2a66feaa0fb7fce8e5073323d11ca381c9da7ac06f458e42b9ff77364b76a360" dependencies = [ "arboard", - "image", "log", "serde", "serde_json", "tauri", "tauri-plugin", - "thiserror 1.0.65", + "thiserror 1.0.69", ] [[package]] @@ -6586,7 +6286,7 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-utils", - "thiserror 1.0.65", + "thiserror 1.0.69", "url", "windows-registry 0.3.0", "windows-result 0.2.0", @@ -6633,7 +6333,7 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-plugin-fs", - "thiserror 1.0.65", + "thiserror 1.0.69", "url", ] @@ -6653,7 +6353,7 @@ dependencies = [ "serde_repr", "tauri", "tauri-plugin", - "thiserror 1.0.65", + "thiserror 1.0.69", "url", "uuid", ] @@ -6670,7 +6370,7 @@ dependencies = [ "serde_json", "tauri", "tauri-plugin", - "thiserror 1.0.65", + "thiserror 1.0.69", ] [[package]] @@ -6687,7 +6387,7 @@ dependencies = [ "serde_repr", "tauri", "tauri-plugin", - "thiserror 1.0.65", + "thiserror 1.0.69", "time", "url", ] @@ -6719,7 +6419,7 @@ dependencies = [ "shared_child", "tauri", "tauri-plugin", - "thiserror 1.0.65", + "thiserror 1.0.69", "tokio", ] @@ -6745,7 +6445,7 @@ dependencies = [ "tauri", "tauri-plugin", "tempfile", - "thiserror 1.0.65", + "thiserror 1.0.69", "time", "tokio", "url", @@ -6755,9 +6455,9 @@ dependencies = [ [[package]] name = "tauri-plugin-window-state" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd1cef203a15b4772898e7bc8e57c1f34696e39848987dfcd294d51ba0525650" +checksum = "683c8764751fbbcebf3a594bcee24cf84c62773fa0080d1b40fc80698472421e" dependencies = [ "bitflags 2.6.0", "log", @@ -6765,7 +6465,7 @@ dependencies = [ "serde_json", "tauri", "tauri-plugin", - "thiserror 1.0.65", + "thiserror 1.0.69", ] [[package]] @@ -6874,14 +6574,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", - "fastrand 2.1.1", + "fastrand 2.2.0", "once_cell", - "rustix 0.38.37", + "rustix 0.38.40", "windows-sys 0.59.0", ] @@ -6934,7 +6634,7 @@ dependencies = [ "libc", "log", "memmem", - "num-derive 0.3.3", + "num-derive", "num-traits", "ordered-float", "regex", @@ -6943,7 +6643,7 @@ dependencies = [ "signal-hook", "terminfo", "termios", - "thiserror 1.0.65", + "thiserror 1.0.69", "ucd-trie", "unicode-segmentation", "vtparse", @@ -6964,11 +6664,11 @@ checksum = "a38c90d48152c236a3ab59271da4f4ae63d678c5d7ad6b7714d7cb9760be5e4b" [[package]] name = "thiserror" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl 1.0.65", + "thiserror-impl 1.0.69", ] [[package]] @@ -6982,9 +6682,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", @@ -7103,9 +6803,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", @@ -7446,7 +7146,7 @@ dependencies = [ "once_cell", "png", "serde", - "thiserror 1.0.65", + "thiserror 1.0.69", "windows-sys 0.59.0", ] @@ -7476,7 +7176,7 @@ dependencies = [ "log", "rand 0.8.5", "sha1", - "thiserror 1.0.65", + "thiserror 1.0.69", "url", "utf-8", ] @@ -7566,27 +7266,12 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" - [[package]] name = "unicode-ident" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-segmentation" version = "1.12.0" @@ -7616,9 +7301,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", @@ -7682,17 +7367,6 @@ dependencies = [ "serde", ] -[[package]] -name = "v_frame" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" -dependencies = [ - "aligned-vec", - "num-traits", - "wasm-bindgen", -] - [[package]] name = "valuable" version = "0.1.0" @@ -7900,7 +7574,7 @@ checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" dependencies = [ "cc", "downcast-rs", - "rustix 0.38.37", + "rustix 0.38.40", "scoped-tls", "smallvec", "wayland-sys", @@ -7913,7 +7587,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" dependencies = [ "bitflags 2.6.0", - "rustix 0.38.37", + "rustix 0.38.40", "wayland-backend", "wayland-scanner", ] @@ -7962,6 +7636,16 @@ dependencies = [ "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", +] + [[package]] name = "webkit2gtk" version = "2.0.1" @@ -8046,7 +7730,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3a3e2eeb58f82361c93f9777014668eb3d07e7d174ee4c819575a9208011886" dependencies = [ - "thiserror 1.0.65", + "thiserror 1.0.69", "windows 0.58.0", "windows-core 0.58.0", ] @@ -8066,7 +7750,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.37", + "rustix 0.38.40", ] [[package]] @@ -8622,7 +8306,7 @@ dependencies = [ "sha2 0.10.8", "soup3", "tao-macros", - "thiserror 1.0.65", + "thiserror 1.0.69", "tracing", "url", "webkit2gtk", @@ -8662,7 +8346,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ "gethostname", - "rustix 0.38.37", + "rustix 0.38.40", "x11rb-protocol", ] @@ -8680,7 +8364,7 @@ checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", "linux-raw-sys 0.4.14", - "rustix 0.38.37", + "rustix 0.38.40", ] [[package]] @@ -8738,7 +8422,7 @@ 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.3.0", "async-recursion", @@ -8900,7 +8584,7 @@ dependencies = [ "pbkdf2", "rand 0.8.5", "sha1", - "thiserror 1.0.65", + "thiserror 1.0.69", "time", "zeroize", "zopfli", @@ -8949,30 +8633,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "zune-core" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" - -[[package]] -name = "zune-inflate" -version = "0.2.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "zune-jpeg" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16099418600b4d8f028622f73ff6e3deaabdff330fb9a2a131dea781ee8b0768" -dependencies = [ - "zune-core", -] - [[package]] name = "zvariant" version = "4.0.0" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 28f63521..5c1e2a1f 100755 --- 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" From d0f907f3492aef92c23884f122279a0ffc31061c Mon Sep 17 00:00:00 2001 From: wonfen Date: Thu, 14 Nov 2024 03:01:37 +0800 Subject: [PATCH 225/288] chore: update info & i18n --- src/components/setting/setting-clash.tsx | 27 +++++++++-------------- src/components/setting/setting-system.tsx | 4 +++- src/components/setting/setting-verge.tsx | 6 +++++ src/locales/fa.json | 4 +++- src/locales/ru.json | 6 +++-- src/locales/zh.json | 6 +++-- 6 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/components/setting/setting-clash.tsx b/src/components/setting/setting-clash.tsx index 9ef77c08..3881f529 100644 --- a/src/components/setting/setting-clash.tsx +++ b/src/components/setting/setting-clash.tsx @@ -1,19 +1,10 @@ import { useRef } from "react"; import { useTranslation } from "react-i18next"; -import { - TextField, - Select, - MenuItem, - Typography, - Tooltip, - IconButton, -} from "@mui/material"; - +import { TextField, Select, MenuItem, Typography } from "@mui/material"; import { SettingsRounded, ShuffleRounded, LanRounded, - InfoRounded, } from "@mui/icons-material"; import { DialogRef, Notice, Switch } from "@/components/base"; import { useClash } from "@/hooks/use-clash"; @@ -122,11 +113,10 @@ const SettingClash = ({ onError }: Props) => { - - - - + } > { - + + } + > { } + extra={ + + } > { backupRef.current?.open()} label={t("Backup Setting")} + extra={ + + } /> Date: Thu, 14 Nov 2024 03:16:32 +0800 Subject: [PATCH 226/288] fix: call parameter error --- src-tauri/src/core/backup.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/src/core/backup.rs b/src-tauri/src/core/backup.rs index f5e5d766..42b0f7b8 100644 --- a/src-tauri/src/core/backup.rs +++ b/src-tauri/src/core/backup.rs @@ -84,7 +84,7 @@ impl WebDavClient { 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 response = client.get(path.as_str()).await?; let content = response.bytes().await?; fs::write(&storage_path, &content)?; Ok(()) From e87e06dd37e91e804cc2478d5bd4ca929c7c4f82 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Thu, 14 Nov 2024 03:21:18 +0800 Subject: [PATCH 227/288] chore: unified code format --- src-tauri/src/core/backup.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/core/backup.rs b/src-tauri/src/core/backup.rs index 42b0f7b8..3d91a40d 100644 --- a/src-tauri/src/core/backup.rs +++ b/src-tauri/src/core/backup.rs @@ -54,9 +54,11 @@ impl WebDavClient { password.to_owned(), )) .build()?; - if let Err(_) = client + + if (client .list(dirs::BACKUP_DIR, reqwest_dav::Depth::Number(0)) - .await + .await) + .is_err() { client.mkcol(dirs::BACKUP_DIR).await?; } From 13fb8c5d7d91c0ac560c0a97ba27e8189a3d4999 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Fri, 15 Nov 2024 17:19:14 +0800 Subject: [PATCH 228/288] chore: update --- src-tauri/tauri.windows.conf.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json index db8de0f6..3241b2de 100644 --- a/src-tauri/tauri.windows.conf.json +++ b/src-tauri/tauri.windows.conf.json @@ -23,7 +23,8 @@ "app": { "trayIcon": { "iconPath": "icons/tray-icon.ico", - "iconAsTemplate": true + "iconAsTemplate": true, + "menuOnLeftClick": false }, "windows": [] } From 1e11eff811abd424b8092abac69b7dda7c180e31 Mon Sep 17 00:00:00 2001 From: Chenx Dust Date: Sat, 16 Nov 2024 01:35:22 +0800 Subject: [PATCH 229/288] feat: support mptcp and smux display (#1995) Corresponding pull request in mihomo: https://github.com/MetaCubeX/mihomo/pull/1646 --- src/components/proxy/proxy-item-mini.tsx | 10 ++++++++++ src/components/proxy/proxy-item.tsx | 2 ++ src/services/api.ts | 2 ++ src/services/types.d.ts | 5 +++++ 4 files changed, 19 insertions(+) diff --git a/src/components/proxy/proxy-item-mini.tsx b/src/components/proxy/proxy-item-mini.tsx index b80da185..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 + + )} )} diff --git a/src/components/proxy/proxy-item.tsx b/src/components/proxy/proxy-item.tsx index 53f8a23a..12bf50ab 100644 --- a/src/components/proxy/proxy-item.tsx +++ b/src/components/proxy/proxy-item.tsx @@ -127,6 +127,8 @@ export const ProxyItem = (props: Props) => { {showType && proxy.udp && UDP} {showType && proxy.xudp && XUDP} {showType && proxy.tfo && TFO} + {showType && proxy.mptcp && MPTCP} + {showType && proxy.smux && SMUX} } /> diff --git a/src/services/api.ts b/src/services/api.ts index c102f2f3..cfb85805 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -122,6 +122,8 @@ export const getProxies = async () => { udp: false, xudp: false, tfo: false, + mptcp: false, + smux: false, history: [], }; }; diff --git a/src/services/types.d.ts b/src/services/types.d.ts index 147323f1..349fb2dd 100644 --- a/src/services/types.d.ts +++ b/src/services/types.d.ts @@ -56,6 +56,8 @@ interface IProxyItem { udp: boolean; xudp: boolean; tfo: boolean; + mptcp: boolean; + smux: boolean; history: { time: string; delay: number; @@ -468,6 +470,7 @@ interface IProxyVlessConfig extends IProxyBaseConfig { fingerprint?: string; servername?: string; "client-fingerprint"?: ClientFingerprint; + smux?: boolean; } // vmess interface IProxyVmessConfig extends IProxyBaseConfig { @@ -496,6 +499,7 @@ interface IProxyVmessConfig extends IProxyBaseConfig { "global-padding"?: boolean; "authenticated-length"?: boolean; "client-fingerprint"?: ClientFingerprint; + smux?: boolean; } interface WireGuardPeerOptions { server?: string; @@ -604,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 { From 97717c648e5623af96d716b1c316f552b68d3af7 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 16 Nov 2024 03:12:11 +0800 Subject: [PATCH 230/288] fix: windows arm64 vsruntime is not installed --- src-tauri/packages/windows/installer.nsi | 35 ++++++++++-------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/src-tauri/packages/windows/installer.nsi b/src-tauri/packages/windows/installer.nsi index cc48e67e..17e94bd6 100644 --- a/src-tauri/packages/windows/installer.nsi +++ b/src-tauri/packages/windows/installer.nsi @@ -697,33 +697,26 @@ Var VC_REDIST_URL Var VC_REDIST_EXE Section CheckAndInstallVSRuntime - ; Set default values for x86 - StrCpy $VC_REDIST_URL "https://aka.ms/vs/17/release/vc_redist.x86.exe" - StrCpy $VC_REDIST_EXE "vc_redist.x86.exe" - - ${If} ${RunningX64} - ; Update values for x64 + ${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" - ${EndIf} - - - ${If} ${RunningX64} 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} - - IfFileExists "$SYSDIR\msvcp140.dll" Done - ; 如果文件不存在,进行安装 - ; 下载文件 + ; 下载并安装VC运行库 nsisdl::download "$VC_REDIST_URL" "$TEMP\$VC_REDIST_EXE" - Pop $0 ; 获取下载结果 - StrCmp $0 "success" +2 - ; 下载失败时,直接跳转到结束 - Goto Done - - ; 安装运行库 - nsExec::Exec '"$TEMP\$VC_REDIST_EXE" /quiet /norestart' + Pop $0 + ${If} $0 == "success" + nsExec::Exec '"$TEMP\$VC_REDIST_EXE" /quiet /norestart' + ${EndIf} Done: SectionEnd From f13140e39e361c04c1b302bf108a0b8d6c8aae8b Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 16 Nov 2024 04:46:20 +0800 Subject: [PATCH 231/288] fix: When the shortcut key closes the window, the window is minimized --- src-tauri/src/feat.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/src/feat.rs b/src-tauri/src/feat.rs index 48992686..03461913 100644 --- a/src-tauri/src/feat.rs +++ b/src-tauri/src/feat.rs @@ -21,7 +21,7 @@ use tauri_plugin_window_state::{AppHandleExt, StateFlags}; pub fn open_or_close_dashboard() { if let Some(window) = handle::Handle::global().get_window() { if let Ok(true) = window.is_focused() { - let _ = window.minimize(); + let _ = window.hide(); return; } } From 114d5ab54155249733940bf27b2db6e8b44c45b3 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 16 Nov 2024 05:59:01 +0800 Subject: [PATCH 232/288] fix: fixes #1940 --- src-tauri/src/core/hotkey.rs | 1 + src/utils/parse-hotkey.ts | 75 +++++++++++++++++++++++++++--------- 2 files changed, 57 insertions(+), 19 deletions(-) diff --git a/src-tauri/src/core/hotkey.rs b/src-tauri/src/core/hotkey.rs index de2d764c..5ffd0466 100755 --- a/src-tauri/src/core/hotkey.rs +++ b/src-tauri/src/core/hotkey.rs @@ -49,6 +49,7 @@ impl Hotkey { let app_handle = handle::Handle::global().app_handle().unwrap(); let manager = app_handle.global_shortcut(); + dbg!(&hotkey); if manager.is_registered(hotkey) { manager.unregister(hotkey)?; } 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": From eb78af7c7731c1212c1a7841e59f7dd361636405 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 16 Nov 2024 07:35:34 +0800 Subject: [PATCH 233/288] chore: remove debug code --- src-tauri/src/core/hotkey.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src-tauri/src/core/hotkey.rs b/src-tauri/src/core/hotkey.rs index 5ffd0466..de2d764c 100755 --- a/src-tauri/src/core/hotkey.rs +++ b/src-tauri/src/core/hotkey.rs @@ -49,7 +49,6 @@ impl Hotkey { let app_handle = handle::Handle::global().app_handle().unwrap(); let manager = app_handle.global_shortcut(); - dbg!(&hotkey); if manager.is_registered(hotkey) { manager.unregister(hotkey)?; } From 04f4f5f713642db0f7c92dd39c610589a458bf81 Mon Sep 17 00:00:00 2001 From: wonfen Date: Sat, 16 Nov 2024 10:15:50 +0800 Subject: [PATCH 234/288] release rc.7 --- UPDATELOG.md | 3 +++ package.json | 2 +- src-tauri/tauri.conf.json | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/UPDATELOG.md b/UPDATELOG.md index ec05e3e7..dd7c3375 100644 --- a/UPDATELOG.md +++ b/UPDATELOG.md @@ -28,6 +28,7 @@ - 增加 Webdav 备份功能 - 添加统一延迟的设置开关 - 添加 Windows 下自动检测并下载 vc runtime 的功能 +- 支持显示 mux 和 mptcp 的节点标识 ### Performance @@ -49,6 +50,8 @@ - 修复某些特定配置文件载入失败的问题 - 修复 MacOS 下 tun 模式 fakeip 不生效的问题 - 修复 Linux 下 关闭 tun 模式文件报错的问题 +- 修复快捷键设置的相关 bug +- 修复 Win 下点左键菜单闪现的问题(Mac 下的操作逻辑相反,默认情况下不管点左/右键均会打开菜单,闪现不属于 bug) --- diff --git a/package.json b/package.json index 9e693fdf..78f95f7a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "clash-verge", - "version": "2.0.0-rc.6", + "version": "2.0.0-rc.7", "license": "GPL-3.0-only", "scripts": { "dev": "cross-env RUST_BACKTRACE=1 tauri dev", diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index c4324268..5741ca52 100755 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -25,7 +25,7 @@ "devUrl": "http://localhost:3000/" }, "productName": "Clash Verge", - "version": "2.0.0-rc.6", + "version": "2.0.0-rc.7", "identifier": "io.github.clash-verge-rev.clash-verge-rev", "plugins": { "updater": { From 3575c16326baceeab51ae7b1a596ebfed4aacd31 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sat, 16 Nov 2024 23:09:10 +0800 Subject: [PATCH 235/288] fix: fixes #1968 --- src/components/connection/connection-detail.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/connection/connection-detail.tsx b/src/components/connection/connection-detail.tsx index 055fb712..2b308daa 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 ? ( From 7489f5e62d3ec76d86ff33e8fbfeb373448b1bff Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 17 Nov 2024 00:46:35 +0800 Subject: [PATCH 236/288] chore: update --- src-tauri/src/lib.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index bf572749..769a394e 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -45,11 +45,11 @@ pub fn run() { .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; - app.deep_link().register_all()?; - } + // #[cfg(target_os = "linux")] + // { + // use tauri_plugin_deep_link::DeepLinkExt; + // app.deep_link().register_all()?; + // } #[cfg(target_os = "macos")] { app.listen("deep-link://new-url", |event| { From ff297957c76ef0c804951797a3b0a2283a886917 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 17 Nov 2024 01:01:36 +0800 Subject: [PATCH 237/288] chore: update --- src-tauri/src/lib.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 769a394e..59b2ea80 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -45,11 +45,11 @@ pub fn run() { .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; - // app.deep_link().register_all()?; - // } + #[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| { From 7e5d6ef9b65818dd7b8170429de2f1e0dff480f9 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 17 Nov 2024 23:50:34 +0800 Subject: [PATCH 238/288] fix: webdav refreshes data and clears the original data when an error occurs. --- src/components/setting/mods/backup-viewer.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/setting/mods/backup-viewer.tsx b/src/components/setting/mods/backup-viewer.tsx index 4b7a370e..974b0f66 100644 --- a/src/components/setting/mods/backup-viewer.tsx +++ b/src/components/setting/mods/backup-viewer.tsx @@ -58,6 +58,8 @@ export const BackupViewer = forwardRef((props, ref) => { setBackupFiles(files); setTotal(files.length); } catch (error) { + setBackupFiles([]); + setTotal(0); console.error(error); // Notice.error(t("Failed to fetch backup files")); } finally { From 415b4879f1c6172676ac800cc892f237aecf12a5 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Sun, 17 Nov 2024 23:57:28 +0800 Subject: [PATCH 239/288] fix: webdav list interface compatibility issue --- src-tauri/src/core/backup.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src-tauri/src/core/backup.rs b/src-tauri/src/core/backup.rs index 3d91a40d..6e432c73 100644 --- a/src-tauri/src/core/backup.rs +++ b/src-tauri/src/core/backup.rs @@ -94,8 +94,9 @@ impl WebDavClient { pub async fn list(&self) -> Result, Error> { let client = self.get_client().await?; + let path = format!("{}/", dirs::BACKUP_DIR); let files = client - .list(dirs::BACKUP_DIR, reqwest_dav::Depth::Number(1)) + .list(path.as_str(), reqwest_dav::Depth::Number(1)) .await?; let mut final_files = Vec::new(); for file in files { From 7f0d9952aa57dc87fe3d69ad9e419c628c9a1d57 Mon Sep 17 00:00:00 2001 From: "Christine." <105919355+Tychristine@users.noreply.github.com> Date: Mon, 18 Nov 2024 00:20:21 +0800 Subject: [PATCH 240/288] chore: Replace test URL to support iPv4&iPv6 (#2033) --- src-tauri/src/core/clash_api.rs | 2 +- src/components/setting/mods/misc-viewer.tsx | 2 +- src/services/api.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src-tauri/src/core/clash_api.rs b/src-tauri/src/core/clash_api.rs index a1b9ab89..97e98e8d 100644 --- a/src-tauri/src/core/clash_api.rs +++ b/src-tauri/src/core/clash_api.rs @@ -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 = "https://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()); diff --git a/src/components/setting/mods/misc-viewer.tsx b/src/components/setting/mods/misc-viewer.tsx index fef0511c..7bbfc8e2 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="https://www.gstatic.com/generate_204" + placeholder="https://cp.cloudflare.com/generate_204" onChange={(e) => setValues((v) => ({ ...v, defaultLatencyTest: e.target.value })) } diff --git a/src/services/api.ts b/src/services/api.ts index cfb85805..4c37869b 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -76,7 +76,7 @@ export const getProxyDelay = async ( ) => { const params = { timeout: timeout || 10000, - url: url || "http://1.1.1.1", + url: url || "https://cp.cloudflare.com/generate_204", }; const instance = await getAxios(); const result = await instance.get( @@ -258,7 +258,7 @@ export const getGroupProxyDelays = async ( ) => { const params = { timeout: timeout || 10000, - url: url || "http://1.1.1.1", + url: url || "https://cp.cloudflare.com/generate_204", }; const instance = await getAxios(); const result = await instance.get( From d8cf585fc53675c8956067fc59123062d4d524ab Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 18 Nov 2024 01:07:16 +0800 Subject: [PATCH 241/288] fix: the CJS build of Vite's Node API is deprecated --- vite.config.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/vite.config.ts b/vite.config.ts index 9e4f7140..43321025 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -43,6 +43,13 @@ export default defineConfig({ "@root": path.resolve("."), }, }, + css: { + preprocessorOptions: { + scss: { + api: "modern-compiler", + }, + }, + }, define: { OS_PLATFORM: `"${process.platform}"`, }, From 132641f2695279c94af874717fba03ec44fb802a Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 18 Nov 2024 01:21:00 +0800 Subject: [PATCH 242/288] fix: the CJS build of Vite's Node API is deprecated, part 2 --- package.json | 1 + vite.config.ts => vite.config.mts | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) rename vite.config.ts => vite.config.mts (84%) diff --git a/package.json b/package.json index 78f95f7a..bb24cbd0 100644 --- a/package.json +++ b/package.json @@ -99,5 +99,6 @@ "singleQuote": false, "endOfLine": "lf" }, + "type": "module", "packageManager": "pnpm@9.1.4" } diff --git a/vite.config.ts b/vite.config.mts similarity index 84% rename from vite.config.ts rename to vite.config.mts index 43321025..0a29d937 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: [ { From 221b732472859803b8d0de79793193411fb63e21 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 18 Nov 2024 05:58:06 +0800 Subject: [PATCH 243/288] refactor: logger fetch logic --- src-tauri/src/cmds.rs | 7 +--- src-tauri/src/core/clash_api.rs | 3 +- src-tauri/src/core/core.rs | 18 ++-------- src-tauri/src/core/logger.rs | 36 ------------------- src-tauri/src/core/mod.rs | 1 - src-tauri/src/lib.rs | 1 - src/hooks/use-log-data.ts | 61 ++++++++++++++++++--------------- src/pages/logs.tsx | 26 +++++++------- src/services/cmds.ts | 23 ------------- 9 files changed, 50 insertions(+), 126 deletions(-) delete mode 100644 src-tauri/src/core/logger.rs diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index 5a71440f..348f19d4 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -8,7 +8,7 @@ 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; @@ -216,11 +216,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())?; diff --git a/src-tauri/src/core/clash_api.rs b/src-tauri/src/core/clash_api.rs index 97e98e8d..3dd3b572 100644 --- a/src-tauri/src/core/clash_api.rs +++ b/src-tauri/src/core/clash_api.rs @@ -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="); diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index 947fa56f..ae3d71d3 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -1,5 +1,5 @@ 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, Result}; @@ -43,24 +43,13 @@ impl CoreManager { let test_dir = dirs::path_to_str(&test_dir)?; let app_handle = handle::Handle::global().app_handle().unwrap(); - let output = app_handle + let _ = 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(()) } @@ -136,9 +125,6 @@ impl CoreManager { self.check_config().await?; - // 清掉旧日志 - Logger::global().clear_log(); - match self.restart_core().await { Ok(_) => { Config::verge().apply(); 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 32bb267c..098052b9 100644 --- a/src-tauri/src/core/mod.rs +++ b/src-tauri/src/core/mod.rs @@ -4,7 +4,6 @@ pub mod clash_api; 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/lib.rs b/src-tauri/src/lib.rs index 59b2ea80..f6af33fd 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -88,7 +88,6 @@ pub fn run() { cmds::restart_app, // clash cmds::get_clash_info, - cmds::get_clash_logs, cmds::patch_clash_config, cmds::change_clash_core, cmds::get_runtime_config, diff --git a/src/hooks/use-log-data.ts b/src/hooks/use-log-data.ts index 98cfb5b6..13339aa2 100644 --- a/src/hooks/use-log-data.ts +++ b/src/hooks/use-log-data.ts @@ -3,46 +3,51 @@ import { useEnableLog } from "../services/states"; import { createSockette } from "../utils/websocket"; import { useClashInfo } from "./use-clash"; import dayjs from "dayjs"; -import { getClashLogs } from "../services/cmds"; const MAX_LOG_NUM = 1000; -export const useLogData = () => { +// 添加 LogLevel 类型定义 +export type LogLevel = "warning" | "info" | "debug" | "error"; + +const buildWSUrl = (server: string, secret: string, logLevel: LogLevel) => { + const baseUrl = `ws://${server}/logs`; + const params = new URLSearchParams(); + + if (secret) { + params.append("token", encodeURIComponent(secret)); + } + params.append("level", logLevel); + const queryString = params.toString(); + return queryString ? `${baseUrl}?${queryString}` : baseUrl; +}; + +export const useLogData = (logLevel: LogLevel) => { const { clashInfo } = useClashInfo(); const [enableLog] = useEnableLog(); - return useSWRSubscription( - enableLog && clashInfo ? "getClashLog" : null, + return useSWRSubscription( + enableLog && clashInfo ? ["getClashLog", logLevel] : null, (_key, { next }) => { const { server = "", secret = "" } = clashInfo!; - // populate the initial logs - getClashLogs().then( - (logs) => next(null, logs), - (err) => next(err) - ); + const s = createSockette(buildWSUrl(server, secret, logLevel), { + onmessage(event) { + const data = JSON.parse(event.data) as ILogItem; - 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"); - // 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); - }, - } - ); + if (l.length >= MAX_LOG_NUM) l.shift(); + return [...l, { ...data, time }]; + }); + }, + onerror(event) { + this.close(); + next(event); + }, + }); return () => { s.close(); diff --git a/src/pages/logs.tsx b/src/pages/logs.tsx index 71447cef..b6310a25 100644 --- a/src/pages/logs.tsx +++ b/src/pages/logs.tsx @@ -6,7 +6,7 @@ import { PlayCircleOutlineRounded, PauseCircleOutlineRounded, } from "@mui/icons-material"; -import { useLogData } from "@/hooks/use-log-data"; +import { useLogData, LogLevel } from "@/hooks/use-log-data"; import { useEnableLog } from "@/services/states"; import { BaseEmpty, BasePage } from "@/components/base"; import LogItem from "@/components/log/log-item"; @@ -17,19 +17,19 @@ import { mutate } from "swr"; const LogPage = () => { const { t } = useTranslation(); - const { data: logData = [] } = useLogData(); const [enableLog, setEnableLog] = useEnableLog(); const theme = useTheme(); const isDark = theme.palette.mode === "dark"; - const [logState, setLogState] = useState("all"); + const [logState, setLogState] = useState("info"); const [match, setMatch] = useState(() => (_: string) => true); + const { data: logData } = useLogData(logState); const filterLogs = useMemo(() => { - return logData.filter( - (data) => - (logState === "all" ? true : data.type.includes(logState)) && - match(data.payload) - ); + return logData + ? logData.filter( + (data) => data.type.includes(logState) && match(data.payload) + ) + : []; }, [logData, logState, match]); return ( @@ -80,12 +80,12 @@ const LogPage = () => { > setLogState(e.target.value)} + onChange={(e) => setLogState(e.target.value as LogLevel)} > - ALL - INFO - WARN - ERROR + INFO + WARN + ERROR + DEBUG setMatch(() => match)} /> diff --git a/src/services/cmds.ts b/src/services/cmds.ts index 9a416c28..09e22d03 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"); } From 3b8147b6ad15200a1135e076b1a4023dd13bb105 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 18 Nov 2024 06:01:51 +0800 Subject: [PATCH 244/288] chore: typo warn -> warning --- src/pages/logs.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/logs.tsx b/src/pages/logs.tsx index b6310a25..06518d35 100644 --- a/src/pages/logs.tsx +++ b/src/pages/logs.tsx @@ -83,7 +83,7 @@ const LogPage = () => { onChange={(e) => setLogState(e.target.value as LogLevel)} > INFO - WARN + WARNING ERROR DEBUG From 62eb070c1b32b0006abe268e7b29c1afe4e25320 Mon Sep 17 00:00:00 2001 From: huzibaca Date: Mon, 18 Nov 2024 06:48:23 +0800 Subject: [PATCH 245/288] refactor: use zustand store, rewrite log clearing logic --- package.json | 3 +- pnpm-lock.yaml | 30 ++++++++++++++++++ src/hooks/use-log-data.ts | 67 ++++++++++++++++++++++++++++++--------- src/pages/logs.tsx | 8 ++--- 4 files changed, 87 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index bb24cbd0..a4764b99 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,8 @@ "sockette": "^2.0.6", "swr": "^2.2.5", "tar": "^7.4.3", - "types-pac": "^1.0.3" + "types-pac": "^1.0.3", + "zustand": "^5.0.1" }, "devDependencies": { "@actions/github": "^5.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4dfd9293..56654321 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -151,6 +151,9 @@ importers: types-pac: 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 @@ -4916,6 +4919,27 @@ packages: engines: { node: ">= 14" } hasBin: true + 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: { @@ -8001,4 +8025,10 @@ snapshots: yaml@2.6.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/src/hooks/use-log-data.ts b/src/hooks/use-log-data.ts index 13339aa2..5957aeed 100644 --- a/src/hooks/use-log-data.ts +++ b/src/hooks/use-log-data.ts @@ -3,12 +3,20 @@ import { useEnableLog } from "../services/states"; import { createSockette } from "../utils/websocket"; import { useClashInfo } from "./use-clash"; import dayjs from "dayjs"; +import { create } from "zustand"; const MAX_LOG_NUM = 1000; -// 添加 LogLevel 类型定义 export type LogLevel = "warning" | "info" | "debug" | "error"; +// 添加 ILogItem 接口定义 +interface ILogItem { + time?: string; + type: string; + payload: string; + [key: string]: any; +} + const buildWSUrl = (server: string, secret: string, logLevel: LogLevel) => { const baseUrl = `ws://${server}/logs`; const params = new URLSearchParams(); @@ -21,12 +29,44 @@ const buildWSUrl = (server: string, secret: string, logLevel: LogLevel) => { 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: [], + }, + clearLogs: (level?: LogLevel) => + set((state: LogStore) => ({ + logs: level + ? { ...state.logs, [level]: [] } + : { warning: [], info: [], debug: [], error: [] }, + })), + 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(); - return useSWRSubscription( + useSWRSubscription( enableLog && clashInfo ? ["getClashLog", logLevel] : null, (_key, { next }) => { const { server = "", secret = "" } = clashInfo!; @@ -34,14 +74,8 @@ export const useLogData = (logLevel: LogLevel) => { const s = createSockette(buildWSUrl(server, secret, logLevel), { 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 }]; - }); + const time = dayjs().format("MM-DD HH:mm:ss"); + appendLog(logLevel, { ...data, time }); }, onerror(event) { this.close(); @@ -52,10 +86,13 @@ export const useLogData = (logLevel: LogLevel) => { return () => { s.close(); }; - }, - { - fallbackData: [], - keepPreviousData: true, } ); + + return logs[logLevel]; +}; + +// 导出清空日志的方法 +export const clearLogs = (level?: LogLevel) => { + useLogStore.getState().clearLogs(level); }; diff --git a/src/pages/logs.tsx b/src/pages/logs.tsx index 06518d35..b51abfe8 100644 --- a/src/pages/logs.tsx +++ b/src/pages/logs.tsx @@ -6,7 +6,7 @@ import { PlayCircleOutlineRounded, PauseCircleOutlineRounded, } from "@mui/icons-material"; -import { useLogData, LogLevel } 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"; @@ -22,7 +22,7 @@ const LogPage = () => { const isDark = theme.palette.mode === "dark"; const [logState, setLogState] = useState("info"); const [match, setMatch] = useState(() => (_: string) => true); - const { data: logData } = useLogData(logState); + const logData = useLogData(logState); const filterLogs = useMemo(() => { return logData @@ -56,10 +56,8 @@ const LogPage = () => {