diff --git a/.github/update.log b/.github/update.log
index 8f9fc660ef..2c75ff1f84 100644
--- a/.github/update.log
+++ b/.github/update.log
@@ -800,3 +800,4 @@ Update On Thu Oct 17 20:34:12 CEST 2024
Update On Fri Oct 18 20:36:34 CEST 2024
Update On Sat Oct 19 20:34:29 CEST 2024
Update On Sun Oct 20 20:32:12 CEST 2024
+Update On Mon Oct 21 20:36:16 CEST 2024
diff --git a/clash-meta/go.mod b/clash-meta/go.mod
index a223cf77ac..098030629a 100644
--- a/clash-meta/go.mod
+++ b/clash-meta/go.mod
@@ -20,12 +20,12 @@ require (
github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399
github.com/metacubex/chacha v0.1.0
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759
- github.com/metacubex/quic-go v0.47.1-0.20240909010619-6b38f24bfcc4
+ github.com/metacubex/quic-go v0.48.1-0.20241021013658-51ca987e0174
github.com/metacubex/randv2 v0.2.0
github.com/metacubex/sing-quic v0.0.0-20240827003841-cd97758ed8b4
github.com/metacubex/sing-shadowsocks v0.2.8
github.com/metacubex/sing-shadowsocks2 v0.2.2
- github.com/metacubex/sing-tun v0.2.7-0.20240729131039-ed03f557dee1
+ github.com/metacubex/sing-tun v0.2.7-0.20241021011113-857bcd6ee47c
github.com/metacubex/sing-vmess v0.1.9-0.20240719134745-1df6fb20bbf9
github.com/metacubex/sing-wireguard v0.0.0-20240924052438-b0976fc59ea3
github.com/metacubex/tfo-go v0.0.0-20241006021335-daedaf0ca7aa
@@ -39,7 +39,7 @@ require (
github.com/sagernet/cors v1.2.1
github.com/sagernet/fswatch v0.1.1
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a
- github.com/sagernet/sing v0.5.0-alpha.13
+ github.com/sagernet/sing v0.5.0-rc.4
github.com/sagernet/sing-mux v0.2.1-0.20240124034317-9bfb33698bb6
github.com/sagernet/sing-shadowtls v0.1.4
github.com/samber/lo v1.47.0
@@ -116,4 +116,4 @@ require (
golang.org/x/tools v0.24.0 // indirect
)
-replace github.com/sagernet/sing => github.com/metacubex/sing v0.0.0-20240724044459-6f3cf5896297
+replace github.com/sagernet/sing => github.com/metacubex/sing v0.0.0-20241021005542-18b67490300a
diff --git a/clash-meta/go.sum b/clash-meta/go.sum
index 2b3bba6542..0508ac59ce 100644
--- a/clash-meta/go.sum
+++ b/clash-meta/go.sum
@@ -104,20 +104,20 @@ github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvO
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759/go.mod h1:UHOv2xu+RIgLwpXca7TLrXleEd4oR3sPatW6IF8wU88=
github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec h1:HxreOiFTUrJXJautEo8rnE1uKTVGY8wtZepY1Tii/Nc=
github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec/go.mod h1:8BVmQ+3cxjqzWElafm24rb2Ae4jRI6vAXNXWqWjfrXw=
-github.com/metacubex/quic-go v0.47.1-0.20240909010619-6b38f24bfcc4 h1:CgdUBRxmNlxEGkp35HwvgQ10jwOOUJKWdOxpi8yWi8o=
-github.com/metacubex/quic-go v0.47.1-0.20240909010619-6b38f24bfcc4/go.mod h1:Y7yRGqFE6UQL/3aKPYmiYdjfVkeujJaStP4+jiZMcN8=
+github.com/metacubex/quic-go v0.48.1-0.20241021013658-51ca987e0174 h1:GvigRPEU+cbnzdLWne47cxLrc28Abohl3ECtVdnrbq0=
+github.com/metacubex/quic-go v0.48.1-0.20241021013658-51ca987e0174/go.mod h1:AiZ+UPgrkO1DTnmiAX4b+kRoV1Vfc65UkYD7RbFlIZA=
github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs=
github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY=
-github.com/metacubex/sing v0.0.0-20240724044459-6f3cf5896297 h1:YG/JkwGPbca5rUtEMHIu8ZuqzR7BSVm1iqY8hNoMeMA=
-github.com/metacubex/sing v0.0.0-20240724044459-6f3cf5896297/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
+github.com/metacubex/sing v0.0.0-20241021005542-18b67490300a h1:JuR0/7RDxQtlZp/GOzrdqNq04HplTxavPRHrek8ouJk=
+github.com/metacubex/sing v0.0.0-20241021005542-18b67490300a/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
github.com/metacubex/sing-quic v0.0.0-20240827003841-cd97758ed8b4 h1:HobpULaPK6OoxrHMmgcwLkwwIduXVmwdcznwUfH1GQM=
github.com/metacubex/sing-quic v0.0.0-20240827003841-cd97758ed8b4/go.mod h1:g7Mxj7b7zm7YVqD975mk/hSmrb0A0G4bVvIMr2MMzn8=
github.com/metacubex/sing-shadowsocks v0.2.8 h1:wIhlaigswzjPw4hej75sEvWte3QR0+AJRafgwBHO5B4=
github.com/metacubex/sing-shadowsocks v0.2.8/go.mod h1:X3x88XtJpBxG0W0/ECOJL6Ib0SJ3xdniAkU/6/RMWU0=
github.com/metacubex/sing-shadowsocks2 v0.2.2 h1:eaf42uVx4Lr21S6MDYs0ZdTvGA0GEhDpb9no4+gdXPo=
github.com/metacubex/sing-shadowsocks2 v0.2.2/go.mod h1:BhOug03a/RbI7y6hp6q+6ITM1dXjnLTmeWBHSTwvv2Q=
-github.com/metacubex/sing-tun v0.2.7-0.20240729131039-ed03f557dee1 h1:ypfofGDZbP8p3Y4P/m74JYu7sQViesi3c8nbmT6cS0Y=
-github.com/metacubex/sing-tun v0.2.7-0.20240729131039-ed03f557dee1/go.mod h1:olbEx9yVcaw5tHTNlRamRoxmMKcvDvcVS1YLnQGzvWE=
+github.com/metacubex/sing-tun v0.2.7-0.20241021011113-857bcd6ee47c h1:qfUZ8xBrViOCZamvcC8CyV7Ii8sAUrn7RqZxFGn56tQ=
+github.com/metacubex/sing-tun v0.2.7-0.20241021011113-857bcd6ee47c/go.mod h1:lCrP0AW7ieKnXG1JEeZLW+9h99QzjuOX0MfCQfz6TgE=
github.com/metacubex/sing-vmess v0.1.9-0.20240719134745-1df6fb20bbf9 h1:OAXiCosqY8xKDp3pqTW3qbrCprZ1l6WkrXSFSCwyY4I=
github.com/metacubex/sing-vmess v0.1.9-0.20240719134745-1df6fb20bbf9/go.mod h1:olVkD4FChQ5gKMHG4ZzuD7+fMkJY1G8vwOKpRehjrmY=
github.com/metacubex/sing-wireguard v0.0.0-20240924052438-b0976fc59ea3 h1:xg71VmzLS6ByAzi/57phwDvjE+dLLs+ozH00k4DnOns=
diff --git a/clash-meta/listener/sing_tun/server.go b/clash-meta/listener/sing_tun/server.go
index 79856c466c..ad3d113e4a 100644
--- a/clash-meta/listener/sing_tun/server.go
+++ b/clash-meta/listener/sing_tun/server.go
@@ -279,7 +279,7 @@ func New(options LC.Tun, tunnel C.Tunnel, additions ...inbound.Addition) (l *Lis
return
}
- defaultInterfaceMonitor, err = tun.NewDefaultInterfaceMonitor(networkUpdateMonitor, log.SingLogger, tun.DefaultInterfaceMonitorOptions{OverrideAndroidVPN: true})
+ defaultInterfaceMonitor, err = tun.NewDefaultInterfaceMonitor(networkUpdateMonitor, log.SingLogger, tun.DefaultInterfaceMonitorOptions{InterfaceFinder: interfaceFinder, OverrideAndroidVPN: true})
if err != nil {
err = E.Cause(err, "create DefaultInterfaceMonitor")
return
diff --git a/clash-nyanpasu/backend/Cargo.lock b/clash-nyanpasu/backend/Cargo.lock
index e4553511df..b5bde63fa8 100644
--- a/clash-nyanpasu/backend/Cargo.lock
+++ b/clash-nyanpasu/backend/Cargo.lock
@@ -358,7 +358,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -548,7 +548,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -583,7 +583,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -623,7 +623,7 @@ checksum = "99e1aca718ea7b89985790c94aad72d77533063fe00bc497bb79a7c2dae6a661"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -848,7 +848,7 @@ dependencies = [
"bitflags 2.6.0",
"cexpr",
"clang-sys",
- "itertools 0.12.1",
+ "itertools 0.10.5",
"lazy_static",
"lazycell",
"log",
@@ -858,7 +858,7 @@ dependencies = [
"regex",
"rustc-hash 1.1.0",
"shlex",
- "syn 2.0.81",
+ "syn 2.0.82",
"which 4.4.2",
]
@@ -1046,7 +1046,7 @@ checksum = "240f4126219a83519bad05c9a40bfc0303921eeb571fc2d7e44c17ffac99d3f1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
"synstructure",
]
@@ -1167,7 +1167,7 @@ checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -1461,7 +1461,7 @@ dependencies = [
"heck 0.5.0",
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -1729,7 +1729,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d"
dependencies = [
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -1984,7 +1984,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -1994,7 +1994,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f"
dependencies = [
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -2065,7 +2065,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -2076,7 +2076,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
dependencies = [
"darling_core",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -2180,7 +2180,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -2201,7 +2201,7 @@ dependencies = [
"darling",
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -2211,7 +2211,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"
dependencies = [
"derive_builder_core",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -2224,7 +2224,7 @@ dependencies = [
"proc-macro2",
"quote",
"rustc_version",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -2356,7 +2356,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -2388,7 +2388,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -2659,7 +2659,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -2680,7 +2680,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -2982,7 +2982,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -3106,7 +3106,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -3394,7 +3394,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -3668,7 +3668,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -4122,7 +4122,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -4306,7 +4306,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -5013,7 +5013,7 @@ checksum = "dcf09caffaac8068c346b6df2a7fc27a177fd20b39421a39ce0a211bde679a6c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -5389,7 +5389,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -5449,7 +5449,7 @@ dependencies = [
"proc-macro-crate 3.2.0",
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -5506,7 +5506,7 @@ version = "0.1.0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -5835,7 +5835,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -5986,7 +5986,7 @@ checksum = "0a4b29106d9f2bbcca4f5ee7a9325c99844ff9721d10103625cd5278795507fe"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -6226,7 +6226,7 @@ dependencies = [
"pest_meta",
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -6364,7 +6364,7 @@ dependencies = [
"phf_shared 0.11.2",
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -6417,7 +6417,7 @@ checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -6568,7 +6568,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba"
dependencies = [
"proc-macro2",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -6654,7 +6654,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd"
dependencies = [
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -6989,7 +6989,7 @@ checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -7237,7 +7237,7 @@ dependencies = [
"serde",
"serde_json",
"serde_yml",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -7422,7 +7422,7 @@ dependencies = [
"proc-macro2",
"quote",
"serde_derive_internals",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -7564,7 +7564,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -7575,7 +7575,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -7608,7 +7608,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -7659,7 +7659,7 @@ dependencies = [
"darling",
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -8162,7 +8162,7 @@ dependencies = [
"proc-macro2",
"quote",
"rustversion",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -8215,9 +8215,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",
@@ -8247,7 +8247,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -8368,7 +8368,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -8485,7 +8485,7 @@ dependencies = [
"serde",
"serde_json",
"sha2 0.10.8",
- "syn 2.0.81",
+ "syn 2.0.82",
"tauri-utils",
"thiserror",
"time",
@@ -8503,7 +8503,7 @@ dependencies = [
"heck 0.5.0",
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
"tauri-codegen",
"tauri-utils",
]
@@ -8558,9 +8558,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-dialog"
-version = "2.0.1"
+version = "2.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ddb2fe88b602461c118722c574e2775ab26a4e68886680583874b2f6520608b7"
+checksum = "4307310e1d2c09ab110235834722e7c2b85099b683e1eb7342ab351b0be5ada3"
dependencies = [
"log",
"raw-window-handle",
@@ -8576,9 +8576,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-fs"
-version = "2.0.1"
+version = "2.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab300488ebec3487ca5f56289692e7e45feb07eea8d5e1dba497f7dc9dd9c407"
+checksum = "96ba7d46e86db8c830d143ef90ab5a453328365b0cc834c24edea4267b16aba0"
dependencies = [
"anyhow",
"dunce",
@@ -8659,9 +8659,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-shell"
-version = "2.0.1"
+version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "371fb9aca2823990a2d0db7970573be5fdf07881fcaa2b835b29631feb84aec1"
+checksum = "0ad7880c5586b6b2104be451e3d7fc0f3800c84bda69e9ba81c828f87cb34267"
dependencies = [
"encoding_rs",
"log",
@@ -8916,7 +8916,7 @@ checksum = "5999e24eaa32083191ba4e425deb75cdf25efefabe5aaccb7446dd0d4122a3f5"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -8959,7 +8959,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -9115,7 +9115,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -9295,7 +9295,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -9936,7 +9936,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
"wasm-bindgen-shared",
]
@@ -9970,7 +9970,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@@ -10241,7 +10241,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -10548,7 +10548,7 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -10559,7 +10559,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -10570,7 +10570,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -10581,7 +10581,7 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -10592,7 +10592,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -10603,7 +10603,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -11170,7 +11170,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
"synstructure",
]
@@ -11231,7 +11231,7 @@ checksum = "709ab20fc57cb22af85be7b360239563209258430bccf38d8b979c5a2ae3ecce"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
"zbus-lockstep",
"zbus_xml",
"zvariant",
@@ -11246,7 +11246,7 @@ dependencies = [
"proc-macro-crate 3.2.0",
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
"zvariant_utils",
]
@@ -11292,7 +11292,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -11312,7 +11312,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
"synstructure",
]
@@ -11333,7 +11333,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -11355,7 +11355,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
[[package]]
@@ -11485,7 +11485,7 @@ dependencies = [
"proc-macro-crate 3.2.0",
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
"zvariant_utils",
]
@@ -11497,5 +11497,5 @@ checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.81",
+ "syn 2.0.82",
]
diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json
index 71282ed26d..fc739a695a 100644
--- a/clash-nyanpasu/frontend/nyanpasu/package.json
+++ b/clash-nyanpasu/frontend/nyanpasu/package.json
@@ -21,7 +21,7 @@
"@mui/material": "6.1.4",
"@nyanpasu/interface": "workspace:^",
"@nyanpasu/ui": "workspace:^",
- "@tanstack/router-zod-adapter": "1.74.0",
+ "@tanstack/router-zod-adapter": "1.74.4",
"@tauri-apps/api": "2.0.2",
"@types/json-schema": "7.0.15",
"ahooks": "3.8.1",
@@ -29,7 +29,7 @@
"country-code-emoji": "2.3.0",
"dayjs": "1.11.13",
"framer-motion": "12.0.0-alpha.1",
- "i18next": "23.16.1",
+ "i18next": "23.16.2",
"jotai": "2.10.1",
"json-schema": "0.4.0",
"material-react-table": "3.0.1",
@@ -52,18 +52,18 @@
"@csstools/normalize.css": "12.1.1",
"@emotion/babel-plugin": "11.12.0",
"@emotion/react": "11.13.3",
- "@iconify/json": "2.2.261",
+ "@iconify/json": "2.2.262",
"@monaco-editor/react": "4.6.0",
- "@tanstack/react-router": "1.74.0",
- "@tanstack/router-devtools": "1.74.0",
- "@tanstack/router-plugin": "1.73.1",
+ "@tanstack/react-router": "1.74.4",
+ "@tanstack/router-devtools": "1.74.4",
+ "@tanstack/router-plugin": "1.74.2",
"@tauri-apps/plugin-clipboard-manager": "2.0.0",
"@tauri-apps/plugin-dialog": "2.0.1",
- "@tauri-apps/plugin-fs": "2.0.0",
+ "@tauri-apps/plugin-fs": "2.0.1",
"@tauri-apps/plugin-notification": "2.0.0",
"@tauri-apps/plugin-os": "2.0.0",
"@tauri-apps/plugin-process": "2.0.0",
- "@tauri-apps/plugin-shell": "2.0.0",
+ "@tauri-apps/plugin-shell": "2.0.1",
"@tauri-apps/plugin-updater": "2.0.0",
"@types/react": "18.3.11",
"@types/react-dom": "18.3.1",
diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml
index 5fc733c383..cd0781a66c 100644
--- a/clash-nyanpasu/pnpm-lock.yaml
+++ b/clash-nyanpasu/pnpm-lock.yaml
@@ -217,8 +217,8 @@ importers:
specifier: workspace:^
version: link:../ui
'@tanstack/router-zod-adapter':
- specifier: 1.74.0
- version: 1.74.0(@tanstack/react-router@1.74.0(@tanstack/router-generator@1.73.1)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020))(zod@3.23.8)
+ specifier: 1.74.4
+ version: 1.74.4(@tanstack/react-router@1.74.4(@tanstack/router-generator@1.74.2)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020))(zod@3.23.8)
'@tauri-apps/api':
specifier: 2.0.2
version: 2.0.2
@@ -241,8 +241,8 @@ importers:
specifier: 12.0.0-alpha.1
version: 12.0.0-alpha.1(@emotion/is-prop-valid@1.3.0)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)
i18next:
- specifier: 23.16.1
- version: 23.16.1
+ specifier: 23.16.2
+ version: 23.16.2
jotai:
specifier: 2.10.1
version: 2.10.1(react@19.0.0-rc-65a56d0e-20241020)(types-react@19.0.0-rc.1)
@@ -275,7 +275,7 @@ importers:
version: 7.4.0(xjqvl6gudwt62pepgh7ow64mzi)
react-i18next:
specifier: 15.0.3
- version: 15.0.3(i18next@23.16.1)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)
+ version: 15.0.3(i18next@23.16.2)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)
react-markdown:
specifier: 9.0.1
version: 9.0.1(react@19.0.0-rc-65a56d0e-20241020)(types-react@19.0.0-rc.1)
@@ -305,20 +305,20 @@ importers:
specifier: 11.13.3
version: 11.13.3(react@19.0.0-rc-65a56d0e-20241020)(types-react@19.0.0-rc.1)
'@iconify/json':
- specifier: 2.2.261
- version: 2.2.261
+ specifier: 2.2.262
+ version: 2.2.262
'@monaco-editor/react':
specifier: 4.6.0
version: 4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)
'@tanstack/react-router':
- specifier: 1.74.0
- version: 1.74.0(@tanstack/router-generator@1.73.1)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)
+ specifier: 1.74.4
+ version: 1.74.4(@tanstack/router-generator@1.74.2)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)
'@tanstack/router-devtools':
- specifier: 1.74.0
- version: 1.74.0(@tanstack/react-router@1.74.0(@tanstack/router-generator@1.73.1)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020))(csstype@3.1.3)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)
+ specifier: 1.74.4
+ version: 1.74.4(@tanstack/react-router@1.74.4(@tanstack/router-generator@1.74.2)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020))(csstype@3.1.3)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)
'@tanstack/router-plugin':
- specifier: 1.73.1
- version: 1.73.1(vite@5.4.9(@types/node@22.7.7)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.80.3)(stylus@0.62.0))(webpack-sources@3.2.3)
+ specifier: 1.74.2
+ version: 1.74.2(vite@5.4.9(@types/node@22.7.7)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.80.3)(stylus@0.62.0))(webpack-sources@3.2.3)
'@tauri-apps/plugin-clipboard-manager':
specifier: 2.0.0
version: 2.0.0
@@ -326,8 +326,8 @@ importers:
specifier: 2.0.1
version: 2.0.1
'@tauri-apps/plugin-fs':
- specifier: 2.0.0
- version: 2.0.0
+ specifier: 2.0.1
+ version: 2.0.1
'@tauri-apps/plugin-notification':
specifier: 2.0.0
version: 2.0.0
@@ -338,8 +338,8 @@ importers:
specifier: 2.0.0
version: 2.0.0
'@tauri-apps/plugin-shell':
- specifier: 2.0.0
- version: 2.0.0
+ specifier: 2.0.1
+ version: 2.0.1
'@tauri-apps/plugin-updater':
specifier: 2.0.0
version: 2.0.0
@@ -462,7 +462,7 @@ importers:
version: 4.1.2(react@19.0.0-rc-65a56d0e-20241020)
react-i18next:
specifier: 15.0.3
- version: 15.0.3(i18next@23.16.1)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)
+ version: 15.0.3(i18next@23.16.2)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)
react-use:
specifier: 17.5.1
version: 17.5.1(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)
@@ -801,10 +801,6 @@ packages:
resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==}
engines: {node: '>=6.9.0'}
- '@babel/template@7.25.0':
- resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==}
- engines: {node: '>=6.9.0'}
-
'@babel/template@7.25.7':
resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==}
engines: {node: '>=6.9.0'}
@@ -1377,8 +1373,8 @@ packages:
'@vue/compiler-sfc':
optional: true
- '@iconify/json@2.2.261':
- resolution: {integrity: sha512-uUm8Svulz5aRRF0X+r2/UG5P0xcUCGOGVmAFJ/ZANx29wqE79PvGCYXHuznNC0h8+UW1fnvprj7FmgJELvMYZw==}
+ '@iconify/json@2.2.262':
+ resolution: {integrity: sha512-h7zMbLxsKohKXvf2Lpq6Xob7dxkqXxrUVR58ZvZBgCSrHcE69QJmcFG/KaAwM1eGuKToWvgPWeb1xE6zy7juqg==}
'@iconify/types@2.0.0':
resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
@@ -2307,11 +2303,11 @@ packages:
resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==}
engines: {node: '>=12'}
- '@tanstack/react-router@1.74.0':
- resolution: {integrity: sha512-dthfscAM25bi1AjA38t9jPsU2jqNk0f6a6ziorEi845ss6Uwrbw4FSFQ1oI1UmUfaJR73S5SO8TGXKZAIxhlWQ==}
+ '@tanstack/react-router@1.74.4':
+ resolution: {integrity: sha512-dVI8L1Nc4d/njlFFm2O5NPLcqOd6/D10LaODIYNsbWts4UjQpQFBZcY5PGDBp9yPJxYMZ1wVctcWSGHrAUL4HQ==}
engines: {node: '>=12'}
peerDependencies:
- '@tanstack/router-generator': 1.73.1
+ '@tanstack/router-generator': 1.74.2
react: '>=18'
react-dom: '>=18'
peerDependenciesMeta:
@@ -2337,20 +2333,20 @@ packages:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
- '@tanstack/router-devtools@1.74.0':
- resolution: {integrity: sha512-lr7e5PU43tDD//7mN+bBfSgQphchzHk5NbhzlwgEuEW74lYc6CCRUUeORR+pPAUFdf8+7yQ6iv5Ow7iaXb17ng==}
+ '@tanstack/router-devtools@1.74.4':
+ resolution: {integrity: sha512-g0ZNtee60k4sGSVSIqqeOgXgIG18e7QJysJhrPqotlRKCLBKjScqivoNejM3pYWjyJVmzdZEiclwsOOJ6CezOA==}
engines: {node: '>=12'}
peerDependencies:
- '@tanstack/react-router': ^1.74.0
+ '@tanstack/react-router': ^1.74.4
react: '>=18'
react-dom: '>=18'
- '@tanstack/router-generator@1.73.1':
- resolution: {integrity: sha512-+oHYnspeS3f4bpbnUymH9dEGJbxhfV0rSwHl0cTq4pXSPXuLYcqYZmSGCqBfiq6CGtgOXZ2wEUMgezt3R2PvZg==}
+ '@tanstack/router-generator@1.74.2':
+ resolution: {integrity: sha512-S69fXvYcL+tQsO5Fe9ju/XVa/hZvk4pCaWbtoR2MNjIgR2RmjiFKOgXYeLRMNom/IpP/HAQmQ3m1DwU9jjSUKA==}
engines: {node: '>=12'}
- '@tanstack/router-plugin@1.73.1':
- resolution: {integrity: sha512-pJMTWVFEIvTXLL6kzYZlPRlQ7WwfsBNZGIJck+dX0NQVjw6CEj1a4w9hlJFSqIOBbRdjtY6hS3Y00DDFGf9Inw==}
+ '@tanstack/router-plugin@1.74.2':
+ resolution: {integrity: sha512-HcG0FwSZ77g0QH9Ev2I1QYeXS+WWjdThO5Whgm/9abkyJq5GfsiLm2Ey2cw2Va+iHgD2nQdkraP9xL/z9/s6BQ==}
engines: {node: '>=12'}
peerDependencies:
'@rsbuild/core': '>=1.0.2'
@@ -2364,8 +2360,8 @@ packages:
webpack:
optional: true
- '@tanstack/router-zod-adapter@1.74.0':
- resolution: {integrity: sha512-YBYVNyRJ/XIVJ/QUt27s+2oaEO1YcANwlRLfvfIPDk+V3DHTz33z4+oNJ/I/YlJUOTNcoqv7mlqmWnk8Zn4Cmw==}
+ '@tanstack/router-zod-adapter@1.74.4':
+ resolution: {integrity: sha512-931F+4poa6dnKN/ecHRRBPuhYUysAsd60uNWfr0Yj9XYo0OuNa8R3J2T7NBV7gVtWTg5ywxm360KXoHCJ6gSWQ==}
engines: {node: '>=12'}
peerDependencies:
'@tanstack/react-router': '>=1.43.2'
@@ -2465,8 +2461,8 @@ packages:
'@tauri-apps/plugin-dialog@2.0.1':
resolution: {integrity: sha512-fnUrNr6EfvTqdls/ufusU7h6UbNFzLKvHk/zTuOiBq01R3dTODqwctZlzakdbfSp/7pNwTKvgKTAgl/NAP/Z0Q==}
- '@tauri-apps/plugin-fs@2.0.0':
- resolution: {integrity: sha512-BNEeQQ5aH8J5SwYuWgRszVyItsmquRuzK2QRkVj8Z0sCsLnSvJFYI3JHRzzr3ltZGq1nMPtblrlZzuKqVzRawA==}
+ '@tauri-apps/plugin-fs@2.0.1':
+ resolution: {integrity: sha512-PkeZG2WAob9Xpmr66aPvj+McDVgFjV2a7YBzYVZjiCvbGeMs6Yk09tlXhCe3EyZdT/pwWMSi8lXUace+hlsjsw==}
'@tauri-apps/plugin-notification@2.0.0':
resolution: {integrity: sha512-6qEDYJS7mgXZWLXA0EFL+DVCJh8sJlzSoyw6B50pxhLPVFjc5Vr5DVzl5W3mUHaYhod5wsC984eQnlCCGqxYDA==}
@@ -2477,8 +2473,8 @@ packages:
'@tauri-apps/plugin-process@2.0.0':
resolution: {integrity: sha512-OYzi0GnkrF4NAnsHZU7U3tjSoP0PbeAlO7T1Z+vJoBUH9sFQ1NSLqWYWQyf8hcb3gVWe7P1JggjiskO+LST1ug==}
- '@tauri-apps/plugin-shell@2.0.0':
- resolution: {integrity: sha512-OpW2+ycgJLrEoZityWeWYk+6ZWP9VyiAfbO+N/O8VfLkqyOym8kXh7odKDfINx9RAotkSGBtQM4abyKfJDkcUg==}
+ '@tauri-apps/plugin-shell@2.0.1':
+ resolution: {integrity: sha512-akU1b77sw3qHiynrK0s930y8zKmcdrSD60htjH+mFZqv5WaakZA/XxHR3/sF1nNv9Mgmt/Shls37HwnOr00aSw==}
'@tauri-apps/plugin-updater@2.0.0':
resolution: {integrity: sha512-N0cl71g7RPr7zK2Fe5aoIwzw14NcdLcz7XMGFWZVjprsqgDRWoxbnUkknyCQMZthjhGkppCd/wN2MIsUz+eAhQ==}
@@ -4422,8 +4418,8 @@ packages:
hyphenate-style-name@1.1.0:
resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==}
- i18next@23.16.1:
- resolution: {integrity: sha512-H73h/H7BN7PI38Sq9XsOXzWFBH6mtyCYFiUMVtd9BxiYNDWPPIzKcBmDrqhjKbw3IXP5j6JoSW4ugJlaZuOvKw==}
+ i18next@23.16.2:
+ resolution: {integrity: sha512-dFyxwLXxEQK32f6tITBMaRht25mZPJhQ0WbC0p3bO2mWBal9lABTMqSka5k+GLSRWLzeJBKDpH7BeIA9TZI7Jg==}
iconv-lite@0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
@@ -7333,14 +7329,14 @@ snapshots:
dependencies:
'@ampproject/remapping': 2.3.0
'@babel/code-frame': 7.24.7
- '@babel/generator': 7.25.6
+ '@babel/generator': 7.25.7
'@babel/helper-compilation-targets': 7.25.2
'@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2)
'@babel/helpers': 7.25.6
- '@babel/parser': 7.25.6
- '@babel/template': 7.25.0
- '@babel/traverse': 7.25.6
- '@babel/types': 7.25.6
+ '@babel/parser': 7.25.8
+ '@babel/template': 7.25.7
+ '@babel/traverse': 7.25.7
+ '@babel/types': 7.25.8
convert-source-map: 2.0.0
debug: 4.3.7
gensync: 1.0.0-beta.2
@@ -7469,7 +7465,7 @@ snapshots:
'@babel/core': 7.25.2
'@babel/helper-module-imports': 7.24.7
'@babel/helper-simple-access': 7.24.7
- '@babel/helper-validator-identifier': 7.24.7
+ '@babel/helper-validator-identifier': 7.25.7
'@babel/traverse': 7.25.7
transitivePeerDependencies:
- supports-color
@@ -7609,12 +7605,6 @@ snapshots:
dependencies:
regenerator-runtime: 0.14.1
- '@babel/template@7.25.0':
- dependencies:
- '@babel/code-frame': 7.24.7
- '@babel/parser': 7.25.8
- '@babel/types': 7.25.8
-
'@babel/template@7.25.7':
dependencies:
'@babel/code-frame': 7.25.7
@@ -8162,7 +8152,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@iconify/json@2.2.261':
+ '@iconify/json@2.2.262':
dependencies:
'@iconify/types': 2.0.0
pathe: 1.1.2
@@ -9066,7 +9056,7 @@ snapshots:
dependencies:
remove-accents: 0.5.0
- '@tanstack/react-router@1.74.0(@tanstack/router-generator@1.73.1)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)':
+ '@tanstack/react-router@1.74.4(@tanstack/router-generator@1.74.2)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)':
dependencies:
'@tanstack/history': 1.61.1
'@tanstack/react-store': 0.5.5(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)
@@ -9075,7 +9065,7 @@ snapshots:
tiny-invariant: 1.3.3
tiny-warning: 1.0.3
optionalDependencies:
- '@tanstack/router-generator': 1.73.1
+ '@tanstack/router-generator': 1.74.2
'@tanstack/react-store@0.5.5(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)':
dependencies:
@@ -9096,9 +9086,9 @@ snapshots:
react: 19.0.0-rc-65a56d0e-20241020
react-dom: 19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020)
- '@tanstack/router-devtools@1.74.0(@tanstack/react-router@1.74.0(@tanstack/router-generator@1.73.1)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020))(csstype@3.1.3)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)':
+ '@tanstack/router-devtools@1.74.4(@tanstack/react-router@1.74.4(@tanstack/router-generator@1.74.2)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020))(csstype@3.1.3)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)':
dependencies:
- '@tanstack/react-router': 1.74.0(@tanstack/router-generator@1.73.1)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)
+ '@tanstack/react-router': 1.74.4(@tanstack/router-generator@1.74.2)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)
clsx: 2.1.1
goober: 2.1.16(csstype@3.1.3)
react: 19.0.0-rc-65a56d0e-20241020
@@ -9106,14 +9096,14 @@ snapshots:
transitivePeerDependencies:
- csstype
- '@tanstack/router-generator@1.73.1':
+ '@tanstack/router-generator@1.74.2':
dependencies:
'@tanstack/virtual-file-routes': 1.64.0
prettier: 3.3.3
tsx: 4.19.1
zod: 3.23.8
- '@tanstack/router-plugin@1.73.1(vite@5.4.9(@types/node@22.7.7)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.80.3)(stylus@0.62.0))(webpack-sources@3.2.3)':
+ '@tanstack/router-plugin@1.74.2(vite@5.4.9(@types/node@22.7.7)(less@4.2.0)(sass-embedded@1.78.0)(sass@1.80.3)(stylus@0.62.0))(webpack-sources@3.2.3)':
dependencies:
'@babel/core': 7.25.8
'@babel/generator': 7.25.7
@@ -9123,7 +9113,7 @@ snapshots:
'@babel/template': 7.25.7
'@babel/traverse': 7.25.7
'@babel/types': 7.25.8
- '@tanstack/router-generator': 1.73.1
+ '@tanstack/router-generator': 1.74.2
'@tanstack/virtual-file-routes': 1.64.0
'@types/babel__core': 7.20.5
'@types/babel__generator': 7.6.8
@@ -9139,9 +9129,9 @@ snapshots:
- supports-color
- webpack-sources
- '@tanstack/router-zod-adapter@1.74.0(@tanstack/react-router@1.74.0(@tanstack/router-generator@1.73.1)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020))(zod@3.23.8)':
+ '@tanstack/router-zod-adapter@1.74.4(@tanstack/react-router@1.74.4(@tanstack/router-generator@1.74.2)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020))(zod@3.23.8)':
dependencies:
- '@tanstack/react-router': 1.74.0(@tanstack/router-generator@1.73.1)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)
+ '@tanstack/react-router': 1.74.4(@tanstack/router-generator@1.74.2)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020)
zod: 3.23.8
'@tanstack/store@0.5.5': {}
@@ -9211,7 +9201,7 @@ snapshots:
dependencies:
'@tauri-apps/api': 2.0.2
- '@tauri-apps/plugin-fs@2.0.0':
+ '@tauri-apps/plugin-fs@2.0.1':
dependencies:
'@tauri-apps/api': 2.0.2
@@ -9227,7 +9217,7 @@ snapshots:
dependencies:
'@tauri-apps/api': 2.0.2
- '@tauri-apps/plugin-shell@2.0.0':
+ '@tauri-apps/plugin-shell@2.0.1':
dependencies:
'@tauri-apps/api': 2.0.2
@@ -11549,7 +11539,7 @@ snapshots:
hyphenate-style-name@1.1.0: {}
- i18next@23.16.1:
+ i18next@23.16.2:
dependencies:
'@babel/runtime': 7.25.7
@@ -13035,11 +13025,11 @@ snapshots:
dependencies:
react: 19.0.0-rc-65a56d0e-20241020
- react-i18next@15.0.3(i18next@23.16.1)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020):
+ react-i18next@15.0.3(i18next@23.16.2)(react-dom@19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020))(react@19.0.0-rc-65a56d0e-20241020):
dependencies:
'@babel/runtime': 7.25.6
html-parse-stringify: 3.0.1
- i18next: 23.16.1
+ i18next: 23.16.2
react: 19.0.0-rc-65a56d0e-20241020
optionalDependencies:
react-dom: 19.0.0-rc-65a56d0e-20241020(react@19.0.0-rc-65a56d0e-20241020)
diff --git a/clash-verge-rev/.github/ISSUE_TEMPLATE/bug_report.yml b/clash-verge-rev/.github/ISSUE_TEMPLATE/bug_report.yml
index 542e9937de..f6e5ef2b99 100644
--- a/clash-verge-rev/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/clash-verge-rev/.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
@@ -51,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/clash-verge-rev/.github/workflows/alpha.yml b/clash-verge-rev/.github/workflows/alpha.yml
index 66f47c32e8..9fd3706121 100644
--- a/clash-verge-rev/.github/workflows/alpha.yml
+++ b/clash-verge-rev/.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
@@ -37,7 +35,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 }}
@@ -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
@@ -240,7 +235,7 @@ jobs:
cat > release.txt << 'EOF'
## 我应该下载哪个版本?
- ### MacOS (提示文件损坏或开发者无法验证请查看下面FAQ)
+ ### MacOS
- MacOS intel芯片: x64.dmg
- MacOS apple M芯片: aarch64.dmg
@@ -250,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
diff --git a/clash-verge-rev/.github/workflows/dev.yml b/clash-verge-rev/.github/workflows/dev.yml
index b0ffada7b6..c1013f5b58 100644
--- a/clash-verge-rev/.github/workflows/dev.yml
+++ b/clash-verge-rev/.github/workflows/dev.yml
@@ -33,7 +33,7 @@ jobs:
uses: actions/checkout@v4
- name: Install Rust Stable
- uses: dtolnay/rust-toolchain@1.77.0
+ uses: dtolnay/rust-toolchain@stable
- name: Add Rust Target
run: rustup target add ${{ matrix.target }}
@@ -65,6 +65,14 @@ jobs:
env:
NODE_OPTIONS: "--max_old_space_size=4096"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
+ TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
+ APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
+ APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
+ APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
+ APPLE_ID: ${{ secrets.APPLE_ID }}
+ APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
+ APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
with:
tauriScript: pnpm
args: --target ${{ matrix.target }} -b ${{ matrix.bundle }}
diff --git a/clash-verge-rev/.github/workflows/release.yml b/clash-verge-rev/.github/workflows/release.yml
index 0cb5fb3864..d753d6aa18 100644
--- a/clash-verge-rev/.github/workflows/release.yml
+++ b/clash-verge-rev/.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
@@ -30,7 +28,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 }}
@@ -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/clash-verge-rev/UPDATELOG.md b/clash-verge-rev/UPDATELOG.md
index 69806df800..b8ea2b40c3 100644
--- a/clash-verge-rev/UPDATELOG.md
+++ b/clash-verge-rev/UPDATELOG.md
@@ -1,10 +1,44 @@
## v2.0.0
+### Notice
+
+- 由于更改了服务安装逻辑,Mac/Linux 首次安装需要输入 2 遍系统密码卸载和安装服务,以后可以丝滑使用 tun(虚拟网卡)模式
+
### Breaking changes
- 重大框架升级:使用 Tauri 2.0(巨量改进与性能提升)
+- 强烈建议完全删除 1.x 老版本再安装此版本
- 敬请测试,出现 bug 到 issues 中提出
+### Features
+
+- 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 下的 bug, Tun 模式在 Linux 下目前工作正常
+- 修复 Linux wayland 下任务栏图标缺失的问题
+- 移除多余退出变量和钩子
+
---
## v1.7.7
diff --git a/clash-verge-rev/package.json b/clash-verge-rev/package.json
index e46a234ab4..9cc1024fa6 100644
--- a/clash-verge-rev/package.json
+++ b/clash-verge-rev/package.json
@@ -1,11 +1,11 @@
{
"name": "clash-verge",
- "version": "2.0.0",
+ "version": "2.0.0-rc.2",
"license": "GPL-3.0-only",
"scripts": {
- "dev": "tauri dev",
- "dev:diff": "tauri dev -f verge-dev",
- "build": "tauri build",
+ "dev": "cross-env RUST_BACKTRACE=1 tauri dev",
+ "dev:diff": "cross-env RUST_BACKTRACE=1 tauri dev -f verge-dev",
+ "build": "cross-env NODE_OPTIONS='--max-old-space-size=4096' tauri build",
"tauri": "tauri",
"web:dev": "vite",
"web:build": "tsc && vite build",
@@ -40,8 +40,10 @@
"@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",
+ "glob": "^11.0.0",
"i18next": "^23.11.5",
"js-base64": "^3.7.7",
"js-yaml": "^4.1.0",
@@ -68,8 +70,7 @@
},
"devDependencies": {
"@actions/github": "^5.1.1",
- "@tauri-apps/cli": "2.0.0-rc.8",
- "@types/fs-extra": "^9.0.13",
+ "@tauri-apps/cli": "2.0.3",
"@types/js-cookie": "^3.0.6",
"@types/js-yaml": "^4.0.9",
"@types/lodash-es": "^4.17.12",
@@ -80,7 +81,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/clash-verge-rev/pnpm-lock.yaml b/clash-verge-rev/pnpm-lock.yaml
index 637363e264..baec87c380 100644
--- a/clash-verge-rev/pnpm-lock.yaml
+++ b/clash-verge-rev/pnpm-lock.yaml
@@ -73,12 +73,18 @@ 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
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
@@ -153,11 +159,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
- "@types/fs-extra":
- specifier: ^9.0.13
- version: 9.0.13
+ specifier: 2.0.3
+ version: 2.0.3
"@types/js-cookie":
specifier: ^3.0.6
version: 3.0.6
@@ -188,9 +191,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
@@ -1531,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:
{
@@ -2106,100 +2113,100 @@ packages:
integrity: sha512-UNiIhhKG08j4ooss2oEEVexffmWkgkYlC2M3GcX3VPtNsqFgVNL8Mcw/4Y7rO9M9S+ffAMnLOF5ypzyuyb8tyg==,
}
- "@tauri-apps/cli-darwin-arm64@2.0.0-rc.8":
+ "@tauri-apps/cli-darwin-arm64@2.0.3":
resolution:
{
- integrity: sha512-XDjFLfCz7gOsKg9qFyK7S9EbrdcLhWE2bSTvHDpnFdMc+DcjMR4O3HuCO7SrPmmFUf86OknYFiuMPEUoHf0Fiw==,
+ integrity: sha512-jIsbxGWS+As1ZN7umo90nkql/ZAbrDK0GBT6UsgHSz5zSwwArICsZFFwE1pLZip5yoiV5mn3TGG2c1+v+0puzQ==,
}
engines: { node: ">= 10" }
cpu: [arm64]
os: [darwin]
- "@tauri-apps/cli-darwin-x64@2.0.0-rc.8":
+ "@tauri-apps/cli-darwin-x64@2.0.3":
resolution:
{
- integrity: sha512-vYuITao7qq45jzTXRFdAcB+rVBULmofksWsKzoi+cgI8R0kcfB3bts+FRBdV3j+fkbpBQKpriW6Y6gdOzbf6Ow==,
+ integrity: sha512-ROITHtLTA1muyrwgyuwyasmaLCGtT4as/Kd1kerXaSDtFcYrnxiM984ZD0+FDUEDl5BgXtYa/sKKkKQFjgmM0A==,
}
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.3":
resolution:
{
- integrity: sha512-iW1gJyRBvwxCeBEu+ain18v8FtFBhrsqepzuUyOy7hZJWUMPdKHJhbFVz6xp3RGZf5ycsLUr3ZhqMB3vKtv7iQ==,
+ integrity: sha512-bQ3EZwCFfrLg/ZQ2I8sLuifSxESz4TP56SleTkKsPtTIZgNnKpM88PRDz4neiRroHVOq8NK0X276qi9LjGcXPw==,
}
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.3":
resolution:
{
- integrity: sha512-k1HQHpu59B8JteXALCSdCQBUVb+ytsg1u/QEWPzCm7mFhzr7jqdfBjQVAKt0T5rdQQTcNtK341oB7izuXmJE2A==,
+ integrity: sha512-aLfAA8P9OTErVUk3sATxtXqpAtlfDPMPp4fGjDysEELG/MyekGhmh2k/kG/i32OdPeCfO+Nr37wJksARJKubGw==,
}
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.3":
resolution:
{
- integrity: sha512-tMotP7J/dMqCL8zPCwtMwjeO3SK1yxU9bUMZ3mwdAtf+3xr2d2hpmGo4KXk5r2jQee9+dIC3IBXexFhrVJGRHA==,
+ integrity: sha512-I4MVD7nf6lLLRmNQPpe5beEIFM6q7Zkmh77ROA5BNu/+vHNL5kiTMD+bmd10ZL2r753A6pO7AvqkIxcBuIl0tg==,
}
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.3":
resolution:
{
- integrity: sha512-AnLghADQgt4oyp4rQyjpKfGpdAqofd+SRO9kht5d4c0RSViqwHBjIxrCt9FDhBpBwwkC6T6NNuQqaofZSnOH6Q==,
+ integrity: sha512-C6Jkx2zZGKkoi+sg5FK9GoH/0EvAaOgrZfF5azV5EALGba46g7VpWcZgp9zFUd7K2IzTi+0OOY8TQ2OVfKZgew==,
}
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.3":
resolution:
{
- integrity: sha512-jv/uiXI2K41/XMA2vnKMcpdv1tKvez70HHvBoIwHhelmXV5V6Tpu5fTMEAXbA6WbJNfcFRi0kd55YRBOS0DZcw==,
+ 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.8":
+ "@tauri-apps/cli-win32-arm64-msvc@2.0.3":
resolution:
{
- integrity: sha512-wctgwSfuyJ0lXBzQSzGq5TAy2m9VZichZPPJ7GitYzdHbqIRLmvxM1abRen7HikP1lpjdmjl96/kWQOebEV0qw==,
+ integrity: sha512-UXxHkYmFesC97qVmZre4vY7oDxRDtC2OeKNv0bH+iSnuUp/ROxzJYGyaelnv9Ybvgl4YVqDCnxgB28qMM938TA==,
}
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.3":
resolution:
{
- integrity: sha512-BBjoAezNpHscGhBICHrt+X+IyJIh9jYnaEIGvbCIMcGB6sSDxvtttw4ef9+4jNh3JixotOR2mwIudTc1H9HffQ==,
+ integrity: sha512-D+xoaa35RGlkXDpnL5uDTpj29untuC5Wp6bN9snfgFDagD0wnFfC8+2ZQGu16bD0IteWqDI0OSoIXhNvy+F+wg==,
}
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.3":
resolution:
{
- integrity: sha512-1pgDw2woeyDMvXctmqc53LBxsaAYqiRNUVgwvzlmzJDbUHv4+Pj4B1OGKQh1YKlsmks8LK3mK9uSbk+k1OLZhw==,
+ integrity: sha512-eWV9XWb4dSYHXl13OtYWLjX1JHphUEkHkkGwJrhr8qFBm7RbxXxQvrsUEprSi51ug/dwJenjJgM4zR8By4htfw==,
}
engines: { node: ">= 10" }
cpu: [x64]
os: [win32]
- "@tauri-apps/cli@2.0.0-rc.8":
+ "@tauri-apps/cli@2.0.3":
resolution:
{
- integrity: sha512-hB6Pa0IaJs/As3Hc5IOiiK4Ilh9jspEA+2uPURCRQg4BkzQWwQzNdGQ4gjAzFNFAWPzy/4uuIXdnd1a+jC4wLA==,
+ integrity: sha512-JwEyhc5BAVpn4E8kxzY/h7+bVOiXQdudR1r3ODMfyyumZBfgIWqpD/WuTcPq6Yjchju1BSS+80jAE/oYwI/RKg==,
}
engines: { node: ">= 10" }
hasBin: true
@@ -2294,12 +2301,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:
{
@@ -2452,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:
{
@@ -2459,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:
{
@@ -2521,6 +2550,12 @@ packages:
integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==,
}
+ balanced-match@1.0.2:
+ resolution:
+ {
+ integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==,
+ }
+
before-after-hook@2.2.3:
resolution:
{
@@ -2534,6 +2569,12 @@ packages:
}
engines: { node: ">=8" }
+ brace-expansion@2.0.1:
+ resolution:
+ {
+ integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==,
+ }
+
braces@3.0.3:
resolution:
{
@@ -2636,6 +2677,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:
{
@@ -2655,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:
{
@@ -2751,6 +2812,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:
{
@@ -2820,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:
{
@@ -2845,6 +2931,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:
{
@@ -2874,6 +2986,13 @@ packages:
}
engines: { node: ">=10" }
+ esniff@2.0.1:
+ resolution:
+ {
+ integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==,
+ }
+ engines: { node: ">=0.10" }
+
estree-util-is-identifier-name@3.0.0:
resolution:
{
@@ -2893,6 +3012,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:
{
@@ -2900,6 +3025,12 @@ packages:
}
engines: { node: ">=10" }
+ ext@1.7.0:
+ resolution:
+ {
+ integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==,
+ }
+
extend@3.0.2:
resolution:
{
@@ -2945,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:
{
@@ -2970,13 +3108,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:
{
@@ -3019,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:
{
@@ -3026,12 +3165,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:
{
@@ -3181,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:
{
@@ -3215,6 +3355,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:
{
@@ -3228,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:
{
@@ -3288,12 +3441,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:
{
@@ -3344,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:
{
@@ -3357,6 +3511,12 @@ packages:
}
engines: { node: ">=10" }
+ lru-queue@0.1.0:
+ resolution:
+ {
+ integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==,
+ }
+
magic-string@0.30.10:
resolution:
{
@@ -3411,6 +3571,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:
{
@@ -3577,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:
{
@@ -3591,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:
{
@@ -3675,6 +3856,12 @@ packages:
engines: { node: ^18 || >=20 }
hasBin: true
+ next-tick@1.1.0:
+ resolution:
+ {
+ integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==,
+ }
+
no-case@3.0.4:
resolution:
{
@@ -3768,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:
{
@@ -3814,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:
{
@@ -4183,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:
{
@@ -4235,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:
{
@@ -4309,6 +4544,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:
{
@@ -4354,6 +4596,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:
{
@@ -4457,13 +4705,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:
{
@@ -4605,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:
{
@@ -5638,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
@@ -6032,48 +6296,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.3":
optional: true
- "@tauri-apps/cli-darwin-x64@2.0.0-rc.8":
+ "@tauri-apps/cli-darwin-x64@2.0.3":
optional: true
- "@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.8":
+ "@tauri-apps/cli-linux-arm-gnueabihf@2.0.3":
optional: true
- "@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.8":
+ "@tauri-apps/cli-linux-arm64-gnu@2.0.3":
optional: true
- "@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.8":
+ "@tauri-apps/cli-linux-arm64-musl@2.0.3":
optional: true
- "@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.8":
+ "@tauri-apps/cli-linux-x64-gnu@2.0.3":
optional: true
- "@tauri-apps/cli-linux-x64-musl@2.0.0-rc.8":
+ "@tauri-apps/cli-linux-x64-musl@2.0.3":
optional: true
- "@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.8":
+ "@tauri-apps/cli-win32-arm64-msvc@2.0.3":
optional: true
- "@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.8":
+ "@tauri-apps/cli-win32-ia32-msvc@2.0.3":
optional: true
- "@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.8":
+ "@tauri-apps/cli-win32-x64-msvc@2.0.3":
optional: true
- "@tauri-apps/cli@2.0.0-rc.8":
+ "@tauri-apps/cli@2.0.3":
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.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:
@@ -6138,10 +6402,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 +6427,7 @@ snapshots:
"@types/node@20.14.10":
dependencies:
undici-types: 5.26.5
+ optional: true
"@types/parse-json@4.0.2": {}
@@ -6240,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
@@ -6293,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
@@ -6351,6 +6628,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: {}
@@ -6359,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
@@ -6410,6 +6701,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: {}
@@ -6442,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
@@ -6454,6 +6756,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
@@ -6486,12 +6813,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
@@ -6504,6 +6843,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:
@@ -6524,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
@@ -6541,12 +6889,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
@@ -6566,9 +6908,16 @@ snapshots:
dependencies:
is-glob: 4.0.3
- globals@11.12.0: {}
+ 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
- graceful-fs@4.2.11: {}
+ globals@11.12.0: {}
has-flag@3.0.0: {}
@@ -6659,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
@@ -6671,10 +7022,16 @@ snapshots:
is-plain-object@5.0.0: {}
+ is-promise@2.2.2: {}
+
is-stream@2.0.1: {}
isexe@2.0.0: {}
+ jackspeak@4.0.2:
+ dependencies:
+ "@isaacs/cliui": 8.0.2
+
js-base64@3.7.7: {}
js-cookie@2.2.1: {}
@@ -6695,12 +7052,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:
@@ -6723,6 +7074,8 @@ snapshots:
dependencies:
tslib: 2.6.3
+ lru-cache@11.0.1: {}
+
lru-cache@5.1.1:
dependencies:
yallist: 3.1.1
@@ -6731,6 +7084,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
@@ -6824,6 +7181,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,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
@@ -7026,6 +7400,8 @@ snapshots:
nanoid@5.0.7: {}
+ next-tick@1.1.0: {}
+
no-case@3.0.4:
dependencies:
lower-case: 2.0.2
@@ -7071,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
@@ -7101,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:
@@ -7343,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
@@ -7365,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:
@@ -7410,6 +7815,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:
@@ -7426,11 +7836,14 @@ snapshots:
tunnel@0.0.6: {}
+ type@2.7.3: {}
+
types-pac@1.0.2: {}
typescript@5.5.3: {}
- undici-types@5.26.5: {}
+ undici-types@5.26.5:
+ optional: true
undici@5.28.4:
dependencies:
@@ -7487,8 +7900,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
@@ -7564,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/clash-verge-rev/scripts/check.mjs b/clash-verge-rev/scripts/check.mjs
index 19e2ac6444..bf75cbacd4 100644
--- a/clash-verge-rev/scripts/check.mjs
+++ b/clash-verge-rev/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";
@@ -6,6 +7,8 @@ import AdmZip from "adm-zip";
import fetch from "node-fetch";
import proxyAgent from "https-proxy-agent";
import { execSync } from "child_process";
+import { log_info, log_debug, log_error, log_success } from "./utils.mjs";
+import { glob } from "glob";
const cwd = process.cwd();
const TEMP_DIR = path.join(cwd, "node_modules/.verge");
@@ -91,9 +94,9 @@ async function getLatestAlphaVersion() {
});
let v = await response.text();
META_ALPHA_VERSION = v.trim(); // Trim to remove extra whitespaces
- console.log(`Latest alpha version: ${META_ALPHA_VERSION}`);
+ log_info(`Latest alpha version: ${META_ALPHA_VERSION}`);
} catch (error) {
- console.error("Error fetching latest alpha version:", error.message);
+ log_error("Error fetching latest alpha version:", error.message);
process.exit(1);
}
}
@@ -138,9 +141,9 @@ async function getLatestReleaseVersion() {
});
let v = await response.text();
META_VERSION = v.trim(); // Trim to remove extra whitespaces
- console.log(`Latest release version: ${META_VERSION}`);
+ log_info(`Latest release version: ${META_VERSION}`);
} catch (error) {
- console.error("Error fetching latest release version:", error.message);
+ log_error("Error fetching latest release version:", error.message);
process.exit(1);
}
}
@@ -205,44 +208,44 @@ async function resolveSidecar(binInfo) {
const sidecarDir = path.join(cwd, "src-tauri", "sidecar");
const sidecarPath = path.join(sidecarDir, targetFile);
- await fs.mkdirp(sidecarDir);
- if (!FORCE && (await fs.pathExists(sidecarPath))) return;
+ await fsp.mkdir(sidecarDir, { recursive: true });
+ if (!FORCE && fs.existsSync(sidecarPath)) return;
const tempDir = path.join(TEMP_DIR, name);
const tempZip = path.join(tempDir, zipFile);
const tempExe = path.join(tempDir, exeFile);
- await fs.mkdirp(tempDir);
+ await fsp.mkdir(tempDir, { recursive: true });
try {
- if (!(await fs.pathExists(tempZip))) {
+ if (!fs.existsSync(tempZip)) {
await downloadFile(downloadURL, tempZip);
}
if (zipFile.endsWith(".zip")) {
const zip = new AdmZip(tempZip);
zip.getEntries().forEach((entry) => {
- console.log(`[DEBUG]: "${name}" entry name`, entry.entryName);
+ log_debug(`"${name}" entry name`, entry.entryName);
});
zip.extractAllTo(tempDir, true);
- await fs.rename(tempExe, sidecarPath);
- console.log(`[INFO]: "${name}" unzip finished`);
+ await fsp.rename(tempExe, sidecarPath);
+ log_success(`unzip finished: "${name}"`);
} else if (zipFile.endsWith(".tgz")) {
// tgz
- await fs.mkdirp(tempDir);
+ await fsp.mkdir(tempDir, { recursive: true });
await tar.extract({
cwd: tempDir,
file: tempZip,
//strip: 1, // 可能需要根据实际的 .tgz 文件结构调整
});
- const files = await fs.readdir(tempDir);
- console.log(`[DEBUG]: "${name}" files in tempDir:`, files);
+ const files = await fsp.readdir(tempDir);
+ log_debug(`"${name}" files in tempDir:`, files);
const extractedFile = files.find((file) => file.startsWith("虚空终端-"));
if (extractedFile) {
const extractedFilePath = path.join(tempDir, extractedFile);
- await fs.rename(extractedFilePath, sidecarPath);
- console.log(`[INFO]: "${name}" file renamed to "${sidecarPath}"`);
+ await fsp.rename(extractedFilePath, sidecarPath);
+ log_success(`"${name}" file renamed to "${sidecarPath}"`);
execSync(`chmod 755 ${sidecarPath}`);
- console.log(`[INFO]: "${name}" chmod binary finished`);
+ log_success(`chmod binary finished: "${name}"`);
} else {
throw new Error(`Expected file not found in ${tempDir}`);
}
@@ -252,16 +255,15 @@ async function resolveSidecar(binInfo) {
const writeStream = fs.createWriteStream(sidecarPath);
await new Promise((resolve, reject) => {
const onError = (error) => {
- console.error(`[ERROR]: "${name}" gz failed:`, error.message);
+ log_error(`"${name}" gz failed:`, error.message);
reject(error);
};
readStream
.pipe(zlib.createGunzip().on("error", onError))
.pipe(writeStream)
.on("finish", () => {
- console.log(`[INFO]: "${name}" gunzip finished`);
execSync(`chmod 755 ${sidecarPath}`);
- console.log(`[INFO]: "${name}" chmod binary finished`);
+ log_success(`chmod binary finished: "${name}"`);
resolve();
})
.on("error", onError);
@@ -269,11 +271,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,12 +288,12 @@ 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`);
+ log_success(`${file} finished`);
}
/**
@@ -316,9 +318,9 @@ async function downloadFile(url, path) {
headers: { "Content-Type": "application/octet-stream" },
});
const buffer = await response.arrayBuffer();
- await fs.writeFile(path, new Uint8Array(buffer));
+ await fsp.writeFile(path, new Uint8Array(buffer));
- console.log(`[INFO]: download finished "${url}"`);
+ log_success(`download finished: ${url}`);
}
// SimpleSC.dll
@@ -334,38 +336,41 @@ 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);
zip.getEntries().forEach((entry) => {
- console.log(`[DEBUG]: "SimpleSC" entry name`, entry.entryName);
+ log_debug(`"SimpleSC" entry name`, entry.entryName);
});
zip.extractAllTo(tempDir, true);
- await fs.copyFile(tempDll, pluginPath);
- console.log(`[INFO]: "SimpleSC" unzip finished`);
+ await fsp.cp(tempDll, pluginPath, { recursive: true, force: true });
+ log_success(`unzip finished: "SimpleSC"`);
} finally {
- await fs.remove(tempDir);
+ await fsp.rm(tempDir, { recursive: true, force: true });
}
};
// service chmod
const resolveServicePermission = async () => {
const serviceExecutables = [
- "clash-verge-service",
- "install-service",
- "uninstall-service",
+ "clash-verge-service*",
+ "install-service*",
+ "uninstall-service*",
];
const resDir = path.join(cwd, "src-tauri/resources");
for (let f of serviceExecutables) {
- const targetPath = path.join(resDir, f);
- if (await fs.pathExists(targetPath)) {
- execSync(`chmod 755 ${targetPath}`);
- console.log(`[INFO]: "${targetPath}" chmod finished`);
+ // 使用glob模块来处理通配符
+ const files = glob.sync(path.join(resDir, f));
+ for (let filePath of files) {
+ if (fs.existsSync(filePath)) {
+ execSync(`chmod 755 ${filePath}`);
+ log_success(`chmod finished: "${filePath}"`);
+ }
}
}
};
@@ -373,29 +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}`,
});
};
@@ -421,6 +429,12 @@ const resolveEnableLoopback = () =>
downloadURL: `https://github.com/Kuingsmile/uwp-tool/releases/download/latest/enableLoopback.exe`,
});
+const resolveWinSysproxy = () =>
+ resolveResource({
+ file: "sysproxy.exe",
+ downloadURL: `https://github.com/clash-verge-rev/sysproxy/releases/download/${arch}/sysproxy.exe`,
+ });
+
const tasks = [
// { name: "clash", func: resolveClash, retry: 5 },
{
@@ -454,6 +468,12 @@ const tasks = [
retry: 1,
unixOnly: true,
},
+ {
+ name: "windows-sysproxy",
+ func: resolveWinSysproxy,
+ retry: 5,
+ winOnly: true,
+ },
];
async function runTask() {
@@ -468,7 +488,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/clash-verge-rev/scripts/portable-fixed-webview2.mjs b/clash-verge-rev/scripts/portable-fixed-webview2.mjs
index 94285ce70c..696c21eaea 100644
--- a/clash-verge-rev/scripts/portable-fixed-webview2.mjs
+++ b/clash-verge-rev/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/clash-verge-rev/scripts/portable.mjs b/clash-verge-rev/scripts/portable.mjs
index 1a9d125883..97a00d4ac9 100644
--- a/clash-verge-rev/scripts/portable.mjs
+++ b/clash-verge-rev/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/clash-verge-rev/scripts/updatelog.mjs b/clash-verge-rev/scripts/updatelog.mjs
index fae7f628f4..914098cb5f 100644
--- a/clash-verge-rev/scripts/updatelog.mjs
+++ b/clash-verge-rev/scripts/updatelog.mjs
@@ -1,4 +1,5 @@
-import fs from "fs-extra";
+import fs from "fs";
+import fsp from "fs/promises";
import path from "path";
const UPDATE_LOG = "UPDATELOG.md";
@@ -12,11 +13,11 @@ export async function resolveUpdateLog(tag) {
const file = path.join(cwd, UPDATE_LOG);
- if (!(await fs.pathExists(file))) {
+ if (!fs.existsSync(file)) {
throw new Error("could not found UPDATELOG.md");
}
- const data = await fs.readFile(file).then((d) => d.toString("utf8"));
+ const data = await fsp.readFile(file, "utf-8");
const map = {};
let p = "";
diff --git a/clash-verge-rev/scripts/utils.mjs b/clash-verge-rev/scripts/utils.mjs
new file mode 100644
index 0000000000..3db9a14e2a
--- /dev/null
+++ b/clash-verge-rev/scripts/utils.mjs
@@ -0,0 +1,11 @@
+import clc from "cli-color";
+
+export const log_success = (msg, ...optionalParams) =>
+ console.log(clc.green(msg), ...optionalParams);
+export const log_error = (msg, ...optionalParams) =>
+ console.log(clc.red(msg), ...optionalParams);
+export const log_info = (msg, ...optionalParams) =>
+ console.log(clc.bgBlue(msg), ...optionalParams);
+var debugMsg = clc.xterm(245);
+export const log_debug = (msg, ...optionalParams) =>
+ console.log(debugMsg(msg), ...optionalParams);
diff --git a/clash-verge-rev/src-tauri/Cargo.lock b/clash-verge-rev/src-tauri/Cargo.lock
index 6c809a3e87..39c76f2d4a 100644
--- a/clash-verge-rev/src-tauri/Cargo.lock
+++ b/clash-verge-rev/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.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
+checksum = "37bf3594c4c988a53154954629820791dde498571819ae4ca50ca811e060cc95"
[[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.81",
+]
+
[[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.81",
]
[[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.81",
]
[[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.81",
]
[[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.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62"
+dependencies = [
+ "arrayvec",
+]
[[package]]
name = "axum"
@@ -448,7 +491,7 @@ dependencies = [
"futures-util",
"http 0.2.12",
"http-body 0.4.6",
- "hyper 0.14.30",
+ "hyper 0.14.31",
"itoa 1.0.11",
"matchit",
"memchr",
@@ -482,17 +525,17 @@ dependencies = [
[[package]]
name = "backtrace"
-version = "0.3.73"
+version = "0.3.74"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a"
+checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
dependencies = [
"addr2line",
- "cc",
"cfg-if",
"libc",
- "miniz_oxide 0.7.4",
+ "miniz_oxide 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"
@@ -582,23 +631,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",
+ "indexmap 2.6.0",
"num-bigint",
- "rustc-hash 1.1.0",
+ "rustc-hash",
]
[[package]]
name = "boa_engine"
-version = "0.18.0"
+version = "0.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "600e4e4a65b26efcef08a7b1cf2899d3845a32e82e067ee3b75eaf7e413ff31c"
+checksum = "06e4559b35b80ceb2e6328481c0eca9a24506663ea33ee1e279be6b5b618b25c"
dependencies = [
"arrayvec",
"bitflags 2.6.0",
@@ -608,26 +657,26 @@ dependencies = [
"boa_macros",
"boa_parser",
"boa_profiler",
+ "boa_string",
"bytemuck",
"cfg-if",
"dashmap",
"fast-float",
"hashbrown 0.14.5",
"icu_normalizer",
- "indexmap 2.5.0",
+ "indexmap 2.6.0",
"intrusive-collections",
- "itertools",
+ "itertools 0.13.0",
"num-bigint",
"num-integer",
"num-traits",
"num_enum",
"once_cell",
- "paste",
"pollster",
"portable-atomic",
"rand 0.8.5",
"regress",
- "rustc-hash 1.1.0",
+ "rustc-hash",
"ryu-js",
"serde",
"serde_json",
@@ -641,49 +690,50 @@ 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",
"hashbrown 0.14.5",
- "indexmap 2.5.0",
+ "indexmap 2.6.0",
"once_cell",
"phf 0.11.2",
- "rustc-hash 1.1.0",
+ "rustc-hash",
"static_assertions",
]
[[package]]
name = "boa_macros"
-version = "0.18.0"
+version = "0.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6be9c93793b60dac381af475b98634d4b451e28336e72218cad9a20176218dbc"
+checksum = "240f4126219a83519bad05c9a40bfc0303921eeb571fc2d7e44c17ffac99d3f1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
"synstructure",
]
[[package]]
name = "boa_parser"
-version = "0.18.0"
+version = "0.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e8592556849f0619ed142ce2b3a19086769314a8d657f93a5765d06dbce4818"
+checksum = "62b59dc05bf1dc019b11478a92986f590cff43fced4d20e866eefb913493e91c"
dependencies = [
"bitflags 2.6.0",
"boa_ast",
@@ -695,14 +745,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"
@@ -725,6 +788,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"
@@ -733,22 +802,22 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
[[package]]
name = "bytemuck"
-version = "1.17.1"
+version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "773d90827bc3feecfb67fab12e24de0749aad83c74b9504ecde46237b5cd24e2"
+checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d"
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.81",
]
[[package]]
@@ -765,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",
]
@@ -841,10 +910,12 @@ dependencies = [
[[package]]
name = "cc"
-version = "1.1.15"
+version = "1.1.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6"
+checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f"
dependencies = [
+ "jobserver",
+ "libc",
"shlex",
]
@@ -933,6 +1004,7 @@ dependencies = [
"tauri",
"tauri-build",
"tauri-plugin-clipboard-manager",
+ "tauri-plugin-deep-link",
"tauri-plugin-devtools",
"tauri-plugin-dialog",
"tauri-plugin-fs",
@@ -942,6 +1014,7 @@ dependencies = [
"tauri-plugin-shell",
"tauri-plugin-updater",
"tokio",
+ "url",
"users",
"warp",
"window-shadows",
@@ -1050,7 +1123,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d"
dependencies = [
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -1062,6 +1135,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"
@@ -1144,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",
]
@@ -1245,7 +1338,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -1255,7 +1348,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f"
dependencies = [
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -1279,7 +1372,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -1290,7 +1383,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
dependencies = [
"darling_core",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -1380,7 +1473,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -1393,7 +1486,7 @@ dependencies = [
"proc-macro2",
"quote",
"rustc_version 0.4.1",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -1404,16 +1497,16 @@ checksum = "3c877555693c14d2f84191cfd3ad8582790fc52b5e2274b40b59cf5f5cea25c7"
[[package]]
name = "devtools-core"
-version = "0.3.4"
+version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f21c374111065b917a9ed5d1e377cd5792cd19f641ee0bf316f72878908bb99"
+checksum = "e78cdd51f6f62ad4eb9b6581d7e238e1779db3144ddbd711388f552e6ed3194b"
dependencies = [
"async-stream",
"bytes",
"devtools-wire-format",
"futures",
"http 0.2.12",
- "hyper 0.14.30",
+ "hyper 0.14.31",
"log",
"prost-types",
"ringbuf",
@@ -1433,9 +1526,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",
@@ -1539,7 +1632,16 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
+]
+
+[[package]]
+name = "dlib"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412"
+dependencies = [
+ "libloading 0.8.5",
]
[[package]]
@@ -1562,9 +1664,24 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
+[[package]]
+name = "dlv-list"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f"
+dependencies = [
+ "const-random",
+]
+
+[[package]]
+name = "downcast-rs"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
+
[[package]]
name = "dpi"
version = "0.1.1"
@@ -1609,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",
@@ -1660,7 +1777,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -1691,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"
@@ -1772,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",
]
@@ -1814,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",
@@ -1833,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",
]
@@ -1846,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"
@@ -1873,7 +1996,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -1909,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",
@@ -1924,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",
@@ -1934,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",
@@ -1951,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"
@@ -1985,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.81",
]
[[package]]
name = "futures-sink"
-version = "0.3.30"
+version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
+checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
[[package]]
name = "futures-task"
-version = "0.3.30"
+version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
+checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
[[package]]
name = "futures-util"
-version = "0.3.30"
+version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
+checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
dependencies = [
"futures-channel",
"futures-core",
@@ -2132,19 +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"
@@ -2199,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"
@@ -2269,7 +2379,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -2290,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",
@@ -2366,7 +2475,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -2381,7 +2490,7 @@ dependencies = [
"futures-sink",
"futures-util",
"http 0.2.12",
- "indexmap 2.5.0",
+ "indexmap 2.6.0",
"slab",
"tokio",
"tokio-util",
@@ -2400,7 +2509,7 @@ dependencies = [
"futures-core",
"futures-sink",
"http 1.1.0",
- "indexmap 2.5.0",
+ "indexmap 2.6.0",
"slab",
"tokio",
"tokio-util",
@@ -2447,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"
@@ -2594,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"
@@ -2612,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",
@@ -2636,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",
@@ -2656,13 +2776,13 @@ dependencies = [
[[package]]
name = "hyper-rustls"
-version = "0.27.2"
+version = "0.27.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155"
+checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333"
dependencies = [
"futures-util",
"http 1.1.0",
- "hyper 1.4.1",
+ "hyper 1.5.0",
"hyper-util",
"rustls",
"rustls-pki-types",
@@ -2678,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",
@@ -2692,7 +2812,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0"
dependencies = [
"bytes",
"http-body-util",
- "hyper 1.4.1",
+ "hyper 1.5.0",
"hyper-util",
"native-tls",
"tokio",
@@ -2702,29 +2822,28 @@ 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",
"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",
- "tower",
"tower-service",
"tracing",
]
[[package]]
name = "iana-time-zone"
-version = "0.1.60"
+version = "0.1.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
dependencies = [
"android_system_properties",
"core-foundation-sys",
@@ -2755,9 +2874,9 @@ dependencies = [
[[package]]
name = "icu_collections"
-version = "1.4.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "137d96353afc8544d437e8a99eceb10ab291352699573b0de5b08bda38c78c60"
+checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526"
dependencies = [
"displaydoc",
"yoke",
@@ -2767,9 +2886,9 @@ dependencies = [
[[package]]
name = "icu_locid"
-version = "1.4.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c0aa2536adc14c07e2a521e95512b75ed8ef832f0fdf9299d4a0a45d2be2a9d"
+checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637"
dependencies = [
"displaydoc",
"litemap",
@@ -2780,9 +2899,9 @@ dependencies = [
[[package]]
name = "icu_locid_transform"
-version = "1.4.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57c17d8f6524fdca4471101dd71f0a132eb6382b5d6d7f2970441cb25f6f435a"
+checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e"
dependencies = [
"displaydoc",
"icu_locid",
@@ -2794,15 +2913,15 @@ dependencies = [
[[package]]
name = "icu_locid_transform_data"
-version = "1.4.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "545c6c3e8bf9580e2dafee8de6f9ec14826aaf359787789c7724f1f85f47d3dc"
+checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e"
[[package]]
name = "icu_normalizer"
-version = "1.4.3"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "accb85c5b2e76f8dade22978b3795ae1e550198c6cfc7e915144e17cd6e2ab56"
+checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f"
dependencies = [
"displaydoc",
"icu_collections",
@@ -2818,15 +2937,15 @@ dependencies = [
[[package]]
name = "icu_normalizer_data"
-version = "1.4.1"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3744fecc0df9ce19999cdaf1f9f3a48c253431ce1d67ef499128fe9d0b607ab"
+checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516"
[[package]]
name = "icu_properties"
-version = "1.4.3"
+version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db9e559598096627aeca8cdfb98138a70eb4078025f8d1d5f2416a361241f756"
+checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5"
dependencies = [
"displaydoc",
"icu_collections",
@@ -2839,15 +2958,15 @@ dependencies = [
[[package]]
name = "icu_properties_data"
-version = "1.4.1"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e70a8b51ee5dd4ff8f20ee9b1dd1bc07afc110886a3747b1fec04cc6e5a15815"
+checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569"
[[package]]
name = "icu_provider"
-version = "1.4.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba58e782287eb6950247abbf11719f83f5d4e4a5c1f2cd490d30a334bc47c2f4"
+checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9"
dependencies = [
"displaydoc",
"icu_locid",
@@ -2862,13 +2981,13 @@ dependencies = [
[[package]]
name = "icu_provider_macros"
-version = "1.4.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2abdd3a62551e8337af119c5899e600ca0c88ec8f23a46c60ba216c803dcf1a"
+checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -2889,35 +3008,43 @@ dependencies = [
[[package]]
name = "image"
-version = "0.24.9"
+version = "0.25.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d"
-dependencies = [
- "bytemuck",
- "byteorder",
- "color_quant",
- "exr",
- "gif",
- "jpeg-decoder",
- "num-traits",
- "png",
- "qoi",
- "tiff",
-]
-
-[[package]]
-name = "image"
-version = "0.25.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10"
+checksum = "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"
@@ -2931,20 +3058,20 @@ 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"
+version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb33622da908807a06f9513c19b3c1ad50fab3e4137d82a78107d502075aa199"
+checksum = "bc150e5ce2330295b8616ce0e3f53250e53af31759a9dbedad1621ba29151847"
dependencies = [
"cfb",
]
@@ -2975,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.81",
+]
+
+[[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",
]
@@ -2996,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"
@@ -3039,6 +3177,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"
@@ -3096,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",
]
@@ -3193,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.161"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
+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"
@@ -3213,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"
@@ -3308,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]]
@@ -3339,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",
@@ -3394,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"
@@ -3459,7 +3636,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08"
dependencies = [
"adler",
- "simd-adler32",
]
[[package]]
@@ -3469,6 +3645,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1"
dependencies = [
"adler2",
+ "simd-adler32",
]
[[package]]
@@ -3485,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",
@@ -3672,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",
@@ -3731,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.81",
+]
+
[[package]]
name = "num-integer"
version = "0.1.46"
@@ -3740,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"
@@ -3767,7 +3973,7 @@ dependencies = [
"proc-macro-crate 2.0.2",
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -3786,7 +3992,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
dependencies = [
"malloc_buf",
- "objc_exception",
]
[[package]]
@@ -3805,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"
@@ -3832,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"
@@ -3856,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"
@@ -3875,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"
@@ -3901,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]]
@@ -3920,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"
@@ -3952,9 +4267,9 @@ dependencies = [
[[package]]
name = "openssl"
-version = "0.10.66"
+version = "0.10.68"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1"
+checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5"
dependencies = [
"bitflags 2.6.0",
"cfg-if",
@@ -3973,7 +4288,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -3984,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",
@@ -4009,6 +4324,16 @@ dependencies = [
"num-traits",
]
+[[package]]
+name = "ordered-multimap"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79"
+dependencies = [
+ "dlv-list",
+ "hashbrown 0.14.5",
+]
+
[[package]]
name = "ordered-stream"
version = "0.2.0"
@@ -4062,9 +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"
@@ -4097,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"
@@ -4119,9 +4444,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
[[package]]
name = "pest"
-version = "2.7.11"
+version = "2.7.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95"
+checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442"
dependencies = [
"memchr",
"thiserror",
@@ -4130,9 +4455,9 @@ dependencies = [
[[package]]
name = "pest_derive"
-version = "2.7.11"
+version = "2.7.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a548d2beca6773b1c244554d36fcf8548a8a58e74156968211567250e48e49a"
+checksum = "d214365f632b123a47fd913301e14c946c61d1c183ee245fa76eb752e59a02dd"
dependencies = [
"pest",
"pest_generator",
@@ -4140,22 +4465,22 @@ dependencies = [
[[package]]
name = "pest_generator"
-version = "2.7.11"
+version = "2.7.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c93a82e8d145725dcbaf44e5ea887c8a869efdcc28706df2d08c69e17077183"
+checksum = "eb55586734301717aea2ac313f50b2eb8f60d2fc3dc01d190eefa2e625f60c4e"
dependencies = [
"pest",
"pest_meta",
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
name = "pest_meta"
-version = "2.7.11"
+version = "2.7.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f"
+checksum = "b75da2a70cf4d9cb76833c990ac9cd3923c9a8905a8929789ce347c84564d03d"
dependencies = [
"once_cell",
"pest",
@@ -4276,7 +4601,7 @@ dependencies = [
"phf_shared 0.11.2",
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -4308,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.81",
]
[[package]]
@@ -4351,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"
@@ -4362,7 +4687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016"
dependencies = [
"base64 0.22.1",
- "indexmap 2.5.0",
+ "indexmap 2.6.0",
"quick-xml 0.32.0",
"serde",
"time",
@@ -4370,15 +4695,15 @@ dependencies = [
[[package]]
name = "png"
-version = "0.17.13"
+version = "0.17.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1"
+checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0"
dependencies = [
"bitflags 1.3.2",
"crc32fast",
"fdeflate",
"flate2",
- "miniz_oxide 0.7.4",
+ "miniz_oxide 0.8.0",
]
[[package]]
@@ -4407,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",
]
@@ -4426,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"
@@ -4503,13 +4828,32 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
[[package]]
name = "proc-macro2"
-version = "1.0.86"
+version = "1.0.88"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
+checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9"
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.81",
+]
+
[[package]]
name = "prost"
version = "0.12.6"
@@ -4527,10 +4871,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1"
dependencies = [
"anyhow",
- "itertools",
+ "itertools 0.12.1",
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -4576,16 +4920,25 @@ 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",
"quinn-proto",
"quinn-udp",
- "rustc-hash 2.0.0",
+ "rustc-hash",
"rustls",
"socket2 0.5.7",
"thiserror",
@@ -4595,14 +4948,14 @@ 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",
"ring",
- "rustc-hash 2.0.0",
+ "rustc-hash",
"rustls",
"slab",
"thiserror",
@@ -4612,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]]
@@ -4713,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.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"
@@ -4747,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",
]
@@ -4767,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]]
@@ -4788,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]]
@@ -4805,15 +5207,15 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]]
name = "regex-syntax"
-version = "0.8.4"
+version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
+checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "regress"
-version = "0.9.1"
+version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0eae2a1ebfecc58aff952ef8ccd364329abe627762f5bf09ff42eb9d98522479"
+checksum = "1541daf4e4ed43a0922b7969bdc2170178bcacc5dabf7e39bc508a9fa3953a7a"
dependencies = [
"hashbrown 0.14.5",
"memchr",
@@ -4821,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",
@@ -4834,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",
@@ -4866,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",
@@ -4893,6 +5294,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"
@@ -4910,11 +5317,12 @@ dependencies = [
[[package]]
name = "ringbuf"
-version = "0.4.4"
+version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46f7f1b88601a8ee13cabf203611ccdf64345dc1c5d24de8b11e1a678ee619b6"
+checksum = "726bb493fe9cac765e8f96a144c3a8396bdf766dedad22e504b70b908dcbceb4"
dependencies = [
"crossbeam-utils",
+ "portable-atomic",
]
[[package]]
@@ -4935,18 +5343,23 @@ dependencies = [
"windows-sys 0.48.0",
]
+[[package]]
+name = "rust-ini"
+version = "0.21.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e310ef0e1b6eeb79169a1171daf9abcb87a2e17c03bee2c4bb100b55c75409f"
+dependencies = [
+ "cfg-if",
+ "ordered-multimap",
+ "trim-in-place",
+]
+
[[package]]
name = "rustc-demangle"
version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
-[[package]]
-name = "rustc-hash"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
-
[[package]]
name = "rustc-hash"
version = "2.0.0"
@@ -4987,9 +5400,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",
@@ -5000,9 +5413,9 @@ dependencies = [
[[package]]
name = "rustls"
-version = "0.23.12"
+version = "0.23.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044"
+checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993"
dependencies = [
"once_cell",
"ring",
@@ -5014,25 +5427,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.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0"
+checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b"
[[package]]
name = "rustls-webpki"
-version = "0.102.7"
+version = "0.102.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84678086bd54edf2b415183ed7a94d0efb049f1b646a33e22a36f3794be6ae56"
+checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9"
dependencies = [
"ring",
"rustls-pki-types",
@@ -5041,9 +5453,9 @@ dependencies = [
[[package]]
name = "rustversion"
-version = "1.0.17"
+version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6"
+checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248"
[[package]]
name = "ryu"
@@ -5068,11 +5480,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]]
@@ -5087,6 +5499,7 @@ dependencies = [
"serde",
"serde_json",
"url",
+ "uuid",
]
[[package]]
@@ -5098,7 +5511,7 @@ dependencies = [
"proc-macro2",
"quote",
"serde_derive_internals",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -5128,9 +5541,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",
@@ -5200,9 +5613,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",
]
@@ -5230,13 +5643,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.81",
]
[[package]]
@@ -5247,14 +5660,14 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
name = "serde_json"
-version = "1.0.127"
+version = "1.0.132"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad"
+checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03"
dependencies = [
"itoa 1.0.11",
"memchr",
@@ -5270,14 +5683,14 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
name = "serde_spanned"
-version = "0.6.7"
+version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d"
+checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
dependencies = [
"serde",
]
@@ -5296,15 +5709,15 @@ dependencies = [
[[package]]
name = "serde_with"
-version = "3.9.0"
+version = "3.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857"
+checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817"
dependencies = [
"base64 0.22.1",
"chrono",
"hex",
"indexmap 1.9.3",
- "indexmap 2.5.0",
+ "indexmap 2.6.0",
"serde",
"serde_derive",
"serde_json",
@@ -5314,14 +5727,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.81",
]
[[package]]
@@ -5330,7 +5743,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",
@@ -5464,6 +5877,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"
@@ -5524,25 +5946,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]]
@@ -5592,15 +6013,6 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
-[[package]]
-name = "state"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8"
-dependencies = [
- "loom",
-]
-
[[package]]
name = "static_assertions"
version = "1.1.0"
@@ -5669,9 +6081,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.77"
+version = "2.0.81"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed"
+checksum = "198514704ca887dd5a1e408c6c6cdcba43672f9b4062e1b24aa34e74e6d7faae"
dependencies = [
"proc-macro2",
"quote",
@@ -5701,28 +6113,27 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[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.57.0",
]
[[package]]
name = "sysproxy"
version = "0.3.0"
-source = "git+https://github.com/zzzgydi/sysproxy-rs?branch=main#45fffb0cdddb7c2d0ce30300dd72a934bb458c09"
+source = "git+https://github.com/clash-verge-rev/sysproxy-rs?branch=main#b18d75d31976efc26cd7b70e07b877e406b5133e"
dependencies = [
"interfaces",
"iptools",
@@ -5769,9 +6180,9 @@ dependencies = [
[[package]]
name = "tao"
-version = "0.29.1"
+version = "0.30.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3a97abbc7d6cfd0720da3e06fcb1cf2ac87cbfdb5bbbce103a1279a211c4d81"
+checksum = "a0dbbebe82d02044dfa481adca1550d6dd7bd16e086bc34fa0fbecceb5a63751"
dependencies = [
"bitflags 2.6.0",
"cocoa 0.26.0",
@@ -5814,7 +6225,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -5825,9 +6236,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",
@@ -5842,13 +6253,12 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
[[package]]
name = "tauri"
-version = "2.0.0-rc.8"
+version = "2.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8345ccc676ef16e26b61fc0f5340b4e770678b1e1f53f08c69ebdac5e56b422"
+checksum = "5ce2818e803ce3097987296623ed8c0d9f65ed93b4137ff9a83e168bdbf62932"
dependencies = [
"anyhow",
"bytes",
- "cocoa 0.26.0",
"dirs 5.0.1",
"dunce",
"embed_plist",
@@ -5859,21 +6269,23 @@ dependencies = [
"heck 0.5.0",
"http 1.1.0",
"http-range",
- "image 0.24.9",
+ "image",
"jni",
"libc",
"log",
"mime",
"muda",
- "objc",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
"percent-encoding",
+ "plist",
"raw-window-handle 0.6.2",
"reqwest",
"serde",
"serde_json",
"serde_repr",
"serialize-to-javascript",
- "state",
"swift-rs",
"tauri-build",
"tauri-macros",
@@ -5894,9 +6306,9 @@ dependencies = [
[[package]]
name = "tauri-build"
-version = "2.0.0-rc.7"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d5ad5fcfaf02cf79aa6727f6c5df38567d8dce172b00b62690c6bc46c08b7ce"
+checksum = "935f9b3c49b22b3e2e485a57f46d61cd1ae07b1cbb2ba87387a387caf2d8c4e7"
dependencies = [
"anyhow",
"cargo_toml",
@@ -5916,9 +6328,9 @@ dependencies = [
[[package]]
name = "tauri-codegen"
-version = "2.0.0-rc.7"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "809ef6316726fc72593d296cf6f4e7461326e310c313d6a6c42b6e7f1e2671cf"
+checksum = "95d7443dd4f0b597704b6a14b964ee2ed16e99928d8e6292ae9825f09fbcd30e"
dependencies = [
"base64 0.22.1",
"brotli",
@@ -5932,7 +6344,7 @@ dependencies = [
"serde",
"serde_json",
"sha2 0.10.8",
- "syn 2.0.77",
+ "syn 2.0.81",
"tauri-utils",
"thiserror",
"time",
@@ -5943,23 +6355,23 @@ dependencies = [
[[package]]
name = "tauri-macros"
-version = "2.0.0-rc.6"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1359e8861d210d25731f8b1bfbb4d111dd06406cf73c59659366ef450364d811"
+checksum = "4d2c0963ccfc3f5194415f2cce7acc975942a8797fbabfb0aa1ed6f59326ae7f"
dependencies = [
"heck 0.5.0",
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
"tauri-codegen",
"tauri-utils",
]
[[package]]
name = "tauri-plugin"
-version = "2.0.0-rc.7"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7dded420c86183f592d0fe925ef9447f41e26fa79f0bdfef8d3f17bfbcdbfb7"
+checksum = "b2e6660a409963e4d57b9bfab4addd141eeff41bd3a7fb14e13004a832cf7ef6"
dependencies = [
"anyhow",
"glob",
@@ -5974,12 +6386,12 @@ dependencies = [
[[package]]
name = "tauri-plugin-clipboard-manager"
-version = "2.1.0-beta.7"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "becbc5a692e842f8d6a7ab5e490c3c36d267b5c3d5bf4b6a0cdd039d7df25569"
+checksum = "78b7d556886c15849198c0948fd7f4c880492f0461539176da0a8a70272e2904"
dependencies = [
"arboard",
- "image 0.24.9",
+ "image",
"log",
"serde",
"serde_json",
@@ -5989,14 +6401,34 @@ dependencies = [
]
[[package]]
-name = "tauri-plugin-devtools"
-version = "2.0.0-rc.0"
+name = "tauri-plugin-deep-link"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f7333811c0b81f32e980d34894effc92454f464409fb97a7e566294b7ebddd0"
+checksum = "31a9b5725027c6e9e075b06cb2d5c2cd3b5c29daa8012b404e1ff755cc56082f"
+dependencies = [
+ "dunce",
+ "log",
+ "rust-ini",
+ "serde",
+ "serde_json",
+ "tauri",
+ "tauri-plugin",
+ "tauri-utils",
+ "thiserror",
+ "url",
+ "windows-registry 0.3.0",
+ "windows-result 0.2.0",
+]
+
+[[package]]
+name = "tauri-plugin-devtools"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e5cd17faa36a826e5686bd0fda5bc3f4c903682263f00cd50f2f778fc4bb866"
dependencies = [
"async-stream",
"bytes",
- "cocoa 0.25.0",
+ "cocoa 0.26.0",
"colored",
"devtools-core",
"futures",
@@ -6017,11 +6449,10 @@ dependencies = [
[[package]]
name = "tauri-plugin-dialog"
-version = "2.0.0-rc.3"
+version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa8bd381f75c47687f41fb603f67fdd99a1af377da22d03d8fb959d2481845c1"
+checksum = "6ff33d09331cc22bf4771a2633b62afc1038e36273eef22bff12f53d33decd91"
dependencies = [
- "dunce",
"log",
"raw-window-handle 0.6.2",
"rfd",
@@ -6036,12 +6467,14 @@ dependencies = [
[[package]]
name = "tauri-plugin-fs"
-version = "2.0.0-rc.1"
+version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "694a746b0e0c1d318198fabf4957800c42fb4b705e866e0eed7ec21476ef88db"
+checksum = "16d0816b27207c29aaff632c73b702785140cf16fe6150c201a2720245b8ea88"
dependencies = [
"anyhow",
+ "dunce",
"glob",
+ "percent-encoding",
"schemars",
"serde",
"serde_json",
@@ -6055,9 +6488,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",
@@ -6070,9 +6503,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-notification"
-version = "2.0.0-rc.3"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6bf32fba3a2650f89c7dfc532b38de566a37779e482f07dccabf45fe24444e26"
+checksum = "ef492a2d19b6376bb4c9e0c4fab3f3bf8a220ea112d24f35027b737ff55de20c"
dependencies = [
"log",
"notify-rust",
@@ -6089,9 +6522,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-process"
-version = "2.0.0-rc.1"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c9eb80b601682dcbd45dc5ed5f7cc214f1d994aeea730d500899cc616784559"
+checksum = "ae06a00087c148962a52814a2d7265b1a0505bced5ffb74f8c284a5f96a4d03d"
dependencies = [
"tauri",
"tauri-plugin",
@@ -6099,9 +6532,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-shell"
-version = "2.0.0-rc.3"
+version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e83800ddf78b820172efb5ed7310344e8e4f97fd30cd8237a3f20c12a79eb136"
+checksum = "0ad7880c5586b6b2104be451e3d7fc0f3800c84bda69e9ba81c828f87cb34267"
dependencies = [
"encoding_rs",
"log",
@@ -6120,9 +6553,9 @@ 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",
@@ -6131,6 +6564,7 @@ dependencies = [
"http 1.1.0",
"infer",
"minisign-verify",
+ "percent-encoding",
"reqwest",
"semver 1.0.23",
"serde",
@@ -6149,9 +6583,9 @@ dependencies = [
[[package]]
name = "tauri-runtime"
-version = "2.0.0-rc.7"
+version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75c72b844f387bfc3341c355f3e16b8cbf4161848fa4e348670effb222cd3ba5"
+checksum = "c8f437293d6f5e5dce829250f4dbdce4e0b52905e297a6689cc2963eb53ac728"
dependencies = [
"dpi",
"gtk",
@@ -6168,15 +6602,17 @@ dependencies = [
[[package]]
name = "tauri-runtime-wry"
-version = "2.0.0-rc.7"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73accf936a7cd01d1382de7850726fdf6c1f6ab3b01ccb7a0950cb852e332596"
+checksum = "1431602bcc71f2f840ad623915c9842ecc32999b867c4a787d975a17a9625cc6"
dependencies = [
- "cocoa 0.26.0",
"gtk",
"http 1.1.0",
"jni",
"log",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
"percent-encoding",
"raw-window-handle 0.6.2",
"softbuffer",
@@ -6193,9 +6629,9 @@ dependencies = [
[[package]]
name = "tauri-utils"
-version = "2.0.0-rc.7"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d53d9fe87e985b273696ae22ce2b9f099a8f1b44bc8fb127467bda5fcb3e4371"
+checksum = "c38b0230d6880cf6dd07b6d7dd7789a0869f98ac12146e0d18d1c1049215a045"
dependencies = [
"brotli",
"cargo_metadata",
@@ -6223,6 +6659,7 @@ dependencies = [
"toml 0.8.2",
"url",
"urlpattern",
+ "uuid",
"walkdir",
]
@@ -6249,14 +6686,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",
]
@@ -6309,7 +6746,7 @@ dependencies = [
"libc",
"log",
"memmem",
- "num-derive",
+ "num-derive 0.3.3",
"num-traits",
"ordered-float",
"regex",
@@ -6339,22 +6776,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.81",
]
[[package]]
@@ -6422,6 +6859,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"
@@ -6484,7 +6930,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -6510,9 +6956,9 @@ dependencies = [
[[package]]
name = "tokio-stream"
-version = "0.1.15"
+version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af"
+checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1"
dependencies = [
"futures-core",
"pin-project-lite",
@@ -6533,9 +6979,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",
@@ -6583,7 +7029,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",
@@ -6596,7 +7042,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",
@@ -6617,7 +7063,7 @@ dependencies = [
"h2 0.3.26",
"http 0.2.12",
"http-body 0.4.6",
- "hyper 0.14.30",
+ "hyper 0.14.31",
"hyper-timeout",
"percent-encoding",
"pin-project",
@@ -6653,7 +7099,7 @@ dependencies = [
"bytes",
"http 0.2.12",
"http-body 0.4.6",
- "hyper 0.14.30",
+ "hyper 0.14.31",
"pin-project",
"tokio-stream",
"tonic",
@@ -6733,7 +7179,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -6777,9 +7223,9 @@ dependencies = [
[[package]]
name = "tray-icon"
-version = "0.16.0"
+version = "0.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "131a65b2cef2081bc14dbcd414c906edbfa3bb5323dd7e748cc298614681196b"
+checksum = "7c92af36a182b46206723bdf8a7942e20838cde1cf062e5b97854d57eb01763b"
dependencies = [
"core-graphics 0.24.0",
"crossbeam-channel",
@@ -6796,6 +7242,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"
@@ -6844,9 +7296,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
[[package]]
name = "ucd-trie"
-version = "0.1.6"
+version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9"
+checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
[[package]]
name = "uds_windows"
@@ -6902,39 +7354,36 @@ 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"
-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"
@@ -6971,11 +7420,10 @@ dependencies = [
[[package]]
name = "urlpattern"
-version = "0.2.0"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9bd5ff03aea02fa45b13a7980151fe45009af1980ba69f651ec367121a31609"
+checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d"
dependencies = [
- "derive_more",
"regex",
"serde",
"unic-ucd-ident",
@@ -7018,11 +7466,23 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "uuid"
-version = "1.10.0"
+version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314"
+checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a"
dependencies = [
"getrandom 0.2.15",
+ "serde",
+]
+
+[[package]]
+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]]
@@ -7114,7 +7574,7 @@ dependencies = [
"futures-util",
"headers",
"http 0.2.12",
- "hyper 0.14.30",
+ "hyper 0.14.31",
"log",
"mime",
"mime_guess",
@@ -7146,9 +7606,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
-version = "0.2.93"
+version = "0.2.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5"
+checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e"
dependencies = [
"cfg-if",
"once_cell",
@@ -7157,24 +7617,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.81",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.43"
+version = "0.4.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed"
+checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b"
dependencies = [
"cfg-if",
"js-sys",
@@ -7184,9 +7644,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.93"
+version = "0.2.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf"
+checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -7194,28 +7654,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.81",
"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",
@@ -7225,10 +7685,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",
@@ -7280,9 +7800,9 @@ dependencies = [
[[package]]
name = "webpki-roots"
-version = "0.26.5"
+version = "0.26.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bd24728e5af82c6c4ec1b66ac4844bdf8156257fccda846ec58b42cd0cdbe6a"
+checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958"
dependencies = [
"rustls-pki-types",
]
@@ -7309,7 +7829,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -7338,7 +7858,7 @@ dependencies = [
"either",
"home",
"once_cell",
- "rustix 0.38.35",
+ "rustix 0.38.37",
]
[[package]]
@@ -7386,36 +7906,18 @@ dependencies = [
[[package]]
name = "window-vibrancy"
-version = "0.5.1"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8cdd6999298d969289d8078dae02ce798ad23452075985cccba8b6326711ecf"
+checksum = "3ea403deff7b51fff19e261330f71608ff2cdef5721d72b64180bb95be7c4150"
dependencies = [
- "cocoa 0.26.0",
- "objc",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
"raw-window-handle 0.6.2",
"windows-sys 0.59.0",
"windows-version",
]
-[[package]]
-name = "windows"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
-dependencies = [
- "windows-targets 0.48.5",
-]
-
-[[package]]
-name = "windows"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
-dependencies = [
- "windows-core 0.52.0",
- "windows-targets 0.52.6",
-]
-
[[package]]
name = "windows"
version = "0.56.0"
@@ -7426,6 +7928,16 @@ dependencies = [
"windows-targets 0.52.6",
]
+[[package]]
+name = "windows"
+version = "0.57.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143"
+dependencies = [
+ "windows-core 0.57.0",
+ "windows-targets 0.52.6",
+]
+
[[package]]
name = "windows"
version = "0.58.0"
@@ -7457,6 +7969,18 @@ dependencies = [
"windows-targets 0.52.6",
]
+[[package]]
+name = "windows-core"
+version = "0.57.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d"
+dependencies = [
+ "windows-implement 0.57.0",
+ "windows-interface 0.57.0",
+ "windows-result 0.1.2",
+ "windows-targets 0.52.6",
+]
+
[[package]]
name = "windows-core"
version = "0.58.0"
@@ -7466,7 +7990,7 @@ dependencies = [
"windows-implement 0.58.0",
"windows-interface 0.58.0",
"windows-result 0.2.0",
- "windows-strings",
+ "windows-strings 0.1.0",
"windows-targets 0.52.6",
]
@@ -7478,7 +8002,18 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
+]
+
+[[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.81",
]
[[package]]
@@ -7489,7 +8024,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -7500,7 +8035,18 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
+]
+
+[[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.81",
]
[[package]]
@@ -7511,7 +8057,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -7521,7 +8067,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0"
dependencies = [
"windows-result 0.2.0",
- "windows-strings",
+ "windows-strings 0.1.0",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-registry"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bafa604f2104cf5ae2cc2db1dee84b7e6a5d11b05f737b60def0ffdc398cbc0a"
+dependencies = [
+ "windows-result 0.2.0",
+ "windows-strings 0.2.0",
"windows-targets 0.52.6",
]
@@ -7553,6 +8110,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"
@@ -7818,14 +8384,12 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
[[package]]
name = "wry"
-version = "0.42.0"
+version = "0.46.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49b8049c8f239cdbfaaea4bacb9646f6b208938ceec0acd5b3e99cd05f70903f"
+checksum = "6fa1c8c760041c64ce6be99f83d6cb55fe3fcd85a1ad46d32895f6e65cee87ba"
dependencies = [
"base64 0.22.1",
- "block",
- "cocoa 0.26.0",
- "core-graphics 0.24.0",
+ "block2",
"crossbeam-channel",
"dpi",
"dunce",
@@ -7838,8 +8402,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",
@@ -7885,7 +8452,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",
]
@@ -7903,7 +8470,7 @@ checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f"
dependencies = [
"libc",
"linux-raw-sys 0.4.14",
- "rustix 0.38.35",
+ "rustix 0.38.37",
]
[[package]]
@@ -7942,7 +8509,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
"synstructure",
]
@@ -7957,7 +8524,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",
@@ -8029,7 +8596,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -8049,7 +8616,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
"synstructure",
]
@@ -8078,7 +8645,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.77",
+ "syn 2.0.81",
]
[[package]]
@@ -8091,11 +8658,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"
@@ -8105,6 +8678,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"
diff --git a/clash-verge-rev/src-tauri/Cargo.toml b/clash-verge-rev/src-tauri/Cargo.toml
old mode 100644
new mode 100755
index f39a2a4dfc..00b6da9860
--- a/clash-verge-rev/src-tauri/Cargo.toml
+++ b/clash-verge-rev/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"
@@ -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",
@@ -45,17 +45,21 @@ tauri = { version = "2.0.0-rc", features = [
"image-png",
] }
network-interface = { version = "2.0.0", features = ["serde"] }
-tauri-plugin-shell = "2.0.0-rc"
-tauri-plugin-dialog = "2.0.0-rc"
-tauri-plugin-fs = "2.0.0-rc"
-tauri-plugin-notification = "2.0.0-rc"
-tauri-plugin-process = "2.0.0-rc"
-tauri-plugin-clipboard-manager = "2.1.0-beta.7"
+tauri-plugin-shell = "2.0.2"
+tauri-plugin-dialog = "2.0.2"
+tauri-plugin-fs = "2.0.2"
+tauri-plugin-notification = "2.0.1"
+tauri-plugin-process = "2.0.1"
+tauri-plugin-clipboard-manager = "2.0.1"
+tauri-plugin-deep-link = "2.0.1"
tauri-plugin-devtools = "2.0.0-rc"
+url = "2.5.2"
[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"
@@ -79,3 +83,7 @@ strip = true
[profile.dev]
incremental = true
+
+[lib]
+name = "app_lib"
+crate-type = ["staticlib", "cdylib", "rlib"]
diff --git a/clash-verge-rev/src-tauri/Info.plist b/clash-verge-rev/src-tauri/Info.plist
deleted file mode 100644
index 954d43a9c9..0000000000
--- a/clash-verge-rev/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/clash-verge-rev/src-tauri/capabilities/desktop.json b/clash-verge-rev/src-tauri/capabilities/desktop.json
old mode 100644
new mode 100755
index c4936c0d7e..fbb332b0eb
--- a/clash-verge-rev/src-tauri/capabilities/desktop.json
+++ b/clash-verge-rev/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/clash-verge-rev/src-tauri/capabilities/migrated.json b/clash-verge-rev/src-tauri/capabilities/migrated.json
index f707b9d649..7cce56b504 100644
--- a/clash-verge-rev/src-tauri/capabilities/migrated.json
+++ b/clash-verge-rev/src-tauri/capabilities/migrated.json
@@ -11,6 +11,11 @@
"identifier": "fs:scope",
"allow": ["$APPDATA/**", "$RESOURCE/../**", "**"]
},
+ "fs:allow-write-file",
+ {
+ "identifier": "fs:scope",
+ "allow": ["$APPDATA/**", "$RESOURCE/../**", "**"]
+ },
"core:window:allow-create",
"core:window:allow-center",
"core:window:allow-request-user-attention",
@@ -43,6 +48,13 @@
"core:window:allow-set-cursor-position",
"core:window:allow-set-ignore-cursor-events",
"core:window:allow-start-dragging",
+ "core:window:allow-maximize",
+ "core:window:allow-toggle-maximize",
+ "core:window:allow-unmaximize",
+ "core:window:allow-minimize",
+ "core:window:allow-unminimize",
+ "core:window:allow-set-maximizable",
+ "core:window:allow-set-minimizable",
"core:webview:allow-print",
"shell:allow-execute",
"shell:allow-open",
diff --git a/clash-verge-rev/src-tauri/src/cmds.rs b/clash-verge-rev/src-tauri/src/cmds.rs
index a560fd8041..a2c7cb8ac5 100644
--- a/clash-verge-rev/src-tauri/src/cmds.rs
+++ b/clash-verge-rev/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};
@@ -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(())
}
@@ -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
@@ -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]
@@ -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(Some(0));
}
pub mod service {
@@ -386,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/clash-verge-rev/src-tauri/src/config/clash.rs b/clash-verge-rev/src-tauri/src/config/clash.rs
index e1d4aa3ed5..8054ccae8b 100644
--- a/clash-verge-rev/src-tauri/src/config/clash.rs
+++ b/clash-verge-rev/src-tauri/src/config/clash.rs
@@ -32,13 +32,12 @@ impl IClashTemp {
pub fn template() -> Self {
let mut map = Mapping::new();
let mut tun = Mapping::new();
+ tun.insert("enable".into(), false.into());
tun.insert("stack".into(), "gvisor".into());
- tun.insert("device".into(), "Mihomo".into());
tun.insert("auto-route".into(), true.into());
tun.insert("strict-route".into(), false.into());
tun.insert("auto-detect-interface".into(), true.into());
tun.insert("dns-hijack".into(), vec!["any:53"].into());
- tun.insert("mtu".into(), 1500.into());
#[cfg(not(target_os = "windows"))]
map.insert("redir-port".into(), 7895.into());
#[cfg(target_os = "linux")]
@@ -50,9 +49,12 @@ impl IClashTemp {
map.insert("allow-lan".into(), false.into());
map.insert("mode".into(), "rule".into());
map.insert("external-controller".into(), "127.0.0.1:9097".into());
+ let mut cors_map = Mapping::new();
+ cors_map.insert("allow-private-network".into(), true.into());
+ cors_map.insert("allow-origins".into(), vec!["*"].into());
map.insert("secret".into(), "".into());
map.insert("tun".into(), tun.into());
-
+ map.insert("external-controller-cors".into(), cors_map.into());
Self(map)
}
diff --git a/clash-verge-rev/src-tauri/src/config/verge.rs b/clash-verge-rev/src-tauri/src/config/verge.rs
index 6086b8cea7..3f9888315d 100644
--- a/clash-verge-rev/src-tauri/src/config/verge.rs
+++ b/clash-verge-rev/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,
@@ -59,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,
@@ -282,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);
@@ -330,11 +322,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/clash-verge-rev/src-tauri/src/core/clash_api.rs b/clash-verge-rev/src-tauri/src/core/clash_api.rs
index 67fc112de0..4a21fa2810 100644
--- a/clash-verge-rev/src-tauri/src/core/clash_api.rs
+++ b/clash-verge-rev/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 {}'"
@@ -135,12 +135,8 @@ fn test_parse_check_output() {
"#;
let res1 = parse_check_output(str1.into());
- let res2 = parse_check_output(str2.into());
+ // let res2 = parse_check_output(str2.into());
let res3 = parse_check_output(str3.into());
- println!("res1: {res1}");
- println!("res2: {res2}");
- println!("res3: {res3}");
-
assert_eq!(res1, res3);
}
diff --git a/clash-verge-rev/src-tauri/src/core/core.rs b/clash-verge-rev/src-tauri/src/core/core.rs
index 09d127022f..ea02df957e 100644
--- a/clash-verge-rev/src-tauri/src/core/core.rs
+++ b/clash-verge-rev/src-tauri/src/core/core.rs
@@ -2,46 +2,32 @@ 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 sysinfo::{ProcessRefreshKind, RefreshKind, System};
-use tauri::AppHandle;
-use tauri_plugin_shell::process::{CommandChild, CommandEvent};
+use std::{sync::Arc, time::Duration};
use tauri_plugin_shell::ShellExt;
-
+use tokio::sync::Mutex;
use tokio::time::sleep;
#[derive(Debug)]
pub struct CoreManager {
- app_handle: Arc>>,
- sidecar: Arc>>,
- #[allow(unused)]
- use_service_mode: Arc>,
+ running: Arc>,
}
impl CoreManager {
pub fn global() -> &'static CoreManager {
static CORE_MANAGER: OnceCell = OnceCell::new();
-
CORE_MANAGER.get_or_init(|| CoreManager {
- app_handle: Arc::new(Mutex::new(None)),
- sidecar: Arc::new(Mutex::new(None)),
- use_service_mode: Arc::new(Mutex::new(false)),
+ running: Arc::new(Mutex::new(false)),
})
}
- pub fn init(&self, app_handle: &AppHandle) -> Result<()> {
- *self.app_handle.lock() = Some(app_handle.clone());
- tauri::async_runtime::spawn(async {
- log::trace!("run core start");
- // 启动clash
- log_err!(Self::global().run_core().await);
- log::trace!("run core end");
- });
-
+ pub async fn init(&self) -> Result<()> {
+ log::trace!("run core start");
+ // 启动clash
+ log_err!(Self::global().start_core().await);
+ log::trace!("run core end");
Ok(())
}
@@ -51,241 +37,86 @@ impl CoreManager {
let config_path = dirs::path_to_str(&config_path)?;
let clash_core = { Config::verge().latest().clash_core.clone() };
- let mut clash_core = clash_core.unwrap_or("verge-mihomo".into());
-
- // compatibility
- if clash_core.contains("clash") {
- clash_core = "verge-mihomo".to_string();
- Config::verge().draft().patch_config(IVerge {
- clash_core: Some("verge-mihomo".to_string()),
- ..IVerge::default()
- });
- Config::verge().apply();
- match Config::verge().data().save_file() {
- Ok(_) => handle::Handle::refresh_verge(),
- Err(err) => log::error!(target: "app", "{err}"),
- }
- }
+ let clash_core = clash_core.unwrap_or("verge-mihomo".into());
let test_dir = dirs::app_home_dir()?.join("test");
let test_dir = dirs::path_to_str(&test_dir)?;
- let app_handle_option = {
- let lock = self.app_handle.lock();
- lock.as_ref().cloned()
- };
+ let app_handle = handle::Handle::global().app_handle().unwrap();
- if let Some(app_handle) = app_handle_option {
- let output = app_handle
- .shell()
- .sidecar(clash_core)?
- .args(["-t", "-d", test_dir, "-f", config_path])
- .output()
- .await?;
+ 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(())
}
- /// 启动核心
- pub async fn run_core(&self) -> Result<()> {
- let config_path = Config::generate_file(ConfigType::Run)?;
-
- // 关闭tun模式
- let mut disable = Mapping::new();
- let mut tun = Mapping::new();
- tun.insert("enable".into(), false.into());
- disable.insert("tun".into(), tun.into());
- log::debug!(target: "app", "disable tun mode");
- let _ = clash_api::patch_configs(&disable).await;
-
- if *self.use_service_mode.lock() {
- log::debug!(target: "app", "stop the core by service");
- log_err!(service::stop_core_by_service().await);
- } else {
- let system = System::new_with_specifics(
- RefreshKind::new().with_processes(ProcessRefreshKind::everything()),
- );
- let procs = system.processes_by_name("verge-mihomo");
-
- for proc in procs {
- log::debug!(target: "app", "kill all clash process");
- proc.kill();
- }
- }
-
- // 服务模式
- let enable = { Config::verge().latest().enable_service_mode };
- let enable = enable.unwrap_or(false);
-
- *self.use_service_mode.lock() = enable;
-
- if enable {
- // 服务模式启动失败就直接运行sidecar
- log::debug!(target: "app", "try to run core in service mode");
-
- let res = async {
- service::check_service().await?;
- service::run_core_by_service(&config_path).await
- }
- .await;
- match res {
- Ok(_) => return Ok(()),
- Err(err) => {
- // 修改这个值,免得stop出错
- *self.use_service_mode.lock() = false;
- log::error!(target: "app", "{err}");
- }
- }
- }
-
- let app_dir = dirs::app_home_dir()?;
- let app_dir = dirs::path_to_str(&app_dir)?;
-
- let clash_core = { Config::verge().latest().clash_core.clone() };
- let mut clash_core = clash_core.unwrap_or("verge-mihomo".into());
-
- // compatibility
- if clash_core.contains("clash") {
- clash_core = "verge-mihomo".to_string();
- Config::verge().draft().patch_config(IVerge {
- clash_core: Some("verge-mihomo".to_string()),
- ..IVerge::default()
- });
- Config::verge().apply();
- match Config::verge().data().save_file() {
- Ok(_) => handle::Handle::refresh_verge(),
- Err(err) => log::error!(target: "app", "{err}"),
- }
- }
-
- let config_path = dirs::path_to_str(&config_path)?;
-
- let args = vec!["-d", app_dir, "-f", config_path];
-
- let app_handle = self.app_handle.lock();
-
- if let Some(app_handle) = app_handle.as_ref() {
- let cmd = app_handle.shell().sidecar(clash_core)?;
- let (mut rx, cmd_child) = cmd.args(args).spawn()?;
-
- // 将pid写入文件中
- crate::log_err!((|| {
- let pid = cmd_child.pid();
- let path = dirs::clash_pid_path()?;
- fs::File::create(path)
- .context("failed to create the pid file")?
- .write(format!("{pid}").as_bytes())
- .context("failed to write pid to the file")?;
- >::Ok(())
- })());
-
- let mut sidecar = self.sidecar.lock();
- *sidecar = Some(cmd_child);
- drop(sidecar);
-
- tauri::async_runtime::spawn(async move {
- while let Some(event) = rx.recv().await {
- match event {
- CommandEvent::Stdout(line) => {
- let line = String::from_utf8(line).unwrap_or_default();
- log::info!(target: "app", "[mihomo]: {line}");
- Logger::global().set_log(line);
- }
- CommandEvent::Stderr(err) => {
- let err = String::from_utf8(err).unwrap_or_default();
- log::error!(target: "app", "[mihomo]: {err}");
- Logger::global().set_log(err);
- }
- CommandEvent::Error(err) => {
- log::error!(target: "app", "[mihomo]: {err}");
- Logger::global().set_log(err);
- }
- CommandEvent::Terminated(_) => {
- log::info!(target: "app", "mihomo core terminated");
- let _ = CoreManager::global().recover_core();
- break;
- }
- _ => {}
- }
- }
- });
- }
-
- Ok(())
- }
-
- /// 重启内核
- pub fn recover_core(&'static self) -> Result<()> {
- // 服务模式不管
- if *self.use_service_mode.lock() {
- return Ok(());
- }
-
- // 清空原来的sidecar值
- let _ = self.sidecar.lock().take();
-
- tauri::async_runtime::spawn(async move {
- // 6秒之后再查看服务是否正常 (时间随便搞的)
- // terminated 可能是切换内核 (切换内核已经有500ms的延迟)
- sleep(Duration::from_millis(6666)).await;
-
- if self.sidecar.lock().is_none() {
- log::info!(target: "app", "recover clash core");
-
- // 重新启动app
- if let Err(err) = self.run_core().await {
- log::error!(target: "app", "failed to recover clash core");
- log::error!(target: "app", "{err}");
-
- let _ = self.recover_core();
- }
- }
- });
-
- Ok(())
- }
-
/// 停止核心运行
pub async fn stop_core(&self) -> Result<()> {
+ let mut running = self.running.lock().await;
+
+ if !*running {
+ log::debug!("core is not running");
+ return Ok(());
+ }
+
// 关闭tun模式
let mut disable = Mapping::new();
let mut tun = Mapping::new();
tun.insert("enable".into(), false.into());
disable.insert("tun".into(), tun.into());
log::debug!(target: "app", "disable tun mode");
- let _ = clash_api::patch_configs(&disable).await;
+ log_err!(clash_api::patch_configs(&disable).await);
- if *self.use_service_mode.lock() {
- log::debug!(target: "app", "stop the core by service");
- log_err!(service::stop_core_by_service().await);
+ // 服务模式
+ if service::check_service().await.is_ok() {
+ log::info!(target: "app", "stop the core by service");
+ service::stop_core_by_service().await?;
+ }
+ *running = false;
+ Ok(())
+ }
+
+ /// 启动核心
+ pub async fn start_core(&self) -> Result<()> {
+ let mut running = self.running.lock().await;
+ if *running {
+ log::info!("core is running");
return Ok(());
}
- let mut sidecar = self.sidecar.lock();
- let _ = sidecar.take();
+ let config_path = Config::generate_file(ConfigType::Run)?;
- let system = System::new_with_specifics(
- RefreshKind::new().with_processes(ProcessRefreshKind::everything()),
- );
- let procs = system.processes_by_name("verge-mihomo");
- for proc in procs {
- log::debug!(target: "app", "kill all clash process");
- proc.kill();
+ // 服务模式
+ if service::check_service().await.is_ok() {
+ log::info!(target: "app", "try to run core in service mode");
+ service::run_core_by_service(&config_path).await?;
+ *running = true;
}
Ok(())
}
+ /// 重启内核
+ pub async fn restart_core(&self) -> Result<()> {
+ // 重新启动app
+ self.stop_core().await?;
+ self.start_core().await?;
+ Ok(())
+ }
+
/// 切换核心
pub async fn change_core(&self, clash_core: Option) -> Result<()> {
let clash_core = clash_core.ok_or(anyhow::anyhow!("clash core is null"))?;
@@ -295,7 +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);
@@ -307,7 +138,7 @@ impl CoreManager {
// 清掉旧日志
Logger::global().clear_log();
- match self.run_core().await {
+ match self.restart_core().await {
Ok(_) => {
Config::verge().apply();
Config::runtime().apply();
diff --git a/clash-verge-rev/src-tauri/src/core/handle.rs b/clash-verge-rev/src-tauri/src/core/handle.rs
index 614356cc10..19eed0ee96 100644
--- a/clash-verge-rev/src-tauri/src/core/handle.rs
+++ b/clash-verge-rev/src-tauri/src/core/handle.rs
@@ -1,14 +1,14 @@
use super::tray::Tray;
use crate::log_err;
-use anyhow::{bail, Result};
+use anyhow::Result;
use once_cell::sync::OnceCell;
-use parking_lot::Mutex;
+use parking_lot::RwLock;
use std::sync::Arc;
-use tauri::{AppHandle, WebviewWindow, Manager, Emitter};
+use tauri::{AppHandle, Emitter, Manager, WebviewWindow};
#[derive(Debug, Default, Clone)]
pub struct Handle {
- pub app_handle: Arc>>,
+ pub app_handle: Arc>>,
}
impl Handle {
@@ -16,17 +16,21 @@ 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.read().clone()
}
pub fn get_window(&self) -> Option {
- self.app_handle
- .lock()
+ self.app_handle()
.as_ref()
.and_then(|a| a.get_webview_window("main"))
}
@@ -56,22 +60,9 @@ impl Handle {
}
}
- pub fn update_systray() -> Result<()> {
- let app_handle = Self::global().app_handle.lock();
- if app_handle.is_none() {
- bail!("update_systray unhandled error");
- }
- Tray::update_systray(app_handle.as_ref().unwrap())?;
- Ok(())
- }
-
/// update the system tray state
pub fn update_systray_part() -> Result<()> {
- let app_handle = Self::global().app_handle.lock();
- if app_handle.is_none() {
- bail!("update_systray unhandled error");
- }
- Tray::update_part(app_handle.as_ref().unwrap())?;
+ Tray::update_part()?;
Ok(())
}
}
diff --git a/clash-verge-rev/src-tauri/src/core/hotkey.rs b/clash-verge-rev/src-tauri/src/core/hotkey.rs
old mode 100644
new mode 100755
index e53fdffcaa..a51af840ac
--- a/clash-verge-rev/src-tauri/src/core/hotkey.rs
+++ b/clash-verge-rev/src-tauri/src/core/hotkey.rs
@@ -1,14 +1,13 @@
+use crate::core::handle;
use crate::{config::Config, feat, log_err};
use anyhow::{bail, Result};
use once_cell::sync::OnceCell;
use parking_lot::Mutex;
use std::{collections::HashMap, sync::Arc};
-use tauri::AppHandle;
-use tauri_plugin_global_shortcut::GlobalShortcutExt;
-
+use tauri::Manager;
+use tauri_plugin_global_shortcut::{Code, GlobalShortcutExt, ShortcutState};
pub struct Hotkey {
current: Arc>>, // 保存当前的热键设置
- app_handle: Arc>>,
}
impl Hotkey {
@@ -17,12 +16,10 @@ impl Hotkey {
HOTKEY.get_or_init(|| Hotkey {
current: Arc::new(Mutex::new(Vec::new())),
- app_handle: Arc::new(Mutex::new(None)),
})
}
- pub fn init(&self, app_handle: &AppHandle) -> Result<()> {
- *self.app_handle.lock() = Some(app_handle.clone());
+ pub fn init(&self) -> Result<()> {
let verge = Config::verge();
if let Some(hotkeys) = verge.latest().hotkeys.as_ref() {
@@ -48,12 +45,9 @@ impl Hotkey {
Ok(())
}
- fn register(&self, hotkey: &str, func: &str) -> Result<()> {
- let app_handle = self.app_handle.lock();
- if app_handle.is_none() {
- bail!("failed to get the hotkey manager");
- }
- let manager = app_handle.as_ref().unwrap().global_shortcut();
+ pub fn register(&self, hotkey: &str, func: &str) -> Result<()> {
+ let app_handle = handle::Handle::global().app_handle().unwrap();
+ let manager = app_handle.global_shortcut();
if manager.is_registered(hotkey) {
manager.unregister(hotkey)?;
@@ -66,20 +60,32 @@ impl Hotkey {
"clash_mode_direct" => || feat::change_clash_mode("direct".into()),
"toggle_system_proxy" => feat::toggle_system_proxy,
"toggle_tun_mode" => feat::toggle_tun_mode,
+ "quit" => || feat::quit(Some(0)),
+
_ => bail!("invalid function \"{func}\""),
};
- let _ = manager.on_shortcut(hotkey, move |_, _, _| f());
+ let _ = manager.on_shortcut(hotkey, move |app_handle, hotkey, event| {
+ if event.state == ShortcutState::Pressed {
+ if hotkey.key == Code::KeyQ {
+ if let Some(window) = app_handle.get_webview_window("main") {
+ if window.is_focused().unwrap_or(false) {
+ f();
+ }
+ }
+ } else {
+ f();
+ }
+ }
+ });
+
log::info!(target: "app", "register hotkey {hotkey} {func}");
Ok(())
}
- fn unregister(&self, hotkey: &str) -> Result<()> {
- let app_handle = self.app_handle.lock();
- if app_handle.is_none() {
- bail!("failed to get the hotkey manager");
- }
- let manager = app_handle.as_ref().unwrap().global_shortcut();
+ pub fn unregister(&self, hotkey: &str) -> Result<()> {
+ let app_handle = handle::Handle::global().app_handle().unwrap();
+ let manager = app_handle.global_shortcut();
manager.unregister(hotkey)?;
log::info!(target: "app", "unregister hotkey {hotkey}");
@@ -105,7 +111,7 @@ impl Hotkey {
Ok(())
}
- fn get_map_from_vec(hotkeys: &Vec) -> HashMap<&str, &str> {
+ fn get_map_from_vec(hotkeys: &[String]) -> HashMap<&str, &str> {
let mut map = HashMap::new();
hotkeys.iter().for_each(|hotkey| {
@@ -153,10 +159,9 @@ impl Hotkey {
impl Drop for Hotkey {
fn drop(&mut self) {
- if let Some(app_handle) = self.app_handle.lock().as_ref() {
- if let Err(e) = app_handle.global_shortcut().unregister_all() {
- log::error!("Error unregistering all hotkeys: {:?}", e);
- }
+ let app_handle = handle::Handle::global().app_handle().unwrap();
+ if let Err(e) = app_handle.global_shortcut().unregister_all() {
+ log::error!(target:"app", "Error unregistering all hotkeys: {:?}", e);
}
}
}
diff --git a/clash-verge-rev/src-tauri/src/core/service.rs b/clash-verge-rev/src-tauri/src/core/service.rs
index 3a06648f96..66dd1936ab 100644
--- a/clash-verge-rev/src-tauri/src/core/service.rs
+++ b/clash-verge-rev/src-tauri/src/core/service.rs
@@ -1,13 +1,11 @@
-use crate::config::{Config, IVerge};
-use crate::core::handle;
+use crate::config::Config;
use crate::utils::dirs;
use anyhow::{bail, Context, Result};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::path::PathBuf;
-use std::time::Duration;
use std::{env::current_exe, process::Command as StdCommand};
-use tokio::time::sleep;
+use tokio::time::Duration;
// Windows only
@@ -28,32 +26,34 @@ pub struct JsonResponse {
pub data: Option,
}
-#[cfg(not(target_os = "windows"))]
-pub fn sudo(passwd: &String, cmd: String) -> StdCommand {
- let shell = format!("echo \"{}\" | sudo -S {}", passwd, cmd);
- let mut command = StdCommand::new("bash");
- command.arg("-c").arg(shell);
- command
-}
-
-/// Install the Clash Verge Service
-/// 该函数应该在协程或者线程中执行,避免UAC弹窗阻塞主线程
-///
#[cfg(target_os = "windows")]
-pub async fn install_service(_passwd: String) -> Result<()> {
+pub async fn reinstall_service() -> Result<()> {
+ log::info!(target:"app", "reinstall service");
+
use deelevate::{PrivilegeLevel, Token};
use runas::Command as RunasCommand;
use std::os::windows::process::CommandExt;
let binary_path = dirs::service_path()?;
let install_path = binary_path.with_file_name("install-service.exe");
+ let uninstall_path = binary_path.with_file_name("uninstall-service.exe");
if !install_path.exists() {
- bail!("installer exe not found");
+ bail!(format!("installer not found: {install_path:?}"));
+ }
+
+ if !uninstall_path.exists() {
+ bail!(format!("uninstaller not found: {uninstall_path:?}"));
}
let token = Token::with_current_process()?;
let level = token.privilege_level()?;
+ let _ = match level {
+ PrivilegeLevel::NotPrivileged => RunasCommand::new(uninstall_path).show(false).status()?,
+ _ => StdCommand::new(uninstall_path)
+ .creation_flags(0x08000000)
+ .status()?,
+ };
let status = match level {
PrivilegeLevel::NotPrivileged => RunasCommand::new(install_path).show(false).status()?,
@@ -73,111 +73,48 @@ pub async fn install_service(_passwd: String) -> Result<()> {
}
#[cfg(target_os = "linux")]
-pub async fn install_service(passwd: String) -> Result<()> {
+pub async fn reinstall_service() -> Result<()> {
+ log::info!(target:"app", "reinstall service");
use users::get_effective_uid;
- let binary_path = dirs::service_path()?;
- let installer_path = binary_path.with_file_name("install-service");
- if !installer_path.exists() {
- bail!("installer not found");
+ let install_path = tauri::utils::platform::current_exe()?.with_file_name("install-service");
+
+ let uninstall_path = tauri::utils::platform::current_exe()?.with_file_name("uninstall-service");
+
+ if !install_path.exists() {
+ bail!(format!("installer not found: {install_path:?}"));
}
- let output = match get_effective_uid() {
- 0 => {
- StdCommand::new("chmod")
- .arg("+x")
- .arg(installer_path.clone())
- .output()?;
- StdCommand::new("chmod")
- .arg("+x")
- .arg(binary_path)
- .output()?;
- StdCommand::new(installer_path.clone()).output()?
- }
- _ => {
- sudo(
- &passwd,
- format!("chmod +x {}", installer_path.to_string_lossy()),
- )
- .output()?;
- sudo(
- &passwd,
- format!("chmod +x {}", binary_path.to_string_lossy()),
- )
- .output()?;
- sudo(&passwd, format!("{}", installer_path.to_string_lossy())).output()?
- }
- };
- if !output.status.success() {
- bail!(
- "failed to install service with error: {}",
- String::from_utf8_lossy(&output.stderr)
- );
- }
-
- Ok(())
-}
-
-#[cfg(target_os = "macos")]
-pub async fn install_service(passwd: String) -> Result<()> {
- let binary_path = dirs::service_path()?;
- let installer_path = binary_path.with_file_name("install-service");
-
- if !installer_path.exists() {
- bail!("installer not found");
- }
-
- sudo(
- &passwd,
- format!(
- "chmod +x {}",
- installer_path.to_string_lossy().replace(" ", "\\ ")
- ),
- )
- .output()?;
- let output = sudo(
- &passwd,
- format!("{}", installer_path.to_string_lossy().replace(" ", "\\ ")),
- )
- .output()?;
-
- if !output.status.success() {
- bail!(
- "failed to install service with error: {}",
- String::from_utf8_lossy(&output.stderr)
- );
- }
-
- Ok(())
-}
-/// Uninstall the Clash Verge Service
-/// 该函数应该在协程或者线程中执行,避免UAC弹窗阻塞主线程
-#[cfg(target_os = "windows")]
-pub async fn uninstall_service(_passwd: String) -> Result<()> {
- use deelevate::{PrivilegeLevel, Token};
- use runas::Command as RunasCommand;
- use std::os::windows::process::CommandExt;
-
- let binary_path = dirs::service_path()?;
- let uninstall_path = binary_path.with_file_name("uninstall-service.exe");
-
if !uninstall_path.exists() {
- bail!("uninstaller exe not found");
+ bail!(format!("uninstaller not found: {uninstall_path:?}"));
}
- let token = Token::with_current_process()?;
- let level = token.privilege_level()?;
+ let install_shell: String = install_path.to_string_lossy().replace(" ", "\\ ");
+ let uninstall_shell: String = uninstall_path.to_string_lossy().replace(" ", "\\ ");
- let status = match level {
- PrivilegeLevel::NotPrivileged => RunasCommand::new(uninstall_path).show(false).status()?,
- _ => StdCommand::new(uninstall_path)
- .creation_flags(0x08000000)
+ let elevator = crate::utils::help::linux_elevator();
+ let status = match get_effective_uid() {
+ 0 => StdCommand::new(uninstall_shell).status()?,
+ _ => StdCommand::new(elevator.clone())
+ .arg("sh")
+ .arg("-c")
+ .arg(uninstall_shell)
+ .status()?,
+ };
+ log::info!(target:"app", "status code:{}", status.code().unwrap());
+
+ let status = match get_effective_uid() {
+ 0 => StdCommand::new(install_shell).status()?,
+ _ => StdCommand::new(elevator.clone())
+ .arg("sh")
+ .arg("-c")
+ .arg(install_shell)
.status()?,
};
if !status.success() {
bail!(
- "failed to uninstall service with status {}",
+ "failed to install service with status {}",
status.code().unwrap()
);
}
@@ -185,76 +122,38 @@ pub async fn uninstall_service(_passwd: String) -> Result<()> {
Ok(())
}
-#[cfg(target_os = "linux")]
-pub async fn uninstall_service(passwd: String) -> Result<()> {
- use users::get_effective_uid;
-
- let binary_path = dirs::service_path()?;
- let uninstaller_path = binary_path.with_file_name("uninstall-service");
-
- if !uninstaller_path.exists() {
- bail!("uninstaller not found");
- }
-
- let output = match get_effective_uid() {
- 0 => {
- StdCommand::new("chmod")
- .arg("+x")
- .arg(uninstaller_path.clone())
- .output()?;
- StdCommand::new(uninstaller_path.clone()).output()?
- }
- _ => {
- sudo(
- &passwd,
- format!("chmod +x {}", uninstaller_path.to_string_lossy()),
- )
- .output()?;
-
- sudo(&passwd, format!("{}", uninstaller_path.to_string_lossy())).output()?
- }
- };
-
- if !output.status.success() {
- bail!(
- "failed to install service with error: {}",
- String::from_utf8_lossy(&output.stderr)
- );
- }
-
- Ok(())
-}
-
#[cfg(target_os = "macos")]
-pub async fn uninstall_service(passwd: String) -> Result<()> {
- let binary_path = dirs::service_path()?;
- let uninstaller_path = binary_path.with_file_name("uninstall-service");
+pub async fn reinstall_service() -> Result<()> {
+ log::info!(target:"app", "reinstall service");
- if !uninstaller_path.exists() {
- bail!("uninstaller not found");
+ let binary_path = dirs::service_path()?;
+ let install_path = binary_path.with_file_name("install-service");
+ let uninstall_path = binary_path.with_file_name("uninstall-service");
+
+ if !install_path.exists() {
+ bail!(format!("installer not found: {install_path:?}"));
}
- sudo(
- &passwd,
- format!(
- "chmod +x {}",
- uninstaller_path.to_string_lossy().replace(" ", "\\ ")
- ),
- )
- .output()?;
- let output = sudo(
- &passwd,
- format!("{}", uninstaller_path.to_string_lossy().replace(" ", "\\ ")),
- )
- .output()?;
+ if !uninstall_path.exists() {
+ bail!(format!("uninstaller not found: {uninstall_path:?}"));
+ }
- if !output.status.success() {
+ let install_shell: String = install_path.to_string_lossy().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"#
+ );
+
+ let status = StdCommand::new("osascript")
+ .args(vec!["-e", &command])
+ .status()?;
+
+ if !status.success() {
bail!(
- "failed to uninstall service with error: {}",
- String::from_utf8_lossy(&output.stderr)
+ "failed to install service with status {}",
+ status.code().unwrap()
);
}
-
Ok(())
}
@@ -263,6 +162,7 @@ pub async fn check_service() -> Result {
let url = format!("{SERVICE_URL}/get_clash");
let response = reqwest::ClientBuilder::new()
.no_proxy()
+ .timeout(Duration::from_secs(3))
.build()?
.get(url)
.send()
@@ -277,29 +177,8 @@ pub async fn check_service() -> Result {
/// start the clash by service
pub(super) async fn run_core_by_service(config_file: &PathBuf) -> Result<()> {
- let status = check_service().await?;
-
- if status.code == 0 {
- stop_core_by_service().await?;
- sleep(Duration::from_secs(1)).await;
- }
-
let clash_core = { Config::verge().latest().clash_core.clone() };
- let mut clash_core = clash_core.unwrap_or("verge-mihomo".into());
-
- // compatibility
- if clash_core.contains("clash") {
- clash_core = "verge-mihomo".to_string();
- Config::verge().draft().patch_config(IVerge {
- clash_core: Some("verge-mihomo".to_string()),
- ..IVerge::default()
- });
- Config::verge().apply();
- match Config::verge().data().save_file() {
- Ok(_) => handle::Handle::refresh_verge(),
- Err(err) => log::error!(target: "app", "{err}"),
- }
- }
+ let clash_core = clash_core.unwrap_or("verge-mihomo".into());
let bin_ext = if cfg!(windows) { ".exe" } else { "" };
let clash_bin = format!("{clash_core}{bin_ext}");
@@ -321,81 +200,31 @@ pub(super) async fn run_core_by_service(config_file: &PathBuf) -> Result<()> {
map.insert("config_file", config_file);
map.insert("log_file", log_path);
+ log::info!(target:"app", "start service: {:?}", map.clone());
+
let url = format!("{SERVICE_URL}/start_clash");
- let res = reqwest::ClientBuilder::new()
+ let _ = reqwest::ClientBuilder::new()
.no_proxy()
.build()?
.post(url)
.json(&map)
.send()
- .await?
- .json::()
.await
.context("failed to connect to the Clash Verge Service")?;
- if res.code != 0 {
- bail!(res.msg);
- }
-
Ok(())
}
/// stop the clash by service
pub(super) async fn stop_core_by_service() -> Result<()> {
let url = format!("{SERVICE_URL}/stop_clash");
- let res = reqwest::ClientBuilder::new()
+ let _ = reqwest::ClientBuilder::new()
.no_proxy()
.build()?
.post(url)
.send()
- .await?
- .json::()
.await
.context("failed to connect to the Clash Verge Service")?;
- if res.code != 0 {
- bail!(res.msg);
- }
-
- Ok(())
-}
-
-/// set dns by service
-pub async fn set_dns_by_service() -> Result<()> {
- let url = format!("{SERVICE_URL}/set_dns");
- let res = reqwest::ClientBuilder::new()
- .no_proxy()
- .build()?
- .post(url)
- .send()
- .await?
- .json::()
- .await
- .context("failed to connect to the Clash Verge Service")?;
-
- if res.code != 0 {
- bail!(res.msg);
- }
-
- Ok(())
-}
-
-/// unset dns by service
-pub async fn unset_dns_by_service() -> Result<()> {
- let url = format!("{SERVICE_URL}/unset_dns");
- let res = reqwest::ClientBuilder::new()
- .no_proxy()
- .build()?
- .post(url)
- .send()
- .await?
- .json::()
- .await
- .context("failed to connect to the Clash Verge Service")?;
-
- if res.code != 0 {
- bail!(res.msg);
- }
-
Ok(())
}
diff --git a/clash-verge-rev/src-tauri/src/core/sysopt.rs b/clash-verge-rev/src-tauri/src/core/sysopt.rs
index 35ed33a81c..0674d5b45b 100644
--- a/clash-verge-rev/src-tauri/src/core/sysopt.rs
+++ b/clash-verge-rev/src-tauri/src/core/sysopt.rs
@@ -10,27 +10,15 @@ 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>,
+ guard_state: Arc>,
}
#[cfg(target_os = "windows")]
@@ -42,7 +30,6 @@ static DEFAULT_BYPASS: &str =
"127.0.0.1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12,localhost,*.local,*.crashlytics.com,";
fn get_bypass() -> String {
- // let bypass = DEFAULT_BYPASS.to_string();
let use_default = Config::verge().latest().use_default_bypass.unwrap_or(true);
let res = {
let verge = Config::verge();
@@ -53,125 +40,35 @@ fn get_bypass() -> String {
Some(bypass) => bypass,
None => "".to_string(),
};
- #[cfg(target_os = "windows")]
- let bypass = if custom_bypass.is_empty() {
- DEFAULT_BYPASS.to_string()
- } else {
- if use_default {
- format!("{};{}", DEFAULT_BYPASS, custom_bypass)
- } else {
- custom_bypass
- }
- };
- #[cfg(not(target_os = "windows"))]
- let bypass = if custom_bypass.is_empty() {
- DEFAULT_BYPASS.to_string()
- } else {
- if use_default {
- format!("{},{}", DEFAULT_BYPASS, custom_bypass)
- } else {
- custom_bypass
- }
- };
- bypass
+ if custom_bypass.is_empty() {
+ DEFAULT_BYPASS.to_string()
+ } else if use_default {
+ format!("{},{}", DEFAULT_BYPASS, custom_bypass)
+ } else {
+ custom_bypass
+ }
}
impl Sysopt {
pub fn global() -> &'static Sysopt {
static SYSOPT: OnceCell = OnceCell::new();
-
SYSOPT.get_or_init(|| Sysopt {
- cur_sysproxy: Arc::new(Mutex::new(None)),
- old_sysproxy: Arc::new(Mutex::new(None)),
- cur_autoproxy: Arc::new(Mutex::new(None)),
- old_autoproxy: Arc::new(Mutex::new(None)),
+ 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()),
})
}
- /// init the sysproxy
- pub fn init_sysproxy(&self) -> Result<()> {
- let port = Config::verge()
- .latest()
- .verge_mixed_port
- .unwrap_or(Config::clash().data().get_mixed_port());
- let pac_port = IVerge::get_singleton_port();
-
- let (enable, pac) = {
- let verge = Config::verge();
- let verge = verge.latest();
- (
- verge.enable_system_proxy.unwrap_or(false),
- verge.proxy_auto_config.unwrap_or(false),
- )
- };
- let mut sys = Sysproxy {
- enable,
- host: String::from("127.0.0.1"),
- port,
- bypass: get_bypass(),
- };
- let mut auto = Autoproxy {
- enable,
- url: format!("http://127.0.0.1:{pac_port}/commands/pac"),
- };
- if pac {
- sys.enable = false;
- let old = Sysproxy::get_system_proxy().ok();
- sys.set_system_proxy()?;
- *self.old_sysproxy.lock() = old;
- *self.cur_sysproxy.lock() = Some(sys);
-
- let old = Autoproxy::get_auto_proxy().ok();
- auto.set_auto_proxy()?;
- *self.old_autoproxy.lock() = old;
- *self.cur_autoproxy.lock() = Some(auto);
- } else {
- auto.enable = false;
- let old = Autoproxy::get_auto_proxy().ok();
- auto.set_auto_proxy()?;
- *self.old_autoproxy.lock() = old;
- *self.cur_autoproxy.lock() = Some(auto);
-
- let old = Sysproxy::get_system_proxy().ok();
- sys.set_system_proxy()?;
- *self.old_sysproxy.lock() = old;
- *self.cur_sysproxy.lock() = Some(sys);
- }
-
- // run the system proxy guard
+ pub fn init_guard_sysproxy(&self) -> Result<()> {
self.guard_proxy();
Ok(())
}
- /// update the system proxy
- pub fn update_sysproxy(&self) -> Result<()> {
- let mut cur_sysproxy = self.cur_sysproxy.lock();
- let old_sysproxy = self.old_sysproxy.lock();
- let mut cur_autoproxy = self.cur_autoproxy.lock();
- let old_autoproxy = self.old_autoproxy.lock();
-
- let (enable, pac) = {
- let verge = Config::verge();
- let verge = verge.latest();
- (
- verge.enable_system_proxy.unwrap_or(false),
- verge.proxy_auto_config.unwrap_or(false),
- )
- };
- if pac && (cur_autoproxy.is_none() || old_autoproxy.is_none()) {
- drop(cur_autoproxy);
- drop(old_autoproxy);
- return self.init_sysproxy();
- }
-
- if !pac && (cur_sysproxy.is_none() || old_sysproxy.is_none()) {
- drop(cur_sysproxy);
- drop(old_sysproxy);
- return self.init_sysproxy();
- }
+ /// init the sysproxy
+ pub async fn update_sysproxy(&self) -> Result<()> {
+ let _lock = self.update_sysproxy.lock().await;
let port = Config::verge()
.latest()
@@ -179,84 +76,139 @@ impl Sysopt {
.unwrap_or(Config::clash().data().get_mixed_port());
let pac_port = IVerge::get_singleton_port();
- let mut sysproxy = cur_sysproxy.take().unwrap();
- sysproxy.bypass = get_bypass();
- sysproxy.port = port;
+ let (sys_enable, pac_enable) = {
+ let verge = Config::verge();
+ let verge = verge.latest();
+ (
+ verge.enable_system_proxy.unwrap_or(false),
+ verge.proxy_auto_config.unwrap_or(false),
+ )
+ };
- let mut autoproxy = cur_autoproxy.take().unwrap();
- autoproxy.url = format!("http://127.0.0.1:{pac_port}/commands/pac");
+ #[cfg(not(target_os = "windows"))]
+ {
+ let mut sys = Sysproxy {
+ enable: false,
+ host: String::from("127.0.0.1"),
+ port,
+ bypass: get_bypass(),
+ };
+ let mut auto = Autoproxy {
+ enable: false,
+ url: format!("http://127.0.0.1:{pac_port}/commands/pac"),
+ };
- if pac {
- sysproxy.enable = false;
- sysproxy.set_system_proxy()?;
- *cur_sysproxy = Some(sysproxy);
- autoproxy.enable = enable;
- autoproxy.set_auto_proxy()?;
- *cur_autoproxy = Some(autoproxy);
- } else {
- autoproxy.enable = false;
- autoproxy.set_auto_proxy()?;
- *cur_autoproxy = Some(autoproxy);
- sysproxy.enable = enable;
- sysproxy.set_system_proxy()?;
- *cur_sysproxy = Some(sysproxy);
+ if !sys_enable {
+ sys.set_system_proxy()?;
+ auto.set_auto_proxy()?;
+ return Ok(());
+ }
+
+ if pac_enable {
+ sys.enable = false;
+ auto.enable = true;
+ sys.set_system_proxy()?;
+ auto.set_auto_proxy()?;
+ return Ok(());
+ }
+
+ if sys_enable {
+ auto.enable = false;
+ sys.enable = true;
+ auto.set_auto_proxy()?;
+ sys.set_system_proxy()?;
+ return Ok(());
+ }
+ }
+ #[cfg(target_os = "windows")]
+ {
+ if !sys_enable {
+ return self.reset_sysproxy().await;
+ }
+ use crate::core::handle::Handle;
+ use crate::utils::dirs;
+ use anyhow::bail;
+ use tauri_plugin_shell::ShellExt;
+
+ let app_handle = Handle::global().app_handle().unwrap();
+
+ let binary_path = dirs::service_path()?;
+ let sysproxy_exe = binary_path.with_file_name("sysproxy.exe");
+ if !sysproxy_exe.exists() {
+ bail!("sysproxy.exe not found");
+ }
+
+ let shell = app_handle.shell();
+ let output = if pac_enable {
+ let address = format!("http://{}:{}/commands/pac", "127.0.0.1", pac_port);
+ let output = shell
+ .command(sysproxy_exe.as_path().to_str().unwrap())
+ .args(["pac", address.as_str()])
+ .output()
+ .await
+ .unwrap();
+ output
+ } else {
+ let address = format!("{}:{}", "127.0.0.1", port);
+ let bypass = get_bypass();
+ let output = shell
+ .command(sysproxy_exe.as_path().to_str().unwrap())
+ .args(["global", address.as_str(), bypass.as_ref()])
+ .output()
+ .await
+ .unwrap();
+ output
+ };
+
+ if !output.status.success() {
+ bail!("sysproxy exe run failed");
+ }
}
Ok(())
}
/// reset the sysproxy
- pub fn reset_sysproxy(&self) -> Result<()> {
- let mut cur_sysproxy = self.cur_sysproxy.lock();
- let mut old_sysproxy = self.old_sysproxy.lock();
- let mut cur_autoproxy = self.cur_autoproxy.lock();
- let mut old_autoproxy = self.old_autoproxy.lock();
-
- let cur_sysproxy = cur_sysproxy.take();
- let cur_autoproxy = cur_autoproxy.take();
-
- if let Some(mut old) = old_sysproxy.take() {
- // 如果原代理和当前代理 端口一致,就disable关闭,否则就恢复原代理设置
- // 当前没有设置代理的时候,不确定旧设置是否和当前一致,全关了
- let port_same = cur_sysproxy.map_or(true, |cur| old.port == cur.port);
-
- if old.enable && port_same {
- old.enable = false;
- log::info!(target: "app", "reset proxy by disabling the original proxy");
- } else {
- log::info!(target: "app", "reset proxy to the original proxy");
- }
-
- old.set_system_proxy()?;
- } else if let Some(mut cur @ Sysproxy { enable: true, .. }) = cur_sysproxy {
- // 没有原代理,就按现在的代理设置disable即可
- log::info!(target: "app", "reset proxy by disabling the current proxy");
- cur.enable = false;
- cur.set_system_proxy()?;
- } else {
- log::info!(target: "app", "reset proxy with no action");
+ pub async fn reset_sysproxy(&self) -> Result<()> {
+ let _lock = self.reset_sysproxy.lock().await;
+ //直接关闭所有代理
+ #[cfg(not(target_os = "windows"))]
+ {
+ let mut sysproxy: Sysproxy = Sysproxy::get_system_proxy()?;
+ let mut autoproxy = Autoproxy::get_auto_proxy()?;
+ sysproxy.enable = false;
+ autoproxy.enable = false;
+ autoproxy.set_auto_proxy()?;
+ sysproxy.set_system_proxy()?;
}
- if let Some(mut old) = old_autoproxy.take() {
- // 如果原代理和当前代理 URL一致,就disable关闭,否则就恢复原代理设置
- // 当前没有设置代理的时候,不确定旧设置是否和当前一致,全关了
- let url_same = cur_autoproxy.map_or(true, |cur| old.url == cur.url);
+ #[cfg(target_os = "windows")]
+ {
+ use crate::core::handle::Handle;
+ use crate::utils::dirs;
+ use anyhow::bail;
+ use tauri_plugin_shell::ShellExt;
- 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");
+ let app_handle = Handle::global().app_handle().unwrap();
+
+ let binary_path = dirs::service_path()?;
+ let sysproxy_exe = binary_path.with_file_name("sysproxy.exe");
+
+ if !sysproxy_exe.exists() {
+ bail!("sysproxy.exe not found");
}
- 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 shell = app_handle.shell();
+ 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");
+ }
}
Ok(())
@@ -294,14 +246,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
@@ -326,10 +277,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();
@@ -342,22 +289,10 @@ 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 _lock = self.guard_state.lock();
tauri::async_runtime::spawn(async move {
- // if it is running, exit
- let mut state = guard_state.lock().await;
- if *state {
- return;
- }
- *state = true;
- drop(state);
-
// default duration is 10s
let mut wait_secs = 10u64;
@@ -377,7 +312,7 @@ impl Sysopt {
// stop loop
if !enable || !guard {
- break;
+ continue;
}
// update duration
@@ -385,6 +320,20 @@ impl Sysopt {
log::debug!(target: "app", "try to guard the system proxy");
+ let sysproxy = Sysproxy::get_system_proxy();
+ let autoproxy = Autoproxy::get_auto_proxy();
+ if sysproxy.is_err() || autoproxy.is_err() {
+ log::error!(target: "app", "failed to get the system proxy");
+ continue;
+ }
+
+ let sysproxy_enable = sysproxy.ok().map(|s| s.enable).unwrap_or(false);
+ let autoproxy_enable = autoproxy.ok().map(|s| s.enable).unwrap_or(false);
+
+ if sysproxy_enable || autoproxy_enable {
+ continue;
+ }
+
let port = {
Config::verge()
.latest()
@@ -392,27 +341,66 @@ impl Sysopt {
.unwrap_or(Config::clash().data().get_mixed_port())
};
let pac_port = IVerge::get_singleton_port();
- if pac {
- let autoproxy = Autoproxy {
- enable: true,
- url: format!("http://127.0.0.1:{pac_port}/commands/pac"),
- };
- log_err!(autoproxy.set_auto_proxy());
- } else {
- let sysproxy = Sysproxy {
- enable: true,
- host: "127.0.0.1".into(),
- port,
- bypass: get_bypass(),
- };
+ #[cfg(not(target_os = "windows"))]
+ {
+ if pac {
+ let autoproxy = Autoproxy {
+ enable: true,
+ url: format!("http://127.0.0.1:{pac_port}/commands/pac"),
+ };
+ log_err!(autoproxy.set_auto_proxy());
+ } else {
+ let sysproxy = Sysproxy {
+ enable: true,
+ host: "127.0.0.1".into(),
+ port,
+ bypass: get_bypass(),
+ };
- log_err!(sysproxy.set_system_proxy());
+ log_err!(sysproxy.set_system_proxy());
+ }
}
- }
- let mut state = guard_state.lock().await;
- *state = false;
- drop(state);
+ #[cfg(target_os = "windows")]
+ {
+ use crate::core::handle::Handle;
+ use crate::utils::dirs;
+ use tauri_plugin_shell::ShellExt;
+
+ let app_handle = Handle::global().app_handle().unwrap();
+
+ let binary_path = dirs::service_path().unwrap();
+ let sysproxy_exe = binary_path.with_file_name("sysproxy.exe");
+ if !sysproxy_exe.exists() {
+ break;
+ }
+
+ let shell = app_handle.shell();
+ let output = if pac {
+ let address = format!("http://{}:{}/commands/pac", "127.0.0.1", pac_port);
+
+ shell
+ .command(sysproxy_exe.as_path().to_str().unwrap())
+ .args(["pac", address.as_str()])
+ .output()
+ .await
+ .unwrap()
+ } else {
+ let address = format!("{}:{}", "127.0.0.1", port);
+ let bypass = get_bypass();
+
+ shell
+ .command(sysproxy_exe.as_path().to_str().unwrap())
+ .args(["global", address.as_str(), bypass.as_ref()])
+ .output()
+ .await
+ .unwrap()
+ };
+ if !output.status.success() {
+ break;
+ }
+ };
+ }
});
}
}
diff --git a/clash-verge-rev/src-tauri/src/core/tray.rs b/clash-verge-rev/src-tauri/src/core/tray.rs
index 633babf384..f1602c5658 100644
--- a/clash-verge-rev/src-tauri/src/core/tray.rs
+++ b/clash-verge-rev/src-tauri/src/core/tray.rs
@@ -8,41 +8,65 @@ use crate::{
},
};
use anyhow::Result;
-use tauri::tray::{MouseButton, MouseButtonState, TrayIconEvent};
+use tauri::{
+ menu::CheckMenuItem,
+ tray::{MouseButton, MouseButtonState, TrayIconEvent, TrayIconId},
+};
use tauri::{
menu::{MenuEvent, MenuItem, PredefinedMenuItem, Submenu},
Wry,
};
use tauri::{AppHandle, Manager};
+
+use super::handle;
pub struct Tray {}
impl Tray {
- pub fn update_systray(app_handle: &AppHandle) -> Result<()> {
- let tray = app_handle.tray_by_id("main").unwrap();
- tray.on_tray_icon_event(|tray, event| {
+ pub fn create_systray() -> Result<()> {
+ let app_handle = handle::Handle::global().app_handle().unwrap();
+ let tray_incon_id = TrayIconId::new("main");
+ let tray = app_handle.tray_by_id(&tray_incon_id).unwrap();
+
+ tray.on_tray_icon_event(|_, event| {
let tray_event = { Config::verge().latest().tray_event.clone() };
let tray_event: String = tray_event.unwrap_or("main_window".into());
+
+ #[cfg(target_os = "macos")]
if let TrayIconEvent::Click {
- button: MouseButton::Left,
- button_state: MouseButtonState::Up,
+ button: MouseButton::Right,
+ button_state: MouseButtonState::Down,
..
} = event
{
- let app = tray.app_handle();
match tray_event.as_str() {
"system_proxy" => feat::toggle_system_proxy(),
"tun_mode" => feat::toggle_tun_mode(),
- "main_window" => resolve::create_window(app),
+ "main_window" => resolve::create_window(),
+ _ => {}
+ }
+ }
+
+ #[cfg(not(target_os = "macos"))]
+ if let TrayIconEvent::Click {
+ button: MouseButton::Left,
+ button_state: MouseButtonState::Down,
+ ..
+ } = event
+ {
+ match tray_event.as_str() {
+ "system_proxy" => feat::toggle_system_proxy(),
+ "tun_mode" => feat::toggle_tun_mode(),
+ "main_window" => resolve::create_window(),
_ => {}
}
}
});
tray.on_menu_event(on_menu_event);
-
Ok(())
}
- pub fn update_part(app_handle: &AppHandle) -> Result<()> {
+ pub fn update_part() -> Result<()> {
+ let app_handle = handle::Handle::global().app_handle().unwrap();
let use_zh = { Config::verge().latest().language == Some("zh".into()) };
let version = VERSION.get().unwrap();
let mode = {
@@ -66,7 +90,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,
@@ -191,40 +215,113 @@ fn create_tray_menu(
let use_zh = { Config::verge().latest().language == Some("zh".into()) };
let version = VERSION.get().unwrap();
- let rule_mode_text = if mode == "rule" {
- "✓ 规则模式"
- } else {
- "规则模式"
- };
+ let open_window = &MenuItem::with_id(
+ app_handle,
+ "open_window",
+ t!("Dashboard", "打开面板", use_zh),
+ true,
+ None::<&str>,
+ )
+ .unwrap();
- let global_mode_text = if mode == "global" {
- "✓ 全局模式"
- } else {
- "全局模式"
- };
+ let rule_mode = &CheckMenuItem::with_id(
+ app_handle,
+ "rule_mode",
+ t!("Rule Mode", "规则模式", use_zh),
+ true,
+ mode == "rule",
+ None::<&str>,
+ )
+ .unwrap();
- let direct_mode_text = if mode == "direct" {
- "✓ 直连模式"
- } else {
- "直连模式"
- };
+ let global_mode = &CheckMenuItem::with_id(
+ app_handle,
+ "global_mode",
+ t!("Global Mode", "全局模式", use_zh),
+ true,
+ mode == "global",
+ None::<&str>,
+ )
+ .unwrap();
- let system_proxy_text = if system_proxy_enabled {
- "✓ 系统代理"
- } else {
- "系统代理"
- };
+ let direct_mode = &CheckMenuItem::with_id(
+ app_handle,
+ "direct_mode",
+ t!("Direct Mode", "直连模式", use_zh),
+ true,
+ mode == "direct",
+ None::<&str>,
+ )
+ .unwrap();
- let tun_mode_text = if tun_mode_enabled {
- "✓ Tun 模式"
- } else {
- "Tun 模式"
- };
+ let system_proxy = &CheckMenuItem::with_id(
+ app_handle,
+ "system_proxy",
+ t!("System Proxy", "系统代理", use_zh),
+ true,
+ system_proxy_enabled,
+ None::<&str>,
+ )
+ .unwrap();
+
+ let tun_mode = &CheckMenuItem::with_id(
+ app_handle,
+ "tun_mode",
+ t!("TUN Mode", "Tun模式", use_zh),
+ true,
+ tun_mode_enabled,
+ None::<&str>,
+ )
+ .unwrap();
+
+ let copy_env = &MenuItem::with_id(
+ app_handle,
+ "copy_env",
+ t!("Copy Env", "复制环境变量", use_zh),
+ true,
+ None::<&str>,
+ )
+ .unwrap();
+
+ let open_app_dir = &MenuItem::with_id(
+ app_handle,
+ "open_app_dir",
+ t!("Conf Dir", "配置目录", use_zh),
+ true,
+ None::<&str>,
+ )
+ .unwrap();
+
+ let open_core_dir = &MenuItem::with_id(
+ app_handle,
+ "open_core_dir",
+ t!("Core Dir", "内核目录", use_zh),
+ true,
+ None::<&str>,
+ )
+ .unwrap();
+
+ let open_logs_dir = &MenuItem::with_id(
+ app_handle,
+ "open_logs_dir",
+ t!("Logs Dir", "日志目录", use_zh),
+ true,
+ None::<&str>,
+ )
+ .unwrap();
+ let open_dir = &Submenu::with_id_and_items(
+ app_handle,
+ "open_dir",
+ t!("Open Dir", "打开目录", use_zh),
+ true,
+ &[open_app_dir, open_core_dir, open_logs_dir],
+ )
+ .unwrap();
let restart_clash = &MenuItem::with_id(
app_handle,
"restart_clash",
- t!("Restart App", "重启 Clash", use_zh),
+ t!("Restart Clash Core", "重启Clash内核", use_zh),
true,
None::<&str>,
)
@@ -233,7 +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>,
)
@@ -248,113 +345,44 @@ fn create_tray_menu(
)
.unwrap();
+ let more = &Submenu::with_id_and_items(
+ app_handle,
+ "more",
+ t!("More", "更多", use_zh),
+ true,
+ &[restart_clash, restart_app, app_version],
+ )
+ .unwrap();
+
+ let quit = &MenuItem::with_id(
+ app_handle,
+ "quit",
+ t!("Quit", "退出", use_zh),
+ true,
+ Some("CmdOrControl+Q"),
+ )
+ .unwrap();
+
+ let separator = &PredefinedMenuItem::separator(app_handle).unwrap();
+
let menu = tauri::menu::MenuBuilder::new(app_handle)
- .item(
- &MenuItem::with_id(
- app_handle,
- "open_window",
- t!("Dashboard", "打开面板", use_zh),
- true,
- None::<&str>,
- )
- .unwrap(),
- )
- .item(&PredefinedMenuItem::separator(app_handle).unwrap())
- .item(
- &MenuItem::with_id(
- app_handle,
- "rule_mode",
- t!("Rule Mode", rule_mode_text, use_zh),
- true,
- None::<&str>,
- )
- .unwrap(),
- )
- .item(
- &MenuItem::with_id(
- app_handle,
- "global_mode",
- t!("Global Mode", global_mode_text, use_zh),
- true,
- None::<&str>,
- )
- .unwrap(),
- )
- .item(
- &MenuItem::with_id(
- app_handle,
- "direct_mode",
- t!("Direct Mode", direct_mode_text, use_zh),
- true,
- None::<&str>,
- )
- .unwrap(),
- )
- .item(&PredefinedMenuItem::separator(app_handle).unwrap())
- .item(
- &MenuItem::with_id(
- app_handle,
- "system_proxy",
- t!("System Proxy", system_proxy_text, use_zh),
- true,
- None::<&str>,
- )
- .unwrap(),
- )
- .item(
- &MenuItem::with_id(
- app_handle,
- "tun_mode",
- t!("TUN Mode", tun_mode_text, use_zh),
- true,
- None::<&str>,
- )
- .unwrap(),
- )
- .item(
- &MenuItem::with_id(
- app_handle,
- "copy_env",
- t!("Copy Env", "复制环境变量", use_zh),
- true,
- None::<&str>,
- )
- .unwrap(),
- )
- .item(
- &MenuItem::with_id(
- app_handle,
- "open_dir",
- t!("Open Dir", "打开目录", use_zh),
- true,
- None::<&str>,
- )
- .unwrap(),
- )
- .item(
- &Submenu::with_id_and_items(
- app_handle,
- "more",
- t!("More", "更多", use_zh),
- true,
- &[restart_clash, restart_app, app_version],
- )
- .unwrap(),
- )
- .item(&PredefinedMenuItem::separator(app_handle).unwrap())
- .item(
- &MenuItem::with_id(
- app_handle,
- "quit",
- t!("Quit", "退出", use_zh),
- true,
- Some("CmdOrControl+Q"),
- )
- .unwrap(),
- )
+ .items(&[
+ open_window,
+ separator,
+ rule_mode,
+ global_mode,
+ direct_mode,
+ separator,
+ system_proxy,
+ tun_mode,
+ copy_env,
+ open_dir,
+ more,
+ separator,
+ quit,
+ ])
.build()
.unwrap();
-
Ok(menu)
}
@@ -365,14 +393,19 @@ 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),
- "open_dir" => crate::log_err!(cmds::open_app_dir()),
+ "copy_env" => feat::copy_clash_env(),
+ "open_app_dir" => crate::log_err!(cmds::open_app_dir()),
+ "open_core_dir" => crate::log_err!(cmds::open_core_dir()),
+ "open_logs_dir" => crate::log_err!(cmds::open_logs_dir()),
"restart_clash" => feat::restart_clash_core(),
"restart_app" => tauri::process::restart(&app_handle.env()),
- "quit" => cmds::exit_app(app_handle.clone()),
+ "quit" => {
+ println!("quit");
+ feat::quit(Some(0));
+ }
_ => {}
}
}
diff --git a/clash-verge-rev/src-tauri/src/enhance/merge.rs b/clash-verge-rev/src-tauri/src/enhance/merge.rs
index dccd65cb1d..0aa81e7e90 100644
--- a/clash-verge-rev/src-tauri/src/enhance/merge.rs
+++ b/clash-verge-rev/src-tauri/src/enhance/merge.rs
@@ -54,9 +54,7 @@ fn test_merge() -> anyhow::Result<()> {
let merge = serde_yaml::from_str::(merge)?;
let config = serde_yaml::from_str::(config)?;
- let result = serde_yaml::to_string(&use_merge(merge, config))?;
-
- println!("{result}");
+ let _ = serde_yaml::to_string(&use_merge(merge, config))?;
Ok(())
}
diff --git a/clash-verge-rev/src-tauri/src/enhance/mod.rs b/clash-verge-rev/src-tauri/src/enhance/mod.rs
index 11355e8740..6da1b537b2 100644
--- a/clash-verge-rev/src-tauri/src/enhance/mod.rs
+++ b/clash-verge-rev/src-tauri/src/enhance/mod.rs
@@ -259,7 +259,9 @@ pub async fn enhance() -> (Mapping, Vec, HashMap) {
});
}
- config = use_tun(config, enable_tun).await;
+ if enable_tun {
+ config = use_tun(config).await;
+ }
config = use_sort(config);
let mut exists_set = HashSet::new();
diff --git a/clash-verge-rev/src-tauri/src/enhance/script.rs b/clash-verge-rev/src-tauri/src/enhance/script.rs
index e2465097e7..22ad0cef64 100644
--- a/clash-verge-rev/src-tauri/src/enhance/script.rs
+++ b/clash-verge-rev/src-tauri/src/enhance/script.rs
@@ -103,9 +103,7 @@ fn test_script() {
let config = serde_yaml::from_str(config).unwrap();
let (config, results) = use_script(script.into(), config, "".to_string()).unwrap();
- let config_str = serde_yaml::to_string(&config).unwrap();
-
- println!("{config_str}");
+ let _ = serde_yaml::to_string(&config).unwrap();
dbg!(results);
}
diff --git a/clash-verge-rev/src-tauri/src/enhance/seq.rs b/clash-verge-rev/src-tauri/src/enhance/seq.rs
index c253b1e6ff..81e722b571 100644
--- a/clash-verge-rev/src-tauri/src/enhance/seq.rs
+++ b/clash-verge-rev/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/clash-verge-rev/src-tauri/src/enhance/tun.rs b/clash-verge-rev/src-tauri/src/enhance/tun.rs
index 2e9de2595b..b532f91fab 100644
--- a/clash-verge-rev/src-tauri/src/enhance/tun.rs
+++ b/clash-verge-rev/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,61 +18,13 @@ macro_rules! append {
};
}
-pub async fn use_tun(mut config: Mapping, enable: 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 {
- log_err!(service::set_dns_by_service().await);
- use_dns_for_tun(config)
- } else {
- log_err!(service::unset_dns_by_service().await);
- config
- }
-}
-
-fn use_dns_for_tun(mut config: Mapping) -> Mapping {
- let dns_key = Value::from("dns");
- let dns_val = config.get(&dns_key);
-
- let mut dns_val = dns_val.map_or(Mapping::new(), |val| {
- val.as_mapping().cloned().unwrap_or(Mapping::new())
- });
-
- // 开启tun将同时开启dns
- revise!(dns_val, "enable", true);
-
- 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
}
diff --git a/clash-verge-rev/src-tauri/src/feat.rs b/clash-verge-rev/src-tauri/src/feat.rs
index 0260e5d062..32023ee735 100644
--- a/clash-verge-rev/src-tauri/src/feat.rs
+++ b/clash-verge-rev/src-tauri/src/feat.rs
@@ -10,28 +10,23 @@ use crate::log_err;
use crate::utils::resolve;
use anyhow::{bail, Result};
use serde_yaml::{Mapping, Value};
-use tauri::{AppHandle, Manager};
use tauri_plugin_clipboard_manager::ClipboardExt;
// 打开面板
pub fn open_or_close_dashboard() {
- let handle = handle::Handle::global();
- let app_handle = handle.app_handle.lock();
- if let Some(app_handle) = app_handle.as_ref() {
- if let Some(window) = app_handle.get_webview_window("main") {
- if let Ok(true) = window.is_focused() {
- let _ = window.close();
- return;
- }
+ if let Some(window) = handle::Handle::global().get_window() {
+ if let Ok(true) = window.is_focused() {
+ let _ = window.minimize();
+ return;
}
- resolve::create_window(app_handle);
}
+ resolve::create_window();
}
// 重启clash
pub fn restart_clash_core() {
tauri::async_runtime::spawn(async {
- match CoreManager::global().run_core().await {
+ match CoreManager::global().restart_core().await {
Ok(_) => {
handle::Handle::refresh_clash();
handle::Handle::notice_message("set_config::ok", "ok");
@@ -103,6 +98,12 @@ pub fn toggle_tun_mode() {
});
}
+pub fn quit(code: Option) {
+ let app_handle = handle::Handle::global().app_handle().unwrap();
+ resolve::resolve_reset();
+ app_handle.exit(code.unwrap_or(0));
+}
+
/// 修改clash的订阅
pub async fn patch_clash(patch: Mapping) -> Result<()> {
Config::clash().draft().patch_config(patch.clone());
@@ -111,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();
}
@@ -140,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;
@@ -150,6 +152,8 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> {
let mixed_port = patch.verge_mixed_port;
#[cfg(target_os = "macos")]
let tray_icon = patch.tray_icon;
+ #[cfg(not(target_os = "macos"))]
+ let tray_icon: Option = None;
let common_tray_icon = patch.common_tray_icon;
let sysproxy_tray_icon = patch.sysproxy_tray_icon;
let tun_tray_icon = patch.tun_tray_icon;
@@ -165,34 +169,26 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> {
let socks_port = patch.verge_socks_port;
let http_enabled = patch.verge_http_enabled;
let http_port = patch.verge_port;
- let res = {
- let service_mode = patch.enable_service_mode;
- let mut generated = false;
- if service_mode.is_some() {
- log::debug!(target: "app", "change service mode to {}", service_mode.unwrap());
- if !generated {
- Config::generate().await?;
- CoreManager::global().run_core().await?;
- generated = true;
- }
- } else if tun_mode.is_some() {
- update_core_config().await?;
+
+ let res: std::result::Result<(), anyhow::Error> = {
+ let mut should_restart_core = false;
+ let mut should_update_clash_config = false;
+ let mut should_update_launch = false;
+ let mut should_update_sysproxy = false;
+ let mut should_update_systray_part = false;
+
+ if tun_mode.is_some() {
+ should_update_clash_config = true;
}
+
#[cfg(not(target_os = "windows"))]
if redir_enabled.is_some() || redir_port.is_some() {
- if !generated {
- Config::generate().await?;
- CoreManager::global().run_core().await?;
- generated = true;
- }
+ should_restart_core = true;
}
+
#[cfg(target_os = "linux")]
if tproxy_enabled.is_some() || tproxy_port.is_some() {
- if !generated {
- Config::generate().await?;
- CoreManager::global().run_core().await?;
- generated = true;
- }
+ should_restart_core = true;
}
if socks_enabled.is_some()
|| http_enabled.is_some()
@@ -200,13 +196,10 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> {
|| http_port.is_some()
|| mixed_port.is_some()
{
- if !generated {
- Config::generate().await?;
- CoreManager::global().run_core().await?;
- }
+ should_restart_core = true;
}
if auto_launch.is_some() {
- sysopt::Sysopt::global().update_launch()?;
+ should_update_launch = true;
}
if system_proxy.is_some()
|| proxy_bypass.is_some()
@@ -214,30 +207,39 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> {
|| pac.is_some()
|| pac_content.is_some()
{
- sysopt::Sysopt::global().update_sysproxy()?;
- sysopt::Sysopt::global().guard_proxy();
+ should_update_sysproxy = true;
}
- if let Some(true) = patch.enable_proxy_guard {
- sysopt::Sysopt::global().guard_proxy();
+ if language.is_some()
+ || system_proxy.is_some()
+ || tun_mode.is_some()
+ || common_tray_icon.is_some()
+ || sysproxy_tray_icon.is_some()
+ || tun_tray_icon.is_some()
+ || tray_icon.is_some()
+ {
+ should_update_systray_part = true;
+ }
+ if should_restart_core {
+ Config::generate().await?;
+ CoreManager::global().restart_core().await?;
+ }
+ if should_update_clash_config {
+ update_core_config(false).await?;
+ }
+ if should_update_launch {
+ sysopt::Sysopt::global().update_launch()?;
+ }
+
+ if should_update_sysproxy {
+ sysopt::Sysopt::global().update_sysproxy().await?;
}
if let Some(hotkeys) = patch.hotkeys {
hotkey::Hotkey::global().update(hotkeys)?;
}
- if language.is_some() {
- handle::Handle::update_systray()?;
- } else if system_proxy.is_some()
- || tun_mode.is_some()
- || common_tray_icon.is_some()
- || sysproxy_tray_icon.is_some()
- || tun_tray_icon.is_some()
- {
- handle::Handle::update_systray_part()?;
- }
- #[cfg(target_os = "macos")]
- if tray_icon.is_some() {
+ if should_update_systray_part {
handle::Handle::update_systray_part()?;
}
@@ -247,6 +249,7 @@ pub async fn patch_verge(patch: IVerge) -> Result<()> {
Ok(()) => {
Config::verge().apply();
Config::verge().data().save_file()?;
+
Ok(())
}
Err(err) => {
@@ -288,29 +291,34 @@ pub async fn update_profile(uid: String, option: Option) -> Result<()
};
if should_update {
- update_core_config().await?;
+ update_core_config(true).await?;
}
Ok(())
}
/// 更新订阅
-async fn update_core_config() -> Result<()> {
+async fn update_core_config(notice: bool) -> Result<()> {
match CoreManager::global().update_config().await {
Ok(_) => {
handle::Handle::refresh_clash();
- handle::Handle::notice_message("set_config::ok", "ok");
+ if notice {
+ handle::Handle::notice_message("set_config::ok", "ok");
+ }
Ok(())
}
Err(err) => {
- handle::Handle::notice_message("set_config::error", format!("{err}"));
+ if notice {
+ handle::Handle::notice_message("set_config::error", format!("{err}"));
+ }
Err(err)
}
}
}
/// copy env variable
-pub fn copy_clash_env(app_handle: &AppHandle) {
+pub fn copy_clash_env() {
+ let app_handle = handle::Handle::global().app_handle().unwrap();
let port = { Config::verge().latest().verge_mixed_port.unwrap_or(7897) };
let http_proxy = format!("http://127.0.0.1:{}", port);
let socks5_proxy = format!("socks5://127.0.0.1:{}", port);
diff --git a/clash-verge-rev/src-tauri/src/lib.rs b/clash-verge-rev/src-tauri/src/lib.rs
new file mode 100644
index 0000000000..d73b20fabd
--- /dev/null
+++ b/clash-verge-rev/src-tauri/src/lib.rs
@@ -0,0 +1,179 @@
+mod cmds;
+mod config;
+mod core;
+mod enhance;
+mod feat;
+mod utils;
+
+use crate::core::hotkey;
+use crate::utils::{resolve, resolve::resolve_scheme, server};
+#[cfg(target_os = "macos")]
+use tauri::Listener;
+
+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()?;
+ }
+ #[cfg(target_os = "macos")]
+ {
+ app.listen("deep-link://new-url", |event| {
+ tauri::async_runtime::spawn(async move {
+ let payload = event.payload();
+ log_err!(resolve_scheme(payload.to_owned()).await);
+ });
+ });
+ }
+ tauri::async_runtime::block_on(async move {
+ resolve::resolve_setup(app).await;
+
+ #[cfg(not(target_os = "macos"))]
+ {
+ let argvs: Vec = std::env::args().collect();
+ if argvs.len() > 1 {
+ log_err!(resolve_scheme(argvs[1].to_owned()).await);
+ }
+ }
+ });
+
+ Ok(())
+ })
+ .invoke_handler(tauri::generate_handler![
+ // common
+ cmds::get_sys_proxy,
+ cmds::get_auto_proxy,
+ cmds::open_app_dir,
+ cmds::open_logs_dir,
+ cmds::open_web_url,
+ cmds::open_core_dir,
+ cmds::get_portable_flag,
+ cmds::get_network_interfaces,
+ // cmds::kill_sidecar,
+ cmds::restart_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,
+ // 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(|_, e| match e {
+ tauri::RunEvent::ExitRequested { api, code, .. } => {
+ if code.is_none() {
+ api.prevent_exit();
+ }
+ }
+ tauri::RunEvent::WindowEvent { label, event, .. } => {
+ if label == "main" {
+ match event {
+ tauri::WindowEvent::CloseRequested { .. } => {
+ println!("closing window...");
+ 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")]
+ {
+ 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::Destroyed => {
+ #[cfg(target_os = "macos")]
+ {
+ log_err!(hotkey::Hotkey::global().unregister("CMD+Q"));
+ }
+
+ #[cfg(not(target_os = "macos"))]
+ {
+ log_err!(hotkey::Hotkey::global().unregister("Control+Q"));
+ };
+ }
+ _ => {}
+ }
+ }
+ }
+ _ => {}
+ });
+}
diff --git a/clash-verge-rev/src-tauri/src/main.rs b/clash-verge-rev/src-tauri/src/main.rs
old mode 100644
new mode 100755
index fe0fb9c9c2..293b1b22a0
--- a/clash-verge-rev/src-tauri/src/main.rs
+++ b/clash-verge-rev/src-tauri/src/main.rs
@@ -1,139 +1,4 @@
-#![cfg_attr(
- all(not(debug_assertions), target_os = "windows"),
- windows_subsystem = "windows"
-)]
-
-mod cmds;
-mod config;
-mod core;
-mod enhance;
-mod feat;
-mod utils;
-
-use crate::utils::{resolve, server};
-
-fn main() -> std::io::Result<()> {
- // 单例检测
- let app_exists: bool = tauri::async_runtime::block_on(async move {
- if server::check_singleton().await.is_err() {
- println!("app exists");
- true
- } else {
- false
- }
- });
- if app_exists {
- return Ok(());
- }
-
- #[cfg(target_os = "linux")]
- std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1");
-
- #[cfg(debug_assertions)]
- let devtools = tauri_plugin_devtools::init();
-
- #[allow(unused_mut)]
- let mut builder = tauri::Builder::default()
- .plugin(tauri_plugin_updater::Builder::new().build())
- .plugin(tauri_plugin_clipboard_manager::init())
- .plugin(tauri_plugin_process::init())
- .plugin(tauri_plugin_global_shortcut::Builder::new().build())
- .plugin(tauri_plugin_notification::init())
- .plugin(tauri_plugin_fs::init())
- .plugin(tauri_plugin_dialog::init())
- .plugin(tauri_plugin_shell::init())
- .setup(|app| {
- tauri::async_runtime::block_on(async move {
- resolve::resolve_setup(app).await;
- });
- Ok(())
- })
- .invoke_handler(tauri::generate_handler![
- // common
- cmds::get_sys_proxy,
- cmds::get_auto_proxy,
- cmds::open_app_dir,
- cmds::open_logs_dir,
- cmds::open_web_url,
- cmds::open_core_dir,
- cmds::get_portable_flag,
- cmds::get_network_interfaces,
- // cmds::kill_sidecar,
- cmds::restart_sidecar,
- // clash
- cmds::get_clash_info,
- cmds::get_clash_logs,
- cmds::patch_clash_config,
- cmds::change_clash_core,
- cmds::get_runtime_config,
- cmds::get_runtime_yaml,
- cmds::get_runtime_exists,
- cmds::get_runtime_logs,
- cmds::uwp::invoke_uwp_tool,
- cmds::copy_clash_env,
- // verge
- cmds::get_verge_config,
- cmds::patch_verge_config,
- cmds::test_delay,
- cmds::get_app_dir,
- cmds::copy_icon_file,
- cmds::download_icon_cache,
- cmds::open_devtools,
- cmds::exit_app,
- cmds::get_network_interfaces_info,
- // cmds::update_hotkeys,
- // profile
- cmds::get_profiles,
- cmds::enhance_profiles,
- cmds::patch_profiles_config,
- cmds::view_profile,
- cmds::patch_profile,
- cmds::create_profile,
- cmds::import_profile,
- cmds::reorder_profile,
- cmds::update_profile,
- cmds::delete_profile,
- cmds::read_profile_file,
- cmds::save_profile_file,
- // service mode
- cmds::service::check_service,
- cmds::service::install_service,
- cmds::service::uninstall_service,
- // clash api
- cmds::clash_api_get_proxy_delay
- ]);
-
- #[cfg(debug_assertions)]
- {
- builder = builder.plugin(devtools);
- }
-
- let app = builder
- .build(tauri::generate_context!())
- .expect("error while running tauri application");
-
- app.run(|app_handle, e| match e {
- tauri::RunEvent::ExitRequested { api, .. } => {
- api.prevent_exit();
- }
- tauri::RunEvent::WindowEvent { label, event, .. } => {
- if label == "main" {
- match event {
- tauri::WindowEvent::Destroyed => {
- let _ = resolve::save_window_size_position(app_handle, true);
- }
- tauri::WindowEvent::CloseRequested { .. } => {
- let _ = resolve::save_window_size_position(app_handle, true);
- }
- tauri::WindowEvent::Moved(_) | tauri::WindowEvent::Resized(_) => {
- let _ = resolve::save_window_size_position(app_handle, false);
- }
- _ => {}
- }
- }
- }
- _ => {}
- });
-
- Ok(())
+#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
+fn main() {
+ app_lib::run();
}
diff --git a/clash-verge-rev/src-tauri/src/utils/dirs.rs b/clash-verge-rev/src-tauri/src/utils/dirs.rs
index 227e126181..cf0f94420d 100644
--- a/clash-verge-rev/src-tauri/src/utils/dirs.rs
+++ b/clash-verge-rev/src-tauri/src/utils/dirs.rs
@@ -44,40 +44,27 @@ pub fn app_home_dir() -> Result {
.ok_or(anyhow::anyhow!("failed to get the portable app dir"))?;
return Ok(PathBuf::from(app_dir).join(".config").join(APP_ID));
}
+ let app_handle = handle::Handle::global().app_handle().unwrap();
- let handle = handle::Handle::global();
- let app_handle = handle.app_handle.lock();
-
- if let Some(app_handle) = app_handle.as_ref() {
- match app_handle.path().data_dir() {
- Ok(dir) => {
- return Ok(dir.join(APP_ID));
- }
- Err(e) => {
- log::error!("Failed to get the app home directory: {}", e);
- return Err(anyhow::anyhow!("Failed to get the app homedirectory"));
- }
+ match app_handle.path().data_dir() {
+ Ok(dir) => Ok(dir.join(APP_ID)),
+ Err(e) => {
+ log::error!(target:"app", "Failed to get the app home directory: {}", e);
+ Err(anyhow::anyhow!("Failed to get the app homedirectory"))
}
}
- Err(anyhow::anyhow!("failed to get the app home dir"))
}
/// get the resources dir
pub fn app_resources_dir() -> Result {
- let handle = handle::Handle::global();
- let app_handle = handle.app_handle.lock();
- if let Some(app_handle) = app_handle.as_ref() {
- match app_handle.path().resource_dir() {
- Ok(dir) => {
- return Ok(dir.join("resources"));
- }
- Err(e) => {
- log::error!("Failed to get the resource directory: {}", e);
- return Err(anyhow::anyhow!("Failed to get the resource directory"));
- }
- };
- };
- Err(anyhow::anyhow!("failed to get the resource dir"))
+ let app_handle = handle::Handle::global().app_handle().unwrap();
+ match app_handle.path().resource_dir() {
+ Ok(dir) => Ok(dir.join("resources")),
+ Err(e) => {
+ log::error!(target:"app", "Failed to get the resource directory: {}", e);
+ Err(anyhow::anyhow!("Failed to get the resource directory"))
+ }
+ }
}
/// profiles dir
@@ -102,11 +89,7 @@ pub fn profiles_path() -> Result {
Ok(app_home_dir()?.join(PROFILE_YAML))
}
-pub fn clash_pid_path() -> Result {
- Ok(app_home_dir()?.join("clash.pid"))
-}
-
-#[cfg(not(target_os = "windows"))]
+#[cfg(target_os = "macos")]
pub fn service_path() -> Result {
Ok(app_resources_dir()?.join("clash-verge-service"))
}
diff --git a/clash-verge-rev/src-tauri/src/utils/error.rs b/clash-verge-rev/src-tauri/src/utils/error.rs
new file mode 100644
index 0000000000..d661b6099c
--- /dev/null
+++ b/clash-verge-rev/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/clash-verge-rev/src-tauri/src/utils/help.rs b/clash-verge-rev/src-tauri/src/utils/help.rs
index 3583540a63..35279187cf 100644
--- a/clash-verge-rev/src-tauri/src/utils/help.rs
+++ b/clash-verge-rev/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("pkexec").output() {
+ Ok(output) => {
+ if !output.stdout.is_empty() {
+ // Convert the output to a string slice
+ if let Ok(path) = std::str::from_utf8(&output.stdout) {
+ path.trim().to_string()
+ } else {
+ "sudo".to_string()
+ }
+ } else {
+ "sudo".to_string()
+ }
+ }
+ Err(_) => "sudo".to_string(),
+ }
+}
+
#[macro_export]
macro_rules! error {
($result: expr) => {
diff --git a/clash-verge-rev/src-tauri/src/utils/init.rs b/clash-verge-rev/src-tauri/src/utils/init.rs
index 621450a0c9..609012af4e 100644
--- a/clash-verge-rev/src-tauri/src/utils/init.rs
+++ b/clash-verge-rev/src-tauri/src/utils/init.rs
@@ -1,4 +1,5 @@
use crate::config::*;
+use crate::core::handle;
use crate::utils::{dirs, help};
use anyhow::Result;
use chrono::{Local, TimeZone};
@@ -10,7 +11,6 @@ use log4rs::encode::pattern::PatternEncoder;
use std::fs::{self, DirEntry};
use std::path::PathBuf;
use std::str::FromStr;
-use tauri::AppHandle;
use tauri_plugin_shell::ShellExt;
/// initialize this instance's log file
@@ -44,21 +44,9 @@ fn init_log() -> Result<()> {
let log_more = log_level == LevelFilter::Trace || log_level == LevelFilter::Debug;
- #[cfg(feature = "verge-dev")]
- {
- logger_builder = logger_builder.appenders(["file", "stdout"]);
- if log_more {
- root_builder = root_builder.appenders(["file", "stdout"]);
- } else {
- root_builder = root_builder.appenders(["stdout"]);
- }
- }
- #[cfg(not(feature = "verge-dev"))]
- {
- logger_builder = logger_builder.appenders(["file"]);
- if log_more {
- root_builder = root_builder.appenders(["file"]);
- }
+ logger_builder = logger_builder.appenders(["file"]);
+ if log_more {
+ root_builder = root_builder.appenders(["file"]);
}
let (config, _) = log4rs::config::Config::builder()
@@ -207,8 +195,10 @@ pub fn init_resources() -> Result<()> {
#[cfg(target_os = "windows")]
let file_list = ["Country.mmdb", "geoip.dat", "geosite.dat"];
- #[cfg(not(target_os = "windows"))]
+ #[cfg(target_os = "macos")]
let file_list = ["Country.mmdb", "geoip.dat", "geosite.dat"];
+ #[cfg(target_os = "linux")]
+ let file_list: [&str; 0] = [];
// copy the resource file
// if the source file is newer than the destination file, copy it over
@@ -216,12 +206,13 @@ pub fn init_resources() -> Result<()> {
let src_path = res_dir.join(file);
let dest_path = app_dir.join(file);
let test_dest_path = test_dir.join(file);
+ log::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}")
}
};
};
@@ -297,7 +288,9 @@ pub fn init_scheme() -> Result<()> {
Ok(())
}
-pub async fn startup_script(app_handle: &AppHandle) -> Result<()> {
+pub async fn startup_script() -> Result<()> {
+ let app_handle = handle::Handle::global().app_handle().unwrap();
+
let script_path = {
let verge = Config::verge();
let verge = verge.latest();
@@ -330,7 +323,7 @@ pub async fn startup_script(app_handle: &AppHandle) -> Result<()> {
app_handle
.shell()
.command(shell_type)
- .current_dir(working_dir.to_path_buf())
+ .current_dir(working_dir)
.args(&[script_path])
.output()
.await?;
diff --git a/clash-verge-rev/src-tauri/src/utils/mod.rs b/clash-verge-rev/src-tauri/src/utils/mod.rs
index 28eacc3bb3..b5ee04e7fc 100644
--- a/clash-verge-rev/src-tauri/src/utils/mod.rs
+++ b/clash-verge-rev/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/clash-verge-rev/src-tauri/src/utils/resolve.rs b/clash-verge-rev/src-tauri/src/utils/resolve.rs
index 079004e6ea..28b6adc92d 100644
--- a/clash-verge-rev/src-tauri/src/utils/resolve.rs
+++ b/clash-verge-rev/src-tauri/src/utils/resolve.rs
@@ -1,12 +1,15 @@
-use crate::cmds::import_profile;
use crate::config::IVerge;
-use crate::{config::Config, core::*, utils::init, utils::server};
-use crate::{log_err, trace_err};
-use anyhow::Result;
+use crate::utils::error;
+use crate::{config::Config, config::PrfItem, core::*, utils::init, utils::server};
+use crate::{log_err, trace_err, wrap_err};
+use anyhow::{bail, Result};
use once_cell::sync::OnceCell;
+use percent_encoding::percent_decode_str;
use serde_yaml::Mapping;
use std::net::TcpListener;
-use tauri::{App, AppHandle, Manager};
+use tauri::{App, Manager};
+
+use url::Url;
//#[cfg(not(target_os = "linux"))]
// use window_shadows::set_shadow;
use tauri_plugin_notification::NotificationExt;
@@ -32,90 +35,66 @@ pub fn find_unused_port() -> Result {
/// handle something when start app
pub async fn resolve_setup(app: &mut App) {
+ error::redirect_panic_to_log();
#[cfg(target_os = "macos")]
app.set_activation_policy(tauri::ActivationPolicy::Accessory);
let version = app.package_info().version.to_string();
+
handle::Handle::global().init(app.app_handle());
VERSION.get_or_init(|| version.clone());
+
log_err!(init::init_config());
log_err!(init::init_resources());
log_err!(init::init_scheme());
- log_err!(init::startup_script(app.app_handle()).await);
+ log_err!(init::startup_script().await);
// 处理随机端口
- let enable_random_port = Config::verge().latest().enable_random_port.unwrap_or(false);
-
- let mut port = Config::verge()
- .latest()
- .verge_mixed_port
- .unwrap_or(Config::clash().data().get_mixed_port());
-
- if enable_random_port {
- port = find_unused_port().unwrap_or(
- Config::verge()
- .latest()
- .verge_mixed_port
- .unwrap_or(Config::clash().data().get_mixed_port()),
- );
- }
-
- Config::verge().data().patch_config(IVerge {
- verge_mixed_port: Some(port),
- ..IVerge::default()
- });
- let _ = Config::verge().data().save_file();
- let mut mapping = Mapping::new();
- mapping.insert("mixed-port".into(), port.into());
- Config::clash().data().patch_config(mapping);
- let _ = Config::clash().data().save_config();
-
+ log_err!(resolve_random_port_config());
// 启动核心
- log::trace!("init config");
-
+ log::trace!(target:"app", "init config");
log_err!(Config::init_config().await);
- log::trace!("launch core");
- log_err!(CoreManager::global().init(app.app_handle()));
+ if service::check_service().await.is_err() {
+ 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");
- server::embed_server(app.app_handle());
+ log::trace!(target: "app", "launch embed server");
+ server::embed_server();
- log::trace!("init system tray");
- log_err!(tray::Tray::update_systray(&app.app_handle()));
+ log::trace!(target: "app", "init system tray");
+ log_err!(tray::Tray::create_systray());
let silent_start = { Config::verge().data().enable_silent_start };
if !silent_start.unwrap_or(false) {
- create_window(&app.app_handle());
+ create_window();
}
log_err!(sysopt::Sysopt::global().init_launch());
- log_err!(sysopt::Sysopt::global().init_sysproxy());
+ log_err!(sysopt::Sysopt::global().update_sysproxy().await);
+ log_err!(sysopt::Sysopt::global().init_guard_sysproxy());
log_err!(handle::Handle::update_systray_part());
- log_err!(hotkey::Hotkey::global().init(app.app_handle()));
+ log_err!(hotkey::Hotkey::global().init());
log_err!(timer::Timer::global().init());
-
- let argvs: Vec = std::env::args().collect();
- if argvs.len() > 1 {
- let param = argvs[1].as_str();
- if param.starts_with("clash:") {
- log_err!(resolve_scheme(argvs[1].to_owned()).await);
- }
- }
}
/// reset system proxy
pub fn resolve_reset() {
- log_err!(sysopt::Sysopt::global().reset_sysproxy());
tauri::async_runtime::block_on(async move {
+ log_err!(sysopt::Sysopt::global().reset_sysproxy().await);
log_err!(CoreManager::global().stop_core().await);
- log_err!(service::unset_dns_by_service().await);
});
}
/// 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 = 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");
@@ -123,7 +102,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()),
)
@@ -179,7 +158,7 @@ pub fn create_window(app_handle: &AppHandle) {
.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!(""))?;
@@ -212,7 +191,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 = handle::Handle::global().app_handle().unwrap();
let verge = Config::verge();
let mut verge = verge.latest();
@@ -238,34 +218,103 @@ 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!(target:"app", "received deep link: {}", param);
- let handle = handle::Handle::global();
- let app_handle = handle.app_handle.lock().clone();
- if let Some(app_handle) = app_handle.as_ref() {
- match import_profile(url.to_string(), None).await {
- Ok(_) => {
- app_handle
- .notification()
- .builder()
- .title("Clash Verge")
- .body("Import profile success")
- .show()
- .unwrap();
- }
- Err(e) => {
- app_handle
- .notification()
- .builder()
- .title("Clash Verge")
- .body(format!("Import profile failed: {e}"))
- .show()
- .unwrap();
- log::error!("Import profile failed: {e}");
+ let app_handle = handle::Handle::global().app_handle().unwrap();
+
+ let param_str = if param.starts_with("[") && param.len() > 4 {
+ param
+ .get(2..param.len() - 2)
+ .ok_or_else(|| anyhow::anyhow!("Invalid string slice boundaries"))?
+ } else {
+ param.as_str()
+ };
+
+ // 解析 URL
+ let link_parsed = match Url::parse(param_str) {
+ Ok(url) => url,
+ Err(e) => {
+ bail!("failed to parse deep link: {:?}, param: {:?}", e, param);
+ }
+ };
+
+ if link_parsed.scheme() == "clash" || link_parsed.scheme() == "clash-verge" {
+ let name = link_parsed
+ .query_pairs()
+ .find(|(key, _)| key == "name")
+ .map(|(_, value)| value.into_owned());
+
+ let encode_url = link_parsed
+ .query_pairs()
+ .find(|(key, _)| key == "url")
+ .map(|(_, value)| value.into_owned());
+
+ match encode_url {
+ Some(url) => {
+ let url = percent_decode_str(url.as_ref())
+ .decode_utf8_lossy()
+ .to_string();
+
+ create_window();
+ match PrfItem::from_url(url.as_ref(), name, None, None).await {
+ Ok(item) => {
+ let uid = item.uid.clone().unwrap();
+ let _ = wrap_err!(Config::profiles().data().append_item(item));
+ app_handle
+ .notification()
+ .builder()
+ .title("Clash Verge")
+ .body("Import profile success")
+ .show()
+ .unwrap();
+
+ handle::Handle::notice_message("import_sub_url::ok", uid);
+ }
+ Err(e) => {
+ app_handle
+ .notification()
+ .builder()
+ .title("Clash Verge")
+ .body(format!("Import profile failed: {e}"))
+ .show()
+ .unwrap();
+ handle::Handle::notice_message("import_sub_url::error", e.to_string());
+ bail!("Failed to add subscriptions: {e}");
+ }
+ }
}
+ None => bail!("failed to get profile url"),
}
}
+
+ Ok(())
+}
+
+fn resolve_random_port_config() -> Result<()> {
+ let verge_config = Config::verge();
+ let clash_config = Config::clash();
+ let enable_random_port = verge_config.latest().enable_random_port.unwrap_or(false);
+
+ let default_port = verge_config
+ .latest()
+ .verge_mixed_port
+ .unwrap_or(clash_config.data().get_mixed_port());
+
+ let port = if enable_random_port {
+ find_unused_port().unwrap_or(default_port)
+ } else {
+ default_port
+ };
+
+ verge_config.data().patch_config(IVerge {
+ verge_mixed_port: Some(port),
+ ..IVerge::default()
+ });
+ verge_config.data().save_file()?;
+
+ let mut mapping = Mapping::new();
+ mapping.insert("mixed-port".into(), port.into());
+ clash_config.data().patch_config(mapping);
+ clash_config.data().save_config()?;
Ok(())
}
diff --git a/clash-verge-rev/src-tauri/src/utils/server.rs b/clash-verge-rev/src-tauri/src/utils/server.rs
index 3090da3642..2f2b20bb3d 100644
--- a/clash-verge-rev/src-tauri/src/utils/server.rs
+++ b/clash-verge-rev/src-tauri/src/utils/server.rs
@@ -2,11 +2,10 @@ extern crate warp;
use super::resolve;
use crate::config::{Config, IVerge, DEFAULT_PAC};
+use crate::log_err;
use anyhow::{bail, Result};
use port_scanner::local_port_available;
use std::convert::Infallible;
-use tauri::AppHandle;
-use warp::http::StatusCode;
use warp::Filter;
#[derive(serde::Deserialize, Debug)]
@@ -17,36 +16,24 @@ struct QueryParam {
/// check whether there is already exists
pub async fn check_singleton() -> Result<()> {
let port = IVerge::get_singleton_port();
-
if !local_port_available(port) {
- let resp = reqwest::get(format!("http://127.0.0.1:{port}/commands/ping"))
- .await?
- .text()
- .await?;
-
- if &resp == "ok" {
- let argvs: Vec = std::env::args().collect();
- if argvs.len() > 1 {
+ let argvs: Vec = std::env::args().collect();
+ if argvs.len() > 1 {
+ #[cfg(not(target_os = "macos"))]
+ {
let param = argvs[1].as_str();
if param.starts_with("clash:") {
- reqwest::get(format!(
+ let _ = reqwest::get(format!(
"http://127.0.0.1:{port}/commands/scheme?param={param}"
))
- .await?
- .text()
- .await?;
+ .await;
}
- } else {
- reqwest::get(format!("http://127.0.0.1:{port}/commands/visible"))
- .await?
- .text()
- .await?;
}
- bail!("app exists");
+ } else {
+ let _ = reqwest::get(format!("http://127.0.0.1:{port}/commands/visible")).await;
}
-
log::error!("failed to setup singleton listen server");
- Ok(())
+ bail!("app exists");
} else {
Ok(())
}
@@ -54,15 +41,12 @@ pub async fn check_singleton() -> Result<()> {
/// The embed server only be used to implement singleton process
/// maybe it can be used as pac server later
-pub fn embed_server(app_handle: &AppHandle) {
+pub fn embed_server() {
let port = IVerge::get_singleton_port();
- let handle = app_handle.clone();
tauri::async_runtime::spawn(async move {
- let ping = warp::path!("commands" / "ping").map(move || "ok");
-
let visible = warp::path!("commands" / "visible").map(move || {
- resolve::create_window(&handle);
+ resolve::create_window();
"ok"
});
@@ -82,21 +66,15 @@ pub fn embed_server(app_handle: &AppHandle) {
.body(content)
.unwrap_or_default()
});
+ async fn scheme_handler(query: QueryParam) -> Result {
+ log_err!(resolve::resolve_scheme(query.param).await);
+ Ok("ok")
+ }
+
let scheme = warp::path!("commands" / "scheme")
.and(warp::query::())
.and_then(scheme_handler);
-
- async fn scheme_handler(query: QueryParam) -> Result {
- let result = resolve::resolve_scheme(query.param).await;
- Ok(match result {
- Ok(_) => warp::reply::with_status("Ok", StatusCode::OK),
- Err(_) => {
- warp::reply::with_status("Internal Error", StatusCode::INTERNAL_SERVER_ERROR)
- }
- })
- }
-
- let commands = ping.or(visible).or(pac).or(scheme);
+ let commands = visible.or(scheme).or(pac);
warp::serve(commands).run(([127, 0, 0, 1], port)).await;
});
}
diff --git a/clash-verge-rev/src-tauri/tauri.conf.json b/clash-verge-rev/src-tauri/tauri.conf.json
old mode 100644
new mode 100755
index 0876ef18ad..668f19c48b
--- a/clash-verge-rev/src-tauri/tauri.conf.json
+++ b/clash-verge-rev/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": {
@@ -25,7 +25,7 @@
"devUrl": "http://localhost:3000/"
},
"productName": "Clash Verge",
- "version": "2.0.0",
+ "version": "2.0.0-rc.2",
"identifier": "io.github.clash-verge-rev.clash-verge-rev",
"plugins": {
"updater": {
@@ -34,6 +34,11 @@
"https://download.clashverge.dev/https://github.com/clash-verge-rev/clash-verge-rev/releases/download/updater/update-proxy.json",
"https://github.com/clash-verge-rev/clash-verge-rev/releases/download/updater/update.json"
]
+ },
+ "deep-link": {
+ "desktop": {
+ "schemes": ["clash", "clash-verge"]
+ }
}
},
"app": {
@@ -44,7 +49,6 @@
"enable": true
},
"csp": null
- },
- "windows": []
+ }
}
}
diff --git a/clash-verge-rev/src-tauri/tauri.linux.conf.json b/clash-verge-rev/src-tauri/tauri.linux.conf.json
index eb8e2aee72..7493b2704c 100644
--- a/clash-verge-rev/src-tauri/tauri.linux.conf.json
+++ b/clash-verge-rev/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": {
@@ -17,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": {
diff --git a/clash-verge-rev/src-tauri/tauri.macos.conf.json b/clash-verge-rev/src-tauri/tauri.macos.conf.json
index 21748a571c..95dc299afc 100644
--- a/clash-verge-rev/src-tauri/tauri.macos.conf.json
+++ b/clash-verge-rev/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/clash-verge-rev/src-tauri/tauri.windows.conf.json b/clash-verge-rev/src-tauri/tauri.windows.conf.json
index f3a7d6adec..84047f1bf7 100644
--- a/clash-verge-rev/src-tauri/tauri.windows.conf.json
+++ b/clash-verge-rev/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": {
@@ -23,6 +24,7 @@
"trayIcon": {
"iconPath": "icons/tray-icon.ico",
"iconAsTemplate": true
- }
+ },
+ "windows": []
}
}
diff --git a/clash-verge-rev/src/components/layout/layout-control.tsx b/clash-verge-rev/src/components/layout/layout-control.tsx
index eda6a8c3bd..bd12afd5d2 100644
--- a/clash-verge-rev/src/components/layout/layout-control.tsx
+++ b/clash-verge-rev/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()}
>
diff --git a/clash-verge-rev/src/components/setting/mods/layout-viewer.tsx b/clash-verge-rev/src/components/setting/mods/layout-viewer.tsx
index 4253545d14..be0d70cd28 100644
--- a/clash-verge-rev/src/components/setting/mods/layout-viewer.tsx
+++ b/clash-verge-rev/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/clash-verge-rev/src/components/setting/mods/service-switcher.tsx b/clash-verge-rev/src/components/setting/mods/service-switcher.tsx
deleted file mode 100644
index 9dd2d5a6c9..0000000000
--- a/clash-verge-rev/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/clash-verge-rev/src/components/setting/mods/update-viewer.tsx b/clash-verge-rev/src/components/setting/mods/update-viewer.tsx
index d0887e6f3b..ca600ff68a 100644
--- a/clash-verge-rev/src/components/setting/mods/update-viewer.tsx
+++ b/clash-verge-rev/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/clash-verge-rev/src/components/setting/setting-system.tsx b/clash-verge-rev/src/components/setting/setting-system.tsx
index 7686c8f622..7f5799cb96 100644
--- a/clash-verge-rev/src/components/setting/setting-system.tsx
+++ b/clash-verge-rev/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,34 +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 });
}}
>
-
-
-
-
-
{
},
],
});
- if (selected?.path.length) {
- onChangeData({ startup_script: `${selected.path}` });
- patchVerge({ startup_script: `${selected.path}` });
+ if (selected) {
+ onChangeData({ startup_script: `${selected}` });
+ patchVerge({ startup_script: `${selected}` });
}
}}
>
@@ -243,7 +243,7 @@ const SettingVerge = ({ onError }: Props) => {
label={t("Runtime Config")}
/>
-
+
diff --git a/clash-verge-rev/src/components/test/test-item.tsx b/clash-verge-rev/src/components/test/test-item.tsx
index faee6e37a5..dfb75315b8 100644
--- a/clash-verge-rev/src/components/test/test-item.tsx
+++ b/clash-verge-rev/src/components/test/test-item.tsx
@@ -18,9 +18,9 @@ import { Notice } from "@/components/base";
import { TestBox } from "./test-box";
import delayManager from "@/services/delay";
import { cmdTestDelay, downloadIconCache } from "@/services/cmds";
-import { listen, UnlistenFn } from "@tauri-apps/api/event";
+import { UnlistenFn } from "@tauri-apps/api/event";
import { convertFileSrc } from "@tauri-apps/api/core";
-
+import { useListen } from "@/hooks/use-listen";
interface Props {
id: string;
itemData: IVergeTestItem;
@@ -47,6 +47,7 @@ export const TestItem = (props: Props) => {
const [delay, setDelay] = useState(-1);
const { uid, name, icon, url } = itemData;
const [iconCachePath, setIconCachePath] = useState("");
+ const { addListener } = useListen();
useEffect(() => {
initIconCachePath();
@@ -91,7 +92,7 @@ export const TestItem = (props: Props) => {
const listenTsetEvent = async () => {
eventListener();
- eventListener = await listen("verge://test-all", () => {
+ eventListener = await addListener("verge://test-all", () => {
onDelay();
});
};
diff --git a/clash-verge-rev/src/components/test/test-viewer.tsx b/clash-verge-rev/src/components/test/test-viewer.tsx
index 00d7f8d08b..97601fecff 100644
--- a/clash-verge-rev/src/components/test/test-viewer.tsx
+++ b/clash-verge-rev/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("