diff options
Diffstat (limited to 'src-tauri')
58 files changed, 2161 insertions, 6023 deletions
diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore new file mode 100644 index 00000000..b21bd681 --- /dev/null +++ b/src-tauri/.gitignore @@ -0,0 +1,7 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Generated by Tauri +# will have schema files for capabilities auto-completion +/gen/schemas diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index bf6d8e3a..1700ce57 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1,27 +1,27 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" -version = "0.20.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aes" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", @@ -30,9 +30,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -69,128 +69,120 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.89" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] -name = "arboard" -version = "3.2.1" +name = "arbitrary" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac57f2b058a76363e357c056e4f74f1945bf734d37b8b3ef49066c4787dde0fc" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" dependencies = [ - "clipboard-win", - "core-graphics", - "image", - "log", - "objc", - "objc-foundation", - "objc_id", - "parking_lot", - "thiserror", - "winapi", - "wl-clipboard-rs", - "x11rb", + "derive_arbitrary", ] [[package]] name = "arc-swap" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "async-broadcast" -version = "0.5.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" +checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" dependencies = [ "event-listener", + "event-listener-strategy", "futures-core", + "pin-project-lite", ] [[package]] name = "async-channel" -version = "1.9.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", - "event-listener", + "event-listener-strategy", "futures-core", + "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.5.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" dependencies = [ - "async-lock", "async-task", "concurrent-queue", - "fastrand 1.9.0", + "fastrand", "futures-lite", "slab", ] [[package]] name = "async-fs" -version = "1.6.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" dependencies = [ "async-lock", - "autocfg", "blocking", "futures-lite", ] [[package]] name = "async-io" -version = "1.13.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ "async-lock", - "autocfg", "cfg-if", "concurrent-queue", + "futures-io", "futures-lite", - "log", "parking", "polling", - "rustix 0.37.23", + "rustix", "slab", - "socket2 0.4.9", - "waker-fn", + "tracing", + "windows-sys 0.59.0", ] [[package]] name = "async-lock" -version = "2.7.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ "event-listener", + "event-listener-strategy", + "pin-project-lite", ] [[package]] name = "async-process" -version = "1.7.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9d28b1d97e08915212e2e45310d47854eafa69600756fc735fb788f75199c9" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" dependencies = [ + "async-channel", "async-io", "async-lock", - "autocfg", + "async-signal", + "async-task", "blocking", "cfg-if", "event-listener", "futures-lite", - "rustix 0.37.23", - "signal-hook", - "windows-sys 0.48.0", + "rustix", + "tracing", ] [[package]] @@ -201,94 +193,105 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", +] + +[[package]] +name = "async-signal" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.59.0", ] [[package]] name = "async-task" -version = "4.4.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.72" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "atk" -version = "0.15.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" dependencies = [ "atk-sys", - "bitflags 1.3.2", "glib", "libc", ] [[package]] name = "atk-sys" -version = "0.15.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.1", + "system-deps", ] [[package]] name = "atomic-waker" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.1.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.68" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] name = "base64" -version = "0.13.1" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" -version = "0.21.2" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" - -[[package]] -name = "base64" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" @@ -304,9 +307,12 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.3" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] [[package]] name = "block" @@ -324,25 +330,32 @@ dependencies = [ ] [[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] name = "blocking" -version = "1.3.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" dependencies = [ "async-channel", - "async-lock", "async-task", - "atomic-waker", - "fastrand 1.9.0", + "futures-io", "futures-lite", - "log", + "piper", ] [[package]] name = "brotli" -version = "3.3.4" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -351,53 +364,37 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.3.4" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", ] [[package]] -name = "bstr" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" -dependencies = [ - "memchr", - "serde", -] - -[[package]] name = "bumpalo" -version = "3.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" - -[[package]] -name = "bytecount" -version = "0.6.7" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.13.1" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.4.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" dependencies = [ "serde", ] @@ -425,46 +422,80 @@ dependencies = [ [[package]] name = "cairo-rs" -version = "0.15.12" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "cairo-sys-rs", "glib", "libc", - "thiserror", + "once_cell", + "thiserror 1.0.69", ] [[package]] name = "cairo-sys-rs" -version = "0.15.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" dependencies = [ "glib-sys", "libc", - "system-deps 6.1.1", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 1.0.69", ] [[package]] name = "cargo_toml" -version = "0.15.3" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" +checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719" dependencies = [ "serde", - "toml 0.7.6", + "toml 0.8.2", ] [[package]] name = "cc" -version = "1.0.83" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" dependencies = [ "jobserver", "libc", + "shlex", ] [[package]] @@ -486,18 +517,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.9.1" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" -dependencies = [ - "smallvec", -] - -[[package]] -name = "cfg-expr" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b40ccee03b5175c18cde8f37e7d2a33bcef6f8ec8f7cc0d81090d1bb380949c9" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" dependencies = [ "smallvec", "target-lexicon", @@ -510,10 +532,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -521,7 +549,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -535,58 +563,40 @@ dependencies = [ ] [[package]] -name = "clipboard-win" -version = "4.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362" -dependencies = [ - "error-code", - "str-buf", - "winapi", -] - -[[package]] name = "cocoa" -version = "0.24.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "block", "cocoa-foundation", - "core-foundation", + "core-foundation 0.10.0", "core-graphics", - "foreign-types", + "foreign-types 0.5.0", "libc", "objc", ] [[package]] name = "cocoa-foundation" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" +checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "block", - "core-foundation", + "core-foundation 0.10.0", "core-graphics-types", - "foreign-types", "libc", "objc", ] [[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - -[[package]] name = "combine" -version = "4.6.6" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ "bytes", "memchr", @@ -594,27 +604,27 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.2.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] [[package]] name = "const_format" -version = "0.2.33" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" dependencies = [ "const_format_proc_macros", ] [[package]] name = "const_format_proc_macros" -version = "0.2.33" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" dependencies = [ "proc-macro2", "quote", @@ -634,10 +644,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + +[[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" dependencies = [ "core-foundation-sys", "libc", @@ -645,39 +675,39 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "core-graphics" -version = "0.22.3" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 1.3.2", - "core-foundation", + "bitflags 2.6.0", + "core-foundation 0.10.0", "core-graphics-types", - "foreign-types", + "foreign-types 0.5.0", "libc", ] [[package]] name = "core-graphics-types" -version = "0.1.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 1.3.2", - "core-foundation", + "bitflags 2.6.0", + "core-foundation 0.10.0", "libc", ] [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -699,55 +729,46 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset 0.9.0", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto-common" @@ -783,24 +804,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "ctor" -version = "0.2.6" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "darling" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -808,27 +829,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -863,27 +884,27 @@ dependencies = [ ] [[package]] -name = "derive-new" -version = "0.5.9" +name = "derive_arbitrary" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] name = "derive_more" -version = "0.99.17" +version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] @@ -907,16 +928,6 @@ dependencies = [ ] [[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] name = "dirs-sys" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -929,27 +940,53 @@ dependencies = [ ] [[package]] -name = "dirs-sys-next" -version = "0.1.2" +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "dlopen2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" dependencies = [ + "dlopen2_derive", "libc", - "redox_users", + "once_cell", "winapi", ] [[package]] -name = "dispatch" -version = "0.2.0" +name = "dlopen2_derive" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] [[package]] -name = "downcast-rs" -version = "1.2.0" +name = "dpi" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +dependencies = [ + "serde", +] [[package]] name = "dtoa" @@ -959,36 +996,43 @@ checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" [[package]] name = "dtoa-short" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" dependencies = [ "dtoa", ] [[package]] name = "dunce" -version = "1.0.4" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "either" -version = "1.9.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "embed-resource" -version = "2.2.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7f1e82a60222fc67bfd50d752a9c89da5cce4c39ed39decc84a443b07bbd69a" +checksum = "b68b6f9f63a0b6a38bc447d4ce84e2b388f3ec95c99c641c8ff0dd3ef89a6379" dependencies = [ "cc", + "memchr", "rustc_version", - "toml 0.7.6", + "toml 0.8.2", "vswhom", - "winreg 0.11.0", + "winreg 0.52.0", ] [[package]] @@ -999,18 +1043,24 @@ checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" [[package]] name = "encoding_rs" -version = "0.8.32" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] [[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + +[[package]] name = "enumflags2" -version = "0.7.7" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c041f5090df68b32bcd905365fd51769c8b9d553fe87fde0b683534f10c01bd2" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" dependencies = [ "enumflags2_derive", "serde", @@ -1018,20 +1068,20 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.7" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "env_logger" -version = "0.10.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ "humantime", "is-terminal", @@ -1047,62 +1097,57 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "errno" -version = "0.3.2" +name = "erased-serde" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" +checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", + "serde", + "typeid", ] [[package]] -name = "errno-dragonfly" -version = "0.1.2" +name = "errno" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ - "cc", "libc", + "windows-sys 0.59.0", ] [[package]] -name = "error-code" -version = "2.3.1" +name = "event-listener" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ - "libc", - "str-buf", + "concurrent-queue", + "parking", + "pin-project-lite", ] [[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "fastrand" -version = "1.9.0" +name = "event-listener-strategy" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ - "instant", + "event-listener", + "pin-project-lite", ] [[package]] name = "fastrand" -version = "2.0.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fdeflate" -version = "0.3.0" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" dependencies = [ "simd-adler32", ] @@ -1113,20 +1158,20 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" dependencies = [ - "memoffset 0.9.0", + "memoffset", "rustc_version", ] [[package]] name = "filetime" -version = "0.2.21" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.16", - "windows-sys 0.48.0", + "libredox", + "windows-sys 0.59.0", ] [[package]] @@ -1142,16 +1187,10 @@ dependencies = [ ] [[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] name = "flate2" -version = "1.0.26" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", @@ -1171,7 +1210,7 @@ dependencies = [ "libthermite", "log", "octocrab", - "open 5.3.0", + "open", "pretty_env_logger", "rand 0.8.5", "regex", @@ -1186,12 +1225,12 @@ dependencies = [ "sysinfo", "tauri", "tauri-build", - "tauri-plugin-store", + "tauri-plugin-opener", "tokio", "ts-rs", "winapi", "winreg 0.52.0", - "zip", + "zip 0.6.6", "zip-extract", ] @@ -1207,7 +1246,28 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] @@ -1217,10 +1277,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -1237,9 +1303,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1252,9 +1318,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1262,15 +1328,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1279,53 +1345,51 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "1.13.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ - "fastrand 1.9.0", + "fastrand", "futures-core", "futures-io", - "memchr", "parking", "pin-project-lite", - "waker-fn", ] [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1350,11 +1414,10 @@ dependencies = [ [[package]] name = "gdk" -version = "0.15.4" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" dependencies = [ - "bitflags 1.3.2", "cairo-rs", "gdk-pixbuf", "gdk-sys", @@ -1366,35 +1429,35 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.15.11" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" dependencies = [ - "bitflags 1.3.2", "gdk-pixbuf-sys", "gio", "glib", "libc", + "once_cell", ] [[package]] name = "gdk-pixbuf-sys" -version = "0.15.10" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" dependencies = [ "gio-sys", "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.1", + "system-deps", ] [[package]] name = "gdk-sys" -version = "0.15.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -1404,47 +1467,48 @@ dependencies = [ "libc", "pango-sys", "pkg-config", - "system-deps 6.1.1", + "system-deps", ] [[package]] name = "gdkwayland-sys" -version = "0.15.3" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cca49a59ad8cfdf36ef7330fe7bdfbe1d34323220cc16a0de2679ee773aee2c2" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" dependencies = [ "gdk-sys", "glib-sys", "gobject-sys", "libc", "pkg-config", - "system-deps 6.1.1", + "system-deps", ] [[package]] -name = "gdkx11-sys" -version = "0.15.1" +name = "gdkx11" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" dependencies = [ - "gdk-sys", - "glib-sys", + "gdk", + "gdkx11-sys", + "gio", + "glib", "libc", - "system-deps 6.1.1", "x11", ] [[package]] -name = "generator" -version = "0.7.5" +name = "gdkx11-sys" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" dependencies = [ - "cc", + "gdk-sys", + "glib-sys", "libc", - "log", - "rustversion", - "windows 0.48.0", + "system-deps", + "x11", ] [[package]] @@ -1458,16 +1522,6 @@ dependencies = [ ] [[package]] -name = "gethostname" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" -dependencies = [ - "libc", - "winapi", -] - -[[package]] name = "getrandom" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1480,9 +1534,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -1493,83 +1547,87 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.3" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "gio" -version = "0.15.12" +version = "0.18.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" dependencies = [ - "bitflags 1.3.2", "futures-channel", "futures-core", "futures-io", + "futures-util", "gio-sys", "glib", "libc", "once_cell", - "thiserror", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", ] [[package]] name = "gio-sys" -version = "0.15.10" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.1", + "system-deps", "winapi", ] [[package]] name = "glib" -version = "0.15.12" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "futures-channel", "futures-core", "futures-executor", "futures-task", + "futures-util", + "gio-sys", "glib-macros", "glib-sys", "gobject-sys", "libc", + "memchr", "once_cell", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "glib-macros" -version = "0.15.13" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" dependencies = [ - "anyhow", "heck 0.4.1", - "proc-macro-crate", + "proc-macro-crate 2.0.2", "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] name = "glib-sys" -version = "0.15.10" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" dependencies = [ "libc", - "system-deps 6.1.1", + "system-deps", ] [[package]] @@ -1579,37 +1637,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] -name = "globset" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aca8bbd8e0707c1887a8bbb7e6b40e228f251ff5d62c8220a4a7a53c73aff006" -dependencies = [ - "aho-corasick", - "bstr", - "fnv", - "log", - "regex", -] - -[[package]] name = "gobject-sys" -version = "0.15.10" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" dependencies = [ "glib-sys", "libc", - "system-deps 6.1.1", + "system-deps", ] [[package]] name = "gtk" -version = "0.15.5" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" dependencies = [ "atk", - "bitflags 1.3.2", "cairo-rs", "field-offset", "futures-channel", @@ -1620,16 +1664,15 @@ dependencies = [ "gtk-sys", "gtk3-macros", "libc", - "once_cell", "pango", "pkg-config", ] [[package]] name = "gtk-sys" -version = "0.15.3" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" dependencies = [ "atk-sys", "cairo-sys-rs", @@ -1640,36 +1683,35 @@ dependencies = [ "gobject-sys", "libc", "pango-sys", - "system-deps 6.1.1", + "system-deps", ] [[package]] name = "gtk3-macros" -version = "0.15.6" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" dependencies = [ - "anyhow", - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] name = "h2" -version = "0.3.20" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http 0.2.9", - "indexmap 1.9.3", + "http 0.2.12", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -1684,18 +1726,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" @@ -1711,9 +1744,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" [[package]] name = "hex" @@ -1731,6 +1764,15 @@ dependencies = [ ] [[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] name = "hostname" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1757,77 +1799,71 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", - "itoa 1.0.9", + "itoa 1.0.14", ] [[package]] name = "http" -version = "1.0.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", - "itoa 1.0.9", + "itoa 1.0.14", ] [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http 0.2.9", + "http 0.2.12", "pin-project-lite", ] [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.0.0", + "http 1.2.0", ] [[package]] name = "http-body-util" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.0.0", - "http-body 1.0.0", + "http 1.2.0", + "http-body 1.0.1", "pin-project-lite", ] [[package]] -name = "http-range" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" - -[[package]] name = "httparse" -version = "1.8.0" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" @@ -1837,22 +1873,22 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", "futures-core", "futures-util", "h2", - "http 0.2.9", - "http-body 0.4.5", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", - "itoa 1.0.9", + "itoa 1.0.14", "pin-project-lite", - "socket2 0.4.9", + "socket2", "tokio", "tower-service", "tracing", @@ -1861,18 +1897,19 @@ dependencies = [ [[package]] name = "hyper" -version = "1.1.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.0.0", - "http-body 1.0.0", + "http 1.2.0", + "http-body 1.0.1", "httparse", - "itoa 1.0.9", + "itoa 1.0.14", "pin-project-lite", + "smallvec", "tokio", "want", ] @@ -1884,11 +1921,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" dependencies = [ "futures-util", - "http 1.0.0", - "hyper 1.1.0", + "http 1.2.0", + "hyper 1.5.2", "hyper-util", "log", - "rustls 0.22.2", + "rustls 0.22.4", "rustls-native-certs", "rustls-pki-types", "tokio", @@ -1898,11 +1935,11 @@ dependencies = [ [[package]] name = "hyper-timeout" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 1.1.0", + "hyper 1.5.2", "hyper-util", "pin-project-lite", "tokio", @@ -1916,7 +1953,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.27", + "hyper 0.14.32", "native-tls", "tokio", "tokio-native-tls", @@ -1930,7 +1967,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.1.0", + "hyper 1.5.2", "hyper-util", "native-tls", "tokio", @@ -1940,36 +1977,35 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.0.0", - "http-body 1.0.0", - "hyper 1.1.0", + "http 1.2.0", + "http-body 1.0.1", + "hyper 1.5.2", "pin-project-lite", - "socket2 0.5.5", + "socket2", "tokio", - "tower", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows 0.48.0", + "windows-core 0.52.0", ] [[package]] @@ -1992,51 +2028,148 @@ dependencies = [ ] [[package]] -name = "ident_case" -version = "1.0.1" +name = "icu_collections" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] [[package]] -name = "idna" -version = "0.4.0" +name = "icu_locid" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", ] [[package]] -name = "ignore" -version = "0.4.20" +name = "icu_locid_transform" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" dependencies = [ - "globset", - "lazy_static", - "log", - "memchr", - "regex", - "same-file", - "thread_local", - "walkdir", - "winapi-util", + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", ] [[package]] -name = "image" -version = "0.24.6" +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "num-rational", - "num-traits", - "png", - "tiff", + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] @@ -2052,19 +2185,20 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.5" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.15.2", + "serde", ] [[package]] name = "infer" -version = "0.13.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f551f8c3a39f68f986517db0d1759de85881894fdc7db798bd2a9df9cb04b7fc" +checksum = "bc150e5ce2330295b8616ce0e3f53250e53af31759a9dbedad1621ba29151847" dependencies = [ "cfb", ] @@ -2080,35 +2214,24 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] [[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.48.0", -] - -[[package]] name = "ipnet" -version = "2.8.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "iri-string" -version = "0.7.0" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21859b667d66a4c1dacd9df0863b3efb65785474255face87f5bca39dd8407c0" +checksum = "dc0f0a572e8ffe56e2ff4f769f32ffe919282c3916799f8b68688b6030063bea" dependencies = [ "memchr", "serde", @@ -2125,13 +2248,13 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ "hermit-abi", - "rustix 0.38.6", - "windows-sys 0.48.0", + "libc", + "windows-sys 0.52.0", ] [[package]] @@ -2152,15 +2275,15 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "javascriptcore-rs" -version = "0.16.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" dependencies = [ "bitflags 1.3.2", "glib", @@ -2169,28 +2292,30 @@ dependencies = [ [[package]] name = "javascriptcore-rs-sys" -version = "0.4.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 5.0.0", + "system-deps", ] [[package]] name = "jni" -version = "0.20.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ "cesu8", + "cfg-if", "combine", "jni-sys", "log", - "thiserror", + "thiserror 1.0.69", "walkdir", + "windows-sys 0.45.0", ] [[package]] @@ -2201,38 +2326,33 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] -name = "jpeg-decoder" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" - -[[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "json-patch" -version = "1.2.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ff1e1486799e3f64129f8ccad108b38290df9cd7015cd31bed17239f0789d6" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" dependencies = [ + "jsonptr", "serde", "serde_json", - "thiserror", - "treediff", + "thiserror 1.0.69", ] [[package]] @@ -2247,21 +2367,42 @@ dependencies = [ ] [[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] name = "jsonwebtoken" -version = "9.2.0" +version = "9.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7ea04a7c5c055c175f189b6dc6ba036fd62306b58c66c9f6389036c503a3f4" +checksum = "b9ae10193d25051e74945f1ea2d0b42e03cc3b890f7e4cc5faa44997d808193f" dependencies = [ - "base64 0.21.2", + "base64 0.21.7", "js-sys", "pem", - "ring 0.17.7", + "ring", "serde", "serde_json", "simple_asn1", ] [[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.6.0", + "serde", + "unicode-segmentation", +] + +[[package]] name = "keyvalues-parser" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2269,7 +2410,7 @@ checksum = "7e4c8354918309196302015ac9cae43362f1a13d0d5c5539a33b4c2fd2cd6d25" dependencies = [ "pest", "pest_derive", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2280,7 +2421,7 @@ checksum = "0447866c47c00f8bd1949618e8f63017cf93e985b4684dc28d784527e2882390" dependencies = [ "keyvalues-parser", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2298,86 +2439,112 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libappindicator" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] [[package]] name = "libc" -version = "0.2.153" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", + "redox_syscall", +] [[package]] name = "libthermite" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c27ac02c14161a4b0db739b37618d929d7f2af320c1f993e3d674599f77b79e7" +checksum = "878f5ca735da1a3365239d6fcb3a403c5cd347896e9a45d864b9fbfad727298e" dependencies = [ "flate2", "json5", - "lazy_static", "regex", "serde", "serde_json", "tar", - "thiserror", + "thiserror 1.0.69", "tracing", "ureq", - "zip", -] - -[[package]] -name = "line-wrap" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" -dependencies = [ - "safemem", + "zip 2.2.2", ] [[package]] name = "linux-raw-sys" -version = "0.3.8" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] -name = "linux-raw-sys" -version = "0.4.5" +name = "litemap" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", ] [[package]] -name = "log" -version = "0.4.22" +name = "lockfree-object-pool" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" [[package]] -name = "loom" -version = "0.5.6" +name = "log" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "serde", - "serde_json", - "tracing", - "tracing-subscriber", -] +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "mac" @@ -2386,19 +2553,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" [[package]] -name = "mac-notification-sys" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abc434554ad0e640d772f7f262aa28e61d485212533d3673abe5f3d1729bd42a" -dependencies = [ - "cc", - "dirs-next", - "objc-foundation", - "objc_id", - "time", -] - -[[package]] name = "malloc_buf" version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2422,15 +2576,6 @@ dependencies = [ ] [[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - -[[package]] name = "matches" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2438,33 +2583,15 @@ checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "memchr" -version = "2.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" - -[[package]] -name = "memoffset" -version = "0.6.5" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memoffset" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] @@ -2476,46 +2603,52 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "minisign-verify" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "933dca44d65cdd53b355d0b73d380a2ff5da71f87f036053188bf1eab6a19881" - -[[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ - "adler", + "adler2", "simd-adler32", ] [[package]] name = "mio" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi", "libc", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] [[package]] +name = "muda" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdae9c00e61cc0579bcac625e8ad22104c60548a025bfc972dc83868a28e1484" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 1.0.69", + "windows-sys 0.59.0", +] + +[[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -2529,15 +2662,17 @@ dependencies = [ [[package]] name = "ndk" -version = "0.6.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "jni-sys", + "log", "ndk-sys", "num_enum", - "thiserror", + "raw-window-handle", + "thiserror 1.0.69", ] [[package]] @@ -2548,42 +2683,29 @@ checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] name = "ndk-sys" -version = "0.3.0" +version = "0.6.0+11769913" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" dependencies = [ "jni-sys", ] [[package]] name = "new_debug_unreachable" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nix" -version = "0.24.3" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "cfg-if", "libc", - "memoffset 0.6.5", -] - -[[package]] -name = "nix" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", - "memoffset 0.7.1", - "static_assertions", + "memoffset", ] [[package]] @@ -2593,29 +2715,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" [[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "notify-rust" -version = "4.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bfa211d18e360f08e36c364308f394b5eb23a6629150690e109a916dc6f610e" -dependencies = [ - "log", - "mac-notification-sys", - "serde", - "tauri-winrt-notification", - "zbus", -] - -[[package]] name = "ntapi" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2625,22 +2724,11 @@ dependencies = [ ] [[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -2653,53 +2741,41 @@ checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", - "num-integer", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "num_enum" -version = "0.5.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.5.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] @@ -2709,43 +2785,231 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", - "objc_exception", ] [[package]] -name = "objc-foundation" -version = "0.1.1" +name = "objc-sys" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" dependencies = [ - "block", - "objc", - "objc_id", + "cc", ] [[package]] -name = "objc_exception" -version = "0.1.2" +name = "objc2" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" dependencies = [ - "cc", + "objc-sys", + "objc2-encode", ] [[package]] -name = "objc_id" -version = "0.1.1" +name = "objc2-app-kit" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "objc", + "bitflags 2.6.0", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.6.0", + "block2", + "libc", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "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]] name = "object" -version = "0.31.1" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -2758,17 +3022,17 @@ checksum = "68a8a3df00728324ad654ecd1ed449a60157c55b7ff8c109af3a35989687c367" dependencies = [ "arc-swap", "async-trait", - "base64 0.22.0", + "base64 0.22.1", "bytes", "cfg-if", "chrono", "either", "futures", "futures-util", - "http 1.0.0", - "http-body 1.0.0", + "http 1.2.0", + "http-body 1.0.1", "http-body-util", - "hyper 1.1.0", + "hyper 1.5.2", "hyper-rustls", "hyper-timeout", "hyper-util", @@ -2791,25 +3055,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "open" -version = "3.2.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8" -dependencies = [ - "pathdiff", - "windows-sys 0.42.0", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "open" -version = "5.3.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a877bf6abd716642a53ef1b89fb498923a4afca5c754f9050b4d081c05c4b3" +checksum = "3ecd52f0b8d15c40ce4820aa251ed5de032e5d91fab27f7db2f40d42a8bdf69c" dependencies = [ "is-wsl", "libc", @@ -2818,13 +3072,13 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.55" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "cfg-if", - "foreign-types", + "foreign-types 0.3.2", "libc", "once_cell", "openssl-macros", @@ -2839,7 +3093,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -2850,9 +3104,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.90" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", @@ -2878,38 +3132,22 @@ dependencies = [ [[package]] name = "os_info" -version = "3.7.0" +version = "3.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "006e42d5b888366f1880eda20371fedde764ed2213dc8496f49622fa0c99cd5e" +checksum = "eb6651f4be5e39563c4fe5cc8326349eb99a25d805a3493f791d5bfd0269e430" dependencies = [ "log", "serde", - "winapi", -] - -[[package]] -name = "os_pipe" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae859aa07428ca9a929b936690f8b12dc5f11dd8c6992a18ca93919f28bc177" -dependencies = [ - "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] name = "pango" -version = "0.15.10" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" dependencies = [ - "bitflags 1.3.2", + "gio", "glib", "libc", "once_cell", @@ -2918,27 +3156,27 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.15.10" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.1", + "system-deps", ] [[package]] name = "parking" -version = "2.1.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -2946,15 +3184,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall", "smallvec", - "windows-targets 0.48.1", + "windows-targets 0.52.6", ] [[package]] @@ -2970,9 +3208,9 @@ dependencies = [ [[package]] name = "pathdiff" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "pbkdf2" @@ -2988,35 +3226,36 @@ dependencies = [ [[package]] name = "pem" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8fcc794035347fb64beda2d3b462595dd2753e3f268d89c5aae77e8cf2c310" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" dependencies = [ - "base64 0.21.2", + "base64 0.22.1", "serde", ] [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.2" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1acb4a4365a13f749a93f1a094a7805e5cfa0955373a9de860d962eaa3a5fe5a" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ - "thiserror", + "memchr", + "thiserror 2.0.9", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.7.2" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666d00490d4ac815001da55838c500eafb0320019bbaa44444137c48b443a853" +checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" dependencies = [ "pest", "pest_generator", @@ -3024,22 +3263,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.2" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ca01446f50dbda87c1786af8770d535423fa8a53aec03b8f4e3d7eb10e0929" +checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "pest_meta" -version = "2.7.2" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56af0a30af74d0445c0bf6d9d051c979b516a1a5af790d251daee76005420a48" +checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" dependencies = [ "once_cell", "pest", @@ -3047,16 +3286,6 @@ dependencies = [ ] [[package]] -name = "petgraph" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" -dependencies = [ - "fixedbitset", - "indexmap 2.2.5", -] - -[[package]] name = "phf" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3160,7 +3389,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -3192,29 +3421,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.4" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.4" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -3223,30 +3452,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "plist" -version = "1.5.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdc0001cfea3db57a2e24bc0d818e9e20e554b5f97fabb9bc231dc240269ae06" +checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" dependencies = [ - "base64 0.21.2", - "indexmap 1.9.3", - "line-wrap", - "quick-xml 0.29.0", + "base64 0.22.1", + "indexmap 2.7.0", + "quick-xml", "serde", "time", ] [[package]] name = "png" -version = "0.17.9" +version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59871cc5b6cce7eaccca5a802b4173377a1c2ba90654246789a8fa2334426d11" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -3257,18 +3496,17 @@ dependencies = [ [[package]] name = "polling" -version = "2.8.0" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ - "autocfg", - "bitflags 1.3.2", "cfg-if", "concurrent-queue", - "libc", - "log", + "hermit-abi", "pin-project-lite", - "windows-sys 0.48.0", + "rustix", + "tracing", + "windows-sys 0.59.0", ] [[package]] @@ -3279,9 +3517,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "precomputed-hash" @@ -3306,7 +3547,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime", + "toml_edit 0.20.2", ] [[package]] @@ -3350,27 +3601,18 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.23.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11bafc859c6815fbaffbbbf4229ecb767ac913fecb27f9ad4343662e9ef099ea" -dependencies = [ - "memchr", -] - -[[package]] -name = "quick-xml" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b9228215d82c7b61490fec1de287136b5de6f5700f6e58ea9ad61a7964ca51" +checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" dependencies = [ "memchr", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -3435,7 +3677,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.15", ] [[package]] @@ -3458,15 +3700,15 @@ dependencies = [ [[package]] name = "raw-window-handle" -version = "0.5.2" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] name = "rayon" -version = "1.8.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -3484,76 +3726,52 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.10", - "redox_syscall 0.2.16", - "thiserror", + "getrandom 0.2.15", + "libredox", + "thiserror 1.0.69", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.4", - "regex-syntax 0.8.2", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.4.4" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7fa1134405e2ec9353fd416b17f8dacd46c473d7d3fd1cf202706a14eb792a" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.2" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "remove-markdown-links" @@ -3570,15 +3788,15 @@ version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ - "base64 0.21.2", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", "futures-util", "h2", - "http 0.2.9", - "http-body 0.4.5", - "hyper 0.14.27", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", "hyper-tls 0.5.0", "ipnet", "js-sys", @@ -3592,35 +3810,33 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "system-configuration", "tokio", "tokio-native-tls", - "tokio-util", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", - "wasm-streams", "web-sys", "winreg 0.50.0", ] [[package]] name = "reqwest" -version = "0.12.4" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ - "base64 0.22.0", + "base64 0.22.1", "bytes", "futures-channel", "futures-core", "futures-util", - "http 1.0.0", - "http-body 1.0.0", + "http 1.2.0", + "http-body 1.0.1", "http-body-util", - "hyper 1.1.0", + "hyper 1.5.2", "hyper-tls 0.6.0", "hyper-util", "ipnet", @@ -3631,150 +3847,103 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile 2.0.0", + "rustls-pemfile 2.2.0", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.2", "tokio", "tokio-native-tls", + "tokio-util", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", + "wasm-streams", "web-sys", - "winreg 0.52.0", -] - -[[package]] -name = "rfd" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" -dependencies = [ - "block", - "dispatch", - "glib-sys", - "gobject-sys", - "gtk-sys", - "js-sys", - "lazy_static", - "log", - "objc", - "objc-foundation", - "objc_id", - "raw-window-handle", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows 0.37.0", -] - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", + "windows-registry", ] [[package]] name = "ring" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", - "getrandom 0.2.10", + "cfg-if", + "getrandom 0.2.15", "libc", - "spin 0.9.8", - "untrusted 0.9.0", - "windows-sys 0.48.0", + "spin", + "untrusted", + "windows-sys 0.52.0", ] [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "rustix" -version = "0.37.23" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "errno", - "io-lifetimes", "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustix" -version = "0.38.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee020b1716f0a80e2ace9b03441a749e402e86712f15f16fe8a8f75afac732f" -dependencies = [ - "bitflags 2.3.3", - "errno", - "libc", - "linux-raw-sys 0.4.5", - "windows-sys 0.48.0", + "linux-raw-sys", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.21.6" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" dependencies = [ "log", - "ring 0.16.20", - "rustls-webpki 0.101.2", - "sct", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", ] [[package]] name = "rustls" -version = "0.22.2" +version = "0.23.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" dependencies = [ "log", - "ring 0.17.7", + "once_cell", + "ring", "rustls-pki-types", - "rustls-webpki 0.102.2", + "rustls-webpki", "subtle", "zeroize", ] [[package]] name = "rustls-native-certs" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" dependencies = [ "openssl-probe", - "rustls-pemfile 2.0.0", + "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", "security-framework", @@ -3786,73 +3955,40 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.2", + "base64 0.21.7", ] [[package]] name = "rustls-pemfile" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.21.2", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a716eb65e3158e90e17cd93d855216e27bde02745ab842f2cab4a39dba1bacf" - -[[package]] -name = "rustls-webpki" -version = "0.100.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - -[[package]] -name = "rustls-webpki" -version = "0.101.2" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513722fd73ad80a71f72b61009ea1b584bcfa1483ca93949c8f290298837fa59" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" [[package]] name = "rustls-webpki" -version = "0.102.2" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ - "ring 0.17.7", + "ring", "rustls-pki-types", - "untrusted 0.9.0", + "untrusted", ] [[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - -[[package]] name = "ryu" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[package]] -name = "safemem" -version = "0.3.3" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -3865,34 +4001,45 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] -name = "scoped-tls" -version = "1.0.1" +name = "schemars" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] [[package]] -name = "scopeguard" -version = "1.2.0" +name = "schemars_derive" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.91", +] [[package]] -name = "sct" -version = "0.7.0" +name = "scopeguard" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "secrecy" @@ -3905,12 +4052,12 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.2" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 1.3.2", - "core-foundation", + "bitflags 2.6.0", + "core-foundation 0.9.4", "core-foundation-sys", "libc", "security-framework-sys", @@ -3918,9 +4065,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" dependencies = [ "core-foundation-sys", "libc", @@ -3948,9 +4095,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" dependencies = [ "serde", ] @@ -3963,7 +4110,7 @@ checksum = "00421ed8fa0c995f07cde48ba6c89e80f2b312f74ff637326f392fbfd23abe02" dependencies = [ "httpdate", "native-tls", - "reqwest 0.12.4", + "reqwest 0.12.9", "sentry-backtrace", "sentry-contexts", "sentry-core 0.32.3", @@ -4079,7 +4226,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "time", "url", "uuid", @@ -4096,7 +4243,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "time", "url", "uuid", @@ -4104,32 +4251,53 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.215" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" dependencies = [ "serde_derive", ] [[package]] +name = "serde-untagged" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2676ba99bd82f75cae5cbd2c8eda6fa0b8760f18978ea840e980dd5567b5c5b6" +dependencies = [ + "erased-serde", + "serde", + "typeid", +] + +[[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" dependencies = [ - "indexmap 2.2.5", - "itoa 1.0.9", + "itoa 1.0.14", "memchr", "ryu", "serde", @@ -4137,30 +4305,30 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd154a240de39fdebcf5775d2675c204d7c13cf39a4c697be6493c8e734337c" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" dependencies = [ - "itoa 1.0.9", + "itoa 1.0.14", "serde", ] [[package]] name = "serde_repr" -version = "0.1.16" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -4172,22 +4340,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.9", + "itoa 1.0.14", "ryu", "serde", ] [[package]] name = "serde_with" -version = "3.1.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e47d95bc83ed33b2ecf84f4187ad1ab9685d18ff28db000c99deac8ce180e3" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ - "base64 0.21.2", + "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", + "indexmap 2.7.0", "serde", + "serde_derive", "serde_json", "serde_with_macros", "time", @@ -4195,14 +4365,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.1.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea3cee93715c2e266b9338b7544da68a9f24e227722ba482bd1c024367c77c65" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -4239,9 +4409,9 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", @@ -4250,9 +4420,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -4260,39 +4430,16 @@ dependencies = [ ] [[package]] -name = "sharded-slab" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shared_child" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "signal-hook" -version = "0.3.17" +name = "shlex" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" -dependencies = [ - "libc", - "signal-hook-registry", -] +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -4311,108 +4458,112 @@ checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" dependencies = [ "num-bigint", "num-traits", - "thiserror", + "thiserror 1.0.69", "time", ] [[package]] name = "siphasher" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "smallvec" -version = "1.11.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "snafu" -version = "0.8.1" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ed22871b3fe6eff9f1b48f6cbd54149ff8e9acd740dea9146092435f9c43bd3" +checksum = "223891c85e2a29c3fe8fb900c1fae5e69c2e42415e3177752e8718475efa5019" dependencies = [ "snafu-derive", ] [[package]] name = "snafu-derive" -version = "0.8.1" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4651148226ec36010993fcba6c3381552e8463e9f3e337b75af202b0688b5274" +checksum = "03c3c6b7927ffe7ecaa769ee0e3994da3b8cafc8f444578982c83ecb161af917" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "socket2" -version = "0.4.9" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", - "winapi", + "windows-sys 0.52.0", ] [[package]] -name = "socket2" -version = "0.5.5" +name = "softbuffer" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" dependencies = [ - "libc", - "windows-sys 0.48.0", + "bytemuck", + "cfg_aliases", + "core-graphics", + "foreign-types 0.5.0", + "js-sys", + "log", + "objc2", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "wasm-bindgen", + "web-sys", + "windows-sys 0.59.0", ] [[package]] -name = "soup2" -version = "0.2.1" +name = "soup3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" dependencies = [ - "bitflags 1.3.2", + "futures-channel", "gio", "glib", "libc", - "once_cell", - "soup2-sys", + "soup3-sys", ] [[package]] -name = "soup2-sys" -version = "0.2.0" +name = "soup3-sys" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" dependencies = [ - "bitflags 1.3.2", "gio-sys", "glib-sys", "gobject-sys", "libc", - "system-deps 5.0.0", + "system-deps", ] [[package]] name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" @@ -4424,15 +4575,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] -name = "state" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" -dependencies = [ - "loom", -] - -[[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4440,25 +4582,19 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "steamlocate" -version = "2.0.0-beta.2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3b6a4810c4e7fecb0123a9a8ba99b335c17d92e636c265ef99108ee4734c812" +checksum = "cb96708f2e7cadc6c5bde3f3e12e3d6565bbd4d8b9e3da057035881c33136d9d" dependencies = [ "crc", - "dirs", + "home", "keyvalues-parser", "keyvalues-serde", "serde", - "winreg 0.51.0", + "winreg 0.52.0", ] [[package]] -name = "str-buf" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" - -[[package]] name = "string_cache" version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4486,15 +4622,26 @@ dependencies = [ [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "swift-rs" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] [[package]] name = "syn" @@ -4509,9 +4656,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" dependencies = [ "proc-macro2", "quote", @@ -4525,16 +4672,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] -name = "sys-locale" -version = "0.2.4" +name = "sync_wrapper" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a11bd9c338fdba09f7881ab41551932ad42e405f61d01e8406baea71c07aee" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ - "js-sys", - "libc", - "wasm-bindgen", - "web-sys", - "windows-sys 0.45.0", + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] @@ -4559,7 +4713,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -4575,54 +4729,34 @@ dependencies = [ [[package]] name = "system-deps" -version = "5.0.0" +version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" dependencies = [ - "cfg-expr 0.9.1", - "heck 0.3.3", - "pkg-config", - "toml 0.5.11", - "version-compare 0.0.11", -] - -[[package]] -name = "system-deps" -version = "6.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30c2de8a4d8f4b823d634affc9cd2a74ec98c53a756f317e529a48046cbf71f3" -dependencies = [ - "cfg-expr 0.15.4", - "heck 0.4.1", + "cfg-expr", + "heck 0.5.0", "pkg-config", - "toml 0.7.6", - "version-compare 0.1.1", + "toml 0.8.2", + "version-compare", ] [[package]] name = "tao" -version = "0.16.2" +version = "0.30.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6d198e01085564cea63e976ad1566c1ba2c2e4cc79578e35d9f05521505e31" +checksum = "6682a07cf5bab0b8a2bd20d0a542917ab928b5edb75ebd4eda6b05cbaab872da" dependencies = [ - "bitflags 1.3.2", - "cairo-rs", - "cc", + "bitflags 2.6.0", "cocoa", - "core-foundation", + "core-foundation 0.10.0", "core-graphics", "crossbeam-channel", "dispatch", - "gdk", - "gdk-pixbuf", - "gdk-sys", + "dlopen2", + "dpi", "gdkwayland-sys", "gdkx11-sys", - "gio", - "glib", - "glib-sys", "gtk", - "image", "instant", "jni", "lazy_static", @@ -4634,34 +4768,33 @@ dependencies = [ "objc", "once_cell", "parking_lot", - "png", "raw-window-handle", "scopeguard", - "serde", "tao-macros", "unicode-segmentation", - "uuid", - "windows 0.39.0", - "windows-implement", + "url", + "windows 0.58.0", + "windows-core 0.58.0", + "windows-version", "x11-dl", ] [[package]] name = "tao-macros" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b27a4bcc5eb524658234589bdffc7e7bfb996dbae6ce9393bfd39cb4159b445" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] name = "tar" -version = "0.4.39" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec96d2ffad078296368d46ff1cb309be1c23c513b4ab0e22a45de0185275ac96" +checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" dependencies = [ "filetime", "libc", @@ -4670,99 +4803,89 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.11" +version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "1.6.8" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77567d2b3b74de4588d544147142d02297f3eaa171a25a065252141d8597a516" +checksum = "e545de0a2dfe296fa67db208266cd397c5a55ae782da77973ef4c4fac90e9f2c" dependencies = [ "anyhow", - "base64 0.21.2", "bytes", - "cocoa", - "dirs-next", + "dirs", "dunce", "embed_plist", - "encoding_rs", - "flate2", "futures-util", - "getrandom 0.2.10", - "glib", + "getrandom 0.2.15", "glob", "gtk", "heck 0.5.0", - "http 0.2.9", - "ignore", - "indexmap 1.9.3", - "minisign-verify", - "nix 0.26.2", - "notify-rust", - "objc", - "once_cell", - "open 3.2.0", - "os_info", - "os_pipe", + "http 1.2.0", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", "percent-encoding", - "rand 0.8.5", + "plist", "raw-window-handle", - "regex", - "reqwest 0.11.27", - "rfd", - "semver", + "reqwest 0.12.9", "serde", "serde_json", "serde_repr", "serialize-to-javascript", - "shared_child", - "state", - "sys-locale", - "tar", + "swift-rs", + "tauri-build", "tauri-macros", "tauri-runtime", "tauri-runtime-wry", "tauri-utils", - "tempfile", - "thiserror", - "time", + "thiserror 2.0.9", "tokio", + "tray-icon", "url", - "uuid", + "urlpattern", "webkit2gtk", "webview2-com", - "windows 0.39.0", - "zip", + "window-vibrancy", + "windows 0.58.0", ] [[package]] name = "tauri-build" -version = "1.5.2" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab30cba12974d0f9b09794f61e72cad6da2142d3ceb81e519321bab86ce53312" +checksum = "7bd2a4bcfaf5fb9f4be72520eefcb61ae565038f8ccba2a497d8c28f463b8c01" dependencies = [ "anyhow", "cargo_toml", - "dirs-next", + "dirs", + "glob", "heck 0.5.0", "json-patch", + "schemars", "semver", "serde", "serde_json", "tauri-utils", "tauri-winres", + "toml 0.8.2", "walkdir", ] [[package]] name = "tauri-codegen" -version = "1.4.4" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1aed706708ff1200ec12de9cfbf2582b5d8ec05f6a7293911091effbd22036b" +checksum = "bf79faeecf301d3e969b1fae977039edb77a4c1f25cc0a961be298b54bff97cf" dependencies = [ - "base64 0.21.2", + "base64 0.22.1", "brotli", "ico", "json-patch", @@ -4770,98 +4893,130 @@ dependencies = [ "png", "proc-macro2", "quote", - "regex", "semver", "serde", "serde_json", "sha2", + "syn 2.0.91", "tauri-utils", - "thiserror", + "thiserror 2.0.9", "time", + "url", "uuid", "walkdir", ] [[package]] name = "tauri-macros" -version = "1.4.5" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b88f831d2973ae4f81a706a0004e67dac87f2e4439973bbe98efbd73825d8ede" +checksum = "c52027c8c5afb83166dacddc092ee8fff50772f9646d461d8c33ee887e447a03" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", "tauri-codegen", "tauri-utils", ] [[package]] -name = "tauri-plugin-store" -version = "0.0.0" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#4aeee08cde4cf8253b7b52c2204655ac8bb6769d" +name = "tauri-plugin" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e753f2a30933a9bbf0a202fa47d7cc4a3401f06e8d6dcc53b79aa62954828c79" dependencies = [ - "log", + "anyhow", + "glob", + "plist", + "schemars", + "serde", + "serde_json", + "tauri-utils", + "toml 0.8.2", + "walkdir", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63ac39033ef1bb4d52da4878c3d8ab6d80b0a569d69208c884e6d4d54eb427b9" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation", + "open", + "schemars", "serde", "serde_json", "tauri", - "thiserror", + "tauri-plugin", + "thiserror 2.0.9", + "url", + "windows 0.58.0", + "zbus", ] [[package]] name = "tauri-runtime" -version = "0.14.4" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3068ed62b63dedc705558f4248c7ecbd5561f0f8050949859ea0db2326f26012" +checksum = "cce18d43f80d4aba3aa8a0c953bbe835f3d0f2370aca75e8dbb14bd4bab27958" dependencies = [ + "dpi", "gtk", - "http 0.2.9", - "http-range", - "rand 0.8.5", + "http 1.2.0", + "jni", "raw-window-handle", "serde", "serde_json", "tauri-utils", - "thiserror", + "thiserror 2.0.9", "url", - "uuid", - "webview2-com", - "windows 0.39.0", + "windows 0.58.0", ] [[package]] name = "tauri-runtime-wry" -version = "0.14.9" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c3db170233096aa30330feadcd895bf9317be97e624458560a20e814db7955" +checksum = "9f442a38863e10129ffe2cec7bd09c2dcf8a098a3a27801a476a304d5bb991d2" dependencies = [ - "arboard", - "cocoa", "gtk", + "http 1.2.0", + "jni", + "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", "percent-encoding", - "rand 0.8.5", "raw-window-handle", + "softbuffer", + "tao", "tauri-runtime", "tauri-utils", - "uuid", + "url", "webkit2gtk", "webview2-com", - "windows 0.39.0", + "windows 0.58.0", "wry", ] [[package]] name = "tauri-utils" -version = "1.6.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2826db448309d382dac14d520f0c0a40839b87b57b977e59cf5f296b3ace6a93" +checksum = "9271a88f99b4adea0dc71d0baca4505475a0bbd139fb135f62958721aaa8fe54" dependencies = [ "brotli", + "cargo_metadata", "ctor", "dunce", "glob", - "heck 0.5.0", "html5ever", + "http 1.2.0", "infer", "json-patch", "kuchikiki", @@ -4870,14 +5025,20 @@ dependencies = [ "phf 0.11.2", "proc-macro2", "quote", + "regex", + "schemars", "semver", "serde", + "serde-untagged", "serde_json", "serde_with", - "thiserror", + "swift-rs", + "thiserror 2.0.9", + "toml 0.8.2", "url", + "urlpattern", + "uuid", "walkdir", - "windows-version", ] [[package]] @@ -4887,30 +5048,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" dependencies = [ "embed-resource", - "toml 0.7.6", -] - -[[package]] -name = "tauri-winrt-notification" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5bff1d532fead7c43324a0fa33643b8621a47ce2944a633be4cb6c0240898f" -dependencies = [ - "quick-xml 0.23.1", - "windows 0.39.0", + "toml 0.7.8", ] [[package]] name = "tempfile" -version = "3.7.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", - "fastrand 2.0.0", - "redox_syscall 0.3.5", - "rustix 0.38.6", - "windows-sys 0.48.0", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", ] [[package]] @@ -4926,9 +5077,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.2.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] @@ -4941,53 +5092,52 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", ] [[package]] -name = "thiserror-impl" -version = "1.0.58" +name = "thiserror" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", + "thiserror-impl 2.0.9", ] [[package]] -name = "thread_local" -version = "1.1.7" +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "cfg-if", - "once_cell", + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] -name = "tiff" -version = "0.8.1" +name = "thiserror-impl" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7449334f9ff2baf290d55d73983a7d6fa15e01198faef72af07e2a8db851e471" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ - "flate2", - "jpeg-decoder", - "weezl", + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", - "itoa 1.0.9", + "itoa 1.0.14", "num-conv", "powerfmt", "serde", @@ -5003,34 +5153,29 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", ] [[package]] -name = "tinyvec" -version = "1.6.0" +name = "tinystr" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ - "tinyvec_macros", + "displaydoc", + "zerovec", ] [[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] name = "tokio" -version = "1.39.2" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", @@ -5039,7 +5184,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2", "tokio-macros", "windows-sys 0.52.0", ] @@ -5052,7 +5197,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -5071,44 +5216,46 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ - "rustls 0.22.2", + "rustls 0.22.4", "rustls-pki-types", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] name = "toml" -version = "0.5.11" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" dependencies = [ "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.19.15", ] [[package]] name = "toml" -version = "0.7.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.20.2", ] [[package]] @@ -5122,11 +5269,24 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.19.14" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.7.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.7.0", "serde", "serde_spanned", "toml_datetime", @@ -5152,15 +5312,15 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da193277a4e2c33e59e09b5861580c33dd0a637c3883d0fa74ba40c0374af2e" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.6.0", "bytes", "futures-util", - "http 1.0.0", - "http-body 1.0.0", + "http 1.2.0", + "http-body 1.0.1", "http-body-util", "iri-string", "pin-project-lite", @@ -5172,23 +5332,22 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ - "cfg-if", "log", "pin-project-lite", "tracing-attributes", @@ -5197,124 +5356,109 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", ] [[package]] -name = "tracing-log" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" -dependencies = [ - "lazy_static", - "log", - "tracing-core", -] - -[[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", "tracing-core", - "tracing-log", ] [[package]] -name = "tree_magic_mini" -version = "3.0.3" +name = "tray-icon" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91adfd0607cacf6e4babdb870e9bec4037c1c4b151cfd279ccefc5e0c7feaa6d" +checksum = "d48a05076dd272615d03033bf04f480199f7d1b66a8ac64d75c625fc4a70c06b" dependencies = [ - "bytecount", - "fnv", - "lazy_static", - "nom", + "core-graphics", + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", "once_cell", - "petgraph", -] - -[[package]] -name = "treediff" -version = "4.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52984d277bdf2a751072b5df30ec0377febdb02f7696d64c2d7d54630bac4303" -dependencies = [ - "serde_json", + "png", + "serde", + "thiserror 1.0.69", + "windows-sys 0.59.0", ] [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "ts-rs" -version = "10.0.0" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a2f31991cee3dce1ca4f929a8a04fdd11fd8801aac0f2030b0fa8a0a3fef6b9" +checksum = "e640d9b0964e9d39df633548591090ab92f7a4567bc31d3891af23471a3365c6" dependencies = [ "lazy_static", - "thiserror", + "thiserror 2.0.9", "ts-rs-macros", ] [[package]] name = "ts-rs-macros" -version = "10.0.0" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea0b99e8ec44abd6f94a18f28f7934437809dd062820797c52401298116f70e" +checksum = "0e9d8656589772eeec2cf7a8264d9cda40fb28b9bc53118ceb9e8c07f8f38730" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "termcolor", ] [[package]] +name = "typeid" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" + +[[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +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" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" dependencies = [ + "memoffset", "tempfile", "winapi", ] @@ -5329,43 +5473,63 @@ dependencies = [ ] [[package]] -name = "unicode-bidi" -version = "0.3.13" +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" [[package]] -name = "unicode-ident" -version = "1.0.11" +name = "unic-common" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" [[package]] -name = "unicode-normalization" -version = "0.1.22" +name = "unic-ucd-ident" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" dependencies = [ - "tinyvec", + "unic-char-property", + "unic-char-range", + "unic-ucd-version", ] [[package]] -name = "unicode-segmentation" -version = "1.10.1" +name = "unic-ucd-version" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] [[package]] -name = "unicode-xid" -version = "0.2.4" +name = "unicode-ident" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] -name = "untrusted" -version = "0.7.1" +name = "unicode-segmentation" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "untrusted" @@ -5375,26 +5539,26 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.7.1" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b11c96ac7ee530603dcdf68ed1557050f374ce55a5a07193ebf8cbc9f8927e9" +checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" dependencies = [ - "base64 0.21.2", + "base64 0.22.1", "flate2", "log", "native-tls", "once_cell", - "rustls 0.21.6", - "rustls-webpki 0.100.1", + "rustls 0.23.20", + "rustls-pki-types", "url", "webpki-roots", ] [[package]] name = "url" -version = "2.4.0" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", @@ -5403,18 +5567,42 @@ dependencies = [ ] [[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] name = "utf-8" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] name = "uuid" -version = "1.4.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.15", "serde", ] @@ -5432,21 +5620,15 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version-compare" -version = "0.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" - -[[package]] -name = "version-compare" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vswhom" @@ -5469,16 +5651,10 @@ dependencies = [ ] [[package]] -name = "waker-fn" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" - -[[package]] name = "walkdir" -version = "2.3.3" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -5507,46 +5683,47 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5554,28 +5731,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "wasm-streams" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -5585,69 +5762,10 @@ dependencies = [ ] [[package]] -name = "wayland-client" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" -dependencies = [ - "bitflags 1.3.2", - "downcast-rs", - "libc", - "nix 0.24.3", - "wayland-commons", - "wayland-scanner", - "wayland-sys", -] - -[[package]] -name = "wayland-commons" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" -dependencies = [ - "nix 0.24.3", - "once_cell", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-protocols" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" -dependencies = [ - "bitflags 1.3.2", - "wayland-client", - "wayland-commons", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" -dependencies = [ - "proc-macro2", - "quote", - "xml-rs", -] - -[[package]] -name = "wayland-sys" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" -dependencies = [ - "pkg-config", -] - -[[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" dependencies = [ "js-sys", "wasm-bindgen", @@ -5655,9 +5773,9 @@ dependencies = [ [[package]] name = "webkit2gtk" -version = "0.18.2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" +checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" dependencies = [ "bitflags 1.3.2", "cairo-rs", @@ -5673,20 +5791,18 @@ dependencies = [ "javascriptcore-rs", "libc", "once_cell", - "soup2", + "soup3", "webkit2gtk-sys", ] [[package]] name = "webkit2gtk-sys" -version = "0.18.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" +checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" dependencies = [ - "atk-sys", "bitflags 1.3.2", "cairo-sys-rs", - "gdk-pixbuf-sys", "gdk-sys", "gio-sys", "glib-sys", @@ -5694,66 +5810,57 @@ dependencies = [ "gtk-sys", "javascriptcore-rs-sys", "libc", - "pango-sys", "pkg-config", - "soup2-sys", - "system-deps 6.1.1", + "soup3-sys", + "system-deps", ] [[package]] name = "webpki-roots" -version = "0.23.1" +version = "0.26.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03058f88386e5ff5310d9111d53f48b17d732b401aeb83a8d5190f2ac459338" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" dependencies = [ - "rustls-webpki 0.100.1", + "rustls-pki-types", ] [[package]] name = "webview2-com" -version = "0.19.1" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" +checksum = "6f61ff3d9d0ee4efcb461b14eb3acfda2702d10dc329f339303fc3e57215ae2c" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows 0.39.0", + "windows 0.58.0", + "windows-core 0.58.0", "windows-implement", + "windows-interface", ] [[package]] name = "webview2-com-macros" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" +checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] name = "webview2-com-sys" -version = "0.19.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" +checksum = "a3a3e2eeb58f82361c93f9777014668eb3d07e7d174ee4c819575a9208011886" dependencies = [ - "regex", - "serde", - "serde_json", - "thiserror", - "windows 0.39.0", - "windows-bindgen", - "windows-metadata", + "thiserror 1.0.69", + "windows 0.58.0", + "windows-core 0.58.0", ] [[package]] -name = "weezl" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" - -[[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -5771,20 +5878,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-wsapoll" -version = "0.1.1" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -5794,99 +5892,111 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.37.0" +name = "window-vibrancy" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" +checksum = "3ea403deff7b51fff19e261330f71608ff2cdef5721d72b64180bb95be7c4150" dependencies = [ - "windows_aarch64_msvc 0.37.0", - "windows_i686_gnu 0.37.0", - "windows_i686_msvc 0.37.0", - "windows_x86_64_gnu 0.37.0", - "windows_x86_64_msvc 0.37.0", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", ] [[package]] name = "windows" -version = "0.39.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "windows-implement", - "windows_aarch64_msvc 0.39.0", - "windows_i686_gnu 0.39.0", - "windows_i686_msvc 0.39.0", - "windows_x86_64_gnu 0.39.0", - "windows_x86_64_msvc 0.39.0", + "windows-core 0.52.0", + "windows-targets 0.52.6", ] [[package]] name = "windows" -version = "0.48.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-targets 0.48.1", + "windows-core 0.58.0", + "windows-targets 0.52.6", ] [[package]] -name = "windows" +name = "windows-core" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-core", - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] -name = "windows-bindgen" -version = "0.39.0" +name = "windows-core" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ - "windows-metadata", - "windows-tokens", + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets 0.52.6", ] [[package]] -name = "windows-core" -version = "0.52.0" +name = "windows-implement" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ - "windows-targets 0.52.0", + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] -name = "windows-implement" -version = "0.39.0" +name = "windows-interface" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ - "syn 1.0.109", - "windows-tokens", + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] -name = "windows-metadata" -version = "0.39.0" +name = "windows-registry" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] [[package]] -name = "windows-sys" -version = "0.42.0" +name = "windows-result" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", ] [[package]] @@ -5904,7 +6014,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.1", + "windows-targets 0.48.5", ] [[package]] @@ -5913,7 +6023,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -5933,47 +6052,42 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] -name = "windows-tokens" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" - -[[package]] name = "windows-version" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75aa004c988e080ad34aff5739c39d0312f4684699d6d71fc8a198d057b8b9b4" +checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -5984,27 +6098,15 @@ checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -6014,27 +6116,15 @@ checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" - -[[package]] -name = "windows_i686_gnu" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" - -[[package]] -name = "windows_i686_gnu" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -6044,27 +6134,21 @@ checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" - -[[package]] -name = "windows_i686_msvc" -version = "0.37.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] -name = "windows_i686_msvc" -version = "0.39.0" +name = "windows_i686_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -6074,27 +6158,15 @@ checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.39.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -6104,15 +6176,15 @@ checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -6122,27 +6194,15 @@ checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -6152,37 +6212,27 @@ checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.5.3" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46aab759304e4d7b2075a9aecba26228bb073ee8c50db796b2c72c676b5d807" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] [[package]] name = "winreg" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a1a57ff50e9b408431e8f97d5456f2807f8eb2a2cd79b06068fc87f8ecf189" -dependencies = [ - "cfg-if", - "winapi", -] - -[[package]] -name = "winreg" version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" @@ -6193,78 +6243,67 @@ dependencies = [ [[package]] name = "winreg" -version = "0.51.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "937f3df7948156640f46aacef17a70db0de5917bda9c92b0f751f3a955b588fc" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" dependencies = [ "cfg-if", "windows-sys 0.48.0", ] [[package]] -name = "winreg" -version = "0.52.0" +name = "write16" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" [[package]] -name = "wl-clipboard-rs" -version = "0.7.0" +name = "writeable" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "981a303dfbb75d659f6612d05a14b2e363c103d24f676a2d44a00d18507a1ad9" -dependencies = [ - "derive-new", - "libc", - "log", - "nix 0.24.3", - "os_pipe", - "tempfile", - "thiserror", - "tree_magic_mini", - "wayland-client", - "wayland-protocols", -] +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wry" -version = "0.24.10" +version = "0.47.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00711278ed357350d44c749c286786ecac644e044e4da410d466212152383b45" +checksum = "61ce51277d65170f6379d8cda935c80e3c2d1f0ff712a123c8bddb11b31a4b73" dependencies = [ - "base64 0.13.1", - "block", - "cocoa", - "core-graphics", + "base64 0.22.1", + "block2", + "cookie", "crossbeam-channel", + "dpi", "dunce", - "gdk", - "gio", - "glib", + "gdkx11", "gtk", "html5ever", - "http 0.2.9", + "http 1.2.0", + "javascriptcore-rs", + "jni", "kuchikiki", "libc", - "log", - "objc", - "objc_id", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", "once_cell", - "serde", - "serde_json", + "percent-encoding", + "raw-window-handle", "sha2", - "soup2", - "tao", - "thiserror", + "soup3", + "tao-macros", + "thiserror 1.0.69", "url", "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows 0.39.0", - "windows-implement", + "windows 0.58.0", + "windows-core 0.58.0", + "windows-version", + "x11-dl", ] [[package]] @@ -6289,57 +6328,55 @@ dependencies = [ ] [[package]] -name = "x11rb" -version = "0.10.1" +name = "xattr" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592b4883219f345e712b3209c62654ebda0bb50887f330cbd018d0f654bfd507" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ - "gethostname", - "nix 0.24.3", - "winapi", - "winapi-wsapoll", - "x11rb-protocol", + "libc", + "linux-raw-sys", + "rustix", ] [[package]] -name = "x11rb-protocol" -version = "0.10.0" +name = "xdg-home" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56b245751c0ac9db0e006dc812031482784e434630205a93c73cfefcaabeac67" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" dependencies = [ - "nix 0.24.3", + "libc", + "windows-sys 0.59.0", ] [[package]] -name = "xattr" -version = "0.2.3" +name = "yoke" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ - "libc", + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", ] [[package]] -name = "xdg-home" -version = "1.0.0" +name = "yoke-derive" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2769203cd13a0c6015d515be729c526d041e9cf2c0cc478d57faee85f40c6dcd" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ - "nix 0.26.2", - "winapi", + "proc-macro2", + "quote", + "syn 2.0.91", + "synstructure", ] [[package]] -name = "xml-rs" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" - -[[package]] name = "zbus" -version = "3.14.1" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948" +checksum = "7b8e3d6ae3342792a6cc2340e4394334c7402f3d793b390d2c5494a4032b3030" dependencies = [ "async-broadcast", "async-executor", @@ -6351,7 +6388,6 @@ dependencies = [ "async-task", "async-trait", "blocking", - "byteorder", "derivative", "enumflags2", "event-listener", @@ -6359,8 +6395,7 @@ dependencies = [ "futures-sink", "futures-util", "hex", - "nix 0.26.2", - "once_cell", + "nix", "ordered-stream", "rand 0.8.5", "serde", @@ -6369,7 +6404,7 @@ dependencies = [ "static_assertions", "tracing", "uds_windows", - "winapi", + "windows-sys 0.52.0", "xdg-home", "zbus_macros", "zbus_names", @@ -6378,11 +6413,11 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "3.14.1" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d" +checksum = "b7a3e850ff1e7217a3b7a07eba90d37fe9bb9e89a310f718afcde5885ca9b6d7" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "regex", @@ -6392,9 +6427,9 @@ dependencies = [ [[package]] name = "zbus_names" -version = "2.6.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb80bb776dbda6e23d705cf0123c3b95df99c4ebeaec6c2599d4a5419902b4a9" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" dependencies = [ "serde", "static_assertions", @@ -6402,10 +6437,74 @@ dependencies = [ ] [[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", + "synstructure", +] + +[[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] [[package]] name = "zip" @@ -6428,14 +6527,45 @@ dependencies = [ ] [[package]] +name = "zip" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae9c1ea7b3a5e1f4b922ff856a129881167511563dc219869afe3787fc0c1a45" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "displaydoc", + "flate2", + "indexmap 2.7.0", + "memchr", + "thiserror 2.0.9", + "zopfli", +] + +[[package]] name = "zip-extract" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e109e5a291403b4c1e514d39f8a22d3f98d257e691a52bb1f16051bb1ffed63e" dependencies = [ "log", - "thiserror", - "zip", + "thiserror 1.0.69", + "zip 0.6.6", +] + +[[package]] +name = "zopfli" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" +dependencies = [ + "bumpalo", + "crc32fast", + "lockfree-object-pool", + "log", + "once_cell", + "simd-adler32", ] [[package]] @@ -6459,24 +6589,22 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.8+zstd.1.5.5" +version = "2.0.13+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" dependencies = [ "cc", - "libc", "pkg-config", ] [[package]] name = "zvariant" -version = "3.15.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44b291bee0d960c53170780af148dca5fa260a63cdd24f1962fa82e03e53338c" +checksum = "4e09e8be97d44eeab994d752f341e67b3b0d80512a8b315a0671d47232ef1b65" dependencies = [ - "byteorder", + "endi", "enumflags2", - "libc", "serde", "static_assertions", "zvariant_derive", @@ -6484,11 +6612,11 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "3.15.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd" +checksum = "72a5857e2856435331636a9fbb415b09243df4521a267c5bedcd5289b4d5799e" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -6497,9 +6625,9 @@ dependencies = [ [[package]] name = "zvariant_utils" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" +checksum = "00bedb16a193cc12451873fee2a1bc6550225acece0e36f333e68326c73c8172" dependencies = [ "proc-macro2", "quote", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 04fb84df..56e42487 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -5,25 +5,25 @@ description = "Mod-manager for Northstar" authors = ["https://github.com/R2NorthstarTools/FlightCore/graphs/contributors"] license = "MIT" repository = "https://github.com/R2NorthstarTools/FlightCore" -default-run = "flightcore" edition = "2021" -rust-version = "1.66" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[profile.release] -# Keeps line tables in built binary -# c.f.: https://doc.rust-lang.org/cargo/reference/profiles.html#debug -# This is done to see line numbers in stack trace on sentry.io -debug = 1 +[lib] +# The `_lib` suffix may seem redundant but it is necessary +# to make the lib name unique and wouldn't conflict with the bin name. +# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519 +name = "tauri_app_lib" +crate-type = ["staticlib", "cdylib", "rlib"] [build-dependencies] -tauri-build = { version = "1.5", features = [] } +tauri-build = { version = "2", features = [] } [dependencies] serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } -tauri = { version = "1.6", features = ["api-all", "dialog", "updater"] } +tauri = { version = "2", features = [] } +tauri-plugin-opener = "2" tokio = { version = "1", features = ["full"] } # Sentry (crash) logging sentry = "0.32" @@ -42,8 +42,6 @@ regex = "1.10" sysinfo = "0.30.13" # HTTP requests reqwest = { version = "0.11", features = ["blocking"] } -# Persistent store for settings -tauri-plugin-store = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" } # JSON5 parsing support (allows comments in JSON) json5 = "0.4.1" # Async recursion for recursive mod install @@ -78,11 +76,3 @@ remove-markdown-links = "1.0.0" # Windows API stuff winapi = "0.3.9" winreg = "0.52.0" - -[features] -# by default Tauri runs in production mode -# when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL -default = ["custom-protocol"] -# this feature is used used for production builds where `devPath` points to the filesystem -# DO NOT remove this -custom-protocol = ["tauri/custom-protocol"] diff --git a/src-tauri/bindings/CommitHead.ts b/src-tauri/bindings/CommitHead.ts deleted file mode 100644 index cdc00e39..00000000 --- a/src-tauri/bindings/CommitHead.ts +++ /dev/null @@ -1,4 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Repo } from "./Repo"; - -export type CommitHead = { sha: string, ref: string, repo: Repo, }; diff --git a/src-tauri/bindings/FlightCoreVersion.ts b/src-tauri/bindings/FlightCoreVersion.ts deleted file mode 100644 index b0b3d0cd..00000000 --- a/src-tauri/bindings/FlightCoreVersion.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type FlightCoreVersion = { tag_name: string, published_at: string, }; diff --git a/src-tauri/bindings/InstallProgress.ts b/src-tauri/bindings/InstallProgress.ts deleted file mode 100644 index c7c92542..00000000 --- a/src-tauri/bindings/InstallProgress.ts +++ /dev/null @@ -1,4 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { InstallState } from "./InstallState"; - -export type InstallProgress = { current_downloaded: bigint, total_size: bigint, state: InstallState, }; diff --git a/src-tauri/bindings/InstallState.ts b/src-tauri/bindings/InstallState.ts deleted file mode 100644 index d2a91860..00000000 --- a/src-tauri/bindings/InstallState.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type InstallState = "Downloading" | "Extracting" | "Done"; diff --git a/src-tauri/bindings/InstallType.ts b/src-tauri/bindings/InstallType.ts deleted file mode 100644 index 6ad43cb7..00000000 --- a/src-tauri/bindings/InstallType.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * Defines how Titanfall2 was installed (Steam, Origin, ...) - */ -export type InstallType = "STEAM" | "ORIGIN" | "EAPLAY" | "UNKNOWN"; diff --git a/src-tauri/bindings/NorthstarLaunchOptions.ts b/src-tauri/bindings/NorthstarLaunchOptions.ts deleted file mode 100644 index 6133f6c0..00000000 --- a/src-tauri/bindings/NorthstarLaunchOptions.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type NorthstarLaunchOptions = { launch_via_steam: boolean, bypass_checks: boolean, }; diff --git a/src-tauri/bindings/NorthstarMod.ts b/src-tauri/bindings/NorthstarMod.ts deleted file mode 100644 index cddd97d2..00000000 --- a/src-tauri/bindings/NorthstarMod.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * Object holding various information about a Northstar mod - */ -export type NorthstarMod = { name: string, version: string | null, thunderstore_mod_string: string | null, enabled: boolean, directory: string, }; diff --git a/src-tauri/bindings/NorthstarThunderstoreRelease.ts b/src-tauri/bindings/NorthstarThunderstoreRelease.ts deleted file mode 100644 index 10991793..00000000 --- a/src-tauri/bindings/NorthstarThunderstoreRelease.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type NorthstarThunderstoreRelease = { package: string, version: string, }; diff --git a/src-tauri/bindings/NorthstarThunderstoreReleaseWrapper.ts b/src-tauri/bindings/NorthstarThunderstoreReleaseWrapper.ts deleted file mode 100644 index 1da6a7da..00000000 --- a/src-tauri/bindings/NorthstarThunderstoreReleaseWrapper.ts +++ /dev/null @@ -1,4 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { NorthstarThunderstoreRelease } from "./NorthstarThunderstoreRelease"; - -export type NorthstarThunderstoreReleaseWrapper = { label: string, value: NorthstarThunderstoreRelease, }; diff --git a/src-tauri/bindings/Project.ts b/src-tauri/bindings/Project.ts deleted file mode 100644 index 5ab3c2b5..00000000 --- a/src-tauri/bindings/Project.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type Project = "FlightCore" | "Northstar"; diff --git a/src-tauri/bindings/PullRequestType.ts b/src-tauri/bindings/PullRequestType.ts deleted file mode 100644 index fdadddb0..00000000 --- a/src-tauri/bindings/PullRequestType.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type PullRequestType = "Mods" | "Launcher"; diff --git a/src-tauri/bindings/PullsApiResponseElement.ts b/src-tauri/bindings/PullsApiResponseElement.ts deleted file mode 100644 index c9a146d4..00000000 --- a/src-tauri/bindings/PullsApiResponseElement.ts +++ /dev/null @@ -1,4 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { CommitHead } from "./CommitHead"; - -export type PullsApiResponseElement = { number: bigint, title: string, url: string, head: CommitHead, html_url: string, labels: Array<string>, }; diff --git a/src-tauri/bindings/ReleaseInfo.ts b/src-tauri/bindings/ReleaseInfo.ts deleted file mode 100644 index 09a39ba5..00000000 --- a/src-tauri/bindings/ReleaseInfo.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type ReleaseInfo = { name: string, published_at: string, body: string, }; diff --git a/src-tauri/bindings/Repo.ts b/src-tauri/bindings/Repo.ts deleted file mode 100644 index 8430eb32..00000000 --- a/src-tauri/bindings/Repo.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type Repo = { full_name: string, }; diff --git a/src-tauri/bindings/Tag.ts b/src-tauri/bindings/Tag.ts deleted file mode 100644 index f51b3f26..00000000 --- a/src-tauri/bindings/Tag.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type Tag = { name: string, }; diff --git a/src-tauri/bindings/TagWrapper.ts b/src-tauri/bindings/TagWrapper.ts deleted file mode 100644 index d2f0009d..00000000 --- a/src-tauri/bindings/TagWrapper.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Tag } from "./Tag"; - -/** - * Wrapper type needed for frontend - */ -export type TagWrapper = { label: string, value: Tag, }; diff --git a/src-tauri/bindings/ThunderstoreMod.ts b/src-tauri/bindings/ThunderstoreMod.ts deleted file mode 100644 index 88eafa4c..00000000 --- a/src-tauri/bindings/ThunderstoreMod.ts +++ /dev/null @@ -1,4 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { ThunderstoreModVersion } from "./ThunderstoreModVersion"; - -export type ThunderstoreMod = { name: string, full_name: string, owner: string, package_url: string, date_created: string, date_updated: string, uuid4: string, rating_score: number, is_pinned: boolean, is_deprecated: boolean, has_nsfw_content: boolean, categories: Array<string>, versions: Array<ThunderstoreModVersion>, }; diff --git a/src-tauri/bindings/ThunderstoreModVersion.ts b/src-tauri/bindings/ThunderstoreModVersion.ts deleted file mode 100644 index b01af408..00000000 --- a/src-tauri/bindings/ThunderstoreModVersion.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type ThunderstoreModVersion = { name: string, full_name: string, description: string, icon: string, version_number: string, dependencies: Array<string>, download_url: string, downloads: number, date_created: string, website_url: string, is_active: boolean, uuid4: string, file_size: bigint, }; diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json new file mode 100644 index 00000000..4cdbf49a --- /dev/null +++ b/src-tauri/capabilities/default.json @@ -0,0 +1,10 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Capability for the main window", + "windows": ["main"], + "permissions": [ + "core:default", + "opener:default" + ] +} diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png Binary files differindex dd1c8674..6be5e50e 100644 --- a/src-tauri/icons/128x128.png +++ b/src-tauri/icons/128x128.png diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png Binary files differindex 63dda405..e81becee 100644 --- a/src-tauri/icons/128x128@2x.png +++ b/src-tauri/icons/128x128@2x.png diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png Binary files differindex 9e6a9619..a437dd51 100644 --- a/src-tauri/icons/32x32.png +++ b/src-tauri/icons/32x32.png diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png Binary files differindex 44bdc5cb..0ca4f271 100644 --- a/src-tauri/icons/Square107x107Logo.png +++ b/src-tauri/icons/Square107x107Logo.png diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png Binary files differindex 4639579a..b81f8203 100644 --- a/src-tauri/icons/Square142x142Logo.png +++ b/src-tauri/icons/Square142x142Logo.png diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png Binary files differindex fc585b6c..624c7bfb 100644 --- a/src-tauri/icons/Square150x150Logo.png +++ b/src-tauri/icons/Square150x150Logo.png diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png Binary files differindex 7fdac591..c021d2ba 100644 --- a/src-tauri/icons/Square284x284Logo.png +++ b/src-tauri/icons/Square284x284Logo.png diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png Binary files differindex 1aeabb2b..62197002 100644 --- a/src-tauri/icons/Square30x30Logo.png +++ b/src-tauri/icons/Square30x30Logo.png diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png Binary files differindex 6c21253c..f9bc0483 100644 --- a/src-tauri/icons/Square310x310Logo.png +++ b/src-tauri/icons/Square310x310Logo.png diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png Binary files differindex 91f14623..d5fbfb2a 100644 --- a/src-tauri/icons/Square44x44Logo.png +++ b/src-tauri/icons/Square44x44Logo.png diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png Binary files differindex 9ab108b2..63440d79 100644 --- a/src-tauri/icons/Square71x71Logo.png +++ b/src-tauri/icons/Square71x71Logo.png diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png Binary files differindex 8b24346c..f3f705af 100644 --- a/src-tauri/icons/Square89x89Logo.png +++ b/src-tauri/icons/Square89x89Logo.png diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png Binary files differindex 750a8c9a..45563882 100644 --- a/src-tauri/icons/StoreLogo.png +++ b/src-tauri/icons/StoreLogo.png diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns Binary files differindex cdf5f46c..12a5bcee 100644 --- a/src-tauri/icons/icon.icns +++ b/src-tauri/icons/icon.icns diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico Binary files differindex 5d387285..b3636e4b 100644 --- a/src-tauri/icons/icon.ico +++ b/src-tauri/icons/icon.ico diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png Binary files differindex 3ab5b770..e1cd2619 100644 --- a/src-tauri/icons/icon.png +++ b/src-tauri/icons/icon.png diff --git a/src-tauri/src/constants.rs b/src-tauri/src/constants.rs deleted file mode 100644 index 3ad2d6e8..00000000 --- a/src-tauri/src/constants.rs +++ /dev/null @@ -1,60 +0,0 @@ -// This file stores various global constants values -use const_format::concatcp; -use std::time::Duration; - -/// FlightCore user agent for web requests -pub const APP_USER_AGENT: &str = concatcp!("FlightCore/", env!("CARGO_PKG_VERSION")); - -/// URL of the Northstar masterserver -pub const MASTER_SERVER_URL: &str = "https://northstar.tf"; - -/// server list endpoint -pub const SERVER_BROWSER_ENDPOINT: &str = "/client/servers"; - -/// List of core Northstar mods -pub const CORE_MODS: [&str; 3] = [ - "Northstar.Client", - "Northstar.Custom", - "Northstar.CustomServers", -]; - -/// List of Thunderstoremods that shouldn't be installable -/// as they behave different than common Squirrel mods -pub const BLACKLISTED_MODS: [&str; 3] = [ - "northstar-Northstar", - "northstar-NorthstarReleaseCandidate", - "ebkr-r2modman", -]; - -/// List of Thunderstoremods that have some specific install requirements that makes them different from standard mods -pub const MODS_WITH_SPECIAL_REQUIREMENTS: [&str; 1] = ["NanohmProtogen-VanillaPlus"]; - -/// Order in which the sections for release notes should be displayed -pub const SECTION_ORDER: [&str; 11] = [ - "feat", "fix", "docs", "style", "refactor", "build", "test", "i18n", "ci", "chore", "other", -]; - -/// Statistics (players and servers counts) refresh delay -pub const REFRESH_DELAY: Duration = Duration::from_secs(5 * 60); - -/// Flightcore repo name and org name on GitHub -pub const FLIGHTCORE_REPO_NAME: &str = "R2NorthstarTools/FlightCore"; - -/// Northstar release repo name and org name on GitHub -pub const NORTHSTAR_RELEASE_REPO_NAME: &str = "R2Northstar/Northstar"; - -/// NorthstarLauncher repo name on GitHub -pub const NORTHSTAR_LAUNCHER_REPO_NAME: &str = "NorthstarLauncher"; - -/// NorthstarMods repo name on GitHub -pub const NORTHSTAR_MODS_REPO_NAME: &str = "NorthstarMods"; - -/// URL to launcher commits API URL -pub const NS_LAUNCHER_COMMITS_API_URL: &str = - "https://api.github.com/repos/R2Northstar/NorthstarLauncher/commits"; - -/// Filename of DLL that Northstar uses -pub const NORTHSTAR_DLL: &str = "Northstar.dll"; - -/// Profile that Northstar defaults to and ships with -pub const NORTHSTAR_DEFAULT_PROFILE: &str = "R2Northstar"; diff --git a/src-tauri/src/development/mod.rs b/src-tauri/src/development/mod.rs deleted file mode 100644 index 7184904c..00000000 --- a/src-tauri/src/development/mod.rs +++ /dev/null @@ -1,84 +0,0 @@ -use crate::constants::NS_LAUNCHER_COMMITS_API_URL; -use crate::github::{ - pull_requests::{check_github_api, download_zip_into_memory, get_launcher_download_link}, - CommitInfo, -}; - -#[tauri::command] -pub async fn install_git_main(game_install_path: &str) -> Result<String, String> { - // Get list of commits - let commits: Vec<CommitInfo> = serde_json::from_value( - check_github_api(NS_LAUNCHER_COMMITS_API_URL) - .await - .expect("Failed request"), - ) - .unwrap(); - - // Get latest commit... - let latest_commit_sha = commits[0].sha.clone(); - // ...and according artifact download URL - let download_url = get_launcher_download_link(latest_commit_sha.clone()).await?; - - let archive = match download_zip_into_memory(download_url).await { - Ok(archive) => archive, - Err(err) => return Err(err.to_string()), - }; - - let extract_directory = format!( - "{}/___flightcore-temp/download-dir/launcher-pr-{}", - game_install_path, latest_commit_sha - ); - match std::fs::create_dir_all(extract_directory.clone()) { - Ok(_) => (), - Err(err) => { - return Err(format!( - "Failed creating temporary download directory: {}", - err - )) - } - }; - - let target_dir = std::path::PathBuf::from(extract_directory.clone()); // Doesn't need to exist - match zip_extract::extract(std::io::Cursor::new(archive), &target_dir, true) { - Ok(()) => (), - Err(err) => { - return Err(format!("Failed unzip: {}", err)); - } - }; - - // Copy only necessary files from temp dir - // Copy: - // - NorthstarLauncher.exe - // - Northstar.dll - let files_to_copy = vec!["NorthstarLauncher.exe", "Northstar.dll"]; - for file_name in files_to_copy { - let source_file_path = format!("{}/{}", extract_directory, file_name); - let destination_file_path = format!("{}/{}", game_install_path, file_name); - match std::fs::copy(source_file_path, destination_file_path) { - Ok(_result) => (), - Err(err) => { - return Err(format!( - "Failed to copy necessary file {} from temp dir: {}", - file_name, err - )) - } - }; - } - - // delete extract directory - match std::fs::remove_dir_all(&extract_directory) { - Ok(()) => (), - Err(err) => { - return Err(format!( - "Failed to delete temporary download directory: {}", - err - )) - } - } - - log::info!( - "All done with installing launcher from {}", - latest_commit_sha - ); - Ok(latest_commit_sha) -} diff --git a/src-tauri/src/github/mod.rs b/src-tauri/src/github/mod.rs deleted file mode 100644 index 9bc3f834..00000000 --- a/src-tauri/src/github/mod.rs +++ /dev/null @@ -1,312 +0,0 @@ -pub mod pull_requests; -pub mod release_notes; - -use crate::constants::{ - APP_USER_AGENT, FLIGHTCORE_REPO_NAME, NORTHSTAR_RELEASE_REPO_NAME, SECTION_ORDER, -}; -use regex::Regex; -use serde::{Deserialize, Serialize}; -use std::collections::HashMap; -use ts_rs::TS; - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub struct Tag { - name: String, -} - -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, TS)] -#[ts(export)] -pub enum Project { - FlightCore, - Northstar, -} - -/// Wrapper type needed for frontend -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub struct TagWrapper { - label: String, - value: Tag, -} - -#[derive(Debug, Deserialize)] -pub struct CommitInfo { - pub sha: String, - commit: Commit, - author: Option<CommitAuthor>, -} - -#[derive(Debug, Deserialize)] -struct Commit { - message: String, -} - -#[derive(Debug, Deserialize)] -struct CommitAuthor { - login: String, -} - -#[derive(Debug, Deserialize)] -struct Comparison { - commits: Vec<CommitInfo>, -} - -/// Get a list of tags on the FlightCore repo -#[tauri::command] -pub fn get_list_of_tags(project: Project) -> Result<Vec<TagWrapper>, String> { - // Set the repository name. - - // Create a `reqwest` client with a user agent. - let client = reqwest::blocking::Client::builder() - .user_agent(APP_USER_AGENT) - .build() - .unwrap(); - - // Switch repo to fetch from based on project - let repo_name = match project { - Project::FlightCore => FLIGHTCORE_REPO_NAME, - Project::Northstar => NORTHSTAR_RELEASE_REPO_NAME, - }; - - // Fetch the list of tags for the repository as a `Vec<Tag>`. - let tags_url = format!("https://api.github.com/repos/{}/tags", repo_name); - let tags: Vec<Tag> = client.get(tags_url).send().unwrap().json().unwrap(); - - // Map each `Tag` element to a `TagWrapper` element with the desired label and `Tag` value. - let tag_wrappers: Vec<TagWrapper> = tags - .into_iter() - .map(|tag| TagWrapper { - label: tag.name.clone(), - value: tag, - }) - .collect(); - - Ok(tag_wrappers) -} - -/// Use GitHub API to compare two tags of the same repo against each other and get the resulting changes -#[tauri::command] -pub fn compare_tags(project: Project, first_tag: Tag, second_tag: Tag) -> Result<String, String> { - match project { - Project::FlightCore => compare_tags_flightcore(first_tag, second_tag), - Project::Northstar => compare_tags_northstar(first_tag, second_tag), - } -} - -pub fn compare_tags_flightcore(first_tag: Tag, second_tag: Tag) -> Result<String, String> { - // Fetch the list of commits between the two tags. - - // Create a `reqwest` client with a user agent. - let client = reqwest::blocking::Client::builder() - .user_agent(APP_USER_AGENT) - .build() - .unwrap(); - - let repo = "R2NorthstarTools/FlightCore"; - - let mut full_patch_notes = "".to_string(); - - let mut patch_notes: Vec<String> = [].to_vec(); - println!("{}", repo); - // let repo = "R2Northstar/NorthstarLauncher"; - let comparison_url = format!( - "https://api.github.com/repos/{}/compare/{}...{}", - repo, first_tag.name, second_tag.name - ); - - let comparison: Comparison = client.get(comparison_url).send().unwrap().json().unwrap(); - let commits = comparison.commits; - - // Display the list of commits. - println!( - "Commits between {} and {}:", - first_tag.name, second_tag.name - ); - - // Iterate over all commits in the diff - for commit in commits { - println!( - " * {} : {}", - commit.sha, - commit.commit.message.split('\n').next().unwrap() - ); - patch_notes.push( - commit - .commit - .message - .split('\n') - .next() - .unwrap() - .to_string(), - ); - } - - full_patch_notes += &generate_flightcore_release_notes(patch_notes); - - Ok(full_patch_notes.to_string()) -} - -/// Generate release notes in the format used for FlightCore -fn generate_flightcore_release_notes(commits: Vec<String>) -> String { - let grouped_commits = group_commits_by_type(commits); - let mut release_notes = String::new(); - - // Go over commit types and generate notes - for commit_type in SECTION_ORDER { - if let Some(commit_list) = grouped_commits.get(commit_type) { - if !commit_list.is_empty() { - let section_title = match commit_type { - "feat" => "**Features:**", - "fix" => "**Bug Fixes:**", - "docs" => "**Documentation:**", - "style" => "**Code style changes:**", - "refactor" => "**Code Refactoring:**", - "build" => "**Build:**", - "ci" => "**Continuous integration changes:**", - "test" => "**Tests:**", - "chore" => "**Chores:**", - "i18n" => "**Translations:**", - _ => "**Other:**", - }; - - release_notes.push_str(&format!("{}\n", section_title)); - - for commit_message in commit_list { - release_notes.push_str(&format!("- {}\n", commit_message)); - } - - release_notes.push('\n'); - } - } - } - - let release_notes = release_notes.trim_end_matches('\n').to_string(); - release_notes -} - -/// Group semantic commit messages by type -/// Commmit messages that are not formatted accordingly are marked as "other" -fn group_commits_by_type(commits: Vec<String>) -> HashMap<String, Vec<String>> { - let mut grouped_commits: HashMap<String, Vec<String>> = HashMap::new(); - let mut other_commits: Vec<String> = vec![]; - - for commit in commits { - let commit_parts: Vec<&str> = commit.splitn(2, ':').collect(); - if commit_parts.len() == 2 { - let commit_type = commit_parts[0].to_lowercase(); - let commit_description = commit_parts[1].trim().to_string(); - - // Check if known commit type - if SECTION_ORDER.contains(&commit_type.as_str()) { - let commit_list = grouped_commits.entry(commit_type.to_string()).or_default(); - commit_list.push(commit_description); - } else { - // otherwise add to list of "other" - other_commits.push(commit.to_string()); - } - } else { - other_commits.push(commit.to_string()); - } - } - grouped_commits.insert("other".to_string(), other_commits); - - grouped_commits -} - -/// Compares two tags on Northstar repo and generates release notes over the diff in tags -/// over the 3 major repos (Northstar, NorthstarLauncher, NorthstarMods) -pub fn compare_tags_northstar(first_tag: Tag, second_tag: Tag) -> Result<String, String> { - // Fetch the list of commits between the two tags. - - // Create a `reqwest` client with a user agent. - let client = reqwest::blocking::Client::builder() - .user_agent(APP_USER_AGENT) - .build() - .unwrap(); - - let repos = [ - "R2Northstar/Northstar", - "R2Northstar/NorthstarLauncher", - "R2Northstar/NorthstarMods", - ]; - - let mut full_patch_notes = "".to_string(); - let mut authors_set = std::collections::HashSet::new(); - - for repo in repos { - full_patch_notes += &format!("{}\n\n", repo); - - let mut patch_notes: Vec<String> = [].to_vec(); - println!("{}", repo); - // let repo = "R2Northstar/NorthstarLauncher"; - let comparison_url = format!( - "https://api.github.com/repos/{}/compare/{}...{}", - repo, first_tag.name, second_tag.name - ); - - log::info!("Compare URL: {}", comparison_url.clone()); - let comparison: Comparison = client.get(&comparison_url).send().unwrap().json().unwrap(); - let commits = comparison.commits; - - // Display the list of commits. - println!( - "Commits between {} and {}:", - first_tag.name, second_tag.name - ); - - // - for commit in commits { - println!( - " * {} : {}", - commit.sha, - turn_pr_number_into_link(commit.commit.message.split('\n').next().unwrap(), repo) - ); - patch_notes.push(turn_pr_number_into_link( - commit.commit.message.split('\n').next().unwrap(), - repo, - )); - - // Store authors in set - if commit.author.is_some() { - authors_set.insert(commit.author.unwrap().login); - } - } - - full_patch_notes += &patch_notes.join("\n"); - full_patch_notes += "\n\n\n"; - } - - // Convert the set to a sorted vector. - let mut sorted_vec: Vec<String> = authors_set.into_iter().collect(); - sorted_vec.sort_by_key(|a| a.to_lowercase()); - - // Define a string to prepend to each element. - let prefix = "@"; - - // Create a new list with the prefix prepended to each element. - let prefixed_list: Vec<String> = sorted_vec.iter().map(|s| prefix.to_owned() + s).collect(); - - full_patch_notes += "**Contributors:**\n"; - full_patch_notes += &prefixed_list.join(" "); - - Ok(full_patch_notes.to_string()) -} - -/// Takes the commit title and repo slug and formats it as -/// `[commit title(SHORTENED_REPO#NUMBER)](LINK)` -fn turn_pr_number_into_link(input: &str, repo: &str) -> String { - // Extract `Mods/Launcher` from repo title - let last_line = repo - .split('/') - .next_back() - .unwrap() - .trim_start_matches("Northstar"); - // Extract PR number - let re = Regex::new(r"#(\d+)").unwrap(); - - // Generate pull request link - let pull_link = format!("https://github.com/{}/pull/", repo); - re.replace_all(input, format!("[{}#$1]({}$1)", last_line, pull_link)) - .to_string() -} diff --git a/src-tauri/src/github/pull_requests.rs b/src-tauri/src/github/pull_requests.rs deleted file mode 100644 index de733feb..00000000 --- a/src-tauri/src/github/pull_requests.rs +++ /dev/null @@ -1,398 +0,0 @@ -use crate::constants::{APP_USER_AGENT, NORTHSTAR_LAUNCHER_REPO_NAME, NORTHSTAR_MODS_REPO_NAME}; -use crate::repair_and_verify::check_is_valid_game_path; -use crate::GameInstall; -use anyhow::anyhow; -use serde::{Deserialize, Serialize}; -use std::fs::File; -use std::io; -use std::io::prelude::*; -use std::path::Path; -use ts_rs::TS; - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -struct Repo { - full_name: String, -} - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -struct CommitHead { - sha: String, - #[serde(rename = "ref")] - gh_ref: String, - repo: Repo, -} - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub struct PullsApiResponseElement { - number: u64, - title: String, - url: String, - head: CommitHead, - html_url: String, - labels: Vec<String>, -} - -// GitHub API response JSON elements as structs -#[derive(Debug, Deserialize, Clone)] -struct WorkflowRun { - id: u64, - head_sha: String, -} -#[derive(Debug, Deserialize, Clone)] -struct ActionsRunsResponse { - workflow_runs: Vec<WorkflowRun>, -} - -#[derive(Debug, Deserialize, Clone)] -struct Artifact { - id: u64, - name: String, - workflow_run: WorkflowRun, -} - -#[derive(Debug, Deserialize, Clone)] -struct ArtifactsResponse { - artifacts: Vec<Artifact>, -} - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub enum PullRequestType { - Mods, - Launcher, -} - -/// Parse pull requests from specified URL -pub async fn get_pull_requests( - repo: PullRequestType, -) -> Result<Vec<PullsApiResponseElement>, anyhow::Error> { - let repo = match repo { - PullRequestType::Mods => NORTHSTAR_MODS_REPO_NAME, - PullRequestType::Launcher => NORTHSTAR_LAUNCHER_REPO_NAME, - }; - - // Grab list of PRs - let octocrab = octocrab::instance(); - let page = octocrab - .pulls("R2Northstar", repo) - .list() - .state(octocrab::params::State::Open) - .per_page(50) // Only grab 50 PRs - .page(1u32) - .send() - .await?; - - // Iterate over pull request elements and insert into struct - let mut all_pull_requests: Vec<PullsApiResponseElement> = vec![]; - for item in page.items { - let repo = Repo { - full_name: item - .head - .repo - .ok_or(anyhow!("repo not found"))? - .full_name - .ok_or(anyhow!("full_name not found"))?, - }; - - let head = CommitHead { - sha: item.head.sha, - gh_ref: item.head.ref_field, - repo, - }; - - // Get labels and their names and put the into vector - let label_names: Vec<String> = item - .labels - .unwrap_or_else(Vec::new) - .into_iter() - .map(|label| label.name) - .collect(); - - // TODO there's probably a way to automatically serialize into the struct but I don't know yet how to - let elem = PullsApiResponseElement { - number: item.number, - title: item.title.ok_or(anyhow!("title not found"))?, - url: item.url, - head, - html_url: item - .html_url - .ok_or(anyhow!("html_url not found"))? - .to_string(), - labels: label_names, - }; - - all_pull_requests.push(elem); - } - - Ok(all_pull_requests) -} - -/// Gets either launcher or mods PRs -#[tauri::command] -pub async fn get_pull_requests_wrapper( - install_type: PullRequestType, -) -> Result<Vec<PullsApiResponseElement>, String> { - match get_pull_requests(install_type).await { - Ok(res) => Ok(res), - Err(err) => Err(err.to_string()), - } -} - -pub async fn check_github_api(url: &str) -> Result<serde_json::Value, Box<dyn std::error::Error>> { - let client = reqwest::Client::new(); - let res = client - .get(url) - .header(reqwest::header::USER_AGENT, APP_USER_AGENT) - .send() - .await - .unwrap() - .text() - .await - .unwrap(); - - let json: serde_json::Value = serde_json::from_str(&res).expect("JSON was not well-formatted"); - - Ok(json) -} - -/// Downloads a file from given URL into an array in memory -pub async fn download_zip_into_memory(download_url: String) -> Result<Vec<u8>, anyhow::Error> { - let client = reqwest::Client::builder() - .user_agent(APP_USER_AGENT) - .build()?; - - let response = client.get(download_url).send().await?; - - if !response.status().is_success() { - return Err(anyhow!("Request unsuccessful: {}", response.status())); - } - - let bytes = response.bytes().await?; - Ok(bytes.to_vec()) -} - -/// Gets GitHub download link of a mods PR -fn get_mods_download_link(pull_request: PullsApiResponseElement) -> Result<String, anyhow::Error> { - // {pr object} -> number == pr_number - // -> head -> ref - // -> repo -> full_name - - // Use repo and branch name to get download link - let download_url = format!( - "https://github.com/{}/archive/refs/heads/{}.zip", - pull_request.head.repo.full_name, // repo name - pull_request.head.gh_ref, // branch name - ); - - Ok(download_url) -} - -/// Gets `nightly.link` artifact download link of a launcher commit -#[tauri::command] -pub async fn get_launcher_download_link(commit_sha: String) -> Result<String, String> { - // Iterate over the first 10 pages of - for i in 1..=10 { - // Crossreference with runs API - let runs_response: ActionsRunsResponse = match check_github_api(&format!( - "https://api.github.com/repos/R2Northstar/NorthstarLauncher/actions/runs?page={}", - i - )) - .await - { - Ok(result) => serde_json::from_value(result).unwrap(), - Err(err) => return Err(format!("{}", err)), - }; - - // Cross-reference commit sha against workflow runs - for workflow_run in &runs_response.workflow_runs { - // If head commit sha of CI run matches the one passed to this function, grab CI output - if workflow_run.head_sha == commit_sha { - // Check artifacts - let api_url = format!("https://api.github.com/repos/R2Northstar/NorthstarLauncher/actions/runs/{}/artifacts", workflow_run.id); - let artifacts_response: ArtifactsResponse = serde_json::from_value( - check_github_api(&api_url).await.expect("Failed request"), - ) - .unwrap(); - - let multiple_artifacts = artifacts_response.artifacts.len() > 1; - - // Iterate over artifacts - for artifact in artifacts_response.artifacts { - if multiple_artifacts && !artifact.name.starts_with("NorthstarLauncher-MSVC") { - continue; - } - - // Make sure artifact and CI run commit head sha match - if artifact.workflow_run.head_sha == workflow_run.head_sha { - // Download artifact - return Ok(format!("https://nightly.link/R2Northstar/NorthstarLauncher/actions/artifacts/{}.zip", artifact.id)); - } - } - } - } - } - - Err(format!( - "Couldn't grab download link for \"{}\". Corresponding PR might be too old and therefore no CI build has been detected. Maybe ask author to update?", - commit_sha - )) -} - -/// Adds a batch file that allows for launching Northstar with mods PR profile -fn add_batch_file(game_install_path: &str) { - let batch_path = format!("{}/r2ns-launch-mod-pr-version.bat", game_install_path); - let path = Path::new(&batch_path); - let display = path.display(); - - // Open a file in write-only mode, returns `io::Result<File>` - let mut file = match File::create(path) { - Err(why) => panic!("couldn't create {}: {}", display, why), - Ok(file) => file, - }; - - // Write the string to `file`, returns `io::Result<()>` - let batch_file_content = - "NorthstarLauncher.exe -profile=R2Northstar-PR-test-managed-folder\r\n"; - - match file.write_all(batch_file_content.as_bytes()) { - Err(why) => panic!("couldn't write to {}: {}", display, why), - Ok(_) => log::info!("successfully wrote to {}", display), - } -} - -/// Downloads selected launcher PR and extracts it into game install path -#[tauri::command] -pub async fn apply_launcher_pr( - pull_request: PullsApiResponseElement, - game_install: GameInstall, -) -> Result<(), String> { - // Exit early if wrong game path - check_is_valid_game_path(&game_install.game_path)?; - - // get download link - let download_url = match get_launcher_download_link(pull_request.head.sha.clone()).await { - Ok(res) => res, - Err(err) => { - return Err(format!( - "Couldn't grab download link for PR \"{}\". {}", - pull_request.number, err - )) - } - }; - - let archive = match download_zip_into_memory(download_url).await { - Ok(archive) => archive, - Err(err) => return Err(err.to_string()), - }; - - let extract_directory = format!( - "{}/___flightcore-temp/download-dir/launcher-pr-{}", - game_install.game_path, pull_request.number - ); - match std::fs::create_dir_all(extract_directory.clone()) { - Ok(_) => (), - Err(err) => { - return Err(format!( - "Failed creating temporary download directory: {}", - err - )) - } - }; - - let target_dir = std::path::PathBuf::from(extract_directory.clone()); // Doesn't need to exist - match zip_extract::extract(io::Cursor::new(archive), &target_dir, true) { - Ok(()) => (), - Err(err) => { - return Err(format!("Failed unzip: {}", err)); - } - }; - - // Copy only necessary files from temp dir - // Copy: - // - NorthstarLauncher.exe - // - Northstar.dll - let files_to_copy = vec!["NorthstarLauncher.exe", "Northstar.dll"]; - for file_name in files_to_copy { - let source_file_path = format!("{}/{}", extract_directory, file_name); - let destination_file_path = format!("{}/{}", game_install.game_path, file_name); - match std::fs::copy(source_file_path, destination_file_path) { - Ok(_result) => (), - Err(err) => { - return Err(format!( - "Failed to copy necessary file {} from temp dir: {}", - file_name, err - )) - } - }; - } - - // delete extract directory - match std::fs::remove_dir_all(&extract_directory) { - Ok(()) => (), - Err(err) => { - return Err(format!( - "Failed to delete temporary download directory: {}", - err - )) - } - } - - log::info!("All done with installing launcher PR"); - Ok(()) -} - -/// Downloads selected mods PR and extracts it into profile in game install path -#[tauri::command] -pub async fn apply_mods_pr( - pull_request: PullsApiResponseElement, - game_install: GameInstall, -) -> Result<(), String> { - // Exit early if wrong game path - check_is_valid_game_path(&game_install.game_path)?; - - let download_url = match get_mods_download_link(pull_request) { - Ok(url) => url, - Err(err) => return Err(err.to_string()), - }; - - let archive = match download_zip_into_memory(download_url).await { - Ok(archive) => archive, - Err(err) => return Err(err.to_string()), - }; - - let profile_folder = format!( - "{}/R2Northstar-PR-test-managed-folder", - game_install.game_path - ); - - // Delete previously managed folder - if std::fs::remove_dir_all(profile_folder.clone()).is_err() { - if std::path::Path::new(&profile_folder).exists() { - log::error!("Failed removing previous dir"); - } else { - log::warn!("Failed removing folder that doesn't exist. Probably cause first run"); - } - }; - - // Create profile folder - match std::fs::create_dir_all(profile_folder.clone()) { - Ok(()) => (), - Err(err) => return Err(err.to_string()), - } - - let target_dir = std::path::PathBuf::from(format!("{}/mods", profile_folder)); // Doesn't need to exist - match zip_extract::extract(io::Cursor::new(archive), &target_dir, true) { - Ok(()) => (), - Err(err) => { - return Err(format!("Failed unzip: {}", err)); - } - }; - // Add batch file to launch right profile - add_batch_file(&game_install.game_path); - - log::info!("All done with installing mods PR"); - Ok(()) -} diff --git a/src-tauri/src/github/release_notes.rs b/src-tauri/src/github/release_notes.rs deleted file mode 100644 index 4adfb24b..00000000 --- a/src-tauri/src/github/release_notes.rs +++ /dev/null @@ -1,244 +0,0 @@ -use rand::prelude::SliceRandom; -use serde::{Deserialize, Serialize}; -use std::vec::Vec; -use ts_rs::TS; - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub struct ReleaseInfo { - pub name: String, - pub published_at: String, - pub body: String, -} - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub struct FlightCoreVersion { - tag_name: String, - published_at: String, -} - -/// Gets newest FlighCore version from GitHub -#[tauri::command] -pub async fn get_newest_flightcore_version() -> Result<FlightCoreVersion, String> { - // Get newest version number from GitHub API - log::info!("Checking GitHub API"); - let octocrab = octocrab::instance(); - let page = octocrab - .repos("R2NorthstarTools", "FlightCore") - .releases() - .list() - // Optional Parameters - .per_page(1) - .page(1u32) - // Send the request - .send() - .await - .map_err(|err| err.to_string())?; - - // Get newest element - let latest_release_item = &page.items[0]; - - let flightcore_version = FlightCoreVersion { - tag_name: latest_release_item.tag_name.clone(), - published_at: latest_release_item.published_at.unwrap().to_rfc3339(), - }; - log::info!("Done checking GitHub API"); - - Ok(flightcore_version) -} - -/// Checks if installed FlightCore version is up-to-date -/// false -> FlightCore install is up-to-date -/// true -> FlightCore install is outdated -#[tauri::command] -pub async fn check_is_flightcore_outdated() -> Result<bool, String> { - let newest_flightcore_release = get_newest_flightcore_version().await?; - // Parse version number excluding leading `v` - let newest_version = semver::Version::parse(&newest_flightcore_release.tag_name[1..]).unwrap(); - - // Get version of installed FlightCore - let current_version = env!("CARGO_PKG_VERSION"); - let current_version = semver::Version::parse(current_version).unwrap(); - - #[cfg(debug_assertions)] - let is_outdated = current_version < newest_version; - #[cfg(not(debug_assertions))] - let is_outdated = current_version != newest_version; - - // If outdated, check how new the update is - if is_outdated { - // Time to wait (2h) h * m * s - let threshold_seconds = 2 * 60 * 60; - - // Get current time - let current_time = chrono::Utc::now(); - - // Get latest release time from GitHub API response - let result = chrono::DateTime::parse_from_rfc3339(&newest_flightcore_release.published_at) - .unwrap() - .with_timezone(&chrono::Utc); - - // Check if current time is outside of threshold - let diff = current_time - result; - if diff.num_seconds() < threshold_seconds { - // User would be outdated but the newest release is recent - // therefore we do not wanna show outdated warning. - return Ok(false); - } - return Ok(true); - } - - Ok(is_outdated) -} - -#[tauri::command] -pub async fn get_northstar_release_notes() -> Result<Vec<ReleaseInfo>, String> { - let octocrab = octocrab::instance(); - let page = octocrab - .repos("R2Northstar", "Northstar") - .releases() - .list() - // Optional Parameters - .per_page(25) - .page(1u32) - // Send the request - .send() - .await - .map_err(|err| err.to_string())?; - - // TODO there's probably a way to automatically serialize into the struct but I don't know yet how to - let mut release_info_vector: Vec<ReleaseInfo> = vec![]; - for item in page.items { - let release_info = ReleaseInfo { - name: item.name.ok_or(String::from("Release name not found"))?, - published_at: item - .published_at - .ok_or(String::from("Release date not found"))? - .to_rfc3339(), - body: item.body.ok_or(String::from("Release body not found"))?, - }; - release_info_vector.push(release_info); - } - - log::info!("Done checking GitHub API"); - - Ok(release_info_vector) -} - -/// Checks latest GitHub release and generates a announcement message for Discord based on it -#[tauri::command] -pub async fn generate_release_note_announcement() -> Result<String, String> { - let octocrab = octocrab::instance(); - let page = octocrab - .repos("R2Northstar", "Northstar") - .releases() - .list() - // Optional Parameters - .per_page(1) - .page(1u32) - // Send the request - .send() - .await - .unwrap(); - - // Get newest element - let latest_release_item = &page.items[0]; - - // Extract the URL to the GitHub release note - let github_release_link = latest_release_item.html_url.clone(); - - // Extract release version number - let current_ns_version = &latest_release_item.tag_name; - - // Extract changelog and format it - let changelog = remove_markdown_links::remove_markdown_links( - latest_release_item - .body - .as_ref() - .unwrap() - .split("**Contributors:**") - .next() - .unwrap() - .trim(), - ); - - // Strings to insert for different sections - // Hardcoded for now - let general_info = "REPLACE ME"; - let modders_info = "Mod compatibility should not be impacted"; - let server_hosters_info = "REPLACE ME"; - - let mut rng = rand::thread_rng(); - let attributes = vec![ - "adorable", - "amazing", - "beautiful", - "blithsome", - "brilliant", - "compassionate", - "dazzling", - "delightful", - "distinguished", - "elegant", - "enigmatic", - "enthusiastic", - "fashionable", - "fortuitous", - "friendly", - "generous", - "gleeful", - "gorgeous", - "handsome", - "lively", - "lovely", - "lucky", - "lustrous", - "marvelous", - "merry", - "mirthful", - "phantasmagorical", - "pretty", - "propitious", - "ravishing", - "sincere", - "sophisticated fellow", - "stupendous", - "vivacious", - "wonderful", - "zestful", - ]; - - let selected_attribute = attributes.choose(&mut rng).unwrap(); - - // Build announcement string - let return_string = format!( - r"Hello {selected_attribute} people <3 -**Northstar `{current_ns_version}` is out!** - -{general_info} - -__**Modders:**__ - -{modders_info} - -__**Server hosters:**__ - -{server_hosters_info} - -__**Changelog:**__ -``` -{changelog} -``` -{github_release_link} - -Checkout #installation on how to install/update Northstar -(the process is the same for both, using a Northstar installer like FlightCore, Viper, or VTOL is recommended over manual installation) - -If you do notice any bugs, please open an issue on Github or drop a message in the thread below -" - ); - - // Return built announcement message - Ok(return_string.to_string()) -} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs new file mode 100644 index 00000000..4a277ef3 --- /dev/null +++ b/src-tauri/src/lib.rs @@ -0,0 +1,14 @@ +// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ +#[tauri::command] +fn greet(name: &str) -> String { + format!("Hello, {}! You've been greeted from Rust!", name) +} + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + tauri::Builder::default() + .plugin(tauri_plugin_opener::init()) + .invoke_handler(tauri::generate_handler![greet]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index a9f484f5..2abccd9e 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -1,221 +1,6 @@ -#![cfg_attr( - all(not(debug_assertions), target_os = "windows"), - windows_subsystem = "windows" -)] - -use std::{env, time::Duration}; - -mod constants; -mod development; -mod github; -mod mod_management; -mod northstar; -mod platform_specific; -mod repair_and_verify; -mod thunderstore; -mod util; - -use serde::{Deserialize, Serialize}; -#[cfg(target_os = "windows")] -use tauri::api::dialog::blocking::MessageDialogBuilder; -#[cfg(target_os = "windows")] -use tauri::api::dialog::{MessageDialogButtons, MessageDialogKind}; -use tauri::Manager; -use tokio::time::sleep; -use ts_rs::TS; - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -struct NorthstarThunderstoreRelease { - package: String, - version: String, -} - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub struct NorthstarThunderstoreReleaseWrapper { - label: String, - value: NorthstarThunderstoreRelease, -} +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] fn main() { - // Setup logger - let mut log_builder = pretty_env_logger::formatted_builder(); - log_builder.parse_filters("info"); - let logger = sentry_log::SentryLogger::with_dest(log_builder.build()); - - log::set_boxed_logger(Box::new(logger)).unwrap(); - log::set_max_level(log::LevelFilter::Info); - - // Only enable Sentry crash logs on release - #[cfg(not(debug_assertions))] - let _guard = sentry::init(( - "https://f833732deb2240b0b2dc4abce97d0f1d@o1374052.ingest.sentry.io/6692177", - sentry::ClientOptions { - release: sentry::release_name!(), - attach_stacktrace: true, - ..Default::default() - }, - )); - - let tauri_builder_res = tauri::Builder::default() - .plugin(tauri_plugin_store::Builder::default().build()) - .setup(|app| { - let app_handle = app.app_handle(); - tauri::async_runtime::spawn(async move { - loop { - sleep(Duration::from_millis(2000)).await; - // println!("sending backend ping"); - app_handle.emit_all("backend-ping", "ping").unwrap(); - } - }); - let app_handle = app.app_handle(); - tauri::async_runtime::spawn(async move { - loop { - sleep(Duration::from_millis(2000)).await; - app_handle - .emit_all( - "ea-app-running-ping", - util::check_ea_app_or_origin_running(), - ) - .unwrap(); - } - }); - let app_handle = app.app_handle(); - tauri::async_runtime::spawn(async move { - loop { - sleep(Duration::from_millis(2000)).await; - app_handle - .emit_all("northstar-running-ping", util::check_northstar_running()) - .unwrap(); - } - }); - - // Emit updated player and server count to GUI - let app_handle = app.app_handle(); - tauri::async_runtime::spawn(async move { - loop { - sleep(constants::REFRESH_DELAY).await; - app_handle - .emit_all( - "northstar-statistics", - util::get_server_player_count().await, - ) - .unwrap(); - } - }); - - Ok(()) - }) - .manage(()) - .invoke_handler(tauri::generate_handler![ - development::install_git_main, - github::compare_tags, - github::get_list_of_tags, - github::pull_requests::apply_launcher_pr, - github::pull_requests::apply_mods_pr, - github::pull_requests::get_launcher_download_link, - github::pull_requests::get_pull_requests_wrapper, - github::release_notes::check_is_flightcore_outdated, - github::release_notes::generate_release_note_announcement, - github::release_notes::get_newest_flightcore_version, - github::release_notes::get_northstar_release_notes, - mod_management::delete_northstar_mod, - mod_management::delete_thunderstore_mod, - mod_management::get_installed_mods_and_properties, - mod_management::install_mod_wrapper, - mod_management::set_mod_enabled_status, - northstar::check_is_northstar_outdated, - northstar::get_available_northstar_versions, - northstar::get_northstar_version_number, - northstar::install::find_game_install_location, - northstar::install::install_northstar_wrapper, - northstar::install::update_northstar, - northstar::launch_northstar, - northstar::profile::clone_profile, - northstar::profile::delete_profile, - northstar::profile::fetch_profiles, - northstar::profile::validate_profile, - platform_specific::check_cgnat, - platform_specific::get_host_os, - platform_specific::get_local_northstar_proton_wrapper_version, - platform_specific::install_northstar_proton_wrapper, - platform_specific::uninstall_northstar_proton_wrapper, - repair_and_verify::clean_up_download_folder_wrapper, - repair_and_verify::disable_all_but_core, - repair_and_verify::get_log_list, - repair_and_verify::verify_game_files, - repair_and_verify::verify_install_location, - thunderstore::query_thunderstore_packages_api, - util::close_application, - util::force_panic, - util::get_flightcore_version_number, - util::get_server_player_count, - util::is_debug_mode, - util::kill_northstar, - util::open_repair_window, - ]) - .run(tauri::generate_context!()); - - match tauri_builder_res { - Ok(()) => (), - Err(err) => { - // Failed to launch system native web view - - // Log error on Linux - #[cfg(not(target_os = "windows"))] - { - log::error!("{err}"); - } - - // On Windows we can show an error window using Windows API to show how to install WebView2 - #[cfg(target_os = "windows")] - { - log::error!("WebView2 not installed: {err}"); - let dialog = MessageDialogBuilder::new( - "WebView2 not found", - "FlightCore requires WebView2 to run.\n\nClick OK to open installation instructions." - ) - .kind(MessageDialogKind::Error) - .buttons(MessageDialogButtons::Ok); - - if dialog.show() { - // Open the installation instructions URL in the user's default web browser - open::that("https://github.com/R2NorthstarTools/FlightCore/blob/main/docs/TROUBLESHOOTING.md#flightcore-wont-launch").unwrap(); - } - } - } - }; -} - -/// Defines how Titanfall2 was installed (Steam, Origin, ...) -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub enum InstallType { - STEAM, - ORIGIN, - EAPLAY, - UNKNOWN, -} - -/// Object holding information of the Titanfall2 install, including -/// - Install path -/// - Active profile -/// - Type of installation (Steam, Origin, ...) -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct GameInstall { - pub game_path: String, - pub profile: String, - pub install_type: InstallType, -} - -/// Object holding various information about a Northstar mod -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub struct NorthstarMod { - pub name: String, - pub version: Option<String>, - pub thunderstore_mod_string: Option<String>, - pub enabled: bool, - pub directory: String, + tauri_app_lib::run() } diff --git a/src-tauri/src/mod_management/legacy.rs b/src-tauri/src/mod_management/legacy.rs deleted file mode 100644 index 1e9f90f5..00000000 --- a/src-tauri/src/mod_management/legacy.rs +++ /dev/null @@ -1,213 +0,0 @@ -use crate::constants::BLACKLISTED_MODS; -use crate::mod_management::{ - delete_mod_folder, get_installed_mods_and_properties, ParsedThunderstoreModString, -}; -use crate::GameInstall; -use crate::NorthstarMod; -use anyhow::{anyhow, Result}; -use serde::{Deserialize, Serialize}; -use std::{io::Read, path::PathBuf}; - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct ModJson { - #[serde(rename = "Name")] - name: String, - #[serde(rename = "ThunderstoreModString")] - thunderstore_mod_string: Option<String>, - #[serde(rename = "Version")] - version: Option<String>, -} - -/// Parses `manifest.json` for Thunderstore mod string -fn parse_for_thunderstore_mod_string(nsmod_path: &str) -> Result<String, anyhow::Error> { - let manifest_json_path = format!("{}/manifest.json", nsmod_path); - let ts_author_txt_path = format!("{}/thunderstore_author.txt", nsmod_path); - - // Check if `manifest.json` exists and parse - let data = std::fs::read_to_string(manifest_json_path)?; - let thunderstore_manifest: super::ThunderstoreManifest = json5::from_str(&data)?; - - // Check if `thunderstore_author.txt` exists and parse - let mut file = std::fs::File::open(ts_author_txt_path)?; - let mut thunderstore_author = String::new(); - file.read_to_string(&mut thunderstore_author)?; - - // Build mod string - let thunderstore_mod_string = format!( - "{}-{}-{}", - thunderstore_author, thunderstore_manifest.name, thunderstore_manifest.version_number - ); - - Ok(thunderstore_mod_string) -} - -/// Parse `mods` folder for installed mods. -pub fn parse_installed_mods( - game_install: &GameInstall, -) -> Result<Vec<NorthstarMod>, anyhow::Error> { - let ns_mods_folder = format!("{}/{}/mods/", game_install.game_path, game_install.profile); - - let paths = match std::fs::read_dir(ns_mods_folder) { - Ok(paths) => paths, - Err(_err) => return Err(anyhow!("No mods folder found")), - }; - - let mut directories: Vec<PathBuf> = Vec::new(); - let mut mods: Vec<NorthstarMod> = Vec::new(); - - // Get list of folders in `mods` directory - for path in paths { - log::info!("{path:?}"); - let my_path = path.unwrap().path(); - log::info!("{my_path:?}"); - - let md = std::fs::metadata(my_path.clone()).unwrap(); - if md.is_dir() { - directories.push(my_path); - } - } - - // Iterate over folders and check if they are Northstar mods - for directory in directories { - let directory_str = directory.to_str().unwrap().to_string(); - // Check if mod.json exists - let mod_json_path = format!("{}/mod.json", directory_str); - if !std::path::Path::new(&mod_json_path).exists() { - continue; - } - - // Parse mod.json and get mod name - - // Read file into string and parse it - let data = std::fs::read_to_string(mod_json_path.clone())?; - let parsed_mod_json: ModJson = match json5::from_str(&data) { - Ok(parsed_json) => parsed_json, - Err(err) => { - log::warn!("Failed parsing {} with {}", mod_json_path, err.to_string()); - continue; - } - }; - // Get Thunderstore mod string if it exists - let thunderstore_mod_string = match parsed_mod_json.thunderstore_mod_string { - // Attempt legacy method for getting Thunderstore string first - Some(ts_mod_string) => Some(ts_mod_string), - // Legacy method failed - None => match parse_for_thunderstore_mod_string(&directory_str) { - Ok(thunderstore_mod_string) => Some(thunderstore_mod_string), - Err(_err) => None, - }, - }; - // Get directory path - let mod_directory = directory.to_str().unwrap().to_string(); - - let ns_mod = NorthstarMod { - name: parsed_mod_json.name, - version: parsed_mod_json.version, - thunderstore_mod_string, - enabled: false, // Placeholder - directory: mod_directory, - }; - - mods.push(ns_mod); - } - - // Return found mod names - Ok(mods) -} - -/// Deletes all legacy packages that match in author and mod name -/// regardless of version -/// -/// "legacy package" refers to a Thunderstore package installed into the `mods` folder -/// by extracting Northstar mods contained inside and then adding `manifest.json` and `thunderstore_author.txt` -/// to indicate which Thunderstore package they are part of -pub fn delete_legacy_package_install( - thunderstore_mod_string: &str, - game_install: &GameInstall, -) -> Result<(), String> { - let thunderstore_mod_string: ParsedThunderstoreModString = - thunderstore_mod_string.parse().unwrap(); - let found_installed_legacy_mods = match parse_installed_mods(game_install) { - Ok(res) => res, - Err(err) => return Err(err.to_string()), - }; - - for legacy_mod in found_installed_legacy_mods { - if legacy_mod.thunderstore_mod_string.is_none() { - continue; // Not a thunderstore mod - } - - let current_mod_ts_string: ParsedThunderstoreModString = legacy_mod - .clone() - .thunderstore_mod_string - .unwrap() - .parse() - .unwrap(); - - if thunderstore_mod_string.author_name == current_mod_ts_string.author_name - && thunderstore_mod_string.mod_name == current_mod_ts_string.mod_name - { - // They match, delete - delete_mod_folder(&legacy_mod.directory)?; - } - } - - Ok(()) -} - -/// Deletes all NorthstarMods related to a Thunderstore mod -pub fn delete_thunderstore_mod( - game_install: GameInstall, - thunderstore_mod_string: String, -) -> Result<(), String> { - // Prevent deleting core mod - for core_ts_mod in BLACKLISTED_MODS { - if thunderstore_mod_string == core_ts_mod { - return Err(format!("Cannot remove core mod {thunderstore_mod_string}")); - } - } - - let parsed_ts_mod_string: ParsedThunderstoreModString = - thunderstore_mod_string.parse().unwrap(); - - // Get installed mods - let installed_ns_mods = get_installed_mods_and_properties(game_install)?; - - // List of mod folders to remove - let mut mod_folders_to_remove: Vec<String> = Vec::new(); - - // Get folder name based on Thundestore mod string - for installed_ns_mod in installed_ns_mods { - if installed_ns_mod.thunderstore_mod_string.is_none() { - // Not a Thunderstore mod - continue; - } - - let installed_ns_mod_ts_string: ParsedThunderstoreModString = installed_ns_mod - .thunderstore_mod_string - .unwrap() - .parse() - .unwrap(); - - // Installed mod matches specified Thunderstore mod string - if parsed_ts_mod_string.author_name == installed_ns_mod_ts_string.author_name - && parsed_ts_mod_string.mod_name == installed_ns_mod_ts_string.mod_name - { - // Add folder to list of folder to remove - mod_folders_to_remove.push(installed_ns_mod.directory); - } - } - - if mod_folders_to_remove.is_empty() { - return Err(format!( - "No mods removed as no Northstar mods matching {thunderstore_mod_string} were found to be installed." - )); - } - - // Delete given folders - for mod_folder in mod_folders_to_remove { - delete_mod_folder(&mod_folder)?; - } - - Ok(()) -} diff --git a/src-tauri/src/mod_management/mod.rs b/src-tauri/src/mod_management/mod.rs deleted file mode 100644 index 52ef1180..00000000 --- a/src-tauri/src/mod_management/mod.rs +++ /dev/null @@ -1,797 +0,0 @@ -// This file contains various mod management functions - -use crate::constants::{BLACKLISTED_MODS, CORE_MODS, MODS_WITH_SPECIAL_REQUIREMENTS}; -use async_recursion::async_recursion; -use thermite::prelude::ThermiteError; - -use crate::NorthstarMod; -use anyhow::{anyhow, Result}; -use serde::{Deserialize, Serialize}; -use std::error::Error; -use std::str::FromStr; -use std::string::ToString; -use std::{fs, path::PathBuf}; - -mod legacy; -mod plugins; -use crate::GameInstall; - -#[derive(Debug, Clone)] -pub struct ParsedThunderstoreModString { - author_name: String, - mod_name: String, - version: String, -} - -impl std::str::FromStr for ParsedThunderstoreModString { - type Err = &'static str; // todo use an better error management - - fn from_str(s: &str) -> Result<Self, Self::Err> { - // Check whether Thunderstore string passes regex - let re = regex::Regex::new(r"^[a-zA-Z0-9_]+-[a-zA-Z0-9_]+-\d+\.\d+\.\d++$").unwrap(); - if !re.is_match(s) { - return Err("Incorrect format"); - } - - let mut parts = s.split('-'); - - let author_name = parts.next().ok_or("None value on author_name")?.to_string(); - let mod_name = parts.next().ok_or("None value on mod_name")?.to_string(); - let version = parts.next().ok_or("None value on version")?.to_string(); - - Ok(ParsedThunderstoreModString { - author_name, - mod_name, - version, - }) - } -} - -impl std::fmt::Display for ParsedThunderstoreModString { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}-{}-{}", self.author_name, self.mod_name, self.version) - } -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct ThunderstoreManifest { - name: String, - version_number: String, -} - -/// A wrapper around a temporary file handle and its path. -/// -/// This struct is designed to be used for temporary files that should be automatically deleted -/// when the `TempFile` instance goes out of scope. -#[derive(Debug)] -pub struct TempFile(fs::File, PathBuf); - -impl TempFile { - pub fn new(file: fs::File, path: PathBuf) -> Self { - Self(file, path) - } - - pub fn file(&self) -> &fs::File { - &self.0 - } -} - -impl Drop for TempFile { - fn drop(&mut self) { - _ = fs::remove_file(&self.1) - } -} - -impl std::ops::Deref for TempFile { - type Target = fs::File; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -/// Installs the specified mod -#[tauri::command] -pub async fn install_mod_wrapper( - game_install: GameInstall, - thunderstore_mod_string: String, -) -> Result<(), String> { - match fc_download_mod_and_install(&game_install, &thunderstore_mod_string).await { - Ok(()) => (), - Err(err) => { - log::warn!("{err}"); - return Err(err); - } - }; - match crate::repair_and_verify::clean_up_download_folder(&game_install, false) { - Ok(()) => Ok(()), - Err(err) => { - log::info!("Failed to delete download folder due to {}", err); - // Failure to delete download folder is not an error in mod install - // As such ignore. User can still force delete if need be - Ok(()) - } - } -} - -/// Returns a serde json object of the parsed `enabledmods.json` file -pub fn get_enabled_mods(game_install: &GameInstall) -> Result<serde_json::value::Value, String> { - let enabledmods_json_path = format!( - "{}/{}/enabledmods.json", - game_install.game_path, game_install.profile - ); - - // Check for JSON file - if !std::path::Path::new(&enabledmods_json_path).exists() { - return Err("enabledmods.json not found".to_string()); - } - - // Read file - let data = match std::fs::read_to_string(enabledmods_json_path) { - Ok(data) => data, - Err(err) => return Err(err.to_string()), - }; - - // Parse JSON - let res: serde_json::Value = match serde_json::from_str(&data) { - Ok(result) => result, - Err(err) => return Err(format!("Failed to read JSON due to: {}", err)), - }; - - // Return parsed data - Ok(res) -} - -/// Gets all currently installed and enabled/disabled mods to rebuild `enabledmods.json` -pub fn rebuild_enabled_mods_json(game_install: &GameInstall) -> Result<(), String> { - let enabledmods_json_path = format!( - "{}/{}/enabledmods.json", - game_install.game_path, game_install.profile - ); - let mods_and_properties = get_installed_mods_and_properties(game_install.clone())?; - - // Create new mapping - let mut my_map = serde_json::Map::new(); - - // Build mapping - for ns_mod in mods_and_properties.into_iter() { - my_map.insert(ns_mod.name, serde_json::Value::Bool(ns_mod.enabled)); - } - - // Turn into serde object - let obj = serde_json::Value::Object(my_map); - - // Write to file - std::fs::write( - enabledmods_json_path, - serde_json::to_string_pretty(&obj).unwrap(), - ) - .unwrap(); - - Ok(()) -} - -/// Set the status of a passed mod to enabled/disabled -#[tauri::command] -pub fn set_mod_enabled_status( - game_install: GameInstall, - mod_name: String, - is_enabled: bool, -) -> Result<(), String> { - let enabledmods_json_path = format!( - "{}/{}/enabledmods.json", - game_install.game_path, game_install.profile - ); - - // Parse JSON - let mut res: serde_json::Value = match get_enabled_mods(&game_install) { - Ok(res) => res, - Err(err) => { - log::warn!("Couldn't parse `enabledmod.json`: {}", err); - log::warn!("Rebuilding file."); - - rebuild_enabled_mods_json(&game_install)?; - - // Then try again - get_enabled_mods(&game_install)? - } - }; - - // Check if key exists - if res.get(mod_name.clone()).is_none() { - // If it doesn't exist, rebuild `enabledmod.json` - log::info!("Value not found in `enabledmod.json`. Rebuilding file"); - rebuild_enabled_mods_json(&game_install)?; - - // Then try again - res = get_enabled_mods(&game_install)?; - } - - // Update value - res[mod_name] = serde_json::Value::Bool(is_enabled); - - // Save the JSON structure into the output file - std::fs::write( - enabledmods_json_path, - serde_json::to_string_pretty(&res).unwrap(), - ) - .unwrap(); - - Ok(()) -} - -/// Resembles the bare minimum keys in Northstar `mods.json` -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct ModJson { - #[serde(rename = "Name")] - name: String, - #[serde(rename = "Version")] - version: Option<String>, -} - -/// Parse `mods` folder for installed mods. -pub fn parse_mods_in_package( - package_mods_path: PathBuf, - thunderstore_mod_string: ParsedThunderstoreModString, -) -> Result<Vec<NorthstarMod>, anyhow::Error> { - let paths = match std::fs::read_dir(package_mods_path) { - Ok(paths) => paths, - Err(_err) => return Err(anyhow!("No mods folder found")), - }; - - let mut directories: Vec<PathBuf> = Vec::new(); - let mut mods: Vec<NorthstarMod> = Vec::new(); - - // Get list of folders in `mods` directory - for path in paths { - let my_path = path?.path(); - let md = std::fs::metadata(my_path.clone())?; - if md.is_dir() { - directories.push(my_path); - } - } - - // Iterate over folders and check if they are Northstar mods - for directory in directories { - let directory_str = directory.to_str().unwrap().to_string(); - // Check if mod.json exists - let mod_json_path = format!("{}/mod.json", directory_str); - if !std::path::Path::new(&mod_json_path).exists() { - continue; - } - - // Read file into string and parse it - let data = std::fs::read_to_string(mod_json_path.clone())?; - let parsed_mod_json: ModJson = match json5::from_str(&data) { - Ok(parsed_json) => parsed_json, - Err(err) => { - log::warn!("Failed parsing {} with {}", mod_json_path, err.to_string()); - continue; - } - }; - - // Get directory path - let mod_directory = directory.to_str().unwrap().to_string(); - - let ns_mod = NorthstarMod { - name: parsed_mod_json.name, - version: parsed_mod_json.version, - thunderstore_mod_string: Some(thunderstore_mod_string.to_string()), - enabled: false, // Placeholder - directory: mod_directory, - }; - - mods.push(ns_mod); - } - - // Return found mod names - Ok(mods) -} - -/// Parse `packages` folder for installed mods. -pub fn parse_installed_package_mods( - game_install: &GameInstall, -) -> Result<Vec<NorthstarMod>, anyhow::Error> { - let mut collected_mods: Vec<NorthstarMod> = Vec::new(); - - let packages_folder = format!( - "{}/{}/packages/", - game_install.game_path, game_install.profile - ); - - let packages_dir = match fs::read_dir(packages_folder) { - Ok(res) => res, - Err(err) => { - // We couldn't read directory, probably cause it doesn't exist yet. - // In that case we just say no package mods installed. - log::warn!("{err}"); - return Ok(vec![]); - } - }; - - // Iteratore over folders in `packages` dir - for entry in packages_dir { - let entry_path = entry?.path(); - let entry_str = entry_path.file_name().unwrap().to_str().unwrap(); - - // Use the struct's from_str function to verify format - if entry_path.is_dir() { - let package_thunderstore_string = match ParsedThunderstoreModString::from_str(entry_str) - { - Ok(res) => res, - Err(err) => { - log::warn!( - "Not a Thunderstore mod string \"{}\" cause: {}", - entry_path.display(), - err - ); - continue; - } - }; - let manifest_path = entry_path.join("manifest.json"); - let mods_path = entry_path.join("mods"); - - // Ensure `manifest.json` and `mods/` dir exist - if manifest_path.exists() && mods_path.is_dir() { - let mods = - match parse_mods_in_package(mods_path, package_thunderstore_string.clone()) { - Ok(res) => res, - Err(err) => { - log::warn!("Failed parsing cause: {err}"); - continue; - } - }; - collected_mods.extend(mods); - } - } - } - - Ok(collected_mods) -} - -/// Gets list of installed mods and their properties -/// - name -/// - is enabled? -#[tauri::command] -pub fn get_installed_mods_and_properties( - game_install: GameInstall, -) -> Result<Vec<NorthstarMod>, String> { - // Get installed mods from packages - let mut found_installed_mods = match parse_installed_package_mods(&game_install) { - Ok(res) => res, - Err(err) => return Err(err.to_string()), - }; - // Get installed legacy mods - let found_installed_legacy_mods = match legacy::parse_installed_mods(&game_install) { - Ok(res) => res, - Err(err) => return Err(err.to_string()), - }; - - // Combine list of package and legacy mods - found_installed_mods.extend(found_installed_legacy_mods); - - // Get enabled mods as JSON - let enabled_mods: serde_json::Value = match get_enabled_mods(&game_install) { - Ok(enabled_mods) => enabled_mods, - Err(_) => serde_json::from_str("{}").unwrap(), // `enabledmods.json` not found, create empty object - }; - - let mut installed_mods = Vec::new(); - let binding = serde_json::Map::new(); // Empty map in case treating as object fails - let mapping = enabled_mods.as_object().unwrap_or(&binding); - - // Use list of installed mods and set enabled based on `enabledmods.json` - for mut current_mod in found_installed_mods { - let current_mod_enabled = match mapping.get(¤t_mod.name) { - Some(enabled) => enabled.as_bool().unwrap(), - None => true, // Northstar considers mods not in mapping as enabled. - }; - current_mod.enabled = current_mod_enabled; - installed_mods.push(current_mod); - } - - Ok(installed_mods) -} - -async fn get_ns_mod_download_url(thunderstore_mod_string: &str) -> Result<String, String> { - // TODO: This will crash the thread if not internet connection exist. `match` should be used instead - let index = thermite::api::get_package_index().unwrap().to_vec(); - - // Parse mod string - let parsed_ts_mod_string: ParsedThunderstoreModString = match thunderstore_mod_string.parse() { - Ok(res) => res, - Err(_) => return Err("Failed to parse mod string".to_string()), - }; - - // Encode as URL - let ts_mod_string_url = format!( - "{}/{}/{}", - parsed_ts_mod_string.author_name, - parsed_ts_mod_string.mod_name, - parsed_ts_mod_string.version - ); - - for ns_mod in index { - // Iterate over all versions of a given mod - for ns_mod in ns_mod.versions.values() { - if ns_mod.url.contains(&ts_mod_string_url) { - return Ok(ns_mod.url.clone()); - } - } - } - - Err("Could not find mod on Thunderstore".to_string()) -} - -/// Returns a vector of modstrings containing the dependencies of a given mod -async fn get_mod_dependencies(thunderstore_mod_string: &str) -> Result<Vec<String>, anyhow::Error> { - log::info!("Attempting to get dependencies for: {thunderstore_mod_string}"); - - let index = thermite::api::get_package_index()?.to_vec(); - - // String replace works but more care should be taken in the future - let ts_mod_string_url = thunderstore_mod_string.replace('-', "/"); - - // Iterate over index - for ns_mod in index { - // Iterate over all versions of a given mod - for ns_mod in ns_mod.versions.values() { - if ns_mod.url.contains(&ts_mod_string_url) { - return Ok(ns_mod.deps.clone()); - } - } - } - Ok(Vec::<String>::new()) -} - -/// Deletes all versions of Thunderstore package except the specified one -fn delete_older_versions( - thunderstore_mod_string: &str, - game_install: &GameInstall, -) -> Result<(), String> { - let thunderstore_mod_string: ParsedThunderstoreModString = - thunderstore_mod_string.parse().unwrap(); - log::info!( - "Deleting other versions of {}", - thunderstore_mod_string.to_string() - ); - let packages_folder = format!( - "{}/{}/packages", - game_install.game_path, game_install.profile - ); - - // Get folders in packages dir - let paths = match std::fs::read_dir(&packages_folder) { - Ok(paths) => paths, - Err(_err) => return Err(format!("Failed to read directory {}", &packages_folder)), - }; - - let mut directories: Vec<PathBuf> = Vec::new(); - - // Get list of folders in `mods` directory - for path in paths { - let my_path = path.unwrap().path(); - - let md = std::fs::metadata(my_path.clone()).unwrap(); - if md.is_dir() { - directories.push(my_path); - } - } - - for directory in directories { - let folder_name = directory.file_name().unwrap().to_str().unwrap(); - let ts_mod_string_from_folder: ParsedThunderstoreModString = match folder_name.parse() { - Ok(res) => res, - Err(err) => { - // Failed parsing folder name as Thunderstore mod string - // This means it doesn't follow the `AUTHOR-MOD-VERSION` naming structure - // This folder could've been manually created by the user or another application - // As parsing failed we cannot determine the Thunderstore package it is part of hence we skip it - log::warn!("{err}"); - continue; - } - }; - // Check which match `AUTHOR-MOD` and do NOT match `AUTHOR-MOD-VERSION` - if ts_mod_string_from_folder.author_name == thunderstore_mod_string.author_name - && ts_mod_string_from_folder.mod_name == thunderstore_mod_string.mod_name - && ts_mod_string_from_folder.version != thunderstore_mod_string.version - { - delete_package_folder(&directory.display().to_string())?; - } - } - - Ok(()) -} - -/// Checks whether some mod is correctly formatted -/// Currently checks whether -/// - Some `mod.json` exists under `mods/*/mod.json` -fn fc_sanity_check(input: &&fs::File) -> Result<(), Box<dyn Error + Send + Sync + 'static>> { - let mut archive = match zip::read::ZipArchive::new(*input) { - Ok(archive) => archive, - Err(_) => { - return Err(Box::new(ThermiteError::UnknownError( - "Failed reading zip file".into(), - ))) - } - }; - - let mut has_mods = false; - let mut mod_json_exists = false; - - // Checks for `mods/*/mod.json` - for i in 0..archive.len() { - let file = match archive.by_index(i) { - Ok(file) => file, - Err(_) => continue, - }; - let file_path = file.mangled_name(); - if file_path.starts_with("mods/") { - has_mods = true; - if let Some(name) = file_path.file_name() { - if name == "mod.json" { - let parent_path = file_path.parent().unwrap(); - if parent_path.parent().unwrap().to_str().unwrap() == "mods" { - mod_json_exists = true; - } - } - } - } - - if file_path.starts_with("plugins/") { - if let Some(name) = file_path.file_name() { - if name.to_str().unwrap().contains(".dll") { - log::warn!("Plugin detected, prompting user"); - if !plugins::plugin_prompt() { - return Err(Box::new(ThermiteError::UnknownError( - "Plugin detected and install denied".into(), - ))); - } - } - } - } - } - - if has_mods && mod_json_exists { - Ok(()) - } else { - Err(Box::new(ThermiteError::UnknownError( - "Mod not correctly formatted".into(), - ))) - } -} - -// Copied from `libtermite` source code and modified -// Should be replaced with a library call to libthermite in the future -/// Download and install mod to the specified target. -#[async_recursion] -pub async fn fc_download_mod_and_install( - game_install: &GameInstall, - thunderstore_mod_string: &str, -) -> Result<(), String> { - log::info!("Attempting to install \"{thunderstore_mod_string}\" to {game_install:?}"); - // Get mods and download directories - let download_directory = format!( - "{}/___flightcore-temp/download-dir/", - game_install.game_path - ); - - // Early return on empty string - if thunderstore_mod_string.is_empty() { - return Err("Passed empty string".to_string()); - } - - let deps = match get_mod_dependencies(thunderstore_mod_string).await { - Ok(deps) => deps, - Err(err) => return Err(err.to_string()), - }; - log::info!("Mod dependencies: {deps:?}"); - - // Recursively install dependencies - for dep in deps { - match fc_download_mod_and_install(game_install, &dep).await { - Ok(()) => (), - Err(err) => { - if err == "Cannot install Northstar as a mod!" { - continue; // For Northstar as a dependency, we just skip it - } else { - return Err(err); - } - } - }; - } - - // Prevent installing Northstar as a mod - // While it would fail during install anyway, having explicit error message is nicer - for blacklisted_mod in BLACKLISTED_MODS { - if thunderstore_mod_string.contains(blacklisted_mod) { - return Err("Cannot install Northstar as a mod!".to_string()); - } - } - - // Prevent installing mods that have specific install requirements - for special_mod in MODS_WITH_SPECIAL_REQUIREMENTS { - if thunderstore_mod_string.contains(special_mod) { - return Err(format!( - "{} has special install requirements and cannot be installed with FlightCore", - thunderstore_mod_string - )); - } - } - - // Get download URL for the specified mod - let download_url = get_ns_mod_download_url(thunderstore_mod_string).await?; - - // Create download directory - match std::fs::create_dir_all(download_directory.clone()) { - Ok(()) => (), - Err(err) => return Err(err.to_string()), - }; - - let path = format!( - "{}/___flightcore-temp/download-dir/{thunderstore_mod_string}.zip", - game_install.game_path - ); - - // Download the mod - let temp_file = TempFile::new( - std::fs::File::options() - .read(true) - .write(true) - .truncate(true) - .create(true) - .open(&path) - .map_err(|e| e.to_string())?, - (&path).into(), - ); - match thermite::core::manage::download(temp_file.file(), download_url) { - Ok(_written_bytes) => (), - Err(err) => return Err(err.to_string()), - }; - - // Get directory to install to made up of packages directory and Thunderstore mod string - let install_directory = format!( - "{}/{}/packages/", - game_install.game_path, game_install.profile - ); - - // Extract the mod to the mods directory - match thermite::core::manage::install_with_sanity( - thunderstore_mod_string, - temp_file.file(), - std::path::Path::new(&install_directory), - fc_sanity_check, - ) { - Ok(_) => (), - Err(err) => { - log::warn!("libthermite couldn't install mod {thunderstore_mod_string} due to {err:?}",); - return match err { - ThermiteError::SanityError(e) => Err( - format!("Mod failed sanity check during install. It's probably not correctly formatted. {}", e) - ), - _ => Err(err.to_string()), - }; - } - }; - - // Successful package install - match legacy::delete_legacy_package_install(thunderstore_mod_string, game_install) { - Ok(()) => (), - Err(err) => { - // Catch error but ignore - log::warn!("Failed deleting legacy versions due to: {}", err); - } - }; - - match delete_older_versions(thunderstore_mod_string, game_install) { - Ok(()) => (), - Err(err) => { - // Catch error but ignore - log::warn!("Failed deleting older versions due to: {}", err); - } - }; - - Ok(()) -} - -/// Deletes a given Northstar mod folder -fn delete_mod_folder(ns_mod_directory: &str) -> Result<(), String> { - let ns_mod_dir_path = std::path::Path::new(&ns_mod_directory); - - // Safety check: Check whether `mod.json` exists and exit early if not - // If it does not exist, we might not be dealing with a Northstar mod - let mod_json_path = ns_mod_dir_path.join("mod.json"); - if !mod_json_path.exists() { - // If it doesn't exist, return an error - return Err(format!("mod.json does not exist in {}", ns_mod_directory)); - } - - match std::fs::remove_dir_all(ns_mod_directory) { - Ok(()) => Ok(()), - Err(err) => Err(format!("Failed deleting mod: {err}")), - } -} - -/// Deletes a Northstar mod based on its name -#[tauri::command] -pub fn delete_northstar_mod(game_install: GameInstall, nsmod_name: String) -> Result<(), String> { - // Prevent deleting core mod - for core_mod in CORE_MODS { - if nsmod_name == core_mod { - return Err(format!("Cannot remove core mod {nsmod_name}")); - } - } - - // Get installed mods - let installed_ns_mods = get_installed_mods_and_properties(game_install)?; - - // Get folder name based on northstarmods - for installed_ns_mod in installed_ns_mods { - // Installed mod matches specified mod - if installed_ns_mod.name == nsmod_name { - // Delete folder - return delete_mod_folder(&installed_ns_mod.directory); - } - } - - Err(format!("Mod {nsmod_name} not found to be installed")) -} - -/// Deletes a given Thunderstore package -fn delete_package_folder(ts_package_directory: &str) -> Result<(), String> { - let ns_mod_dir_path = std::path::Path::new(&ts_package_directory); - - // Safety check: Check whether `manifest.json` exists and exit early if not - // If it does not exist, we might not be dealing with a Thunderstore package - let mod_json_path = ns_mod_dir_path.join("manifest.json"); - if !mod_json_path.exists() { - // If it doesn't exist, return an error - return Err(format!( - "manifest.json does not exist in {}", - ts_package_directory - )); - } - - match std::fs::remove_dir_all(ts_package_directory) { - Ok(()) => Ok(()), - Err(err) => Err(format!("Failed deleting package: {err}")), - } -} - -/// Deletes all NorthstarMods related to a Thunderstore mod -#[tauri::command] -pub fn delete_thunderstore_mod( - game_install: GameInstall, - thunderstore_mod_string: String, -) -> Result<(), String> { - // Check packages - let packages_folder = format!( - "{}/{}/packages", - game_install.game_path, game_install.profile - ); - if std::path::Path::new(&packages_folder).exists() { - for entry in fs::read_dir(packages_folder).unwrap() { - let entry = entry.unwrap(); - - // Check if it's a folder and skip if otherwise - if !entry.file_type().unwrap().is_dir() { - log::warn!("Skipping \"{}\", not a file", entry.path().display()); - continue; - } - - let entry_path = entry.path(); - let package_folder_ts_string = entry_path.file_name().unwrap().to_string_lossy(); - - if package_folder_ts_string != thunderstore_mod_string { - // Not the mod folder we are looking for, try the next one\ - continue; - } - - // All checks passed, this is the matching mod - return delete_package_folder(&entry.path().display().to_string()); - } - } - - // Try legacy mod installs as fallback - legacy::delete_thunderstore_mod(game_install, thunderstore_mod_string) -} diff --git a/src-tauri/src/mod_management/plugins.rs b/src-tauri/src/mod_management/plugins.rs deleted file mode 100644 index e2427a16..00000000 --- a/src-tauri/src/mod_management/plugins.rs +++ /dev/null @@ -1,26 +0,0 @@ -use tauri::api::dialog::blocking::MessageDialogBuilder; -use tauri::api::dialog::{MessageDialogButtons, MessageDialogKind}; - -/// Prompt on plugin -/// Returns: -/// - true: user accepted plugin install -/// - false: user denied plugin install -pub fn plugin_prompt() -> bool { - let dialog = MessageDialogBuilder::new( - "Plugin in package detected", - "This mod contains a plugin. Plugins have unrestricted access to your computer! - \nMake sure you trust the author! - \n - \nPress 'Ok' to continue or 'Cancel' to abort mod installation", - ) - .kind(MessageDialogKind::Warning) - .buttons(MessageDialogButtons::OkCancel); - - if dialog.show() { - log::info!("Accepted plugin install"); - true - } else { - log::warn!("Plugin install cancelled"); - false - } -} diff --git a/src-tauri/src/northstar/install.rs b/src-tauri/src/northstar/install.rs deleted file mode 100644 index 0953fa38..00000000 --- a/src-tauri/src/northstar/install.rs +++ /dev/null @@ -1,358 +0,0 @@ -use anyhow::Result; -use serde::{Deserialize, Serialize}; -use std::time::Duration; -use std::{cell::RefCell, time::Instant}; -use ts_rs::TS; - -use crate::constants::{CORE_MODS, NORTHSTAR_DEFAULT_PROFILE, NORTHSTAR_DLL}; -use crate::{ - util::{extract, move_dir_all}, - GameInstall, InstallType, -}; - -#[cfg(target_os = "windows")] -use crate::platform_specific::windows; - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -enum InstallState { - Downloading, - Extracting, - Done, -} - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -struct InstallProgress { - current_downloaded: u64, - total_size: u64, - state: InstallState, -} - -/// Installs Northstar to the given path -#[tauri::command] -pub async fn install_northstar_wrapper( - window: tauri::Window, - game_install: GameInstall, - northstar_package_name: Option<String>, - version_number: Option<String>, -) -> Result<bool, String> { - log::info!("Running Northstar install"); - - // Get Northstar package name (`Northstar` vs `NorthstarReleaseCandidate`) - let northstar_package_name = northstar_package_name - .map(|name| { - if name.len() <= 1 { - "Northstar".to_string() - } else { - name - } - }) - .unwrap_or("Northstar".to_string()); - - match install_northstar(window, game_install, northstar_package_name, version_number).await { - Ok(_) => Ok(true), - Err(err) => { - log::error!("{}", err); - Err(err) - } - } -} - -/// Update Northstar install in the given path -#[tauri::command] -pub async fn update_northstar( - window: tauri::Window, - game_install: GameInstall, - northstar_package_name: Option<String>, -) -> Result<bool, String> { - log::info!("Updating Northstar"); - - // Simply re-run install with up-to-date version for upate - install_northstar_wrapper(window, game_install, northstar_package_name, None).await -} - -/// Copied from `papa` source code and modified -///Install N* from the provided mod -/// -///Checks cache, else downloads the latest version -async fn do_install( - window: tauri::Window, - nmod: &thermite::model::ModVersion, - game_install: GameInstall, -) -> Result<()> { - let filename = format!("northstar-{}.zip", nmod.version); - let temp_dir = format!("{}/___flightcore-temp", game_install.game_path); - let download_directory = format!("{}/download-dir", temp_dir); - let extract_directory = format!("{}/extract-dir", temp_dir); - - log::info!("Attempting to create temporary directory {}", temp_dir); - std::fs::create_dir_all(download_directory.clone())?; - std::fs::create_dir_all(extract_directory.clone())?; - - let download_path = format!("{}/{}", download_directory, filename); - log::info!("Download path: {download_path}"); - - let last_emit = RefCell::new(Instant::now()); // Keep track of the last time a signal was emitted - let mut nfile = std::fs::File::options() - .read(true) - .write(true) - .truncate(true) - .create(true) - .open(download_path)?; - thermite::core::manage::download_with_progress( - &mut nfile, - &nmod.url, - |delta, current, total| { - if delta != 0 { - // Only emit a signal once every 100ms - // This way we don't bombard the frontend with events on fast download speeds - let time_since_last_emit = Instant::now().duration_since(*last_emit.borrow()); - if time_since_last_emit >= Duration::from_millis(100) { - window - .emit( - "northstar-install-download-progress", - InstallProgress { - current_downloaded: current, - total_size: total, - state: InstallState::Downloading, - }, - ) - .unwrap(); - *last_emit.borrow_mut() = Instant::now(); - } - } - }, - )?; - - window - .emit( - "northstar-install-download-progress", - InstallProgress { - current_downloaded: 0, - total_size: 0, - state: InstallState::Extracting, - }, - ) - .unwrap(); - - log::info!("Extracting Northstar..."); - extract(nfile, std::path::Path::new(&extract_directory))?; - - // Prepare Northstar for Installation - log::info!("Preparing Northstar..."); - if game_install.profile != NORTHSTAR_DEFAULT_PROFILE { - // We are using a non standard Profile, we must: - // - move the DLL - // - rename the Profile - - // Move DLL into the default R2Northstar Profile - let old_dll_path = format!("{}/{}", extract_directory, NORTHSTAR_DLL); - let new_dll_path = format!( - "{}/{}/{}", - extract_directory, NORTHSTAR_DEFAULT_PROFILE, NORTHSTAR_DLL - ); - std::fs::rename(old_dll_path, new_dll_path)?; - - // rename default R2Northstar Profile to the profile we want to use - let old_profile_path = format!("{}/{}/", extract_directory, NORTHSTAR_DEFAULT_PROFILE); - let new_profile_path = format!("{}/{}/", extract_directory, game_install.profile); - std::fs::rename(old_profile_path, new_profile_path)?; - } - - log::info!("Installing Northstar..."); - - // Delete previous version here - for core_mod in CORE_MODS { - let path_to_delete_string = format!( - "{}/{}/mods/{}/", - game_install.game_path, game_install.profile, core_mod - ); - log::info!("Preparing to remove {}", path_to_delete_string); - - // Check if folder exists - let path_to_delete = std::path::Path::new(&path_to_delete_string); - - // Check if path even exists before we attempt to remove - if !path_to_delete.exists() { - log::info!("{} does not exist. Skipping", path_to_delete_string); - continue; - } - - if !path_to_delete.is_dir() { - log::error!( - "{} exists but is a file? This should never happen", - path_to_delete_string - ); - continue; - } - - // Safety check for mod.json - // Just so that we won't ever have a https://github.com/ValveSoftware/steam-for-linux/issues/3671 moment - let mod_json_path = format!("{}/mod.json", path_to_delete_string); - let mod_json_path = std::path::Path::new(&mod_json_path); - - if !mod_json_path.exists() { - log::error!("Missing mod.json for {path_to_delete_string} this shouldn't happen"); - continue; - } - - // Finally delete file - match std::fs::remove_dir_all(path_to_delete) { - Ok(()) => { - log::info!("Succesfully removed") - } - Err(err) => { - log::error!("Failed removing {} due to {}", path_to_delete_string, err) - } - }; - } - - for entry in std::fs::read_dir(extract_directory).unwrap() { - let entry = entry.unwrap(); - let destination = format!( - "{}/{}", - game_install.game_path, - entry.path().file_name().unwrap().to_str().unwrap() - ); - - log::info!("Installing {}", entry.path().display()); - if !entry.file_type().unwrap().is_dir() { - std::fs::rename(entry.path(), destination)?; - } else { - move_dir_all(entry.path(), destination)?; - } - } - - // Delete old copy - log::info!("Delete temporary directory"); - std::fs::remove_dir_all(temp_dir).unwrap(); - - log::info!("Done installing Northstar!"); - window - .emit( - "northstar-install-download-progress", - InstallProgress { - current_downloaded: 0, - total_size: 0, - state: InstallState::Done, - }, - ) - .unwrap(); - - Ok(()) -} - -pub async fn install_northstar( - window: tauri::Window, - game_install: GameInstall, - northstar_package_name: String, - version_number: Option<String>, -) -> Result<String, String> { - let index = match thermite::api::get_package_index() { - Ok(res) => res.to_vec(), - Err(err) => { - log::warn!("Failed fetching package index due to: {err}"); - return Err("Failed to connect to Thunderstore.".to_string()); - } - }; - let nmod = index - .iter() - .find(|f| f.name.to_lowercase() == northstar_package_name.to_lowercase()) - .ok_or_else(|| panic!("Couldn't find Northstar on thunderstore???")) - .unwrap(); - - // Use passed version or latest if no version was passed - let version = version_number.as_ref().unwrap_or(&nmod.latest); - - let game_path = game_install.game_path.clone(); - log::info!("Install path \"{}\"", game_path); - - match do_install(window, nmod.versions.get(version).unwrap(), game_install).await { - Ok(_) => (), - Err(err) => { - if game_path - .to_lowercase() - .contains(&r"C:\Program Files\".to_lowercase()) - // default is `C:\Program Files\EA Games\Titanfall2` - { - return Err( - "Cannot install to default EA App install path, please move Titanfall2 to a different install location.".to_string(), - ); - } else { - return Err(err.to_string()); - } - } - } - - Ok(nmod.latest.clone()) -} - -/// Attempts to find the game install location -#[tauri::command] -pub fn find_game_install_location() -> Result<GameInstall, String> { - // Attempt parsing Steam library directly - match steamlocate::SteamDir::locate() { - Ok(steamdir) => { - #[cfg(target_os = "linux")] - { - let snap_dir = match std::env::var("SNAP_USER_DATA") { - Ok(snap_dir) => std::path::PathBuf::from(snap_dir), - Err(_) => match dirs::home_dir() { - Some(path) => path, - None => std::path::PathBuf::new(), - } - .join("snap"), - }; - - if steamdir.path().starts_with(snap_dir) { - log::warn!("Found Steam installed via Snap, you may encounter issues"); - } - } - - match steamdir.find_app(thermite::TITANFALL2_STEAM_ID) { - Ok(Some((app, library))) => { - let app_path = library - .path() - .join("steamapps") - .join("common") - .join(app.install_dir) - .into_os_string() - .into_string() - .unwrap(); - - let game_install = GameInstall { - game_path: app_path, - profile: "R2Northstar".to_string(), - install_type: InstallType::STEAM, - }; - return Ok(game_install); - } - Ok(None) => log::info!("Couldn't locate your Titanfall 2 Steam install."), - Err(err) => log::info!( - "Something went wrong while trying to find Titanfall 2 {}", - err - ), - } - } - Err(err) => log::info!("Couldn't locate Steam on this computer! {}", err), - } - - // (On Windows only) try parsing Windows registry for Origin install path - #[cfg(target_os = "windows")] - match windows::origin_install_location_detection() { - Ok(game_path) => { - let game_install = GameInstall { - game_path, - profile: "R2Northstar".to_string(), - install_type: InstallType::ORIGIN, - }; - return Ok(game_install); - } - Err(err) => { - log::info!("{}", err); - } - }; - - Err("Could not auto-detect game install location! Please enter it manually.".to_string()) -} diff --git a/src-tauri/src/northstar/mod.rs b/src-tauri/src/northstar/mod.rs deleted file mode 100644 index 9953d742..00000000 --- a/src-tauri/src/northstar/mod.rs +++ /dev/null @@ -1,276 +0,0 @@ -//! This module deals with handling things around Northstar such as -//! - getting version number -pub mod install; -pub mod profile; - -use crate::util::check_ea_app_or_origin_running; -use crate::{constants::CORE_MODS, platform_specific::get_host_os, GameInstall, InstallType}; -use crate::{NorthstarThunderstoreRelease, NorthstarThunderstoreReleaseWrapper}; -use anyhow::anyhow; -use serde::{Deserialize, Serialize}; -use ts_rs::TS; - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub struct NorthstarLaunchOptions { - launch_via_steam: bool, - bypass_checks: bool, -} - -/// Gets list of available Northstar versions from Thunderstore -#[tauri::command] -pub async fn get_available_northstar_versions( -) -> Result<Vec<NorthstarThunderstoreReleaseWrapper>, ()> { - let northstar_package_name = "Northstar"; - let index = thermite::api::get_package_index().unwrap().to_vec(); - let nsmod = index - .iter() - .find(|f| f.name.to_lowercase() == northstar_package_name.to_lowercase()) - .ok_or_else(|| panic!("Couldn't find Northstar on thunderstore???")) - .unwrap(); - - let mut releases: Vec<NorthstarThunderstoreReleaseWrapper> = vec![]; - for (_version_string, nsmod_version_obj) in nsmod.versions.iter() { - let current_elem = NorthstarThunderstoreRelease { - package: nsmod_version_obj.name.clone(), - version: nsmod_version_obj.version.clone(), - }; - let current_elem_wrapped = NorthstarThunderstoreReleaseWrapper { - label: format!( - "{} v{}", - nsmod_version_obj.name.clone(), - nsmod_version_obj.version.clone() - ), - value: current_elem, - }; - - releases.push(current_elem_wrapped); - } - - releases.sort_by(|a, b| { - // Parse version number - let a_ver = semver::Version::parse(&a.value.version).unwrap(); - let b_ver = semver::Version::parse(&b.value.version).unwrap(); - b_ver.partial_cmp(&a_ver).unwrap() // Sort newest first - }); - - Ok(releases) -} - -/// Checks if installed Northstar version is up-to-date -/// false -> Northstar install is up-to-date -/// true -> Northstar install is outdated -#[tauri::command] -pub async fn check_is_northstar_outdated( - game_install: GameInstall, - northstar_package_name: Option<String>, -) -> Result<bool, String> { - let northstar_package_name = match northstar_package_name { - Some(northstar_package_name) => { - if northstar_package_name.len() <= 1 { - "Northstar".to_string() - } else { - northstar_package_name - } - } - None => "Northstar".to_string(), - }; - - let index = match thermite::api::get_package_index() { - Ok(res) => res.to_vec(), - Err(err) => return Err(format!("Couldn't check if Northstar up-to-date: {err}")), - }; - let nmod = index - .iter() - .find(|f| f.name.to_lowercase() == northstar_package_name.to_lowercase()) - .expect("Couldn't find Northstar on thunderstore???"); - // .ok_or_else(|| anyhow!("Couldn't find Northstar on thunderstore???"))?; - - let version_number = match get_northstar_version_number(game_install) { - Ok(version_number) => version_number, - Err(err) => { - log::warn!("{}", err); - // If we fail to get new version just assume we are up-to-date - return Err(err); - } - }; - - // Release candidate version numbers are different between `mods.json` and Thunderstore - let version_number = crate::util::convert_release_candidate_number(version_number); - - if version_number != nmod.latest { - log::info!("Installed Northstar version outdated"); - Ok(true) - } else { - log::info!("Installed Northstar version up-to-date"); - Ok(false) - } -} - -/// Check version number of a mod -pub fn check_mod_version_number(path_to_mod_folder: &str) -> Result<String, anyhow::Error> { - let data = std::fs::read_to_string(format!("{path_to_mod_folder}/mod.json"))?; - let parsed_json: serde_json::Value = serde_json::from_str(&data)?; - - let mod_version_number = match parsed_json.get("Version").and_then(|value| value.as_str()) { - Some(version_number) => version_number, - None => return Err(anyhow!("No version number found")), - }; - - log::info!("{}", mod_version_number); - - Ok(mod_version_number.to_string()) -} - -/// Returns the current Northstar version number as a string -#[tauri::command] -pub fn get_northstar_version_number(game_install: GameInstall) -> Result<String, String> { - log::info!("{}", game_install.game_path); - - // TODO: - // Check if NorthstarLauncher.exe exists and check its version number - let initial_version_number = match check_mod_version_number(&format!( - "{}/{}/mods/{}", - game_install.game_path, game_install.profile, CORE_MODS[0] - )) { - Ok(version_number) => version_number, - Err(err) => return Err(err.to_string()), - }; - - for core_mod in CORE_MODS { - let current_version_number = match check_mod_version_number(&format!( - "{}/{}/mods/{}", - game_install.game_path, game_install.profile, core_mod - )) { - Ok(version_number) => version_number, - Err(err) => return Err(err.to_string()), - }; - if current_version_number != initial_version_number { - // We have a version number mismatch - return Err("Found version number mismatch".to_string()); - } - } - log::info!("All mods same version"); - - Ok(initial_version_number) -} - -/// Launches Northstar -#[tauri::command] -pub fn launch_northstar( - game_install: GameInstall, - launch_options: NorthstarLaunchOptions, -) -> Result<String, String> { - dbg!(game_install.clone()); - - if launch_options.launch_via_steam { - return launch_northstar_steam(game_install); - } - - let host_os = get_host_os(); - - // Explicitly fail early certain (currently) unsupported install setups - if host_os != "windows" { - if !matches!(game_install.install_type, InstallType::STEAM) { - return Err(format!( - "Not yet implemented for \"{}\" with Titanfall2 installed via \"{:?}\"", - get_host_os(), - game_install.install_type - )); - } - - return launch_northstar_steam(game_install); - } - - // Only check guards if bypassing checks is not enabled - if !launch_options.bypass_checks { - // Some safety checks before, should have more in the future - if get_northstar_version_number(game_install.clone()).is_err() { - return Err(anyhow!("Not all checks were met").to_string()); - } - - // Require EA App or Origin to be running to launch Northstar - let ea_app_is_running = check_ea_app_or_origin_running(); - if !ea_app_is_running { - return Err( - anyhow!("EA App not running, start EA App before launching Northstar").to_string(), - ); - } - } - - // Switch to Titanfall2 directory for launching - // NorthstarLauncher.exe expects to be run from that folder - if std::env::set_current_dir(game_install.game_path.clone()).is_err() { - // We failed to get to Titanfall2 directory - return Err(anyhow!("Couldn't access Titanfall2 directory").to_string()); - } - - // Only Windows with Steam or Origin are supported at the moment - if host_os == "windows" - && (matches!(game_install.install_type, InstallType::STEAM) - || matches!(game_install.install_type, InstallType::ORIGIN) - || matches!(game_install.install_type, InstallType::UNKNOWN)) - { - let ns_exe_path = format!("{}/NorthstarLauncher.exe", game_install.game_path); - let ns_profile_arg = format!("-profile={}", game_install.profile); - - let mut output = std::process::Command::new("C:\\Windows\\System32\\cmd.exe") - .args(["/C", "start", "", &ns_exe_path, &ns_profile_arg]) - .spawn() - .expect("failed to execute process"); - output.wait().expect("failed waiting on child process"); - return Ok("Launched game".to_string()); - } - - Err(format!( - "Not yet implemented for {:?} on {}", - game_install.install_type, - get_host_os() - )) -} - -/// Prepare Northstar and Launch through Steam using the Browser Protocol -pub fn launch_northstar_steam(game_install: GameInstall) -> Result<String, String> { - if !matches!(game_install.install_type, InstallType::STEAM) { - return Err("Titanfall2 was not installed via Steam".to_string()); - } - - match steamlocate::SteamDir::locate() { - Ok(steamdir) => { - if get_host_os() != "windows" { - match steamdir.compat_tool_mapping() { - Ok(map) => match map.get(&thermite::TITANFALL2_STEAM_ID) { - Some(_) => {} - None => { - return Err( - "Titanfall2 was not configured to use a compatibility tool" - .to_string(), - ); - } - }, - Err(_) => { - return Err("Could not get compatibility tool mapping".to_string()); - } - } - } - } - Err(_) => { - return Err("Couldn't access Titanfall2 directory".to_string()); - } - } - - // Switch to Titanfall2 directory to set everything up - if std::env::set_current_dir(game_install.game_path).is_err() { - // We failed to get to Titanfall2 directory - return Err("Couldn't access Titanfall2 directory".to_string()); - } - - match open::that(format!( - "steam://run/{}//-profile={} --northstar/", - thermite::TITANFALL2_STEAM_ID, - game_install.profile - )) { - Ok(()) => Ok("Started game".to_string()), - Err(_err) => Err("Failed to launch Titanfall 2 via Steam".to_string()), - } -} diff --git a/src-tauri/src/northstar/profile.rs b/src-tauri/src/northstar/profile.rs deleted file mode 100644 index 26a32d6b..00000000 --- a/src-tauri/src/northstar/profile.rs +++ /dev/null @@ -1,121 +0,0 @@ -use crate::util::copy_dir_all; -use crate::GameInstall; - -// These folders are part of Titanfall 2 and -// should NEVER be used as a Profile -const SKIP_PATHS: [&str; 8] = [ - "___flightcore-temp", - "__overlay", - "bin", - "Core", - "r2", - "vpk", - "platform", - "Support", -]; - -// A profile may have one of these to be detected -const MAY_CONTAIN: [&str; 10] = [ - "mods/", - "plugins/", - "packages/", - "logs/", - "runtime/", - "save_data/", - "Northstar.dll", - "enabledmods.json", - "placeholder.playerdata.pdata", - "LEGAL.txt", -]; - -/// Returns a list of Profile names -/// All the returned Profiles can be found relative to the game path -#[tauri::command] -pub fn fetch_profiles(game_install: GameInstall) -> Result<Vec<String>, String> { - let mut profiles: Vec<String> = Vec::new(); - - for content in MAY_CONTAIN { - let pattern = format!("{}/*/{}", game_install.game_path, content); - for e in glob::glob(&pattern).expect("Failed to read glob pattern") { - let path = e.unwrap(); - let mut ancestors = path.ancestors(); - - ancestors.next(); - - let profile_path = std::path::Path::new(ancestors.next().unwrap()); - let profile_name = profile_path - .file_name() - .unwrap() - .to_os_string() - .into_string() - .unwrap(); - - if !profiles.contains(&profile_name) { - profiles.push(profile_name); - } - } - } - - Ok(profiles) -} - -/// Validates if a given profile is actually a valid profile -#[tauri::command] -pub fn validate_profile(game_install: GameInstall, profile: String) -> bool { - // Game files are never a valid profile - // Prevent users with messed up installs from making it even worse - if SKIP_PATHS.contains(&profile.as_str()) { - return false; - } - - log::info!("Validating Profile {}", profile); - - let profile_path = format!("{}/{}", game_install.game_path, profile); - let profile_dir = std::path::Path::new(profile_path.as_str()); - - profile_dir.is_dir() -} - -#[tauri::command] -pub fn delete_profile(game_install: GameInstall, profile: String) -> Result<(), String> { - // Check if the Profile actually exists - if !validate_profile(game_install.clone(), profile.clone()) { - return Err(format!("{} is not a valid Profile", profile)); - } - - log::info!("Deleting Profile {}", profile); - - let profile_path = format!("{}/{}", game_install.game_path, profile); - - match std::fs::remove_dir_all(profile_path) { - Ok(()) => Ok(()), - Err(err) => Err(format!("Failed to delete Profile: {}", err)), - } -} - -/// Clones a profile by simply duplicating the folder under a new name -#[tauri::command] -pub fn clone_profile( - game_install: GameInstall, - old_profile: String, - new_profile: String, -) -> Result<(), String> { - // Check if the old Profile already exists - if !validate_profile(game_install.clone(), old_profile.clone()) { - return Err(format!("{} is not a valid Profile", old_profile)); - } - - // Check that new Profile does not already exist - if validate_profile(game_install.clone(), new_profile.clone()) { - return Err(format!("{} already exists", new_profile)); - } - - log::info!("Cloning Profile {} to {}", old_profile, new_profile); - - let old_profile_path = format!("{}/{}", game_install.game_path, old_profile); - let new_profile_path = format!("{}/{}", game_install.game_path, new_profile); - - copy_dir_all(old_profile_path, new_profile_path).unwrap(); - - Ok(()) -} diff --git a/src-tauri/src/platform_specific/linux.rs b/src-tauri/src/platform_specific/linux.rs deleted file mode 100644 index fcac5b67..00000000 --- a/src-tauri/src/platform_specific/linux.rs +++ /dev/null @@ -1,98 +0,0 @@ -// Linux specific code - -fn get_proton_dir() -> Result<String, String> { - let steam_dir = match steamlocate::SteamDir::locate() { - Ok(result) => result, - Err(_) => return Err("Unable to find Steam directory".to_string()), - }; - let compat_dir = format!("{}/compatibilitytools.d", steam_dir.path().display()); - - Ok(compat_dir) -} - -/// Downloads and installs NS proton -/// Assumes Steam install -pub fn install_ns_proton() -> Result<(), String> { - // Get latest NorthstarProton release - let latest = match thermite::core::latest_release() { - Ok(result) => result, - Err(_) => return Err("Failed to fetch latest NorthstarProton release".to_string()), - }; - - let temp_dir = std::env::temp_dir(); - let path = format!("{}/nsproton-{}.tar.gz", temp_dir.display(), latest); - let archive = match std::fs::File::create(path.clone()) { - Ok(result) => result, - Err(_) => return Err("Failed to allocate NorthstarProton archive on disk".to_string()), - }; - - // Download the latest Proton release - log::info!("Downloading NorthstarProton to {}", path); - match thermite::core::download_ns_proton(latest, archive) { - Ok(_) => {} - Err(_) => return Err("Failed to download NorthstarProton".to_string()), - } - - log::info!("Finished Download"); - - let compat_dir = get_proton_dir()?; - - match std::fs::create_dir_all(compat_dir.clone()) { - Ok(_) => {} - Err(_) => return Err("Failed to create compatibilitytools directory".to_string()), - } - - let finished = match std::fs::File::open(path.clone()) { - Ok(result) => result, - Err(_) => return Err("Failed to open NorthstarProton archive".to_string()), - }; - - // Extract to Proton dir - log::info!("Installing NorthstarProton to {}", compat_dir); - match thermite::core::install_ns_proton(&finished, compat_dir) { - Ok(_) => {} - Err(_) => return Err("Failed to create install NorthstarProton".to_string()), - } - log::info!("Finished Installation"); - drop(finished); - - // We installed NSProton, lets ignore this if it fails - let _ = std::fs::remove_file(path); - - Ok(()) -} - -/// Remove NS Proton -pub fn uninstall_ns_proton() -> Result<(), String> { - let compat_dir = get_proton_dir()?; - let pattern = format!("{}/NorthstarProton*", compat_dir); - for e in glob::glob(&pattern).expect("Failed to read glob pattern") { - match e { - Ok(path) => match std::fs::remove_dir_all(path.clone()) { - Ok(_) => {} - Err(_) => return Err(format!("Failed to remove {}", path.display())), - }, - Err(e) => return Err(format!("Found unprocessable entry {}", e)), - } - } - - Ok(()) -} - -/// Get the latest installed NS Proton version -pub fn get_local_ns_proton_version() -> Result<String, String> { - let compat_dir = get_proton_dir().unwrap(); - let pattern = format!("{}/NorthstarProton*/version", compat_dir); - - if let Some(e) = glob::glob(&pattern) - .expect("Failed to read glob pattern") - .next() - { - let version_content = std::fs::read_to_string(e.unwrap()).unwrap(); - let version = version_content.split(' ').nth(1).unwrap().to_string(); - - return Ok(version); - } - - Err("Northstar Proton is not installed".to_string()) -} diff --git a/src-tauri/src/platform_specific/mod.rs b/src-tauri/src/platform_specific/mod.rs deleted file mode 100644 index 4e0514d4..00000000 --- a/src-tauri/src/platform_specific/mod.rs +++ /dev/null @@ -1,50 +0,0 @@ -#[cfg(target_os = "windows")] -pub mod windows; - -#[cfg(target_os = "linux")] -pub mod linux; - -/// Returns identifier of host OS FlightCore is running on -#[tauri::command] -pub fn get_host_os() -> String { - std::env::consts::OS.to_string() -} - -/// On Linux attempts to install NorthstarProton -/// On Windows simply returns an error message -#[tauri::command] -pub async fn install_northstar_proton_wrapper() -> Result<(), String> { - #[cfg(target_os = "linux")] - return linux::install_ns_proton().map_err(|err| err.to_string()); - - #[cfg(target_os = "windows")] - Err("Not supported on Windows".to_string()) -} - -#[tauri::command] -pub async fn uninstall_northstar_proton_wrapper() -> Result<(), String> { - #[cfg(target_os = "linux")] - return linux::uninstall_ns_proton(); - - #[cfg(target_os = "windows")] - Err("Not supported on Windows".to_string()) -} - -#[tauri::command] -pub async fn get_local_northstar_proton_wrapper_version() -> Result<String, String> { - #[cfg(target_os = "linux")] - return linux::get_local_ns_proton_version(); - - #[cfg(target_os = "windows")] - Err("Not supported on Windows".to_string()) -} - -/// Check whether the current device might be behind a CGNAT -#[tauri::command] -pub async fn check_cgnat() -> Result<String, String> { - #[cfg(target_os = "linux")] - return Err("Not supported on Linux".to_string()); - - #[cfg(target_os = "windows")] - windows::check_cgnat().await -} diff --git a/src-tauri/src/platform_specific/windows.rs b/src-tauri/src/platform_specific/windows.rs deleted file mode 100644 index fc6aab5d..00000000 --- a/src-tauri/src/platform_specific/windows.rs +++ /dev/null @@ -1,104 +0,0 @@ -/// Windows specific code -use anyhow::{anyhow, Result}; -use std::net::Ipv4Addr; - -#[cfg(target_os = "windows")] -use winreg::{enums::HKEY_LOCAL_MACHINE, RegKey}; - -use crate::repair_and_verify::check_is_valid_game_path; - -/// Gets Titanfall2 install location on Origin -pub fn origin_install_location_detection() -> Result<String, anyhow::Error> { - #[cfg(target_os = "windows")] - { - let hklm = RegKey::predef(HKEY_LOCAL_MACHINE); - match hklm.open_subkey("SOFTWARE\\Respawn\\Titanfall2") { - Ok(tf) => { - let game_path_str: String = tf.get_value("Install Dir")?; - - match check_is_valid_game_path(&game_path_str) { - Ok(()) => { - return Ok(game_path_str.to_string()); - } - Err(err) => { - log::warn!("{err}"); - } - } - } - Err(err) => { - log::warn!("{err}"); - } - } - } - - Err(anyhow!("No Origin / EA App install path found")) -} - -/// Check whether the current device might be behind a CGNAT -pub async fn check_cgnat() -> Result<String, String> { - // Use external service to grap IP - let url = "https://api.ipify.org"; - let response = reqwest::get(url).await.unwrap().text().await.unwrap(); - - // Check if valid IPv4 address and return early if not - if response.parse::<Ipv4Addr>().is_err() { - return Err(format!("Not valid IPv4 address: {}", response)); - } - - let hops_count = run_tracert(&response)?; - Ok(format!("Counted {} hops to {}", hops_count, response)) -} - -/// Count number of hops in tracert output -fn count_hops(output: &str) -> usize { - // Split the output into lines - let lines: Vec<&str> = output.lines().collect(); - - // Filter lines that appear to represent hops - let hop_lines: Vec<&str> = lines - .iter() - .filter(|&line| line.contains("ms") || line.contains("*")) // TODO check if it contains just the `ms` surrounded by whitespace, otherwise it might falsely pick up some domain names as well - .cloned() - .collect(); - - // Return the number of hops - hop_lines.len() -} - -/// Run `tracert` -fn run_tracert(target_ip: &str) -> Result<usize, String> { - // Ensure valid IPv4 address to avoid prevent command injection - assert!(target_ip.parse::<Ipv4Addr>().is_ok()); - - // Execute the `tracert` command - let output = match std::process::Command::new("tracert") - .arg("-4") // Force IPv4 - .arg("-d") // Prevent resolving intermediate IP addresses - .arg("-w") // Set timeout to 1 second - .arg("1000") - .arg("-h") // Set max hop count - .arg("5") - .arg(target_ip) - .output() - { - Ok(res) => res, - Err(err) => return Err(format!("Failed running tracert: {}", err)), - }; - - // Check if the command was successful - if output.status.success() { - // Convert the output to a string - let stdout = - std::str::from_utf8(&output.stdout).expect("Invalid UTF-8 sequence in command output"); - println!("{}", stdout); - - // Count the number of hops - let hop_count = count_hops(stdout); - Ok(hop_count) - } else { - let stderr = std::str::from_utf8(&output.stderr) - .expect("Invalid UTF-8 sequence in command error output"); - println!("{}", stderr); - Err(format!("Failed collecting tracert output: {}", stderr)) - } -} diff --git a/src-tauri/src/repair_and_verify/mod.rs b/src-tauri/src/repair_and_verify/mod.rs deleted file mode 100644 index 3c861609..00000000 --- a/src-tauri/src/repair_and_verify/mod.rs +++ /dev/null @@ -1,137 +0,0 @@ -use crate::mod_management::{get_enabled_mods, rebuild_enabled_mods_json, set_mod_enabled_status}; -/// Contains various functions to repair common issues and verifying installation -use crate::{constants::CORE_MODS, GameInstall}; - -/// Checks if is valid Titanfall2 install based on certain conditions -#[tauri::command] -pub async fn verify_install_location(game_path: String) -> bool { - match check_is_valid_game_path(&game_path) { - Ok(()) => true, - Err(err) => { - log::warn!("{}", err); - false - } - } -} - -/// Checks whether the provided path is a valid Titanfall2 gamepath by checking against a certain set of criteria -pub fn check_is_valid_game_path(game_install_path: &str) -> Result<(), String> { - let path_to_titanfall2_exe = format!("{game_install_path}/Titanfall2.exe"); - let is_correct_game_path = std::path::Path::new(&path_to_titanfall2_exe).exists(); - log::info!("Titanfall2.exe exists in path? {}", is_correct_game_path); - - // Exit early if wrong game path - if !is_correct_game_path { - return Err(format!("Incorrect game path \"{game_install_path}\"")); // Return error cause wrong game path - } - Ok(()) -} - -/// Verifies Titanfall2 game files -#[tauri::command] -pub fn verify_game_files(game_install: GameInstall) -> Result<String, String> { - dbg!(game_install); - Err("TODO, not yet implemented".to_string()) -} - -/// Disables all mods except core ones -/// Enables core mods if disabled -#[tauri::command] -pub fn disable_all_but_core(game_install: GameInstall) -> Result<(), String> { - // Rebuild `enabledmods.json` first to ensure all mods are added - rebuild_enabled_mods_json(&game_install)?; - - let current_mods = get_enabled_mods(&game_install)?; - - // Disable all mods, set core mods to enabled - for (key, _value) in current_mods.as_object().unwrap() { - if CORE_MODS.contains(&key.as_str()) { - // This is a core mod, we do not want to disable it - set_mod_enabled_status(game_install.clone(), key.to_string(), true)?; - } else { - // Not a core mod - set_mod_enabled_status(game_install.clone(), key.to_string(), false)?; - } - } - - Ok(()) -} - -/// Installs the specified mod -#[tauri::command] -pub async fn clean_up_download_folder_wrapper( - game_install: GameInstall, - force: bool, -) -> Result<(), String> { - match clean_up_download_folder(&game_install, force) { - Ok(()) => Ok(()), - Err(err) => Err(err.to_string()), - } -} - -/// Deletes download folder -/// If `force` is FALSE, bails on non-empty folder -/// If `force` is TRUE, deletes folder even if non-empty -pub fn clean_up_download_folder( - game_install: &GameInstall, - force: bool, -) -> Result<(), anyhow::Error> { - const TEMPORARY_DIRECTORIES: [&str; 4] = [ - "___flightcore-temp-download-dir", - "___flightcore-temp/download-dir", - "___flightcore-temp/extract-dir", - "___flightcore-temp", - ]; - - for directory in TEMPORARY_DIRECTORIES { - // Get download directory - let download_directory = format!("{}/{}/", game_install.game_path, directory); - - // Check if files in folder - let download_dir_contents = match std::fs::read_dir(download_directory.clone()) { - Ok(contents) => contents, - Err(_) => continue, - }; - - let mut count = 0; - download_dir_contents.for_each(|_| count += 1); - - if count > 0 && !force { - // Skip folder if not empty - log::warn!("Folder not empty, not deleting: {directory}"); - continue; - } - - // Delete folder - std::fs::remove_dir_all(download_directory)?; - } - Ok(()) -} - -/// Get list of Northstar logs -#[tauri::command] -pub fn get_log_list(game_install: GameInstall) -> Result<Vec<std::path::PathBuf>, String> { - let ns_log_folder = format!("{}/{}/logs", game_install.game_path, game_install.profile); - - // List files in logs folder - let paths = match std::fs::read_dir(ns_log_folder) { - Ok(paths) => paths, - Err(_err) => return Err("No logs folder found".to_string()), - }; - - // Stores paths of log files - let mut log_files: Vec<std::path::PathBuf> = Vec::new(); - - for path in paths { - let path = path.unwrap().path(); - if path.display().to_string().contains("nslog") { - log_files.push(path); - } - } - - if !log_files.is_empty() { - Ok(log_files) - } else { - Err("No logs found".to_string()) - } -} diff --git a/src-tauri/src/thunderstore/mod.rs b/src-tauri/src/thunderstore/mod.rs deleted file mode 100644 index fc2acb02..00000000 --- a/src-tauri/src/thunderstore/mod.rs +++ /dev/null @@ -1,86 +0,0 @@ -//! For interacting with Thunderstore API -use crate::constants::{APP_USER_AGENT, BLACKLISTED_MODS}; -use serde::{Deserialize, Serialize}; -use std::collections::HashSet; -use ts_rs::TS; - -#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, TS)] -#[ts(export)] -pub struct ThunderstoreMod { - pub name: String, - pub full_name: String, - pub owner: String, - pub package_url: String, - pub date_created: String, - pub date_updated: String, - pub uuid4: String, - pub rating_score: i32, - pub is_pinned: bool, - pub is_deprecated: bool, - pub has_nsfw_content: bool, - pub categories: Vec<String>, - pub versions: Vec<ThunderstoreModVersion>, -} - -#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, TS)] -#[ts(export)] -pub struct ThunderstoreModVersion { - pub name: String, - pub full_name: String, - pub description: String, - pub icon: String, - pub version_number: String, - pub dependencies: Vec<String>, - pub download_url: String, - pub downloads: i32, - pub date_created: String, - pub website_url: String, - pub is_active: bool, - pub uuid4: String, - pub file_size: i64, -} - -/// Performs actual fetch from Thunderstore and returns response -async fn fetch_thunderstore_packages() -> Result<String, reqwest::Error> { - log::info!("Fetching Thunderstore API"); - - // Fetches - let url = "https://northstar.thunderstore.io/api/v1/package/"; - - let client = reqwest::Client::new(); - client - .get(url) - .header(reqwest::header::USER_AGENT, APP_USER_AGENT) - .send() - .await? - .text() - .await -} - -/// Queries Thunderstore packages API -#[tauri::command] -pub async fn query_thunderstore_packages_api() -> Result<Vec<ThunderstoreMod>, String> { - let res = match fetch_thunderstore_packages().await { - Ok(res) => res, - Err(err) => { - let warn_response = format!("Couldn't fetch from Thunderstore: {err}"); - log::warn!("{warn_response}"); - return Err(warn_response); - } - }; - - // Parse response - let parsed_json: Vec<ThunderstoreMod> = match serde_json::from_str(&res) { - Ok(res) => res, - Err(err) => return Err(err.to_string()), - }; - - // Remove some mods from listing - let to_remove_set: HashSet<&str> = BLACKLISTED_MODS.iter().copied().collect(); - let filtered_packages = parsed_json - .into_iter() - .filter(|package| !to_remove_set.contains(&package.full_name.as_ref())) - .collect::<Vec<ThunderstoreMod>>(); - - Ok(filtered_packages) -} diff --git a/src-tauri/src/util.rs b/src-tauri/src/util.rs deleted file mode 100644 index 1d355997..00000000 --- a/src-tauri/src/util.rs +++ /dev/null @@ -1,324 +0,0 @@ -//! This module contains various utility/helper functions that do not fit into any other module - -use anyhow::{Context, Result}; -use serde::{Deserialize, Serialize}; -use zip::ZipArchive; - -use crate::constants::{APP_USER_AGENT, MASTER_SERVER_URL, SERVER_BROWSER_ENDPOINT}; - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct NorthstarServer { - #[serde(rename = "playerCount")] - pub player_count: i32, -} - -/// This function's only use is to force a `panic!()` -// This must NOT be async to ensure crashing whole application. -#[tauri::command] -pub fn force_panic() { - panic!("Force panicked!"); -} - -/// Returns true if built in debug mode -#[tauri::command] -pub async fn is_debug_mode() -> bool { - cfg!(debug_assertions) -} - -/// Returns the current version number as a string -#[tauri::command] -pub async fn get_flightcore_version_number() -> String { - let version = env!("CARGO_PKG_VERSION"); - if cfg!(debug_assertions) { - // Debugging enabled - format!("v{} (debug mode)", version) - } else { - // Debugging disabled - format!("v{}", version) - } -} - -/// Spawns repair window -#[tauri::command] -pub async fn open_repair_window(handle: tauri::AppHandle) -> Result<(), String> { - // Spawn new window - let repair_window = match tauri::WindowBuilder::new( - &handle, - "RepairWindow", - tauri::WindowUrl::App("/#/repair".into()), - ) - .build() - { - Ok(res) => res, - Err(err) => return Err(err.to_string()), - }; - - // Set window title - match repair_window.set_title("FlightCore Repair Window") { - Ok(()) => (), - Err(err) => return Err(err.to_string()), - }; - Ok(()) -} - -/// Closes all windows and exits application -#[tauri::command] -pub async fn close_application<R: tauri::Runtime>(app: tauri::AppHandle<R>) -> Result<(), String> { - app.exit(0); // Close application - Ok(()) -} - -/// Fetches `/client/servers` endpoint from master server -async fn fetch_server_list() -> Result<String, anyhow::Error> { - let url = format!("{MASTER_SERVER_URL}{SERVER_BROWSER_ENDPOINT}"); - let client = reqwest::Client::new(); - let res = client - .get(url) - .header(reqwest::header::USER_AGENT, APP_USER_AGENT) - .send() - .await? - .text() - .await?; - - Ok(res) -} - -/// Gets server and playercount from master server API -#[tauri::command] -pub async fn get_server_player_count() -> Result<(i32, usize), String> { - let res = match fetch_server_list().await { - Ok(res) => res, - Err(err) => return Err(err.to_string()), - }; - - let ns_servers: Vec<NorthstarServer> = - serde_json::from_str(&res).expect("JSON was not well-formatted"); - - // Get server count - let server_count = ns_servers.len(); - - // Sum up player count - let total_player_count: i32 = ns_servers.iter().map(|server| server.player_count).sum(); - - log::info!("total_player_count: {}", total_player_count); - log::info!("server_count: {}", server_count); - - Ok((total_player_count, server_count)) -} - -#[tauri::command] -pub async fn kill_northstar() -> Result<(), String> { - if !check_northstar_running() { - return Err("Northstar is not running".to_string()); - } - - let s = sysinfo::System::new_all(); - - for process in s.processes_by_exact_name("Titanfall2.exe") { - log::info!("Killing Process {}", process.pid()); - process.kill(); - } - - for process in s.processes_by_exact_name("NorthstarLauncher.exe") { - log::info!("Killing Process {}", process.pid()); - process.kill(); - } - - Ok(()) -} - -/// Copied from `papa` source code and modified -///Extract N* zip file to target game path -// fn extract(ctx: &Ctx, zip_file: File, target: &Path) -> Result<()> { -pub fn extract(zip_file: std::fs::File, target: &std::path::Path) -> Result<()> { - let mut archive = ZipArchive::new(&zip_file).context("Unable to open zip archive")?; - for i in 0..archive.len() { - let mut f = archive.by_index(i).unwrap(); - - //This should work fine for N* because the dir structure *should* always be the same - if f.enclosed_name().unwrap().starts_with("Northstar") { - let out = target.join( - f.enclosed_name() - .unwrap() - .strip_prefix("Northstar") - .unwrap(), - ); - - if (*f.name()).ends_with('/') { - log::info!("Create directory {}", f.name()); - std::fs::create_dir_all(target.join(f.name())) - .context("Unable to create directory")?; - continue; - } else if let Some(p) = out.parent() { - std::fs::create_dir_all(p).context("Unable to create directory")?; - } - - let mut outfile = std::fs::OpenOptions::new() - .create(true) - .write(true) - .truncate(true) - .open(&out)?; - - log::info!("Write file {}", out.display()); - - std::io::copy(&mut f, &mut outfile).context("Unable to write to file")?; - } - } - - Ok(()) -} - -pub fn check_ea_app_or_origin_running() -> bool { - let s = sysinfo::System::new_all(); - let x = s.processes_by_name("Origin.exe").next().is_some() - || s.processes_by_name("EADesktop.exe").next().is_some(); - x -} - -/// Checks if Northstar process is running -pub fn check_northstar_running() -> bool { - let s = sysinfo::System::new_all(); - let x = s - .processes_by_name("NorthstarLauncher.exe") - .next() - .is_some() - || s.processes_by_name("Titanfall2.exe").next().is_some(); - x -} - -/// Copies a folder and all its contents to a new location -pub fn copy_dir_all( - src: impl AsRef<std::path::Path>, - dst: impl AsRef<std::path::Path>, -) -> std::io::Result<()> { - std::fs::create_dir_all(&dst)?; - for entry in std::fs::read_dir(src)? { - let entry = entry?; - let ty = entry.file_type()?; - if ty.is_dir() { - copy_dir_all(entry.path(), dst.as_ref().join(entry.file_name()))?; - } else { - std::fs::copy(entry.path(), dst.as_ref().join(entry.file_name()))?; - } - } - Ok(()) -} - -/// Moves a folders file structure to a new location -/// Old folders are not removed -pub fn move_dir_all( - src: impl AsRef<std::path::Path>, - dst: impl AsRef<std::path::Path>, -) -> std::io::Result<()> { - std::fs::create_dir_all(&dst)?; - for entry in std::fs::read_dir(src)? { - let entry = entry?; - let ty = entry.file_type()?; - if ty.is_dir() { - move_dir_all(entry.path(), dst.as_ref().join(entry.file_name()))?; - std::fs::remove_dir(entry.path())?; - } else { - std::fs::rename(entry.path(), dst.as_ref().join(entry.file_name()))?; - } - } - Ok(()) -} - -/// Helps with converting release candidate numbers which are different on Thunderstore -/// due to restrictions imposed by the platform -pub fn convert_release_candidate_number(version_number: String) -> String { - let release_candidate_suffix = "-rc"; - - if !version_number.contains(release_candidate_suffix) { - // Not an release-candidate version number, nothing to do, return early - return version_number; - } - - // Version number is guaranteed to contain `-rc` - let re = regex::Regex::new(r"(\d+)\.(\d+)\.(\d+)-rc(\d+)").unwrap(); - if let Some(captures) = re.captures(&version_number) { - // Extract versions - let major_version: u32 = captures[1].parse().unwrap(); - let minor_version: u32 = captures[2].parse().unwrap(); - let patch_version: u32 = captures[3].parse().unwrap(); - let release_candidate: u32 = captures[4].parse().unwrap(); - - // Zero pad - let padded_release_candidate = format!("{:02}", release_candidate); - - // Combine - let combined_patch_version = format!("{}{}", patch_version, padded_release_candidate); - - // Strip leading zeroes - let trimmed_combined_patch_version = combined_patch_version.trim_start_matches('0'); - - // Combine all - let version_number = format!( - "{}.{}.{}", - major_version, minor_version, trimmed_combined_patch_version - ); - return version_number; - } - - // We should never end up here - panic!(); -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_not_release_candidate() { - let input = "1.2.3".to_string(); - let output = convert_release_candidate_number(input.clone()); - let expected_output = input; - assert_eq!(output, expected_output); - } - - #[test] - fn test_basic_release_candidate_number_conversion() { - let input = "1.2.3-rc4".to_string(); - let output = convert_release_candidate_number(input); - let expected_output = "1.2.304"; - assert_eq!(output, expected_output); - } - - #[test] - fn test_leading_zero_release_candidate_number_conversion() { - let input = "1.2.0-rc3".to_string(); - let output = convert_release_candidate_number(input); - let expected_output = "1.2.3"; - assert_eq!(output, expected_output); - } - - #[test] - fn test_double_patch_digit_release_candidate_number_conversion() { - // let input = "v1.2.34-rc5".to_string(); - // let output = convert_release_candidate_number(input); - // let expected_output = "v1.2.3405"; - let input = "1.19.10-rc1".to_string(); - let output = convert_release_candidate_number(input); - let expected_output = "1.19.1001"; - - assert_eq!(output, expected_output); - } - - #[test] - fn test_double_digit_release_candidate_number_conversion() { - let input = "1.2.3-rc45".to_string(); - let output = convert_release_candidate_number(input); - let expected_output = "1.2.345"; - - assert_eq!(output, expected_output); - } - - #[test] - fn test_double_digit_patch_and_rc_number_conversion() { - let input = "1.2.34-rc56".to_string(); - let output = convert_release_candidate_number(input); - let expected_output = "1.2.3456"; - - assert_eq!(output, expected_output); - } -} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 30dbdfcb..0fbb614c 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,74 +1,35 @@ { - "$schema": "../node_modules/@tauri-apps/cli/schema.json", + "$schema": "https://schema.tauri.app/config/2", + "productName": "FlightCore", + "version": "2.26.2", + "identifier": "com.github.r2northstartools.flightcore", "build": { - "beforeBuildCommand": "cd src-vue && npm run build", - "beforeDevCommand": "cd src-vue && npm run dev", - "devPath": "http://localhost:5173/", - "distDir": "../src-vue/dist" + "beforeDevCommand": "npm run dev", + "devUrl": "http://localhost:1420/", + "beforeBuildCommand": "npm run build", + "frontendDist": "../dist" }, - "package": { - "productName": "FlightCore", - "version": "2.26.2" - }, - "tauri": { - "allowlist": { - "all": true - }, - "bundle": { - "active": true, - "category": "DeveloperTool", - "copyright": "", - "deb": { - "depends": [] - }, - "externalBin": [], - "icon": [ - "icons/32x32.png", - "icons/128x128.png", - "icons/128x128@2x.png", - "icons/icon.icns", - "icons/icon.ico" - ], - "identifier": "com.github.r2northstartools.flightcore", - "longDescription": "", - "macOS": { - "entitlements": null, - "exceptionDomain": "", - "frameworks": [], - "providerShortName": null, - "signingIdentity": null - }, - "resources": [], - "shortDescription": "", - "targets": "all", - "windows": { - "certificateThumbprint": null, - "digestAlgorithm": "sha256", - "timestampUrl": "" - } - }, - "security": { - "csp": null - }, - "updater": { - "active": true, - "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEVBNjM3NzJGRDgxMTU4NUUKUldSZVdCSFlMM2RqNmdhK3pIZjhEYWg2WnZGSFJqdkhLSHNOSjNhaW5VQVFLaHV3YWFDTnFKWWQK", - "endpoints": [ - "https://github.com/R2NorthstarTools/FlightCore/releases/latest/download/latest-release.json" - ], - "dialog": true - }, + "app": { "windows": [ { - "fullscreen": false, - "resizable": true, - "decorations": false, "title": "FlightCore", - "height": 600, - "minHeight": 300, "width": 1010, - "minWidth": 600 + "height": 600 } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" ] } } |