From ed7e6a3495de6c12c8bc9f1d8845d01adc9fd835 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 3c24d4bc4e7977ddd956a932937beb58cede1a9c 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 894960ef5a5400dd36525ecf82bd690c7ddf0e89 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 4a769970440754077fc65a3d1e3e28b3f62acb2d 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 3c17fca369d4e35d44f2511d0def3024ea37769d 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 fd963a8e66096530e7328fe268870f070f31c1fd 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 1b2509d5bcc9230d9fb1282d90dbca48aba18de7 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 772e01ad40e6023792bb741eb91114559d477ca1 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 0c6d417d8c4656119d77a2a26590289e048e14c5 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 07415e512f9fd4f82403234e589046e75323e7cb 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 db615b932c53f5474547173ce28dcad1caaa6728 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 983d1ea361f31842650d0870f4c9297096480301 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 a0b266fef80e57bb51ecb1159bb443f9272298c6 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 e8311dd3066922062a2bae79399798ae403ad492 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 892d4e597eb88a95dd51e13fd3915f023ab093ce 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 a398e28ac0d44478bef8d45263901b6d1499229b 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 b3626a786ddd7d0d863de49476013c4419db7cb9 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 b6e1d71b81fa3db38e391e2fd9407fca9158eefc 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 fc49e4a0da3e3b0382ee4ca495f597f17229b627 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 c66986f065429de03a0b622b917eda6c37bcebed 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 934674a8d7f2f6803bb02d800f2a41347cc8ba69 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 b6fc6a751a20a58282ef6d3a9c4bbab34f18ea7a 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 7dad46adb4a32512edb5e016dfbf4e69897e4c48 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 2af2d3664f8f73c34e3fa43d166184b61b0169f6 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 3e19e574e6e84b6c979ddb7057c459df8e295d08 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 4a7f8dbe09bcbd57cd4d94d20238cbddedc3a425 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 659f854f62331bcfc9d1efae1941e6ee3591b004 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 10cd0a1f3048c0593c3b25f24b8863e872c145d8 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 f31fe1440d68a8b2489b79e16fabdbcbeb70141b 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 95fb4f2e50d503740d6eb852cd274668837059f0 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 d18b78c11c3af84be02a3f143bd840be08e130c7 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 2f61dc9bc655e300f8e9a63ee12726b146c33eb2 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 2c612e371f376ea020757de1117db49078aa7954 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 8bea0db843aee027fb3c020f3a62a372e6ccb650 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 9a08740e5b1cf7567f95d00f29f6facb668b1bbd 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 c17ea74856cf67a0d4f1e4250ee3f0fc7a7ebfa1 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 414f9e9e966ee357a2afce4890bb94ac5449068c 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 dffd663d7a8c0fa2553ede9c9e86a12c6ba6adbb 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 06e1d0f8dafdda4bd9cc9da55e0001bf542902c2 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 f18cd923181140933af81e285ffea520e89239eb 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 a38040d0ea7192161cb243b5d168b12722ada8e0 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 f45600454356abeada1d02b79adc5b7398c050b0 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 d9671faca710ade167d10020466341fda10c1fa1 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 52fcdf28fa3babe6edbd88319031644074f5d8cc 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 98edb048b7ccc66d5ae2ae8644f6b868a7480f26 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 d9671faca710ade167d10020466341fda10c1fa1. --- 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 0792ac7de835cb9f965e78f78f4c57b3b46da70a 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 f9f1721d668a1f5e809670c97f55bfa8066e9325 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 f6fce6bd317796983dcd5876dce7219bbcf78756 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 2cdf33d8a123b46571759fa0a6983f257f771b86 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 f6fce6bd317796983dcd5876dce7219bbcf78756. --- 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 2263ade1870898aab27ad0699f064a5009928621 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 3d6faecaed69581a24b05a1facd12ae618f10f4d 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 1c894f3cfaf2247007affd67199f7429c1f53ebd 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 4d57c64b0d9fdef3780aba640e60b2ce6a200ae4 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 961b86dcd2a1839e07326592320e55beb5631903 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 45b48ede4496a9ffc40cbc194552f5de4619e2d1 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 3154b8ce55b4424c600ce7d779222fbea1250843 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 d9e5387bff7043651213466212d8828bec394a75 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 57f1c005e6175167f4cf42746c9e82b17a770997 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 f82b0f259c44d48e25a562f538febf262775e696 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 54296ba84afd53844a4bd48ba668f6853b5da8ac 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 d1eeeab7b15a676b4829a9191650b053eb1de97d 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 b350b605a882e7813634c5288f53602dcf791a95 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 0bacfa9286cc650a06fc4943d40114222f3d6aed 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 99ea6d508057e5aeab03f66206c29f8c2130a423 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 b9c8fa61b2f7fab8920a7284c79ecfeb3f58f0ed 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 0bacfa9286cc650a06fc4943d40114222f3d6aed. --- 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 1fb3b876972e70410c53a87ecf9696998b5b4445 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 d7f033bd4667e958a73b79c0159e7fc939710f9f 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 0a8be603c852ff9b50938653e0f3d4d59256956e 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 de507f7ec9b05af1ad2e3086173ec4761ac07ae5 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 f367a81e447853b43dd405d05bf8e62636867917 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 ce7818c436c143518b2cebfbcac7a737444411d2 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 c3cba03ac65b30b7ff451ba3cc083c57b3db9828 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 9591fb2c2168728f26764cb6b21deb1afc37eb1b 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 60b1e47ae6aef915f8fd2da6e81c53bc53729dba 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 d73366984f9d1b70e0b234226b256574f29e3c7a 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 c10d782524f7bb734a773bad3980bf33e9a5af95 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 dc5cb2e1b8d5bd79fdbd5ced875bf18a629e933c 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 10592ca5a856a1733793d3f2116e3eb1a954f708 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 32b16790d3773a33e81374883c6ce7507e8cfd8b 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 10211d1d030fe6c6dd8cb9d60d4f3ab555b6ae08 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 2b9fa0929354881f6b7f296c90ea1d8930ef19a7 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 44b41873657eb3ffcb6f6aaabea5cdf69b52d51a 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 9a7826752f37c8d72f63ed4243fda208d539b1ff 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 071665f0c39ab54dcdc7f25cfbae5a3b3c4abd9d 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 4c963b39787e2acef83f8aa3a0a26eb29c7d148c 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 0ca90ed082bf34cf3ad0f627d87da6ccecbb0ffb 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 591c1cb454fc5609d8d2686aae35c1283b904f8b 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 d8c85007d495dfaca2b50f8f13838972eaf3fb3d 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 953be61d89bf336debda783857ab724442a79ff8 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 30678904eebf10e621a57affaba9f56bb51b58e3 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 e0d96c0ce17dc66bfd0ddecb01e425847cb4afbb 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 7869ce060f5214e2048e186a9d25c3162aed994e 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 5fdb52d8d046f8bada72c97bc2cfaf08805cd3b6 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 c5eacd1627412406b604755a47b1c2d1be80ab02 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 efd8ef038060d97c9b4df9b5e2bc57210245c739 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 8a69713f6ca254abffaa660cfbfb052765227dee 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 35f5e4ca417625fc7368bf2c64e569a011edc708 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 9b2b447b8baa3e9e76b118b48f2aaab251a1e7fb 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 12db69407ecccd0c56691475be5da5165d857ce4 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 82543de95ea6930489ea68631270803e82bcda40 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 f52089a674a3218ab97fadef90129cdd837dc052 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 800dc2120252b45c71c4258643ffec196803c5fb 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 d0e7f6673c79932d6fd3de6ae5664621c718fba5 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 b5af06529fb61d1ca3406a6aa5be1ee383b504d1 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 f90c8f2ae591ec559ec52d9dc3dbb8be0b38649a 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 8e845fc919b55aae537f34559a760181731e2763 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 6322773513eb2ece9c4397db5b03ee2aa41abfa2 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 5686302653f9b0e5e79047e47bd8d78080e94431 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 ec45dc56fb560f6aaae439b02f6b433fa34350b8 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 4ca977466eb8fd795567fb9f378d167df7737690 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 a38f1e92e39e96b0c993d28dfb14fc17f930c145 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 879f946b282cfcebe87dde27c795a6ab03432e4e 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 118f38dba39251bf7e32c59206b245215de00e0e 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 a6a3847e30369db8186b6ff89a6b17e4dc261416 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 4f9c1533c133a99c91130132632bd02fd0180605 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 2bbb5ea23ba75f5804923f16f53ca76fcabd340a 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 60c0b649e8385e0a11007b933692950578cf4505 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 89ce49743129638e3d0620b490f743329ee0e6d9 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 a013fe663ced46615f4ac695d5dc186bc2788eb8 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 aa31fb7470020e2665c653f249e9740fda384cc6 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 8389826e307b6de3d378acbfcfd115897be90172 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 6f477b714739c0542d4cf2c980a93c2d1a2ca7e9 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 9ff3c2c0d491c9220b017e8e9349c492b2e68722 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 9742fb296cfaad6ad5ac31346cee8fc2882c302f 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 250e908d9a068f9fe573fe91f8207bf014695688 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 95e21386b85186f0671ea23cb72aecbd7489b4ae 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 2aba616f7f43d4c6032b600de97cb6acd12db08f 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 f6e2ff0e44f4267a1eb78ce093db62f22e8bb7fc 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 154cf44f0a36f55dca4b16dc0ef552e1f46f5924 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 06f4e79e5cb98001d4038903edf6eba444d6bc3a 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 f6c7a611a308e4382e51dfb8f5129521ae279a62 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 d41d74d0f829febb8851ade15b712e5b1cd101eb 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 71a5698ac7f5faa7acefec661d8279a73fa2ba34 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 964daadb18310a4d28a1962d604b63cd82327857 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 5d33df4e1266da9287650add171b33a945dd7a8a 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 c2843f3c4bf398f6f3bca60a77ae08e4e308fe33 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 f48c58f2991c3878d03c57f87162533887bac872 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 5f9cc38e826a4577964c6fb70dd475be6621c906 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 ec14b7c52f2c4d7dd0704e8c68696de9876d4cb3 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 62ddf26150e41fca1c80ba4af7d2c36b21106308 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 86d2234713f7361e4781cefe4517ac16f951bb9b 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 ecb5f0885c19bd95490927495f067045b00ca6af 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 3795b537f641df40381d12d21eef3d83aee0ea4d 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 d44f3c22c7899c897384a643c046625b04f33efb 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 cc81b443beba7816c270e58fed9985fe8e537f77 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 34af040c48afd83667e6b002b6df0770ef9fbe3e 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 97f434ad4a1e80608f356c4523d1e1533ff0bfee 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 a979638368e5acec92361f627b3a1936616e5467 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 26b8cf6d521dcefe55a1b680395b83f89ca2ea97 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 97b730668c333328956c0e279c89aeee66997b69 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 0edd63edb575929e0802225b314e9c32174080f7. --- 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 4cefacfe73f3a19fca3052d2893a284fd4c62d9f 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 7b1ec1ec22a8185d43ef07d118456a08140edc59 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 zcmc$_XIN7~*DkyhTIdN~ii99dx*)w1q)P8ykPgy|)KG*V2r9h@NEHx}-aClWJ0cyV z2-15IPJG^Tz8~-PUFZFI@@HR@J$q)d=U!{w>s}K800FoF6bfLja6k_X0JZ=C(9rx> z+Xo8(nlazO;s4dn#|8j?TmazX`>!?~9so=c0Dz3lf3>6W0pI|J836P7H{Lp?-%C0G zh}KkBBqpH6^aO~Nm5|z)D`rLj3c-v8FdpAM!(2d~+KO^O`7r%&005IJBV~0(Gzt>h zW5~6jeRdmVMMbhL53c3$$@tmBAU^ujjrt;-gzu{Bt6&s&AVN-AQfKGAKN_my;=ND6 zxg5Fm`!4SZyVk+8!fUMy&ZhC=u)v|=z2U%f@$58(i;-}JpjLBfonqa{g%`d@!bAF{ z-d=*VQ&)d)NmGQWAz@qOKxX}PGat=K8{>mjDY;+Xz;XuvVNw+k`AiUgl>GT=2>3wH zdT^#ni6(Lrd61{QsJ!82veSSIyce|>%IN#LrW}T*L}J4hsY1^IH-1&QEp*3YM9FIi z`rB|<*yg!^>w+4bsGA&N4?S!^LpJ(YY*}A7_^~0H(W_2nz67|6VQ@jTR|&fq(XYXk zZ!`=*M-7oX3O$wSWLrJzCc9yOEA!l5?JGPxY(M)2=c|mtKQE+#4kP4e(Sd3zP2~KK zNWd=*5^D7Gt8?oIe)KfDMSQxD+58uT}>{Cu`iglHh?AcZ=J`o3M9GHz!V_@S#(8?$)KxkTQ{ zg7DWp**7$FTB0H6y{nAA6v^{O)UG-z{0I#M1A2%iv)F{$7xoNGnS^_cDf^0?0d9=s zD=Y;RBK)>HIYEonCw$7QGwbO~)w4yvu7g#PjZd+WbIR|34ahdTf9hzzU2g~QDehn~ z2Q`!!oB+xS>d10A%dr0+P+?#T(EJBf%f6Bq{|!`FeE&eDq*|-@)Sg0_B6xqwE3qMi z@Y<^iyQgdXlP3OSkjW{iAer>VEZz4}o^1}0oT9(3fbzh4Dsi1|1R%PUu zh#~OBXxa2MNVv-+r%>^VR|o0T*IYLe** zCHXq|(|F-8G0K}kyX`T$CJ_q^kiq;$G(Z=)2xqIvB%lM$H%Jr@T<{_)I|CSx_z?&J z4KMG%xwv?EMO~}0xGKdggZ5B&N19$tkPId7vE<%+$_C|=GRGmLn=({?1yZ7>xH$WVD;;}M1Sp&0&zbzuf*T2tYnEpw)fI<*FGX<+l%C@DaU!HU3Xsm|w5 zygo`9c~kpkNzuvMPFWys3dYoP_{3-M!cMfhWNMp$Dfb;fixxP}uf3{gMTw~I;mgj+ zy}zNj{W+=I*BKqX;;T~p7riQ%cY$s(cls;GQTzH{1+!JiXdHS}G(`I8>Djc@mORDC zYqFOJ#C{Ml@D;E;Rja40Nfq_l4gtR4zLRUDN4z$ro^g$RDK${2QVh!NPwPNr7OK$- ziEdW##pETuj%nFEeuhkpO%)}Vw37-NrSbGhj-lNSLMdeu*E)Z0Jip-uc1g_$I;dgp zT5E#@r{{~r`Ng6$_M5K3WA7i#{*g4LlKaf_#LafDLVzPfHcekt{5%qJ=1|61TX*Lx zou=)>2wo0>y1Qhx5RHI<3rZl1&-Ra3bK|25SC85zD{h#p)mi)IkYe}Z+S=ja*o-If z=a-h zr3`bn_BJucTHg#7EON{VxvE@Hga59NkATlpr{8ZM4)8*9X<(&PIYj)gzOmItW`GW! zAPqPB^%8e)-!?%y(0Lxj~6Th4>`#&v#qN-4LUr-L+w|r~K zsCNs+Gao+Xb>wbp@d*ppPf}xIj@h6+;FAPQ3+#8;eFjt44tMF7p7!~GxDXzx558Mj zpn|T?b`6c2o>Tm&Rv@^M60Bj)OiOE=qy~V9$1C5cK>6BV9|PYQ(le?v8{p_dn7eZf zP*@OK!JrwrmIOCURqR>e2HTt9T%|mNPTptf5{|La<&rFWs_|Ped5X(*{>5+$N!pNu znAuuPgOgQlzumrhaGPKWgkd-S=;mO0@B>yr8$@+4a@_Dl7uz z*(d+5fbx4eHu5LEHgFNjAmr>Hb@|x)rbliNyxa^N&;j(aJ$uMj+h6fD8xzQe?0fg+ z9>k0KzSvV~F1?@fC^%S?`RbigtV7w+-ybdoEOv8rZlU)ifFHXQo}n%{4d2t0a;CT0 zIM)7R(TyD(*moaKzC_SI+$dL_pPfpsRx_>s!Z#;46C^FBhTQjl_+tGTaZ{qrDvGW; z9ejCeT;@}&eNzBMaP9BtlVS0TK6-RhlUSwlE67r%W{K*BjRt!8ZD|~0wS>6${4Xc8 zHxat}Vgf}_I$%><`e>?hBK=E|Y?>3&elcI2zm(Y_{dQL4!{a;Zi{KLoqFv>ena$#; z^NSCnNBg-0;^zDg+SE0XcH@Flv%dfcjr?gB@jv(|3=swR{^O$zz?V_~%}3!*{qs@w^1EqH_6&MZl-_WA2jYG5^p`$9xX(%bSmR6;dF{LaN2c~tRco@1&sBjpijjaIdWV9-?kI4;l ztwjHh*YC-#bNu44w>MkEU+ZGtY&Y2G>+0`W9pGEx@R;)4U^z>`t}RW})0P#Ycp0VG zczYn-(Z1VxSBJ-?Y90q61$A($ysWrOnD(LH#4S4{0sMp@Eu<5}>ZdY_ihY@tm2NWV zE>j?q{k4?i3m((CnHk~02eM5~O>y^Vf3|ttUtEe%Y<^G`g|7b5tA1#3=yBU>0m34w=N0cwokinZ6 zZF7TgK%Eg$TLh^2=iW58eLw#zY&K&?6FL6|qMBBT_0FV!^OzB6$ha45@0go)dwaXY zty<37RUaFsoLm87f4E*tw?8A7Z??)hm#l!4_(&py4}OEYLAntP*b5ltEmB84XGHk) zT$6EI5Ca|Igj9pRzI*ec>4flLED59p4^~coc%v786sVX`v%0+e=!qu1+%?STsx1Ug zjam~qP90P1d1*xO_rnj@=Nd$O^pVyc`-`pD9w5Wy$BbGuq=U3TnY^8)K-h-CyE&w^t4w&d@~GRxHj>b2uKZP)&+#tiLjyg zsiW&!1ucC?K#q&*F?tq%+74Nwi^XDO`?Q6pn(LF81dlYNKS}p8#wLx*O+}Wn{cB;4 zK$?BOa9L`CwmG&;Hd}8n*C)Jp7SpuyNGWQdf+<(K>9LKSx4?U=6J=(51{dqdbC^3G zzy(ItI#h&Q@^oCvj^26K&N~2c%ri{m3$;My5tho!Y299ZK~eQ3W5EAWos}e7g;5K8 zw4S{{syNxkXwOD&IZF8}Cl+!9FEqr$446xnhL3A+cnDZr_5)w!i&x)27%)z5F^Bxr zRWS;{a7xPInq=_^0tzq!g%5c{-c!} zzpHLt5$WYX8&Qeytm!}h`;_C_0-oEv9kK69eq7vp57?ta`st+8)lSbP9jObu7?zRM zac8sUUQbZ)?Y!!ERmhytHX}u?yM@pFl|W%?#kyEkJ8ti;g_+L}9Zv-J1Wrpm7; z?=;KW4AO$x&Yf8SKV#94c6ZU|ZRLr+CI#jE1>#yOKDNO;B$W~35i-xqOZUzsTvg40 z<2;vUx>q@+oZSTvoO+CksDVLy8z~^u?q}6!H41qO&~kHh<%$Gg_ykF~ZNo3181IBc@{ z{#b7Gss-v!M9Q&VJ9&RYWOxc~Wj(y=ru}kb>&epjOi?5I@f}v(u6Y#1)o#d@rM`0xc1WgZ9(7*QeDC-mzQjS1aAai_m4qY{bVxSN9CSRKnLap zuX$~DzX#$~Vb|1n)d@Z(mJUOoL-8Mxn(G;TsBKM@8(8G`9Q!7?z4NtCkx`>0zA9q9 z3Clrl^?cO_*+2dAtY`aJTR6O-Eu3+^xHhQhW`lf}jdb+VZz?kN!7ab^s z$m%EZxfxF{!-LB5A8QO=yqP}vy>hkrEmqx9B*~n3(!K_YP!h z)!JQo{^`8KB4j+nyg=dB>3;}~GMM`^{|SvH4(^NpEi~fG{|k+N=DWs0u?%{Y(wp-$ z1q*d^KIg6C$920ZU#OhXa1a(cR~G!nLYDdK+nYPx(Kb&Qc?P&jcNFR2Zeao=)7%8jaRzyJC*2?AQ^fisTvC20wXz|}ka zmc_+I^(6yw;DiD2qtSBpGCS8zk4-a0c?JkuHwGkW%S6Bn=-I+d==)wuz3B|R+03*c zlo@&S)jx4u1_@uE^nK;Fue_FxgUYm-1p@{SWsiZJXO@wP+v+2p!HHj=^W2#vd*cC; zacD~lY=9P~_b~V-*0gEy{-g-tkR6_*NUmq1>ekkJM;VE`~=gQtU z>q|AQcwCMHB;+Q)x>EemxVBoZ^r_I4dM85DjcrDem+9S}MNWXCro2p%UL;8y&x zccF-okkBF&xC{&y)fzVJ7{|ev`KW0a`HcwJbp(;CT>6YpNsi%kiPwR0N}qBsBY70h zMn^}H@;qN&EHn|SXNnjRRCFCP^rf#-KZi-y1zuKJg@oLtMFIdyA#=`^3E`?k2wf4i zEYSkKXnwgChFu71`XCZoa5_Z)D%4Ya$L149 zw#(`2!6Pq2$fns-uw|=K&tirL!;9LRrxS$x2wsAfmI@AlYd{LEG*iz3gphSLetZTT zT~6&pPiiG-{S?4Woon=OhOTB4+kkXJnR17A3;)_z%bICQue>ZM^TrxoSXf9J@Q#IB z@x+{k&!s#QC=Fb!;WZ%t6s6(EoQa%Vs5Osvy#I>3w1E=Fs9K7H&`yiwNV^xQcYa|D zVmC-F`AwVKDUZHnu%OIx!P)lA+LWMVQv(CPJ9&{mTDpVe`{$hi$9phS93UGRLC0y~ zRHg6nFd~!V6MF$Ra6_vl9fdA5o#rUG6@f{n+J1N@bdd)gj(UXk#bf;yr?{AUfbs_8 zi(t&wRx%j4SGoj*Yaaw5e8RQAv;3jy6oh@OltTV}JmY;1?s$GGF}xcPZSVU&>B)~pltC@4+=&g@L-~8o7B!xPqzwuP8B!o#f*7`O?6kBv&}Y5dCyGy4=~s>5l5>@2ZxY8*S3ApbaW@0Hx4 zE#f99y)f)VKX~k=5oEL97;t;x%A9MqLMKOc=_vJfQY}1lF54z{m(arceIh@3Wsya| z8F+Lg@a|+~Y-}u{&gGmPhi=Fh`A2OcxaYwaaAQc*%riv;gPC`?x50W`Q~^O2AyBO) zg&v-fFPD!*kL@`Nem+3{E^^OM`i$>k9{38vt6B+`_hq$<3QJq0pOBw?iey+3KAxnk zNq!KY#*^r_VEd0MYI5t!3cbFDa`!x!7SSTiFHdJ`z?OzWaJ`=>T0mFe#|Jcg;>HNAxWPbSOc2Bs@ zN6V$}G=Jf$jxj5bt6we|L>nyk*QS9W^GsVq4wDRFTjit>t)}9uMQ5XFMPRG`BV9hn z9{rG_nUl(Q#-{S)q|eyf;11{;^=MXmhYx;F&`C@ZTl6epykc>lZl~K*k~%sbbch8z zNBmRlIrh3#&c^6w?S4Fok%ctx<8_qT$S?cyMlOdp*A7=*Z~0jiR7-W{O`er-Wy7}T z18p?*&{tG5-q~fo(!?OkR4?E2@}c!ff!NAY`IJv7=bu-VTVvkzck4IEw`pYGXJ8Q1 z=Y12&o%8;k4dwo{v9w$d-=81O$hbkLux-uD{7=xsopO_(2`}9Td;ay(|ET!|Hp_#Y zrzmVrHh7m;Ww`b58hYw8C{Ifsd;*D2Zh*dV}Lr>#LBJ)^B$Ia%C z+B^P6G9WqfPJ{nzoQ9g32u9Mdb})8Yzk7+7lhjooHvJMX4z&`W5OD?Ves0zO*0#*O z9D@6GGpH|cUE=>v#6bV37w{hGWR1HE@~-%7Uk(n3Z3OR7rz zpU`_F?;XhX;v8aogJhu!pcyPP8G{+?F-j`RnQIvvcWN^Q3RfIi1)NSSGg+;}E?JvN z-1PGP!R@qXB!$hT53R+kmN=_o_R6>S`b!0lt}iYMIgc4adaf;6{Pq>#-eN*|he4l#>ffp7q|D{G|TbTtM%pgA@82@BYA{u@F2{sn`OE@HW zY$^NiPfS%v3gErgcUFcEV=sdY*ohdTw{EEci5FDf)||^eK*Rlxzl?KrcO{F_kGG2H zg}(25IZfMfPI@0w0tbQJs6MjJrn)^Cu<)ztE1hF)f5oaA*qsHCykLyl3T6QAZ(ya) zde!;N0SD3v30Ty-^P(*RmshNkXgY9)u@6WR(p13$<2xDwR)-)>2tC%YCJKEXFy6URXyC-X+s%aVm0j{Q^oj28lG7T z&E4Pw63EcHw?0+mqt#S}Kdzo2{XA=p{}v!{Z@Kls5ORa!QYUN)MT?J`ej>StAV5Mn zXm-4eM|E5ur7#)zdQHUF>(b1=g8RAUt1))c3#-Z-T*Q?Us0DtKr$4|yWgS1HAu zEJK4(^J3usH;x!C%n*-pMc|TJz+7S+9#$`=ej48IfgVzyvJ#{C6oFy626oj!cX&X& zanGNnMWLaN1mM6TC}_5x?U@s+CaT~-9r8S;_h<*bWd?jHi4wbrdSZR_ZFjDIe|r+e z7ZOhn@~f8KF9p-goCAJu@EGNL+M!4r{@|i zjKGNL>SyU4bU9e}18lrWB-6hAr9jYAyj}eLeX}kw_~6i_{>3_r z16Ni96m`^;oE@e#1L}|=ovmlEe+q7f{$Ao5xbot9!1M+}2l5_l2_yr8thS+P_ePh` z&z<6TRwpnxE^`;9p%4JGXT_lRwZc;Omq)ad6a+lNA;Z3z+flzrI<=XeE}r*V9VQ_! z+#j!SdBwPXWH_tKnacOnGED}#GXbP(6I^B>fGw({$Ml26GNWOm$8y-p%F1B_-?3b+ z>f$~DD5z?LZ-}g-_oYd>8FkY`dl>J_1QJ+auX{-m&+4^|R5TXoljq&5zfb|;Q~T=* zlP@=YqP$FwZN2W9l5*gMu9Q#bC(9#L1iggNL+QY%t}Yt9{_UQn(^DIg_yHd;8ixIR zmMqJo%cC{o@HQMk{)5!k;r?v^c6P-Kn|Zx;UtGW|Y=2Ci*ZWee&S9c3H0YXDN(OmX zk}fdQTLm{UaW|7N-<7M~qs2B_3AE{p1YY;979+nEo&EsP%yzRH=kdGOy_I>6*z)dO zglDvw>ff;gS(GcwnMqeM1Vk1AifyrYpdo z^S}qOmT&BGGQu<|>PlG&M+LUsV0XJ!;C2wZTWw#@$w_17B)H7g^^l>BZN#?)#BXqS zPQR`r-Ao5hl!b$dI{dO+;%~Ve1+8U)LZe_3;E*gw+EK=~*kWn(mPKm~X@jqHvT}jn zpYXkAc0bt2Y&$yU@oXGbHbi2qifi#K?j$-LIC=Re1%SH7^qh{xbuPijzbD)LHRB33 zj8<9L8X#q|ZAU{iEadpoG{qv(cEBNi?3YT6w-HU00dQtLupDZST&aW+hrmUD7t#_+qP=mYEHpjQq_B zT>OcE0`f)5%j%26?wMmt-#p;D4AU!X_i-%`&iMP{iLS(4E5tsrHSVyoUa7wkvyl0P z{dQz?Ao5)+E>JwD=5VM zJTOF_I{_yL5yZDtAfRK32rI5czqGrvbE@&zH+&g>QARY4S}IP?*c7YTl=n(+t?}s- zrqJQn^=RQqeTz%Y?gRBV_usk&-SaeC`>vIZ8~Yy6g+pzRS=lrOS#)!PvpZUWJwoTX zHd!T0n0!n4ti{755>K<`&Jlj*_f;FN`$<`R+sL$T`pvARCog*>aIu#Q?rt44rdZOu zYUK7I2;3gk1BgRNj(rtpipE0u+vPY4KQ!h0I!H zC}VJGO!;Z-Gb)FZEq66p?i_8vU)PsNDmQoBBNI4eN`kLcQ>N?6o z|AVa~JuR*AGn%g*7Z(>YLK(YGLK%%}tO*(Y{u%BI&XM1SY^!^oBj4bX<&N>iKI!I* zwapu|fBq=VKW{Ac(~LpfetWxkd6(gc9f&(Ws5)uwS=Y=G}l-9 zKjYpDkF3hkKL*L~DcqO;WAdTNxhe~S2eM}X{*2fPB0j^zq#l<(y5;6=7MuM6pzwj8 zc&INRMmt2^&{CKRx=_% zu|Sq_@>P!TLubTyU53XX%a59EnhV&b(^ROtTL95IRrR^z6Ko{KxTQwRQO3XLhtyWR z^X#~=kdRN#&MH-RM-=(XqGchljPlFA8BQIKkJV#Vi<>r2i2*L4rqFh$*^K%&4DBnJ z(ctaue8OA(Hkmc^tj%ATBc^v1ANh^rCyD7sxCOb`+M&^0xyM5f)0^hZ&#n zJJ>1uQ`CkYR;YxI{tasFAuIKu70x-@i!8yLzsy1dEW=tqk))cW3-CXoeu_n$1ko+>>L_+IBSCt~8J z`6$CcPYl0?Ih<<+r(E1Ay?0AgwSTB6t#%90ZJM-1K|;hRKd)UkW*!nE=S?bRX5g!bIs=5ms9dGgokkj5h9T^YePU zmm4)s){eh(xzpC`uqKtChzS^I5Un)m_XDiJt`jXmDTa`1O2^4mgPCcmPnP zo9|rP`TZ4cwKcDCvp!id4N`g7$W3YNvU@9$@i>l_fnog^@lHaE3~+0!i;n*4TWGZ} z&0K)Zm!bfTeiWfwY`*iPB!KDEyW9~|=-EfpDwf1fz7yooW+EacE^`*#@~8a9?=6K= zdcc$P6$EOBgY%ZF zENS|T2*d<1p|Us)u@Dh!)~+V=va>nj6|MjRN)`<$F;ZA*tg=D|&_a=tV$!J+fno$Y5+VR9 zUgYH?cSz0qaK!i+=3#XbF-!(a0%Reu--@s#^2tReu-!&)SVtJ7 zqYOMxFR0h(3<-tGY^ktQK8Zs4fZH$>a(}hJjW!5aJXM_FYP|~t_)6@+$+_8I*_ay``NKi++77;2AP0;& z_WAy<}4gav^aw)RIjlmUYj%&Mm<3O)c?iV+5iY=p%| zP&6)R=GEr3gD+}x3>cf9hzu11XMl_*wQ}e?q3f+LBW%pC*3xL%Q8$Tc0Ji`5`4_I z*Ml4S3ey0Iks^8=66M|ebP=W;B_P{%E~#|9i4f&9^TK#yM);QS@%0X!wmVs3jRF(` z29@p9e>N38s1d})83JS`1PAOuqinw(x1rmi!SG_8$F!Tl(u1x5K1HyCoYy@$L!v)hQtW%vl@ zPQnL!!udd`qFJAHI;|cY^z&txpEVB4ZP#B#S$^m!aASv3Fy~a@SgeUmB}|gRbvfbA z;8A|yf`E?=+bGFuMRf)T^rnNS8?{-S5&ChF5Rw5jbc;@KnHRnfMH4{4VW=n|XuPhh zx*M0-3;bb?aQq`6u<8xEDnKIzO67q}-;s9ijN-1|pu7=n-^|$Kq zF4z8LQq>l1jV|aiyR71?-$X<)7zM6dP}Ks2qW;#I9Z_5$C`^Ry)itVdnHd^dL`WD8 zc>QUQ0@Jh`n1uX1gyDYCj)K3%#y&}P1LhTrO~OK5@grq{tV`GQbzu;+NOtvjIPgm2 zzN`#1H5w%>gkGkM)A{R6!-mxj2g<`+?=bpN;D)GjwRF9Ad4iF7J2ISE!LsqYA}>~( z>)f{pa-^6Yz(zxXH_)(cIU4uKA@Q{w3YW$k-6x(Qq!zkZ77PX)~8@ zrkk`6ogO6~=czcVFEfgrGksTZhmAU>l#!ijG!(5dVQogEnCotdVUB>H@^hLpo=IXgc7gJZolqv**qv#@EeD96nsj6+`;)GJBRUeTw(L@>B8G=&Tq> zRPjBfl%$B+qP|g{h6bP567+!`q5=0^xsI~n#_{)y$}Fvym4*`i-iLumzpF44${{>o zj3+WF)33+YXWBf97<<}u43mHK6F24|->BlMW?x@XcivS~Sv<8&io5tUu0 zS}@Lvkcj?n*F8yu;qaVLakg>}>-HE!N_PrtVR^)}U z^vPi54Bv9vl;dd%=*#D?)1^*sZf@Q@DFI@zHpPWk%hG*sD8!xA_7@KlmMx;US{=XE z2kD($!DGb|tf)Y-7NCx=sr@oLy)KcUK7-P!mBmh}>UQY}pq>uJ$PO@SBSFYo#vDUGDhZ{xubVn&;Lm zu-D6>hR*$dPJ%oiO13#%=L&3u?q2E0OIR+3Hn%xt`8HxnDR(BjOD~@h_?RFYM5ti&)YYi8ER?MZ{FnX-+$B{ zO3MemZRQBkH3@e&ef^vNm>VfJgrPgK%Vad5U&r$Cd_*ZT)0Gl`qafm@)EZuy1a_=( ztB3S)6Y5=qeIQf{V&L?UapQ9S*RKvbpFR4;d#I%Xx*G}bGWVPs>$M`nkXnaOFG2fp z#$ysXjJVvKG0c7Pp#y?>vu&x6c6uGRdqoQmp=Z zW;0{$(x@<=x@-C;rlK+OOgA%-lyp`1;NltjfTpk5bdH>fiAM#dg5pc(aQ7jw# z-WRd_$bY$b$O#e1LROXxaIKb*8U~nGGq_5R#^5M3%d{+(FSbLVovUlM;D#IRf(ch* zEDh~Bqt?ZrCh*A#J4vP~nF>zi=0WtlH5ypX1=S*d5o6uTsfS<`zLb z*^CmNJJV$e3nyA~+Js8XP~$U`pjr{J zPu|zHH+PP6Q$vKHwmIMM2dHbnQlXw0|5B3p&r-F~+HcI+ao<;_cP&$Cg}wntF7A#K zh@ZK5)355x*8iS;sk_{8Drw8sb~9_xW56~>&dA;MRPL7CLzZEFsJQ=CxV;zez%Qc? z_Ywo-R^pLwpUx;|Bk&&6?wtY$X!EnjJyn98i$)b15>FHw-(Z2Zwsh~XWm3R0Ld(^B zlA)QtpSeoKek64LB*1?U`1E=cYCg+x1qIK!m;CWt+sXgHlY-3@ZZse`G=5!F-qFT_ zPavj>ck<_Mzs~HhrJ8NXf|}sasxWZSgUwZGY!X^$#*Oze5VN#wi;Wy2ceB3j&PDj6 ztY0E|?a|S>+w3Y)wvW8Re-@F*oyn#&4tT%mcC6JRDIu#}i@z=z3Tex_bpaqf`Fs4I z{QumH)s<$d=51nDrxWp^a#_sKP_Pc8n5}IhYR1T zEP7EQZge!+eo%>$(dbA8|4mm2W<0a|sj~j3^NQ6$V-ETcZqdv@I|nG>=jSg8z}{h< z%W;!9Np+GU5_6Ox4}B4t>Z&(X@)qsaW}|npVNHMk?$5}hjV~{h{Ujc-Sr&$-ft3J}JwHmkwtVl=P$|HN1%?5P7XsWRiSZ(D1F@kgFWg zH83SxDq>PViXwWKWoJaCIJJFAj#*RTB_FUx)kcsFCqDzvmA6%Ivh%jcJO$W5(0$E= z1a>eyY>mF?YN6q+!$-|P2E?sFn3q;U;)fwx4W(5xlpb)Qrymi)g#|_VVCD$3n!`Cj zAy6O5i>i7|(~w{{Grt#Q`s+-6Xq|B02PFAmLm0A_MO@RB83>;P3uN zyC*|oA*2*&xsNBjI!x)8g(hV8hZ?%eW7uXKDW%xSl63gKs{-C<+2%GzRQt7xr&|e0 z@gP1CcH$`a_~YVsQMayYm*%7IIWk0v7;gUj;F3y*gQ?J9CjzduaT(`1;>wJ`q%?=^ znvY|w9Q&sF==;WDzG34_jr~&scX^;#URFMa)~yJ4-Sa7D<MQqk}- zyO8T*<}rIQH)ZfZh@D;ayI`yL9|KTMMc(A zKNyR$1_+k_`plIdy=l%#(e_7JAAL`=z3c@}DkDU5=AO|j=IdZWt-NZeq%00-ojAjm^G^Ej(m z9Sc_${Mq^@n>w=9l!tNBxycn(+6tPLaEGHT<|C>$tcNQR>|72X7du8QO z!{fHs1@R zS9|jJ=fRFNPoAbZ5t5Ccka2jzfmYmi<`{vQW%AGdq^tVg%cN(^3PZNXXT1@)Ym?@u z{y`y#H6^4!3?`w2qyAghS3CH8e6UnrcZsmmm(1QAkls=gOv3=5IO#s;?`o5P>wSfY z?5B3+-mabte?Fj37s_`QXJ%#$mYRj<=0ifLcTWAM`C=)NH5S#;q>qTsH4!(8fQaeB zQ;n+MVoPu*lYTyRF9z7n!-PCi#4{UNqrq#=I41W5YD(p70hHo3vP@&8Tw$wU>KN<004pwS5{0=P{x;e9M zBGj+gEuXt^BObBgTnZJw!l%=0_{2l4bG(aZ+kY6I+#&Pvbcb5M@B z_a#frme~)ZiYk?Q#pI)F+oodSy?u7c+yJu~ktY4p8?mk0cH9SC;L+1V@4<6$M?0^8 zfC1+(IXlEt__G0~ZBS)uFmJu=ehQ|nzUVNgM}k+c%jPh1L~M45iznrl{CeyBMP|XkJx>E=&S$-&G7B%>UX+aWSV+}51%xYw*Muc^V?s}!cTMtZ{p>(XO1DyrSAsN^+Q zH@EIc=jp#pfMj6WpO;YxzT)Sz@SG2ACT8{SUS;|dzN}3~WT!+C><|=Pg{zY!VaMq8 z2jwNotu)R29GiI5{a?hG)Ka%pZ&>4AkJj%vnI{T>6dAi2UoDYe6c>(Izlyn`6oh?( zamm&w$yf35g*E>g2?iLY4?F0D7!i0)3%3c}k|QpVtx|4(hd*>ntnogUQ4T0e>+I~*OH*5tMs)1}%io5F z-V0NJAF_hYjoCj3yy2}eZe%5A8pPjx5Apz8(WT^%kd-D0`hRMCupHJ4> z(?pn2U%`UvJFhIHPjDy&pStdxNl&U#2{RbW2xEolX;?0$XVUx4V&)ZJv%1>J>eKSO zkB`ZQ$a39r04bwnEK*I~GQ;dIyW6Ex74$D+@En8}Z+q>f1{9)JJ@j7hCLo18<%)-H zGosT+494Eox;pV+;2k}s$47~8Ut&#HEHyACIJl_`nuqtFS!NJi9PPgmO3T6E zRFwvgs2$o7Jv^1JFW?rjM4L0!q{C=B3SY@>TdtE;hQ}9n-&pFxr8&ZM=E7e^G251F zk6GCG=G4l|8O+w5%2}lT$q57&fi#lA*$aBumYB_fhEA05MfCESGnGcU?!)@Nmm4$A zDHJOXWItk4FZ&-6WVB8iDQ09aV&0ockb0AO0;-NjB!BL@D9o?T$j8nWtv+(oj;W?n z*u3lY-_W21**hs@WUGN&s6Y5*qwcVmMeEF3`A|7zWjbkvMyn72#0=T86hrPT(b&tL8nTwMjX}!DI;Ak& z!%ViwR_PwuMYd$QO)A95UL#ASVlW6v?iuTh8S#93&hx|bKRmx*=Q`&)*K$6e_v>}t zK4RjE2BXtFuexGe;+Y_-ZU*q@{1AEd$6Y*mg?f0yKf?;mcA9M<%xaJfBA0X zw4vnUZip&TZ~l2iL(ijap~)-^7!w;Dq(#lNvv}xoXN^(K z>tA47pIo6=hhRx1NY6wgtOiWCQRLC>tB@bWn zUB|YniHvIgk^}I=IaRu~!Ivmb^m^dNlTbJFuZtSFD>!C)V*c-SC1WAL;QO+7@OPY# zY2|(^!xAtMph~S2v@3npdb?e!V5$LM<_Z1anq;+n$eN=9tp7Fs;D=Tw`$21O29)Hi6ZEZOSs1jrfLl2R$FMZD(}6fk6#jK`}Op%NS{hH}*)I)?;Syofs7XX(T>SmNNB{JoCA{L#=r*p=62fwqHY$;vy zW_|91_lZ0?d-Gk+P4dcIFeq2mQX`lvcf>^=t^M&y_w)F3V_!63zncp%7l2{yr7!bJ z1&^DohBy)~NPDx>#?5oJH`D2(!2_fketO?K%4Igf8dn*POVu9^4n2>Fjx+TYT;>Na z1KxOuvzh?U^+UPWppYnsQM?{;?Sv%uz8!3)qqD)w5z8&;Vmnx~@DVZLy-%tZ#%8zM zpT6b65%qOq6LGsDKui{ce&48*M6MY6i3;xHg+)SVqifviTYjSn393JVg1S(V0bq=T zgp;21DYf87&K5`HtagU!t2HwMWhIpHIsK+XFIQ(Od%iif^6TVdkD@e5K6cjf&Sh2J z_x&xy1=(I&Eb5E%e2kj~>VoeE=K0cI{>*vWgK-b@49AY0G4jIEZ#kgYk(PSj3A&fSu_5uVDbNZ%7jvfe zVQ5CEj-owcxE&VG7xm|+r|#UZ_z)c|8x3AJ25|8BkZK7)Sls;iJl+Da)jV2_!?)|+o9ka6c+QN>R9C#No$_*?p&_{<% zK#H_SJWlTAib*=!9F45u} z=C^5g^W^s6-&WOQ*RNX}2?Lqp%I-4v)9{n#^AbR8w$Q$G$&O3k&Fw0LOKT-X#y$y< z%A82|xBL%&O(y_4xITI{(9nq#h-Y-Jt#0-xn!PoQc(+lOYrn_>BMVjp$0Dv+4sv0* zJg_hQYp>piE=W2#g`S(jEHN;L?7J}k5oLT8y|U)e#t5goQ5*M$(I?kk)%dKHPAiQ~ zF?7SS)~Y)(*^d0gfF038sr4ngq}981$5QB+qBSrUsZn1g9lJP=j`Jx}1@++uJ|<@8 zwg3!7)eCY5V-CaQ6Kwi+J_c@7%3m#7bK=e_D|VaAb8i{%D!}Rj4Q5;HljA@I-g}1Q zEf6Ob;VM*e*OzlIZ&uBB;Y1Equ;qljaiME|(bo!Qph=j?WXOK3^{)DbdFjmgkbJ=* z->0O`i%CGdWXx$86P<7wU_zBmqyX?Ql9tOIJ63*|xVvb8$l?!P3E;@YjsgsA`=~9_ z7houYy_y7mJuwj^vo;nrL5dBAXb}A@wA`R=&MM=L0Fmm~NqeLZQay$=Qj{C2GBRA$ zbP&l50N9q~KzsnGQaB+-qXfgC*ndIz?gT9%wkC>y0kxGNt~xhh7WjTSLI$S50|@eT z^m^P2HlM0kkRh3DS+K-#u{Dit&2X2f<9k-t6ho2M{_5r2AuXz3R(qVD)P(e~tZ8&v zfKXz&j%hFxp=l#lAgj0vR#BglM<}un6a_4@EE5wT=?M__%&k+R(H0zPZm4tQ!)UJN zwAq)XTVCs}1m2Fx6dGsSP~$b!w}0K;i0Bk(*)M@Q_Jfyg*Afp8iJ; z_2Br5bN@9OZz>Zuy2tBn04+9lmtHhZSay%Ok(D>~O8GDWA;J*`j55w$4Ix2>(79v+ z^}=J@@7Yib@uzx7x&PWIBzWnsl*Tj3Bed@=IN}w$fU>%TrQ(Be2>meNyEIR{7uik5 zw*G9|>QHLL)efrtjI6%n%}Z2=WylE7K7|~P;vLg)Srd<}_aIlagGQh2jO;ESJg>b% z7^32|NIpn&Z0nagkaWlEgrSaECU3JB{BsBf(`^V!L2V=b4%=J$YKJp=akZ{j#hD19 zDBLFEssY8K61%`k0af)Bcfj=7G=pz5|7+Xp12uxUKbvWrkp#=E7I;r$5_kyQZR||r zEku3~ed7GoHr~P=d;=1bUW~zox}l&9FLU5*o{G@_!%#LM+^cQvHe2e||9*1#H_1W4 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 b1f097f32b2dd4723a85b2c053c396b16b9efac1 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 38eb47132dac37a1288380849fe03db4c2db21ab 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 c845efe47566439d2248dd23f99c4bbb2e9cccc0 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 3660298683dd8c4ae18dd1accbf18a29c0fc320d 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 a919f493d64d3d0ab5302d645cfb7f5721949a42 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 e5cdbf73616adc2358b5d874225c27d21036f191 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 db2e466d602f0c3d7eb4f90856f2173e47ae58fc 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 9cbc2d9206176c77f64e56350935aa5236ec1a31 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 da907d0eeabfb825d9cce8fa95a1ade64efb805a 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 34e3af2b389f12286fd50150741e3c24b935c819 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 7de63cea5c2c52fa1442ae517f350dcbe94f94d9 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 da907d0eeabfb825d9cce8fa95a1ade64efb805a. --- 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 114f1426f3407e0c2323d4769e63b547c4443119 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 3baac034e5cc1a125486752c6a1ae63f6f5dc221 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 f8724c4cb9106bbf5596ae96846e3a90df7fc6a6 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 7c1b11851f8baef0c8444500354bf05e1701bf4d 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 74251af163594922424b3fe6bcaf08f97a15391c 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 d22097ee33f0de505568b82d455c6b20c08630cf 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 95c6578911bc52d4ecd1eefda313e45ab060fc1f 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 5e0028704512d4356ee7ce7be601c193c6e72509 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 ed3907c2737a5da4e75a5aacdce21467f2757d22 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 ac884da56bbfed11a155ada1d542c460f039ffb1 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 73bad8f355cf834e9d867ab2cc816618eac4d0ba 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 b809b9bb8017c8152c951644e617857492e044cd 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 e40ea381120e41a7583f191249eb6bdaaa2864ab 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 02634622a559b1690e6eaff50d4a062f6c232451 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 794783ab4e704bcefda2e31e090af30ce62ab10a 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 f4238b1fb9c0d7d10b1d82343d2292317a99f66f 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 2493f463f3ae57405d02f51df96ebc6d2317bdc7 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 12df415dfd4ed70f9563ee0f18fe4c00b1b49891 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 da2b4c8858ef287e4e57b2647fcc11b02fe400fb 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 6625f78e4face1445db1610145de846a074860a4 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 70bbab909f0dff3b661f34828167a1a1fe75d29c 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 d736dace50663235494d7ba02bdc011ee45cd3d5 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 0a4ecb1507f42c12451a3e66f554bafe0ad9c7b9 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 24c7a5b8058838dbe6206580d9e9c87b4e4c11cf 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 ec7d7ec559fd1aa1235b31415e9b074822571319 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 cb3bff589f6b04315fd5d405d73ec2e8247d47e8 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 fe86b812cd8e13720a1538bdea08c131a420e856 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 d5101ac2f38c61e0432028fa380c1edd42f1f6d0 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 402018b95c98a81f0da9f62bc3ee768ad52b81d6 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 590aa950df139149e1628ee8d5af9f9d21baa90e 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 c1597a0968062b30f61e46063c2529c0c08d8c8f 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 c16795dce96790715f046f5ff09dcce832dd833f 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 792f1826ee9198c8e837de2a7c293872ced2ba12 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 01bde1970149467628500a973828cb818be4312a 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 c22e4e5e2c8d40d77f6c6895fd13d6ddd5c265bb 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 bd37fef720ca1b911841720c3664448e89ad6aab 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 f5dee51e9cd99582e1a6c1e2202d8cd2acec9f65 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 19bb9c7f50648d779757d4d86c25e28f66d3a5b2 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 b5e037494638ed159fcd6b4125dec728e4cd1b5d 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 9f90a1c58e38ce1db39aeaec74c74910a1c5d538 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 22ce5aab253ff358c50e430a0967414b725e5927 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 d32734214bab04f3b92d3d3715f9bf4799012504 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 575d8c42405ec1829bf223ab6a6eaf37a41f6402 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 586af67829b606742a2ea9fc5b5201bd097af45b 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 27a78af269abc96ed0518e5cbfe4936cdb0175f9 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 4a79f0c75d8ab44bbd13931b52e917a806faeb18 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 f46ee2a0a3faa2404e672dae2558da61efc206ec 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 7f34073da62135241c08f186364ba3de28cbc32c 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 272ee7577c92fb1d758d2f6643f4819c38287c56 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 36afae50b1463201331f246cd980e83dbbdadcd6 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 2330a4bc934eb3494423161e0184b0a33a4e201b 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 03eedf617573a2b0afdc36392ca925f00084f4f1 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 3073b4e48eeb9faf45ed9131916dff327abaccf5 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 b20a56f1ded7d615e78166e4aa74e67ed1edb0e4 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 aef96f0d27cc936922f2afdacc1aa473f83d2967 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 c16ae89a3d316eee0eb4c675f72e625a5daca238 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 3f79e426286fec97a141795363546a2a3efbc324 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 1e3c995e6aea9e76aabc0a984364f36f87f989d9 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 c79a7a7f6f760255fed7bfdc30d453db7b6c7888 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 0eb776cdd39e7a7ed735301b6220014e28d6ff67 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 c40db417d2e0abe44eae06f6f3311f785dcbcc49 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 ba0dc4fb81dfc340c4abce8791a437750e882b2b 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 2028c189aa72a36e445136fbe09683317ff45df3 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 67bb2427780f183eb9f9a0514ec864b31f8b664f 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 ae181f6835e307ea038fc1780ac5e2db773b9be5 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 a59fda512caf845acb9d7930ec8780e2e75d4159 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 e8b3bd5bdc787b75ddb7c68f792ae5a5fb23aaab 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 824325a2ebb52a40db23b8129fbbed37a8198812 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 9ebd96611af7a859a686e960ac59203ebe9dfc6a 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 b3923eafc7ef3f1bf6f6fec11545702298fb3da5 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 e8c0051be334132aa4091f3d8bb4d4659c6a2850 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 = () => {